diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 78 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 17 |
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, | |||
1032 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 1032 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
1033 | struct drm_file *file_priv); | 1033 | struct drm_file *file_priv); |
1034 | 1034 | ||
1035 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); | 1035 | extern void intel_irq_init(struct drm_device *dev); |
1036 | extern void i915_driver_irq_preinstall(struct drm_device * dev); | ||
1037 | extern int i915_driver_irq_postinstall(struct drm_device *dev); | ||
1038 | extern void i915_driver_irq_uninstall(struct drm_device * dev); | ||
1039 | |||
1040 | extern irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS); | ||
1041 | extern void ironlake_irq_preinstall(struct drm_device *dev); | ||
1042 | extern int ironlake_irq_postinstall(struct drm_device *dev); | ||
1043 | extern void ironlake_irq_uninstall(struct drm_device *dev); | ||
1044 | |||
1045 | extern irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS); | ||
1046 | extern void ivybridge_irq_preinstall(struct drm_device *dev); | ||
1047 | extern int ivybridge_irq_postinstall(struct drm_device *dev); | ||
1048 | extern void ivybridge_irq_uninstall(struct drm_device *dev); | ||
1049 | 1036 | ||
1050 | extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, | 1037 | extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, |
1051 | struct drm_file *file_priv); | 1038 | struct drm_file *file_priv); |
1052 | extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, | 1039 | extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, |
1053 | struct drm_file *file_priv); | 1040 | struct drm_file *file_priv); |
1054 | extern int i915_enable_vblank(struct drm_device *dev, int crtc); | ||
1055 | extern void i915_disable_vblank(struct drm_device *dev, int crtc); | ||
1056 | extern int ironlake_enable_vblank(struct drm_device *dev, int crtc); | ||
1057 | extern void ironlake_disable_vblank(struct drm_device *dev, int crtc); | ||
1058 | extern int ivybridge_enable_vblank(struct drm_device *dev, int crtc); | ||
1059 | extern void ivybridge_disable_vblank(struct drm_device *dev, int crtc); | ||
1060 | extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc); | ||
1061 | extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc); | ||
1062 | extern int i915_vblank_swap(struct drm_device *dev, void *data, | 1041 | extern 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 | |||
1069 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | 1048 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); |
1070 | 1049 | ||
1071 | void intel_enable_asle (struct drm_device *dev); | 1050 | void intel_enable_asle (struct drm_device *dev); |
1072 | int i915_get_vblank_timestamp(struct drm_device *dev, int crtc, | ||
1073 | int *max_error, | ||
1074 | struct timeval *vblank_time, | ||
1075 | unsigned flags); | ||
1076 | |||
1077 | int 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 |
1081 | extern void i915_destroy_error_state(struct drm_device *dev); | 1053 | extern 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 | */ |
155 | u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) | 155 | static 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 | ||
187 | u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) | 187 | static 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 | ||
201 | int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | 201 | static 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 | ||
267 | int i915_get_vblank_timestamp(struct drm_device *dev, int pipe, | 267 | static 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 | ||
467 | irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | 467 | static 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 | ||
555 | irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | 555 | static 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 | ||
1214 | irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | 1214 | static 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 | */ |
1459 | int i915_enable_vblank(struct drm_device *dev, int pipe) | 1459 | static 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 | ||
1483 | int ironlake_enable_vblank(struct drm_device *dev, int pipe) | 1483 | static 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 | ||
1499 | int ivybridge_enable_vblank(struct drm_device *dev, int pipe) | 1499 | static 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 | */ |
1518 | void i915_disable_vblank(struct drm_device *dev, int pipe) | 1518 | static 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 | ||
1534 | void ironlake_disable_vblank(struct drm_device *dev, int pipe) | 1534 | static 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 | ||
1545 | void ivybridge_disable_vblank(struct drm_device *dev, int pipe) | 1545 | static 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 | */ |
1736 | void ironlake_irq_preinstall(struct drm_device *dev) | 1736 | static 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 | ||
1777 | int ironlake_irq_postinstall(struct drm_device *dev) | 1777 | static 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 | ||
1849 | int ivybridge_irq_postinstall(struct drm_device *dev) | 1849 | static 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 | ||
1899 | void i915_driver_irq_preinstall(struct drm_device * dev) | 1899 | static 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 | */ |
1926 | int i915_driver_irq_postinstall(struct drm_device *dev) | 1926 | static 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 | ||
2002 | void ironlake_irq_uninstall(struct drm_device *dev) | 2002 | static 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 | ||
2022 | void i915_driver_irq_uninstall(struct drm_device * dev) | 2022 | static 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 | |||
2049 | void 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 | ||
1463 | out_unpin_bo: | 1465 | out_unpin_bo: |
1464 | i915_gem_object_unpin(reg_bo); | 1466 | if (!OVERLAY_NEEDS_PHYSICAL(dev)) |
1467 | i915_gem_object_unpin(reg_bo); | ||
1465 | out_free_bo: | 1468 | out_free_bo: |
1466 | drm_gem_object_unreference(®_bo->base); | 1469 | drm_gem_object_unreference(®_bo->base); |
1467 | mutex_unlock(&dev->struct_mutex); | ||
1468 | out_free: | 1470 | out_free: |
1471 | mutex_unlock(&dev->struct_mutex); | ||
1469 | kfree(overlay); | 1472 | kfree(overlay); |
1470 | return; | 1473 | return; |
1471 | } | 1474 | } |