]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe: Split init of xe_gt_init_hwconfig to xe_gt_init and *_early
authorMaarten Lankhorst <dev@lankhorst.se>
Thu, 19 Jun 2025 10:49:06 +0000 (12:49 +0200)
committerMaarten Lankhorst <dev@lankhorst.se>
Thu, 26 Jun 2025 20:11:35 +0000 (22:11 +0200)
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>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_gt.c
drivers/gpu/drm/xe/xe_gt.h

index f56677d3f0dca76a8624dbe3be06c059436e88b8..c3dd4778b8a2227992617ecf7072412640bae2e8 100644 (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;
index 435d888a1dfc8c6eaea330d787a64f31d2e90df9..3942f1ac253e7530e1a66691d7b28dea04ec4eec 100644 (file)
@@ -390,6 +390,7 @@ put_exec_queue:
 
 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 @@ err_force_wake:
        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;
index 187fa6490eafcd824eecf4b3160d6e02f89c5be0..8128ddfdd7886310cd15d095f6ae99954d062e4e 100644 (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);