aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-04-07 16:58:17 -0400
committerKeith Packard <keithp@keithp.com>2011-05-13 20:03:10 -0400
commitf796cf8f517f13826bb691432b03c7b5da13e530 (patch)
tree5f54e285e738bcb965e63a356b4b51bdcb0c7d02 /drivers
parent4697995b98417c6da9ab2708a36f5e2bc926c8ac (diff)
drm/i915: split enable/disable vblank code into chipset specific functions
This makes the Ironlake+ code trivial and generally simplifies things. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c4
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c42
3 files changed, 37 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index a3ee159b64ee..52ecb90ba0a1 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1271,11 +1271,15 @@ static int i915_load_modeset_init(struct drm_device *dev)
1271 dev->driver->irq_preinstall = ironlake_irq_preinstall; 1271 dev->driver->irq_preinstall = ironlake_irq_preinstall;
1272 dev->driver->irq_postinstall = ironlake_irq_postinstall; 1272 dev->driver->irq_postinstall = ironlake_irq_postinstall;
1273 dev->driver->irq_uninstall = ironlake_irq_uninstall; 1273 dev->driver->irq_uninstall = ironlake_irq_uninstall;
1274 dev->driver->enable_vblank = ironlake_enable_vblank;
1275 dev->driver->disable_vblank = ironlake_disable_vblank;
1274 } else { 1276 } else {
1275 dev->driver->irq_preinstall = i915_driver_irq_preinstall; 1277 dev->driver->irq_preinstall = i915_driver_irq_preinstall;
1276 dev->driver->irq_postinstall = i915_driver_irq_postinstall; 1278 dev->driver->irq_postinstall = i915_driver_irq_postinstall;
1277 dev->driver->irq_uninstall = i915_driver_irq_uninstall; 1279 dev->driver->irq_uninstall = i915_driver_irq_uninstall;
1278 dev->driver->irq_handler = i915_driver_irq_handler; 1280 dev->driver->irq_handler = i915_driver_irq_handler;
1281 dev->driver->enable_vblank = i915_enable_vblank;
1282 dev->driver->disable_vblank = i915_disable_vblank;
1279 } 1283 }
1280 1284
1281 ret = drm_irq_install(dev); 1285 ret = drm_irq_install(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3c3233413df0..4359697d2894 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1040,6 +1040,8 @@ extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
1040 struct drm_file *file_priv); 1040 struct drm_file *file_priv);
1041extern int i915_enable_vblank(struct drm_device *dev, int crtc); 1041extern int i915_enable_vblank(struct drm_device *dev, int crtc);
1042extern void i915_disable_vblank(struct drm_device *dev, int crtc); 1042extern void i915_disable_vblank(struct drm_device *dev, int crtc);
1043extern int ironlake_enable_vblank(struct drm_device *dev, int crtc);
1044extern void ironlake_disable_vblank(struct drm_device *dev, int crtc);
1043extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc); 1045extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
1044extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc); 1046extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc);
1045extern int i915_vblank_swap(struct drm_device *dev, void *data, 1047extern int i915_vblank_swap(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d967e1754cf2..33f0bc53a538 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1375,10 +1375,7 @@ int i915_enable_vblank(struct drm_device *dev, int pipe)
1375 return -EINVAL; 1375 return -EINVAL;
1376 1376
1377 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 1377 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1378 if (HAS_PCH_SPLIT(dev)) 1378 if (INTEL_INFO(dev)->gen >= 4)
1379 ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
1380 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
1381 else if (INTEL_INFO(dev)->gen >= 4)
1382 i915_enable_pipestat(dev_priv, pipe, 1379 i915_enable_pipestat(dev_priv, pipe,
1383 PIPE_START_VBLANK_INTERRUPT_ENABLE); 1380 PIPE_START_VBLANK_INTERRUPT_ENABLE);
1384 else 1381 else
@@ -1393,6 +1390,22 @@ int i915_enable_vblank(struct drm_device *dev, int pipe)
1393 return 0; 1390 return 0;
1394} 1391}
1395 1392
1393int ironlake_enable_vblank(struct drm_device *dev, int pipe)
1394{
1395 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1396 unsigned long irqflags;
1397
1398 if (!i915_pipe_enabled(dev, pipe))
1399 return -EINVAL;
1400
1401 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1402 ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
1403 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
1404 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1405
1406 return 0;
1407}
1408
1396/* Called from drm generic code, passed 'crtc' which 1409/* Called from drm generic code, passed 'crtc' which
1397 * we use as a pipe index 1410 * we use as a pipe index
1398 */ 1411 */
@@ -1406,13 +1419,20 @@ void i915_disable_vblank(struct drm_device *dev, int pipe)
1406 I915_WRITE(INSTPM, 1419 I915_WRITE(INSTPM,
1407 INSTPM_AGPBUSY_DIS << 16 | INSTPM_AGPBUSY_DIS); 1420 INSTPM_AGPBUSY_DIS << 16 | INSTPM_AGPBUSY_DIS);
1408 1421
1409 if (HAS_PCH_SPLIT(dev)) 1422 i915_disable_pipestat(dev_priv, pipe,
1410 ironlake_disable_display_irq(dev_priv, (pipe == 0) ? 1423 PIPE_VBLANK_INTERRUPT_ENABLE |
1411 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); 1424 PIPE_START_VBLANK_INTERRUPT_ENABLE);
1412 else 1425 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1413 i915_disable_pipestat(dev_priv, pipe, 1426}
1414 PIPE_VBLANK_INTERRUPT_ENABLE | 1427
1415 PIPE_START_VBLANK_INTERRUPT_ENABLE); 1428void ironlake_disable_vblank(struct drm_device *dev, int pipe)
1429{
1430 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1431 unsigned long irqflags;
1432
1433 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1434 ironlake_disable_display_irq(dev_priv, (pipe == 0) ?
1435 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
1416 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1436 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1417} 1437}
1418 1438