]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/device: Convert wait for lmem init into an assert
authorBalasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Fri, 19 Dec 2025 14:50:25 +0000 (20:20 +0530)
committerMatt Roper <matthew.d.roper@intel.com>
Mon, 12 Jan 2026 16:56:20 +0000 (08:56 -0800)
Prior to lmem init check, driver is waiting for the pcode uncore_init
status. uncore_init status will be flagged after the complete boot and
initialization of the SoC by the pcode. uncore_init confirms that lmem
init and mmio unblock has been already completed.
It makes no sense to check for lmem init after the pcode uncore_init
check. So change the wait for lmem init check into an assert which
confirms lmem init is set.

Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patch.msgid.link/20251219145024.2955946-2-balasubramani.vivekanandan@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
drivers/gpu/drm/xe/xe_device.c

index e400ad5c9f9ec7d7ec229a6f30f23f2097807c52..7190b208e3dae13f46fbf75a88164e2e2434dff6 100644 (file)
@@ -8,7 +8,6 @@
 #include <linux/aperture.h>
 #include <linux/delay.h>
 #include <linux/fault-inject.h>
-#include <linux/iopoll.h>
 #include <linux/units.h>
 
 #include <drm/drm_atomic_helper.h>
@@ -654,62 +653,14 @@ mask_err:
        return err;
 }
 
-static int lmem_initializing(struct xe_device *xe)
+static void assert_lmem_ready(struct xe_device *xe)
 {
-       if (xe_mmio_read32(xe_root_tile_mmio(xe), GU_CNTL) & LMEM_INIT)
-               return 0;
-
-       if (signal_pending(current))
-               return -EINTR;
-
-       return 1;
-}
-
-static int wait_for_lmem_ready(struct xe_device *xe)
-{
-       const unsigned long TIMEOUT_SEC = 60;
-       unsigned long prev_jiffies;
-       int initializing;
-
-       if (!IS_DGFX(xe))
-               return 0;
-
-       if (IS_SRIOV_VF(xe))
-               return 0;
-
-       if (!lmem_initializing(xe))
-               return 0;
-
-       drm_dbg(&xe->drm, "Waiting for lmem initialization\n");
-       prev_jiffies = jiffies;
-
-       /*
-        * The boot firmware initializes local memory and
-        * assesses its health. If memory training fails,
-        * the punit will have been instructed to keep the GT powered
-        * down.we won't be able to communicate with it
-        *
-        * If the status check is done before punit updates the register,
-        * it can lead to the system being unusable.
-        * use a timeout and defer the probe to prevent this.
-        */
-       poll_timeout_us(initializing = lmem_initializing(xe),
-                       initializing <= 0,
-                       20 * USEC_PER_MSEC, TIMEOUT_SEC * USEC_PER_SEC, true);
-       if (initializing < 0)
-               return initializing;
-
-       if (initializing) {
-               drm_dbg(&xe->drm, "lmem not initialized by firmware\n");
-               return -EPROBE_DEFER;
-       }
-
-       drm_dbg(&xe->drm, "lmem ready after %ums",
-               jiffies_to_msecs(jiffies - prev_jiffies));
+       if (!IS_DGFX(xe) || IS_SRIOV_VF(xe))
+               return;
 
-       return 0;
+       xe_assert(xe, xe_mmio_read32(xe_root_tile_mmio(xe), GU_CNTL) &
+                 LMEM_INIT);
 }
-ALLOW_ERROR_INJECTION(wait_for_lmem_ready, ERRNO); /* See xe_pci_probe() */
 
 static void vf_update_device_info(struct xe_device *xe)
 {
@@ -764,6 +715,11 @@ int xe_device_probe_early(struct xe_device *xe)
        if (IS_SRIOV_VF(xe))
                vf_update_device_info(xe);
 
+       /*
+        * Check for pcode uncore_init status to confirm if the SoC
+        * initialization is complete. Until done, any MMIO or lmem access from
+        * the driver will be blocked
+        */
        err = xe_pcode_probe_early(xe);
        if (err || xe_survivability_mode_is_requested(xe)) {
                int save_err = err;
@@ -780,9 +736,12 @@ int xe_device_probe_early(struct xe_device *xe)
                return save_err;
        }
 
-       err = wait_for_lmem_ready(xe);
-       if (err)
-               return err;
+       /*
+        * Make sure the lmem is initialized and ready to use. xe_pcode_ready()
+        * is flagged after full initialization is complete. Assert if lmem is
+        * not initialized.
+        */
+       assert_lmem_ready(xe);
 
        xe->wedged.mode = xe_device_validate_wedged_mode(xe, xe_modparam.wedged_mode) ?
                          XE_WEDGED_MODE_DEFAULT : xe_modparam.wedged_mode;