Commit e0828d54 authored by Gerd Hoffmann's avatar Gerd Hoffmann

drm/qxl: use embedded gem object

Drop drm_gem_object from qxl_bo, use the
ttm_buffer_object.base instead.
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20190805140119.7337-4-kraxel@redhat.com
parent 0e580c6d
...@@ -377,7 +377,7 @@ void qxl_io_destroy_primary(struct qxl_device *qdev) ...@@ -377,7 +377,7 @@ void qxl_io_destroy_primary(struct qxl_device *qdev)
{ {
wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC); wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC);
qdev->primary_bo->is_primary = false; qdev->primary_bo->is_primary = false;
drm_gem_object_put_unlocked(&qdev->primary_bo->gem_base); drm_gem_object_put_unlocked(&qdev->primary_bo->tbo.base);
qdev->primary_bo = NULL; qdev->primary_bo = NULL;
} }
...@@ -404,7 +404,7 @@ void qxl_io_create_primary(struct qxl_device *qdev, struct qxl_bo *bo) ...@@ -404,7 +404,7 @@ void qxl_io_create_primary(struct qxl_device *qdev, struct qxl_bo *bo)
wait_for_io_cmd(qdev, 0, QXL_IO_CREATE_PRIMARY_ASYNC); wait_for_io_cmd(qdev, 0, QXL_IO_CREATE_PRIMARY_ASYNC);
qdev->primary_bo = bo; qdev->primary_bo = bo;
qdev->primary_bo->is_primary = true; qdev->primary_bo->is_primary = true;
drm_gem_object_get(&qdev->primary_bo->gem_base); drm_gem_object_get(&qdev->primary_bo->tbo.base);
} }
void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id) void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id)
......
...@@ -66,7 +66,7 @@ qxl_debugfs_buffers_info(struct seq_file *m, void *data) ...@@ -66,7 +66,7 @@ qxl_debugfs_buffers_info(struct seq_file *m, void *data)
rcu_read_unlock(); rcu_read_unlock();
seq_printf(m, "size %ld, pc %d, num releases %d\n", seq_printf(m, "size %ld, pc %d, num releases %d\n",
(unsigned long)bo->gem_base.size, (unsigned long)bo->tbo.base.size,
bo->pin_count, rel); bo->pin_count, rel);
} }
return 0; return 0;
......
...@@ -797,7 +797,7 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane, ...@@ -797,7 +797,7 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane,
qdev->dumb_shadow_bo->surf.height != surf.height) { qdev->dumb_shadow_bo->surf.height != surf.height) {
if (qdev->dumb_shadow_bo) { if (qdev->dumb_shadow_bo) {
drm_gem_object_put_unlocked drm_gem_object_put_unlocked
(&qdev->dumb_shadow_bo->gem_base); (&qdev->dumb_shadow_bo->tbo.base);
qdev->dumb_shadow_bo = NULL; qdev->dumb_shadow_bo = NULL;
} }
qxl_bo_create(qdev, surf.height * surf.stride, qxl_bo_create(qdev, surf.height * surf.stride,
...@@ -807,10 +807,10 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane, ...@@ -807,10 +807,10 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane,
if (user_bo->shadow != qdev->dumb_shadow_bo) { if (user_bo->shadow != qdev->dumb_shadow_bo) {
if (user_bo->shadow) { if (user_bo->shadow) {
drm_gem_object_put_unlocked drm_gem_object_put_unlocked
(&user_bo->shadow->gem_base); (&user_bo->shadow->tbo.base);
user_bo->shadow = NULL; user_bo->shadow = NULL;
} }
drm_gem_object_get(&qdev->dumb_shadow_bo->gem_base); drm_gem_object_get(&qdev->dumb_shadow_bo->tbo.base);
user_bo->shadow = qdev->dumb_shadow_bo; user_bo->shadow = qdev->dumb_shadow_bo;
} }
} }
...@@ -841,7 +841,7 @@ static void qxl_plane_cleanup_fb(struct drm_plane *plane, ...@@ -841,7 +841,7 @@ static void qxl_plane_cleanup_fb(struct drm_plane *plane,
qxl_bo_unpin(user_bo); qxl_bo_unpin(user_bo);
if (old_state->fb != plane->state->fb && user_bo->shadow) { if (old_state->fb != plane->state->fb && user_bo->shadow) {
drm_gem_object_put_unlocked(&user_bo->shadow->gem_base); drm_gem_object_put_unlocked(&user_bo->shadow->tbo.base);
user_bo->shadow = NULL; user_bo->shadow = NULL;
} }
} }
......
...@@ -71,12 +71,13 @@ extern int qxl_max_ioctls; ...@@ -71,12 +71,13 @@ extern int qxl_max_ioctls;
QXL_INTERRUPT_CLIENT_MONITORS_CONFIG) QXL_INTERRUPT_CLIENT_MONITORS_CONFIG)
struct qxl_bo { struct qxl_bo {
struct ttm_buffer_object tbo;
/* Protected by gem.mutex */ /* Protected by gem.mutex */
struct list_head list; struct list_head list;
/* Protected by tbo.reserved */ /* Protected by tbo.reserved */
struct ttm_place placements[3]; struct ttm_place placements[3];
struct ttm_placement placement; struct ttm_placement placement;
struct ttm_buffer_object tbo;
struct ttm_bo_kmap_obj kmap; struct ttm_bo_kmap_obj kmap;
unsigned int pin_count; unsigned int pin_count;
void *kptr; void *kptr;
...@@ -84,7 +85,6 @@ struct qxl_bo { ...@@ -84,7 +85,6 @@ struct qxl_bo {
int type; int type;
/* Constant after initialization */ /* Constant after initialization */
struct drm_gem_object gem_base;
unsigned int is_primary:1; /* is this now a primary surface */ unsigned int is_primary:1; /* is this now a primary surface */
unsigned int is_dumb:1; unsigned int is_dumb:1;
struct qxl_bo *shadow; struct qxl_bo *shadow;
...@@ -93,7 +93,7 @@ struct qxl_bo { ...@@ -93,7 +93,7 @@ struct qxl_bo {
uint32_t surface_id; uint32_t surface_id;
struct qxl_release *surf_create; struct qxl_release *surf_create;
}; };
#define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, gem_base) #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, tbo.base)
#define to_qxl_bo(tobj) container_of((tobj), struct qxl_bo, tbo) #define to_qxl_bo(tobj) container_of((tobj), struct qxl_bo, tbo)
struct qxl_gem { struct qxl_gem {
......
...@@ -63,7 +63,7 @@ int qxl_gem_object_create(struct qxl_device *qdev, int size, ...@@ -63,7 +63,7 @@ int qxl_gem_object_create(struct qxl_device *qdev, int size,
size, initial_domain, alignment, r); size, initial_domain, alignment, r);
return r; return r;
} }
*obj = &qbo->gem_base; *obj = &qbo->tbo.base;
mutex_lock(&qdev->gem.mutex); mutex_lock(&qdev->gem.mutex);
list_add_tail(&qbo->list, &qdev->gem.objects); list_add_tail(&qbo->list, &qdev->gem.objects);
......
...@@ -33,14 +33,14 @@ static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo) ...@@ -33,14 +33,14 @@ static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo)
struct qxl_device *qdev; struct qxl_device *qdev;
bo = to_qxl_bo(tbo); bo = to_qxl_bo(tbo);
qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; qdev = (struct qxl_device *)bo->tbo.base.dev->dev_private;
qxl_surface_evict(qdev, bo, false); qxl_surface_evict(qdev, bo, false);
WARN_ON_ONCE(bo->map_count > 0); WARN_ON_ONCE(bo->map_count > 0);
mutex_lock(&qdev->gem.mutex); mutex_lock(&qdev->gem.mutex);
list_del_init(&bo->list); list_del_init(&bo->list);
mutex_unlock(&qdev->gem.mutex); mutex_unlock(&qdev->gem.mutex);
drm_gem_object_release(&bo->gem_base); drm_gem_object_release(&bo->tbo.base);
kfree(bo); kfree(bo);
} }
...@@ -95,7 +95,7 @@ int qxl_bo_create(struct qxl_device *qdev, ...@@ -95,7 +95,7 @@ int qxl_bo_create(struct qxl_device *qdev,
if (bo == NULL) if (bo == NULL)
return -ENOMEM; return -ENOMEM;
size = roundup(size, PAGE_SIZE); size = roundup(size, PAGE_SIZE);
r = drm_gem_object_init(&qdev->ddev, &bo->gem_base, size); r = drm_gem_object_init(&qdev->ddev, &bo->tbo.base, size);
if (unlikely(r)) { if (unlikely(r)) {
kfree(bo); kfree(bo);
return r; return r;
...@@ -214,20 +214,20 @@ void qxl_bo_unref(struct qxl_bo **bo) ...@@ -214,20 +214,20 @@ void qxl_bo_unref(struct qxl_bo **bo)
if ((*bo) == NULL) if ((*bo) == NULL)
return; return;
drm_gem_object_put_unlocked(&(*bo)->gem_base); drm_gem_object_put_unlocked(&(*bo)->tbo.base);
*bo = NULL; *bo = NULL;
} }
struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo) struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo)
{ {
drm_gem_object_get(&bo->gem_base); drm_gem_object_get(&bo->tbo.base);
return bo; return bo;
} }
static int __qxl_bo_pin(struct qxl_bo *bo) static int __qxl_bo_pin(struct qxl_bo *bo)
{ {
struct ttm_operation_ctx ctx = { false, false }; struct ttm_operation_ctx ctx = { false, false };
struct drm_device *ddev = bo->gem_base.dev; struct drm_device *ddev = bo->tbo.base.dev;
int r; int r;
if (bo->pin_count) { if (bo->pin_count) {
...@@ -247,7 +247,7 @@ static int __qxl_bo_pin(struct qxl_bo *bo) ...@@ -247,7 +247,7 @@ static int __qxl_bo_pin(struct qxl_bo *bo)
static int __qxl_bo_unpin(struct qxl_bo *bo) static int __qxl_bo_unpin(struct qxl_bo *bo)
{ {
struct ttm_operation_ctx ctx = { false, false }; struct ttm_operation_ctx ctx = { false, false };
struct drm_device *ddev = bo->gem_base.dev; struct drm_device *ddev = bo->tbo.base.dev;
int r, i; int r, i;
if (!bo->pin_count) { if (!bo->pin_count) {
...@@ -310,13 +310,13 @@ void qxl_bo_force_delete(struct qxl_device *qdev) ...@@ -310,13 +310,13 @@ void qxl_bo_force_delete(struct qxl_device *qdev)
dev_err(qdev->ddev.dev, "Userspace still has active objects !\n"); dev_err(qdev->ddev.dev, "Userspace still has active objects !\n");
list_for_each_entry_safe(bo, n, &qdev->gem.objects, list) { list_for_each_entry_safe(bo, n, &qdev->gem.objects, list) {
dev_err(qdev->ddev.dev, "%p %p %lu %lu force free\n", dev_err(qdev->ddev.dev, "%p %p %lu %lu force free\n",
&bo->gem_base, bo, (unsigned long)bo->gem_base.size, &bo->tbo.base, bo, (unsigned long)bo->tbo.base.size,
*((unsigned long *)&bo->gem_base.refcount)); *((unsigned long *)&bo->tbo.base.refcount));
mutex_lock(&qdev->gem.mutex); mutex_lock(&qdev->gem.mutex);
list_del_init(&bo->list); list_del_init(&bo->list);
mutex_unlock(&qdev->gem.mutex); mutex_unlock(&qdev->gem.mutex);
/* this should unref the ttm bo */ /* this should unref the ttm bo */
drm_gem_object_put_unlocked(&bo->gem_base); drm_gem_object_put_unlocked(&bo->tbo.base);
} }
} }
......
...@@ -34,7 +34,7 @@ static inline int qxl_bo_reserve(struct qxl_bo *bo, bool no_wait) ...@@ -34,7 +34,7 @@ static inline int qxl_bo_reserve(struct qxl_bo *bo, bool no_wait)
r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL); r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
if (unlikely(r != 0)) { if (unlikely(r != 0)) {
if (r != -ERESTARTSYS) { if (r != -ERESTARTSYS) {
struct drm_device *ddev = bo->gem_base.dev; struct drm_device *ddev = bo->tbo.base.dev;
dev_err(ddev->dev, "%p reserve failed\n", bo); dev_err(ddev->dev, "%p reserve failed\n", bo);
} }
...@@ -71,7 +71,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type, ...@@ -71,7 +71,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type,
r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL); r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
if (unlikely(r != 0)) { if (unlikely(r != 0)) {
if (r != -ERESTARTSYS) { if (r != -ERESTARTSYS) {
struct drm_device *ddev = bo->gem_base.dev; struct drm_device *ddev = bo->tbo.base.dev;
dev_err(ddev->dev, "%p reserve failed for wait\n", dev_err(ddev->dev, "%p reserve failed for wait\n",
bo); bo);
......
...@@ -243,7 +243,7 @@ static int qxl_release_validate_bo(struct qxl_bo *bo) ...@@ -243,7 +243,7 @@ static int qxl_release_validate_bo(struct qxl_bo *bo)
return ret; return ret;
/* allocate a surface for reserved + validated buffers */ /* allocate a surface for reserved + validated buffers */
ret = qxl_bo_check_id(bo->gem_base.dev->dev_private, bo); ret = qxl_bo_check_id(bo->tbo.base.dev->dev_private, bo);
if (ret) if (ret)
return ret; return ret;
return 0; return 0;
......
...@@ -155,7 +155,7 @@ static int qxl_verify_access(struct ttm_buffer_object *bo, struct file *filp) ...@@ -155,7 +155,7 @@ static int qxl_verify_access(struct ttm_buffer_object *bo, struct file *filp)
{ {
struct qxl_bo *qbo = to_qxl_bo(bo); struct qxl_bo *qbo = to_qxl_bo(bo);
return drm_vma_node_verify_access(&qbo->gem_base.vma_node, return drm_vma_node_verify_access(&qbo->tbo.base.vma_node,
filp->private_data); filp->private_data);
} }
...@@ -297,7 +297,7 @@ static void qxl_bo_move_notify(struct ttm_buffer_object *bo, ...@@ -297,7 +297,7 @@ static void qxl_bo_move_notify(struct ttm_buffer_object *bo,
if (!qxl_ttm_bo_is_qxl_bo(bo)) if (!qxl_ttm_bo_is_qxl_bo(bo))
return; return;
qbo = to_qxl_bo(bo); qbo = to_qxl_bo(bo);
qdev = qbo->gem_base.dev->dev_private; qdev = qbo->tbo.base.dev->dev_private;
if (bo->mem.mem_type == TTM_PL_PRIV && qbo->surface_id) if (bo->mem.mem_type == TTM_PL_PRIV && qbo->surface_id)
qxl_surface_evict(qdev, qbo, new_mem ? true : false); qxl_surface_evict(qdev, qbo, new_mem ? true : false);
......
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