diff options
Diffstat (limited to 'drivers/gpu/drm/qxl/qxl_cmd.c')
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 36 | 
1 files changed, 15 insertions, 21 deletions
| diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index dffc5093ff16..0a2e51af1230 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c @@ -25,6 +25,8 @@  /* QXL cmd/ring handling */ +#include <drm/drm_util.h> +  #include "qxl_drv.h"  #include "qxl_object.h" @@ -372,25 +374,25 @@ void qxl_io_flush_surfaces(struct qxl_device *qdev)  void qxl_io_destroy_primary(struct qxl_device *qdev)  {  	wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC); -	qdev->primary_created = false; +	qdev->primary_bo->is_primary = false; +	drm_gem_object_put_unlocked(&qdev->primary_bo->gem_base); +	qdev->primary_bo = NULL;  } -void qxl_io_create_primary(struct qxl_device *qdev, -			   unsigned int offset, struct qxl_bo *bo) +void qxl_io_create_primary(struct qxl_device *qdev, struct qxl_bo *bo)  {  	struct qxl_surface_create *create; +	if (WARN_ON(qdev->primary_bo)) +		return; +  	DRM_DEBUG_DRIVER("qdev %p, ram_header %p\n", qdev, qdev->ram_header);  	create = &qdev->ram_header->create_surface;  	create->format = bo->surf.format;  	create->width = bo->surf.width;  	create->height = bo->surf.height;  	create->stride = bo->surf.stride; -	if (bo->shadow) { -		create->mem = qxl_bo_physical_address(qdev, bo->shadow, offset); -	} else { -		create->mem = qxl_bo_physical_address(qdev, bo, offset); -	} +	create->mem = qxl_bo_physical_address(qdev, bo, 0);  	DRM_DEBUG_DRIVER("mem = %llx, from %p\n", create->mem, bo->kptr); @@ -398,7 +400,9 @@ void qxl_io_create_primary(struct qxl_device *qdev,  	create->type = QXL_SURF_TYPE_PRIMARY;  	wait_for_io_cmd(qdev, 0, QXL_IO_CREATE_PRIMARY_ASYNC); -	qdev->primary_created = true; +	qdev->primary_bo = bo; +	qdev->primary_bo->is_primary = true; +	drm_gem_object_get(&qdev->primary_bo->gem_base);  }  void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id) @@ -458,8 +462,7 @@ void qxl_surface_id_dealloc(struct qxl_device *qdev,  }  int qxl_hw_surface_alloc(struct qxl_device *qdev, -			 struct qxl_bo *surf, -			 struct ttm_mem_reg *new_mem) +			 struct qxl_bo *surf)  {  	struct qxl_surface_cmd *cmd;  	struct qxl_release *release; @@ -485,16 +488,7 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev,  	cmd->u.surface_create.width = surf->surf.width;  	cmd->u.surface_create.height = surf->surf.height;  	cmd->u.surface_create.stride = surf->surf.stride; -	if (new_mem) { -		int slot_id = surf->type == QXL_GEM_DOMAIN_VRAM ? qdev->main_mem_slot : qdev->surfaces_mem_slot; -		struct qxl_memslot *slot = &(qdev->mem_slots[slot_id]); - -		/* TODO - need to hold one of the locks to read tbo.offset */ -		cmd->u.surface_create.data = slot->high_bits; - -		cmd->u.surface_create.data |= (new_mem->start << PAGE_SHIFT) + surf->tbo.bdev->man[new_mem->mem_type].gpu_offset; -	} else -		cmd->u.surface_create.data = qxl_bo_physical_address(qdev, surf, 0); +	cmd->u.surface_create.data = qxl_bo_physical_address(qdev, surf, 0);  	cmd->surface_id = surf->surface_id;  	qxl_release_unmap(qdev, release, &cmd->release_info); | 
