aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-05-19 21:30:02 -0400
committerDave Airlie <airlied@redhat.com>2011-05-19 21:30:02 -0400
commit351fc4d660ff134fc33b920e1a3a97de4923dd91 (patch)
treee148a145b28c2a39ff8df22509c249c35dd78747 /drivers/gpu
parentfb0b760605d1f3bb7afc83ffd7a770f92bb62fca (diff)
parent9e3c256d7d56a12a3242222945ce8e6347f93fa0 (diff)
Merge remote branch 'keithp/drm-intel-next' of ../drm-next into drm-core-next
* 'keithp/drm-intel-next' of ../drm-next: drm/i915: initialize gen6 rps work queue on Sandy Bridge and Ivy Bridge drm/i915/sdvo: Reorder i2c initialisation before ddc proxy drm/i915: FDI link training broken on Ironlake by Ivybridge integration drm/i915: enable rc6 by default drm/i915: add fbc enable flag, but disable by default drm/i915: clean up unused ring_get_irq/ring_put_irq functions drm/i915: fix user irq miss in BSD ring on g4x
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c3
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c7
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c3
-rw-r--r--drivers/gpu/drm/i915/intel_display.c13
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c50
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c10
7 files changed, 48 insertions, 40 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 183eaac8980a..51c2257b11e6 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1065,6 +1065,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
1065 case FBC_MULTIPLE_PIPES: 1065 case FBC_MULTIPLE_PIPES:
1066 seq_printf(m, "multiple pipes are enabled"); 1066 seq_printf(m, "multiple pipes are enabled");
1067 break; 1067 break;
1068 case FBC_MODULE_PARAM:
1069 seq_printf(m, "disabled per module param (default off)");
1070 break;
1068 default: 1071 default:
1069 seq_printf(m, "unknown reason"); 1072 seq_printf(m, "unknown reason");
1070 } 1073 }
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 8c4fcbb8a4cb..817fd9cbb113 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -52,9 +52,12 @@ module_param_named(powersave, i915_powersave, int, 0600);
52unsigned int i915_semaphores = 1; 52unsigned int i915_semaphores = 1;
53module_param_named(semaphores, i915_semaphores, int, 0600); 53module_param_named(semaphores, i915_semaphores, int, 0600);
54 54
55unsigned int i915_enable_rc6 = 0; 55unsigned int i915_enable_rc6 = 1;
56module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); 56module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);
57 57
58unsigned int i915_enable_fbc = 0;
59module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600);
60
58unsigned int i915_lvds_downclock = 0; 61unsigned int i915_lvds_downclock = 0;
59module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); 62module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
60 63
@@ -169,7 +172,7 @@ static const struct intel_device_info intel_ironlake_d_info = {
169static const struct intel_device_info intel_ironlake_m_info = { 172static const struct intel_device_info intel_ironlake_m_info = {
170 .gen = 5, .is_mobile = 1, 173 .gen = 5, .is_mobile = 1,
171 .need_gfx_hws = 1, .has_hotplug = 1, 174 .need_gfx_hws = 1, .has_hotplug = 1,
172 .has_fbc = 0, /* disabled due to buggy hardware */ 175 .has_fbc = 1,
173 .has_bsd_ring = 1, 176 .has_bsd_ring = 1,
174}; 177};
175 178
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3a1c27718065..ee660355ae68 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -250,6 +250,7 @@ enum no_fbc_reason {
250 FBC_BAD_PLANE, /* fbc not supported on plane */ 250 FBC_BAD_PLANE, /* fbc not supported on plane */
251 FBC_NOT_TILED, /* buffer not tiled */ 251 FBC_NOT_TILED, /* buffer not tiled */
252 FBC_MULTIPLE_PIPES, /* more than one pipe active */ 252 FBC_MULTIPLE_PIPES, /* more than one pipe active */
253 FBC_MODULE_PARAM,
253}; 254};
254 255
255enum intel_pch { 256enum intel_pch {
@@ -995,6 +996,7 @@ extern unsigned int i915_lvds_downclock;
995extern unsigned int i915_panel_use_ssc; 996extern unsigned int i915_panel_use_ssc;
996extern int i915_vbt_sdvo_panel_type; 997extern int i915_vbt_sdvo_panel_type;
997extern unsigned int i915_enable_rc6; 998extern unsigned int i915_enable_rc6;
999extern unsigned int i915_enable_fbc;
998 1000
999extern int i915_suspend(struct drm_device *dev, pm_message_t state); 1001extern int i915_suspend(struct drm_device *dev, pm_message_t state);
1000extern int i915_resume(struct drm_device *dev); 1002extern int i915_resume(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 349a03e48481..b79619a7b788 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1736,6 +1736,8 @@ void ironlake_irq_preinstall(struct drm_device *dev)
1736 1736
1737 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 1737 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
1738 INIT_WORK(&dev_priv->error_work, i915_error_work_func); 1738 INIT_WORK(&dev_priv->error_work, i915_error_work_func);
1739 if (IS_GEN6(dev) || IS_IVYBRIDGE(dev))
1740 INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
1739 1741
1740 I915_WRITE(HWSTAM, 0xeffe); 1742 I915_WRITE(HWSTAM, 0xeffe);
1741 1743
@@ -1887,7 +1889,6 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
1887 1889
1888 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 1890 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
1889 INIT_WORK(&dev_priv->error_work, i915_error_work_func); 1891 INIT_WORK(&dev_priv->error_work, i915_error_work_func);
1890 INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
1891 1892
1892 if (I915_HAS_HOTPLUG(dev)) { 1893 if (I915_HAS_HOTPLUG(dev)) {
1893 I915_WRITE(PORT_HOTPLUG_EN, 0); 1894 I915_WRITE(PORT_HOTPLUG_EN, 0);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 565eb2cc0042..311fffede6f8 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1731,6 +1731,11 @@ static void intel_update_fbc(struct drm_device *dev)
1731 intel_fb = to_intel_framebuffer(fb); 1731 intel_fb = to_intel_framebuffer(fb);
1732 obj = intel_fb->obj; 1732 obj = intel_fb->obj;
1733 1733
1734 if (!i915_enable_fbc) {
1735 DRM_DEBUG_KMS("fbc disabled per module param (default off)\n");
1736 dev_priv->no_fbc_reason = FBC_MODULE_PARAM;
1737 goto out_disable;
1738 }
1734 if (intel_fb->obj->base.size > dev_priv->cfb_size) { 1739 if (intel_fb->obj->base.size > dev_priv->cfb_size) {
1735 DRM_DEBUG_KMS("framebuffer too large, disabling " 1740 DRM_DEBUG_KMS("framebuffer too large, disabling "
1736 "compression\n"); 1741 "compression\n");
@@ -2051,12 +2056,12 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
2051 /* enable normal train */ 2056 /* enable normal train */
2052 reg = FDI_TX_CTL(pipe); 2057 reg = FDI_TX_CTL(pipe);
2053 temp = I915_READ(reg); 2058 temp = I915_READ(reg);
2054 if (IS_GEN6(dev)) { 2059 if (IS_IVYBRIDGE(dev)) {
2055 temp &= ~FDI_LINK_TRAIN_NONE;
2056 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
2057 } else if (IS_IVYBRIDGE(dev)) {
2058 temp &= ~FDI_LINK_TRAIN_NONE_IVB; 2060 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
2059 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE; 2061 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
2062 } else {
2063 temp &= ~FDI_LINK_TRAIN_NONE;
2064 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
2060 } 2065 }
2061 I915_WRITE(reg, temp); 2066 I915_WRITE(reg, temp);
2062 2067
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 3971b5e6ad60..95c4b1429935 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -621,7 +621,7 @@ ring_add_request(struct intel_ring_buffer *ring,
621} 621}
622 622
623static bool 623static bool
624ring_get_irq(struct intel_ring_buffer *ring, u32 flag) 624gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
625{ 625{
626 struct drm_device *dev = ring->dev; 626 struct drm_device *dev = ring->dev;
627 drm_i915_private_t *dev_priv = dev->dev_private; 627 drm_i915_private_t *dev_priv = dev->dev_private;
@@ -630,71 +630,67 @@ ring_get_irq(struct intel_ring_buffer *ring, u32 flag)
630 return false; 630 return false;
631 631
632 spin_lock(&ring->irq_lock); 632 spin_lock(&ring->irq_lock);
633 if (ring->irq_refcount++ == 0) 633 if (ring->irq_refcount++ == 0) {
634 ironlake_enable_irq(dev_priv, flag); 634 ring->irq_mask &= ~rflag;
635 I915_WRITE_IMR(ring, ring->irq_mask);
636 ironlake_enable_irq(dev_priv, gflag);
637 }
635 spin_unlock(&ring->irq_lock); 638 spin_unlock(&ring->irq_lock);
636 639
637 return true; 640 return true;
638} 641}
639 642
640static void 643static void
641ring_put_irq(struct intel_ring_buffer *ring, u32 flag) 644gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
642{ 645{
643 struct drm_device *dev = ring->dev; 646 struct drm_device *dev = ring->dev;
644 drm_i915_private_t *dev_priv = dev->dev_private; 647 drm_i915_private_t *dev_priv = dev->dev_private;
645 648
646 spin_lock(&ring->irq_lock); 649 spin_lock(&ring->irq_lock);
647 if (--ring->irq_refcount == 0) 650 if (--ring->irq_refcount == 0) {
648 ironlake_disable_irq(dev_priv, flag); 651 ring->irq_mask |= rflag;
652 I915_WRITE_IMR(ring, ring->irq_mask);
653 ironlake_disable_irq(dev_priv, gflag);
654 }
649 spin_unlock(&ring->irq_lock); 655 spin_unlock(&ring->irq_lock);
650} 656}
651 657
652static bool 658static bool
653gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) 659bsd_ring_get_irq(struct intel_ring_buffer *ring)
654{ 660{
655 struct drm_device *dev = ring->dev; 661 struct drm_device *dev = ring->dev;
656 drm_i915_private_t *dev_priv = dev->dev_private; 662 drm_i915_private_t *dev_priv = dev->dev_private;
657 663
658 if (!dev->irq_enabled) 664 if (!dev->irq_enabled)
659 return false; 665 return false;
660 666
661 spin_lock(&ring->irq_lock); 667 spin_lock(&ring->irq_lock);
662 if (ring->irq_refcount++ == 0) { 668 if (ring->irq_refcount++ == 0) {
663 ring->irq_mask &= ~rflag; 669 if (IS_G4X(dev))
664 I915_WRITE_IMR(ring, ring->irq_mask); 670 i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
665 ironlake_enable_irq(dev_priv, gflag); 671 else
672 ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
666 } 673 }
667 spin_unlock(&ring->irq_lock); 674 spin_unlock(&ring->irq_lock);
668 675
669 return true; 676 return true;
670} 677}
671
672static void 678static void
673gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) 679bsd_ring_put_irq(struct intel_ring_buffer *ring)
674{ 680{
675 struct drm_device *dev = ring->dev; 681 struct drm_device *dev = ring->dev;
676 drm_i915_private_t *dev_priv = dev->dev_private; 682 drm_i915_private_t *dev_priv = dev->dev_private;
677 683
678 spin_lock(&ring->irq_lock); 684 spin_lock(&ring->irq_lock);
679 if (--ring->irq_refcount == 0) { 685 if (--ring->irq_refcount == 0) {
680 ring->irq_mask |= rflag; 686 if (IS_G4X(dev))
681 I915_WRITE_IMR(ring, ring->irq_mask); 687 i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
682 ironlake_disable_irq(dev_priv, gflag); 688 else
689 ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
683 } 690 }
684 spin_unlock(&ring->irq_lock); 691 spin_unlock(&ring->irq_lock);
685} 692}
686 693
687static bool
688bsd_ring_get_irq(struct intel_ring_buffer *ring)
689{
690 return ring_get_irq(ring, GT_BSD_USER_INTERRUPT);
691}
692static void
693bsd_ring_put_irq(struct intel_ring_buffer *ring)
694{
695 ring_put_irq(ring, GT_BSD_USER_INTERRUPT);
696}
697
698static int 694static int
699ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length) 695ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
700{ 696{
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 4324f33212d6..754086f83941 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2544,21 +2544,19 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
2544 if (!intel_sdvo) 2544 if (!intel_sdvo)
2545 return false; 2545 return false;
2546 2546
2547 intel_sdvo->sdvo_reg = sdvo_reg;
2548 intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg) >> 1;
2549 intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg);
2547 if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) { 2550 if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) {
2548 kfree(intel_sdvo); 2551 kfree(intel_sdvo);
2549 return false; 2552 return false;
2550 } 2553 }
2551 2554
2552 intel_sdvo->sdvo_reg = sdvo_reg; 2555 /* encoder type will be decided later */
2553
2554 intel_encoder = &intel_sdvo->base; 2556 intel_encoder = &intel_sdvo->base;
2555 intel_encoder->type = INTEL_OUTPUT_SDVO; 2557 intel_encoder->type = INTEL_OUTPUT_SDVO;
2556 /* encoder type will be decided later */
2557 drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0); 2558 drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0);
2558 2559
2559 intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg) >> 1;
2560 intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg);
2561
2562 /* Read the regs to test if we can talk to the device */ 2560 /* Read the regs to test if we can talk to the device */
2563 for (i = 0; i < 0x40; i++) { 2561 for (i = 0; i < 0x40; i++) {
2564 u8 byte; 2562 u8 byte;