Recently, the hdisplay calculation is working for 3:1 compressed ratio
only. If we have a video panel with DSC BPP = 8, and BPC = 10, we still
use the default bits_per_pclk = 24, then we get the wrong hdisplay. We
can draw the conclusion by cross-comparing the calculation with the
calculation in dsi_adjust_pclk_for_compression().

Since CMD mode does not use this, we can remove
!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) safely.

Fixes: efcbd6f9cdeb ("drm/msm/dsi: Enable widebus for DSI")
Signed-off-by: Pengyu Luo <[email protected]>
---
 drivers/gpu/drm/msm/dsi/dsi_host.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c 
b/drivers/gpu/drm/msm/dsi/dsi_host.c
index e0de545d4..e8e83ee61 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -993,7 +993,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, 
bool is_bonded_dsi)
 
        if (msm_host->dsc) {
                struct drm_dsc_config *dsc = msm_host->dsc;
-               u32 bytes_per_pclk;
+               u32 bits_per_pclk;
 
                /* update dsc params with timing params */
                if (!dsc || !mode->hdisplay || !mode->vdisplay) {
@@ -1015,7 +1015,9 @@ static void dsi_timing_setup(struct msm_dsi_host 
*msm_host, bool is_bonded_dsi)
 
                /*
                 * DPU sends 3 bytes per pclk cycle to DSI. If widebus is
-                * enabled, bus width is extended to 6 bytes.
+                * enabled, MDP always sends out 48-bit compressed data per
+                * pclk and on average, DSI consumes an amount of compressed
+                * data equivalent to the uncompressed pixel depth per pclk.
                 *
                 * Calculate the number of pclks needed to transmit one line of
                 * the compressed data.
@@ -1027,12 +1029,12 @@ static void dsi_timing_setup(struct msm_dsi_host 
*msm_host, bool is_bonded_dsi)
                 * unused anyway.
                 */
                h_total -= hdisplay;
-               if (wide_bus_enabled && !(msm_host->mode_flags & 
MIPI_DSI_MODE_VIDEO))
-                       bytes_per_pclk = 6;
+               if (wide_bus_enabled)
+                       bits_per_pclk = 
mipi_dsi_pixel_format_to_bpp(msm_host->format);
                else
-                       bytes_per_pclk = 3;
+                       bits_per_pclk = 24;
 
-               hdisplay = 
DIV_ROUND_UP(msm_dsc_get_bytes_per_line(msm_host->dsc), bytes_per_pclk);
+               hdisplay = 
DIV_ROUND_UP(msm_dsc_get_bytes_per_line(msm_host->dsc) * 8, bits_per_pclk);
 
                h_total += hdisplay;
                ha_end = ha_start + hdisplay;
-- 
2.53.0

Reply via email to