#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>
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)
{
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;
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;