diff options
Diffstat (limited to 'drivers/gpu/drm/i915/vlv_dsi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/vlv_dsi.c | 55 | 
1 files changed, 32 insertions, 23 deletions
| diff --git a/drivers/gpu/drm/i915/vlv_dsi.c b/drivers/gpu/drm/i915/vlv_dsi.c index 361e962a7969..6403728fe778 100644 --- a/drivers/gpu/drm/i915/vlv_dsi.c +++ b/drivers/gpu/drm/i915/vlv_dsi.c @@ -23,7 +23,6 @@   * Author: Jani Nikula <jani.nikula@intel.com>   */ -#include <drm/drmP.h>  #include <drm/drm_atomic_helper.h>  #include <drm/drm_crtc.h>  #include <drm/drm_edid.h> @@ -257,9 +256,9 @@ static void band_gap_reset(struct drm_i915_private *dev_priv)  	mutex_unlock(&dev_priv->sb_lock);  } -static bool intel_dsi_compute_config(struct intel_encoder *encoder, -				     struct intel_crtc_state *pipe_config, -				     struct drm_connector_state *conn_state) +static int intel_dsi_compute_config(struct intel_encoder *encoder, +				    struct intel_crtc_state *pipe_config, +				    struct drm_connector_state *conn_state)  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi, @@ -276,7 +275,7 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,  	if (fixed_mode) {  		intel_fixed_panel_mode(fixed_mode, adjusted_mode); -		if (HAS_GMCH_DISPLAY(dev_priv)) +		if (HAS_GMCH(dev_priv))  			intel_gmch_panel_fitting(crtc, pipe_config,  						 conn_state->scaling_mode);  		else @@ -285,11 +284,16 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,  	}  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) -		return false; +		return -EINVAL;  	/* DSI uses short packets for sync events, so clear mode flags for DSI */  	adjusted_mode->flags = 0; +	if (intel_dsi->pixel_format == MIPI_DSI_FMT_RGB888) +		pipe_config->pipe_bpp = 24; +	else +		pipe_config->pipe_bpp = 18; +  	if (IS_GEN9_LP(dev_priv)) {  		/* Enable Frame time stamp based scanline reporting */  		adjusted_mode->private_flags |= @@ -303,16 +307,16 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,  		ret = bxt_dsi_pll_compute(encoder, pipe_config);  		if (ret) -			return false; +			return -EINVAL;  	} else {  		ret = vlv_dsi_pll_compute(encoder, pipe_config);  		if (ret) -			return false; +			return -EINVAL;  	}  	pipe_config->clock_set = true; -	return true; +	return 0;  }  static bool glk_dsi_enable_io(struct intel_encoder *encoder) @@ -674,6 +678,10 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder,  					LANE_CONFIGURATION_DUAL_LINK_B :  					LANE_CONFIGURATION_DUAL_LINK_A;  		} + +		if (intel_dsi->pixel_format != MIPI_DSI_FMT_RGB888) +			temp |= DITHERING_ENABLE; +  		/* assert ip_tg_enable signal */  		I915_WRITE(port_ctrl, temp | DPI_ENABLE);  		POSTING_READ(port_ctrl); @@ -960,13 +968,15 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); +	intel_wakeref_t wakeref;  	enum port port;  	bool active = false;  	DRM_DEBUG_KMS("\n"); -	if (!intel_display_power_get_if_enabled(dev_priv, -						encoder->power_domain)) +	wakeref = intel_display_power_get_if_enabled(dev_priv, +						     encoder->power_domain); +	if (!wakeref)  		return false;  	/* @@ -1022,7 +1032,7 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,  	}  out_put_power: -	intel_display_power_put(dev_priv, encoder->power_domain); +	intel_display_power_put(dev_priv, encoder->power_domain, wakeref);  	return active;  } @@ -1058,10 +1068,8 @@ static void bxt_dsi_get_pipe_config(struct intel_encoder *encoder,  	}  	fmt = I915_READ(MIPI_DSI_FUNC_PRG(port)) & VID_MODE_FORMAT_MASK; -	pipe_config->pipe_bpp = -			mipi_dsi_pixel_format_to_bpp( -				pixel_format_from_register_bits(fmt)); -	bpp = pipe_config->pipe_bpp; +	bpp = mipi_dsi_pixel_format_to_bpp( +			pixel_format_from_register_bits(fmt));  	/* Enable Frame time stamo based scanline reporting */  	adjusted_mode->private_flags |= @@ -1199,11 +1207,9 @@ static void intel_dsi_get_config(struct intel_encoder *encoder,  	if (IS_GEN9_LP(dev_priv)) {  		bxt_dsi_get_pipe_config(encoder, pipe_config); -		pclk = bxt_dsi_get_pclk(encoder, pipe_config->pipe_bpp, -					pipe_config); +		pclk = bxt_dsi_get_pclk(encoder, pipe_config);  	} else { -		pclk = vlv_dsi_get_pclk(encoder, pipe_config->pipe_bpp, -					pipe_config); +		pclk = vlv_dsi_get_pclk(encoder, pipe_config);  	}  	if (pclk) { @@ -1575,6 +1581,7 @@ vlv_dsi_get_hw_panel_orientation(struct intel_connector *connector)  	enum drm_panel_orientation orientation;  	struct intel_plane *plane;  	struct intel_crtc *crtc; +	intel_wakeref_t wakeref;  	enum pipe pipe;  	u32 val; @@ -1585,7 +1592,8 @@ vlv_dsi_get_hw_panel_orientation(struct intel_connector *connector)  	plane = to_intel_plane(crtc->base.primary);  	power_domain = POWER_DOMAIN_PIPE(pipe); -	if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) +	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain); +	if (!wakeref)  		return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;  	val = I915_READ(DSPCNTR(plane->i9xx_plane)); @@ -1597,7 +1605,7 @@ vlv_dsi_get_hw_panel_orientation(struct intel_connector *connector)  	else  		orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; -	intel_display_power_put(dev_priv, power_domain); +	intel_display_power_put(dev_priv, power_domain, wakeref);  	return orientation;  } @@ -1625,7 +1633,7 @@ static void intel_dsi_add_properties(struct intel_connector *connector)  		u32 allowed_scalers;  		allowed_scalers = BIT(DRM_MODE_SCALE_ASPECT) | BIT(DRM_MODE_SCALE_FULLSCREEN); -		if (!HAS_GMCH_DISPLAY(dev_priv)) +		if (!HAS_GMCH(dev_priv))  			allowed_scalers |= BIT(DRM_MODE_SCALE_CENTER);  		drm_connector_attach_scaling_mode_property(&connector->base, @@ -1689,6 +1697,7 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)  	intel_encoder->post_disable = intel_dsi_post_disable;  	intel_encoder->get_hw_state = intel_dsi_get_hw_state;  	intel_encoder->get_config = intel_dsi_get_config; +	intel_encoder->update_pipe = intel_panel_update_backlight;  	intel_connector->get_hw_state = intel_connector_get_hw_state; | 
