mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 11:03:43 +02:00
drm/i915/gsc: Fix the Driver-FLR completion
The Driver-FLR flow may inadvertently exit early before the full
completion of the re-init of the internal HW state if we only poll
GU_DEBUG Bit31 (polling for it to toggle from 0 -> 1). Instead
we need a two-step completion wait-for-completion flow that also
involves GU_CNTL. See the patch and new code comments for detail.
This is new direction from HW architecture folks.
v2: - Add error message for the teardown timeout (Anshuman)
- Don't duplicate code in comments (Jani)
v3: - Add get/put runtime-pm for this function. Though
not functionally required during unload, its so the uncore
doesn't complain.
v4: - Remove the get/put runtime-pm - that was for a prior
version of this patch (not needed for drm-managed callback).
- Remove the fixes tag since this is only for MTL and MTL
still needs force probe (Daniele).
- Bit 31 of GU_CNTL should be DRIVERFLR instead of
DRIVERFLR_STATUS (Daniele).
Signed-off-by: Alan Previn <alan.previn.teres.alexis@intel.com>
Tested-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230224001758.544817-1-alan.previn.teres.alexis@intel.com
This commit is contained in:
parent
3cba09a6ac
commit
0591bdad58
|
|
@ -2748,14 +2748,25 @@ static void driver_initiated_flr(struct intel_uncore *uncore)
|
|||
/* Trigger the actual Driver-FLR */
|
||||
intel_uncore_rmw_fw(uncore, GU_CNTL, 0, DRIVERFLR);
|
||||
|
||||
/* Wait for hardware teardown to complete */
|
||||
ret = intel_wait_for_register_fw(uncore, GU_CNTL,
|
||||
DRIVERFLR, 0,
|
||||
flr_timeout_ms);
|
||||
if (ret) {
|
||||
drm_err(&i915->drm, "Driver-FLR-teardown wait completion failed! %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Wait for hardware/firmware re-init to complete */
|
||||
ret = intel_wait_for_register_fw(uncore, GU_DEBUG,
|
||||
DRIVERFLR_STATUS, DRIVERFLR_STATUS,
|
||||
flr_timeout_ms);
|
||||
if (ret) {
|
||||
drm_err(&i915->drm, "wait for Driver-FLR completion failed! %d\n", ret);
|
||||
drm_err(&i915->drm, "Driver-FLR-reinit wait completion failed! %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Clear sticky completion status */
|
||||
intel_uncore_write_fw(uncore, GU_DEBUG, DRIVERFLR_STATUS);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user