]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/dp: Assume panel power is off if runtime suspended
authorImre Deak <imre.deak@intel.com>
Wed, 9 Oct 2024 19:43:55 +0000 (22:43 +0300)
committerImre Deak <imre.deak@intel.com>
Fri, 11 Oct 2024 11:55:01 +0000 (14:55 +0300)
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: Jonathan Cavitt <jonathan.cavitt@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241009194358.1321200-2-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/intel_runtime_pm.h
drivers/gpu/drm/xe/compat-i915-headers/intel_runtime_pm.h

index fbb096be02ade5e4bb36e65f197705d90dfa8a55..3eff35dd59b8ad67f8095b9ce05dd28fcdfcf85e 100644 (file)
@@ -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
index 126f8320f86ebf98a97fce076e14a8951b4c92f1..e22669d61e954a9bc22f007d06aaf46c268f3410 100644 (file)
@@ -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");
 }
 
index cba587ceba1b6262c45bb51cfdadb292ff2b05ab..274042bff1bec706d5e43826247f6156df282156 100644 (file)
@@ -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);