diff options
author | Dave Airlie <airlied@redhat.com> | 2011-05-19 21:30:02 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-05-19 21:30:02 -0400 |
commit | 351fc4d660ff134fc33b920e1a3a97de4923dd91 (patch) | |
tree | e148a145b28c2a39ff8df22509c249c35dd78747 /drivers/gpu | |
parent | fb0b760605d1f3bb7afc83ffd7a770f92bb62fca (diff) | |
parent | 9e3c256d7d56a12a3242222945ce8e6347f93fa0 (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.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 50 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 10 |
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); | |||
52 | unsigned int i915_semaphores = 1; | 52 | unsigned int i915_semaphores = 1; |
53 | module_param_named(semaphores, i915_semaphores, int, 0600); | 53 | module_param_named(semaphores, i915_semaphores, int, 0600); |
54 | 54 | ||
55 | unsigned int i915_enable_rc6 = 0; | 55 | unsigned int i915_enable_rc6 = 1; |
56 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); | 56 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); |
57 | 57 | ||
58 | unsigned int i915_enable_fbc = 0; | ||
59 | module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600); | ||
60 | |||
58 | unsigned int i915_lvds_downclock = 0; | 61 | unsigned int i915_lvds_downclock = 0; |
59 | module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); | 62 | module_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 = { | |||
169 | static const struct intel_device_info intel_ironlake_m_info = { | 172 | static 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 | ||
255 | enum intel_pch { | 256 | enum intel_pch { |
@@ -995,6 +996,7 @@ extern unsigned int i915_lvds_downclock; | |||
995 | extern unsigned int i915_panel_use_ssc; | 996 | extern unsigned int i915_panel_use_ssc; |
996 | extern int i915_vbt_sdvo_panel_type; | 997 | extern int i915_vbt_sdvo_panel_type; |
997 | extern unsigned int i915_enable_rc6; | 998 | extern unsigned int i915_enable_rc6; |
999 | extern unsigned int i915_enable_fbc; | ||
998 | 1000 | ||
999 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); | 1001 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); |
1000 | extern int i915_resume(struct drm_device *dev); | 1002 | extern 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 | ||
623 | static bool | 623 | static bool |
624 | ring_get_irq(struct intel_ring_buffer *ring, u32 flag) | 624 | gen6_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 | ||
640 | static void | 643 | static void |
641 | ring_put_irq(struct intel_ring_buffer *ring, u32 flag) | 644 | gen6_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 | ||
652 | static bool | 658 | static bool |
653 | gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) | 659 | bsd_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 | |||
672 | static void | 678 | static void |
673 | gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) | 679 | bsd_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 | ||
687 | static bool | ||
688 | bsd_ring_get_irq(struct intel_ring_buffer *ring) | ||
689 | { | ||
690 | return ring_get_irq(ring, GT_BSD_USER_INTERRUPT); | ||
691 | } | ||
692 | static void | ||
693 | bsd_ring_put_irq(struct intel_ring_buffer *ring) | ||
694 | { | ||
695 | ring_put_irq(ring, GT_BSD_USER_INTERRUPT); | ||
696 | } | ||
697 | |||
698 | static int | 694 | static int |
699 | ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length) | 695 | ring_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; |