aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c31
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c8
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h30
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c78
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c17
5 files changed, 70 insertions, 94 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 2b79588541e7..e1787022d6c8 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1266,30 +1266,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
1266 1266
1267 intel_modeset_gem_init(dev); 1267 intel_modeset_gem_init(dev);
1268 1268
1269 if (IS_IVYBRIDGE(dev)) {
1270 /* Share pre & uninstall handlers with ILK/SNB */
1271 dev->driver->irq_handler = ivybridge_irq_handler;
1272 dev->driver->irq_preinstall = ironlake_irq_preinstall;
1273 dev->driver->irq_postinstall = ivybridge_irq_postinstall;
1274 dev->driver->irq_uninstall = ironlake_irq_uninstall;
1275 dev->driver->enable_vblank = ivybridge_enable_vblank;
1276 dev->driver->disable_vblank = ivybridge_disable_vblank;
1277 } else if (HAS_PCH_SPLIT(dev)) {
1278 dev->driver->irq_handler = ironlake_irq_handler;
1279 dev->driver->irq_preinstall = ironlake_irq_preinstall;
1280 dev->driver->irq_postinstall = ironlake_irq_postinstall;
1281 dev->driver->irq_uninstall = ironlake_irq_uninstall;
1282 dev->driver->enable_vblank = ironlake_enable_vblank;
1283 dev->driver->disable_vblank = ironlake_disable_vblank;
1284 } else {
1285 dev->driver->irq_preinstall = i915_driver_irq_preinstall;
1286 dev->driver->irq_postinstall = i915_driver_irq_postinstall;
1287 dev->driver->irq_uninstall = i915_driver_irq_uninstall;
1288 dev->driver->irq_handler = i915_driver_irq_handler;
1289 dev->driver->enable_vblank = i915_enable_vblank;
1290 dev->driver->disable_vblank = i915_disable_vblank;
1291 }
1292
1293 ret = drm_irq_install(dev); 1269 ret = drm_irq_install(dev);
1294 if (ret) 1270 if (ret)
1295 goto cleanup_gem; 1271 goto cleanup_gem;
@@ -2017,12 +1993,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2017 /* enable GEM by default */ 1993 /* enable GEM by default */
2018 dev_priv->has_gem = 1; 1994 dev_priv->has_gem = 1;
2019 1995
2020 dev->driver->get_vblank_counter = i915_get_vblank_counter; 1996 intel_irq_init(dev);
2021 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
2022 if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) {
2023 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
2024 dev->driver->get_vblank_counter = gm45_get_vblank_counter;
2025 }
2026 1997
2027 /* Try to make sure MCHBAR is enabled before poking at it */ 1998 /* Try to make sure MCHBAR is enabled before poking at it */
2028 intel_setup_mchbar(dev); 1999 intel_setup_mchbar(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index b54f7d9b173a..649278fc268b 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -768,14 +768,6 @@ static struct drm_driver driver = {
768 .resume = i915_resume, 768 .resume = i915_resume,
769 769
770 .device_is_agp = i915_driver_device_is_agp, 770 .device_is_agp = i915_driver_device_is_agp,
771 .enable_vblank = i915_enable_vblank,
772 .disable_vblank = i915_disable_vblank,
773 .get_vblank_timestamp = i915_get_vblank_timestamp,
774 .get_scanout_position = i915_get_crtc_scanoutpos,
775 .irq_preinstall = i915_driver_irq_preinstall,
776 .irq_postinstall = i915_driver_irq_postinstall,
777 .irq_uninstall = i915_driver_irq_uninstall,
778 .irq_handler = i915_driver_irq_handler,
779 .reclaim_buffers = drm_core_reclaim_buffers, 771 .reclaim_buffers = drm_core_reclaim_buffers,
780 .master_create = i915_master_create, 772 .master_create = i915_master_create,
781 .master_destroy = i915_master_destroy, 773 .master_destroy = i915_master_destroy,
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 7a7a4216d4f8..4958ce068b53 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1032,33 +1032,12 @@ extern int i915_irq_emit(struct drm_device *dev, void *data,
1032extern int i915_irq_wait(struct drm_device *dev, void *data, 1032extern int i915_irq_wait(struct drm_device *dev, void *data,
1033 struct drm_file *file_priv); 1033 struct drm_file *file_priv);
1034 1034
1035extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); 1035extern void intel_irq_init(struct drm_device *dev);
1036extern void i915_driver_irq_preinstall(struct drm_device * dev);
1037extern int i915_driver_irq_postinstall(struct drm_device *dev);
1038extern void i915_driver_irq_uninstall(struct drm_device * dev);
1039
1040extern irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS);
1041extern void ironlake_irq_preinstall(struct drm_device *dev);
1042extern int ironlake_irq_postinstall(struct drm_device *dev);
1043extern void ironlake_irq_uninstall(struct drm_device *dev);
1044
1045extern irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS);
1046extern void ivybridge_irq_preinstall(struct drm_device *dev);
1047extern int ivybridge_irq_postinstall(struct drm_device *dev);
1048extern void ivybridge_irq_uninstall(struct drm_device *dev);
1049 1036
1050extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, 1037extern int i915_vblank_pipe_set(struct drm_device *dev, void *data,
1051 struct drm_file *file_priv); 1038 struct drm_file *file_priv);
1052extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, 1039extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
1053 struct drm_file *file_priv); 1040 struct drm_file *file_priv);
1054extern int i915_enable_vblank(struct drm_device *dev, int crtc);
1055extern void i915_disable_vblank(struct drm_device *dev, int crtc);
1056extern int ironlake_enable_vblank(struct drm_device *dev, int crtc);
1057extern void ironlake_disable_vblank(struct drm_device *dev, int crtc);
1058extern int ivybridge_enable_vblank(struct drm_device *dev, int crtc);
1059extern void ivybridge_disable_vblank(struct drm_device *dev, int crtc);
1060extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
1061extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc);
1062extern int i915_vblank_swap(struct drm_device *dev, void *data, 1041extern int i915_vblank_swap(struct drm_device *dev, void *data,
1063 struct drm_file *file_priv); 1042 struct drm_file *file_priv);
1064 1043
@@ -1069,13 +1048,6 @@ void
1069i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); 1048i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask);
1070 1049
1071void intel_enable_asle (struct drm_device *dev); 1050void intel_enable_asle (struct drm_device *dev);
1072int i915_get_vblank_timestamp(struct drm_device *dev, int crtc,
1073 int *max_error,
1074 struct timeval *vblank_time,
1075 unsigned flags);
1076
1077int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
1078 int *vpos, int *hpos);
1079 1051
1080#ifdef CONFIG_DEBUG_FS 1052#ifdef CONFIG_DEBUG_FS
1081extern void i915_destroy_error_state(struct drm_device *dev); 1053extern void i915_destroy_error_state(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 0b0de5239ad5..2e181614fda7 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -152,7 +152,7 @@ i915_pipe_enabled(struct drm_device *dev, int pipe)
152/* Called from drm generic code, passed a 'crtc', which 152/* Called from drm generic code, passed a 'crtc', which
153 * we use as a pipe index 153 * we use as a pipe index
154 */ 154 */
155u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) 155static u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
156{ 156{
157 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 157 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
158 unsigned long high_frame; 158 unsigned long high_frame;
@@ -184,7 +184,7 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
184 return (high1 << 8) | low; 184 return (high1 << 8) | low;
185} 185}
186 186
187u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) 187static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
188{ 188{
189 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 189 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
190 int reg = PIPE_FRMCOUNT_GM45(pipe); 190 int reg = PIPE_FRMCOUNT_GM45(pipe);
@@ -198,7 +198,7 @@ u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
198 return I915_READ(reg); 198 return I915_READ(reg);
199} 199}
200 200
201int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, 201static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
202 int *vpos, int *hpos) 202 int *vpos, int *hpos)
203{ 203{
204 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 204 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -264,7 +264,7 @@ int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
264 return ret; 264 return ret;
265} 265}
266 266
267int i915_get_vblank_timestamp(struct drm_device *dev, int pipe, 267static int i915_get_vblank_timestamp(struct drm_device *dev, int pipe,
268 int *max_error, 268 int *max_error,
269 struct timeval *vblank_time, 269 struct timeval *vblank_time,
270 unsigned flags) 270 unsigned flags)
@@ -464,7 +464,7 @@ static void pch_irq_handler(struct drm_device *dev)
464 DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); 464 DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n");
465} 465}
466 466
467irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) 467static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
468{ 468{
469 struct drm_device *dev = (struct drm_device *) arg; 469 struct drm_device *dev = (struct drm_device *) arg;
470 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 470 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -552,7 +552,7 @@ done:
552 return ret; 552 return ret;
553} 553}
554 554
555irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) 555static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
556{ 556{
557 struct drm_device *dev = (struct drm_device *) arg; 557 struct drm_device *dev = (struct drm_device *) arg;
558 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 558 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -1211,7 +1211,7 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
1211 } 1211 }
1212} 1212}
1213 1213
1214irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) 1214static irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
1215{ 1215{
1216 struct drm_device *dev = (struct drm_device *) arg; 1216 struct drm_device *dev = (struct drm_device *) arg;
1217 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1217 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -1456,7 +1456,7 @@ int i915_irq_wait(struct drm_device *dev, void *data,
1456/* Called from drm generic code, passed 'crtc' which 1456/* Called from drm generic code, passed 'crtc' which
1457 * we use as a pipe index 1457 * we use as a pipe index
1458 */ 1458 */
1459int i915_enable_vblank(struct drm_device *dev, int pipe) 1459static int i915_enable_vblank(struct drm_device *dev, int pipe)
1460{ 1460{
1461 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1461 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1462 unsigned long irqflags; 1462 unsigned long irqflags;
@@ -1480,7 +1480,7 @@ int i915_enable_vblank(struct drm_device *dev, int pipe)
1480 return 0; 1480 return 0;
1481} 1481}
1482 1482
1483int ironlake_enable_vblank(struct drm_device *dev, int pipe) 1483static int ironlake_enable_vblank(struct drm_device *dev, int pipe)
1484{ 1484{
1485 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1485 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1486 unsigned long irqflags; 1486 unsigned long irqflags;
@@ -1496,7 +1496,7 @@ int ironlake_enable_vblank(struct drm_device *dev, int pipe)
1496 return 0; 1496 return 0;
1497} 1497}
1498 1498
1499int ivybridge_enable_vblank(struct drm_device *dev, int pipe) 1499static int ivybridge_enable_vblank(struct drm_device *dev, int pipe)
1500{ 1500{
1501 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1501 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1502 unsigned long irqflags; 1502 unsigned long irqflags;
@@ -1515,7 +1515,7 @@ int ivybridge_enable_vblank(struct drm_device *dev, int pipe)
1515/* Called from drm generic code, passed 'crtc' which 1515/* Called from drm generic code, passed 'crtc' which
1516 * we use as a pipe index 1516 * we use as a pipe index
1517 */ 1517 */
1518void i915_disable_vblank(struct drm_device *dev, int pipe) 1518static void i915_disable_vblank(struct drm_device *dev, int pipe)
1519{ 1519{
1520 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1520 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1521 unsigned long irqflags; 1521 unsigned long irqflags;
@@ -1531,7 +1531,7 @@ void i915_disable_vblank(struct drm_device *dev, int pipe)
1531 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1531 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1532} 1532}
1533 1533
1534void ironlake_disable_vblank(struct drm_device *dev, int pipe) 1534static void ironlake_disable_vblank(struct drm_device *dev, int pipe)
1535{ 1535{
1536 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1536 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1537 unsigned long irqflags; 1537 unsigned long irqflags;
@@ -1542,7 +1542,7 @@ void ironlake_disable_vblank(struct drm_device *dev, int pipe)
1542 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1542 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1543} 1543}
1544 1544
1545void ivybridge_disable_vblank(struct drm_device *dev, int pipe) 1545static void ivybridge_disable_vblank(struct drm_device *dev, int pipe)
1546{ 1546{
1547 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1547 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1548 unsigned long irqflags; 1548 unsigned long irqflags;
@@ -1733,7 +1733,7 @@ repeat:
1733 1733
1734/* drm_dma.h hooks 1734/* drm_dma.h hooks
1735*/ 1735*/
1736void ironlake_irq_preinstall(struct drm_device *dev) 1736static void ironlake_irq_preinstall(struct drm_device *dev)
1737{ 1737{
1738 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1738 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1739 1739
@@ -1774,7 +1774,7 @@ void ironlake_irq_preinstall(struct drm_device *dev)
1774 POSTING_READ(SDEIER); 1774 POSTING_READ(SDEIER);
1775} 1775}
1776 1776
1777int ironlake_irq_postinstall(struct drm_device *dev) 1777static int ironlake_irq_postinstall(struct drm_device *dev)
1778{ 1778{
1779 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1779 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1780 /* enable kind of interrupts always enabled */ 1780 /* enable kind of interrupts always enabled */
@@ -1846,7 +1846,7 @@ int ironlake_irq_postinstall(struct drm_device *dev)
1846 return 0; 1846 return 0;
1847} 1847}
1848 1848
1849int ivybridge_irq_postinstall(struct drm_device *dev) 1849static int ivybridge_irq_postinstall(struct drm_device *dev)
1850{ 1850{
1851 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1851 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1852 /* enable kind of interrupts always enabled */ 1852 /* enable kind of interrupts always enabled */
@@ -1896,7 +1896,7 @@ int ivybridge_irq_postinstall(struct drm_device *dev)
1896 return 0; 1896 return 0;
1897} 1897}
1898 1898
1899void i915_driver_irq_preinstall(struct drm_device * dev) 1899static void i915_driver_irq_preinstall(struct drm_device * dev)
1900{ 1900{
1901 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1901 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1902 int pipe; 1902 int pipe;
@@ -1923,7 +1923,7 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
1923 * Must be called after intel_modeset_init or hotplug interrupts won't be 1923 * Must be called after intel_modeset_init or hotplug interrupts won't be
1924 * enabled correctly. 1924 * enabled correctly.
1925 */ 1925 */
1926int i915_driver_irq_postinstall(struct drm_device *dev) 1926static int i915_driver_irq_postinstall(struct drm_device *dev)
1927{ 1927{
1928 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1928 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1929 u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR; 1929 u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR;
@@ -1999,7 +1999,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
1999 return 0; 1999 return 0;
2000} 2000}
2001 2001
2002void ironlake_irq_uninstall(struct drm_device *dev) 2002static void ironlake_irq_uninstall(struct drm_device *dev)
2003{ 2003{
2004 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2004 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2005 2005
@@ -2019,7 +2019,7 @@ void ironlake_irq_uninstall(struct drm_device *dev)
2019 I915_WRITE(GTIIR, I915_READ(GTIIR)); 2019 I915_WRITE(GTIIR, I915_READ(GTIIR));
2020} 2020}
2021 2021
2022void i915_driver_irq_uninstall(struct drm_device * dev) 2022static void i915_driver_irq_uninstall(struct drm_device * dev)
2023{ 2023{
2024 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2024 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2025 int pipe; 2025 int pipe;
@@ -2045,3 +2045,41 @@ void i915_driver_irq_uninstall(struct drm_device * dev)
2045 I915_READ(PIPESTAT(pipe)) & 0x8000ffff); 2045 I915_READ(PIPESTAT(pipe)) & 0x8000ffff);
2046 I915_WRITE(IIR, I915_READ(IIR)); 2046 I915_WRITE(IIR, I915_READ(IIR));
2047} 2047}
2048
2049void intel_irq_init(struct drm_device *dev)
2050{
2051 dev->driver->get_vblank_counter = i915_get_vblank_counter;
2052 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
2053 if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) {
2054 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
2055 dev->driver->get_vblank_counter = gm45_get_vblank_counter;
2056 }
2057
2058
2059 dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp;
2060 dev->driver->get_scanout_position = i915_get_crtc_scanoutpos;
2061
2062 if (IS_IVYBRIDGE(dev)) {
2063 /* Share pre & uninstall handlers with ILK/SNB */
2064 dev->driver->irq_handler = ivybridge_irq_handler;
2065 dev->driver->irq_preinstall = ironlake_irq_preinstall;
2066 dev->driver->irq_postinstall = ivybridge_irq_postinstall;
2067 dev->driver->irq_uninstall = ironlake_irq_uninstall;
2068 dev->driver->enable_vblank = ivybridge_enable_vblank;
2069 dev->driver->disable_vblank = ivybridge_disable_vblank;
2070 } else if (HAS_PCH_SPLIT(dev)) {
2071 dev->driver->irq_handler = ironlake_irq_handler;
2072 dev->driver->irq_preinstall = ironlake_irq_preinstall;
2073 dev->driver->irq_postinstall = ironlake_irq_postinstall;
2074 dev->driver->irq_uninstall = ironlake_irq_uninstall;
2075 dev->driver->enable_vblank = ironlake_enable_vblank;
2076 dev->driver->disable_vblank = ironlake_disable_vblank;
2077 } else {
2078 dev->driver->irq_preinstall = i915_driver_irq_preinstall;
2079 dev->driver->irq_postinstall = i915_driver_irq_postinstall;
2080 dev->driver->irq_uninstall = i915_driver_irq_uninstall;
2081 dev->driver->irq_handler = i915_driver_irq_handler;
2082 dev->driver->enable_vblank = i915_enable_vblank;
2083 dev->driver->disable_vblank = i915_disable_vblank;
2084 }
2085}
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index cffd3edd9bb4..d36038086826 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -1405,6 +1405,11 @@ void intel_setup_overlay(struct drm_device *dev)
1405 overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL); 1405 overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL);
1406 if (!overlay) 1406 if (!overlay)
1407 return; 1407 return;
1408
1409 mutex_lock(&dev->struct_mutex);
1410 if (WARN_ON(dev_priv->overlay))
1411 goto out_free;
1412
1408 overlay->dev = dev; 1413 overlay->dev = dev;
1409 1414
1410 reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); 1415 reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE);
@@ -1412,8 +1417,6 @@ void intel_setup_overlay(struct drm_device *dev)
1412 goto out_free; 1417 goto out_free;
1413 overlay->reg_bo = reg_bo; 1418 overlay->reg_bo = reg_bo;
1414 1419
1415 mutex_lock(&dev->struct_mutex);
1416
1417 if (OVERLAY_NEEDS_PHYSICAL(dev)) { 1420 if (OVERLAY_NEEDS_PHYSICAL(dev)) {
1418 ret = i915_gem_attach_phys_object(dev, reg_bo, 1421 ret = i915_gem_attach_phys_object(dev, reg_bo,
1419 I915_GEM_PHYS_OVERLAY_REGS, 1422 I915_GEM_PHYS_OVERLAY_REGS,
@@ -1438,8 +1441,6 @@ void intel_setup_overlay(struct drm_device *dev)
1438 } 1441 }
1439 } 1442 }
1440 1443
1441 mutex_unlock(&dev->struct_mutex);
1442
1443 /* init all values */ 1444 /* init all values */
1444 overlay->color_key = 0x0101fe; 1445 overlay->color_key = 0x0101fe;
1445 overlay->brightness = -19; 1446 overlay->brightness = -19;
@@ -1448,7 +1449,7 @@ void intel_setup_overlay(struct drm_device *dev)
1448 1449
1449 regs = intel_overlay_map_regs(overlay); 1450 regs = intel_overlay_map_regs(overlay);
1450 if (!regs) 1451 if (!regs)
1451 goto out_free_bo; 1452 goto out_unpin_bo;
1452 1453
1453 memset(regs, 0, sizeof(struct overlay_registers)); 1454 memset(regs, 0, sizeof(struct overlay_registers));
1454 update_polyphase_filter(regs); 1455 update_polyphase_filter(regs);
@@ -1457,15 +1458,17 @@ void intel_setup_overlay(struct drm_device *dev)
1457 intel_overlay_unmap_regs(overlay, regs); 1458 intel_overlay_unmap_regs(overlay, regs);
1458 1459
1459 dev_priv->overlay = overlay; 1460 dev_priv->overlay = overlay;
1461 mutex_unlock(&dev->struct_mutex);
1460 DRM_INFO("initialized overlay support\n"); 1462 DRM_INFO("initialized overlay support\n");
1461 return; 1463 return;
1462 1464
1463out_unpin_bo: 1465out_unpin_bo:
1464 i915_gem_object_unpin(reg_bo); 1466 if (!OVERLAY_NEEDS_PHYSICAL(dev))
1467 i915_gem_object_unpin(reg_bo);
1465out_free_bo: 1468out_free_bo:
1466 drm_gem_object_unreference(&reg_bo->base); 1469 drm_gem_object_unreference(&reg_bo->base);
1467 mutex_unlock(&dev->struct_mutex);
1468out_free: 1470out_free:
1471 mutex_unlock(&dev->struct_mutex);
1469 kfree(overlay); 1472 kfree(overlay);
1470 return; 1473 return;
1471} 1474}