drm: move drm vblank initialization/cleanup to driver load/unload

drm vblank initialization keeps track of the changes in driver-supplied
frame counts across vt switch and mode setting, but only if you let it by
not tearing down the drm vblank structure.

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by Keith Packard and committed by Dave Airlie 52440211 6133047a

+45 -21
+2
drivers/gpu/drm/drm_drv.c
··· 305 return; 306 } 307 308 drm_lastclose(dev); 309 310 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
··· 305 return; 306 } 307 308 + drm_vblank_cleanup(dev); 309 + 310 drm_lastclose(dev); 311 312 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
+1 -3
drivers/gpu/drm/drm_irq.c
··· 94 } 95 } 96 97 - static void drm_vblank_cleanup(struct drm_device *dev) 98 { 99 /* Bail if the driver didn't call drm_vblank_init() */ 100 if (dev->num_crtcs == 0) ··· 277 dev->driver->irq_uninstall(dev); 278 279 free_irq(dev->pdev->irq, dev); 280 - 281 - drm_vblank_cleanup(dev); 282 283 return 0; 284 }
··· 94 } 95 } 96 97 + void drm_vblank_cleanup(struct drm_device *dev) 98 { 99 /* Bail if the driver didn't call drm_vblank_init() */ 100 if (dev->num_crtcs == 0) ··· 277 dev->driver->irq_uninstall(dev); 278 279 free_irq(dev->pdev->irq, dev); 280 281 return 0; 282 }
+7
drivers/gpu/drm/i915/i915_dma.c
··· 856 857 spin_lock_init(&dev_priv->user_irq_lock); 858 859 return ret; 860 } 861
··· 856 857 spin_lock_init(&dev_priv->user_irq_lock); 858 859 + ret = drm_vblank_init(dev, I915_NUM_PIPE); 860 + 861 + if (ret) { 862 + (void) i915_driver_unload(dev); 863 + return ret; 864 + } 865 + 866 return ret; 867 } 868
+2
drivers/gpu/drm/i915/i915_drv.h
··· 47 PIPE_B, 48 }; 49 50 /* Interface history: 51 * 52 * 1.1: Original.
··· 47 PIPE_B, 48 }; 49 50 + #define I915_NUM_PIPE 2 51 + 52 /* Interface history: 53 * 54 * 1.1: Original.
-5
drivers/gpu/drm/i915/i915_irq.c
··· 498 int i915_driver_irq_postinstall(struct drm_device *dev) 499 { 500 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 501 - int ret, num_pipes = 2; 502 - 503 - ret = drm_vblank_init(dev, num_pipes); 504 - if (ret) 505 - return ret; 506 507 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 508
··· 498 int i915_driver_irq_postinstall(struct drm_device *dev) 499 { 500 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 501 502 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 503
+8
drivers/gpu/drm/mga/mga_dma.c
··· 396 int mga_driver_load(struct drm_device * dev, unsigned long flags) 397 { 398 drm_mga_private_t *dev_priv; 399 400 dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); 401 if (!dev_priv) ··· 415 dev->types[6] = _DRM_STAT_IRQ; 416 dev->types[7] = _DRM_STAT_PRIMARY; 417 dev->types[8] = _DRM_STAT_SECONDARY; 418 419 return 0; 420 }
··· 396 int mga_driver_load(struct drm_device * dev, unsigned long flags) 397 { 398 drm_mga_private_t *dev_priv; 399 + int ret; 400 401 dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); 402 if (!dev_priv) ··· 414 dev->types[6] = _DRM_STAT_IRQ; 415 dev->types[7] = _DRM_STAT_PRIMARY; 416 dev->types[8] = _DRM_STAT_SECONDARY; 417 + 418 + ret = drm_vblank_init(dev, 1); 419 + 420 + if (ret) { 421 + (void) mga_driver_unload(dev); 422 + return ret; 423 + } 424 425 return 0; 426 }
-5
drivers/gpu/drm/mga/mga_irq.c
··· 152 int mga_driver_irq_postinstall(struct drm_device *dev) 153 { 154 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; 155 - int ret; 156 - 157 - ret = drm_vblank_init(dev, 1); 158 - if (ret) 159 - return ret; 160 161 DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); 162
··· 152 int mga_driver_irq_postinstall(struct drm_device *dev) 153 { 154 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; 155 156 DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); 157
+6
drivers/gpu/drm/r128/r128_drv.c
··· 45 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | 46 DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, 47 .dev_priv_size = sizeof(drm_r128_buf_priv_t), 48 .preclose = r128_driver_preclose, 49 .lastclose = r128_driver_lastclose, 50 .get_vblank_counter = r128_get_vblank_counter, ··· 84 .minor = DRIVER_MINOR, 85 .patchlevel = DRIVER_PATCHLEVEL, 86 }; 87 88 static int __init r128_init(void) 89 {
··· 45 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | 46 DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, 47 .dev_priv_size = sizeof(drm_r128_buf_priv_t), 48 + .load = r128_driver_load, 49 .preclose = r128_driver_preclose, 50 .lastclose = r128_driver_lastclose, 51 .get_vblank_counter = r128_get_vblank_counter, ··· 83 .minor = DRIVER_MINOR, 84 .patchlevel = DRIVER_PATCHLEVEL, 85 }; 86 + 87 + int r128_driver_load(struct drm_device * dev, unsigned long flags) 88 + { 89 + return drm_vblank_init(dev, 1); 90 + } 91 92 static int __init r128_init(void) 93 {
+1
drivers/gpu/drm/r128/r128_drv.h
··· 159 extern int r128_driver_irq_postinstall(struct drm_device *dev); 160 extern void r128_driver_irq_uninstall(struct drm_device * dev); 161 extern void r128_driver_lastclose(struct drm_device * dev); 162 extern void r128_driver_preclose(struct drm_device * dev, 163 struct drm_file *file_priv); 164
··· 159 extern int r128_driver_irq_postinstall(struct drm_device *dev); 160 extern void r128_driver_irq_uninstall(struct drm_device * dev); 161 extern void r128_driver_lastclose(struct drm_device * dev); 162 + extern int r128_driver_load(struct drm_device * dev, unsigned long flags); 163 extern void r128_driver_preclose(struct drm_device * dev, 164 struct drm_file *file_priv); 165
+1 -1
drivers/gpu/drm/r128/r128_irq.c
··· 102 103 int r128_driver_irq_postinstall(struct drm_device *dev) 104 { 105 - return drm_vblank_init(dev, 1); 106 } 107 108 void r128_driver_irq_uninstall(struct drm_device * dev)
··· 102 103 int r128_driver_irq_postinstall(struct drm_device *dev) 104 { 105 + return 0; 106 } 107 108 void r128_driver_irq_uninstall(struct drm_device * dev)
+6
drivers/gpu/drm/radeon/radeon_cp.c
··· 1757 if (ret != 0) 1758 return ret; 1759 1760 DRM_DEBUG("%s card detected\n", 1761 ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); 1762 return ret;
··· 1757 if (ret != 0) 1758 return ret; 1759 1760 + ret = drm_vblank_init(dev, 2); 1761 + if (ret) { 1762 + radeon_driver_unload(dev); 1763 + return ret; 1764 + } 1765 + 1766 DRM_DEBUG("%s card detected\n", 1767 ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); 1768 return ret;
-5
drivers/gpu/drm/radeon/radeon_irq.c
··· 337 { 338 drm_radeon_private_t *dev_priv = 339 (drm_radeon_private_t *) dev->dev_private; 340 - int ret; 341 342 atomic_set(&dev_priv->swi_emitted, 0); 343 DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); 344 - 345 - ret = drm_vblank_init(dev, 2); 346 - if (ret) 347 - return ret; 348 349 dev->max_vblank_count = 0x001fffff; 350
··· 337 { 338 drm_radeon_private_t *dev_priv = 339 (drm_radeon_private_t *) dev->dev_private; 340 341 atomic_set(&dev_priv->swi_emitted, 0); 342 DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); 343 344 dev->max_vblank_count = 0x001fffff; 345
-1
drivers/gpu/drm/via/via_irq.c
··· 314 if (!dev_priv) 315 return -EINVAL; 316 317 - drm_vblank_init(dev, 1); 318 status = VIA_READ(VIA_REG_INTERRUPT); 319 VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL 320 | dev_priv->irq_enable_mask);
··· 314 if (!dev_priv) 315 return -EINVAL; 316 317 status = VIA_READ(VIA_REG_INTERRUPT); 318 VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL 319 | dev_priv->irq_enable_mask);
+10 -1
drivers/gpu/drm/via/via_map.c
··· 107 ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); 108 if (ret) { 109 drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); 110 } 111 - return ret; 112 } 113 114 int via_driver_unload(struct drm_device *dev)
··· 107 ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); 108 if (ret) { 109 drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); 110 + return ret; 111 } 112 + 113 + ret = drm_vblank_init(dev, 1); 114 + if (ret) { 115 + drm_sman_takedown(&dev_priv->sman); 116 + drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); 117 + return ret; 118 + } 119 + 120 + return 0; 121 } 122 123 int via_driver_unload(struct drm_device *dev)
+1
include/drm/drmP.h
··· 1151 extern void drm_handle_vblank(struct drm_device *dev, int crtc); 1152 extern int drm_vblank_get(struct drm_device *dev, int crtc); 1153 extern void drm_vblank_put(struct drm_device *dev, int crtc); 1154 /* Modesetting support */ 1155 extern int drm_modeset_ctl(struct drm_device *dev, void *data, 1156 struct drm_file *file_priv);
··· 1151 extern void drm_handle_vblank(struct drm_device *dev, int crtc); 1152 extern int drm_vblank_get(struct drm_device *dev, int crtc); 1153 extern void drm_vblank_put(struct drm_device *dev, int crtc); 1154 + extern void drm_vblank_cleanup(struct drm_device *dev); 1155 /* Modesetting support */ 1156 extern int drm_modeset_ctl(struct drm_device *dev, void *data, 1157 struct drm_file *file_priv);