diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 130 |
1 files changed, 95 insertions, 35 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d514719f65e2..1b1cf3b3ff51 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2245,6 +2245,33 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb, | |||
2245 | } | 2245 | } |
2246 | 2246 | ||
2247 | static int | 2247 | static int |
2248 | intel_finish_fb(struct drm_framebuffer *old_fb) | ||
2249 | { | ||
2250 | struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj; | ||
2251 | struct drm_i915_private *dev_priv = obj->base.dev->dev_private; | ||
2252 | bool was_interruptible = dev_priv->mm.interruptible; | ||
2253 | int ret; | ||
2254 | |||
2255 | wait_event(dev_priv->pending_flip_queue, | ||
2256 | atomic_read(&dev_priv->mm.wedged) || | ||
2257 | atomic_read(&obj->pending_flip) == 0); | ||
2258 | |||
2259 | /* Big Hammer, we also need to ensure that any pending | ||
2260 | * MI_WAIT_FOR_EVENT inside a user batch buffer on the | ||
2261 | * current scanout is retired before unpinning the old | ||
2262 | * framebuffer. | ||
2263 | * | ||
2264 | * This should only fail upon a hung GPU, in which case we | ||
2265 | * can safely continue. | ||
2266 | */ | ||
2267 | dev_priv->mm.interruptible = false; | ||
2268 | ret = i915_gem_object_finish_gpu(obj); | ||
2269 | dev_priv->mm.interruptible = was_interruptible; | ||
2270 | |||
2271 | return ret; | ||
2272 | } | ||
2273 | |||
2274 | static int | ||
2248 | intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | 2275 | intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, |
2249 | struct drm_framebuffer *old_fb) | 2276 | struct drm_framebuffer *old_fb) |
2250 | { | 2277 | { |
@@ -2282,25 +2309,8 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
2282 | return ret; | 2309 | return ret; |
2283 | } | 2310 | } |
2284 | 2311 | ||
2285 | if (old_fb) { | 2312 | if (old_fb) |
2286 | struct drm_i915_private *dev_priv = dev->dev_private; | 2313 | intel_finish_fb(old_fb); |
2287 | struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj; | ||
2288 | |||
2289 | wait_event(dev_priv->pending_flip_queue, | ||
2290 | atomic_read(&dev_priv->mm.wedged) || | ||
2291 | atomic_read(&obj->pending_flip) == 0); | ||
2292 | |||
2293 | /* Big Hammer, we also need to ensure that any pending | ||
2294 | * MI_WAIT_FOR_EVENT inside a user batch buffer on the | ||
2295 | * current scanout is retired before unpinning the old | ||
2296 | * framebuffer. | ||
2297 | * | ||
2298 | * This should only fail upon a hung GPU, in which case we | ||
2299 | * can safely continue. | ||
2300 | */ | ||
2301 | ret = i915_gem_object_finish_gpu(obj); | ||
2302 | (void) ret; | ||
2303 | } | ||
2304 | 2314 | ||
2305 | ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y, | 2315 | ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y, |
2306 | LEAVE_ATOMIC_MODE_SET); | 2316 | LEAVE_ATOMIC_MODE_SET); |
@@ -3371,6 +3381,23 @@ static void intel_crtc_disable(struct drm_crtc *crtc) | |||
3371 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | 3381 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |
3372 | struct drm_device *dev = crtc->dev; | 3382 | struct drm_device *dev = crtc->dev; |
3373 | 3383 | ||
3384 | /* Flush any pending WAITs before we disable the pipe. Note that | ||
3385 | * we need to drop the struct_mutex in order to acquire it again | ||
3386 | * during the lowlevel dpms routines around a couple of the | ||
3387 | * operations. It does not look trivial nor desirable to move | ||
3388 | * that locking higher. So instead we leave a window for the | ||
3389 | * submission of further commands on the fb before we can actually | ||
3390 | * disable it. This race with userspace exists anyway, and we can | ||
3391 | * only rely on the pipe being disabled by userspace after it | ||
3392 | * receives the hotplug notification and has flushed any pending | ||
3393 | * batches. | ||
3394 | */ | ||
3395 | if (crtc->fb) { | ||
3396 | mutex_lock(&dev->struct_mutex); | ||
3397 | intel_finish_fb(crtc->fb); | ||
3398 | mutex_unlock(&dev->struct_mutex); | ||
3399 | } | ||
3400 | |||
3374 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | 3401 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); |
3375 | assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane); | 3402 | assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane); |
3376 | assert_pipe_disabled(dev->dev_private, to_intel_crtc(crtc)->pipe); | 3403 | assert_pipe_disabled(dev->dev_private, to_intel_crtc(crtc)->pipe); |
@@ -3451,8 +3478,11 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc, | |||
3451 | return false; | 3478 | return false; |
3452 | } | 3479 | } |
3453 | 3480 | ||
3454 | /* All interlaced capable intel hw wants timings in frames. */ | 3481 | /* All interlaced capable intel hw wants timings in frames. Note though |
3455 | drm_mode_set_crtcinfo(adjusted_mode, 0); | 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); | ||
3456 | 3486 | ||
3457 | return true; | 3487 | return true; |
3458 | } | 3488 | } |
@@ -5539,7 +5569,8 @@ void ironlake_init_pch_refclk(struct drm_device *dev) | |||
5539 | if (intel_panel_use_ssc(dev_priv) && can_ssc) { | 5569 | if (intel_panel_use_ssc(dev_priv) && can_ssc) { |
5540 | DRM_DEBUG_KMS("Using SSC on panel\n"); | 5570 | DRM_DEBUG_KMS("Using SSC on panel\n"); |
5541 | temp |= DREF_SSC1_ENABLE; | 5571 | temp |= DREF_SSC1_ENABLE; |
5542 | } | 5572 | } else |
5573 | temp &= ~DREF_SSC1_ENABLE; | ||
5543 | 5574 | ||
5544 | /* Get SSC going before enabling the outputs */ | 5575 | /* Get SSC going before enabling the outputs */ |
5545 | I915_WRITE(PCH_DREF_CONTROL, temp); | 5576 | I915_WRITE(PCH_DREF_CONTROL, temp); |
@@ -7041,9 +7072,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
7041 | struct drm_device *dev = crtc->dev; | 7072 | struct drm_device *dev = crtc->dev; |
7042 | drm_i915_private_t *dev_priv = dev->dev_private; | 7073 | drm_i915_private_t *dev_priv = dev->dev_private; |
7043 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 7074 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
7044 | int pipe = intel_crtc->pipe; | ||
7045 | int dpll_reg = DPLL(pipe); | ||
7046 | int dpll = I915_READ(dpll_reg); | ||
7047 | 7075 | ||
7048 | if (HAS_PCH_SPLIT(dev)) | 7076 | if (HAS_PCH_SPLIT(dev)) |
7049 | return; | 7077 | return; |
@@ -7056,10 +7084,15 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
7056 | * the manual case. | 7084 | * the manual case. |
7057 | */ | 7085 | */ |
7058 | if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { | 7086 | if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { |
7087 | int pipe = intel_crtc->pipe; | ||
7088 | int dpll_reg = DPLL(pipe); | ||
7089 | u32 dpll; | ||
7090 | |||
7059 | DRM_DEBUG_DRIVER("downclocking LVDS\n"); | 7091 | DRM_DEBUG_DRIVER("downclocking LVDS\n"); |
7060 | 7092 | ||
7061 | assert_panel_unlocked(dev_priv, pipe); | 7093 | assert_panel_unlocked(dev_priv, pipe); |
7062 | 7094 | ||
7095 | dpll = I915_READ(dpll_reg); | ||
7063 | dpll |= DISPLAY_RATE_SELECT_FPA1; | 7096 | dpll |= DISPLAY_RATE_SELECT_FPA1; |
7064 | I915_WRITE(dpll_reg, dpll); | 7097 | I915_WRITE(dpll_reg, dpll); |
7065 | intel_wait_for_vblank(dev, pipe); | 7098 | intel_wait_for_vblank(dev, pipe); |
@@ -7067,7 +7100,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
7067 | if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) | 7100 | if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) |
7068 | DRM_DEBUG_DRIVER("failed to downclock LVDS!\n"); | 7101 | DRM_DEBUG_DRIVER("failed to downclock LVDS!\n"); |
7069 | } | 7102 | } |
7070 | |||
7071 | } | 7103 | } |
7072 | 7104 | ||
7073 | /** | 7105 | /** |
@@ -7437,7 +7469,13 @@ static int intel_gen6_queue_flip(struct drm_device *dev, | |||
7437 | OUT_RING(fb->pitches[0] | obj->tiling_mode); | 7469 | OUT_RING(fb->pitches[0] | obj->tiling_mode); |
7438 | OUT_RING(obj->gtt_offset); | 7470 | OUT_RING(obj->gtt_offset); |
7439 | 7471 | ||
7440 | pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; | 7472 | /* Contrary to the suggestions in the documentation, |
7473 | * "Enable Panel Fitter" does not seem to be required when page | ||
7474 | * flipping with a non-native mode, and worse causes a normal | ||
7475 | * modeset to fail. | ||
7476 | * pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; | ||
7477 | */ | ||
7478 | pf = 0; | ||
7441 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | 7479 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; |
7442 | OUT_RING(pf | pipesrc); | 7480 | OUT_RING(pf | pipesrc); |
7443 | ADVANCE_LP_RING(); | 7481 | ADVANCE_LP_RING(); |
@@ -7580,6 +7618,12 @@ static void intel_sanitize_modesetting(struct drm_device *dev, | |||
7580 | struct drm_i915_private *dev_priv = dev->dev_private; | 7618 | struct drm_i915_private *dev_priv = dev->dev_private; |
7581 | u32 reg, val; | 7619 | u32 reg, val; |
7582 | 7620 | ||
7621 | /* Clear any frame start delays used for debugging left by the BIOS */ | ||
7622 | for_each_pipe(pipe) { | ||
7623 | reg = PIPECONF(pipe); | ||
7624 | I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); | ||
7625 | } | ||
7626 | |||
7583 | if (HAS_PCH_SPLIT(dev)) | 7627 | if (HAS_PCH_SPLIT(dev)) |
7584 | return; | 7628 | return; |
7585 | 7629 | ||
@@ -8215,7 +8259,7 @@ void intel_init_emon(struct drm_device *dev) | |||
8215 | dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); | 8259 | dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); |
8216 | } | 8260 | } |
8217 | 8261 | ||
8218 | static bool intel_enable_rc6(struct drm_device *dev) | 8262 | static int intel_enable_rc6(struct drm_device *dev) |
8219 | { | 8263 | { |
8220 | /* | 8264 | /* |
8221 | * Respect the kernel parameter if it is set | 8265 | * Respect the kernel parameter if it is set |
@@ -8233,11 +8277,11 @@ static bool intel_enable_rc6(struct drm_device *dev) | |||
8233 | * Disable rc6 on Sandybridge | 8277 | * Disable rc6 on Sandybridge |
8234 | */ | 8278 | */ |
8235 | if (INTEL_INFO(dev)->gen == 6) { | 8279 | if (INTEL_INFO(dev)->gen == 6) { |
8236 | DRM_DEBUG_DRIVER("Sandybridge: RC6 disabled\n"); | 8280 | DRM_DEBUG_DRIVER("Sandybridge: deep RC6 disabled\n"); |
8237 | return 0; | 8281 | return INTEL_RC6_ENABLE; |
8238 | } | 8282 | } |
8239 | DRM_DEBUG_DRIVER("RC6 enabled\n"); | 8283 | DRM_DEBUG_DRIVER("RC6 and deep RC6 enabled\n"); |
8240 | return 1; | 8284 | return (INTEL_RC6_ENABLE | INTEL_RC6p_ENABLE); |
8241 | } | 8285 | } |
8242 | 8286 | ||
8243 | void gen6_enable_rps(struct drm_i915_private *dev_priv) | 8287 | void gen6_enable_rps(struct drm_i915_private *dev_priv) |
@@ -8247,6 +8291,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
8247 | u32 pcu_mbox, rc6_mask = 0; | 8291 | u32 pcu_mbox, rc6_mask = 0; |
8248 | u32 gtfifodbg; | 8292 | u32 gtfifodbg; |
8249 | int cur_freq, min_freq, max_freq; | 8293 | int cur_freq, min_freq, max_freq; |
8294 | int rc6_mode; | ||
8250 | int i; | 8295 | int i; |
8251 | 8296 | ||
8252 | /* Here begins a magic sequence of register writes to enable | 8297 | /* Here begins a magic sequence of register writes to enable |
@@ -8284,9 +8329,20 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
8284 | I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); | 8329 | I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); |
8285 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 8330 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ |
8286 | 8331 | ||
8287 | if (intel_enable_rc6(dev_priv->dev)) | 8332 | rc6_mode = intel_enable_rc6(dev_priv->dev); |
8288 | rc6_mask = GEN6_RC_CTL_RC6_ENABLE | | 8333 | if (rc6_mode & INTEL_RC6_ENABLE) |
8289 | ((IS_GEN7(dev_priv->dev)) ? GEN6_RC_CTL_RC6p_ENABLE : 0); | 8334 | rc6_mask |= GEN6_RC_CTL_RC6_ENABLE; |
8335 | |||
8336 | if (rc6_mode & INTEL_RC6p_ENABLE) | ||
8337 | rc6_mask |= GEN6_RC_CTL_RC6p_ENABLE; | ||
8338 | |||
8339 | if (rc6_mode & INTEL_RC6pp_ENABLE) | ||
8340 | rc6_mask |= GEN6_RC_CTL_RC6pp_ENABLE; | ||
8341 | |||
8342 | DRM_INFO("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n", | ||
8343 | (rc6_mode & INTEL_RC6_ENABLE) ? "on" : "off", | ||
8344 | (rc6_mode & INTEL_RC6p_ENABLE) ? "on" : "off", | ||
8345 | (rc6_mode & INTEL_RC6pp_ENABLE) ? "on" : "off"); | ||
8290 | 8346 | ||
8291 | I915_WRITE(GEN6_RC_CONTROL, | 8347 | I915_WRITE(GEN6_RC_CONTROL, |
8292 | rc6_mask | | 8348 | rc6_mask | |
@@ -8510,6 +8566,10 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
8510 | I915_WRITE(WM2_LP_ILK, 0); | 8566 | I915_WRITE(WM2_LP_ILK, 0); |
8511 | I915_WRITE(WM1_LP_ILK, 0); | 8567 | I915_WRITE(WM1_LP_ILK, 0); |
8512 | 8568 | ||
8569 | I915_WRITE(GEN6_UCGCTL1, | ||
8570 | I915_READ(GEN6_UCGCTL1) | | ||
8571 | GEN6_BLBUNIT_CLOCK_GATE_DISABLE); | ||
8572 | |||
8513 | /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock | 8573 | /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock |
8514 | * gating disable must be set. Failure to set it results in | 8574 | * gating disable must be set. Failure to set it results in |
8515 | * flickering pixels due to Z write ordering failures after | 8575 | * flickering pixels due to Z write ordering failures after |