diff options
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 80 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_lock.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_stub.c | 1 | ||||
| -rw-r--r-- | include/drm/drmP.h | 5 |
4 files changed, 0 insertions, 95 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 212a94f715b2..15c8dabc3e97 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -280,8 +280,6 @@ int drm_irq_uninstall(struct drm_device * dev) | |||
| 280 | 280 | ||
| 281 | drm_vblank_cleanup(dev); | 281 | drm_vblank_cleanup(dev); |
| 282 | 282 | ||
| 283 | dev->locked_tasklet_func = NULL; | ||
| 284 | |||
| 285 | return 0; | 283 | return 0; |
| 286 | } | 284 | } |
| 287 | EXPORT_SYMBOL(drm_irq_uninstall); | 285 | EXPORT_SYMBOL(drm_irq_uninstall); |
| @@ -699,81 +697,3 @@ void drm_handle_vblank(struct drm_device *dev, int crtc) | |||
| 699 | drm_vbl_send_signals(dev, crtc); | 697 | drm_vbl_send_signals(dev, crtc); |
| 700 | } | 698 | } |
| 701 | EXPORT_SYMBOL(drm_handle_vblank); | 699 | EXPORT_SYMBOL(drm_handle_vblank); |
| 702 | |||
| 703 | /** | ||
| 704 | * Tasklet wrapper function. | ||
| 705 | * | ||
| 706 | * \param data DRM device in disguise. | ||
| 707 | * | ||
| 708 | * Attempts to grab the HW lock and calls the driver callback on success. On | ||
| 709 | * failure, leave the lock marked as contended so the callback can be called | ||
| 710 | * from drm_unlock(). | ||
| 711 | */ | ||
| 712 | static void drm_locked_tasklet_func(unsigned long data) | ||
| 713 | { | ||
| 714 | struct drm_device *dev = (struct drm_device *)data; | ||
| 715 | unsigned long irqflags; | ||
| 716 | void (*tasklet_func)(struct drm_device *); | ||
| 717 | |||
| 718 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); | ||
| 719 | tasklet_func = dev->locked_tasklet_func; | ||
| 720 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 721 | |||
| 722 | if (!tasklet_func || | ||
| 723 | !drm_lock_take(&dev->lock, | ||
| 724 | DRM_KERNEL_CONTEXT)) { | ||
| 725 | return; | ||
| 726 | } | ||
| 727 | |||
| 728 | dev->lock.lock_time = jiffies; | ||
| 729 | atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); | ||
| 730 | |||
| 731 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); | ||
| 732 | tasklet_func = dev->locked_tasklet_func; | ||
| 733 | dev->locked_tasklet_func = NULL; | ||
| 734 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 735 | |||
| 736 | if (tasklet_func != NULL) | ||
| 737 | tasklet_func(dev); | ||
| 738 | |||
| 739 | drm_lock_free(&dev->lock, | ||
| 740 | DRM_KERNEL_CONTEXT); | ||
| 741 | } | ||
| 742 | |||
| 743 | /** | ||
| 744 | * Schedule a tasklet to call back a driver hook with the HW lock held. | ||
| 745 | * | ||
| 746 | * \param dev DRM device. | ||
| 747 | * \param func Driver callback. | ||
| 748 | * | ||
| 749 | * This is intended for triggering actions that require the HW lock from an | ||
| 750 | * interrupt handler. The lock will be grabbed ASAP after the interrupt handler | ||
| 751 | * completes. Note that the callback may be called from interrupt or process | ||
| 752 | * context, it must not make any assumptions about this. Also, the HW lock will | ||
| 753 | * be held with the kernel context or any client context. | ||
| 754 | */ | ||
| 755 | void drm_locked_tasklet(struct drm_device *dev, void (*func)(struct drm_device *)) | ||
| 756 | { | ||
| 757 | unsigned long irqflags; | ||
| 758 | static DECLARE_TASKLET(drm_tasklet, drm_locked_tasklet_func, 0); | ||
| 759 | |||
| 760 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ) || | ||
| 761 | test_bit(TASKLET_STATE_SCHED, &drm_tasklet.state)) | ||
| 762 | return; | ||
| 763 | |||
| 764 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); | ||
| 765 | |||
| 766 | if (dev->locked_tasklet_func) { | ||
| 767 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 768 | return; | ||
| 769 | } | ||
| 770 | |||
| 771 | dev->locked_tasklet_func = func; | ||
| 772 | |||
| 773 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 774 | |||
| 775 | drm_tasklet.data = (unsigned long)dev; | ||
| 776 | |||
| 777 | tasklet_hi_schedule(&drm_tasklet); | ||
| 778 | } | ||
| 779 | EXPORT_SYMBOL(drm_locked_tasklet); | ||
diff --git a/drivers/gpu/drm/drm_lock.c b/drivers/gpu/drm/drm_lock.c index 888159e03d26..1cfa72031f8f 100644 --- a/drivers/gpu/drm/drm_lock.c +++ b/drivers/gpu/drm/drm_lock.c | |||
| @@ -154,8 +154,6 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 154 | int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv) | 154 | int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv) |
| 155 | { | 155 | { |
| 156 | struct drm_lock *lock = data; | 156 | struct drm_lock *lock = data; |
| 157 | unsigned long irqflags; | ||
| 158 | void (*tasklet_func)(struct drm_device *); | ||
| 159 | 157 | ||
| 160 | if (lock->context == DRM_KERNEL_CONTEXT) { | 158 | if (lock->context == DRM_KERNEL_CONTEXT) { |
| 161 | DRM_ERROR("Process %d using kernel context %d\n", | 159 | DRM_ERROR("Process %d using kernel context %d\n", |
| @@ -163,13 +161,6 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 163 | return -EINVAL; | 161 | return -EINVAL; |
| 164 | } | 162 | } |
| 165 | 163 | ||
| 166 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); | ||
| 167 | tasklet_func = dev->locked_tasklet_func; | ||
| 168 | dev->locked_tasklet_func = NULL; | ||
| 169 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 170 | if (tasklet_func != NULL) | ||
| 171 | tasklet_func(dev); | ||
| 172 | |||
| 173 | atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); | 164 | atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); |
| 174 | 165 | ||
| 175 | /* kernel_context_switch isn't used by any of the x86 drm | 166 | /* kernel_context_switch isn't used by any of the x86 drm |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 141e33004a76..66c96ec66672 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
| @@ -92,7 +92,6 @@ static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev, | |||
| 92 | 92 | ||
| 93 | spin_lock_init(&dev->count_lock); | 93 | spin_lock_init(&dev->count_lock); |
| 94 | spin_lock_init(&dev->drw_lock); | 94 | spin_lock_init(&dev->drw_lock); |
| 95 | spin_lock_init(&dev->tasklet_lock); | ||
| 96 | spin_lock_init(&dev->lock.spinlock); | 95 | spin_lock_init(&dev->lock.spinlock); |
| 97 | init_timer(&dev->timer); | 96 | init_timer(&dev->timer); |
| 98 | mutex_init(&dev->struct_mutex); | 97 | mutex_init(&dev->struct_mutex); |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 59c796b46ee7..28c7f1679d49 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -861,8 +861,6 @@ struct drm_device { | |||
| 861 | struct timer_list vblank_disable_timer; | 861 | struct timer_list vblank_disable_timer; |
| 862 | 862 | ||
| 863 | u32 max_vblank_count; /**< size of vblank counter register */ | 863 | u32 max_vblank_count; /**< size of vblank counter register */ |
| 864 | spinlock_t tasklet_lock; /**< For drm_locked_tasklet */ | ||
| 865 | void (*locked_tasklet_func)(struct drm_device *dev); | ||
| 866 | 864 | ||
| 867 | /*@} */ | 865 | /*@} */ |
| 868 | cycles_t ctx_start; | 866 | cycles_t ctx_start; |
| @@ -1149,8 +1147,6 @@ extern int drm_vblank_init(struct drm_device *dev, int num_crtcs); | |||
| 1149 | extern int drm_wait_vblank(struct drm_device *dev, void *data, | 1147 | extern int drm_wait_vblank(struct drm_device *dev, void *data, |
| 1150 | struct drm_file *filp); | 1148 | struct drm_file *filp); |
| 1151 | extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); | 1149 | extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); |
| 1152 | extern void drm_locked_tasklet(struct drm_device *dev, | ||
| 1153 | void(*func)(struct drm_device *)); | ||
| 1154 | extern u32 drm_vblank_count(struct drm_device *dev, int crtc); | 1150 | extern u32 drm_vblank_count(struct drm_device *dev, int crtc); |
| 1155 | extern void drm_handle_vblank(struct drm_device *dev, int crtc); | 1151 | extern void drm_handle_vblank(struct drm_device *dev, int crtc); |
| 1156 | extern int drm_vblank_get(struct drm_device *dev, int crtc); | 1152 | extern int drm_vblank_get(struct drm_device *dev, int crtc); |
| @@ -1158,7 +1154,6 @@ extern void drm_vblank_put(struct drm_device *dev, int crtc); | |||
| 1158 | /* Modesetting support */ | 1154 | /* Modesetting support */ |
| 1159 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, | 1155 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, |
| 1160 | struct drm_file *file_priv); | 1156 | struct drm_file *file_priv); |
| 1161 | extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*)); | ||
| 1162 | 1157 | ||
| 1163 | /* AGP/GART support (drm_agpsupport.h) */ | 1158 | /* AGP/GART support (drm_agpsupport.h) */ |
| 1164 | extern struct drm_agp_head *drm_agp_init(struct drm_device *dev); | 1159 | extern struct drm_agp_head *drm_agp_init(struct drm_device *dev); |
