All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: Gaurav K Singh <gaurav.k.singh@intel.com>,
	intel-gfx <intel-gfx@lists.freedesktop.org>
Cc: Shobhit Kumar <shobhit.kumar@intel.com>
Subject: Re: [PATCH 10/10] drm/i915: Update the DSI enable path to	support dual link panel enabling
Date: Thu, 04 Dec 2014 13:49:16 +0200	[thread overview]
Message-ID: <87k327ljnn.fsf@intel.com> (raw)
In-Reply-To: <1417670936-31032-11-git-send-email-gaurav.k.singh@intel.com>

On Thu, 04 Dec 2014, Gaurav K Singh <gaurav.k.singh@intel.com> wrote:
> We need to program both port registers during dual link enable path.
>
> v2: Address review comments by Jani
>     - Used a for loop instead of do-while loop.
>
> v3: Used for_each_dsi_port macro instead of for loop
>
> Signed-off-by: Gaurav K Singh <gaurav.k.singh@intel.com>
> Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_dsi.c |  251 +++++++++++++++++++++-----------------
>  1 file changed, 136 insertions(+), 115 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
> index 5ae4015..ad82d0d 100644
> --- a/drivers/gpu/drm/i915/intel_dsi.c
> +++ b/drivers/gpu/drm/i915/intel_dsi.c
> @@ -156,8 +156,8 @@ static void intel_dsi_port_disable(struct intel_encoder *encoder)
>  static void intel_dsi_device_ready(struct intel_encoder *encoder)
>  {
>  	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
> -	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
> -	enum port port = intel_dsi_pipe_to_port(intel_crtc->pipe);
> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
> +	enum port port;
>  	u32 val;
>  
>  	DRM_DEBUG_KMS("\n");
> @@ -171,18 +171,21 @@ static void intel_dsi_device_ready(struct intel_encoder *encoder)
>  	/* bandgap reset is needed after everytime we do power gate */
>  	band_gap_reset(dev_priv);
>  
> -	I915_WRITE(MIPI_DEVICE_READY(port), ULPS_STATE_ENTER);
> -	usleep_range(2500, 3000);
> +	for_each_dsi_port(port, intel_dsi->ports) {
>  
> -	val = I915_READ(MIPI_PORT_CTRL(port));
> -	I915_WRITE(MIPI_PORT_CTRL(port), val | LP_OUTPUT_HOLD);
> -	usleep_range(1000, 1500);
> +		I915_WRITE(MIPI_DEVICE_READY(port), ULPS_STATE_ENTER);
> +		usleep_range(2500, 3000);
>  
> -	I915_WRITE(MIPI_DEVICE_READY(port), ULPS_STATE_EXIT);
> -	usleep_range(2500, 3000);
> +		val = I915_READ(MIPI_PORT_CTRL(port));
> +		I915_WRITE(MIPI_PORT_CTRL(port), val | LP_OUTPUT_HOLD);
> +		usleep_range(1000, 1500);
>  
> -	I915_WRITE(MIPI_DEVICE_READY(port), DEVICE_READY);
> -	usleep_range(2500, 3000);
> +		I915_WRITE(MIPI_DEVICE_READY(port), ULPS_STATE_EXIT);
> +		usleep_range(2500, 3000);
> +
> +		I915_WRITE(MIPI_DEVICE_READY(port), DEVICE_READY);
> +		usleep_range(2500, 3000);
> +	}
>  }
>  
>  static void intel_dsi_enable(struct intel_encoder *encoder)
> @@ -541,32 +544,43 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
>  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
>  	struct drm_display_mode *adjusted_mode =
>  		&intel_crtc->config.adjusted_mode;
> -	enum port port = intel_dsi_pipe_to_port(intel_crtc->pipe);
> +	enum port port;
>  	unsigned int bpp = intel_crtc->config.pipe_bpp;
>  	u32 val, tmp;
> +	u16 mode_hactive;
>  
>  	DRM_DEBUG_KMS("pipe %c\n", pipe_name(intel_crtc->pipe));
>  
> -	/* escape clock divider, 20MHz, shared for A and C. device ready must be
> -	 * off when doing this! txclkesc? */
> -	tmp = I915_READ(MIPI_CTRL(PORT_A));
> -	tmp &= ~ESCAPE_CLOCK_DIVIDER_MASK;
> -	I915_WRITE(MIPI_CTRL(PORT_A), tmp | ESCAPE_CLOCK_DIVIDER_1);
> -
> -	/* read request priority is per pipe */
> -	tmp = I915_READ(MIPI_CTRL(port));
> -	tmp &= ~READ_REQUEST_PRIORITY_MASK;
> -	I915_WRITE(MIPI_CTRL(port), tmp | READ_REQUEST_PRIORITY_HIGH);
> +	mode_hactive = adjusted_mode->hdisplay;

hactive vs. hdisplay is a bit confusing perhaps?

>  
> -	/* XXX: why here, why like this? handling in irq handler?! */
> -	I915_WRITE(MIPI_INTR_STAT(port), 0xffffffff);
> -	I915_WRITE(MIPI_INTR_EN(port), 0xffffffff);
> -
> -	I915_WRITE(MIPI_DPHY_PARAM(port), intel_dsi->dphy_reg);
> +	if (intel_dsi->dual_link) {
> +		mode_hactive /= 2;
> +		if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK)
> +			mode_hactive += intel_dsi->pixel_overlap;
> +	}
>  
> -	I915_WRITE(MIPI_DPI_RESOLUTION(port),
> -		   adjusted_mode->vdisplay << VERTICAL_ADDRESS_SHIFT |
> -		   adjusted_mode->hdisplay << HORIZONTAL_ADDRESS_SHIFT);
> +	for_each_dsi_port(port, intel_dsi->ports) {
> +		/* escape clock divider, 20MHz, shared for A and C.
> +		 * device ready must be off when doing this! txclkesc? */
> +		tmp = I915_READ(MIPI_CTRL(PORT_A));
> +		tmp &= ~ESCAPE_CLOCK_DIVIDER_MASK;
> +		I915_WRITE(MIPI_CTRL(PORT_A), tmp | ESCAPE_CLOCK_DIVIDER_1);

I think this part could be left outside of the loop, but no big deal
IMO.

> +
> +		/* read request priority is per pipe */
> +		tmp = I915_READ(MIPI_CTRL(port));
> +		tmp &= ~READ_REQUEST_PRIORITY_MASK;
> +		I915_WRITE(MIPI_CTRL(port), tmp | READ_REQUEST_PRIORITY_HIGH);
> +
> +		/* XXX: why here, why like this? handling in irq handler?! */
> +		I915_WRITE(MIPI_INTR_STAT(port), 0xffffffff);
> +		I915_WRITE(MIPI_INTR_EN(port), 0xffffffff);
> +
> +		I915_WRITE(MIPI_DPHY_PARAM(port), intel_dsi->dphy_reg);
> +
> +		I915_WRITE(MIPI_DPI_RESOLUTION(port),
> +			adjusted_mode->vdisplay << VERTICAL_ADDRESS_SHIFT |
> +			mode_hactive << HORIZONTAL_ADDRESS_SHIFT);
> +	}
>  
>  	set_dsi_timings(encoder, adjusted_mode);
>  
> @@ -580,95 +594,102 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
>  		/* XXX: cross-check bpp vs. pixel format? */
>  		val |= intel_dsi->pixel_format;
>  	}
> -	I915_WRITE(MIPI_DSI_FUNC_PRG(port), val);
>  
> -	/* timeouts for recovery. one frame IIUC. if counter expires, EOT and
> -	 * stop state. */
> -
> -	/*
> -	 * In burst mode, value greater than one DPI line Time in byte clock
> -	 * (txbyteclkhs) To timeout this timer 1+ of the above said value is
> -	 * recommended.
> -	 *
> -	 * In non-burst mode, Value greater than one DPI frame time in byte
> -	 * clock(txbyteclkhs) To timeout this timer 1+ of the above said value
> -	 * is recommended.
> -	 *
> -	 * In DBI only mode, value greater than one DBI frame time in byte
> -	 * clock(txbyteclkhs) To timeout this timer 1+ of the above said value
> -	 * is recommended.
> -	 */
> -
> -	if (is_vid_mode(intel_dsi) &&
> -	    intel_dsi->video_mode_format == VIDEO_MODE_BURST) {
> -		I915_WRITE(MIPI_HS_TX_TIMEOUT(port),
> -			   txbyteclkhs(adjusted_mode->htotal, bpp,
> -				       intel_dsi->lane_count,
> -				       intel_dsi->burst_mode_ratio) + 1);
> -	} else {
> -		I915_WRITE(MIPI_HS_TX_TIMEOUT(port),
> -			   txbyteclkhs(adjusted_mode->vtotal *
> -				       adjusted_mode->htotal,
> -				       bpp, intel_dsi->lane_count,
> -				       intel_dsi->burst_mode_ratio) + 1);
> -	}
> -	I915_WRITE(MIPI_LP_RX_TIMEOUT(port), intel_dsi->lp_rx_timeout);
> -	I915_WRITE(MIPI_TURN_AROUND_TIMEOUT(port), intel_dsi->turn_arnd_val);
> -	I915_WRITE(MIPI_DEVICE_RESET_TIMER(port), intel_dsi->rst_timer_val);
> -
> -	/* dphy stuff */
> -
> -	/* in terms of low power clock */
> -	I915_WRITE(MIPI_INIT_COUNT(port), txclkesc(intel_dsi->escape_clk_div, 100));
> -
> -	val = 0;
> +	tmp = 0;
>  	if (intel_dsi->eotp_pkt == 0)
> -		val |= EOT_DISABLE;
> -
> +		tmp |= EOT_DISABLE;
>  	if (intel_dsi->clock_stop)
> -		val |= CLOCKSTOP;
> -
> -	/* recovery disables */
> -	I915_WRITE(MIPI_EOT_DISABLE(port), val);
> -
> -	/* in terms of low power clock */
> -	I915_WRITE(MIPI_INIT_COUNT(port), intel_dsi->init_count);
> -
> -	/* in terms of txbyteclkhs. actual high to low switch +
> -	 * MIPI_STOP_STATE_STALL * MIPI_LP_BYTECLK.
> -	 *
> -	 * XXX: write MIPI_STOP_STATE_STALL?
> -	 */
> -	I915_WRITE(MIPI_HIGH_LOW_SWITCH_COUNT(port),
> -		   intel_dsi->hs_to_lp_count);
> +		tmp |= CLOCKSTOP;
>  
> -	/* XXX: low power clock equivalence in terms of byte clock. the number
> -	 * of byte clocks occupied in one low power clock. based on txbyteclkhs
> -	 * and txclkesc. txclkesc time / txbyteclk time * (105 +
> -	 * MIPI_STOP_STATE_STALL) / 105.???
> -	 */
> -	I915_WRITE(MIPI_LP_BYTECLK(port), intel_dsi->lp_byte_clk);
> -
> -	/* the bw essential for transmitting 16 long packets containing 252
> -	 * bytes meant for dcs write memory command is programmed in this
> -	 * register in terms of byte clocks. based on dsi transfer rate and the
> -	 * number of lanes configured the time taken to transmit 16 long packets
> -	 * in a dsi stream varies. */
> -	I915_WRITE(MIPI_DBI_BW_CTRL(port), intel_dsi->bw_timer);
> -
> -	I915_WRITE(MIPI_CLK_LANE_SWITCH_TIME_CNT(port),
> -		   intel_dsi->clk_lp_to_hs_count << LP_HS_SSW_CNT_SHIFT |
> -		   intel_dsi->clk_hs_to_lp_count << HS_LP_PWR_SW_CNT_SHIFT);
> -
> -	if (is_vid_mode(intel_dsi))
> -		/* Some panels might have resolution which is not a multiple of
> -		 * 64 like 1366 x 768. Enable RANDOM resolution support for such
> -		 * panels by default */
> -		I915_WRITE(MIPI_VIDEO_MODE_FORMAT(port),
> -			   intel_dsi->video_frmt_cfg_bits |
> -			   intel_dsi->video_mode_format |
> -			   IP_TG_CONFIG |
> -			   RANDOM_DPI_DISPLAY_RESOLUTION);
> +	for_each_dsi_port(port, intel_dsi->ports) {
> +		I915_WRITE(MIPI_DSI_FUNC_PRG(port), val);
> +
> +		/* timeouts for recovery. one frame IIUC. if counter expires,
> +		 * EOT and stop state. */
> +
> +		/*
> +		 * In burst mode, value greater than one DPI line Time in byte
> +		 * clock (txbyteclkhs) To timeout this timer 1+ of the above
> +		 * said value is recommended.
> +		 *
> +		 * In non-burst mode, Value greater than one DPI frame time in
> +		 * byte clock(txbyteclkhs) To timeout this timer 1+ of the above
> +		 * said value is recommended.
> +		 *
> +		 * In DBI only mode, value greater than one DBI frame time in
> +		 * byte clock(txbyteclkhs) To timeout this timer 1+ of the above
> +		 * said value is recommended.
> +		 */
> +
> +		if (is_vid_mode(intel_dsi) &&
> +			intel_dsi->video_mode_format == VIDEO_MODE_BURST) {
> +			I915_WRITE(MIPI_HS_TX_TIMEOUT(port),
> +				txbyteclkhs(adjusted_mode->htotal, bpp,
> +					intel_dsi->lane_count,
> +					intel_dsi->burst_mode_ratio) + 1);
> +		} else {
> +			I915_WRITE(MIPI_HS_TX_TIMEOUT(port),
> +				txbyteclkhs(adjusted_mode->vtotal *
> +					adjusted_mode->htotal,
> +					bpp, intel_dsi->lane_count,
> +					intel_dsi->burst_mode_ratio) + 1);
> +		}
> +		I915_WRITE(MIPI_LP_RX_TIMEOUT(port), intel_dsi->lp_rx_timeout);
> +		I915_WRITE(MIPI_TURN_AROUND_TIMEOUT(port),
> +						intel_dsi->turn_arnd_val);
> +		I915_WRITE(MIPI_DEVICE_RESET_TIMER(port),
> +						intel_dsi->rst_timer_val);
> +
> +		/* dphy stuff */
> +
> +		/* in terms of low power clock */
> +		I915_WRITE(MIPI_INIT_COUNT(port),
> +				txclkesc(intel_dsi->escape_clk_div, 100));
> +
> +
> +		/* recovery disables */
> +		I915_WRITE(MIPI_EOT_DISABLE(port), val);
> +
> +		/* in terms of low power clock */
> +		I915_WRITE(MIPI_INIT_COUNT(port), intel_dsi->init_count);

Side note not related to this patch: MIPI_INIT_COUNT gets written twice,
probably not intentionally. Follow-up fix for the future.


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


> +
> +		/* in terms of txbyteclkhs. actual high to low switch +
> +		 * MIPI_STOP_STATE_STALL * MIPI_LP_BYTECLK.
> +		 *
> +		 * XXX: write MIPI_STOP_STATE_STALL?
> +		 */
> +		I915_WRITE(MIPI_HIGH_LOW_SWITCH_COUNT(port),
> +						intel_dsi->hs_to_lp_count);
> +
> +		/* XXX: low power clock equivalence in terms of byte clock.
> +		 * the number of byte clocks occupied in one low power clock.
> +		 * based on txbyteclkhs and txclkesc.
> +		 * txclkesc time / txbyteclk time * (105 + MIPI_STOP_STATE_STALL
> +		 * ) / 105.???
> +		 */
> +		I915_WRITE(MIPI_LP_BYTECLK(port), intel_dsi->lp_byte_clk);
> +
> +		/* the bw essential for transmitting 16 long packets containing
> +		 * 252 bytes meant for dcs write memory command is programmed in
> +		 * this register in terms of byte clocks. based on dsi transfer
> +		 * rate and the number of lanes configured the time taken to
> +		 * transmit 16 long packets in a dsi stream varies. */
> +		I915_WRITE(MIPI_DBI_BW_CTRL(port), intel_dsi->bw_timer);
> +
> +		I915_WRITE(MIPI_CLK_LANE_SWITCH_TIME_CNT(port),
> +		intel_dsi->clk_lp_to_hs_count << LP_HS_SSW_CNT_SHIFT |
> +		intel_dsi->clk_hs_to_lp_count << HS_LP_PWR_SW_CNT_SHIFT);
> +
> +		if (is_vid_mode(intel_dsi))
> +			/* Some panels might have resolution which is not a
> +			 * multiple of 64 like 1366 x 768. Enable RANDOM
> +			 * resolution support for such panels by default */
> +			I915_WRITE(MIPI_VIDEO_MODE_FORMAT(port),
> +				intel_dsi->video_frmt_cfg_bits |
> +				intel_dsi->video_mode_format |
> +				IP_TG_CONFIG |
> +				RANDOM_DPI_DISPLAY_RESOLUTION);
> +	}
>  }
>  
>  static void intel_dsi_pre_pll_enable(struct intel_encoder *encoder)
> -- 
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2014-12-04 11:49 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-04  5:28 [PATCH 00/10] BYT DSI Dual Link Support Gaurav K Singh
2014-12-04  5:28 ` [PATCH 01/10] drm/i915: New functions added for enabling & disabling MIPI Port Ctrl reg Gaurav K Singh
2014-12-04  9:13   ` Jani Nikula
2014-12-04  5:28 ` [PATCH 02/10] drm/i915: Added port as parameter to the functions which does read/write of DSI Controller Gaurav K Singh
2014-12-04  9:14   ` Jani Nikula
2014-12-04 11:22     ` Daniel Vetter
2014-12-05 12:50       ` Singh, Gaurav K
2014-12-05 14:38         ` Daniel Vetter
2014-12-05 20:35           ` Singh, Gaurav K
2014-12-04  5:28 ` [PATCH 03/10] drm/i915: Add support for port enable/disable for dual link configuration Gaurav K Singh
2014-12-04  9:17   ` Jani Nikula
2014-12-05  8:39     ` [PATCH v4 " Gaurav K Singh
2014-12-05 12:52       ` Jani Nikula
2014-12-04  5:28 ` [PATCH 04/10] drm/i915: Pixel Clock changes for DSI dual link Gaurav K Singh
2014-12-04  9:27   ` Jani Nikula
2014-12-05  8:43     ` [PATCH v3 " Gaurav K Singh
2014-12-05 16:33     ` [PATCH " Singh, Gaurav K
2014-12-05 16:54       ` Siluvery, Arun
2014-12-05 17:18         ` Singh, Gaurav K
2014-12-05 17:36         ` Jani Nikula
2014-12-05 17:48           ` Siluvery, Arun
2014-12-05 20:43             ` Singh, Gaurav K
2014-12-04  5:28 ` [PATCH 05/10] drm/i915: Dual link needs Shutdown and Turn on packet for both ports Gaurav K Singh
2014-12-04 10:41   ` Jani Nikula
2014-12-05 19:10     ` [PATCH 5/5] " Gaurav K Singh
2014-12-05 20:53       ` Daniel Vetter
2014-12-04  5:28 ` [PATCH 06/10] drm/i915: Enable DSI PLL for both DSI0 and DSI1 in case of dual link Gaurav K Singh
2014-12-04 11:17   ` Jani Nikula
2014-12-04  5:28 ` [PATCH 07/10] drm/i915: cck reg used for checking DSI Pll locked Gaurav K Singh
2014-12-04 11:22   ` Jani Nikula
2014-12-05  8:46     ` [PATCH v2 " Gaurav K Singh
2014-12-04  5:28 ` [PATCH 08/10] drm/i915: MIPI Timings related changes for dual link Gaurav K Singh
2014-12-04 11:24   ` Jani Nikula
2014-12-04  5:28 ` [PATCH 09/10] drm/i915: Update the DSI disable path to support dual link panel disabling Gaurav K Singh
2014-12-04 11:37   ` Jani Nikula
2014-12-05  8:52     ` [PATCH v4 " Gaurav K Singh
2014-12-04  5:28 ` [PATCH 10/10] drm/i915: Update the DSI enable path to support dual link panel enabling Gaurav K Singh
2014-12-04 11:49   ` Jani Nikula [this message]
2014-12-05  8:54     ` [PATCH v4 10/10] drm/i915: Update the DSI enable path to support dual Gaurav K Singh
2014-12-05 20:31       ` [PATCH " Gaurav K Singh
2014-12-05  4:04   ` [PATCH 10/10] drm/i915: Update the DSI enable path to support dual link panel enabling shuang.he

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k327ljnn.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=gaurav.k.singh@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=shobhit.kumar@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.