From: Karol Wachowski <karol.wachow...@intel.com>

Generate recovery when fault from reserved context is detected.
Add Abort (A) bit to reserved (1) SSID to ensure NPU also receives a fault.

There is no way to create a file_priv with reserved SSID
but it is still possible to receive MMU faults from that SSID
as it is a default NPU HW setting. Such situation will occur if
FW freed context related resources but still performed access to DRAM.

Signed-off-by: Karol Wachowski <karol.wachow...@intel.com>
Signed-off-by: Maciej Falkowski <maciej.falkow...@linux.intel.com>
---
 drivers/accel/ivpu/ivpu_mmu.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/accel/ivpu/ivpu_mmu.c b/drivers/accel/ivpu/ivpu_mmu.c
index ae1dcd04051c..b80bdded9fd7 100644
--- a/drivers/accel/ivpu/ivpu_mmu.c
+++ b/drivers/accel/ivpu/ivpu_mmu.c
@@ -725,8 +725,8 @@ static int ivpu_mmu_cdtab_entry_set(struct ivpu_device 
*vdev, u32 ssid, u64 cd_d
        cd[2] = 0;
        cd[3] = 0x0000000000007444;
 
-       /* For global context generate memory fault on VPU */
-       if (ssid == IVPU_GLOBAL_CONTEXT_MMU_SSID)
+       /* For global and reserved contexts generate memory fault on VPU */
+       if (ssid == IVPU_GLOBAL_CONTEXT_MMU_SSID || ssid == 
IVPU_RESERVED_CONTEXT_MMU_SSID)
                cd[0] |= IVPU_MMU_CD_0_A;
 
        if (valid)
@@ -945,7 +945,8 @@ void ivpu_mmu_irq_evtq_handler(struct ivpu_device *vdev)
 
        while ((event = ivpu_mmu_get_event(vdev))) {
                ssid = FIELD_GET(IVPU_MMU_EVT_SSID_MASK, *event);
-               if (ssid == IVPU_GLOBAL_CONTEXT_MMU_SSID) {
+               if (ssid == IVPU_GLOBAL_CONTEXT_MMU_SSID ||
+                   ssid == IVPU_RESERVED_CONTEXT_MMU_SSID) {
                        ivpu_mmu_dump_event(vdev, event);
                        ivpu_pm_trigger_recovery(vdev, "MMU event");
                        return;
-- 
2.43.0

Reply via email to