Skip to content

Commit

Permalink
CHROMIUM: drm/virtio: Add virtio specific dma_buf_ops.
Browse files Browse the repository at this point in the history
BUG=chromium:892342
TEST=xeyes repeatedly does not fail

Change-Id: Ic4ed0b2bd3a6cc3afe1bb563e7474f407f1de0ec
Signed-off-by: David Riley <davidriley@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1351814
Reviewed-by: Tomasz Figa <tfiga@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
  • Loading branch information
David Riley authored and chrome-bot committed Jan 8, 2019
1 parent bd498c0 commit aeb585a
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
4 changes: 2 additions & 2 deletions drivers/gpu/drm/virtio/virtgpu_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,8 @@ static struct drm_driver driver = {
#endif
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
.gem_prime_export = drm_gem_prime_export,
.gem_prime_import = drm_gem_prime_import,
.gem_prime_export = virtgpu_gem_prime_export,
.gem_prime_import = virtgpu_gem_prime_import,
.gem_prime_pin = virtgpu_gem_prime_pin,
.gem_prime_unpin = virtgpu_gem_prime_unpin,
.gem_prime_get_sg_table = virtgpu_gem_prime_get_sg_table,
Expand Down
7 changes: 7 additions & 0 deletions drivers/gpu/drm/virtio/virtgpu_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,13 @@ void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo);
int virtio_gpu_object_wait(struct virtio_gpu_object *bo, bool no_wait);

/* virtgpu_prime.c */
struct dma_buf_ops;
extern const struct dma_buf_ops virtgpu_dmabuf_ops;
struct dma_buf *virtgpu_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *obj,
int flags);
struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
struct dma_buf *buf);
int virtgpu_gem_prime_pin(struct drm_gem_object *obj);
void virtgpu_gem_prime_unpin(struct drm_gem_object *obj);
struct sg_table *virtgpu_gem_prime_get_sg_table(struct drm_gem_object *obj);
Expand Down
47 changes: 47 additions & 0 deletions drivers/gpu/drm/virtio/virtgpu_prime.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,59 @@
* Authors: Andreas Pokorny
*/

#include <linux/dma-buf.h>
#include "virtgpu_drv.h"

/* Empty Implementations as there should not be any other driver for a virtual
* device that might share buffers with virtgpu
*/

const struct dma_buf_ops virtgpu_dmabuf_ops = {
.attach = drm_gem_map_attach,
.detach = drm_gem_map_detach,
.map_dma_buf = drm_gem_map_dma_buf,
.unmap_dma_buf = drm_gem_unmap_dma_buf,
.release = drm_gem_dmabuf_release,
.map = drm_gem_dmabuf_kmap,
.unmap = drm_gem_dmabuf_kunmap,
.mmap = drm_gem_dmabuf_mmap,
.vmap = drm_gem_dmabuf_vmap,
.vunmap = drm_gem_dmabuf_vunmap,
};

struct dma_buf *virtgpu_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *obj,
int flags)
{
struct dma_buf *buf;

buf = drm_gem_prime_export(dev, obj, flags);
if (!IS_ERR(buf))
buf->ops = &virtgpu_dmabuf_ops;

return buf;
}

struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
struct dma_buf *buf)
{
struct drm_gem_object *obj;

if (buf->ops == &virtgpu_dmabuf_ops) {
obj = buf->priv;
if (obj->dev == dev) {
/*
* Importing dmabuf exported from our own gem increases
* refcount on gem itself instead of f_count of dmabuf.
*/
drm_gem_object_get(obj);
return obj;
}
}

return drm_gem_prime_import(dev, buf);
}

int virtgpu_gem_prime_pin(struct drm_gem_object *obj)
{
WARN_ONCE(1, "not implemented");
Expand Down

0 comments on commit aeb585a

Please sign in to comment.