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);
|
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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;
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user