[Intel-gfx] [PATCH] drm/i915: Try to re-use GOP / previous M-N-P settings for vlv DSI PLL
Ville Syrjälä
ville.syrjala at linux.intel.com
Thu Nov 7 11:24:32 UTC 2019
On Sun, Oct 20, 2019 at 08:21:32PM +0200, Hans de Goede wrote:
> Fastboot is not working on an Asus T100HA, it gives the following
> relevant messages / errors:
>
> dsi pll div 000201e6, ctrl 80080100
> fastset mismatch in dsi_pll.ctrl (expected 0x80100100, found 0x80080100)
> fastset mismatch in dsi_pll.div (expected 0x0002008e, found 0x000201e6)
>
> The problem seems to be that the GOP picks 5 for the P divisor, where as
> we end up picking 4.
>
> This commit fixes this by first checking of the currently configured
> DSI PLL settings match the desired pclk and if they do, stick with
> the currently configured PLL settings.
>
> Note that vlv_dsi_get_pclk() stores the read ctrl and div values inside
> config->dsi_pll, so they are set to the GOP / previous values after
> calling it.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> drivers/gpu/drm/i915/display/vlv_dsi_pll.c | 26 +++++++++++++++-------
> 1 file changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi_pll.c b/drivers/gpu/drm/i915/display/vlv_dsi_pll.c
> index 95f39cd0ce02..4a09edecd597 100644
> --- a/drivers/gpu/drm/i915/display/vlv_dsi_pll.c
> +++ b/drivers/gpu/drm/i915/display/vlv_dsi_pll.c
> @@ -119,15 +119,25 @@ int vlv_dsi_pll_compute(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);
> int ret;
> - u32 dsi_clk;
> -
> - dsi_clk = dsi_clk_from_pclk(intel_dsi->pclk, intel_dsi->pixel_format,
> - intel_dsi->lane_count);
> + u32 dsi_clk, current_pclk;
>
> - ret = dsi_calc_mnp(dev_priv, config, dsi_clk);
> - if (ret) {
> - DRM_DEBUG_KMS("dsi_calc_mnp failed\n");
> - return ret;
> + /*
> + * For exact matches, the GOP may pick another set of divisors
> + * then we do, if the GOP settings are an exact match keep them.
> + */
> + current_pclk = vlv_dsi_get_pclk(encoder, config);
One is not allowed to touch the hw in .compute_config().
The question is why does the GOP generate a different P divider?
Does it use a slightly different clock?
> + if (current_pclk == intel_dsi->pclk) {
> + config->dsi_pll.ctrl &= DSI_PLL_P1_POST_DIV_MASK;
> + } else {
> + dsi_clk = dsi_clk_from_pclk(intel_dsi->pclk,
> + intel_dsi->pixel_format,
> + intel_dsi->lane_count);
> +
> + ret = dsi_calc_mnp(dev_priv, config, dsi_clk);
> + if (ret) {
> + DRM_DEBUG_KMS("dsi_calc_mnp failed\n");
> + return ret;
> + }
> }
>
> if (intel_dsi->ports & (1 << PORT_A))
> --
> 2.23.0
--
Ville Syrjälä
Intel
More information about the Intel-gfx
mailing list