Commit 7a522aa6 authored by Gustavo Sousa's avatar Gustavo Sousa Committed by Matt Roper
Browse files

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: default avatarLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarGustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241108130218.24125-6-gustavo.sousa@intel.com
parent f7b12bf2
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -994,10 +994,14 @@ void gen9_disable_dc_states(struct intel_display *display)
		return;
	}

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

	if (!HAS_DISPLAY(display))
		return;
	}

	intel_dmc_wl_disable(display);

+12 −2
Original line number Diff line number Diff line
@@ -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);
}
+2 −0
Original line number Diff line number Diff line
@@ -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__ */