Skip to content

Commit 7626b4e

Browse files
committed
Merge tag 'drm-intel-fixes-2024-10-17' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-fixes
- Two DP bandwidth related MST fixes Signed-off-by: Dave Airlie <[email protected]> From: Joonas Lahtinen <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 01541a8 + 2f54e71 commit 7626b4e

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

drivers/gpu/drm/i915/display/intel_dp_mst.c

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,25 +89,19 @@ static int intel_dp_mst_max_dpt_bpp(const struct intel_crtc_state *crtc_state,
8989

9090
static int intel_dp_mst_bw_overhead(const struct intel_crtc_state *crtc_state,
9191
const struct intel_connector *connector,
92-
bool ssc, bool dsc, int bpp_x16)
92+
bool ssc, int dsc_slice_count, int bpp_x16)
9393
{
9494
const struct drm_display_mode *adjusted_mode =
9595
&crtc_state->hw.adjusted_mode;
9696
unsigned long flags = DRM_DP_BW_OVERHEAD_MST;
97-
int dsc_slice_count = 0;
9897
int overhead;
9998

10099
flags |= intel_dp_is_uhbr(crtc_state) ? DRM_DP_BW_OVERHEAD_UHBR : 0;
101100
flags |= ssc ? DRM_DP_BW_OVERHEAD_SSC_REF_CLK : 0;
102101
flags |= crtc_state->fec_enable ? DRM_DP_BW_OVERHEAD_FEC : 0;
103102

104-
if (dsc) {
103+
if (dsc_slice_count)
105104
flags |= DRM_DP_BW_OVERHEAD_DSC;
106-
dsc_slice_count = intel_dp_dsc_get_slice_count(connector,
107-
adjusted_mode->clock,
108-
adjusted_mode->hdisplay,
109-
crtc_state->joiner_pipes);
110-
}
111105

112106
overhead = drm_dp_bw_overhead(crtc_state->lane_count,
113107
adjusted_mode->hdisplay,
@@ -153,6 +147,19 @@ static int intel_dp_mst_calc_pbn(int pixel_clock, int bpp_x16, int bw_overhead)
153147
return DIV_ROUND_UP(effective_data_rate * 64, 54 * 1000);
154148
}
155149

150+
static int intel_dp_mst_dsc_get_slice_count(const struct intel_connector *connector,
151+
const struct intel_crtc_state *crtc_state)
152+
{
153+
const struct drm_display_mode *adjusted_mode =
154+
&crtc_state->hw.adjusted_mode;
155+
int num_joined_pipes = crtc_state->joiner_pipes;
156+
157+
return intel_dp_dsc_get_slice_count(connector,
158+
adjusted_mode->clock,
159+
adjusted_mode->hdisplay,
160+
num_joined_pipes);
161+
}
162+
156163
static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
157164
struct intel_crtc_state *crtc_state,
158165
int max_bpp,
@@ -172,6 +179,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
172179
const struct drm_display_mode *adjusted_mode =
173180
&crtc_state->hw.adjusted_mode;
174181
int bpp, slots = -EINVAL;
182+
int dsc_slice_count = 0;
175183
int max_dpt_bpp;
176184
int ret = 0;
177185

@@ -203,6 +211,15 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
203211
drm_dbg_kms(&i915->drm, "Looking for slots in range min bpp %d max bpp %d\n",
204212
min_bpp, max_bpp);
205213

214+
if (dsc) {
215+
dsc_slice_count = intel_dp_mst_dsc_get_slice_count(connector, crtc_state);
216+
if (!dsc_slice_count) {
217+
drm_dbg_kms(&i915->drm, "Can't get valid DSC slice count\n");
218+
219+
return -ENOSPC;
220+
}
221+
}
222+
206223
for (bpp = max_bpp; bpp >= min_bpp; bpp -= step) {
207224
int local_bw_overhead;
208225
int remote_bw_overhead;
@@ -216,9 +233,9 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
216233
intel_dp_output_bpp(crtc_state->output_format, bpp));
217234

218235
local_bw_overhead = intel_dp_mst_bw_overhead(crtc_state, connector,
219-
false, dsc, link_bpp_x16);
236+
false, dsc_slice_count, link_bpp_x16);
220237
remote_bw_overhead = intel_dp_mst_bw_overhead(crtc_state, connector,
221-
true, dsc, link_bpp_x16);
238+
true, dsc_slice_count, link_bpp_x16);
222239

223240
intel_dp_mst_compute_m_n(crtc_state, connector,
224241
local_bw_overhead,
@@ -449,6 +466,9 @@ hblank_expansion_quirk_needs_dsc(const struct intel_connector *connector,
449466
if (mode_hblank_period_ns(adjusted_mode) > hblank_limit)
450467
return false;
451468

469+
if (!intel_dp_mst_dsc_get_slice_count(connector, crtc_state))
470+
return false;
471+
452472
return true;
453473
}
454474

0 commit comments

Comments
 (0)