Skip to content

Commit 13ea6db

Browse files
anshuma1uma-intel
authored andcommitted
drm/i915/edp: Ignore short pulse when panel powered off
Few edp panels like Sharp is triggering short and long hpd pulse after panel is getting powered off. Currently driver is already ignoring long pulse for eDP panel but in order to process the short pulse, it turns on the VDD which requires panel power_cycle_delay + panel_power_on_delay these delay on Sharp panel introduced the responsiveness overhead of 800ms in the modeset sequence and as well is in suspend sequence. Ignoring any short pulse if panel is powered off. FIXME: It requires to wait for panel_power_off delay in order to check the panel power status due to pps_lock because panel triggers short pulse immediately after writing PP_OFF to PP_CTRL register and wait_panel_off waits for panel_power_off delay with pps_lock held. This still creates responsiveness overhead of panel_power_off delay. v2: - checking vdd along with panel power to ignore the hpd. [Jani,Ville] v3: - safer side check to ignore the long hpd when eDP have power, adding type of hpd to debug log. [Jani] Signed-off-by: Anshuman Gupta <[email protected]> Reviewed-by: Jani Nikula <[email protected]> Signed-off-by: Uma Shankar <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 043cd2d commit 13ea6db

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

drivers/gpu/drm/i915/display/intel_dp.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7097,19 +7097,34 @@ static const struct drm_encoder_funcs intel_dp_enc_funcs = {
70977097
.destroy = intel_dp_encoder_destroy,
70987098
};
70997099

7100+
static bool intel_edp_have_power(struct intel_dp *intel_dp)
7101+
{
7102+
intel_wakeref_t wakeref;
7103+
bool have_power = false;
7104+
7105+
with_pps_lock(intel_dp, wakeref) {
7106+
have_power = edp_have_panel_power(intel_dp) &&
7107+
edp_have_panel_vdd(intel_dp);
7108+
}
7109+
7110+
return have_power;
7111+
}
7112+
71007113
enum irqreturn
71017114
intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
71027115
{
71037116
struct intel_dp *intel_dp = &intel_dig_port->dp;
71047117

7105-
if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
7118+
if (intel_dig_port->base.type == INTEL_OUTPUT_EDP &&
7119+
(long_hpd || !intel_edp_have_power(intel_dp))) {
71067120
/*
7107-
* vdd off can generate a long pulse on eDP which
7121+
* vdd off can generate a long/short pulse on eDP which
71087122
* would require vdd on to handle it, and thus we
71097123
* would end up in an endless cycle of
7110-
* "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
7124+
* "vdd off -> long/short hpd -> vdd on -> detect -> vdd off -> ..."
71117125
*/
7112-
DRM_DEBUG_KMS("ignoring long hpd on eDP [ENCODER:%d:%s]\n",
7126+
DRM_DEBUG_KMS("ignoring %s hpd on eDP [ENCODER:%d:%s]\n",
7127+
long_hpd ? "long" : "short",
71137128
intel_dig_port->base.base.base.id,
71147129
intel_dig_port->base.base.name);
71157130
return IRQ_HANDLED;

0 commit comments

Comments
 (0)