diff options
author | Ezequiel Garcia <ezequiel@collabora.com> | 2018-09-25 12:16:05 -0400 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2018-09-26 02:05:06 -0400 |
commit | a20c4173c4219d85ba7775fde584cd34305a0b3d (patch) | |
tree | ef61b4923f6927713a5aee08aea495a85c570144 | |
parent | 02c87cabd6f1a6de151f999690393c3b8ad07b90 (diff) |
virtio: Rework virtio_gpu_object_kmap()
Currently, virtio_gpu_object_kmap() is only called by
virtio_gpufb_create(), when a DRM framebuffer is created.
Thus, instead of returning the vmap'ed address, emit a warning
if virtio_gpu_object_kmap is called on an already mapped
object. With this change, kmap/kunmap calls are now balanced.
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20180925161606.17980-3-ezequiel@collabora.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_fb.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_object.c | 11 |
3 files changed, 6 insertions, 17 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 6669bf4c4ca3..d29f0c7c768c 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h | |||
@@ -364,7 +364,7 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, | |||
364 | unsigned long size, bool kernel, bool pinned, | 364 | unsigned long size, bool kernel, bool pinned, |
365 | struct virtio_gpu_object **bo_ptr); | 365 | struct virtio_gpu_object **bo_ptr); |
366 | void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo); | 366 | void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo); |
367 | int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr); | 367 | int virtio_gpu_object_kmap(struct virtio_gpu_object *bo); |
368 | int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, | 368 | int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, |
369 | struct virtio_gpu_object *bo); | 369 | struct virtio_gpu_object *bo); |
370 | void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo); | 370 | void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo); |
diff --git a/drivers/gpu/drm/virtio/virtgpu_fb.c b/drivers/gpu/drm/virtio/virtgpu_fb.c index e1e41efabec1..cea749f4ec39 100644 --- a/drivers/gpu/drm/virtio/virtgpu_fb.c +++ b/drivers/gpu/drm/virtio/virtgpu_fb.c | |||
@@ -203,12 +203,6 @@ static struct fb_ops virtio_gpufb_ops = { | |||
203 | .fb_imageblit = virtio_gpu_3d_imageblit, | 203 | .fb_imageblit = virtio_gpu_3d_imageblit, |
204 | }; | 204 | }; |
205 | 205 | ||
206 | static int virtio_gpu_vmap_fb(struct virtio_gpu_device *vgdev, | ||
207 | struct virtio_gpu_object *obj) | ||
208 | { | ||
209 | return virtio_gpu_object_kmap(obj, NULL); | ||
210 | } | ||
211 | |||
212 | static int virtio_gpufb_create(struct drm_fb_helper *helper, | 206 | static int virtio_gpufb_create(struct drm_fb_helper *helper, |
213 | struct drm_fb_helper_surface_size *sizes) | 207 | struct drm_fb_helper_surface_size *sizes) |
214 | { | 208 | { |
@@ -241,9 +235,9 @@ static int virtio_gpufb_create(struct drm_fb_helper *helper, | |||
241 | virtio_gpu_cmd_create_resource(vgdev, resid, format, | 235 | virtio_gpu_cmd_create_resource(vgdev, resid, format, |
242 | mode_cmd.width, mode_cmd.height); | 236 | mode_cmd.width, mode_cmd.height); |
243 | 237 | ||
244 | ret = virtio_gpu_vmap_fb(vgdev, obj); | 238 | ret = virtio_gpu_object_kmap(obj); |
245 | if (ret) { | 239 | if (ret) { |
246 | DRM_ERROR("failed to vmap fb %d\n", ret); | 240 | DRM_ERROR("failed to kmap fb %d\n", ret); |
247 | goto err_obj_vmap; | 241 | goto err_obj_vmap; |
248 | } | 242 | } |
249 | 243 | ||
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 113eae00d293..eca765537470 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c | |||
@@ -107,22 +107,17 @@ void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo) | |||
107 | ttm_bo_kunmap(&bo->kmap); | 107 | ttm_bo_kunmap(&bo->kmap); |
108 | } | 108 | } |
109 | 109 | ||
110 | int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr) | 110 | int virtio_gpu_object_kmap(struct virtio_gpu_object *bo) |
111 | { | 111 | { |
112 | bool is_iomem; | 112 | bool is_iomem; |
113 | int r; | 113 | int r; |
114 | 114 | ||
115 | if (bo->vmap) { | 115 | WARN_ON(bo->vmap); |
116 | if (ptr) | 116 | |
117 | *ptr = bo->vmap; | ||
118 | return 0; | ||
119 | } | ||
120 | r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap); | 117 | r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap); |
121 | if (r) | 118 | if (r) |
122 | return r; | 119 | return r; |
123 | bo->vmap = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem); | 120 | bo->vmap = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem); |
124 | if (ptr) | ||
125 | *ptr = bo->vmap; | ||
126 | return 0; | 121 | return 0; |
127 | } | 122 | } |
128 | 123 | ||