aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/virtio/virtgpu_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_object.c')
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_object.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index eca765537470..77eac4eb06b1 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -25,6 +25,18 @@
25 25
26#include "virtgpu_drv.h" 26#include "virtgpu_drv.h"
27 27
28static void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
29 uint32_t *resid)
30{
31 int handle = ida_alloc_min(&vgdev->resource_ida, 1, GFP_KERNEL);
32 *resid = handle;
33}
34
35static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
36{
37 ida_free(&vgdev->resource_ida, id);
38}
39
28static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) 40static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
29{ 41{
30 struct virtio_gpu_object *bo; 42 struct virtio_gpu_object *bo;
@@ -33,13 +45,14 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
33 bo = container_of(tbo, struct virtio_gpu_object, tbo); 45 bo = container_of(tbo, struct virtio_gpu_object, tbo);
34 vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private; 46 vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private;
35 47
36 if (bo->hw_res_handle) 48 if (bo->created)
37 virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle); 49 virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle);
38 if (bo->pages) 50 if (bo->pages)
39 virtio_gpu_object_free_sg_table(bo); 51 virtio_gpu_object_free_sg_table(bo);
40 if (bo->vmap) 52 if (bo->vmap)
41 virtio_gpu_object_kunmap(bo); 53 virtio_gpu_object_kunmap(bo);
42 drm_gem_object_release(&bo->gem_base); 54 drm_gem_object_release(&bo->gem_base);
55 virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
43 kfree(bo); 56 kfree(bo);
44} 57}
45 58
@@ -81,9 +94,11 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
81 bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); 94 bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL);
82 if (bo == NULL) 95 if (bo == NULL)
83 return -ENOMEM; 96 return -ENOMEM;
97 virtio_gpu_resource_id_get(vgdev, &bo->hw_res_handle);
84 size = roundup(size, PAGE_SIZE); 98 size = roundup(size, PAGE_SIZE);
85 ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); 99 ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size);
86 if (ret != 0) { 100 if (ret != 0) {
101 virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
87 kfree(bo); 102 kfree(bo);
88 return ret; 103 return ret;
89 } 104 }