[PATCH] accel/ivpu: Fix NOC firewall interrupt handling

Jacek Lawrynowicz jacek.lawrynowicz at linux.intel.com
Fri Oct 25 11:44:52 UTC 2024


Hi,

On 10/18/2024 10:44 PM, Jeffrey Hugo wrote:
> On 10/17/2024 8:49 AM, Jacek Lawrynowicz wrote:
>> From: Andrzej Kacprowski <Andrzej.Kacprowski at intel.com>
>>
>> The NOC firewall interrupt means that the HW prevented
>> unauthorized access to a protected resource, so there
>> is no need to trigger device reset in such case.
>>
>> To facilitate security testing add firewall_irq_counter
>> debugfs file that tracks firewall interrupts.
>>
>> Fixes: 8a27ad81f7d3 ("accel/ivpu: Split IP and buttress code")
>> Cc: <stable at vger.kernel.org> # v6.11+
>> Signed-off-by: Andrzej Kacprowski <Andrzej.Kacprowski at intel.com>
>> Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz at linux.intel.com>
>> Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz at linux.intel.com>
>> ---
>>   drivers/accel/ivpu/ivpu_debugfs.c | 9 +++++++++
>>   drivers/accel/ivpu/ivpu_hw.c      | 1 +
>>   drivers/accel/ivpu/ivpu_hw.h      | 1 +
>>   drivers/accel/ivpu/ivpu_hw_ip.c   | 5 ++++-
>>   4 files changed, 15 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/accel/ivpu/ivpu_debugfs.c b/drivers/accel/ivpu/ivpu_debugfs.c
>> index 8958145c49adb..8180b95ed69dc 100644
>> --- a/drivers/accel/ivpu/ivpu_debugfs.c
>> +++ b/drivers/accel/ivpu/ivpu_debugfs.c
>> @@ -116,6 +116,14 @@ static int reset_pending_show(struct seq_file *s, void *v)
>>       return 0;
>>   }
>>   +static int firewall_irq_counter_show(struct seq_file *s, void *v)
>> +{
>> +    struct ivpu_device *vdev = seq_to_ivpu(s);
>> +
>> +    seq_printf(s, "%d\n", atomic_read(&vdev->hw->firewall_irq_counter));
>> +    return 0;
>> +}
>> +
>>   static const struct drm_debugfs_info vdev_debugfs_list[] = {
>>       {"bo_list", bo_list_show, 0},
>>       {"fw_name", fw_name_show, 0},
>> @@ -125,6 +133,7 @@ static const struct drm_debugfs_info vdev_debugfs_list[] = {
>>       {"last_bootmode", last_bootmode_show, 0},
>>       {"reset_counter", reset_counter_show, 0},
>>       {"reset_pending", reset_pending_show, 0},
>> +    {"firewall_irq_counter", firewall_irq_counter_show, 0},
>>   };
>>     static int dvfs_mode_get(void *data, u64 *dvfs_mode)
>> diff --git a/drivers/accel/ivpu/ivpu_hw.c b/drivers/accel/ivpu/ivpu_hw.c
>> index 09ada8b500b99..4e1054f3466e8 100644
>> --- a/drivers/accel/ivpu/ivpu_hw.c
>> +++ b/drivers/accel/ivpu/ivpu_hw.c
>> @@ -252,6 +252,7 @@ int ivpu_hw_init(struct ivpu_device *vdev)
>>       platform_init(vdev);
>>       wa_init(vdev);
>>       timeouts_init(vdev);
>> +    atomic_set(&vdev->hw->firewall_irq_counter, 0);
>>         return 0;
>>   }
>> diff --git a/drivers/accel/ivpu/ivpu_hw.h b/drivers/accel/ivpu/ivpu_hw.h
>> index dc5518248c405..fc4dbfc980c81 100644
>> --- a/drivers/accel/ivpu/ivpu_hw.h
>> +++ b/drivers/accel/ivpu/ivpu_hw.h
>> @@ -51,6 +51,7 @@ struct ivpu_hw_info {
>>       int dma_bits;
>>       ktime_t d0i3_entry_host_ts;
>>       u64 d0i3_entry_vpu_ts;
>> +    atomic_t firewall_irq_counter;
> 
> Why atomic?
 
So we don't have to worry about synchronization and barriers.



More information about the dri-devel mailing list