summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMatthew Auld <matthew.auld@intel.com>2024-05-22 11:21:58 +0100
committerMatthew Auld <matthew.auld@intel.com>2024-05-22 13:22:40 +0100
commitc7117419784f612d59ee565145f722e8b5541fe6 (patch)
tree3a5e44835d48fcefbcd0e10fa74678d6e40e01d5 /drivers
parenta0b834c8957a7d2848face008a12382a0ad11ffc (diff)
downloadlwn-c7117419784f612d59ee565145f722e8b5541fe6.tar.gz
lwn-c7117419784f612d59ee565145f722e8b5541fe6.zip
drm/xe: reset mmio mappings with devm
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
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/xe/xe_device.c4
-rw-r--r--drivers/gpu/drm/xe/xe_mmio.c35
-rw-r--r--drivers/gpu/drm/xe/xe_mmio.h2
3 files changed, 33 insertions, 8 deletions
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 56ea4c158a2a..2eba1e32c633 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -555,7 +555,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);
diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
index a87961ac6359..8a39d4c18554 100644
--- a/drivers/gpu/drm/xe/xe_mmio.c
+++ b/drivers/gpu/drm/xe/xe_mmio.c
@@ -258,6 +258,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;
@@ -334,10 +349,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;
@@ -388,6 +413,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)
@@ -395,10 +422,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;
}
diff --git a/drivers/gpu/drm/xe/xe_mmio.h b/drivers/gpu/drm/xe/xe_mmio.h
index 9ef7deecf38f..7ddd54cd34e6 100644
--- a/drivers/gpu/drm/xe/xe_mmio.h
+++ b/drivers/gpu/drm/xe/xe_mmio.h
@@ -14,7 +14,7 @@ struct xe_reg;
#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);