mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 13:43:21 -04:00
drm/i915/dmc_wl: Get wakelock when disabling dynamic DC states
Bspec says that disabling dynamic DC states require taking the DMC wakelock to cause an DC exit before writing to DC_STATE_EN. Implement that. In fact, testing on PTL revealed we end up failing to exit DC5/6 without this step. Bspec: 71583 Reviewed-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241108130218.24125-6-gustavo.sousa@intel.com
This commit is contained in:
committed by
Matt Roper
parent
f7b12bf296
commit
7a522aa6cf
@@ -994,10 +994,14 @@ void gen9_disable_dc_states(struct intel_display *display)
|
||||
return;
|
||||
}
|
||||
|
||||
gen9_set_dc_state(display, DC_STATE_DISABLE);
|
||||
|
||||
if (!HAS_DISPLAY(display))
|
||||
if (HAS_DISPLAY(display)) {
|
||||
intel_dmc_wl_get_noreg(display);
|
||||
gen9_set_dc_state(display, DC_STATE_DISABLE);
|
||||
intel_dmc_wl_put_noreg(display);
|
||||
} else {
|
||||
gen9_set_dc_state(display, DC_STATE_DISABLE);
|
||||
return;
|
||||
}
|
||||
|
||||
intel_dmc_wl_disable(display);
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ void intel_dmc_wl_get(struct intel_display *display, i915_reg_t reg)
|
||||
if (!__intel_dmc_wl_supported(display))
|
||||
return;
|
||||
|
||||
if (!intel_dmc_wl_check_range(reg))
|
||||
if (i915_mmio_reg_valid(reg) && !intel_dmc_wl_check_range(reg))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&wl->lock, flags);
|
||||
@@ -251,7 +251,7 @@ void intel_dmc_wl_put(struct intel_display *display, i915_reg_t reg)
|
||||
if (!__intel_dmc_wl_supported(display))
|
||||
return;
|
||||
|
||||
if (!intel_dmc_wl_check_range(reg))
|
||||
if (i915_mmio_reg_valid(reg) && !intel_dmc_wl_check_range(reg))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&wl->lock, flags);
|
||||
@@ -272,3 +272,13 @@ void intel_dmc_wl_put(struct intel_display *display, i915_reg_t reg)
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&wl->lock, flags);
|
||||
}
|
||||
|
||||
void intel_dmc_wl_get_noreg(struct intel_display *display)
|
||||
{
|
||||
intel_dmc_wl_get(display, INVALID_MMIO_REG);
|
||||
}
|
||||
|
||||
void intel_dmc_wl_put_noreg(struct intel_display *display)
|
||||
{
|
||||
intel_dmc_wl_put(display, INVALID_MMIO_REG);
|
||||
}
|
||||
|
||||
@@ -27,5 +27,7 @@ void intel_dmc_wl_enable(struct intel_display *display);
|
||||
void intel_dmc_wl_disable(struct intel_display *display);
|
||||
void intel_dmc_wl_get(struct intel_display *display, i915_reg_t reg);
|
||||
void intel_dmc_wl_put(struct intel_display *display, i915_reg_t reg);
|
||||
void intel_dmc_wl_get_noreg(struct intel_display *display);
|
||||
void intel_dmc_wl_put_noreg(struct intel_display *display);
|
||||
|
||||
#endif /* __INTEL_WAKELOCK_H__ */
|
||||
|
||||
Reference in New Issue
Block a user