[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