]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
accel/ivpu: Fix NOC firewall interrupt handling
authorAndrzej Kacprowski <Andrzej.Kacprowski@intel.com>
Thu, 17 Oct 2024 14:49:58 +0000 (16:49 +0200)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Wed, 30 Oct 2024 09:17:00 +0000 (10:17 +0100)
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
drivers/accel/ivpu/ivpu_debugfs.c
drivers/accel/ivpu/ivpu_hw.c
drivers/accel/ivpu/ivpu_hw.h
drivers/accel/ivpu/ivpu_hw_ip.c

index 6f86f8df30db0fc263f13a7a4bc98d9e1d3d687b..8d50981594d1533fef602f51d9378db1c7e85dfc 100644 (file)
@@ -108,6 +108,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},
@@ -116,6 +124,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 ssize_t
index 27f0fe4d54e00628b524d263f817c90075844602..e69c0613513f111c08ce00b4b33be0e826d77a2b 100644 (file)
@@ -249,6 +249,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;
 }
index 1c0c98e3afb88d78fc514989cd8c7ca09d83737b..a96a05b2acda9a4f898268a74eaa2d3765742d8a 100644 (file)
@@ -52,6 +52,7 @@ struct ivpu_hw_info {
        int dma_bits;
        ktime_t d0i3_entry_host_ts;
        u64 d0i3_entry_vpu_ts;
+       atomic_t firewall_irq_counter;
 };
 
 int ivpu_hw_init(struct ivpu_device *vdev);
index dfd2f4a5b5268583165c101206e749c304e81928..60b33fc59d96e3962d47a3e5fbca4e482e3a6311 100644 (file)
@@ -1062,7 +1062,10 @@ static void irq_wdt_mss_handler(struct ivpu_device *vdev)
 
 static void irq_noc_firewall_handler(struct ivpu_device *vdev)
 {
-       ivpu_pm_trigger_recovery(vdev, "NOC Firewall IRQ");
+       atomic_inc(&vdev->hw->firewall_irq_counter);
+
+       ivpu_dbg(vdev, IRQ, "NOC Firewall interrupt detected, counter %d\n",
+                atomic_read(&vdev->hw->firewall_irq_counter));
 }
 
 /* Handler for IRQs from NPU core */