diff options
| -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; |
