Commit 11bf0f0b authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

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: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/20250619104858.418440-20-dev@lankhorst.se


Signed-off-by: default avatarMaarten Lankhorst <dev@lankhorst.se>
parent 6386a499
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -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;
+26 −34
Original line number Diff line number Diff line
@@ -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;
+0 −1
Original line number Diff line number Diff line
@@ -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);