From: Jani Nikula <jani.nikula@linux.intel.com>
To: Uma Shankar <uma.shankar@intel.com>, intel-gfx@lists.freedesktop.org
Cc: shobhit.kumar@intel.com
Subject: Re: [BXT MIPI PATCH v2 07/13] drm/i915/bxt: Program Tx Rx and Dphy clocks
Date: Mon, 17 Aug 2015 14:51:42 +0300 [thread overview]
Message-ID: <87pp2mnne9.fsf@intel.com> (raw)
In-Reply-To: <1437899840-32153-8-git-send-email-uma.shankar@intel.com>
On Sun, 26 Jul 2015, Uma Shankar <uma.shankar@intel.com> wrote:
> From: Shashank Sharma <shashank.sharma@intel.com>
>
> BXT DSI clocks are different than previous platforms. So adding a
> new function to program following clocks and dividers:
> 1. Program variable divider to generate input to Tx clock divider
> (Output value must be < 39.5Mhz)
> 2. Select divide by 2 option to get < 20Mhz for Tx clock
> 3. Program 8by3 divider to generate Rx clock
>
> v2: Fixed Jani's review comments. Adjusted the Macro defintion as
> per convention. Simplified the logic for bit definitions for
> MIPI PORT A and PORT C in same registers.
>
> Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
> Signed-off-by: Uma Shankar <uma.shankar@intel.com>
> ---
> drivers/gpu/drm/i915/i915_reg.h | 40 +++++++++++++++++++++++++++++++++
> drivers/gpu/drm/i915/intel_dsi_pll.c | 41 ++++++++++++++++++++++++++++++++++
> 2 files changed, 81 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 7559062..310afd4 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -7445,6 +7445,46 @@ enum skl_disp_power_wells {
>
> #define _MIPI_PORT(port, a, c) _PORT3(port, a, 0, c) /* ports A and C only */
>
> +/* BXT MIPI clock controls */
> +#define BXT_MAX_VAR_OUTPUT_KHZ 39500
> +
> +#define BXT_MIPI_CLOCK_CTL 0x46090
> +#define BXT_MIPI_DIV_SHIFT 16
> +/* Var clock divider to generate TX source. Result must be < 39.5 M */
> +#define BXT_MIPI1_ESCLK_VAR_DIV_MASK (0x3F << 26)
> +#define BXT_MIPI2_ESCLK_VAR_DIV_MASK (0x3F << 10)
> +#define BXT_MIPI_ESCLK_VAR_DIV_MASK(port) \
> + (0x3F << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 10))
> +#define BXT_MIPI_ESCLK_VAR_DIV(port, val) \
> + (val << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 10))
> +/* TX control divider to select actual TX clock output from (8x/var) */
> +#define BXT_MIPI1_TX_ESCLK_FIXDIV_MASK (3 << 21)
> +#define BXT_MIPI2_TX_ESCLK_FIXDIV_MASK (3 << 5)
> +#define BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port) \
> + (3 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 5))
> +#define BXT_MIPI_TX_ESCLK_8XDIV_BY2(port) \
> + (0x0 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 5))
> +#define BXT_MIPI_TX_ESCLK_8XDIV_BY4(port) \
> + (0x1 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 5))
> +#define BXT_MIPI_TX_ESCLK_8XDIV_BY8(port) \
> + (0x2 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 5))
> +/* RX control divider to select actual RX clock output from 8x*/
> +#define BXT_MIPI1_RX_ESCLK_FIXDIV_MASK (3 << 19)
> +#define BXT_MIPI2_RX_ESCLK_FIXDIV_MASK (3 << 3)
> +#define BXT_MIPI_RX_ESCLK_FIXDIV_MASK(port) \
> + (3 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 3))
> +#define BXT_MIPI_RX_ESCLK_8X_BY2(port) \
> + (1 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 3))
> +#define BXT_MIPI_RX_ESCLK_8X_BY3(port) \
> + (2 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 3))
> +#define BXT_MIPI_RX_ESCLK_8X_BY4(port) \
> + (3 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT + 3))
> +/* BXT: Always prog DPHY dividers to 00 */
> +#define BXT_MIPI_1_DPHY_DIVIDER_MASK (3 << 16)
> +#define BXT_MIPI_2_DPHY_DIVIDER_MASK (3 << 0)
> +#define BXT_MIPI_DPHY_DIVIDER_MASK(port) \
> + (3 << ((port == PORT_A) * BXT_MIPI_DIV_SHIFT))
Meh. Please define the shifts and masks for all fields, and if you want
to have macros with port argument, please use _MIPI_PORT for defining
them.
For example,
#define _BXT_MIPI1_TX_ESCLK_FIXDIV_MASK (3 << 21)
#define _BXT_MIPI2_TX_ESCLK_FIXDIV_MASK (3 << 5)
#define BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port) \
_MIPI_PORT(port, _BXT_MIPI1_TX_ESCLK_FIXDIV_MASK, _BXT_MIPI2_TX_ESCLK_FIXDIV_MASK)
> +
> /* BXT MIPI mode configure */
> #define _BXT_MIPIA_TRANS_HACTIVE 0x6B0F8
> #define _BXT_MIPIC_TRANS_HACTIVE 0x6B8F8
> diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c
> index f335e6c..0b74399 100644
> --- a/drivers/gpu/drm/i915/intel_dsi_pll.c
> +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c
> @@ -384,6 +384,41 @@ u32 vlv_get_dsi_pclk(struct intel_encoder *encoder, int pipe_bpp)
> return pclk;
> }
>
> +/* Program BXT Mipi clocks and dividers */
> +static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port)
> +{
> + u32 tmp;
> + u32 divider;
> + u32 dsi_rate;
> + u32 pll_ratio;
> + struct drm_i915_private *dev_priv = dev->dev_private;
> +
> + /* Clear old configurations */
> + tmp = I915_READ(BXT_MIPI_CLOCK_CTL);
> + tmp &= ~(BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port));
> + tmp &= ~(BXT_MIPI_RX_ESCLK_FIXDIV_MASK(port));
> + tmp &= ~(BXT_MIPI_ESCLK_VAR_DIV_MASK(port));
> + tmp &= ~(BXT_MIPI_DPHY_DIVIDER_MASK(port));
> +
> + /* Get the current DSI rate(actual) */
> + pll_ratio = I915_READ(BXT_DSI_PLL_CTL) &
> + BXT_DSI_PLL_RATIO_MASK;
Please do not use registers as temp storage. Pass the information into
this function instead.
> + dsi_rate = (BXT_REF_CLOCK_KHZ * pll_ratio) / 2;
> +
> + /* Max possible output of clock is 39.5 MHz, program value -1 */
> + divider = (dsi_rate / BXT_MAX_VAR_OUTPUT_KHZ) - 1;
> + tmp |= BXT_MIPI_ESCLK_VAR_DIV(port, divider);
> +
> + /* Tx escape clock should be >=20MHz, so select divide by 2 */
Here the comment is useful as it contains rationale...
> + tmp |= BXT_MIPI_TX_ESCLK_8XDIV_BY2(port);
> +
> + /* Rx escape clock, select fix divide by 3 clock */
...however this just describes what should be obvious from the code.
> + tmp |= BXT_MIPI_RX_ESCLK_8X_BY3(port);
> +
> + /* Do the honors */
Useless comment.
> + I915_WRITE(BXT_MIPI_CLOCK_CTL, tmp);
> +}
> +
> static bool bxt_configure_dsi_pll(struct intel_encoder *encoder)
> {
> struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
> @@ -435,6 +470,8 @@ static bool bxt_configure_dsi_pll(struct intel_encoder *encoder)
> static void bxt_enable_dsi_pll(struct intel_encoder *encoder)
> {
> struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
> + struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
> + enum port port;
> u32 val;
>
> DRM_DEBUG_KMS("\n");
> @@ -453,6 +490,10 @@ static void bxt_enable_dsi_pll(struct intel_encoder *encoder)
> return;
> }
>
> + /* Now program TX, RX, Dphy clocks */
> + for_each_dsi_port(port, intel_dsi->ports)
> + bxt_dsi_program_clocks(encoder->base.dev, port);
> +
> /* Enable DSI PLL */
> val = I915_READ(BXT_DSI_PLL_ENABLE);
> val |= BXT_DSI_PLL_DO_ENABLE;
> --
> 1.7.9.5
>
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-08-17 11:48 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-26 8:37 [BXT MIPI PATCH v2 00/13] MIPI DSI Support for BXT Uma Shankar
2015-07-26 8:37 ` [BXT MIPI PATCH v2 01/13] drm/i915/bxt: Initialize MIPI " Uma Shankar
2015-07-26 8:37 ` [BXT MIPI PATCH v2 02/13] drm/i915/bxt: Enable BXT DSI PLL Uma Shankar
2015-08-17 10:29 ` Jani Nikula
2015-07-26 8:37 ` [BXT MIPI PATCH v2 03/13] drm/i915/bxt: Disable DSI PLL for BXT Uma Shankar
2015-07-27 9:28 ` Daniel Vetter
2015-07-27 10:38 ` Shankar, Uma
2015-07-26 8:37 ` [BXT MIPI PATCH v2 04/13] drm/i915/bxt: DSI prepare changes " Uma Shankar
2015-08-17 10:33 ` Jani Nikula
2015-07-26 8:37 ` [BXT MIPI PATCH v2 05/13] drm/i915/bxt: DSI encoder support in CRTC modeset Uma Shankar
2015-08-17 11:26 ` Jani Nikula
2015-07-26 8:37 ` [BXT MIPI PATCH v2 06/13] drm/i915/bxt: DSI enable for BXT Uma Shankar
2015-08-17 11:33 ` Jani Nikula
2015-07-26 8:37 ` [BXT MIPI PATCH v2 07/13] drm/i915/bxt: Program Tx Rx and Dphy clocks Uma Shankar
2015-08-17 11:51 ` Jani Nikula [this message]
2015-07-26 8:37 ` [BXT MIPI PATCH v2 08/13] drm/i915/bxt: DSI disable and post-disable Uma Shankar
2015-07-26 8:37 ` [BXT MIPI PATCH v2 09/13] drm/i915/bxt: get_hw_state for BXT Uma Shankar
2015-07-26 8:37 ` [BXT MIPI PATCH v2 10/13] drm/i915/bxt: get DSI pixelclock Uma Shankar
2015-07-26 8:37 ` [BXT MIPI PATCH v2 11/13] drm/i915/bxt: Modify BXT BLC according to VBT changes Uma Shankar
2015-08-17 12:02 ` Jani Nikula
2015-07-26 8:37 ` [BXT MIPI PATCH v2 12/13] drm/i915/bxt: Remove DSP CLK_GATE programming for BXT Uma Shankar
2015-08-17 12:03 ` Jani Nikula
2015-07-26 8:37 ` [BXT MIPI PATCH v2 13/13] drm/i915: Added BXT DSI backlight support Uma Shankar
2015-08-17 12:06 ` Jani Nikula
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=87pp2mnne9.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=shobhit.kumar@intel.com \
--cc=uma.shankar@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.