[Freedreno] [PATCH v3] drm/msm/dsi: Document DSC related pclk_rate and hdisplay calculations

Abhinav Kumar quic_abhinavk at quicinc.com
Wed Feb 7 18:01:20 UTC 2024



On 12/2/2023 3:59 PM, Dmitry Baryshkov wrote:
> Provide actual documentation for the pclk and hdisplay calculations in
> the case of DSC compression being used.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> ---
> 
> Changes since v2:
> - Followed suggestion by Abhinav and Marijn to improve documentatry
>    comments.
> 
> Changes since v1:
> - Converted dsi_adjust_pclk_for_compression() into kerneldoc (Marijn)
> - Added a pointer from dsi_timing_setup() docs to
>    dsi_adjust_pclk_for_compression() (Marijn)
> - Fixed two typo (Marijn)
> 
> ---
>   drivers/gpu/drm/msm/dsi/dsi_host.c | 33 ++++++++++++++++++++++++++++--
>   1 file changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
> index deeecdfd6c4e..d60ad796527c 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_host.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
> @@ -529,6 +529,25 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)
>   	clk_disable_unprepare(msm_host->byte_clk);
>   }
>   
> +/**
> + * dsi_adjust_pclk_for_compression() - Adjust the pclk rate for compression case
> + * @mode: The selected mode for the DSI output
> + * @dsc: DRM DSC configuration for this DSI output
> + *
> + * Adjust the pclk rate by calculating a new hdisplay proportional to
> + * the compression ratio such that:
> + *     new_hdisplay = old_hdisplay * compressed_bpp / uncompressed_bpp
> + *
> + * Porches do not need to be adjusted:
> + * - For VIDEO mode they are not compressed by DSC and are passed as is.
> + * - For CMD mode there are no actual porches. Instead these fields
> + *   currently represent the overhead to the image data transfer. As such, they
> + *   are calculated for the final mode parameters (after the compression) and
> + *   are not to be adjusted too.
> + *
> + *  FIXME: Reconsider this if/when CMD mode handling is rewritten to use
> + *  refresh rate and data overhead as a starting point of the calculations.
> + */

I think instead of saying refresh rate, we should say "transfer time".

refresh rate could be confused with drm_mode_vrefresh(). But technically 
we could still have the same refresh rate but finish the transfer faster 
by bumping the pixel clock of DSI but can still be limited by the 
panel's refresh rate.

But rest LGTM.

>   static unsigned long dsi_adjust_pclk_for_compression(const struct drm_display_mode *mode,
>   		const struct drm_dsc_config *dsc)
>   {
> @@ -951,8 +970,18 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
>   		if (ret)
>   			return;
>   
> -		/* Divide the display by 3 but keep back/font porch and
> -		 * pulse width same
> +		/*
> +		 * DPU sends 3 bytes per pclk cycle to DSI. If widebus is
> +		 * enabled, bus width is extended to 6 bytes.
> +		 *
> +		 * Calculate the number of pclks needed to transmit one line of
> +		 * the compressed data.
> +
> +		 * The back/font porch and pulse width are kept intact. For
> +		 * VIDEO mode they represent timing parameters rather than
> +		 * actual data transfer, see the documentation for
> +		 * dsi_adjust_pclk_for_compression(). For CMD mode they are
> +		 * unused anyway.
>   		 */
>   		h_total -= hdisplay;
>   		if (wide_bus_enabled && !(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO))


More information about the Freedreno mailing list