]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/xe: reset mmio mappings with devm
authorMatthew Auld <matthew.auld@intel.com>
Wed, 22 May 2024 10:21:58 +0000 (11:21 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Aug 2024 15:36:04 +0000 (17:36 +0200)
[ Upstream commit c7117419784f612d59ee565145f722e8b5541fe6 ]

Set our various mmio mappings to NULL. This should make it easier to
catch something rogue trying to mess with mmio after device removal. For
example, we might unmap everything and then start hitting some mmio
address which has already been unmamped by us and then remapped by
something else, causing all kinds of carnage.

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240522102143.128069-33-matthew.auld@intel.com
Stable-dep-of: 15939ca77d44 ("drm/xe: Fix tile fini sequence")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_mmio.c
drivers/gpu/drm/xe/xe_mmio.h

index 5ef9b50a20d01a425aa7a329c9176008fa5d0051..a1cbdafbff75e26e7966bd67156c4a3d43832fbe 100644 (file)
@@ -551,7 +551,9 @@ int xe_device_probe(struct xe_device *xe)
        if (err)
                return err;
 
-       xe_mmio_probe_tiles(xe);
+       err = xe_mmio_probe_tiles(xe);
+       if (err)
+               return err;
 
        xe_ttm_sys_mgr_init(xe);
 
index 2ebb2f0d6874ecb263959a0696bd7d7df3d7d835..9d8fafdf51453e4b62246b2bedc1f238f2e6a951 100644 (file)
@@ -254,6 +254,21 @@ static int xe_mmio_tile_vram_size(struct xe_tile *tile, u64 *vram_size,
        return xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
 }
 
+static void vram_fini(void *arg)
+{
+       struct xe_device *xe = arg;
+       struct xe_tile *tile;
+       int id;
+
+       if (xe->mem.vram.mapping)
+               iounmap(xe->mem.vram.mapping);
+
+       xe->mem.vram.mapping = NULL;
+
+       for_each_tile(tile, xe, id)
+               tile->mem.vram.mapping = NULL;
+}
+
 int xe_mmio_probe_vram(struct xe_device *xe)
 {
        struct xe_tile *tile;
@@ -330,10 +345,20 @@ int xe_mmio_probe_vram(struct xe_device *xe)
        drm_info(&xe->drm, "Available VRAM: %pa, %pa\n", &xe->mem.vram.io_start,
                 &available_size);
 
-       return 0;
+       return devm_add_action_or_reset(xe->drm.dev, vram_fini, xe);
 }
 
-void xe_mmio_probe_tiles(struct xe_device *xe)
+static void tiles_fini(void *arg)
+{
+       struct xe_device *xe = arg;
+       struct xe_tile *tile;
+       int id;
+
+       for_each_tile(tile, xe, id)
+               tile->mmio.regs = NULL;
+}
+
+int xe_mmio_probe_tiles(struct xe_device *xe)
 {
        size_t tile_mmio_size = SZ_16M, tile_mmio_ext_size = xe->info.tile_mmio_ext_size;
        u8 id, tile_count = xe->info.tile_count;
@@ -384,6 +409,8 @@ add_mmio_ext:
                        regs += tile_mmio_ext_size;
                }
        }
+
+       return devm_add_action_or_reset(xe->drm.dev, tiles_fini, xe);
 }
 
 static void mmio_fini(void *arg)
@@ -391,10 +418,6 @@ static void mmio_fini(void *arg)
        struct xe_device *xe = arg;
 
        pci_iounmap(to_pci_dev(xe->drm.dev), xe->mmio.regs);
-       if (xe->mem.vram.mapping)
-               iounmap(xe->mem.vram.mapping);
-
-       xe->mem.vram.mapping = NULL;
        xe->mmio.regs = NULL;
 }
 
index a3cd7b3036c7345a7951c242c59c4f238218c971..a929d090bb2f121417073d70689926c818e0b28c 100644 (file)
@@ -21,7 +21,7 @@ struct xe_device;
 #define LMEM_BAR               2
 
 int xe_mmio_init(struct xe_device *xe);
-void xe_mmio_probe_tiles(struct xe_device *xe);
+int xe_mmio_probe_tiles(struct xe_device *xe);
 
 u8 xe_mmio_read8(struct xe_gt *gt, struct xe_reg reg);
 u16 xe_mmio_read16(struct xe_gt *gt, struct xe_reg reg);