Thank you for your contribution! Sashiko AI review found 2 potential issue(s) 
to consider:
- [High] Dimensional unit mismatch in HW QoS calculations mixing 'bytes' and 
'buffer units' leads to FIFO overflow misconfiguration
- [High] Incorrect use of `vactive` instead of `hactive` for horizontal TX 
buffer read/write times calculation
--

--- Patch [7]: [PATCH v4 07/10] drm/mediatek: mtk_dsi: Add support for MT8196 
---
commit 53b751cd3a037b336029e926c7c021a5e451f750
Author: AngeloGioacchino Del Regno <[email protected]>

drm/mediatek: mtk_dsi: Add support for MT8196

Add support for the new DSI IP found in the Kompanio Ultra MT8196 SoC.
It initializes QoS parameters and makes use of a DSI SRAM reserved
buffer.

> diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c 
> b/drivers/gpu/drm/mediatek/mtk_dsi.c
> index 5f06749349289..93bc507d77e20 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c

[ ... ]

> @@ -776,6 +873,102 @@ static int mtk_dsi_set_dsc_params(struct mtk_dsi *dsi)
>       return drm_dsc_compute_rc_parameters(dsc);
>  }
>  
> +static void mtk_dsi_config_hw_buffers(struct mtk_dsi *dsi)
> +{

[ ... ]

> +     /* Read as: [Data rate (MHz)] * [Number of DSI lanes] / [8 buffer 
> blocks] */
> +     tmp = (u64)dsi->data_rate * dsi->lanes;
> +     data_rate_per_buf = div_u64(tmp, 8 * buffer_unit * HZ_PER_MHZ);
> +
> +     /*
> +      * Anti-latency buffer output threshold for absolute timer mode: this
> +      * parameter controls the maximum amount of output data that the FIFO
> +      * can hold before running out of buffer space.
> +      *
> +      * The data will therefore be sent either when the DSI IP0s internal
> +      * vblank vs bus QoS timer expires or when it reaches the amount of
> +      * buffers set in BUF_OUT_VALID_THRESHOLD (regardless of QoS) to avoid
> +      * partially, or entirely, losing frame(s).
> +      */
> +     out_valid_thresh = MTK_DSI_DEFAULT_QOS_VALID_FIFO_US * 
> data_rate_per_buf;
> +     out_valid_thresh = min(out_valid_thresh, MTK_DSI_MAX_FIFO_BYTES - 1);

[Severity: High]
Does this incorrectly cap a value in buffer blocks against a constant in bytes?

Since data_rate_per_buf is computed in buffer blocks per microsecond,
out_valid_thresh is calculated in buffer blocks. Capping it against 
MTK_DSI_MAX_FIFO_BYTES - 1 (1553) allows up to 1553 blocks. This cap
evaluates to 49,696 bytes, which defeats the safety limit for the
1554-byte physical FIFO limit.

> +     mtk_dsi_mask(dsi, reg_qos[DSI_QOS_BUF_CON1], BUF_OUT_VALID_THRESH, 
> out_valid_thresh);
> +
> +     /* Enable ULTRA signal trigger between SOF and VACT */
> +     mtk_dsi_mask(dsi, data->reg_adv[DSI_VDE], VDE_BLOCK_ULTRA, 0);
> +
> +     /* Calculate fill rate with line counter mode for DSI Video Mode */
> +     if (dsi->format == MIPI_DSI_FMT_RGB565)
> +             dsi_buf_bpp = 2;
> +     else
> +             dsi_buf_bpp = 3;
> +
> +     pclk_mhz = dsi->vm.pixelclock / HZ_PER_MHZ;
> +     fill_rate = div_u64((u64)pclk_mhz * data->pixels_per_iter * dsi_buf_bpp,
> +                         buffer_unit);
> +
> +     /* Calculate QoS Anti-Latency parameters */
> +     sodi_hi = MTK_DSI_MAX_FIFO_BYTES * num_hw_buffers;
> +     sodi_hi -= (fill_rate - data_rate_per_buf) * 12 / 10;

[Severity: High]
Does this mix incompatible units?

sodi_hi initializes as bytes (MTK_DSI_MAX_FIFO_BYTES * num_hw_buffers),
but then subtracts a value in buffer blocks per microsecond
((fill_rate - data_rate_per_buf) * 1.2). This mixes incompatible units
and may result in mathematically meaningless values being programmed
into the hardware.

> +     sodi_lo = MTK_DSI_DEFAULT_QOS_SODI_LO_OVERHEAD * data_rate_per_buf;
> +     preultra_hi = MTK_DSI_DEFAULT_QOS_PREULTRA_HI_US * data_rate_per_buf;
> +     preultra_lo = MTK_DSI_DEFAULT_QOS_PREULTRA_LO_US * data_rate_per_buf;
> +     ultra_hi = MTK_DSI_DEFAULT_QOS_ULTRA_HI_US * data_rate_per_buf;
> +     ultra_lo = MTK_DSI_DEFAULT_QOS_ULTRA_LO_US * data_rate_per_buf;
> +     urgent_hi = MTK_DSI_DEFAULT_QOS_URGENT_HI_US * data_rate_per_buf;
> +     urgent_lo = MTK_DSI_DEFAULT_QOS_URGENT_LO_US * data_rate_per_buf;
> +     rw_times = dsi->vm.vactive * dsi_buf_bpp;
> +     rw_times /= data->num_burst_lines * data->pixels_per_iter;

[Severity: High]
Should this use dsi->vm.hactive instead of vactive?

Multiplying screen height (vactive) by bytes per pixel seems physically
meaningless for calculating horizontal line buffering burst characteristics.
Using hactive (horizontal pixels per line) might be the intended metric
to compute horizontal burst timings correctly.

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=7

Reply via email to