[Intel-gfx] [PATCH] drm/i915: Convert ICL-style DSI to use phy namespace

Jani Nikula jani.nikula at linux.intel.com
Thu Sep 5 12:49:16 UTC 2019


On Wed, 04 Sep 2019, Matt Roper <matthew.d.roper at intel.com> wrote:
> ICL+ DSI outputs operate a bit differently than DP/HDMI/eDP and are more
> closely tied to the PHY than to the DDI.  Since we've separated PHY's
> out into their own namespace it makes sense to operate on 'enum phy'
> throughout most of the ICL DSI code rather than 'enum port' which we
> generally use to refer to the DDI these days.  Part of this transition
> has already been done as part of commit dc867bc7d887 ("drm/i915/gen11:
> Convert combo PHY logic to use new 'enum phy' namespace"), although that
> patch only migrated the parts of the code that were specifically
> updating the combo PHY registers themselves.  Moving the rest of the
> code over to the PHY namespace as well will hopefully make things more
> consistent and less confusing.
>
> Note that the change here is really just a naming change.  On all of the
> platforms that this code currently applies to, the DSI outputs always
> have port==phy so we're still passing the same integer values around no
> matter which type of enum they belong to..
>
> Cc: Jani Nikula <jani.nikula at linux.intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>

Cc: Ville & Vandita, FYI, maybe you want to eyeball through this.

Reviewed-by: Jani Nikula <jani.nikula at intel.com>

> ---
>  drivers/gpu/drm/i915/display/icl_dsi.c   | 236 ++++++++++++-----------
>  drivers/gpu/drm/i915/display/intel_dsi.h |   5 +-
>  2 files changed, 126 insertions(+), 115 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
> index 6e398c33a524..5cf32032e795 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> @@ -65,9 +65,9 @@ static void wait_for_payload_credits(struct drm_i915_private *dev_priv,
>  		DRM_ERROR("DSI payload credits not released\n");
>  }
>  
> -static enum transcoder dsi_port_to_transcoder(enum port port)
> +static enum transcoder dsi_phy_to_transcoder(enum phy phy)
>  {
> -	if (port == PORT_A)
> +	if (phy == PHY_A)
>  		return TRANSCODER_DSI_0;
>  	else
>  		return TRANSCODER_DSI_1;
> @@ -78,20 +78,20 @@ static void wait_for_cmds_dispatched_to_panel(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);
>  	struct mipi_dsi_device *dsi;
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	int ret;
>  
>  	/* wait for header/payload credits to be released */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		wait_for_header_credits(dev_priv, dsi_trans);
>  		wait_for_payload_credits(dev_priv, dsi_trans);
>  	}
>  
>  	/* send nop DCS command */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi = intel_dsi->dsi_hosts[port]->device;
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi = intel_dsi->dsi_hosts[phy]->device;
>  		dsi->mode_flags |= MIPI_DSI_MODE_LPM;
>  		dsi->channel = 0;
>  		ret = mipi_dsi_dcs_nop(dsi);
> @@ -100,14 +100,14 @@ static void wait_for_cmds_dispatched_to_panel(struct intel_encoder *encoder)
>  	}
>  
>  	/* wait for header credits to be released */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		wait_for_header_credits(dev_priv, dsi_trans);
>  	}
>  
>  	/* wait for LP TX in progress bit to be cleared */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		if (wait_for_us(!(I915_READ(DSI_LP_MSG(dsi_trans)) &
>  				  LPTX_IN_PROGRESS), 20))
>  			DRM_ERROR("LPTX bit not cleared\n");
> @@ -119,7 +119,7 @@ static bool add_payld_to_queue(struct intel_dsi_host *host, const u8 *data,
>  {
>  	struct intel_dsi *intel_dsi = host->intel_dsi;
>  	struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
> -	enum transcoder dsi_trans = dsi_port_to_transcoder(host->port);
> +	enum transcoder dsi_trans = dsi_phy_to_transcoder(host->phy);
>  	int free_credits;
>  	int i, j;
>  
> @@ -146,7 +146,7 @@ static int dsi_send_pkt_hdr(struct intel_dsi_host *host,
>  {
>  	struct intel_dsi *intel_dsi = host->intel_dsi;
>  	struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
> -	enum transcoder dsi_trans = dsi_port_to_transcoder(host->port);
> +	enum transcoder dsi_trans = dsi_phy_to_transcoder(host->phy);
>  	u32 tmp;
>  	int free_credits;
>  
> @@ -305,7 +305,7 @@ static void gen11_dsi_program_esc_clk_div(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);
> -	enum port port;
> +	enum phy phy;
>  	u32 bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
>  	u32 afe_clk_khz; /* 8X Clock */
>  	u32 esc_clk_div_m;
> @@ -315,29 +315,29 @@ static void gen11_dsi_program_esc_clk_div(struct intel_encoder *encoder)
>  
>  	esc_clk_div_m = DIV_ROUND_UP(afe_clk_khz, DSI_MAX_ESC_CLK);
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		I915_WRITE(ICL_DSI_ESC_CLK_DIV(port),
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		I915_WRITE(ICL_DSI_ESC_CLK_DIV(phy),
>  			   esc_clk_div_m & ICL_ESC_CLK_DIV_MASK);
> -		POSTING_READ(ICL_DSI_ESC_CLK_DIV(port));
> +		POSTING_READ(ICL_DSI_ESC_CLK_DIV(phy));
>  	}
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		I915_WRITE(ICL_DPHY_ESC_CLK_DIV(port),
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		I915_WRITE(ICL_DPHY_ESC_CLK_DIV(phy),
>  			   esc_clk_div_m & ICL_ESC_CLK_DIV_MASK);
> -		POSTING_READ(ICL_DPHY_ESC_CLK_DIV(port));
> +		POSTING_READ(ICL_DPHY_ESC_CLK_DIV(phy));
>  	}
>  }
>  
>  static void get_dsi_io_power_domains(struct drm_i915_private *dev_priv,
>  				     struct intel_dsi *intel_dsi)
>  {
> -	enum port port;
> +	enum phy phy;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		WARN_ON(intel_dsi->io_wakeref[port]);
> -		intel_dsi->io_wakeref[port] =
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		WARN_ON(intel_dsi->io_wakeref[phy]);
> +		intel_dsi->io_wakeref[phy] =
>  			intel_display_power_get(dev_priv,
> -						port == PORT_A ?
> +						phy == PHY_A ?
>  						POWER_DOMAIN_PORT_DDI_A_IO :
>  						POWER_DOMAIN_PORT_DDI_B_IO);
>  	}
> @@ -347,13 +347,13 @@ static void gen11_dsi_enable_io_power(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);
> -	enum port port;
> +	enum phy phy;
>  	u32 tmp;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		tmp = I915_READ(ICL_DSI_IO_MODECTL(port));
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		tmp = I915_READ(ICL_DSI_IO_MODECTL(phy));
>  		tmp |= COMBO_PHY_MODE_DSI;
> -		I915_WRITE(ICL_DSI_IO_MODECTL(port), tmp);
> +		I915_WRITE(ICL_DSI_IO_MODECTL(phy), tmp);
>  	}
>  
>  	get_dsi_io_power_domains(dev_priv, intel_dsi);
> @@ -476,17 +476,24 @@ static void gen11_dsi_enable_ddi_buffer(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);
>  	u32 tmp;
> -	enum port port;
> +	enum phy phy;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		tmp = I915_READ(DDI_BUF_CTL(port));
> +	/*
> +	 * Take note: although we usually use 'port' to refer to the DDI on
> +	 * platforms where the DDI is distinct from the PHY, it's still safe to
> +	 * use the phy index here.  The only platform that has port != phy
> +	 * situations is EHL and DSI on PHY-A there always uses DDI-A, never
> +	 * DDI-D.
> +	 */
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		tmp = I915_READ(DDI_BUF_CTL(phy));
>  		tmp |= DDI_BUF_CTL_ENABLE;
> -		I915_WRITE(DDI_BUF_CTL(port), tmp);
> +		I915_WRITE(DDI_BUF_CTL(phy), tmp);
>  
> -		if (wait_for_us(!(I915_READ(DDI_BUF_CTL(port)) &
> +		if (wait_for_us(!(I915_READ(DDI_BUF_CTL(phy)) &
>  				  DDI_BUF_IS_IDLE),
>  				  500))
> -			DRM_ERROR("DDI port:%c buffer idle\n", port_name(port));
> +			DRM_ERROR("DDI port:%c buffer idle\n", phy_name(phy));
>  	}
>  }
>  
> @@ -495,32 +502,31 @@ static void gen11_dsi_setup_dphy_timings(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);
>  	u32 tmp;
> -	enum port port;
>  	enum phy phy;
>  
>  	/* Program T-INIT master registers */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		tmp = I915_READ(ICL_DSI_T_INIT_MASTER(port));
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		tmp = I915_READ(ICL_DSI_T_INIT_MASTER(phy));
>  		tmp &= ~MASTER_INIT_TIMER_MASK;
>  		tmp |= intel_dsi->init_count;
> -		I915_WRITE(ICL_DSI_T_INIT_MASTER(port), tmp);
> +		I915_WRITE(ICL_DSI_T_INIT_MASTER(phy), tmp);
>  	}
>  
>  	/* Program DPHY clock lanes timings */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		I915_WRITE(DPHY_CLK_TIMING_PARAM(port), intel_dsi->dphy_reg);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		I915_WRITE(DPHY_CLK_TIMING_PARAM(phy), intel_dsi->dphy_reg);
>  
>  		/* shadow register inside display core */
> -		I915_WRITE(DSI_CLK_TIMING_PARAM(port), intel_dsi->dphy_reg);
> +		I915_WRITE(DSI_CLK_TIMING_PARAM(phy), intel_dsi->dphy_reg);
>  	}
>  
>  	/* Program DPHY data lanes timings */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		I915_WRITE(DPHY_DATA_TIMING_PARAM(port),
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		I915_WRITE(DPHY_DATA_TIMING_PARAM(phy),
>  			   intel_dsi->dphy_data_lane_reg);
>  
>  		/* shadow register inside display core */
> -		I915_WRITE(DSI_DATA_TIMING_PARAM(port),
> +		I915_WRITE(DSI_DATA_TIMING_PARAM(phy),
>  			   intel_dsi->dphy_data_lane_reg);
>  	}
>  
> @@ -532,17 +538,17 @@ static void gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder)
>  	 */
>  	if (IS_GEN(dev_priv, 11)) {
>  		if (intel_dsi_bitrate(intel_dsi) <= 800000) {
> -			for_each_dsi_port(port, intel_dsi->ports) {
> -				tmp = I915_READ(DPHY_TA_TIMING_PARAM(port));
> +			for_each_dsi_phy(phy, intel_dsi->phys) {
> +				tmp = I915_READ(DPHY_TA_TIMING_PARAM(phy));
>  				tmp &= ~TA_SURE_MASK;
>  				tmp |= TA_SURE_OVERRIDE | TA_SURE(0);
> -				I915_WRITE(DPHY_TA_TIMING_PARAM(port), tmp);
> +				I915_WRITE(DPHY_TA_TIMING_PARAM(phy), tmp);
>  
>  				/* shadow register inside display core */
> -				tmp = I915_READ(DSI_TA_TIMING_PARAM(port));
> +				tmp = I915_READ(DSI_TA_TIMING_PARAM(phy));
>  				tmp &= ~TA_SURE_MASK;
>  				tmp |= TA_SURE_OVERRIDE | TA_SURE(0);
> -				I915_WRITE(DSI_TA_TIMING_PARAM(port), tmp);
> +				I915_WRITE(DSI_TA_TIMING_PARAM(phy), tmp);
>  			}
>  		}
>  	}
> @@ -628,11 +634,11 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
>  	struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
>  	enum pipe pipe = intel_crtc->pipe;
>  	u32 tmp;
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		tmp = I915_READ(DSI_TRANS_FUNC_CONF(dsi_trans));
>  
>  		if (intel_dsi->eotp_pkt)
> @@ -711,8 +717,8 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
>  
>  	/* enable port sync mode if dual link */
>  	if (intel_dsi->dual_link) {
> -		for_each_dsi_port(port, intel_dsi->ports) {
> -			dsi_trans = dsi_port_to_transcoder(port);
> +		for_each_dsi_phy(phy, intel_dsi->phys) {
> +			dsi_trans = dsi_phy_to_transcoder(phy);
>  			tmp = I915_READ(TRANS_DDI_FUNC_CTL2(dsi_trans));
>  			tmp |= PORT_SYNC_MODE_ENABLE;
>  			I915_WRITE(TRANS_DDI_FUNC_CTL2(dsi_trans), tmp);
> @@ -722,8 +728,8 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
>  		configure_dual_link_mode(encoder, pipe_config);
>  	}
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  
>  		/* select data lane width */
>  		tmp = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans));
> @@ -753,8 +759,8 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
>  	}
>  
>  	/* wait for link ready */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		if (wait_for_us((I915_READ(DSI_TRANS_FUNC_CONF(dsi_trans)) &
>  				LINK_READY), 2500))
>  			DRM_ERROR("DSI link not ready\n");
> @@ -769,7 +775,7 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
>  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>  	const struct drm_display_mode *adjusted_mode =
>  					&pipe_config->base.adjusted_mode;
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	/* horizontal timings */
>  	u16 htotal, hactive, hsync_start, hsync_end, hsync_size;
> @@ -806,8 +812,8 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
>  		DRM_ERROR("hactive pixels are not multiple of 4\n");
>  
>  	/* program TRANS_HTOTAL register */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		I915_WRITE(HTOTAL(dsi_trans),
>  			   (hactive - 1) | ((htotal - 1) << 16));
>  	}
> @@ -829,16 +835,16 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
>  			hsync_end /= 2;
>  		}
>  
> -		for_each_dsi_port(port, intel_dsi->ports) {
> -			dsi_trans = dsi_port_to_transcoder(port);
> +		for_each_dsi_phy(phy, intel_dsi->phys) {
> +			dsi_trans = dsi_phy_to_transcoder(phy);
>  			I915_WRITE(HSYNC(dsi_trans),
>  				   (hsync_start - 1) | ((hsync_end - 1) << 16));
>  		}
>  	}
>  
>  	/* program TRANS_VTOTAL register */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		/*
>  		 * FIXME: Programing this by assuming progressive mode, since
>  		 * non-interlaced info from VBT is not saved inside
> @@ -856,8 +862,8 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
>  		DRM_ERROR("vsync_start less than vactive\n");
>  
>  	/* program TRANS_VSYNC register */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		I915_WRITE(VSYNC(dsi_trans),
>  			   (vsync_start - 1) | ((vsync_end - 1) << 16));
>  	}
> @@ -868,15 +874,15 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
>  	 * info available as described above.
>  	 * program TRANS_VSYNCSHIFT register
>  	 */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		I915_WRITE(VSYNCSHIFT(dsi_trans), vsync_shift);
>  	}
>  
>  	/* program TRANS_VBLANK register, should be same as vtotal programmed */
>  	if (INTEL_GEN(dev_priv) >= 12) {
> -		for_each_dsi_port(port, intel_dsi->ports) {
> -			dsi_trans = dsi_port_to_transcoder(port);
> +		for_each_dsi_phy(phy, intel_dsi->phys) {
> +			dsi_trans = dsi_phy_to_transcoder(phy);
>  			I915_WRITE(VBLANK(dsi_trans),
>  				   (vactive - 1) | ((vtotal - 1) << 16));
>  		}
> @@ -887,12 +893,12 @@ static void gen11_dsi_enable_transcoder(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);
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	u32 tmp;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		tmp = I915_READ(PIPECONF(dsi_trans));
>  		tmp |= PIPECONF_ENABLE;
>  		I915_WRITE(PIPECONF(dsi_trans), tmp);
> @@ -908,7 +914,7 @@ static void gen11_dsi_setup_timeouts(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);
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	u32 tmp, hs_tx_timeout, lp_rx_timeout, ta_timeout, divisor, mul;
>  
> @@ -926,8 +932,8 @@ static void gen11_dsi_setup_timeouts(struct intel_encoder *encoder)
>  	lp_rx_timeout = DIV_ROUND_UP(intel_dsi->lp_rx_timeout * mul, divisor);
>  	ta_timeout = DIV_ROUND_UP(intel_dsi->turn_arnd_val * mul, divisor);
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  
>  		/* program hst_tx_timeout */
>  		tmp = I915_READ(DSI_HSTX_TO(dsi_trans));
> @@ -990,14 +996,14 @@ static void gen11_dsi_powerup_panel(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);
>  	struct mipi_dsi_device *dsi;
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	u32 tmp;
>  	int ret;
>  
>  	/* set maximum return packet size */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  
>  		/*
>  		 * FIXME: This uses the number of DW's currently in the payload
> @@ -1007,7 +1013,7 @@ static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
>  		tmp &= NUMBER_RX_PLOAD_DW_MASK;
>  		/* multiply "Number Rx Payload DW" by 4 to get max value */
>  		tmp = tmp * 4;
> -		dsi = intel_dsi->dsi_hosts[port]->device;
> +		dsi = intel_dsi->dsi_hosts[phy]->device;
>  		ret = mipi_dsi_set_maximum_return_packet_size(dsi, tmp);
>  		if (ret < 0)
>  			DRM_ERROR("error setting max return pkt size%d\n", tmp);
> @@ -1065,12 +1071,12 @@ static void gen11_dsi_disable_transcoder(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);
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	u32 tmp;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  
>  		/* disable transcoder */
>  		tmp = I915_READ(PIPECONF(dsi_trans));
> @@ -1100,13 +1106,13 @@ static void gen11_dsi_deconfigure_trancoder(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);
> -	enum port port;
> +	enum phy phy;
>  	enum transcoder dsi_trans;
>  	u32 tmp;
>  
>  	/* put dsi link in ULPS */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		tmp = I915_READ(DSI_LP_MSG(dsi_trans));
>  		tmp |= LINK_ENTER_ULPS;
>  		tmp &= ~LINK_ULPS_TYPE_LP11;
> @@ -1119,8 +1125,8 @@ static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder)
>  	}
>  
>  	/* disable ddi function */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		tmp = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans));
>  		tmp &= ~TRANS_DDI_FUNC_ENABLE;
>  		I915_WRITE(TRANS_DDI_FUNC_CTL(dsi_trans), tmp);
> @@ -1128,8 +1134,8 @@ static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder)
>  
>  	/* disable port sync mode if dual link */
>  	if (intel_dsi->dual_link) {
> -		for_each_dsi_port(port, intel_dsi->ports) {
> -			dsi_trans = dsi_port_to_transcoder(port);
> +		for_each_dsi_phy(phy, intel_dsi->phys) {
> +			dsi_trans = dsi_phy_to_transcoder(phy);
>  			tmp = I915_READ(TRANS_DDI_FUNC_CTL2(dsi_trans));
>  			tmp &= ~PORT_SYNC_MODE_ENABLE;
>  			I915_WRITE(TRANS_DDI_FUNC_CTL2(dsi_trans), tmp);
> @@ -1142,19 +1148,19 @@ static void gen11_dsi_disable_port(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);
>  	u32 tmp;
> -	enum port port;
> +	enum phy phy;
>  
>  	gen11_dsi_ungate_clocks(encoder);
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		tmp = I915_READ(DDI_BUF_CTL(port));
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		tmp = I915_READ(DDI_BUF_CTL(phy));
>  		tmp &= ~DDI_BUF_CTL_ENABLE;
> -		I915_WRITE(DDI_BUF_CTL(port), tmp);
> +		I915_WRITE(DDI_BUF_CTL(phy), tmp);
>  
> -		if (wait_for_us((I915_READ(DDI_BUF_CTL(port)) &
> +		if (wait_for_us((I915_READ(DDI_BUF_CTL(phy)) &
>  				 DDI_BUF_IS_IDLE),
>  				 8))
>  			DRM_ERROR("DDI port:%c buffer not idle\n",
> -				  port_name(port));
> +				  phy_name(phy));
>  	}
>  	gen11_dsi_gate_clocks(encoder);
>  }
> @@ -1163,25 +1169,25 @@ static void gen11_dsi_disable_io_power(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);
> -	enum port port;
> +	enum phy phy;
>  	u32 tmp;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
>  		intel_wakeref_t wakeref;
>  
> -		wakeref = fetch_and_zero(&intel_dsi->io_wakeref[port]);
> +		wakeref = fetch_and_zero(&intel_dsi->io_wakeref[phy]);
>  		intel_display_power_put(dev_priv,
> -					port == PORT_A ?
> +					phy == PHY_A ?
>  					POWER_DOMAIN_PORT_DDI_A_IO :
>  					POWER_DOMAIN_PORT_DDI_B_IO,
>  					wakeref);
>  	}
>  
>  	/* set mode to DDI */
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		tmp = I915_READ(ICL_DSI_IO_MODECTL(port));
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		tmp = I915_READ(ICL_DSI_IO_MODECTL(phy));
>  		tmp &= ~COMBO_PHY_MODE_DSI;
> -		I915_WRITE(ICL_DSI_IO_MODECTL(port), tmp);
> +		I915_WRITE(ICL_DSI_IO_MODECTL(phy), tmp);
>  	}
>  }
>  
> @@ -1278,7 +1284,7 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder,
>  	adjusted_mode->flags = 0;
>  
>  	/* Dual link goes to trancoder DSI'0' */
> -	if (intel_dsi->ports == BIT(PORT_B))
> +	if (intel_dsi->phys == BIT(PHY_B))
>  		pipe_config->cpu_transcoder = TRANSCODER_DSI_1;
>  	else
>  		pipe_config->cpu_transcoder = TRANSCODER_DSI_0;
> @@ -1303,7 +1309,7 @@ static bool gen11_dsi_get_hw_state(struct intel_encoder *encoder,
>  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>  	enum transcoder dsi_trans;
>  	intel_wakeref_t wakeref;
> -	enum port port;
> +	enum phy phy;
>  	bool ret = false;
>  	u32 tmp;
>  
> @@ -1312,8 +1318,8 @@ static bool gen11_dsi_get_hw_state(struct intel_encoder *encoder,
>  	if (!wakeref)
>  		return false;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> -		dsi_trans = dsi_port_to_transcoder(port);
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
> +		dsi_trans = dsi_phy_to_transcoder(phy);
>  		tmp = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans));
>  		switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
>  		case TRANS_DDI_EDP_INPUT_A_ON:
> @@ -1552,6 +1558,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
>  	struct drm_connector *connector;
>  	struct drm_display_mode *fixed_mode;
>  	enum port port;
> +	enum phy phy;
>  
>  	if (!intel_bios_is_dsi_present(dev_priv, &port))
>  		return;
> @@ -1613,21 +1620,22 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
>  	intel_panel_setup_backlight(connector, INVALID_PIPE);
>  
>  	if (dev_priv->vbt.dsi.config->dual_link)
> -		intel_dsi->ports = BIT(PORT_A) | BIT(PORT_B);
> +		intel_dsi->phys = BIT(PHY_A) | BIT(PHY_B);
>  	else
> -		intel_dsi->ports = BIT(port);
> +		intel_dsi->phys = BIT(port);  /* since port==phy */
>  
>  	intel_dsi->dcs_backlight_ports = dev_priv->vbt.dsi.bl_ports;
>  	intel_dsi->dcs_cabc_ports = dev_priv->vbt.dsi.cabc_ports;
>  
> -	for_each_dsi_port(port, intel_dsi->ports) {
> +	for_each_dsi_phy(phy, intel_dsi->phys) {
>  		struct intel_dsi_host *host;
>  
> -		host = intel_dsi_host_init(intel_dsi, &gen11_dsi_host_ops, port);
> +		host = intel_dsi_host_init(intel_dsi, &gen11_dsi_host_ops,
> +					   (enum port)phy);
>  		if (!host)
>  			goto err;
>  
> -		intel_dsi->dsi_hosts[port] = host;
> +		intel_dsi->dsi_hosts[phy] = host;
>  	}
>  
>  	if (!intel_dsi_vbt_init(intel_dsi, MIPI_DSI_GENERIC_PANEL_ID)) {
> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.h b/drivers/gpu/drm/i915/display/intel_dsi.h
> index b15be5814599..5d0610fb85a3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsi.h
> +++ b/drivers/gpu/drm/i915/display/intel_dsi.h
> @@ -125,7 +125,10 @@ struct intel_dsi {
>  struct intel_dsi_host {
>  	struct mipi_dsi_host base;
>  	struct intel_dsi *intel_dsi;
> -	enum port port;
> +	union {
> +		enum port port;		/* VLV DSI */
> +		enum phy phy;		/* ICL DSI */
> +	};
>  
>  	/* our little hack */
>  	struct mipi_dsi_device *device;

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list