Skip to content

Commit 2af52e4

Browse files
MarijnS95gregkh
authored andcommitted
drm/msm/dsi: Use existing per-interface slice count in DSC timing
[ Upstream commit 14ad809 ] When configuring the timing of DSI hosts (interfaces) in dsi_timing_setup() all values written to registers are taking bonded-mode into account by dividing the original mode width by 2 (half the data is sent over each of the two DSI hosts), but the full width instead of the interface width is passed as hdisplay parameter to dsi_update_dsc_timing(). Currently only msm_dsc_get_slices_per_intf() is called within dsi_update_dsc_timing() with the `hdisplay` argument which clearly documents that it wants the width of a single interface (which, again, in bonded DSI mode is half the total width of the mode) resulting in all subsequent values to be completely off. However, as soon as we start to pass the halved hdisplay into dsi_update_dsc_timing() we might as well discard msm_dsc_get_slices_per_intf() since the value it calculates is already available in dsc->slice_count which is per-interface by the current design of MSM DPU/DSI implementations and their use of the DRM DSC helpers. Fixes: 08802f5 ("drm/msm/dsi: Add support for DSC configuration") Reviewed-by: Dmitry Baryshkov <[email protected]> Reviewed-by: Jessica Zhang <[email protected]> Signed-off-by: Marijn Suijten <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/637648/ Link: https://lore.kernel.org/r/20250217-drm-msm-initial-dualpipe-dsc-fixes-v3-1-913100d6103f@somainline.org Signed-off-by: Dmitry Baryshkov <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent a47ee18 commit 2af52e4

File tree

2 files changed

+4
-15
lines changed

2 files changed

+4
-15
lines changed

drivers/gpu/drm/msm/dsi/dsi_host.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ static void dsi_ctrl_enable(struct msm_dsi_host *msm_host,
846846
dsi_write(msm_host, REG_DSI_CPHY_MODE_CTRL, BIT(0));
847847
}
848848

849-
static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode, u32 hdisplay)
849+
static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode)
850850
{
851851
struct drm_dsc_config *dsc = msm_host->dsc;
852852
u32 reg, reg_ctrl, reg_ctrl2;
@@ -858,7 +858,7 @@ static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mod
858858
/* first calculate dsc parameters and then program
859859
* compress mode registers
860860
*/
861-
slice_per_intf = msm_dsc_get_slices_per_intf(dsc, hdisplay);
861+
slice_per_intf = dsc->slice_count;
862862

863863
total_bytes_per_intf = dsc->slice_chunk_size * slice_per_intf;
864864
bytes_per_pkt = dsc->slice_chunk_size; /* * slice_per_pkt; */
@@ -991,7 +991,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
991991

992992
if (msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) {
993993
if (msm_host->dsc)
994-
dsi_update_dsc_timing(msm_host, false, mode->hdisplay);
994+
dsi_update_dsc_timing(msm_host, false);
995995

996996
dsi_write(msm_host, REG_DSI_ACTIVE_H,
997997
DSI_ACTIVE_H_START(ha_start) |
@@ -1012,7 +1012,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
10121012
DSI_ACTIVE_VSYNC_VPOS_END(vs_end));
10131013
} else { /* command mode */
10141014
if (msm_host->dsc)
1015-
dsi_update_dsc_timing(msm_host, true, mode->hdisplay);
1015+
dsi_update_dsc_timing(msm_host, true);
10161016

10171017
/* image data and 1 byte write_memory_start cmd */
10181018
if (!msm_host->dsc)

drivers/gpu/drm/msm/msm_dsc_helper.h

-11
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,6 @@
1212
#include <linux/math.h>
1313
#include <drm/display/drm_dsc_helper.h>
1414

15-
/**
16-
* msm_dsc_get_slices_per_intf() - calculate number of slices per interface
17-
* @dsc: Pointer to drm dsc config struct
18-
* @intf_width: interface width in pixels
19-
* Returns: Integer representing the number of slices for the given interface
20-
*/
21-
static inline u32 msm_dsc_get_slices_per_intf(const struct drm_dsc_config *dsc, u32 intf_width)
22-
{
23-
return DIV_ROUND_UP(intf_width, dsc->slice_width);
24-
}
25-
2615
/**
2716
* msm_dsc_get_bytes_per_line() - calculate bytes per line
2817
* @dsc: Pointer to drm dsc config struct

0 commit comments

Comments
 (0)