Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel into drm-next

A bunch of fixes, nothing truely horrible:
- Fix PCH irq handling race which resulted in missed gmbus/dp aux irqs
and subsequent fallout (Paulo)
- Fixup off-by-one in our hsw id table (Kenneth)
- Fixup ilk rc6 support (disabled by default), regression introduced in
3.8
- g4x plane w/a from Egbert Eich
- gen2/3/4 dpms suspend/standy fixes for VGA outputs from Patrik Jakobsson
- Workaround dying ivb machines with less aggressive rc6 values (Stéphane
Marchesin)

* 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel:
drm/i915: Turn off hsync and vsync on ADPA when disabling crt
drm/i915: Fix incorrect definition of ADPA HSYNC and VSYNC bits
drm/i915: also disable south interrupts when handling them
drm/i915: enable irqs earlier when resuming
drm/i915: Increase the RC6p threshold.
DRM/i915: On G45 enable cursor plane briefly after enabling the display plane.
drm/i915: Fix Haswell/CRW PCI IDs.
drm/i915: Don't clobber crtc->fb when queue_flip fails
drm/i915: wait_event_timeout's timeout is in jiffies
drm/i915: Fix missing variable initilization

+79 -22
+18 -7
drivers/gpu/drm/i915/i915_drv.c
··· 379 379 INTEL_VGA_DEVICE(0x0A06, &intel_haswell_m_info), /* ULT GT1 mobile */ 380 380 INTEL_VGA_DEVICE(0x0A16, &intel_haswell_m_info), /* ULT GT2 mobile */ 381 381 INTEL_VGA_DEVICE(0x0A26, &intel_haswell_m_info), /* ULT GT2 mobile */ 382 - INTEL_VGA_DEVICE(0x0D12, &intel_haswell_d_info), /* CRW GT1 desktop */ 382 + INTEL_VGA_DEVICE(0x0D02, &intel_haswell_d_info), /* CRW GT1 desktop */ 383 + INTEL_VGA_DEVICE(0x0D12, &intel_haswell_d_info), /* CRW GT2 desktop */ 383 384 INTEL_VGA_DEVICE(0x0D22, &intel_haswell_d_info), /* CRW GT2 desktop */ 384 - INTEL_VGA_DEVICE(0x0D32, &intel_haswell_d_info), /* CRW GT2 desktop */ 385 - INTEL_VGA_DEVICE(0x0D1A, &intel_haswell_d_info), /* CRW GT1 server */ 385 + INTEL_VGA_DEVICE(0x0D0A, &intel_haswell_d_info), /* CRW GT1 server */ 386 + INTEL_VGA_DEVICE(0x0D1A, &intel_haswell_d_info), /* CRW GT2 server */ 386 387 INTEL_VGA_DEVICE(0x0D2A, &intel_haswell_d_info), /* CRW GT2 server */ 387 - INTEL_VGA_DEVICE(0x0D3A, &intel_haswell_d_info), /* CRW GT2 server */ 388 - INTEL_VGA_DEVICE(0x0D16, &intel_haswell_m_info), /* CRW GT1 mobile */ 388 + INTEL_VGA_DEVICE(0x0D06, &intel_haswell_m_info), /* CRW GT1 mobile */ 389 + INTEL_VGA_DEVICE(0x0D16, &intel_haswell_m_info), /* CRW GT2 mobile */ 389 390 INTEL_VGA_DEVICE(0x0D26, &intel_haswell_m_info), /* CRW GT2 mobile */ 390 - INTEL_VGA_DEVICE(0x0D36, &intel_haswell_m_info), /* CRW GT2 mobile */ 391 391 INTEL_VGA_DEVICE(0x0f30, &intel_valleyview_m_info), 392 392 INTEL_VGA_DEVICE(0x0157, &intel_valleyview_m_info), 393 393 INTEL_VGA_DEVICE(0x0155, &intel_valleyview_d_info), ··· 495 495 intel_modeset_disable(dev); 496 496 497 497 drm_irq_uninstall(dev); 498 + dev_priv->enable_hotplug_processing = false; 498 499 } 499 500 500 501 i915_save_state(dev); ··· 569 568 error = i915_gem_init_hw(dev); 570 569 mutex_unlock(&dev->struct_mutex); 571 570 571 + /* We need working interrupts for modeset enabling ... */ 572 + drm_irq_install(dev); 573 + 572 574 intel_modeset_init_hw(dev); 573 575 intel_modeset_setup_hw_state(dev, false); 574 - drm_irq_install(dev); 576 + 577 + /* 578 + * ... but also need to make sure that hotplug processing 579 + * doesn't cause havoc. Like in the driver load code we don't 580 + * bother with the tiny race here where we might loose hotplug 581 + * notifications. 582 + * */ 575 583 intel_hpd_init(dev); 584 + dev_priv->enable_hotplug_processing = true; 576 585 } 577 586 578 587 intel_opregion_init(dev);
+24 -2
drivers/gpu/drm/i915/i915_irq.c
··· 701 701 { 702 702 struct drm_device *dev = (struct drm_device *) arg; 703 703 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 704 - u32 de_iir, gt_iir, de_ier, pm_iir; 704 + u32 de_iir, gt_iir, de_ier, pm_iir, sde_ier; 705 705 irqreturn_t ret = IRQ_NONE; 706 706 int i; 707 707 ··· 710 710 /* disable master interrupt before clearing iir */ 711 711 de_ier = I915_READ(DEIER); 712 712 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); 713 + 714 + /* Disable south interrupts. We'll only write to SDEIIR once, so further 715 + * interrupts will will be stored on its back queue, and then we'll be 716 + * able to process them after we restore SDEIER (as soon as we restore 717 + * it, we'll get an interrupt if SDEIIR still has something to process 718 + * due to its back queue). */ 719 + sde_ier = I915_READ(SDEIER); 720 + I915_WRITE(SDEIER, 0); 721 + POSTING_READ(SDEIER); 713 722 714 723 gt_iir = I915_READ(GTIIR); 715 724 if (gt_iir) { ··· 768 759 769 760 I915_WRITE(DEIER, de_ier); 770 761 POSTING_READ(DEIER); 762 + I915_WRITE(SDEIER, sde_ier); 763 + POSTING_READ(SDEIER); 771 764 772 765 return ret; 773 766 } ··· 789 778 struct drm_device *dev = (struct drm_device *) arg; 790 779 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 791 780 int ret = IRQ_NONE; 792 - u32 de_iir, gt_iir, de_ier, pm_iir; 781 + u32 de_iir, gt_iir, de_ier, pm_iir, sde_ier; 793 782 794 783 atomic_inc(&dev_priv->irq_received); 795 784 ··· 797 786 de_ier = I915_READ(DEIER); 798 787 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); 799 788 POSTING_READ(DEIER); 789 + 790 + /* Disable south interrupts. We'll only write to SDEIIR once, so further 791 + * interrupts will will be stored on its back queue, and then we'll be 792 + * able to process them after we restore SDEIER (as soon as we restore 793 + * it, we'll get an interrupt if SDEIIR still has something to process 794 + * due to its back queue). */ 795 + sde_ier = I915_READ(SDEIER); 796 + I915_WRITE(SDEIER, 0); 797 + POSTING_READ(SDEIER); 800 798 801 799 de_iir = I915_READ(DEIIR); 802 800 gt_iir = I915_READ(GTIIR); ··· 869 849 done: 870 850 I915_WRITE(DEIER, de_ier); 871 851 POSTING_READ(DEIER); 852 + I915_WRITE(SDEIER, sde_ier); 853 + POSTING_READ(SDEIER); 872 854 873 855 return ret; 874 856 }
+2 -2
drivers/gpu/drm/i915/i915_reg.h
··· 1613 1613 #define ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16) 1614 1614 #define ADPA_USE_VGA_HVPOLARITY (1<<15) 1615 1615 #define ADPA_SETS_HVPOLARITY 0 1616 - #define ADPA_VSYNC_CNTL_DISABLE (1<<11) 1616 + #define ADPA_VSYNC_CNTL_DISABLE (1<<10) 1617 1617 #define ADPA_VSYNC_CNTL_ENABLE 0 1618 - #define ADPA_HSYNC_CNTL_DISABLE (1<<10) 1618 + #define ADPA_HSYNC_CNTL_DISABLE (1<<11) 1619 1619 #define ADPA_HSYNC_CNTL_ENABLE 0 1620 1620 #define ADPA_VSYNC_ACTIVE_HIGH (1<<4) 1621 1621 #define ADPA_VSYNC_ACTIVE_LOW 0
+1 -1
drivers/gpu/drm/i915/intel_crt.c
··· 88 88 u32 temp; 89 89 90 90 temp = I915_READ(crt->adpa_reg); 91 - temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE); 91 + temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE; 92 92 temp &= ~ADPA_DAC_ENABLE; 93 93 I915_WRITE(crt->adpa_reg, temp); 94 94 }
+1 -1
drivers/gpu/drm/i915/intel_ddi.c
··· 1391 1391 struct intel_dp *intel_dp = &intel_dig_port->dp; 1392 1392 struct drm_i915_private *dev_priv = encoder->dev->dev_private; 1393 1393 enum port port = intel_dig_port->port; 1394 - bool wait; 1395 1394 uint32_t val; 1395 + bool wait = false; 1396 1396 1397 1397 if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) { 1398 1398 val = I915_READ(DDI_BUF_CTL(port));
+30 -7
drivers/gpu/drm/i915/intel_display.c
··· 3604 3604 */ 3605 3605 } 3606 3606 3607 + /** 3608 + * i9xx_fixup_plane - ugly workaround for G45 to fire up the hardware 3609 + * cursor plane briefly if not already running after enabling the display 3610 + * plane. 3611 + * This workaround avoids occasional blank screens when self refresh is 3612 + * enabled. 3613 + */ 3614 + static void 3615 + g4x_fixup_plane(struct drm_i915_private *dev_priv, enum pipe pipe) 3616 + { 3617 + u32 cntl = I915_READ(CURCNTR(pipe)); 3618 + 3619 + if ((cntl & CURSOR_MODE) == 0) { 3620 + u32 fw_bcl_self = I915_READ(FW_BLC_SELF); 3621 + 3622 + I915_WRITE(FW_BLC_SELF, fw_bcl_self & ~FW_BLC_SELF_EN); 3623 + I915_WRITE(CURCNTR(pipe), CURSOR_MODE_64_ARGB_AX); 3624 + intel_wait_for_vblank(dev_priv->dev, pipe); 3625 + I915_WRITE(CURCNTR(pipe), cntl); 3626 + I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe))); 3627 + I915_WRITE(FW_BLC_SELF, fw_bcl_self); 3628 + } 3629 + } 3630 + 3607 3631 static void i9xx_crtc_enable(struct drm_crtc *crtc) 3608 3632 { 3609 3633 struct drm_device *dev = crtc->dev; ··· 3653 3629 3654 3630 intel_enable_pipe(dev_priv, pipe, false); 3655 3631 intel_enable_plane(dev_priv, plane, pipe); 3632 + if (IS_G4X(dev)) 3633 + g4x_fixup_plane(dev_priv, pipe); 3656 3634 3657 3635 intel_crtc_load_lut(crtc); 3658 3636 intel_update_fbc(dev); ··· 7282 7256 { 7283 7257 struct drm_device *dev = crtc->dev; 7284 7258 struct drm_i915_private *dev_priv = dev->dev_private; 7285 - struct intel_framebuffer *intel_fb; 7286 - struct drm_i915_gem_object *obj; 7259 + struct drm_framebuffer *old_fb = crtc->fb; 7260 + struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj; 7287 7261 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 7288 7262 struct intel_unpin_work *work; 7289 7263 unsigned long flags; ··· 7308 7282 7309 7283 work->event = event; 7310 7284 work->crtc = crtc; 7311 - intel_fb = to_intel_framebuffer(crtc->fb); 7312 - work->old_fb_obj = intel_fb->obj; 7285 + work->old_fb_obj = to_intel_framebuffer(old_fb)->obj; 7313 7286 INIT_WORK(&work->work, intel_unpin_work_fn); 7314 7287 7315 7288 ret = drm_vblank_get(dev, intel_crtc->pipe); ··· 7327 7302 } 7328 7303 intel_crtc->unpin_work = work; 7329 7304 spin_unlock_irqrestore(&dev->event_lock, flags); 7330 - 7331 - intel_fb = to_intel_framebuffer(fb); 7332 - obj = intel_fb->obj; 7333 7305 7334 7306 if (atomic_read(&intel_crtc->unpin_work_count) >= 2) 7335 7307 flush_workqueue(dev_priv->wq); ··· 7362 7340 7363 7341 cleanup_pending: 7364 7342 atomic_dec(&intel_crtc->unpin_work_count); 7343 + crtc->fb = old_fb; 7365 7344 drm_gem_object_unreference(&work->old_fb_obj->base); 7366 7345 drm_gem_object_unreference(&obj->base); 7367 7346 mutex_unlock(&dev->struct_mutex);
+2 -1
drivers/gpu/drm/i915/intel_dp.c
··· 353 353 354 354 #define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0) 355 355 if (has_aux_irq) 356 - done = wait_event_timeout(dev_priv->gmbus_wait_queue, C, 10); 356 + done = wait_event_timeout(dev_priv->gmbus_wait_queue, C, 357 + msecs_to_jiffies(10)); 357 358 else 358 359 done = wait_for_atomic(C, 10) == 0; 359 360 if (!done)
+1 -1
drivers/gpu/drm/i915/intel_pm.c
··· 2574 2574 I915_WRITE(GEN6_RC_SLEEP, 0); 2575 2575 I915_WRITE(GEN6_RC1e_THRESHOLD, 1000); 2576 2576 I915_WRITE(GEN6_RC6_THRESHOLD, 50000); 2577 - I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); 2577 + I915_WRITE(GEN6_RC6p_THRESHOLD, 150000); 2578 2578 I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ 2579 2579 2580 2580 /* Check if we are enabling RC6 */