Commit d758c8d6 authored by Balasubramani Vivekanandan's avatar Balasubramani Vivekanandan Committed by Matt Roper
Browse files

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: default avatarBalasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Link: https://patch.msgid.link/20251219145024.2955946-2-balasubramani.vivekanandan@intel.com


Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
parent 987167b1
Loading
Loading
Loading
Loading
+16 −57
Original line number Diff line number Diff line
@@ -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 (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 (!IS_DGFX(xe) || IS_SRIOV_VF(xe))
		return;

	if (initializing) {
		drm_dbg(&xe->drm, "lmem not initialized by firmware\n");
		return -EPROBE_DEFER;
	xe_assert(xe, xe_mmio_read32(xe_root_tile_mmio(xe), GU_CNTL) &
		  LMEM_INIT);
}

	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;