diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 24 | 
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index f6a3fdd5589e..5ad45bfff3fe 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -2806,6 +2806,13 @@ intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,  	ssize_t ret;  	int i; +	/* +	 * Sometime we just get the same incorrect byte repeated +	 * over the entire buffer. Doing just one throw away read +	 * initially seems to "solve" it. +	 */ +	drm_dp_dpcd_read(aux, DP_DPCD_REV, buffer, 1); +  	for (i = 0; i < 3; i++) {  		ret = drm_dp_dpcd_read(aux, offset, buffer, size);  		if (ret == size) @@ -3724,9 +3731,10 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)  		}  	} -	/* Training Pattern 3 support */ +	/* Training Pattern 3 support, both source and sink */  	if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 && -	    intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED) { +	    intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED && +	    (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)) {  		intel_dp->use_tps3 = true;  		DRM_DEBUG_KMS("Displayport TPS3 supported\n");  	} else @@ -4491,6 +4499,18 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)  	if (intel_dig_port->base.type != INTEL_OUTPUT_EDP)  		intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; +	if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { +		/* +		 * vdd off can generate a long pulse on eDP which +		 * would require vdd on to handle it, and thus we +		 * would end up in an endless cycle of +		 * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..." +		 */ +		DRM_DEBUG_KMS("ignoring long hpd on eDP port %c\n", +			      port_name(intel_dig_port->port)); +		return false; +	} +  	DRM_DEBUG_KMS("got hpd irq on port %c - %s\n",  		      port_name(intel_dig_port->port),  		      long_hpd ? "long" : "short");  |