diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-01 19:38:59 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-01 19:38:59 -0400 |
| commit | c66a86d0cdce3bad2da794f114cc37377d242c3d (patch) | |
| tree | 4603bb4a464439275c07ebf66ec4a69ebc8fafc3 | |
| parent | c9e0b8454582b413bc64c16693c7979417cad3eb (diff) | |
| parent | 2b1ecb7337592a7bf0989efac46a5b52daab769e (diff) | |
Merge branch 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/keithp/linux-2.6
* 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/keithp/linux-2.6:
drm/i915: apply HWSTAM writes to Ivy Bridge as well
drm/i915: move IRQ function table init to i915_irq.c
drm/i915/overlay: Fix unpinning along init error paths
drm/i915: Don't call describe_obj on NULL pointers
drm/i915: Hold struct_mutex during i915_save_state/i915_restore_state
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 16 | ||||
| -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 | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 80 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 17 |
7 files changed, 94 insertions, 109 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 4d46441cbe2d..0a893f7400fa 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -1207,13 +1207,17 @@ static int i915_context_status(struct seq_file *m, void *unused) | |||
| 1207 | if (ret) | 1207 | if (ret) |
| 1208 | return ret; | 1208 | return ret; |
| 1209 | 1209 | ||
| 1210 | seq_printf(m, "power context "); | 1210 | if (dev_priv->pwrctx) { |
| 1211 | describe_obj(m, dev_priv->pwrctx); | 1211 | seq_printf(m, "power context "); |
| 1212 | seq_printf(m, "\n"); | 1212 | describe_obj(m, dev_priv->pwrctx); |
| 1213 | seq_printf(m, "\n"); | ||
| 1214 | } | ||
| 1213 | 1215 | ||
| 1214 | seq_printf(m, "render context "); | 1216 | if (dev_priv->renderctx) { |
| 1215 | describe_obj(m, dev_priv->renderctx); | 1217 | seq_printf(m, "render context "); |
| 1216 | seq_printf(m, "\n"); | 1218 | describe_obj(m, dev_priv->renderctx); |
| 1219 | seq_printf(m, "\n"); | ||
| 1220 | } | ||
| 1217 | 1221 | ||
| 1218 | mutex_unlock(&dev->mode_config.mutex); | 1222 | mutex_unlock(&dev->mode_config.mutex); |
| 1219 | 1223 | ||
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 609358faaa90..013d304455b9 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -765,14 +765,6 @@ static struct drm_driver driver = { | |||
| 765 | .resume = i915_resume, | 765 | .resume = i915_resume, |
| 766 | 766 | ||
| 767 | .device_is_agp = i915_driver_device_is_agp, | 767 | .device_is_agp = i915_driver_device_is_agp, |
| 768 | .enable_vblank = i915_enable_vblank, | ||
| 769 | .disable_vblank = i915_disable_vblank, | ||
| 770 | .get_vblank_timestamp = i915_get_vblank_timestamp, | ||
| 771 | .get_scanout_position = i915_get_crtc_scanoutpos, | ||
| 772 | .irq_preinstall = i915_driver_irq_preinstall, | ||
| 773 | .irq_postinstall = i915_driver_irq_postinstall, | ||
| 774 | .irq_uninstall = i915_driver_irq_uninstall, | ||
| 775 | .irq_handler = i915_driver_irq_handler, | ||
| 776 | .reclaim_buffers = drm_core_reclaim_buffers, | 768 | .reclaim_buffers = drm_core_reclaim_buffers, |
| 777 | .master_create = i915_master_create, | 769 | .master_create = i915_master_create, |
| 778 | .master_destroy = i915_master_destroy, | 770 | .master_destroy = i915_master_destroy, |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index eddabf68e97a..f245c588ae95 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -997,8 +997,6 @@ extern unsigned int i915_enable_fbc; | |||
| 997 | 997 | ||
| 998 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); | 998 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); |
| 999 | extern int i915_resume(struct drm_device *dev); | 999 | extern int i915_resume(struct drm_device *dev); |
| 1000 | extern void i915_save_display(struct drm_device *dev); | ||
| 1001 | extern void i915_restore_display(struct drm_device *dev); | ||
| 1002 | extern int i915_master_create(struct drm_device *dev, struct drm_master *master); | 1000 | extern int i915_master_create(struct drm_device *dev, struct drm_master *master); |
| 1003 | extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master); | 1001 | extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master); |
| 1004 | 1002 | ||
| @@ -1033,33 +1031,12 @@ extern int i915_irq_emit(struct drm_device *dev, void *data, | |||
| 1033 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 1031 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
| 1034 | struct drm_file *file_priv); | 1032 | struct drm_file *file_priv); |
| 1035 | 1033 | ||
| 1036 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); | 1034 | extern void intel_irq_init(struct drm_device *dev); |
| 1037 | extern void i915_driver_irq_preinstall(struct drm_device * dev); | ||
| 1038 | extern int i915_driver_irq_postinstall(struct drm_device *dev); | ||
| 1039 | extern void i915_driver_irq_uninstall(struct drm_device * dev); | ||
| 1040 | |||
| 1041 | extern irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS); | ||
| 1042 | extern void ironlake_irq_preinstall(struct drm_device *dev); | ||
| 1043 | extern int ironlake_irq_postinstall(struct drm_device *dev); | ||
| 1044 | extern void ironlake_irq_uninstall(struct drm_device *dev); | ||
| 1045 | |||
| 1046 | extern irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS); | ||
| 1047 | extern void ivybridge_irq_preinstall(struct drm_device *dev); | ||
| 1048 | extern int ivybridge_irq_postinstall(struct drm_device *dev); | ||
| 1049 | extern void ivybridge_irq_uninstall(struct drm_device *dev); | ||
| 1050 | 1035 | ||
| 1051 | extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, | 1036 | extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, |
| 1052 | struct drm_file *file_priv); | 1037 | struct drm_file *file_priv); |
| 1053 | extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, | 1038 | extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, |
| 1054 | struct drm_file *file_priv); | 1039 | struct drm_file *file_priv); |
| 1055 | extern int i915_enable_vblank(struct drm_device *dev, int crtc); | ||
| 1056 | extern void i915_disable_vblank(struct drm_device *dev, int crtc); | ||
| 1057 | extern int ironlake_enable_vblank(struct drm_device *dev, int crtc); | ||
| 1058 | extern void ironlake_disable_vblank(struct drm_device *dev, int crtc); | ||
| 1059 | extern int ivybridge_enable_vblank(struct drm_device *dev, int crtc); | ||
| 1060 | extern void ivybridge_disable_vblank(struct drm_device *dev, int crtc); | ||
| 1061 | extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc); | ||
| 1062 | extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc); | ||
| 1063 | extern int i915_vblank_swap(struct drm_device *dev, void *data, | 1040 | extern int i915_vblank_swap(struct drm_device *dev, void *data, |
| 1064 | struct drm_file *file_priv); | 1041 | struct drm_file *file_priv); |
| 1065 | 1042 | ||
| @@ -1070,13 +1047,6 @@ void | |||
| 1070 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | 1047 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); |
| 1071 | 1048 | ||
| 1072 | void intel_enable_asle (struct drm_device *dev); | 1049 | void intel_enable_asle (struct drm_device *dev); |
| 1073 | int i915_get_vblank_timestamp(struct drm_device *dev, int crtc, | ||
| 1074 | int *max_error, | ||
| 1075 | struct timeval *vblank_time, | ||
| 1076 | unsigned flags); | ||
| 1077 | |||
| 1078 | int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | ||
| 1079 | int *vpos, int *hpos); | ||
| 1080 | 1050 | ||
| 1081 | #ifdef CONFIG_DEBUG_FS | 1051 | #ifdef CONFIG_DEBUG_FS |
| 1082 | extern void i915_destroy_error_state(struct drm_device *dev); | 1052 | 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 ae2b49969b99..3b03f85ea627 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) |
| @@ -462,7 +462,7 @@ static void pch_irq_handler(struct drm_device *dev) | |||
| 462 | DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); | 462 | DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); |
| 463 | } | 463 | } |
| 464 | 464 | ||
| 465 | irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | 465 | static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) |
| 466 | { | 466 | { |
| 467 | struct drm_device *dev = (struct drm_device *) arg; | 467 | struct drm_device *dev = (struct drm_device *) arg; |
| 468 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 468 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| @@ -550,7 +550,7 @@ done: | |||
| 550 | return ret; | 550 | return ret; |
| 551 | } | 551 | } |
| 552 | 552 | ||
| 553 | irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | 553 | static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) |
| 554 | { | 554 | { |
| 555 | struct drm_device *dev = (struct drm_device *) arg; | 555 | struct drm_device *dev = (struct drm_device *) arg; |
| 556 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 556 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| @@ -1209,7 +1209,7 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) | |||
| 1209 | } | 1209 | } |
| 1210 | } | 1210 | } |
| 1211 | 1211 | ||
| 1212 | irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | 1212 | static irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) |
| 1213 | { | 1213 | { |
| 1214 | struct drm_device *dev = (struct drm_device *) arg; | 1214 | struct drm_device *dev = (struct drm_device *) arg; |
| 1215 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1215 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| @@ -1454,7 +1454,7 @@ int i915_irq_wait(struct drm_device *dev, void *data, | |||
| 1454 | /* Called from drm generic code, passed 'crtc' which | 1454 | /* Called from drm generic code, passed 'crtc' which |
| 1455 | * we use as a pipe index | 1455 | * we use as a pipe index |
| 1456 | */ | 1456 | */ |
| 1457 | int i915_enable_vblank(struct drm_device *dev, int pipe) | 1457 | static int i915_enable_vblank(struct drm_device *dev, int pipe) |
| 1458 | { | 1458 | { |
| 1459 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1459 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1460 | unsigned long irqflags; | 1460 | unsigned long irqflags; |
| @@ -1478,7 +1478,7 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
| 1478 | return 0; | 1478 | return 0; |
| 1479 | } | 1479 | } |
| 1480 | 1480 | ||
| 1481 | int ironlake_enable_vblank(struct drm_device *dev, int pipe) | 1481 | static int ironlake_enable_vblank(struct drm_device *dev, int pipe) |
| 1482 | { | 1482 | { |
| 1483 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1483 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1484 | unsigned long irqflags; | 1484 | unsigned long irqflags; |
| @@ -1494,7 +1494,7 @@ int ironlake_enable_vblank(struct drm_device *dev, int pipe) | |||
| 1494 | return 0; | 1494 | return 0; |
| 1495 | } | 1495 | } |
| 1496 | 1496 | ||
| 1497 | int ivybridge_enable_vblank(struct drm_device *dev, int pipe) | 1497 | static int ivybridge_enable_vblank(struct drm_device *dev, int pipe) |
| 1498 | { | 1498 | { |
| 1499 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1499 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1500 | unsigned long irqflags; | 1500 | unsigned long irqflags; |
| @@ -1513,7 +1513,7 @@ int ivybridge_enable_vblank(struct drm_device *dev, int pipe) | |||
| 1513 | /* Called from drm generic code, passed 'crtc' which | 1513 | /* Called from drm generic code, passed 'crtc' which |
| 1514 | * we use as a pipe index | 1514 | * we use as a pipe index |
| 1515 | */ | 1515 | */ |
| 1516 | void i915_disable_vblank(struct drm_device *dev, int pipe) | 1516 | static void i915_disable_vblank(struct drm_device *dev, int pipe) |
| 1517 | { | 1517 | { |
| 1518 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1518 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1519 | unsigned long irqflags; | 1519 | unsigned long irqflags; |
| @@ -1529,7 +1529,7 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) | |||
| 1529 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | 1529 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
| 1530 | } | 1530 | } |
| 1531 | 1531 | ||
| 1532 | void ironlake_disable_vblank(struct drm_device *dev, int pipe) | 1532 | static void ironlake_disable_vblank(struct drm_device *dev, int pipe) |
| 1533 | { | 1533 | { |
| 1534 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1534 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1535 | unsigned long irqflags; | 1535 | unsigned long irqflags; |
| @@ -1540,7 +1540,7 @@ void ironlake_disable_vblank(struct drm_device *dev, int pipe) | |||
| 1540 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | 1540 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
| 1541 | } | 1541 | } |
| 1542 | 1542 | ||
| 1543 | void ivybridge_disable_vblank(struct drm_device *dev, int pipe) | 1543 | static void ivybridge_disable_vblank(struct drm_device *dev, int pipe) |
| 1544 | { | 1544 | { |
| 1545 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1545 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1546 | unsigned long irqflags; | 1546 | unsigned long irqflags; |
| @@ -1728,7 +1728,7 @@ repeat: | |||
| 1728 | 1728 | ||
| 1729 | /* drm_dma.h hooks | 1729 | /* drm_dma.h hooks |
| 1730 | */ | 1730 | */ |
| 1731 | void ironlake_irq_preinstall(struct drm_device *dev) | 1731 | static void ironlake_irq_preinstall(struct drm_device *dev) |
| 1732 | { | 1732 | { |
| 1733 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1733 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1734 | 1734 | ||
| @@ -1740,7 +1740,7 @@ void ironlake_irq_preinstall(struct drm_device *dev) | |||
| 1740 | INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work); | 1740 | INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work); |
| 1741 | 1741 | ||
| 1742 | I915_WRITE(HWSTAM, 0xeffe); | 1742 | I915_WRITE(HWSTAM, 0xeffe); |
| 1743 | if (IS_GEN6(dev)) { | 1743 | if (IS_GEN6(dev) || IS_GEN7(dev)) { |
| 1744 | /* Workaround stalls observed on Sandy Bridge GPUs by | 1744 | /* Workaround stalls observed on Sandy Bridge GPUs by |
| 1745 | * making the blitter command streamer generate a | 1745 | * making the blitter command streamer generate a |
| 1746 | * write to the Hardware Status Page for | 1746 | * write to the Hardware Status Page for |
| @@ -1769,7 +1769,7 @@ void ironlake_irq_preinstall(struct drm_device *dev) | |||
| 1769 | POSTING_READ(SDEIER); | 1769 | POSTING_READ(SDEIER); |
| 1770 | } | 1770 | } |
| 1771 | 1771 | ||
| 1772 | int ironlake_irq_postinstall(struct drm_device *dev) | 1772 | static int ironlake_irq_postinstall(struct drm_device *dev) |
| 1773 | { | 1773 | { |
| 1774 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1774 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1775 | /* enable kind of interrupts always enabled */ | 1775 | /* enable kind of interrupts always enabled */ |
| @@ -1841,7 +1841,7 @@ int ironlake_irq_postinstall(struct drm_device *dev) | |||
| 1841 | return 0; | 1841 | return 0; |
| 1842 | } | 1842 | } |
| 1843 | 1843 | ||
| 1844 | int ivybridge_irq_postinstall(struct drm_device *dev) | 1844 | static int ivybridge_irq_postinstall(struct drm_device *dev) |
| 1845 | { | 1845 | { |
| 1846 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1846 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1847 | /* enable kind of interrupts always enabled */ | 1847 | /* enable kind of interrupts always enabled */ |
| @@ -1891,7 +1891,7 @@ int ivybridge_irq_postinstall(struct drm_device *dev) | |||
| 1891 | return 0; | 1891 | return 0; |
| 1892 | } | 1892 | } |
| 1893 | 1893 | ||
| 1894 | void i915_driver_irq_preinstall(struct drm_device * dev) | 1894 | static void i915_driver_irq_preinstall(struct drm_device * dev) |
| 1895 | { | 1895 | { |
| 1896 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1896 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1897 | int pipe; | 1897 | int pipe; |
| @@ -1918,7 +1918,7 @@ void i915_driver_irq_preinstall(struct drm_device * dev) | |||
| 1918 | * Must be called after intel_modeset_init or hotplug interrupts won't be | 1918 | * Must be called after intel_modeset_init or hotplug interrupts won't be |
| 1919 | * enabled correctly. | 1919 | * enabled correctly. |
| 1920 | */ | 1920 | */ |
| 1921 | int i915_driver_irq_postinstall(struct drm_device *dev) | 1921 | static int i915_driver_irq_postinstall(struct drm_device *dev) |
| 1922 | { | 1922 | { |
| 1923 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1923 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1924 | u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR; | 1924 | u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR; |
| @@ -1994,7 +1994,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
| 1994 | return 0; | 1994 | return 0; |
| 1995 | } | 1995 | } |
| 1996 | 1996 | ||
| 1997 | void ironlake_irq_uninstall(struct drm_device *dev) | 1997 | static void ironlake_irq_uninstall(struct drm_device *dev) |
| 1998 | { | 1998 | { |
| 1999 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1999 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 2000 | 2000 | ||
| @@ -2014,7 +2014,7 @@ void ironlake_irq_uninstall(struct drm_device *dev) | |||
| 2014 | I915_WRITE(GTIIR, I915_READ(GTIIR)); | 2014 | I915_WRITE(GTIIR, I915_READ(GTIIR)); |
| 2015 | } | 2015 | } |
| 2016 | 2016 | ||
| 2017 | void i915_driver_irq_uninstall(struct drm_device * dev) | 2017 | static void i915_driver_irq_uninstall(struct drm_device * dev) |
| 2018 | { | 2018 | { |
| 2019 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 2019 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 2020 | int pipe; | 2020 | int pipe; |
| @@ -2040,3 +2040,41 @@ void i915_driver_irq_uninstall(struct drm_device * dev) | |||
| 2040 | I915_READ(PIPESTAT(pipe)) & 0x8000ffff); | 2040 | I915_READ(PIPESTAT(pipe)) & 0x8000ffff); |
| 2041 | I915_WRITE(IIR, I915_READ(IIR)); | 2041 | I915_WRITE(IIR, I915_READ(IIR)); |
| 2042 | } | 2042 | } |
| 2043 | |||
| 2044 | void intel_irq_init(struct drm_device *dev) | ||
| 2045 | { | ||
| 2046 | dev->driver->get_vblank_counter = i915_get_vblank_counter; | ||
| 2047 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ | ||
| 2048 | if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) { | ||
| 2049 | dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ | ||
| 2050 | dev->driver->get_vblank_counter = gm45_get_vblank_counter; | ||
| 2051 | } | ||
| 2052 | |||
| 2053 | |||
| 2054 | dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp; | ||
| 2055 | dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; | ||
| 2056 | |||
| 2057 | if (IS_IVYBRIDGE(dev)) { | ||
| 2058 | /* Share pre & uninstall handlers with ILK/SNB */ | ||
| 2059 | dev->driver->irq_handler = ivybridge_irq_handler; | ||
| 2060 | dev->driver->irq_preinstall = ironlake_irq_preinstall; | ||
| 2061 | dev->driver->irq_postinstall = ivybridge_irq_postinstall; | ||
| 2062 | dev->driver->irq_uninstall = ironlake_irq_uninstall; | ||
| 2063 | dev->driver->enable_vblank = ivybridge_enable_vblank; | ||
| 2064 | dev->driver->disable_vblank = ivybridge_disable_vblank; | ||
| 2065 | } else if (HAS_PCH_SPLIT(dev)) { | ||
| 2066 | dev->driver->irq_handler = ironlake_irq_handler; | ||
| 2067 | dev->driver->irq_preinstall = ironlake_irq_preinstall; | ||
| 2068 | dev->driver->irq_postinstall = ironlake_irq_postinstall; | ||
| 2069 | dev->driver->irq_uninstall = ironlake_irq_uninstall; | ||
| 2070 | dev->driver->enable_vblank = ironlake_enable_vblank; | ||
| 2071 | dev->driver->disable_vblank = ironlake_disable_vblank; | ||
| 2072 | } else { | ||
| 2073 | dev->driver->irq_preinstall = i915_driver_irq_preinstall; | ||
| 2074 | dev->driver->irq_postinstall = i915_driver_irq_postinstall; | ||
| 2075 | dev->driver->irq_uninstall = i915_driver_irq_uninstall; | ||
| 2076 | dev->driver->irq_handler = i915_driver_irq_handler; | ||
| 2077 | dev->driver->enable_vblank = i915_enable_vblank; | ||
| 2078 | dev->driver->disable_vblank = i915_disable_vblank; | ||
| 2079 | } | ||
| 2080 | } | ||
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index e8152d23d5b6..5257cfc34c35 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -597,7 +597,7 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 597 | return; | 597 | return; |
| 598 | } | 598 | } |
| 599 | 599 | ||
| 600 | void i915_save_display(struct drm_device *dev) | 600 | static void i915_save_display(struct drm_device *dev) |
| 601 | { | 601 | { |
| 602 | struct drm_i915_private *dev_priv = dev->dev_private; | 602 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 603 | 603 | ||
| @@ -678,7 +678,6 @@ void i915_save_display(struct drm_device *dev) | |||
| 678 | } | 678 | } |
| 679 | 679 | ||
| 680 | /* VGA state */ | 680 | /* VGA state */ |
| 681 | mutex_lock(&dev->struct_mutex); | ||
| 682 | dev_priv->saveVGA0 = I915_READ(VGA0); | 681 | dev_priv->saveVGA0 = I915_READ(VGA0); |
| 683 | dev_priv->saveVGA1 = I915_READ(VGA1); | 682 | dev_priv->saveVGA1 = I915_READ(VGA1); |
| 684 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); | 683 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); |
| @@ -688,10 +687,9 @@ void i915_save_display(struct drm_device *dev) | |||
| 688 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); | 687 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); |
| 689 | 688 | ||
| 690 | i915_save_vga(dev); | 689 | i915_save_vga(dev); |
| 691 | mutex_unlock(&dev->struct_mutex); | ||
| 692 | } | 690 | } |
| 693 | 691 | ||
| 694 | void i915_restore_display(struct drm_device *dev) | 692 | static void i915_restore_display(struct drm_device *dev) |
| 695 | { | 693 | { |
| 696 | struct drm_i915_private *dev_priv = dev->dev_private; | 694 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 697 | 695 | ||
| @@ -783,7 +781,6 @@ void i915_restore_display(struct drm_device *dev) | |||
| 783 | else | 781 | else |
| 784 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); | 782 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); |
| 785 | 783 | ||
| 786 | mutex_lock(&dev->struct_mutex); | ||
| 787 | I915_WRITE(VGA0, dev_priv->saveVGA0); | 784 | I915_WRITE(VGA0, dev_priv->saveVGA0); |
| 788 | I915_WRITE(VGA1, dev_priv->saveVGA1); | 785 | I915_WRITE(VGA1, dev_priv->saveVGA1); |
| 789 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); | 786 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); |
| @@ -791,7 +788,6 @@ void i915_restore_display(struct drm_device *dev) | |||
| 791 | udelay(150); | 788 | udelay(150); |
| 792 | 789 | ||
| 793 | i915_restore_vga(dev); | 790 | i915_restore_vga(dev); |
| 794 | mutex_unlock(&dev->struct_mutex); | ||
| 795 | } | 791 | } |
| 796 | 792 | ||
| 797 | int i915_save_state(struct drm_device *dev) | 793 | int i915_save_state(struct drm_device *dev) |
| @@ -801,6 +797,8 @@ int i915_save_state(struct drm_device *dev) | |||
| 801 | 797 | ||
| 802 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); | 798 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); |
| 803 | 799 | ||
| 800 | mutex_lock(&dev->struct_mutex); | ||
| 801 | |||
| 804 | /* Hardware status page */ | 802 | /* Hardware status page */ |
| 805 | dev_priv->saveHWS = I915_READ(HWS_PGA); | 803 | dev_priv->saveHWS = I915_READ(HWS_PGA); |
| 806 | 804 | ||
| @@ -840,6 +838,8 @@ int i915_save_state(struct drm_device *dev) | |||
| 840 | for (i = 0; i < 3; i++) | 838 | for (i = 0; i < 3; i++) |
| 841 | dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); | 839 | dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); |
| 842 | 840 | ||
| 841 | mutex_unlock(&dev->struct_mutex); | ||
| 842 | |||
| 843 | return 0; | 843 | return 0; |
| 844 | } | 844 | } |
| 845 | 845 | ||
| @@ -850,6 +850,8 @@ int i915_restore_state(struct drm_device *dev) | |||
| 850 | 850 | ||
| 851 | pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); | 851 | pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); |
| 852 | 852 | ||
| 853 | mutex_lock(&dev->struct_mutex); | ||
| 854 | |||
| 853 | /* Hardware status page */ | 855 | /* Hardware status page */ |
| 854 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); | 856 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); |
| 855 | 857 | ||
| @@ -867,6 +869,7 @@ int i915_restore_state(struct drm_device *dev) | |||
| 867 | I915_WRITE(IER, dev_priv->saveIER); | 869 | I915_WRITE(IER, dev_priv->saveIER); |
| 868 | I915_WRITE(IMR, dev_priv->saveIMR); | 870 | I915_WRITE(IMR, dev_priv->saveIMR); |
| 869 | } | 871 | } |
| 872 | mutex_unlock(&dev->struct_mutex); | ||
| 870 | 873 | ||
| 871 | intel_init_clock_gating(dev); | 874 | intel_init_clock_gating(dev); |
| 872 | 875 | ||
| @@ -878,6 +881,8 @@ int i915_restore_state(struct drm_device *dev) | |||
| 878 | if (IS_GEN6(dev)) | 881 | if (IS_GEN6(dev)) |
| 879 | gen6_enable_rps(dev_priv); | 882 | gen6_enable_rps(dev_priv); |
| 880 | 883 | ||
| 884 | mutex_lock(&dev->struct_mutex); | ||
| 885 | |||
| 881 | /* Cache mode state */ | 886 | /* Cache mode state */ |
| 882 | I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); | 887 | I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); |
| 883 | 888 | ||
| @@ -891,6 +896,8 @@ int i915_restore_state(struct drm_device *dev) | |||
| 891 | for (i = 0; i < 3; i++) | 896 | for (i = 0; i < 3; i++) |
| 892 | I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); | 897 | I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); |
| 893 | 898 | ||
| 899 | mutex_unlock(&dev->struct_mutex); | ||
| 900 | |||
| 894 | intel_i2c_reset(dev); | 901 | intel_i2c_reset(dev); |
| 895 | 902 | ||
| 896 | return 0; | 903 | return 0; |
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index 56a8e2aea19c..9e2959bc91cd 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
| @@ -1409,6 +1409,11 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1409 | overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL); | 1409 | overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL); |
| 1410 | if (!overlay) | 1410 | if (!overlay) |
| 1411 | return; | 1411 | return; |
| 1412 | |||
| 1413 | mutex_lock(&dev->struct_mutex); | ||
| 1414 | if (WARN_ON(dev_priv->overlay)) | ||
| 1415 | goto out_free; | ||
| 1416 | |||
| 1412 | overlay->dev = dev; | 1417 | overlay->dev = dev; |
| 1413 | 1418 | ||
| 1414 | reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); | 1419 | reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); |
| @@ -1416,8 +1421,6 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1416 | goto out_free; | 1421 | goto out_free; |
| 1417 | overlay->reg_bo = reg_bo; | 1422 | overlay->reg_bo = reg_bo; |
| 1418 | 1423 | ||
| 1419 | mutex_lock(&dev->struct_mutex); | ||
| 1420 | |||
| 1421 | if (OVERLAY_NEEDS_PHYSICAL(dev)) { | 1424 | if (OVERLAY_NEEDS_PHYSICAL(dev)) { |
| 1422 | ret = i915_gem_attach_phys_object(dev, reg_bo, | 1425 | ret = i915_gem_attach_phys_object(dev, reg_bo, |
| 1423 | I915_GEM_PHYS_OVERLAY_REGS, | 1426 | I915_GEM_PHYS_OVERLAY_REGS, |
| @@ -1442,8 +1445,6 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1442 | } | 1445 | } |
| 1443 | } | 1446 | } |
| 1444 | 1447 | ||
| 1445 | mutex_unlock(&dev->struct_mutex); | ||
| 1446 | |||
| 1447 | /* init all values */ | 1448 | /* init all values */ |
| 1448 | overlay->color_key = 0x0101fe; | 1449 | overlay->color_key = 0x0101fe; |
| 1449 | overlay->brightness = -19; | 1450 | overlay->brightness = -19; |
| @@ -1452,7 +1453,7 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1452 | 1453 | ||
| 1453 | regs = intel_overlay_map_regs(overlay); | 1454 | regs = intel_overlay_map_regs(overlay); |
| 1454 | if (!regs) | 1455 | if (!regs) |
| 1455 | goto out_free_bo; | 1456 | goto out_unpin_bo; |
| 1456 | 1457 | ||
| 1457 | memset(regs, 0, sizeof(struct overlay_registers)); | 1458 | memset(regs, 0, sizeof(struct overlay_registers)); |
| 1458 | update_polyphase_filter(regs); | 1459 | update_polyphase_filter(regs); |
| @@ -1461,15 +1462,17 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1461 | intel_overlay_unmap_regs(overlay, regs); | 1462 | intel_overlay_unmap_regs(overlay, regs); |
| 1462 | 1463 | ||
| 1463 | dev_priv->overlay = overlay; | 1464 | dev_priv->overlay = overlay; |
| 1465 | mutex_unlock(&dev->struct_mutex); | ||
| 1464 | DRM_INFO("initialized overlay support\n"); | 1466 | DRM_INFO("initialized overlay support\n"); |
| 1465 | return; | 1467 | return; |
| 1466 | 1468 | ||
| 1467 | out_unpin_bo: | 1469 | out_unpin_bo: |
| 1468 | i915_gem_object_unpin(reg_bo); | 1470 | if (!OVERLAY_NEEDS_PHYSICAL(dev)) |
| 1471 | i915_gem_object_unpin(reg_bo); | ||
| 1469 | out_free_bo: | 1472 | out_free_bo: |
| 1470 | drm_gem_object_unreference(®_bo->base); | 1473 | drm_gem_object_unreference(®_bo->base); |
| 1471 | mutex_unlock(&dev->struct_mutex); | ||
| 1472 | out_free: | 1474 | out_free: |
| 1475 | mutex_unlock(&dev->struct_mutex); | ||
| 1473 | kfree(overlay); | 1476 | kfree(overlay); |
| 1474 | return; | 1477 | return; |
| 1475 | } | 1478 | } |
