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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/17/2024 8:49 AM, Jacek Lawrynowicz wrote:
From: Andrzej Kacprowski <Andrzej.Kacprowski@xxxxxxxxx>

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@xxxxxxxxxxxxxxx> # v6.11+
Signed-off-by: Andrzej Kacprowski <Andrzej.Kacprowski@xxxxxxxxx>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@xxxxxxxxxxxxxxx>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@xxxxxxxxxxxxxxx>
---
  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?

  };
int ivpu_hw_init(struct ivpu_device *vdev);
diff --git a/drivers/accel/ivpu/ivpu_hw_ip.c b/drivers/accel/ivpu/ivpu_hw_ip.c
index b9b16f4041434..029dd065614b2 100644
--- a/drivers/accel/ivpu/ivpu_hw_ip.c
+++ b/drivers/accel/ivpu/ivpu_hw_ip.c
@@ -1073,7 +1073,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 */





[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux