* [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits
@ 2026-10-08 17:23 Mahadevan P
2026-10-08 17:23 ` [PATCH v4 1/6] drm/msm/dpu: split modes a single layer mixer cannot clock Mahadevan P
` (7 more replies)
0 siblings, 8 replies; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P,
Dmitry Baryshkov, Jessica Zhang
Currently, the DPU driver bases LM reservation off of the maximum
supported width for the layer mixer and an arbitrary MAX_HDISPLAY_SPLIT.
However, these limits are not hardware limits meaning that a single LM
can support higher resolutions.
Switch to basing LM reservation off of PINGPONG and DSC encoder hardware
limits.
This revision also adds clock-based mixer selection and a source-pipe
width guard for mixers without source split.
Assisted-by: LLM
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
Changes in v4:
- Rebased on msm-next, resolving conflicts.
- Added clock-based mixer selection and reused the helper in mode
validation.
- Added a source-pipe width guard for mixers without source split.
- Extended the catalog cleanup to newer platforms.
- Link to v3: https://lore.kernel.org/r/20260112-max-mixer-width-v3-0-f98063ea21f5@oss.qualcomm.com
Changes in v3:
- Rebased on msm-next, fixing conflicts
- Updated commit messages to describe the actual issue.
- Link to v2: https://lore.kernel.org/r/20260103-max-mixer-width-v2-0-ef5d3d246709@oss.qualcomm.com
Changes in v2:
- Dropped PP and DSC encoder width drop the catalog, they are now
determined in the code by using the DPU programming
- Corrected DSC encoder width for DPUs < 8.x (2048 vs 2560)
- Link to v1: https://lore.kernel.org/r/20250514-max-mixer-width-v1-0-c8ba0d9bb858@oss.qualcomm.com
---
Jessica Zhang (3):
drm/msm/dpu: check mode against PINGPONG or DSC max width
drm/msm/dpu: filter writeback modes using writeback maxlinewidth
drm/msm/dpu: remove max_mixer_width from catalog
Mahadevan P (3):
drm/msm/dpu: split modes a single layer mixer cannot clock
drm/msm/dpu: do not assume a merged datapath when validating mode clock
drm/msm/dpu: limit the mode width to a pipe if the LM has no source split
.../drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h | 1 -
.../gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h | 1 -
.../drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 82 +++++++++++++++++++---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 9 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 9 +--
36 files changed, 79 insertions(+), 54 deletions(-)
---
base-commit: aac26bee2287c88af5be5a5ff96d783b19a28790
change-id: 20261008-lm_fixes_final-9b9a8d0d9835
Best regards,
--
Mahadevan P <mahadevan.p@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 1/6] drm/msm/dpu: split modes a single layer mixer cannot clock
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
@ 2026-10-08 17:23 ` Mahadevan P
2026-10-08 17:23 ` [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock Mahadevan P
` (6 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P
The layer mixer count is picked purely from the mode width, via the
MAX_HDISPLAY_SPLIT threshold. Width is only half of what constrains a
mixer: it also processes one pixel per core clock cycle, so a mode narrow
enough to stay under the width threshold can still demand a higher pixel
rate than one mixer sustains. A 1080 wide panel at a few hundred Hz is
enough to get there.
Such a mode is currently given a single mixer and then has to be clocked
past the maximum core clock rate, which that mixer cannot do.
Factor the decision out into dpu_crtc_num_lm_for_mode() and have it ask
for a second mixer when the adjusted mode clock does not fit the maximum
core clock rate, in addition to the existing width test. Modes that
already fit within one mixer are unaffected, so the only decisions that
change are the ones that could not be driven as they were.
Assisted-by: LLM
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 77a2d1f6700d..0b51a4c5db57 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -1376,6 +1376,25 @@ static int dpu_crtc_reassign_planes(struct drm_crtc *crtc, struct drm_crtc_state
#define MAX_CHANNELS_PER_CRTC PIPES_PER_PLANE
#define MAX_HDISPLAY_SPLIT 1080
+static u32 dpu_crtc_num_lm_for_mode(struct dpu_kms *dpu_kms,
+ const struct drm_display_mode *mode)
+{
+ u64 mode_clk;
+
+ if (!dpu_kms->catalog->caps->has_3d_merge)
+ return 1;
+
+ if (mode->hdisplay > MAX_HDISPLAY_SPLIT)
+ return 2;
+
+ mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
+ dpu_kms->perf.perf_cfg);
+ if (mode_clk * 1000 > dpu_kms->perf.max_core_clk_rate)
+ return 2;
+
+ return 1;
+}
+
static struct msm_display_topology dpu_crtc_get_topology(
struct drm_crtc *crtc,
struct dpu_kms *dpu_kms,
@@ -1409,8 +1428,8 @@ static struct msm_display_topology dpu_crtc_get_topology(
* enabled. This is because in cases where CWB is enabled, num_intf will
* count both the WB and real-time phys encoders.
*
- * For non-DSC CWB usecases, have the num_lm be decided by the
- * (mode->hdisplay > MAX_HDISPLAY_SPLIT) check.
+ * For non-DSC CWB usecases, have the num_lm be decided by
+ * dpu_crtc_num_lm_for_mode().
*/
if (topology.num_intf == 2 && !topology.cwb_enabled)
@@ -1419,7 +1438,7 @@ static struct msm_display_topology dpu_crtc_get_topology(
topology.num_lm = 2;
else if (dpu_kms->catalog->caps->has_3d_merge &&
topology.num_dsc == 0)
- topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1;
+ topology.num_lm = dpu_crtc_num_lm_for_mode(dpu_kms, mode);
else
topology.num_lm = 1;
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
2026-10-08 17:23 ` [PATCH v4 1/6] drm/msm/dpu: split modes a single layer mixer cannot clock Mahadevan P
@ 2026-10-08 17:23 ` Mahadevan P
2026-10-12 12:09 ` Dmitry Baryshkov
2026-10-08 17:23 ` [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width Mahadevan P
` (5 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P
dpu_crtc_mode_valid() halves the adjusted mode clock whenever the
hardware has a 3d_mux block, assuming the mode will be driven by two
layer mixers. Modes no wider than MAX_HDISPLAY_SPLIT are driven by a
single mixer, so for those the check permits twice the pixel rate the
datapath can sustain.
Divide by the mixer count the mode will really be driven by, as reported
by dpu_crtc_num_lm_for_mode(). Split modes still get the halved rate,
single mixer modes are held to what one mixer sustains, and parts
without a 3d_mux divide by one.
Assisted-by: LLM
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 0b51a4c5db57..209b25dbeb6c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -1631,8 +1631,7 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
adjusted_mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
dpu_kms->perf.perf_cfg);
- if (dpu_kms->catalog->caps->has_3d_merge)
- adjusted_mode_clk /= 2;
+ adjusted_mode_clk /= dpu_crtc_num_lm_for_mode(dpu_kms, mode);
/*
* The given mode, adjusted for the perf clock factor, should not exceed
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
2026-10-08 17:23 ` [PATCH v4 1/6] drm/msm/dpu: split modes a single layer mixer cannot clock Mahadevan P
2026-10-08 17:23 ` [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock Mahadevan P
@ 2026-10-08 17:23 ` Mahadevan P
2026-10-12 12:14 ` Dmitry Baryshkov
2026-10-08 17:23 ` [PATCH v4 4/6] drm/msm/dpu: filter writeback modes using writeback maxlinewidth Mahadevan P
` (4 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P,
Dmitry Baryshkov, Jessica Zhang
From: Jessica Zhang <jesszhan0024@gmail.com>
LM block doesn't have a hardware buffer (unlike PINGPONG and DSC
encoders). As such, don't use ephemeral max_mixer_width and
MAX_HDISPLAY_SPLIT to validate requested modes. Instead use PP and DSC
buffer widths.
While on the DPU 8.x+ supports a max linewidth of 8960 for PINGPONG_0,
there is some additional logic that needs to be added to the resource
manager to specifically try and reserve PINGPONG_0 for modes that are
greater than 5k.
The layer-mixer count for a merge-capable, non-DSC mode is chosen by
dpu_crtc_num_lm_for_mode(); feed the PINGPONG/DSC derived width to it as
the split threshold in place of the removed MAX_HDISPLAY_SPLIT, so the
pixel-rate floor added earlier keeps high-refresh modes that now fit
within a single PINGPONG buffer split across two mixers.
Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
Tested-by: Xilin Wu <sophon@radxa.com> # qcs6490-radxa-dragon-q6a
[DB: reworked to drop catalog changes, updated commit message]
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
[MP: rebased on msm-next; fed PINGPONG/DSC width into
dpu_crtc_num_lm_for_mode() instead of open-coding the width test]
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 54 +++++++++++++++++++++-----
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 7 ++++
2 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 209b25dbeb6c..41f986ca2a68 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -758,6 +758,22 @@ void dpu_crtc_complete_commit(struct drm_crtc *crtc)
_dpu_crtc_complete_flip(crtc);
}
+static int msm_display_get_max_pingpong_width(struct dpu_kms *dpu_kms)
+{
+ /*
+ * Note: While, for DPU 8.x+, PINGPONG_0 can technically support up to
+ * 8k resolutions, this requires reworking the RM to try to reserve
+ * PINGPONG_0 for modes greater than 5k.
+ *
+ * Once this additional logic is implemented, we can probably drop this
+ * helper and use the reserved PINGPONG's max_linewidth
+ */
+ if (dpu_kms->catalog->mdss_ver->core_major_ver < 6)
+ return DPU_1_x_MAX_PINGPONG_WIDTH;
+ else
+ return DPU_6_x_MAX_PINGPONG_WIDTH;
+}
+
static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
struct drm_crtc_state *state)
{
@@ -765,13 +781,14 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
struct drm_display_mode *adj_mode = &state->adjusted_mode;
u32 crtc_split_width = adj_mode->hdisplay / cstate->num_mixers;
struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
+ int max_pingpong_width = msm_display_get_max_pingpong_width(dpu_kms);
int i;
/* if we cannot merge 2 LMs (no 3d mux) better to fail earlier
* before even checking the width after the split
*/
if (!dpu_kms->catalog->caps->has_3d_merge &&
- adj_mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)
+ adj_mode->hdisplay > max_pingpong_width)
return -E2BIG;
for (i = 0; i < cstate->num_mixers; i++) {
@@ -783,7 +800,7 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r);
- if (drm_rect_width(r) > dpu_kms->catalog->caps->max_mixer_width)
+ if (drm_rect_width(r) > max_pingpong_width)
return -E2BIG;
}
@@ -1374,17 +1391,17 @@ static int dpu_crtc_reassign_planes(struct drm_crtc *crtc, struct drm_crtc_state
}
#define MAX_CHANNELS_PER_CRTC PIPES_PER_PLANE
-#define MAX_HDISPLAY_SPLIT 1080
static u32 dpu_crtc_num_lm_for_mode(struct dpu_kms *dpu_kms,
- const struct drm_display_mode *mode)
+ const struct drm_display_mode *mode,
+ u32 max_hdisplay_split)
{
u64 mode_clk;
if (!dpu_kms->catalog->caps->has_3d_merge)
return 1;
- if (mode->hdisplay > MAX_HDISPLAY_SPLIT)
+ if (mode->hdisplay > max_hdisplay_split)
return 2;
mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
@@ -1403,6 +1420,7 @@ static struct msm_display_topology dpu_crtc_get_topology(
struct drm_display_mode *mode = &crtc_state->adjusted_mode;
struct msm_display_topology topology = {0};
struct drm_encoder *drm_enc;
+ u32 max_hdisplay_split;
drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask)
dpu_encoder_update_topology(drm_enc, &topology, crtc_state->state,
@@ -1410,6 +1428,19 @@ static struct msm_display_topology dpu_crtc_get_topology(
topology.cwb_enabled = drm_crtc_in_clone_mode(crtc_state);
+ max_hdisplay_split = msm_display_get_max_pingpong_width(dpu_kms);
+
+ if (topology.num_dsc > 0) {
+ u32 max_dsc_encoder_width;
+
+ if (dpu_kms->catalog->mdss_ver->core_major_ver < 6)
+ max_dsc_encoder_width = DPU_1_x_MAX_DSC_ENCODER_WIDTH;
+ else
+ max_dsc_encoder_width = DPU_8_x_MAX_DSC_ENCODER_WIDTH;
+
+ max_hdisplay_split = min(max_hdisplay_split, max_dsc_encoder_width);
+ }
+
/*
* Datapath topology selection
*
@@ -1438,7 +1469,8 @@ static struct msm_display_topology dpu_crtc_get_topology(
topology.num_lm = 2;
else if (dpu_kms->catalog->caps->has_3d_merge &&
topology.num_dsc == 0)
- topology.num_lm = dpu_crtc_num_lm_for_mode(dpu_kms, mode);
+ topology.num_lm = dpu_crtc_num_lm_for_mode(dpu_kms, mode,
+ max_hdisplay_split);
else
topology.num_lm = 1;
@@ -1619,19 +1651,21 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
const struct drm_display_mode *mode)
{
struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
+ int max_pingpong_width = msm_display_get_max_pingpong_width(dpu_kms);
u64 adjusted_mode_clk;
/* if there is no 3d_mux block we cannot merge LMs so we cannot
* split the large layer into 2 LMs, filter out such modes
*/
if (!dpu_kms->catalog->caps->has_3d_merge &&
- mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)
+ mode->hdisplay > max_pingpong_width)
return MODE_BAD_HVALUE;
adjusted_mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
dpu_kms->perf.perf_cfg);
- adjusted_mode_clk /= dpu_crtc_num_lm_for_mode(dpu_kms, mode);
+ adjusted_mode_clk /= dpu_crtc_num_lm_for_mode(dpu_kms, mode,
+ max_pingpong_width);
/*
* The given mode, adjusted for the perf clock factor, should not exceed
@@ -1641,10 +1675,10 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
return MODE_CLOCK_HIGH;
/*
- * max crtc width is equal to the max mixer width * 2 and max height is 4K
+ * max crtc width is equal to the max pingpong width * 2 and max height is 4K
*/
return drm_mode_validate_size(mode,
- 2 * dpu_kms->catalog->caps->max_mixer_width,
+ 2 * max_pingpong_width,
4096);
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
index f45faf87333e..71e1a404e25f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
@@ -24,6 +24,13 @@
#define DPU_MAX_IMG_WIDTH 0x3fff
#define DPU_MAX_IMG_HEIGHT 0x3fff
+#define DPU_1_x_MAX_PINGPONG_WIDTH 4096
+#define DPU_6_x_MAX_PINGPONG_WIDTH 5120
+#define DPU_8_x_MAX_PINGPONG_0_WIDTH 8960
+
+#define DPU_1_x_MAX_DSC_ENCODER_WIDTH 2048
+#define DPU_8_x_MAX_DSC_ENCODER_WIDTH 2560
+
#define CRTC_DUAL_MIXERS 2
#define MAX_XIN_COUNT 16
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 4/6] drm/msm/dpu: filter writeback modes using writeback maxlinewidth
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
` (2 preceding siblings ...)
2026-10-08 17:23 ` [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width Mahadevan P
@ 2026-10-08 17:23 ` Mahadevan P
2026-10-12 12:15 ` Dmitry Baryshkov
2026-10-08 17:23 ` [PATCH v4 5/6] drm/msm/dpu: remove max_mixer_width from catalog Mahadevan P
` (3 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P,
Dmitry Baryshkov, Jessica Zhang
From: Jessica Zhang <jesszhan0024@gmail.com>
Maximum width of the writeback mode is limited by the hardware buffer in
the WB block rather than by the LM properties (LM doesn't have an actual
buffer). Use the actual hardware limit (the writeback maxlinewidth) to
filter modes.
Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
[DB: fixed commit message]
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
index e7b09013ae4c..a31b6e2f5cf7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -15,14 +15,7 @@ static int dpu_wb_conn_get_modes(struct drm_connector *connector)
struct msm_drm_private *priv = dev->dev_private;
struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
- /*
- * We should ideally be limiting the modes only to the maxlinewidth but
- * on some chipsets this will allow even 4k modes to be added which will
- * fail the per SSPP bandwidth checks. So, till we have dual-SSPP support
- * and source split support added lets limit the modes based on max_mixer_width
- * as 4K modes can then be supported.
- */
- return drm_add_modes_noedid(connector, dpu_kms->catalog->caps->max_mixer_width,
+ return drm_add_modes_noedid(connector, dpu_kms->catalog->wb->maxlinewidth,
dev->mode_config.max_height);
}
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 5/6] drm/msm/dpu: remove max_mixer_width from catalog
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
` (3 preceding siblings ...)
2026-10-08 17:23 ` [PATCH v4 4/6] drm/msm/dpu: filter writeback modes using writeback maxlinewidth Mahadevan P
@ 2026-10-08 17:23 ` Mahadevan P
2026-10-08 17:23 ` [PATCH v4 6/6] drm/msm/dpu: limit the mode width to a pipe if the LM has no source split Mahadevan P
` (2 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P,
Dmitry Baryshkov, Jessica Zhang
From: Jessica Zhang <jesszhan0024@gmail.com>
Remove the now-unused max_mixer_width field from the HW catalog. It
doesn't represent an actual hardware constraint.
Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
[MP: rebased on msm-next; also drop the field from the milos,
eliza and kaanapali catalogs added since v3]
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 2 --
34 files changed, 35 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h
index 2eef5f69832f..b7ec821c8f52 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h
@@ -8,7 +8,6 @@
#define _DPU_10_0_SM8650_H
static const struct dpu_caps sm8650_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h
index 1aa8aea4e352..760936b71c71 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h
@@ -9,7 +9,6 @@
#define _DPU_10_2_MILOS_H
static const struct dpu_caps milos_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h
index 3889eb8a5428..c01caa1e1889 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h
@@ -9,7 +9,6 @@
#define _DPU_12_0_SM8750_H
static const struct dpu_caps sm8750_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h
index 4eb4a0e9803e..0e76320c5286 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h
@@ -7,7 +7,6 @@
#define _DPU_12_2_GLYMUR_H
static const struct dpu_caps glymur_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h
index b93d32888972..46f534ada638 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h
@@ -4,7 +4,6 @@
#define _DPU_12_4_ELIZA_H
static const struct dpu_caps eliza_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h
index 85f455a9f29c..1fb53cd9ac15 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h
@@ -7,7 +7,6 @@
#define _DPU_13_0_KAANAPALI_H
static const struct dpu_caps kaanapali_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h
index 4ff7b397f808..c9ec48b135c1 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h
@@ -7,7 +7,6 @@
#define _DPU_1_14_MSM8937_H
static const struct dpu_caps msm8937_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x4,
.max_linewidth = DEFAULT_DPU_LINE_WIDTH,
.pixel_ram_size = 40 * 1024,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h
index 1518c3d39ce8..af664c7accb5 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h
@@ -7,7 +7,6 @@
#define _DPU_1_14_MSM8917_H
static const struct dpu_caps msm8917_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x4,
.max_linewidth = DEFAULT_DPU_LINE_WIDTH,
.pixel_ram_size = 16 * 1024,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h
index 859a97e8c07e..bc8a108e5674 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h
@@ -7,7 +7,6 @@
#define _DPU_1_16_MSM8953_H
static const struct dpu_caps msm8953_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x4,
.max_linewidth = DEFAULT_DPU_LINE_WIDTH,
.pixel_ram_size = 40 * 1024,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h
index 67910a2f6880..e9770a3a453f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h
@@ -9,7 +9,6 @@
#define _DPU_1_7_MSM8996_H
static const struct dpu_caps msm8996_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_src_split = true,
.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
index 67c1463d3bd6..6fd2f202f7b3 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
@@ -8,7 +8,6 @@
#define _DPU_3_0_MSM8998_H
static const struct dpu_caps msm8998_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h
index 84344029819f..80de77b6cbc7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h
@@ -7,7 +7,6 @@
#define _DPU_3_2_SDM660_H
static const struct dpu_caps sdm660_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h
index ef5777aee587..bb889d56ea25 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h
@@ -7,7 +7,6 @@
#define _DPU_3_3_SDM630_H
static const struct dpu_caps sdm630_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
index b608d2bb6d48..0e47fc3e9779 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
@@ -8,7 +8,6 @@
#define _DPU_4_0_SDM845_H
static const struct dpu_caps sdm845_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
index 9729a65d3e3a..f0a7d6174002 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
@@ -8,7 +8,6 @@
#define _DPU_5_0_SM8150_H
static const struct dpu_caps sm8150_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h
index fb18de029e80..2d70802c7c3c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h
@@ -8,7 +8,6 @@
#define _DPU_5_1_SC8180X_H
static const struct dpu_caps sc8180x_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h
index 92a614686cb6..7d8a83282f80 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h
@@ -8,7 +8,6 @@
#define _DPU_5_2_SM7150_H
static const struct dpu_caps sm7150_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h
index 87488d3ed95f..6dac4b8019b7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h
@@ -7,7 +7,6 @@
#define _DPU_5_3_SM6150_H
static const struct dpu_caps sm6150_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x9,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h
index 64be51e30159..5280a496277a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h
@@ -9,7 +9,6 @@
#define _DPU_5_4_SM6125_H
static const struct dpu_caps sm6125_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x6,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h
index 0e311d54ef18..87c88190e6d3 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h
@@ -8,7 +8,6 @@
#define _DPU_6_0_SM8250_H
static const struct dpu_caps sm8250_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h
index d6f7ee24ca93..4109875e1cc2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h
@@ -8,7 +8,6 @@
#define _DPU_6_2_SC7180_H
static const struct dpu_caps sc7180_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x9,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h
index 20a2e9ff5cc9..7da39cb0866e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h
@@ -8,7 +8,6 @@
#define _DPU_6_3_SM6115_H
static const struct dpu_caps sm6115_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x4,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h
index dd891703e35f..5bad15f4242b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h
@@ -9,7 +9,6 @@
#define _DPU_6_4_SM6350_H
static const struct dpu_caps sm6350_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h
index 7ae7530aa3b0..dae242521f99 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h
@@ -8,7 +8,6 @@
#define _DPU_6_5_QCM2290_H
static const struct dpu_caps qcm2290_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x4,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h
index fc7ceac859be..8a0315028f88 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h
@@ -9,7 +9,6 @@
#define _DPU_6_9_SM6375_H
static const struct dpu_caps sm6375_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
.max_mixer_blendstages = 0x4,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h
index d06c14f05faf..1fd795b5dae4 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h
@@ -8,7 +8,6 @@
#define _DPU_7_0_SM8350_H
static const struct dpu_caps sm8350_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h
index 99b8a890fddc..bdad3fea65e2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h
@@ -8,7 +8,6 @@
#define _DPU_7_2_SC7280_H
static const struct dpu_caps sc7280_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0x7,
.has_dim_layer = true,
.has_idle_pc = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h
index 0ba907711d36..96f8f1763a17 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h
@@ -8,7 +8,6 @@
#define _DPU_8_0_SC8280XP_H
static const struct dpu_caps sc8280xp_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 11,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
index 170a709f987c..f62d5bb5be48 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
@@ -8,7 +8,6 @@
#define _DPU_8_1_SM8450_H
static const struct dpu_caps sm8450_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h
index 9cc5e22e1228..dcb27b6fe475 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h
@@ -7,7 +7,6 @@
#define _DPU_8_4_SA8775P_H
static const struct dpu_caps sa8775p_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
index b3d0f221807b..d37f64866d8e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
@@ -8,7 +8,6 @@
#define _DPU_9_0_SM8550_H
static const struct dpu_caps sm8550_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h
index 7effe7120a56..e041cab8505c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h
@@ -8,7 +8,6 @@
#define _DPU_9_1_SAR2130P_H
static const struct dpu_caps sar2130p_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h
index 7b3febf8742d..a6eae4ebc55b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h
@@ -7,7 +7,6 @@
#define _DPU_9_2_X1E80100_H
static const struct dpu_caps x1e80100_dpu_caps = {
- .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
.max_mixer_blendstages = 0xb,
.has_src_split = true,
.has_dim_layer = true,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
index 71e1a404e25f..ea36360c05d8 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
@@ -273,7 +273,6 @@ struct dpu_rotation_cfg {
/**
* struct dpu_caps - define DPU capabilities
- * @max_mixer_width max layer mixer line width support.
* @max_mixer_blendstages max layer mixer blend stages or
* supported z order
* @has_src_split source split feature status
@@ -286,7 +285,6 @@ struct dpu_rotation_cfg {
* @max_vdeci_exp max vertical decimation supported (max is 2^value)
*/
struct dpu_caps {
- u32 max_mixer_width;
u32 max_mixer_blendstages;
bool has_src_split;
bool has_dim_layer;
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 6/6] drm/msm/dpu: limit the mode width to a pipe if the LM has no source split
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
` (4 preceding siblings ...)
2026-10-08 17:23 ` [PATCH v4 5/6] drm/msm/dpu: remove max_mixer_width from catalog Mahadevan P
@ 2026-10-08 17:23 ` Mahadevan P
2026-10-12 12:21 ` Dmitry Baryshkov
2026-10-10 19:52 ` [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
2026-10-12 12:05 ` Dmitry Baryshkov
7 siblings, 1 reply; 15+ messages in thread
From: Mahadevan P @ 2026-10-08 17:23 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Mahadevan P
Layer mixers without DPU_MIXER_SOURCESPLIT stage one pipe per blend level,
so a plane is fetched by a single pipe of at most max_linewidth pixels.
max_mixer_width used to reject wider modes. Now that the mode is checked
against the PINGPONG width (4096/5120), keep max_linewidth as an extra
bound when source split isn't available.
Assisted-by: LLM
Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 41f986ca2a68..c2ebeef0b01f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -791,6 +791,10 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
adj_mode->hdisplay > max_pingpong_width)
return -E2BIG;
+ if (!test_bit(DPU_MIXER_SOURCESPLIT, &dpu_kms->catalog->mixer[0].features) &&
+ adj_mode->hdisplay > dpu_kms->catalog->caps->max_linewidth)
+ return -E2BIG;
+
for (i = 0; i < cstate->num_mixers; i++) {
struct drm_rect *r = &cstate->lm_bounds[i];
r->x1 = crtc_split_width * i;
@@ -1661,6 +1665,10 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
mode->hdisplay > max_pingpong_width)
return MODE_BAD_HVALUE;
+ if (!test_bit(DPU_MIXER_SOURCESPLIT, &dpu_kms->catalog->mixer[0].features) &&
+ mode->hdisplay > dpu_kms->catalog->caps->max_linewidth)
+ return MODE_BAD_HVALUE;
+
adjusted_mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
dpu_kms->perf.perf_cfg);
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
` (5 preceding siblings ...)
2026-10-08 17:23 ` [PATCH v4 6/6] drm/msm/dpu: limit the mode width to a pipe if the LM has no source split Mahadevan P
@ 2026-10-10 19:52 ` Mahadevan P
2026-10-12 12:05 ` Dmitry Baryshkov
7 siblings, 0 replies; 15+ messages in thread
From: Mahadevan P @ 2026-10-10 19:52 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Dmitry Baryshkov
On 10/8/2026 10:53 PM, Mahadevan P wrote:
> Currently, the DPU driver bases LM reservation off of the maximum
> supported width for the layer mixer and an arbitrary MAX_HDISPLAY_SPLIT.
> However, these limits are not hardware limits meaning that a single LM
> can support higher resolutions.
>
> Switch to basing LM reservation off of PINGPONG and DSC encoder hardware
> limits.
>
> This revision also adds clock-based mixer selection and a source-pipe
> width guard for mixers without source split.
Hi Dmitry,
I missed the ongoing quad-pipe changes
(https://lore.kernel.org/all/20261003-dpu-quad-pipe-fixed-v1-0-6a6a00917b71@oss.qualcomm.com/#t)
when preparing this v4.
I’ll rework my changes on top of your series, check the topology
interactions, and resend an updated version.
Thanks, Mahadevan
>
> Assisted-by: LLM
> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
> ---
> Changes in v4:
> - Rebased on msm-next, resolving conflicts.
> - Added clock-based mixer selection and reused the helper in mode
> validation.
> - Added a source-pipe width guard for mixers without source split.
> - Extended the catalog cleanup to newer platforms.
> - Link to v3: https://lore.kernel.org/r/20260112-max-mixer-width-v3-0-f98063ea21f5@oss.qualcomm.com
>
> Changes in v3:
> - Rebased on msm-next, fixing conflicts
> - Updated commit messages to describe the actual issue.
> - Link to v2: https://lore.kernel.org/r/20260103-max-mixer-width-v2-0-ef5d3d246709@oss.qualcomm.com
>
> Changes in v2:
> - Dropped PP and DSC encoder width drop the catalog, they are now
> determined in the code by using the DPU programming
> - Corrected DSC encoder width for DPUs < 8.x (2048 vs 2560)
> - Link to v1: https://lore.kernel.org/r/20250514-max-mixer-width-v1-0-c8ba0d9bb858@oss.qualcomm.com
>
> ---
> Jessica Zhang (3):
> drm/msm/dpu: check mode against PINGPONG or DSC max width
> drm/msm/dpu: filter writeback modes using writeback maxlinewidth
> drm/msm/dpu: remove max_mixer_width from catalog
>
> Mahadevan P (3):
> drm/msm/dpu: split modes a single layer mixer cannot clock
> drm/msm/dpu: do not assume a merged datapath when validating mode clock
> drm/msm/dpu: limit the mode width to a pipe if the LM has no source split
>
> .../drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_10_2_milos.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_12_2_glymur.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_12_4_eliza.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_13_0_kaanapali.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h | 1 -
> .../gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h | 1 -
> .../drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 82 +++++++++++++++++++---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 9 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 9 +--
> 36 files changed, 79 insertions(+), 54 deletions(-)
> ---
> base-commit: aac26bee2287c88af5be5a5ff96d783b19a28790
> change-id: 20261008-lm_fixes_final-9b9a8d0d9835
>
> Best regards,
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
` (6 preceding siblings ...)
2026-10-10 19:52 ` [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
@ 2026-10-12 12:05 ` Dmitry Baryshkov
7 siblings, 0 replies; 15+ messages in thread
From: Dmitry Baryshkov @ 2026-10-12 12:05 UTC (permalink / raw)
To: Mahadevan P
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On Thu, Oct 08, 2026 at 10:53:46PM +0530, Mahadevan P wrote:
> Currently, the DPU driver bases LM reservation off of the maximum
> supported width for the layer mixer and an arbitrary MAX_HDISPLAY_SPLIT.
> However, these limits are not hardware limits meaning that a single LM
> can support higher resolutions.
>
> Switch to basing LM reservation off of PINGPONG and DSC encoder hardware
> limits.
>
> This revision also adds clock-based mixer selection and a source-pipe
> width guard for mixers without source split.
>
> Assisted-by: LLM
> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
> ---
> Changes in v4:
> - Rebased on msm-next, resolving conflicts.
> - Added clock-based mixer selection and reused the helper in mode
> validation.
> - Added a source-pipe width guard for mixers without source split.
> - Extended the catalog cleanup to newer platforms.
What was the issue that caused display breakage on the CRD as reported
by Xilin Wu? How did you fix it?
> - Link to v3: https://lore.kernel.org/r/20260112-max-mixer-width-v3-0-f98063ea21f5@oss.qualcomm.com
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock
2026-10-08 17:23 ` [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock Mahadevan P
@ 2026-10-12 12:09 ` Dmitry Baryshkov
2026-10-12 18:13 ` Mahadevan P
0 siblings, 1 reply; 15+ messages in thread
From: Dmitry Baryshkov @ 2026-10-12 12:09 UTC (permalink / raw)
To: Mahadevan P
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On Thu, Oct 08, 2026 at 10:53:48PM +0530, Mahadevan P wrote:
> dpu_crtc_mode_valid() halves the adjusted mode clock whenever the
> hardware has a 3d_mux block, assuming the mode will be driven by two
> layer mixers. Modes no wider than MAX_HDISPLAY_SPLIT are driven by a
> single mixer, so for those the check permits twice the pixel rate the
> datapath can sustain.
>
> Divide by the mixer count the mode will really be driven by, as reported
> by dpu_crtc_num_lm_for_mode(). Split modes still get the halved rate,
> single mixer modes are held to what one mixer sustains, and parts
> without a 3d_mux divide by one.
>
> Assisted-by: LLM
> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index 0b51a4c5db57..209b25dbeb6c 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -1631,8 +1631,7 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
> adjusted_mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
> dpu_kms->perf.perf_cfg);
>
> - if (dpu_kms->catalog->caps->has_3d_merge)
> - adjusted_mode_clk /= 2;
> + adjusted_mode_clk /= dpu_crtc_num_lm_for_mode(dpu_kms, mode);
With the 64-bit division fixed, LGTM. When submitting patches to these
drivers please make sure to build for armhf as well as for the arm64.
>
> /*
> * The given mode, adjusted for the perf clock factor, should not exceed
>
> --
> 2.34.1
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width
2026-10-08 17:23 ` [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width Mahadevan P
@ 2026-10-12 12:14 ` Dmitry Baryshkov
2026-10-12 18:38 ` Mahadevan P
0 siblings, 1 reply; 15+ messages in thread
From: Dmitry Baryshkov @ 2026-10-12 12:14 UTC (permalink / raw)
To: Mahadevan P
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On Thu, Oct 08, 2026 at 10:53:49PM +0530, Mahadevan P wrote:
> From: Jessica Zhang <jesszhan0024@gmail.com>
>
> LM block doesn't have a hardware buffer (unlike PINGPONG and DSC
> encoders). As such, don't use ephemeral max_mixer_width and
> MAX_HDISPLAY_SPLIT to validate requested modes. Instead use PP and DSC
> buffer widths.
>
> While on the DPU 8.x+ supports a max linewidth of 8960 for PINGPONG_0,
> there is some additional logic that needs to be added to the resource
> manager to specifically try and reserve PINGPONG_0 for modes that are
> greater than 5k.
>
> The layer-mixer count for a merge-capable, non-DSC mode is chosen by
> dpu_crtc_num_lm_for_mode(); feed the PINGPONG/DSC derived width to it as
> the split threshold in place of the removed MAX_HDISPLAY_SPLIT, so the
> pixel-rate floor added earlier keeps high-refresh modes that now fit
> within a single PINGPONG buffer split across two mixers.
>
> Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
> Tested-by: Xilin Wu <sophon@radxa.com> # qcs6490-radxa-dragon-q6a
> [DB: reworked to drop catalog changes, updated commit message]
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> [MP: rebased on msm-next; fed PINGPONG/DSC width into
> dpu_crtc_num_lm_for_mode() instead of open-coding the width test]
> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 54 +++++++++++++++++++++-----
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 7 ++++
> 2 files changed, 51 insertions(+), 10 deletions(-)
>
> @@ -765,13 +781,14 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
> struct drm_display_mode *adj_mode = &state->adjusted_mode;
> u32 crtc_split_width = adj_mode->hdisplay / cstate->num_mixers;
> struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
> + int max_pingpong_width = msm_display_get_max_pingpong_width(dpu_kms);
> int i;
>
> /* if we cannot merge 2 LMs (no 3d mux) better to fail earlier
> * before even checking the width after the split
> */
> if (!dpu_kms->catalog->caps->has_3d_merge &&
> - adj_mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)
> + adj_mode->hdisplay > max_pingpong_width)
> return -E2BIG;
I guess Sashiko is correct here, we need to check DSC width.
>
> for (i = 0; i < cstate->num_mixers; i++) {
> @@ -783,7 +800,7 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
>
> trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r);
>
> - if (drm_rect_width(r) > dpu_kms->catalog->caps->max_mixer_width)
> + if (drm_rect_width(r) > max_pingpong_width)
> return -E2BIG;
> }
>
> @@ -1374,17 +1391,17 @@ static int dpu_crtc_reassign_planes(struct drm_crtc *crtc, struct drm_crtc_state
> }
>
> #define MAX_CHANNELS_PER_CRTC PIPES_PER_PLANE
> -#define MAX_HDISPLAY_SPLIT 1080
>
> static u32 dpu_crtc_num_lm_for_mode(struct dpu_kms *dpu_kms,
> - const struct drm_display_mode *mode)
> + const struct drm_display_mode *mode,
> + u32 max_hdisplay_split)
> {
> u64 mode_clk;
>
> if (!dpu_kms->catalog->caps->has_3d_merge)
> return 1;
>
> - if (mode->hdisplay > MAX_HDISPLAY_SPLIT)
> + if (mode->hdisplay > max_hdisplay_split)
> return 2;
>
> mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
> @@ -1403,6 +1420,7 @@ static struct msm_display_topology dpu_crtc_get_topology(
> struct drm_display_mode *mode = &crtc_state->adjusted_mode;
> struct msm_display_topology topology = {0};
> struct drm_encoder *drm_enc;
> + u32 max_hdisplay_split;
>
> drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask)
> dpu_encoder_update_topology(drm_enc, &topology, crtc_state->state,
> @@ -1410,6 +1428,19 @@ static struct msm_display_topology dpu_crtc_get_topology(
>
> topology.cwb_enabled = drm_crtc_in_clone_mode(crtc_state);
>
> + max_hdisplay_split = msm_display_get_max_pingpong_width(dpu_kms);
> +
> + if (topology.num_dsc > 0) {
> + u32 max_dsc_encoder_width;
> +
> + if (dpu_kms->catalog->mdss_ver->core_major_ver < 6)
> + max_dsc_encoder_width = DPU_1_x_MAX_DSC_ENCODER_WIDTH;
> + else
> + max_dsc_encoder_width = DPU_8_x_MAX_DSC_ENCODER_WIDTH;
> +
> + max_hdisplay_split = min(max_hdisplay_split, max_dsc_encoder_width);
Should this be min() rather than max()?
> + }
> +
> /*
> * Datapath topology selection
> *
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 4/6] drm/msm/dpu: filter writeback modes using writeback maxlinewidth
2026-10-08 17:23 ` [PATCH v4 4/6] drm/msm/dpu: filter writeback modes using writeback maxlinewidth Mahadevan P
@ 2026-10-12 12:15 ` Dmitry Baryshkov
0 siblings, 0 replies; 15+ messages in thread
From: Dmitry Baryshkov @ 2026-10-12 12:15 UTC (permalink / raw)
To: Mahadevan P
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On Thu, Oct 08, 2026 at 10:53:50PM +0530, Mahadevan P wrote:
> From: Jessica Zhang <jesszhan0024@gmail.com>
>
> Maximum width of the writeback mode is limited by the hardware buffer in
> the WB block rather than by the LM properties (LM doesn't have an actual
> buffer). Use the actual hardware limit (the writeback maxlinewidth) to
> filter modes.
>
> Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
> [DB: fixed commit message]
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 9 +--------
> 1 file changed, 1 insertion(+), 8 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 6/6] drm/msm/dpu: limit the mode width to a pipe if the LM has no source split
2026-10-08 17:23 ` [PATCH v4 6/6] drm/msm/dpu: limit the mode width to a pipe if the LM has no source split Mahadevan P
@ 2026-10-12 12:21 ` Dmitry Baryshkov
0 siblings, 0 replies; 15+ messages in thread
From: Dmitry Baryshkov @ 2026-10-12 12:21 UTC (permalink / raw)
To: Mahadevan P
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On Thu, Oct 08, 2026 at 10:53:52PM +0530, Mahadevan P wrote:
> Layer mixers without DPU_MIXER_SOURCESPLIT stage one pipe per blend level,
> so a plane is fetched by a single pipe of at most max_linewidth pixels.
>
> max_mixer_width used to reject wider modes. Now that the mode is checked
> against the PINGPONG width (4096/5120), keep max_linewidth as an extra
> bound when source split isn't available.
This sounds as a misplaced patch. If one of the previous patches
over-relaxed the check, then this patch should come beforehand.
>
> Assisted-by: LLM
> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock
2026-10-12 12:09 ` Dmitry Baryshkov
@ 2026-10-12 18:13 ` Mahadevan P
0 siblings, 0 replies; 15+ messages in thread
From: Mahadevan P @ 2026-10-12 18:13 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On 10/12/2026 5:39 PM, Dmitry Baryshkov wrote:
> On Thu, Oct 08, 2026 at 10:53:48PM +0530, Mahadevan P wrote:
>> dpu_crtc_mode_valid() halves the adjusted mode clock whenever the
>> hardware has a 3d_mux block, assuming the mode will be driven by two
>> layer mixers. Modes no wider than MAX_HDISPLAY_SPLIT are driven by a
>> single mixer, so for those the check permits twice the pixel rate the
>> datapath can sustain.
>>
>> Divide by the mixer count the mode will really be driven by, as reported
>> by dpu_crtc_num_lm_for_mode(). Split modes still get the halved rate,
>> single mixer modes are held to what one mixer sustains, and parts
>> without a 3d_mux divide by one.
>>
>> Assisted-by: LLM
>> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
>> ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> index 0b51a4c5db57..209b25dbeb6c 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> @@ -1631,8 +1631,7 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
>> adjusted_mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
>> dpu_kms->perf.perf_cfg);
>>
>> - if (dpu_kms->catalog->caps->has_3d_merge)
>> - adjusted_mode_clk /= 2;
>> + adjusted_mode_clk /= dpu_crtc_num_lm_for_mode(dpu_kms, mode);
> With the 64-bit division fixed, LGTM. When submitting patches to these
> drivers please make sure to build for armhf as well as for the arm64.
Thanks for reviewing. I’ll replace the division with div_u64() and
build-test both armhf and arm64 before sending the next revision.
Thanks,
Mahadevan
>
>>
>> /*
>> * The given mode, adjusted for the perf clock factor, should not exceed
>>
>> --
>> 2.34.1
>>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width
2026-10-12 12:14 ` Dmitry Baryshkov
@ 2026-10-12 18:38 ` Mahadevan P
0 siblings, 0 replies; 15+ messages in thread
From: Mahadevan P @ 2026-10-12 18:38 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, David Airlie, Simona Vetter, Xilin Wu,
linux-arm-msm, dri-devel, freedreno, linux-kernel
On 10/12/2026 5:44 PM, Dmitry Baryshkov wrote:
> On Thu, Oct 08, 2026 at 10:53:49PM +0530, Mahadevan P wrote:
>> From: Jessica Zhang <jesszhan0024@gmail.com>
>>
>> LM block doesn't have a hardware buffer (unlike PINGPONG and DSC
>> encoders). As such, don't use ephemeral max_mixer_width and
>> MAX_HDISPLAY_SPLIT to validate requested modes. Instead use PP and DSC
>> buffer widths.
>>
>> While on the DPU 8.x+ supports a max linewidth of 8960 for PINGPONG_0,
>> there is some additional logic that needs to be added to the resource
>> manager to specifically try and reserve PINGPONG_0 for modes that are
>> greater than 5k.
>>
>> The layer-mixer count for a merge-capable, non-DSC mode is chosen by
>> dpu_crtc_num_lm_for_mode(); feed the PINGPONG/DSC derived width to it as
>> the split threshold in place of the removed MAX_HDISPLAY_SPLIT, so the
>> pixel-rate floor added earlier keeps high-refresh modes that now fit
>> within a single PINGPONG buffer split across two mixers.
>>
>> Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
>> Tested-by: Xilin Wu <sophon@radxa.com> # qcs6490-radxa-dragon-q6a
>> [DB: reworked to drop catalog changes, updated commit message]
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>> [MP: rebased on msm-next; fed PINGPONG/DSC width into
>> dpu_crtc_num_lm_for_mode() instead of open-coding the width test]
>> Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
>> ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 54 +++++++++++++++++++++-----
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 7 ++++
>> 2 files changed, 51 insertions(+), 10 deletions(-)
>>
>> @@ -765,13 +781,14 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
>> struct drm_display_mode *adj_mode = &state->adjusted_mode;
>> u32 crtc_split_width = adj_mode->hdisplay / cstate->num_mixers;
>> struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
>> + int max_pingpong_width = msm_display_get_max_pingpong_width(dpu_kms);
>> int i;
>>
>> /* if we cannot merge 2 LMs (no 3d mux) better to fail earlier
>> * before even checking the width after the split
>> */
>> if (!dpu_kms->catalog->caps->has_3d_merge &&
>> - adj_mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)
>> + adj_mode->hdisplay > max_pingpong_width)
>> return -E2BIG;
> I guess Sashiko is correct here, we need to check DSC width.
Agreed, the PINGPONG bounds check alone does not enforce the DSC encoder
width. The next revision validates the width per selected DSC encoder
before resource reservation.
>
>>
>> for (i = 0; i < cstate->num_mixers; i++) {
>> @@ -783,7 +800,7 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
>>
>> trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r);
>>
>> - if (drm_rect_width(r) > dpu_kms->catalog->caps->max_mixer_width)
>> + if (drm_rect_width(r) > max_pingpong_width)
>> return -E2BIG;
>> }
>>
>> @@ -1374,17 +1391,17 @@ static int dpu_crtc_reassign_planes(struct drm_crtc *crtc, struct drm_crtc_state
>> }
>>
>> #define MAX_CHANNELS_PER_CRTC PIPES_PER_PLANE
>> -#define MAX_HDISPLAY_SPLIT 1080
>>
>> static u32 dpu_crtc_num_lm_for_mode(struct dpu_kms *dpu_kms,
>> - const struct drm_display_mode *mode)
>> + const struct drm_display_mode *mode,
>> + u32 max_hdisplay_split)
>> {
>> u64 mode_clk;
>>
>> if (!dpu_kms->catalog->caps->has_3d_merge)
>> return 1;
>>
>> - if (mode->hdisplay > MAX_HDISPLAY_SPLIT)
>> + if (mode->hdisplay > max_hdisplay_split)
>> return 2;
>>
>> mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,
>> @@ -1403,6 +1420,7 @@ static struct msm_display_topology dpu_crtc_get_topology(
>> struct drm_display_mode *mode = &crtc_state->adjusted_mode;
>> struct msm_display_topology topology = {0};
>> struct drm_encoder *drm_enc;
>> + u32 max_hdisplay_split;
>>
>> drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask)
>> dpu_encoder_update_topology(drm_enc, &topology, crtc_state->state,
>> @@ -1410,6 +1428,19 @@ static struct msm_display_topology dpu_crtc_get_topology(
>>
>> topology.cwb_enabled = drm_crtc_in_clone_mode(crtc_state);
>>
>> + max_hdisplay_split = msm_display_get_max_pingpong_width(dpu_kms);
>> +
>> + if (topology.num_dsc > 0) {
>> + u32 max_dsc_encoder_width;
>> +
>> + if (dpu_kms->catalog->mdss_ver->core_major_ver < 6)
>> + max_dsc_encoder_width = DPU_1_x_MAX_DSC_ENCODER_WIDTH;
>> + else
>> + max_dsc_encoder_width = DPU_8_x_MAX_DSC_ENCODER_WIDTH;
>> +
>> + max_hdisplay_split = min(max_hdisplay_split, max_dsc_encoder_width);
> Should this be min() rather than max()?
The code already uses min() here, as the width must fit both the
PINGPONG and DSC encoder limits. If the variable name is unclear, I can
rename it to "single_lm_width".
>
>> + }
>> +
>> /*
>> * Datapath topology selection
>> *
Thanks,
Mahadevan
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-10-12 18:38 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-08 17:23 [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
2026-10-08 17:23 ` [PATCH v4 1/6] drm/msm/dpu: split modes a single layer mixer cannot clock Mahadevan P
2026-10-08 17:23 ` [PATCH v4 2/6] drm/msm/dpu: do not assume a merged datapath when validating mode clock Mahadevan P
2026-10-12 12:09 ` Dmitry Baryshkov
2026-10-12 18:13 ` Mahadevan P
2026-10-08 17:23 ` [PATCH v4 3/6] drm/msm/dpu: check mode against PINGPONG or DSC max width Mahadevan P
2026-10-12 12:14 ` Dmitry Baryshkov
2026-10-12 18:38 ` Mahadevan P
2026-10-08 17:23 ` [PATCH v4 4/6] drm/msm/dpu: filter writeback modes using writeback maxlinewidth Mahadevan P
2026-10-12 12:15 ` Dmitry Baryshkov
2026-10-08 17:23 ` [PATCH v4 5/6] drm/msm/dpu: remove max_mixer_width from catalog Mahadevan P
2026-10-08 17:23 ` [PATCH v4 6/6] drm/msm/dpu: limit the mode width to a pipe if the LM has no source split Mahadevan P
2026-10-12 12:21 ` Dmitry Baryshkov
2026-10-10 19:52 ` [PATCH v4 0/6] drm/msm/dpu: rework layer mixer allocation and mode limits Mahadevan P
2026-10-12 12:05 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®