Skip to content

Commit c898261

Browse files
committed
drm/i915: Force explicit bpp selection for intel_dp_link_required
It is never correct to use intel_crtc->bpp in intel_dp_link_required, so instead pass an explicit bpp in to this function. This patch only supports 18bpp and 24bpp modes, which means that 10bpc modes will be computed incorrectly. Fixing that will require more extensive changes, and so must be addressed separately from this bugfix. intel_dp_link_required is called from intel_dp_mode_valid and intel_dp_mode_fixup. * intel_dp_mode_valid is called to list supported modes; in this case, the current crtc values cannot be relevant as the modes in question may never be selected. Thus, using intel_crtc->bpp is never right. * intel_dp_mode_fixup is called during mode setting, but it is run well before ironlake_crtc_mode_set is called to set intel_crtc->bpp, so using intel_crtc-bpp in this path can only ever get a stale value. Cc: Lubos Kolouch <[email protected]> Cc: Adam Jackson <[email protected]> Cc: [email protected] Reviewed-by: Daniel Vetter <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42263 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44881 Tested-by: Dave Airlie <[email protected]> Tested-by: [email protected] (Dell Latitude 6510) Tested-by: Roland Dreier <[email protected]> Signed-off-by: Keith Packard <[email protected]>
1 parent a4ea430 commit c898261

File tree

1 file changed

+5
-15
lines changed

1 file changed

+5
-15
lines changed

drivers/gpu/drm/i915/intel_dp.c

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,8 @@ intel_dp_link_clock(uint8_t link_bw)
208208
*/
209209

210210
static int
211-
intel_dp_link_required(struct intel_dp *intel_dp, int pixel_clock, int check_bpp)
211+
intel_dp_link_required(int pixel_clock, int bpp)
212212
{
213-
struct drm_crtc *crtc = intel_dp->base.base.crtc;
214-
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
215-
int bpp = 24;
216-
217-
if (check_bpp)
218-
bpp = check_bpp;
219-
else if (intel_crtc)
220-
bpp = intel_crtc->bpp;
221-
222213
return (pixel_clock * bpp + 9) / 10;
223214
}
224215

@@ -245,12 +236,11 @@ intel_dp_mode_valid(struct drm_connector *connector,
245236
return MODE_PANEL;
246237
}
247238

248-
mode_rate = intel_dp_link_required(intel_dp, mode->clock, 0);
239+
mode_rate = intel_dp_link_required(mode->clock, 24);
249240
max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
250241

251242
if (mode_rate > max_rate) {
252-
mode_rate = intel_dp_link_required(intel_dp,
253-
mode->clock, 18);
243+
mode_rate = intel_dp_link_required(mode->clock, 18);
254244
if (mode_rate > max_rate)
255245
return MODE_CLOCK_HIGH;
256246
else
@@ -683,7 +673,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
683673
int lane_count, clock;
684674
int max_lane_count = intel_dp_max_lane_count(intel_dp);
685675
int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0;
686-
int bpp = mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 0;
676+
int bpp = mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24;
687677
static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 };
688678

689679
if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
@@ -701,7 +691,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
701691
for (clock = 0; clock <= max_clock; clock++) {
702692
int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count);
703693

704-
if (intel_dp_link_required(intel_dp, mode->clock, bpp)
694+
if (intel_dp_link_required(mode->clock, bpp)
705695
<= link_avail) {
706696
intel_dp->link_bw = bws[clock];
707697
intel_dp->lane_count = lane_count;

0 commit comments

Comments
 (0)