]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe: Split MCR initialization
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Thu, 30 May 2024 11:58:14 +0000 (13:58 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Thu, 30 May 2024 22:02:04 +0000 (00:02 +0200)
The initialization order of GT topology, MCR, PAT and GuC HWconfig
as done today by native/PF driver, can't be followed as-is by the
VF driver, since fuse registers used in GT topology discovery will
be obtained by the VF driver from the GuC in HWconfig step.

While native/PF drivers need to program the HW PAT table prior to
loading the GuC, this requires only multicast writes support from
the MCR code, which could be initialized separately from the full
MCR support that requires the GT topology to setup steering data.

Split MCR initialization into two steps to avoid introducing VF
specific code paths. This also fixes duplicated spin_lock inits.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: MichaƂ Winiarski <michal.winiarski@intel.com>
Cc: Zhanjun Dong <zhanjun.dong@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240530115814.1284-1-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_gt.c
drivers/gpu/drm/xe/xe_gt_mcr.c
drivers/gpu/drm/xe/xe_gt_mcr.h

index 0a1e04fe2690f85e162543e6bef956d30ffa27a4..4e11662b78bda603696ee1113af01ee0bc98cd3b 100644 (file)
@@ -504,8 +504,7 @@ int xe_gt_init_hwconfig(struct xe_gt *gt)
        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(&gt->uc);
@@ -516,6 +515,9 @@ int xe_gt_init_hwconfig(struct xe_gt *gt)
        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:
index 577bd7043740d0c464516dad455b5a7f8834a654..386ac32699092c5c29f406891bc2b1e45d8b0311 100644 (file)
@@ -375,18 +375,35 @@ static const struct {
        [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(&gt->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(&gt->mcr_lock);
-
        if (gt->info.type == XE_GT_TYPE_MEDIA) {
                drm_WARN_ON(&xe->drm, MEDIA_VER(xe) < 13);
 
index e7d03e001a49f6abcae355bca4acf42db67f3fd5..8d119a0d54938fcfd7c04440d84748ed48d43007 100644 (file)
@@ -12,6 +12,7 @@
 struct drm_printer;
 struct xe_gt;
 
+void xe_gt_mcr_init_early(struct xe_gt *gt);
 void xe_gt_mcr_init(struct xe_gt *gt);
 
 void xe_gt_mcr_set_implicit_defaults(struct xe_gt *gt);