drm/xe: Separate pure MMIO init from VRAM checkout
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Wed, 27 Mar 2024 18:27:38 +0000 (19:27 +0100)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Thu, 28 Mar 2024 12:45:33 +0000 (13:45 +0100)
We can setup root tile registers mapping at the same time as we
do early mapping of the entire MMIO BAR and keep mandatory VRAM
checkout as a separate step. This will allow us to perform SR-IOV
VF mode detection between those two steps using regular MMIO regs
access functions.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240327182740.407-2-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_mmio.c
drivers/gpu/drm/xe/xe_mmio.h

index b0bfe75..286ebcc 100644 (file)
@@ -424,7 +424,7 @@ int xe_device_probe_early(struct xe_device *xe)
        if (err)
                return err;
 
-       err = xe_mmio_root_tile_init(xe);
+       err = xe_mmio_verify_vram(xe);
        if (err)
                return err;
 
index 1de9de4..5d13fc7 100644 (file)
@@ -360,32 +360,9 @@ static void mmio_fini(struct drm_device *drm, void *arg)
                iounmap(xe->mem.vram.mapping);
 }
 
-static int xe_verify_lmem_ready(struct xe_device *xe)
-{
-       struct xe_gt *gt = xe_root_mmio_gt(xe);
-
-       if (!IS_DGFX(xe))
-               return 0;
-
-       if (IS_SRIOV_VF(xe))
-               return 0;
-
-       /*
-        * The boot firmware initializes local memory and assesses its health.
-        * If memory training fails, the punit will have been instructed to
-        * keep the GT powered down; we won't be able to communicate with it
-        * and we should not continue with driver initialization.
-        */
-       if (!(xe_mmio_read32(gt, GU_CNTL) & LMEM_INIT)) {
-               drm_err(&xe->drm, "VRAM not initialized by firmware\n");
-               return -ENODEV;
-       }
-
-       return 0;
-}
-
 int xe_mmio_init(struct xe_device *xe)
 {
+       struct xe_tile *root_tile = xe_device_get_root_tile(xe);
        struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
        const int mmio_bar = 0;
 
@@ -401,21 +378,33 @@ int xe_mmio_init(struct xe_device *xe)
                return -EIO;
        }
 
+       /* Setup first tile; other tiles (if present) will be setup later. */
+       root_tile->mmio.size = SZ_16M;
+       root_tile->mmio.regs = xe->mmio.regs;
+
        return drmm_add_action_or_reset(&xe->drm, mmio_fini, xe);
 }
 
-int xe_mmio_root_tile_init(struct xe_device *xe)
+int xe_mmio_verify_vram(struct xe_device *xe)
 {
-       struct xe_tile *root_tile = xe_device_get_root_tile(xe);
-       int err;
+       struct xe_gt *gt = xe_root_mmio_gt(xe);
 
-       /* Setup first tile; other tiles (if present) will be setup later. */
-       root_tile->mmio.size = SZ_16M;
-       root_tile->mmio.regs = xe->mmio.regs;
+       if (!IS_DGFX(xe))
+               return 0;
 
-       err = xe_verify_lmem_ready(xe);
-       if (err)
-               return err;
+       if (IS_SRIOV_VF(xe))
+               return 0;
+
+       /*
+        * The boot firmware initializes local memory and assesses its health.
+        * If memory training fails, the punit will have been instructed to
+        * keep the GT powered down; we won't be able to communicate with it
+        * and we should not continue with driver initialization.
+        */
+       if (!(xe_mmio_read32(gt, GU_CNTL) & LMEM_INIT)) {
+               drm_err(&xe->drm, "VRAM not initialized by firmware\n");
+               return -ENODEV;
+       }
 
        return 0;
 }
index 67ead99..b1680c4 100644 (file)
@@ -21,7 +21,7 @@ struct xe_device;
 #define LMEM_BAR               2
 
 int xe_mmio_init(struct xe_device *xe);
-int xe_mmio_root_tile_init(struct xe_device *xe);
+int xe_mmio_verify_vram(struct xe_device *xe);
 void xe_mmio_probe_tiles(struct xe_device *xe);
 
 u8 xe_mmio_read8(struct xe_gt *gt, struct xe_reg reg);