drm/xe/device: Convert wait for lmem init into an assert

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>
This commit is contained in:
Balasubramani Vivekanandan 2025-12-19 20:20:25 +05:30 committed by Matt Roper
parent 987167b119
commit d758c8d6e2

View 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,63 +653,15 @@ static int xe_set_dma_info(struct xe_device *xe)
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 (!IS_DGFX(xe) || IS_SRIOV_VF(xe))
return;
if (signal_pending(current))
return -EINTR;
return 1;
xe_assert(xe, xe_mmio_read32(xe_root_tile_mmio(xe), GU_CNTL) &
LMEM_INIT);
}
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));
return 0;
}
ALLOW_ERROR_INJECTION(wait_for_lmem_ready, ERRNO); /* See xe_pci_probe() */
static void vf_update_device_info(struct xe_device *xe)
{
xe_assert(xe, IS_SRIOV_VF(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;