Commit 4441235f authored by Gerd Hoffmann's avatar Gerd Hoffmann

drm/virtio: use struct to pass params to virtio_gpu_object_create()

Create virtio_gpu_object_params, use that to pass object parameters to
virtio_gpu_object_create.  This is just the first step, followup patches
will add more parameters to the struct.  The plan is to use the struct
for all object parameters.

Drop unused "kernel" parameter for virtio_gpu_alloc_object(), it is
unused and always false.

Also drop "pinned" parameter.  virtio-gpu doesn't shuffle around
objects, so effecively they all are pinned anyway.  Hardcode
TTM_PL_FLAG_NO_EVICT so ttm knows.  Doesn't change much for the moment
as virtio-gpu supports TTM_PL_FLAG_TT only so there is no opportunity to
move around objects.  That'll probably change in the future though.
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Acked-by: default avatarNoralf Trønnes <noralf@tronnes.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20190318113332.10900-3-kraxel@redhat.com
parent 42ca4726
...@@ -50,6 +50,10 @@ ...@@ -50,6 +50,10 @@
#define DRIVER_MINOR 1 #define DRIVER_MINOR 1
#define DRIVER_PATCHLEVEL 0 #define DRIVER_PATCHLEVEL 0
struct virtio_gpu_object_params {
unsigned long size;
};
struct virtio_gpu_object { struct virtio_gpu_object {
struct drm_gem_object gem_base; struct drm_gem_object gem_base;
uint32_t hw_res_handle; uint32_t hw_res_handle;
...@@ -217,16 +221,16 @@ int virtio_gpu_gem_init(struct virtio_gpu_device *vgdev); ...@@ -217,16 +221,16 @@ int virtio_gpu_gem_init(struct virtio_gpu_device *vgdev);
void virtio_gpu_gem_fini(struct virtio_gpu_device *vgdev); void virtio_gpu_gem_fini(struct virtio_gpu_device *vgdev);
int virtio_gpu_gem_create(struct drm_file *file, int virtio_gpu_gem_create(struct drm_file *file,
struct drm_device *dev, struct drm_device *dev,
uint64_t size, struct virtio_gpu_object_params *params,
struct drm_gem_object **obj_p, struct drm_gem_object **obj_p,
uint32_t *handle_p); uint32_t *handle_p);
int virtio_gpu_gem_object_open(struct drm_gem_object *obj, int virtio_gpu_gem_object_open(struct drm_gem_object *obj,
struct drm_file *file); struct drm_file *file);
void virtio_gpu_gem_object_close(struct drm_gem_object *obj, void virtio_gpu_gem_object_close(struct drm_gem_object *obj,
struct drm_file *file); struct drm_file *file);
struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev, struct virtio_gpu_object*
size_t size, bool kernel, virtio_gpu_alloc_object(struct drm_device *dev,
bool pinned); struct virtio_gpu_object_params *params);
int virtio_gpu_mode_dumb_create(struct drm_file *file_priv, int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
struct drm_device *dev, struct drm_device *dev,
struct drm_mode_create_dumb *args); struct drm_mode_create_dumb *args);
...@@ -342,7 +346,7 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev, ...@@ -342,7 +346,7 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev,
/* virtio_gpu_object */ /* virtio_gpu_object */
int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
unsigned long size, bool kernel, bool pinned, struct virtio_gpu_object_params *params,
struct virtio_gpu_object **bo_ptr); struct virtio_gpu_object **bo_ptr);
void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo); void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo);
int virtio_gpu_object_kmap(struct virtio_gpu_object *bo); int virtio_gpu_object_kmap(struct virtio_gpu_object *bo);
......
...@@ -34,15 +34,15 @@ void virtio_gpu_gem_free_object(struct drm_gem_object *gem_obj) ...@@ -34,15 +34,15 @@ void virtio_gpu_gem_free_object(struct drm_gem_object *gem_obj)
virtio_gpu_object_unref(&obj); virtio_gpu_object_unref(&obj);
} }
struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev, struct virtio_gpu_object*
size_t size, bool kernel, virtio_gpu_alloc_object(struct drm_device *dev,
bool pinned) struct virtio_gpu_object_params *params)
{ {
struct virtio_gpu_device *vgdev = dev->dev_private; struct virtio_gpu_device *vgdev = dev->dev_private;
struct virtio_gpu_object *obj; struct virtio_gpu_object *obj;
int ret; int ret;
ret = virtio_gpu_object_create(vgdev, size, kernel, pinned, &obj); ret = virtio_gpu_object_create(vgdev, params, &obj);
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);
...@@ -51,7 +51,7 @@ struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev, ...@@ -51,7 +51,7 @@ struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev,
int virtio_gpu_gem_create(struct drm_file *file, int virtio_gpu_gem_create(struct drm_file *file,
struct drm_device *dev, struct drm_device *dev,
uint64_t size, struct virtio_gpu_object_params *params,
struct drm_gem_object **obj_p, struct drm_gem_object **obj_p,
uint32_t *handle_p) uint32_t *handle_p)
{ {
...@@ -59,7 +59,7 @@ int virtio_gpu_gem_create(struct drm_file *file, ...@@ -59,7 +59,7 @@ int virtio_gpu_gem_create(struct drm_file *file,
int ret; int ret;
u32 handle; u32 handle;
obj = virtio_gpu_alloc_object(dev, size, false, false); obj = virtio_gpu_alloc_object(dev, params);
if (IS_ERR(obj)) if (IS_ERR(obj))
return PTR_ERR(obj); return PTR_ERR(obj);
...@@ -85,6 +85,7 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv, ...@@ -85,6 +85,7 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
struct virtio_gpu_device *vgdev = dev->dev_private; struct virtio_gpu_device *vgdev = dev->dev_private;
struct drm_gem_object *gobj; struct drm_gem_object *gobj;
struct virtio_gpu_object *obj; struct virtio_gpu_object *obj;
struct virtio_gpu_object_params params = { 0 };
int ret; int ret;
uint32_t pitch; uint32_t pitch;
uint32_t format; uint32_t format;
...@@ -96,7 +97,8 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv, ...@@ -96,7 +97,8 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
args->size = pitch * args->height; args->size = pitch * args->height;
args->size = ALIGN(args->size, PAGE_SIZE); args->size = ALIGN(args->size, PAGE_SIZE);
ret = virtio_gpu_gem_create(file_priv, dev, args->size, &gobj, params.size = args->size;
ret = virtio_gpu_gem_create(file_priv, dev, &params, &gobj,
&args->handle); &args->handle);
if (ret) if (ret)
goto fail; goto fail;
......
...@@ -279,12 +279,12 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data, ...@@ -279,12 +279,12 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
struct virtio_gpu_object *qobj; struct virtio_gpu_object *qobj;
struct drm_gem_object *obj; struct drm_gem_object *obj;
uint32_t handle = 0; uint32_t handle = 0;
uint32_t size;
struct list_head validate_list; struct list_head validate_list;
struct ttm_validate_buffer mainbuf; struct ttm_validate_buffer mainbuf;
struct virtio_gpu_fence *fence = NULL; struct virtio_gpu_fence *fence = NULL;
struct ww_acquire_ctx ticket; struct ww_acquire_ctx ticket;
struct virtio_gpu_resource_create_3d rc_3d; struct virtio_gpu_resource_create_3d rc_3d;
struct virtio_gpu_object_params params = { 0 };
if (vgdev->has_virgl_3d == false) { if (vgdev->has_virgl_3d == false) {
if (rc->depth > 1) if (rc->depth > 1)
...@@ -302,13 +302,13 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data, ...@@ -302,13 +302,13 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
INIT_LIST_HEAD(&validate_list); INIT_LIST_HEAD(&validate_list);
memset(&mainbuf, 0, sizeof(struct ttm_validate_buffer)); memset(&mainbuf, 0, sizeof(struct ttm_validate_buffer));
size = rc->size; params.size = rc->size;
/* allocate a single page size object */ /* allocate a single page size object */
if (size == 0) if (params.size == 0)
size = PAGE_SIZE; params.size = PAGE_SIZE;
qobj = virtio_gpu_alloc_object(dev, size, false, false); qobj = virtio_gpu_alloc_object(dev, &params);
if (IS_ERR(qobj)) if (IS_ERR(qobj))
return PTR_ERR(qobj); return PTR_ERR(qobj);
obj = &qobj->gem_base; obj = &qobj->gem_base;
......
...@@ -74,39 +74,33 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) ...@@ -74,39 +74,33 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
kfree(bo); kfree(bo);
} }
static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo, static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo)
bool pinned)
{ {
u32 c = 1; u32 c = 1;
u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0;
vgbo->placement.placement = &vgbo->placement_code; vgbo->placement.placement = &vgbo->placement_code;
vgbo->placement.busy_placement = &vgbo->placement_code; vgbo->placement.busy_placement = &vgbo->placement_code;
vgbo->placement_code.fpfn = 0; vgbo->placement_code.fpfn = 0;
vgbo->placement_code.lpfn = 0; vgbo->placement_code.lpfn = 0;
vgbo->placement_code.flags = vgbo->placement_code.flags =
TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT | pflag; TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT |
TTM_PL_FLAG_NO_EVICT;
vgbo->placement.num_placement = c; vgbo->placement.num_placement = c;
vgbo->placement.num_busy_placement = c; vgbo->placement.num_busy_placement = c;
} }
int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
unsigned long size, bool kernel, bool pinned, struct virtio_gpu_object_params *params,
struct virtio_gpu_object **bo_ptr) struct virtio_gpu_object **bo_ptr)
{ {
struct virtio_gpu_object *bo; struct virtio_gpu_object *bo;
enum ttm_bo_type type;
size_t acc_size; size_t acc_size;
int ret; int ret;
if (kernel)
type = ttm_bo_type_kernel;
else
type = ttm_bo_type_device;
*bo_ptr = NULL; *bo_ptr = NULL;
acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, size, acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, params->size,
sizeof(struct virtio_gpu_object)); sizeof(struct virtio_gpu_object));
bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL);
...@@ -117,19 +111,20 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, ...@@ -117,19 +111,20 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
kfree(bo); kfree(bo);
return ret; return ret;
} }
size = roundup(size, PAGE_SIZE); params->size = roundup(params->size, PAGE_SIZE);
ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, params->size);
if (ret != 0) { if (ret != 0) {
virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle); virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
kfree(bo); kfree(bo);
return ret; return ret;
} }
bo->dumb = false; bo->dumb = false;
virtio_gpu_init_ttm_placement(bo, pinned); virtio_gpu_init_ttm_placement(bo);
ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, size, type, ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, params->size,
&bo->placement, 0, !kernel, acc_size, ttm_bo_type_device, &bo->placement, 0,
NULL, NULL, &virtio_gpu_ttm_bo_destroy); true, acc_size, NULL, NULL,
&virtio_gpu_ttm_bo_destroy);
/* ttm_bo_init failure will call the destroy */ /* ttm_bo_init failure will call the destroy */
if (ret != 0) if (ret != 0)
return ret; return ret;
......
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