Skip to content

Commit 14ad809

Browse files
MarijnS95lumag
authored andcommitted
drm/msm/dsi: Use existing per-interface slice count in DSC timing
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]>
1 parent b39e701 commit 14ad809

File tree

2 files changed

+4
-15
lines changed

2 files changed

+4
-15
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -834,7 +834,7 @@ static void dsi_ctrl_enable(struct msm_dsi_host *msm_host,
834834
dsi_write(msm_host, REG_DSI_CPHY_MODE_CTRL, BIT(0));
835835
}
836836

837-
static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode, u32 hdisplay)
837+
static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode)
838838
{
839839
struct drm_dsc_config *dsc = msm_host->dsc;
840840
u32 reg, reg_ctrl, reg_ctrl2;
@@ -846,7 +846,7 @@ static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mod
846846
/* first calculate dsc parameters and then program
847847
* compress mode registers
848848
*/
849-
slice_per_intf = msm_dsc_get_slices_per_intf(dsc, hdisplay);
849+
slice_per_intf = dsc->slice_count;
850850

851851
total_bytes_per_intf = dsc->slice_chunk_size * slice_per_intf;
852852
bytes_per_pkt = dsc->slice_chunk_size; /* * slice_per_pkt; */
@@ -979,7 +979,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
979979

980980
if (msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) {
981981
if (msm_host->dsc)
982-
dsi_update_dsc_timing(msm_host, false, mode->hdisplay);
982+
dsi_update_dsc_timing(msm_host, false);
983983

984984
dsi_write(msm_host, REG_DSI_ACTIVE_H,
985985
DSI_ACTIVE_H_START(ha_start) |
@@ -1000,7 +1000,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
10001000
DSI_ACTIVE_VSYNC_VPOS_END(vs_end));
10011001
} else { /* command mode */
10021002
if (msm_host->dsc)
1003-
dsi_update_dsc_timing(msm_host, true, mode->hdisplay);
1003+
dsi_update_dsc_timing(msm_host, true);
10041004

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

drivers/gpu/drm/msm/msm_dsc_helper.h

Lines changed: 0 additions & 11 deletions
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)