提交 351fc4d6 编写于 作者: D Dave Airlie

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
...@@ -1065,6 +1065,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused) ...@@ -1065,6 +1065,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
case FBC_MULTIPLE_PIPES: case FBC_MULTIPLE_PIPES:
seq_printf(m, "multiple pipes are enabled"); seq_printf(m, "multiple pipes are enabled");
break; break;
case FBC_MODULE_PARAM:
seq_printf(m, "disabled per module param (default off)");
break;
default: default:
seq_printf(m, "unknown reason"); seq_printf(m, "unknown reason");
} }
......
...@@ -52,9 +52,12 @@ module_param_named(powersave, i915_powersave, int, 0600); ...@@ -52,9 +52,12 @@ module_param_named(powersave, i915_powersave, int, 0600);
unsigned int i915_semaphores = 1; unsigned int i915_semaphores = 1;
module_param_named(semaphores, i915_semaphores, int, 0600); module_param_named(semaphores, i915_semaphores, int, 0600);
unsigned int i915_enable_rc6 = 0; unsigned int i915_enable_rc6 = 1;
module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);
unsigned int i915_enable_fbc = 0;
module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600);
unsigned int i915_lvds_downclock = 0; unsigned int i915_lvds_downclock = 0;
module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
...@@ -169,7 +172,7 @@ static const struct intel_device_info intel_ironlake_d_info = { ...@@ -169,7 +172,7 @@ static const struct intel_device_info intel_ironlake_d_info = {
static const struct intel_device_info intel_ironlake_m_info = { static const struct intel_device_info intel_ironlake_m_info = {
.gen = 5, .is_mobile = 1, .gen = 5, .is_mobile = 1,
.need_gfx_hws = 1, .has_hotplug = 1, .need_gfx_hws = 1, .has_hotplug = 1,
.has_fbc = 0, /* disabled due to buggy hardware */ .has_fbc = 1,
.has_bsd_ring = 1, .has_bsd_ring = 1,
}; };
......
...@@ -250,6 +250,7 @@ enum no_fbc_reason { ...@@ -250,6 +250,7 @@ enum no_fbc_reason {
FBC_BAD_PLANE, /* fbc not supported on plane */ FBC_BAD_PLANE, /* fbc not supported on plane */
FBC_NOT_TILED, /* buffer not tiled */ FBC_NOT_TILED, /* buffer not tiled */
FBC_MULTIPLE_PIPES, /* more than one pipe active */ FBC_MULTIPLE_PIPES, /* more than one pipe active */
FBC_MODULE_PARAM,
}; };
enum intel_pch { enum intel_pch {
...@@ -995,6 +996,7 @@ extern unsigned int i915_lvds_downclock; ...@@ -995,6 +996,7 @@ extern unsigned int i915_lvds_downclock;
extern unsigned int i915_panel_use_ssc; extern unsigned int i915_panel_use_ssc;
extern int i915_vbt_sdvo_panel_type; extern int i915_vbt_sdvo_panel_type;
extern unsigned int i915_enable_rc6; extern unsigned int i915_enable_rc6;
extern unsigned int i915_enable_fbc;
extern int i915_suspend(struct drm_device *dev, pm_message_t state); extern int i915_suspend(struct drm_device *dev, pm_message_t state);
extern int i915_resume(struct drm_device *dev); extern int i915_resume(struct drm_device *dev);
......
...@@ -1736,6 +1736,8 @@ void ironlake_irq_preinstall(struct drm_device *dev) ...@@ -1736,6 +1736,8 @@ void ironlake_irq_preinstall(struct drm_device *dev)
INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
INIT_WORK(&dev_priv->error_work, i915_error_work_func); INIT_WORK(&dev_priv->error_work, i915_error_work_func);
if (IS_GEN6(dev) || IS_IVYBRIDGE(dev))
INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
I915_WRITE(HWSTAM, 0xeffe); I915_WRITE(HWSTAM, 0xeffe);
...@@ -1887,7 +1889,6 @@ void i915_driver_irq_preinstall(struct drm_device * dev) ...@@ -1887,7 +1889,6 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
INIT_WORK(&dev_priv->error_work, i915_error_work_func); INIT_WORK(&dev_priv->error_work, i915_error_work_func);
INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
if (I915_HAS_HOTPLUG(dev)) { if (I915_HAS_HOTPLUG(dev)) {
I915_WRITE(PORT_HOTPLUG_EN, 0); I915_WRITE(PORT_HOTPLUG_EN, 0);
......
...@@ -1731,6 +1731,11 @@ static void intel_update_fbc(struct drm_device *dev) ...@@ -1731,6 +1731,11 @@ static void intel_update_fbc(struct drm_device *dev)
intel_fb = to_intel_framebuffer(fb); intel_fb = to_intel_framebuffer(fb);
obj = intel_fb->obj; obj = intel_fb->obj;
if (!i915_enable_fbc) {
DRM_DEBUG_KMS("fbc disabled per module param (default off)\n");
dev_priv->no_fbc_reason = FBC_MODULE_PARAM;
goto out_disable;
}
if (intel_fb->obj->base.size > dev_priv->cfb_size) { if (intel_fb->obj->base.size > dev_priv->cfb_size) {
DRM_DEBUG_KMS("framebuffer too large, disabling " DRM_DEBUG_KMS("framebuffer too large, disabling "
"compression\n"); "compression\n");
...@@ -2051,12 +2056,12 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) ...@@ -2051,12 +2056,12 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
/* enable normal train */ /* enable normal train */
reg = FDI_TX_CTL(pipe); reg = FDI_TX_CTL(pipe);
temp = I915_READ(reg); temp = I915_READ(reg);
if (IS_GEN6(dev)) { if (IS_IVYBRIDGE(dev)) {
temp &= ~FDI_LINK_TRAIN_NONE;
temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
} else if (IS_IVYBRIDGE(dev)) {
temp &= ~FDI_LINK_TRAIN_NONE_IVB; temp &= ~FDI_LINK_TRAIN_NONE_IVB;
temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE; temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
} else {
temp &= ~FDI_LINK_TRAIN_NONE;
temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
} }
I915_WRITE(reg, temp); I915_WRITE(reg, temp);
......
...@@ -621,7 +621,7 @@ ring_add_request(struct intel_ring_buffer *ring, ...@@ -621,7 +621,7 @@ ring_add_request(struct intel_ring_buffer *ring,
} }
static bool static bool
ring_get_irq(struct intel_ring_buffer *ring, u32 flag) gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
{ {
struct drm_device *dev = ring->dev; struct drm_device *dev = ring->dev;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
...@@ -630,71 +630,67 @@ ring_get_irq(struct intel_ring_buffer *ring, u32 flag) ...@@ -630,71 +630,67 @@ ring_get_irq(struct intel_ring_buffer *ring, u32 flag)
return false; return false;
spin_lock(&ring->irq_lock); spin_lock(&ring->irq_lock);
if (ring->irq_refcount++ == 0) if (ring->irq_refcount++ == 0) {
ironlake_enable_irq(dev_priv, flag); ring->irq_mask &= ~rflag;
I915_WRITE_IMR(ring, ring->irq_mask);
ironlake_enable_irq(dev_priv, gflag);
}
spin_unlock(&ring->irq_lock); spin_unlock(&ring->irq_lock);
return true; return true;
} }
static void static void
ring_put_irq(struct intel_ring_buffer *ring, u32 flag) gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
{ {
struct drm_device *dev = ring->dev; struct drm_device *dev = ring->dev;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
spin_lock(&ring->irq_lock); spin_lock(&ring->irq_lock);
if (--ring->irq_refcount == 0) if (--ring->irq_refcount == 0) {
ironlake_disable_irq(dev_priv, flag); ring->irq_mask |= rflag;
I915_WRITE_IMR(ring, ring->irq_mask);
ironlake_disable_irq(dev_priv, gflag);
}
spin_unlock(&ring->irq_lock); spin_unlock(&ring->irq_lock);
} }
static bool static bool
gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) bsd_ring_get_irq(struct intel_ring_buffer *ring)
{ {
struct drm_device *dev = ring->dev; struct drm_device *dev = ring->dev;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
if (!dev->irq_enabled) if (!dev->irq_enabled)
return false; return false;
spin_lock(&ring->irq_lock); spin_lock(&ring->irq_lock);
if (ring->irq_refcount++ == 0) { if (ring->irq_refcount++ == 0) {
ring->irq_mask &= ~rflag; if (IS_G4X(dev))
I915_WRITE_IMR(ring, ring->irq_mask); i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
ironlake_enable_irq(dev_priv, gflag); else
ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
} }
spin_unlock(&ring->irq_lock); spin_unlock(&ring->irq_lock);
return true; return true;
} }
static void static void
gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) bsd_ring_put_irq(struct intel_ring_buffer *ring)
{ {
struct drm_device *dev = ring->dev; struct drm_device *dev = ring->dev;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
spin_lock(&ring->irq_lock); spin_lock(&ring->irq_lock);
if (--ring->irq_refcount == 0) { if (--ring->irq_refcount == 0) {
ring->irq_mask |= rflag; if (IS_G4X(dev))
I915_WRITE_IMR(ring, ring->irq_mask); i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
ironlake_disable_irq(dev_priv, gflag); else
ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
} }
spin_unlock(&ring->irq_lock); spin_unlock(&ring->irq_lock);
} }
static bool
bsd_ring_get_irq(struct intel_ring_buffer *ring)
{
return ring_get_irq(ring, GT_BSD_USER_INTERRUPT);
}
static void
bsd_ring_put_irq(struct intel_ring_buffer *ring)
{
ring_put_irq(ring, GT_BSD_USER_INTERRUPT);
}
static int static int
ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length) ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
{ {
......
...@@ -2544,21 +2544,19 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) ...@@ -2544,21 +2544,19 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
if (!intel_sdvo) if (!intel_sdvo)
return false; return false;
intel_sdvo->sdvo_reg = sdvo_reg;
intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg) >> 1;
intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg);
if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) { if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) {
kfree(intel_sdvo); kfree(intel_sdvo);
return false; return false;
} }
intel_sdvo->sdvo_reg = sdvo_reg; /* encoder type will be decided later */
intel_encoder = &intel_sdvo->base; intel_encoder = &intel_sdvo->base;
intel_encoder->type = INTEL_OUTPUT_SDVO; intel_encoder->type = INTEL_OUTPUT_SDVO;
/* encoder type will be decided later */
drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0); drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0);
intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg) >> 1;
intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg);
/* Read the regs to test if we can talk to the device */ /* Read the regs to test if we can talk to the device */
for (i = 0; i < 0x40; i++) { for (i = 0; i < 0x40; i++) {
u8 byte; u8 byte;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册