Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

accel/ivpu: Fix NOC firewall interrupt handling

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@vger.kernel.org # v6.11+
Signed-off-by: Andrzej Kacprowski <Andrzej.Kacprowski@intel.com>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241017144958.79327-1-jacek.lawrynowicz@linux.intel.com

authored by

Andrzej Kacprowski and committed by
Jacek Lawrynowicz
72f7e16e 746ae46c

+15 -1
+9
drivers/accel/ivpu/ivpu_debugfs.c
··· 108 108 return 0; 109 109 } 110 110 111 + static int firewall_irq_counter_show(struct seq_file *s, void *v) 112 + { 113 + struct ivpu_device *vdev = seq_to_ivpu(s); 114 + 115 + seq_printf(s, "%d\n", atomic_read(&vdev->hw->firewall_irq_counter)); 116 + return 0; 117 + } 118 + 111 119 static const struct drm_debugfs_info vdev_debugfs_list[] = { 112 120 {"bo_list", bo_list_show, 0}, 113 121 {"fw_name", fw_name_show, 0}, ··· 124 116 {"last_bootmode", last_bootmode_show, 0}, 125 117 {"reset_counter", reset_counter_show, 0}, 126 118 {"reset_pending", reset_pending_show, 0}, 119 + {"firewall_irq_counter", firewall_irq_counter_show, 0}, 127 120 }; 128 121 129 122 static ssize_t
+1
drivers/accel/ivpu/ivpu_hw.c
··· 249 249 platform_init(vdev); 250 250 wa_init(vdev); 251 251 timeouts_init(vdev); 252 + atomic_set(&vdev->hw->firewall_irq_counter, 0); 252 253 253 254 return 0; 254 255 }
+1
drivers/accel/ivpu/ivpu_hw.h
··· 52 52 int dma_bits; 53 53 ktime_t d0i3_entry_host_ts; 54 54 u64 d0i3_entry_vpu_ts; 55 + atomic_t firewall_irq_counter; 55 56 }; 56 57 57 58 int ivpu_hw_init(struct ivpu_device *vdev);
+4 -1
drivers/accel/ivpu/ivpu_hw_ip.c
··· 1062 1062 1063 1063 static void irq_noc_firewall_handler(struct ivpu_device *vdev) 1064 1064 { 1065 - ivpu_pm_trigger_recovery(vdev, "NOC Firewall IRQ"); 1065 + atomic_inc(&vdev->hw->firewall_irq_counter); 1066 + 1067 + ivpu_dbg(vdev, IRQ, "NOC Firewall interrupt detected, counter %d\n", 1068 + atomic_read(&vdev->hw->firewall_irq_counter)); 1066 1069 } 1067 1070 1068 1071 /* Handler for IRQs from NPU core */