forked from Minki/linux
drm/qxl: use embedded gem object
Drop drm_gem_object from qxl_bo, use the ttm_buffer_object.base instead. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Christian König <christian.koenig@amd.com> Link: http://patchwork.freedesktop.org/patch/msgid/20190805140119.7337-4-kraxel@redhat.com
This commit is contained in:
parent
0e580c6d7d
commit
e0828d54c8
@ -377,7 +377,7 @@ void qxl_io_destroy_primary(struct qxl_device *qdev)
|
||||
{
|
||||
wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC);
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
qdev->primary_bo = bo;
|
||||
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)
|
||||
|
@ -66,7 +66,7 @@ qxl_debugfs_buffers_info(struct seq_file *m, void *data)
|
||||
rcu_read_unlock();
|
||||
|
||||
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);
|
||||
}
|
||||
return 0;
|
||||
|
@ -797,7 +797,7 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane,
|
||||
qdev->dumb_shadow_bo->surf.height != surf.height) {
|
||||
if (qdev->dumb_shadow_bo) {
|
||||
drm_gem_object_put_unlocked
|
||||
(&qdev->dumb_shadow_bo->gem_base);
|
||||
(&qdev->dumb_shadow_bo->tbo.base);
|
||||
qdev->dumb_shadow_bo = NULL;
|
||||
}
|
||||
qxl_bo_create(qdev, surf.height * surf.stride,
|
||||
@ -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) {
|
||||
drm_gem_object_put_unlocked
|
||||
(&user_bo->shadow->gem_base);
|
||||
(&user_bo->shadow->tbo.base);
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -841,7 +841,7 @@ static void qxl_plane_cleanup_fb(struct drm_plane *plane,
|
||||
qxl_bo_unpin(user_bo);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -71,12 +71,13 @@ extern int qxl_max_ioctls;
|
||||
QXL_INTERRUPT_CLIENT_MONITORS_CONFIG)
|
||||
|
||||
struct qxl_bo {
|
||||
struct ttm_buffer_object tbo;
|
||||
|
||||
/* Protected by gem.mutex */
|
||||
struct list_head list;
|
||||
/* Protected by tbo.reserved */
|
||||
struct ttm_place placements[3];
|
||||
struct ttm_placement placement;
|
||||
struct ttm_buffer_object tbo;
|
||||
struct ttm_bo_kmap_obj kmap;
|
||||
unsigned int pin_count;
|
||||
void *kptr;
|
||||
@ -84,7 +85,6 @@ struct qxl_bo {
|
||||
int type;
|
||||
|
||||
/* Constant after initialization */
|
||||
struct drm_gem_object gem_base;
|
||||
unsigned int is_primary:1; /* is this now a primary surface */
|
||||
unsigned int is_dumb:1;
|
||||
struct qxl_bo *shadow;
|
||||
@ -93,7 +93,7 @@ struct qxl_bo {
|
||||
uint32_t surface_id;
|
||||
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)
|
||||
|
||||
struct qxl_gem {
|
||||
|
@ -63,7 +63,7 @@ int qxl_gem_object_create(struct qxl_device *qdev, int size,
|
||||
size, initial_domain, alignment, r);
|
||||
return r;
|
||||
}
|
||||
*obj = &qbo->gem_base;
|
||||
*obj = &qbo->tbo.base;
|
||||
|
||||
mutex_lock(&qdev->gem.mutex);
|
||||
list_add_tail(&qbo->list, &qdev->gem.objects);
|
||||
|
@ -33,14 +33,14 @@ static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
struct qxl_device *qdev;
|
||||
|
||||
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);
|
||||
WARN_ON_ONCE(bo->map_count > 0);
|
||||
mutex_lock(&qdev->gem.mutex);
|
||||
list_del_init(&bo->list);
|
||||
mutex_unlock(&qdev->gem.mutex);
|
||||
drm_gem_object_release(&bo->gem_base);
|
||||
drm_gem_object_release(&bo->tbo.base);
|
||||
kfree(bo);
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ int qxl_bo_create(struct qxl_device *qdev,
|
||||
if (bo == NULL)
|
||||
return -ENOMEM;
|
||||
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)) {
|
||||
kfree(bo);
|
||||
return r;
|
||||
@ -214,20 +214,20 @@ void qxl_bo_unref(struct qxl_bo **bo)
|
||||
if ((*bo) == NULL)
|
||||
return;
|
||||
|
||||
drm_gem_object_put_unlocked(&(*bo)->gem_base);
|
||||
drm_gem_object_put_unlocked(&(*bo)->tbo.base);
|
||||
*bo = NULL;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static int __qxl_bo_pin(struct qxl_bo *bo)
|
||||
{
|
||||
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;
|
||||
|
||||
if (bo->pin_count) {
|
||||
@ -247,7 +247,7 @@ static int __qxl_bo_pin(struct qxl_bo *bo)
|
||||
static int __qxl_bo_unpin(struct qxl_bo *bo)
|
||||
{
|
||||
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;
|
||||
|
||||
if (!bo->pin_count) {
|
||||
@ -310,13 +310,13 @@ void qxl_bo_force_delete(struct qxl_device *qdev)
|
||||
dev_err(qdev->ddev.dev, "Userspace still has active objects !\n");
|
||||
list_for_each_entry_safe(bo, n, &qdev->gem.objects, list) {
|
||||
dev_err(qdev->ddev.dev, "%p %p %lu %lu force free\n",
|
||||
&bo->gem_base, bo, (unsigned long)bo->gem_base.size,
|
||||
*((unsigned long *)&bo->gem_base.refcount));
|
||||
&bo->tbo.base, bo, (unsigned long)bo->tbo.base.size,
|
||||
*((unsigned long *)&bo->tbo.base.refcount));
|
||||
mutex_lock(&qdev->gem.mutex);
|
||||
list_del_init(&bo->list);
|
||||
mutex_unlock(&qdev->gem.mutex);
|
||||
/* 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)
|
||||
r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
|
||||
if (unlikely(r != 0)) {
|
||||
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);
|
||||
}
|
||||
@ -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);
|
||||
if (unlikely(r != 0)) {
|
||||
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",
|
||||
bo);
|
||||
|
@ -243,7 +243,7 @@ static int qxl_release_validate_bo(struct qxl_bo *bo)
|
||||
return ret;
|
||||
|
||||
/* 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)
|
||||
return ret;
|
||||
return 0;
|
||||
|
@ -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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -297,7 +297,7 @@ static void qxl_bo_move_notify(struct ttm_buffer_object *bo,
|
||||
if (!qxl_ttm_bo_is_qxl_bo(bo))
|
||||
return;
|
||||
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)
|
||||
qxl_surface_evict(qdev, qbo, new_mem ? true : false);
|
||||
|
Loading…
Reference in New Issue
Block a user