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
This commit is contained in:
commit
d6b8395262
|
@ -3478,8 +3478,11 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All interlaced capable intel hw wants timings in frames. */
|
/* All interlaced capable intel hw wants timings in frames. Note though
|
||||||
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
* that intel_lvds_mode_fixup does some funny tricks with the crtc
|
||||||
|
* timings, so we need to be careful not to clobber these.*/
|
||||||
|
if (!(adjusted_mode->private_flags & INTEL_MODE_CRTC_TIMINGS_SET))
|
||||||
|
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -7465,7 +7468,13 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
|
||||||
OUT_RING(fb->pitches[0] | obj->tiling_mode);
|
OUT_RING(fb->pitches[0] | obj->tiling_mode);
|
||||||
OUT_RING(obj->gtt_offset);
|
OUT_RING(obj->gtt_offset);
|
||||||
|
|
||||||
pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
|
/* Contrary to the suggestions in the documentation,
|
||||||
|
* "Enable Panel Fitter" does not seem to be required when page
|
||||||
|
* flipping with a non-native mode, and worse causes a normal
|
||||||
|
* modeset to fail.
|
||||||
|
* pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
|
||||||
|
*/
|
||||||
|
pf = 0;
|
||||||
pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
|
pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
|
||||||
OUT_RING(pf | pipesrc);
|
OUT_RING(pf | pipesrc);
|
||||||
ADVANCE_LP_RING();
|
ADVANCE_LP_RING();
|
||||||
|
|
|
@ -105,6 +105,10 @@
|
||||||
#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
|
#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
|
||||||
#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
|
#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
|
||||||
#define INTEL_MODE_DP_FORCE_6BPC (0x10)
|
#define INTEL_MODE_DP_FORCE_6BPC (0x10)
|
||||||
|
/* This flag must be set by the encoder's mode_fixup if it changes the crtc
|
||||||
|
* timings in the mode to prevent the crtc fixup from overwriting them.
|
||||||
|
* Currently only lvds needs that. */
|
||||||
|
#define INTEL_MODE_CRTC_TIMINGS_SET (0x20)
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,
|
intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,
|
||||||
|
|
|
@ -279,6 +279,8 @@ void intel_fb_restore_mode(struct drm_device *dev)
|
||||||
struct drm_mode_config *config = &dev->mode_config;
|
struct drm_mode_config *config = &dev->mode_config;
|
||||||
struct drm_plane *plane;
|
struct drm_plane *plane;
|
||||||
|
|
||||||
|
mutex_lock(&dev->mode_config.mutex);
|
||||||
|
|
||||||
ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
|
ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
|
||||||
if (ret)
|
if (ret)
|
||||||
DRM_DEBUG("failed to restore crtc mode\n");
|
DRM_DEBUG("failed to restore crtc mode\n");
|
||||||
|
@ -286,4 +288,6 @@ void intel_fb_restore_mode(struct drm_device *dev)
|
||||||
/* Be sure to shut off any planes that may be active */
|
/* Be sure to shut off any planes that may be active */
|
||||||
list_for_each_entry(plane, &config->plane_list, head)
|
list_for_each_entry(plane, &config->plane_list, head)
|
||||||
plane->funcs->disable_plane(plane);
|
plane->funcs->disable_plane(plane);
|
||||||
|
|
||||||
|
mutex_unlock(&dev->mode_config.mutex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,6 +187,8 @@ centre_horizontally(struct drm_display_mode *mode,
|
||||||
|
|
||||||
mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos;
|
mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos;
|
||||||
mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width;
|
mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width;
|
||||||
|
|
||||||
|
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -208,6 +210,8 @@ centre_vertically(struct drm_display_mode *mode,
|
||||||
|
|
||||||
mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos;
|
mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos;
|
||||||
mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width;
|
mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width;
|
||||||
|
|
||||||
|
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 panel_fitter_scaling(u32 source, u32 target)
|
static inline u32 panel_fitter_scaling(u32 source, u32 target)
|
||||||
|
@ -283,6 +287,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
||||||
for_each_pipe(pipe)
|
for_each_pipe(pipe)
|
||||||
I915_WRITE(BCLRPAT(pipe), 0);
|
I915_WRITE(BCLRPAT(pipe), 0);
|
||||||
|
|
||||||
|
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
||||||
|
|
||||||
switch (intel_lvds->fitting_mode) {
|
switch (intel_lvds->fitting_mode) {
|
||||||
case DRM_MODE_SCALE_CENTER:
|
case DRM_MODE_SCALE_CENTER:
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -47,8 +47,6 @@ intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
|
||||||
adjusted_mode->vtotal = fixed_mode->vtotal;
|
adjusted_mode->vtotal = fixed_mode->vtotal;
|
||||||
|
|
||||||
adjusted_mode->clock = fixed_mode->clock;
|
adjusted_mode->clock = fixed_mode->clock;
|
||||||
|
|
||||||
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjusted_mode has been preset to be the panel's fixed mode */
|
/* adjusted_mode has been preset to be the panel's fixed mode */
|
||||||
|
|
Loading…
Reference in New Issue