drm/xe: Split init of xe_gt_init_hwconfig to xe_gt_init and *_early

Now that we added the separate step of initialising GUC in
xe_gt_init_early, it should be ok to initialise the minimum during early
init, and the rest after allocations are allowed.

Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/20250619104858.418440-20-dev@lankhorst.se
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
This commit is contained in:
Maarten Lankhorst 2025-06-19 12:49:06 +02:00
parent 6386a49951
commit 11bf0f0b3a
3 changed files with 26 additions and 41 deletions

View File

@ -800,12 +800,6 @@ int xe_device_probe(struct xe_device *xe)
return err;
}
for_each_gt(gt, xe, id) {
err = xe_gt_init_hwconfig(gt);
if (err)
return err;
}
err = xe_devcoredump_init(xe);
if (err)
return err;

View File

@ -390,6 +390,7 @@ int xe_gt_record_default_lrcs(struct xe_gt *gt)
int xe_gt_init_early(struct xe_gt *gt)
{
unsigned int fw_ref;
int err;
if (IS_SRIOV_PF(gt_to_xe(gt))) {
@ -426,7 +427,19 @@ int xe_gt_init_early(struct xe_gt *gt)
*/
xe_gt_mmio_init(gt);
return xe_uc_init_noalloc(&gt->uc);
err = xe_uc_init_noalloc(&gt->uc);
if (err)
return err;
fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
if (!fw_ref)
return -ETIMEDOUT;
xe_gt_mcr_init_early(gt);
xe_pat_init(gt);
xe_force_wake_put(gt_to_fw(gt), fw_ref);
return 0;
}
static void dump_pat_on_error(struct xe_gt *gt)
@ -449,6 +462,18 @@ static int gt_init_with_gt_forcewake(struct xe_gt *gt)
if (!fw_ref)
return -ETIMEDOUT;
err = xe_uc_init(&gt->uc);
if (err)
goto err_force_wake;
err = xe_uc_init_hwconfig(&gt->uc);
if (err)
goto err_force_wake;
xe_gt_topology_init(gt);
xe_gt_mcr_init(gt);
xe_gt_enable_host_l2_vram(gt);
if (!xe_gt_is_media_type(gt)) {
err = xe_ggtt_init(gt_to_tile(gt)->mem.ggtt);
if (err)
@ -580,39 +605,6 @@ static int gt_init_with_all_forcewake(struct xe_gt *gt)
return err;
}
/*
* Initialize enough GT to be able to load GuC in order to obtain hwconfig and
* enable CTB communication.
*/
int xe_gt_init_hwconfig(struct xe_gt *gt)
{
unsigned int fw_ref;
int err;
fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
if (!fw_ref)
return -ETIMEDOUT;
xe_gt_mcr_init_early(gt);
xe_pat_init(gt);
err = xe_uc_init(&gt->uc);
if (err)
goto out_fw;
err = xe_uc_init_hwconfig(&gt->uc);
if (err)
goto out_fw;
xe_gt_topology_init(gt);
xe_gt_mcr_init(gt);
xe_gt_enable_host_l2_vram(gt);
out_fw:
xe_force_wake_put(gt_to_fw(gt), fw_ref);
return err;
}
static void xe_gt_fini(void *arg)
{
struct xe_gt *gt = arg;

View File

@ -28,7 +28,6 @@ static inline bool xe_fault_inject_gt_reset(void)
}
struct xe_gt *xe_gt_alloc(struct xe_tile *tile);
int xe_gt_init_hwconfig(struct xe_gt *gt);
int xe_gt_init_early(struct xe_gt *gt);
int xe_gt_init(struct xe_gt *gt);
void xe_gt_mmio_init(struct xe_gt *gt);