if (err)
                goto out;
 
-       xe_gt_topology_init(gt);
-       xe_gt_mcr_init(gt);
+       xe_gt_mcr_init_early(gt);
        xe_pat_init(gt);
 
        err = xe_uc_init(>->uc);
        if (err)
                goto out_fw;
 
+       xe_gt_topology_init(gt);
+       xe_gt_mcr_init(gt);
+
 out_fw:
        xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
 out:
 
        [IMPLICIT_STEERING] = { "IMPLICIT", NULL },
 };
 
-void xe_gt_mcr_init(struct xe_gt *gt)
+/**
+ * xe_gt_mcr_init_early - Early initialization of the MCR support
+ * @gt: GT structure
+ *
+ * Perform early software only initialization of the MCR lock to allow
+ * the synchronization on accessing the STEER_SEMAPHORE register and
+ * use the xe_gt_mcr_multicast_write() function.
+ */
+void xe_gt_mcr_init_early(struct xe_gt *gt)
 {
-       struct xe_device *xe = gt_to_xe(gt);
-
        BUILD_BUG_ON(IMPLICIT_STEERING + 1 != NUM_STEERING_TYPES);
        BUILD_BUG_ON(ARRAY_SIZE(xe_steering_types) != NUM_STEERING_TYPES);
 
+       spin_lock_init(>->mcr_lock);
+}
+
+/**
+ * xe_gt_mcr_init - Normal initialization of the MCR support
+ * @gt: GT structure
+ *
+ * Perform normal initialization of the MCR for all usages.
+ */
+void xe_gt_mcr_init(struct xe_gt *gt)
+{
+       struct xe_device *xe = gt_to_xe(gt);
+
        if (IS_SRIOV_VF(xe))
                return;
 
-       spin_lock_init(>->mcr_lock);
-
        if (gt->info.type == XE_GT_TYPE_MEDIA) {
                drm_WARN_ON(&xe->drm, MEDIA_VER(xe) < 13);