Commit 451d261a authored by Michal Wajdeczko's avatar Michal Wajdeczko

drm/xe: Separate pure MMIO init from VRAM checkout

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: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240327182740.407-2-michal.wajdeczko@intel.com
parent 7ee7dd6f
......@@ -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;
......
......@@ -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;
}
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment