Skip to content

Commit d6b8395

Browse files
committed
Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel into drm-fixes
* 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel: drm/i915: Do not set "Enable Panel Fitter" on SNB pageflips drm/i915: Hold mode_config lock whilst changing mode for lastclose() drm/i915: don't clobber the special upscaling lvds timings
2 parents e363250 + 99d9acd commit d6b8395

File tree

5 files changed

+26
-5
lines changed

5 files changed

+26
-5
lines changed

drivers/gpu/drm/i915/intel_display.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3478,8 +3478,11 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
34783478
return false;
34793479
}
34803480

3481-
/* All interlaced capable intel hw wants timings in frames. */
3482-
drm_mode_set_crtcinfo(adjusted_mode, 0);
3481+
/* All interlaced capable intel hw wants timings in frames. Note though
3482+
* that intel_lvds_mode_fixup does some funny tricks with the crtc
3483+
* timings, so we need to be careful not to clobber these.*/
3484+
if (!(adjusted_mode->private_flags & INTEL_MODE_CRTC_TIMINGS_SET))
3485+
drm_mode_set_crtcinfo(adjusted_mode, 0);
34833486

34843487
return true;
34853488
}
@@ -7465,7 +7468,13 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
74657468
OUT_RING(fb->pitches[0] | obj->tiling_mode);
74667469
OUT_RING(obj->gtt_offset);
74677470

7468-
pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
7471+
/* Contrary to the suggestions in the documentation,
7472+
* "Enable Panel Fitter" does not seem to be required when page
7473+
* flipping with a non-native mode, and worse causes a normal
7474+
* modeset to fail.
7475+
* pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
7476+
*/
7477+
pf = 0;
74697478
pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
74707479
OUT_RING(pf | pipesrc);
74717480
ADVANCE_LP_RING();

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@
105105
#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
106106
#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
107107
#define INTEL_MODE_DP_FORCE_6BPC (0x10)
108+
/* This flag must be set by the encoder's mode_fixup if it changes the crtc
109+
* timings in the mode to prevent the crtc fixup from overwriting them.
110+
* Currently only lvds needs that. */
111+
#define INTEL_MODE_CRTC_TIMINGS_SET (0x20)
108112

109113
static inline void
110114
intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,

drivers/gpu/drm/i915/intel_fb.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,15 @@ void intel_fb_restore_mode(struct drm_device *dev)
279279
struct drm_mode_config *config = &dev->mode_config;
280280
struct drm_plane *plane;
281281

282+
mutex_lock(&dev->mode_config.mutex);
283+
282284
ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
283285
if (ret)
284286
DRM_DEBUG("failed to restore crtc mode\n");
285287

286288
/* Be sure to shut off any planes that may be active */
287289
list_for_each_entry(plane, &config->plane_list, head)
288290
plane->funcs->disable_plane(plane);
291+
292+
mutex_unlock(&dev->mode_config.mutex);
289293
}

drivers/gpu/drm/i915/intel_lvds.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ centre_horizontally(struct drm_display_mode *mode,
187187

188188
mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos;
189189
mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width;
190+
191+
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
190192
}
191193

192194
static void
@@ -208,6 +210,8 @@ centre_vertically(struct drm_display_mode *mode,
208210

209211
mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos;
210212
mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width;
213+
214+
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
211215
}
212216

213217
static inline u32 panel_fitter_scaling(u32 source, u32 target)
@@ -283,6 +287,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
283287
for_each_pipe(pipe)
284288
I915_WRITE(BCLRPAT(pipe), 0);
285289

290+
drm_mode_set_crtcinfo(adjusted_mode, 0);
291+
286292
switch (intel_lvds->fitting_mode) {
287293
case DRM_MODE_SCALE_CENTER:
288294
/*

drivers/gpu/drm/i915/intel_panel.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
4747
adjusted_mode->vtotal = fixed_mode->vtotal;
4848

4949
adjusted_mode->clock = fixed_mode->clock;
50-
51-
drm_mode_set_crtcinfo(adjusted_mode, 0);
5250
}
5351

5452
/* adjusted_mode has been preset to be the panel's fixed mode */

0 commit comments

Comments
 (0)