diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a0dad1a2f819..5ca68aa9f237 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -105,7 +105,8 @@ intel_dp_max_link_bw(struct intel_dp *intel_dp)  	case DP_LINK_BW_2_7:  		break;  	case DP_LINK_BW_5_4: /* 1.2 capable displays may advertise higher bw */ -		if ((IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) && +		if (((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || +		     INTEL_INFO(dev)->gen >= 8) &&  		    intel_dp->dpcd[DP_DPCD_REV] >= 0x12)  			max_link_bw = DP_LINK_BW_5_4;  		else @@ -575,7 +576,8 @@ out:  	return ret;  } -#define HEADER_SIZE	4 +#define BARE_ADDRESS_SIZE	3 +#define HEADER_SIZE		(BARE_ADDRESS_SIZE + 1)  static ssize_t  intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)  { @@ -592,7 +594,7 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)  	switch (msg->request & ~DP_AUX_I2C_MOT) {  	case DP_AUX_NATIVE_WRITE:  	case DP_AUX_I2C_WRITE: -		txsize = HEADER_SIZE + msg->size; +		txsize = msg->size ? HEADER_SIZE + msg->size : BARE_ADDRESS_SIZE;  		rxsize = 1;  		if (WARN_ON(txsize > 20)) @@ -611,7 +613,7 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)  	case DP_AUX_NATIVE_READ:  	case DP_AUX_I2C_READ: -		txsize = HEADER_SIZE; +		txsize = msg->size ? HEADER_SIZE : BARE_ADDRESS_SIZE;  		rxsize = msg->size + 1;  		if (WARN_ON(rxsize > 20)) @@ -3618,7 +3620,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,  {  	struct drm_connector *connector = &intel_connector->base;  	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); -	struct drm_device *dev = intel_dig_port->base.base.dev; +	struct intel_encoder *intel_encoder = &intel_dig_port->base; +	struct drm_device *dev = intel_encoder->base.dev;  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct drm_display_mode *fixed_mode = NULL;  	bool has_dpcd; @@ -3628,6 +3631,14 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,  	if (!is_edp(intel_dp))  		return true; +	/* The VDD bit needs a power domain reference, so if the bit is already +	 * enabled when we boot, grab this reference. */ +	if (edp_have_panel_vdd(intel_dp)) { +		enum intel_display_power_domain power_domain; +		power_domain = intel_display_port_power_domain(intel_encoder); +		intel_display_power_get(dev_priv, power_domain); +	} +  	/* Cache DPCD and EDID for edp. */  	intel_edp_panel_vdd_on(intel_dp);  	has_dpcd = intel_dp_get_dpcd(intel_dp);  | 
