Commit bb6d822e authored by David Herrmann's avatar David Herrmann Committed by Dave Airlie

drm: move drm-lock API to drm_legacy.h

Same as the other legacy APIs, most of this is internal, so prefix it with
drm_legacy_* and move into drm_legacy.h.
Signed-off-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
Reviewed-by: default avatarThierry Reding <treding@nvidia.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent d4f68a75
...@@ -268,10 +268,10 @@ static void drm_master_release(struct drm_device *dev, struct file *filp) ...@@ -268,10 +268,10 @@ static void drm_master_release(struct drm_device *dev, struct file *filp)
{ {
struct drm_file *file_priv = filp->private_data; struct drm_file *file_priv = filp->private_data;
if (drm_i_have_hw_lock(dev, file_priv)) { if (drm_legacy_i_have_hw_lock(dev, file_priv)) {
DRM_DEBUG("File %p released, freeing lock for context %d\n", DRM_DEBUG("File %p released, freeing lock for context %d\n",
filp, _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock)); filp, _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock));
drm_lock_free(&file_priv->master->lock, drm_legacy_lock_free(&file_priv->master->lock,
_DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock)); _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock));
} }
} }
......
...@@ -82,8 +82,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = { ...@@ -82,8 +82,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH), DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_legacy_lock, DRM_AUTH),
DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH), DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_legacy_unlock, DRM_AUTH),
DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH), DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH),
......
...@@ -83,4 +83,13 @@ struct drm_agp_mem { ...@@ -83,4 +83,13 @@ struct drm_agp_mem {
struct list_head head; struct list_head head;
}; };
/*
* Generic Userspace Locking-API
*/
int drm_legacy_i_have_hw_lock(struct drm_device *d, struct drm_file *f);
int drm_legacy_lock(struct drm_device *d, void *v, struct drm_file *f);
int drm_legacy_unlock(struct drm_device *d, void *v, struct drm_file *f);
int drm_legacy_lock_free(struct drm_lock_data *lock, unsigned int ctx);
#endif /* __DRM_LEGACY_H__ */ #endif /* __DRM_LEGACY_H__ */
...@@ -52,7 +52,8 @@ static int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context); ...@@ -52,7 +52,8 @@ static int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context);
* *
* Add the current task to the lock wait queue, and attempt to take to lock. * Add the current task to the lock wait queue, and attempt to take to lock.
*/ */
int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) int drm_legacy_lock(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DECLARE_WAITQUEUE(entry, current); DECLARE_WAITQUEUE(entry, current);
struct drm_lock *lock = data; struct drm_lock *lock = data;
...@@ -146,7 +147,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) ...@@ -146,7 +147,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
* *
* Transfer and free the lock. * Transfer and free the lock.
*/ */
int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv) int drm_legacy_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
struct drm_lock *lock = data; struct drm_lock *lock = data;
struct drm_master *master = file_priv->master; struct drm_master *master = file_priv->master;
...@@ -157,7 +158,7 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv) ...@@ -157,7 +158,7 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)
return -EINVAL; return -EINVAL;
} }
if (drm_lock_free(&master->lock, lock->context)) { if (drm_legacy_lock_free(&master->lock, lock->context)) {
/* FIXME: Should really bail out here. */ /* FIXME: Should really bail out here. */
} }
...@@ -250,7 +251,7 @@ static int drm_lock_transfer(struct drm_lock_data *lock_data, ...@@ -250,7 +251,7 @@ static int drm_lock_transfer(struct drm_lock_data *lock_data,
* Marks the lock as not held, via the \p cmpxchg instruction. Wakes any task * Marks the lock as not held, via the \p cmpxchg instruction. Wakes any task
* waiting on the lock queue. * waiting on the lock queue.
*/ */
int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context) int drm_legacy_lock_free(struct drm_lock_data *lock_data, unsigned int context)
{ {
unsigned int old, new, prev; unsigned int old, new, prev;
volatile unsigned int *lock = &lock_data->hw_lock->lock; volatile unsigned int *lock = &lock_data->hw_lock->lock;
...@@ -324,7 +325,7 @@ static int drm_notifier(void *priv) ...@@ -324,7 +325,7 @@ static int drm_notifier(void *priv)
* having to worry about starvation. * having to worry about starvation.
*/ */
void drm_idlelock_take(struct drm_lock_data *lock_data) void drm_legacy_idlelock_take(struct drm_lock_data *lock_data)
{ {
int ret; int ret;
...@@ -341,9 +342,9 @@ void drm_idlelock_take(struct drm_lock_data *lock_data) ...@@ -341,9 +342,9 @@ void drm_idlelock_take(struct drm_lock_data *lock_data)
} }
spin_unlock_bh(&lock_data->spinlock); spin_unlock_bh(&lock_data->spinlock);
} }
EXPORT_SYMBOL(drm_idlelock_take); EXPORT_SYMBOL(drm_legacy_idlelock_take);
void drm_idlelock_release(struct drm_lock_data *lock_data) void drm_legacy_idlelock_release(struct drm_lock_data *lock_data)
{ {
unsigned int old, prev; unsigned int old, prev;
volatile unsigned int *lock = &lock_data->hw_lock->lock; volatile unsigned int *lock = &lock_data->hw_lock->lock;
...@@ -361,9 +362,10 @@ void drm_idlelock_release(struct drm_lock_data *lock_data) ...@@ -361,9 +362,10 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
} }
spin_unlock_bh(&lock_data->spinlock); spin_unlock_bh(&lock_data->spinlock);
} }
EXPORT_SYMBOL(drm_idlelock_release); EXPORT_SYMBOL(drm_legacy_idlelock_release);
int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv) int drm_legacy_i_have_hw_lock(struct drm_device *dev,
struct drm_file *file_priv)
{ {
struct drm_master *master = file_priv->master; struct drm_master *master = file_priv->master;
return (file_priv->lock_count && master->lock.hw_lock && return (file_priv->lock_count && master->lock.hw_lock &&
......
...@@ -1215,9 +1215,9 @@ void i810_driver_preclose(struct drm_device *dev, struct drm_file *file_priv) ...@@ -1215,9 +1215,9 @@ void i810_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
} }
if (file_priv->master && file_priv->master->lock.hw_lock) { if (file_priv->master && file_priv->master->lock.hw_lock) {
drm_idlelock_take(&file_priv->master->lock); drm_legacy_idlelock_take(&file_priv->master->lock);
i810_driver_reclaim_buffers(dev, file_priv); i810_driver_reclaim_buffers(dev, file_priv);
drm_idlelock_release(&file_priv->master->lock); drm_legacy_idlelock_release(&file_priv->master->lock);
} else { } else {
/* master disappeared, clean up stuff anyway and hope nothing /* master disappeared, clean up stuff anyway and hope nothing
* goes wrong */ * goes wrong */
......
...@@ -1051,7 +1051,7 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv) ...@@ -1051,7 +1051,7 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv)
return; return;
if (file_priv->master && file_priv->master->lock.hw_lock) { if (file_priv->master && file_priv->master->lock.hw_lock) {
drm_idlelock_take(&file_priv->master->lock); drm_legacy_idlelock_take(&file_priv->master->lock);
release_idlelock = 1; release_idlelock = 1;
} }
...@@ -1070,7 +1070,7 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv) ...@@ -1070,7 +1070,7 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv)
} }
if (release_idlelock) if (release_idlelock)
drm_idlelock_release(&file_priv->master->lock); drm_legacy_idlelock_release(&file_priv->master->lock);
} }
const struct drm_ioctl_desc savage_ioctls[] = { const struct drm_ioctl_desc savage_ioctls[] = {
......
...@@ -319,12 +319,12 @@ void sis_reclaim_buffers_locked(struct drm_device *dev, ...@@ -319,12 +319,12 @@ void sis_reclaim_buffers_locked(struct drm_device *dev,
if (!(file->minor->master && file->master->lock.hw_lock)) if (!(file->minor->master && file->master->lock.hw_lock))
return; return;
drm_idlelock_take(&file->master->lock); drm_legacy_idlelock_take(&file->master->lock);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (list_empty(&file_priv->obj_list)) { if (list_empty(&file_priv->obj_list)) {
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
drm_idlelock_release(&file->master->lock); drm_legacy_idlelock_release(&file->master->lock);
return; return;
} }
...@@ -345,7 +345,7 @@ void sis_reclaim_buffers_locked(struct drm_device *dev, ...@@ -345,7 +345,7 @@ void sis_reclaim_buffers_locked(struct drm_device *dev,
} }
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
drm_idlelock_release(&file->master->lock); drm_legacy_idlelock_release(&file->master->lock);
return; return;
} }
......
...@@ -211,12 +211,12 @@ void via_reclaim_buffers_locked(struct drm_device *dev, ...@@ -211,12 +211,12 @@ void via_reclaim_buffers_locked(struct drm_device *dev,
if (!(file->minor->master && file->master->lock.hw_lock)) if (!(file->minor->master && file->master->lock.hw_lock))
return; return;
drm_idlelock_take(&file->master->lock); drm_legacy_idlelock_take(&file->master->lock);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (list_empty(&file_priv->obj_list)) { if (list_empty(&file_priv->obj_list)) {
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
drm_idlelock_release(&file->master->lock); drm_legacy_idlelock_release(&file->master->lock);
return; return;
} }
...@@ -231,7 +231,7 @@ void via_reclaim_buffers_locked(struct drm_device *dev, ...@@ -231,7 +231,7 @@ void via_reclaim_buffers_locked(struct drm_device *dev,
} }
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
drm_idlelock_release(&file->master->lock); drm_legacy_idlelock_release(&file->master->lock);
return; return;
} }
...@@ -1143,22 +1143,11 @@ void drm_clflush_pages(struct page *pages[], unsigned long num_pages); ...@@ -1143,22 +1143,11 @@ void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
void drm_clflush_sg(struct sg_table *st); void drm_clflush_sg(struct sg_table *st);
void drm_clflush_virt_range(void *addr, unsigned long length); void drm_clflush_virt_range(void *addr, unsigned long length);
/* Locking IOCTL support (drm_lock.h) */
extern int drm_lock(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_unlock(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context);
extern void drm_idlelock_take(struct drm_lock_data *lock_data);
extern void drm_idlelock_release(struct drm_lock_data *lock_data);
/* /*
* These are exported to drivers so that they can implement fencing using * These are exported to drivers so that they can implement fencing using
* DMA quiscent + idle. DMA quiescent usually requires the hardware lock. * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
*/ */
extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv);
/* DMA support (drm_dma.h) */ /* DMA support (drm_dma.h) */
extern int drm_legacy_dma_setup(struct drm_device *dev); extern int drm_legacy_dma_setup(struct drm_device *dev);
extern void drm_legacy_dma_takedown(struct drm_device *dev); extern void drm_legacy_dma_takedown(struct drm_device *dev);
...@@ -1363,6 +1352,9 @@ int drm_legacy_addbufs_pci(struct drm_device *d, struct drm_buf_desc *req); ...@@ -1363,6 +1352,9 @@ int drm_legacy_addbufs_pci(struct drm_device *d, struct drm_buf_desc *req);
void drm_legacy_vma_flush(struct drm_device *d); void drm_legacy_vma_flush(struct drm_device *d);
void drm_legacy_idlelock_take(struct drm_lock_data *lock);
void drm_legacy_idlelock_release(struct drm_lock_data *lock);
/* sysfs support (drm_sysfs.c) */ /* sysfs support (drm_sysfs.c) */
struct drm_sysfs_class; struct drm_sysfs_class;
extern struct class *drm_sysfs_create(struct module *owner, char *name); extern struct class *drm_sysfs_create(struct module *owner, char *name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment