Commit fef0bcf7 authored by Imre Deak's avatar Imre Deak
Browse files

drm/i915/dp: Assume panel power is off if runtime suspended



If the device is runtime suspended the eDP panel power is also off.
Ignore a short HPD on eDP if the device is suspended accordingly,
instead of checking the panel power state via the PPS registers for the
same purpose. The latter involves runtime resuming the device
unnecessarily, in a frequent scenario where the panel generates a
spurious short HPD after disabling the panel power and the device is
runtime suspended.

Reviewed-by: default avatarJonathan Cavitt <jonathan.cavitt@intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241009194358.1321200-2-imre.deak@intel.com
parent 388629a2
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@
#include "intel_pch_display.h"
#include "intel_pps.h"
#include "intel_psr.h"
#include "intel_runtime_pm.h"
#include "intel_quirks.h"
#include "intel_tc.h"
#include "intel_vdsc.h"
@@ -6054,7 +6055,9 @@ intel_dp_hpd_pulse(struct intel_digital_port *dig_port, bool long_hpd)
	u8 dpcd[DP_RECEIVER_CAP_SIZE];

	if (dig_port->base.type == INTEL_OUTPUT_EDP &&
	    (long_hpd || !intel_pps_have_panel_power_or_vdd(intel_dp))) {
	    (long_hpd ||
	     intel_runtime_pm_suspended(&i915->runtime_pm) ||
	     !intel_pps_have_panel_power_or_vdd(intel_dp))) {
		/*
		 * vdd off can generate a long/short pulse on eDP which
		 * would require vdd on to handle it, and thus we
+7 −1
Original line number Diff line number Diff line
@@ -96,10 +96,16 @@ intel_rpm_wakelock_count(int wakeref_count)
	return wakeref_count >> INTEL_RPM_WAKELOCK_SHIFT;
}

static inline bool
intel_runtime_pm_suspended(struct intel_runtime_pm *rpm)
{
	return pm_runtime_suspended(rpm->kdev);
}

static inline void
assert_rpm_device_not_suspended(struct intel_runtime_pm *rpm)
{
	WARN_ONCE(pm_runtime_suspended(rpm->kdev),
	WARN_ONCE(intel_runtime_pm_suspended(rpm),
		  "Device suspended during HW access\n");
}

+8 −0
Original line number Diff line number Diff line
@@ -20,6 +20,14 @@ static inline void enable_rpm_wakeref_asserts(void *rpm)
{
}

static inline bool
intel_runtime_pm_suspended(struct xe_runtime_pm *pm)
{
	struct xe_device *xe = container_of(pm, struct xe_device, runtime_pm);

	return pm_runtime_suspended(xe->drm.dev);
}

static inline intel_wakeref_t intel_runtime_pm_get(struct xe_runtime_pm *pm)
{
	struct xe_device *xe = container_of(pm, struct xe_device, runtime_pm);