diff options
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_prime.c')
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_prime.c | 32 | 
1 files changed, 30 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c index e45dbf14b307..55d80b77d9b0 100644 --- a/drivers/gpu/drm/virtio/virtgpu_prime.c +++ b/drivers/gpu/drm/virtio/virtgpu_prime.c @@ -43,13 +43,41 @@ static int virtgpu_virtio_get_uuid(struct dma_buf *buf,  	return 0;  } +static struct sg_table * +virtgpu_gem_map_dma_buf(struct dma_buf_attachment *attach, +			enum dma_data_direction dir) +{ +	struct drm_gem_object *obj = attach->dmabuf->priv; +	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); + +	if (virtio_gpu_is_vram(bo)) +		return virtio_gpu_vram_map_dma_buf(bo, attach->dev, dir); + +	return drm_gem_map_dma_buf(attach, dir); +} + +static void virtgpu_gem_unmap_dma_buf(struct dma_buf_attachment *attach, +				      struct sg_table *sgt, +				      enum dma_data_direction dir) +{ +	struct drm_gem_object *obj = attach->dmabuf->priv; +	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); + +	if (virtio_gpu_is_vram(bo)) { +		virtio_gpu_vram_unmap_dma_buf(attach->dev, sgt, dir); +		return; +	} + +	drm_gem_unmap_dma_buf(attach, sgt, dir); +} +  static const struct virtio_dma_buf_ops virtgpu_dmabuf_ops =  {  	.ops = {  		.cache_sgt_mapping = true,  		.attach = virtio_dma_buf_attach,  		.detach = drm_gem_map_detach, -		.map_dma_buf = drm_gem_map_dma_buf, -		.unmap_dma_buf = drm_gem_unmap_dma_buf, +		.map_dma_buf = virtgpu_gem_map_dma_buf, +		.unmap_dma_buf = virtgpu_gem_unmap_dma_buf,  		.release = drm_gem_dmabuf_release,  		.mmap = drm_gem_dmabuf_mmap,  		.vmap = drm_gem_dmabuf_vmap, |