diff options
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_prime.c | 39 |
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 634d222c93de..8613cb23808c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
| @@ -123,6 +123,9 @@ struct nouveau_bo { | |||
| 123 | 123 | ||
| 124 | struct drm_gem_object *gem; | 124 | struct drm_gem_object *gem; |
| 125 | int pin_refcnt; | 125 | int pin_refcnt; |
| 126 | |||
| 127 | struct ttm_bo_kmap_obj dma_buf_vmap; | ||
| 128 | int vmapping_count; | ||
| 126 | }; | 129 | }; |
| 127 | 130 | ||
| 128 | #define nouveau_bo_tile_layout(nvbo) \ | 131 | #define nouveau_bo_tile_layout(nvbo) \ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c index e2bcd4e54654..a89240e5fb29 100644 --- a/drivers/gpu/drm/nouveau/nouveau_prime.c +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c | |||
| @@ -66,6 +66,43 @@ static int nouveau_gem_prime_mmap(struct dma_buf *dma_buf, struct vm_area_struct | |||
| 66 | return -EINVAL; | 66 | return -EINVAL; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static void *nouveau_gem_prime_vmap(struct dma_buf *dma_buf) | ||
| 70 | { | ||
| 71 | struct nouveau_bo *nvbo = dma_buf->priv; | ||
| 72 | struct drm_device *dev = nvbo->gem->dev; | ||
| 73 | int ret; | ||
| 74 | |||
| 75 | mutex_lock(&dev->struct_mutex); | ||
| 76 | if (nvbo->vmapping_count) { | ||
| 77 | nvbo->vmapping_count++; | ||
| 78 | goto out_unlock; | ||
| 79 | } | ||
| 80 | |||
| 81 | ret = ttm_bo_kmap(&nvbo->bo, 0, nvbo->bo.num_pages, | ||
| 82 | &nvbo->dma_buf_vmap); | ||
| 83 | if (ret) { | ||
| 84 | mutex_unlock(&dev->struct_mutex); | ||
| 85 | return ERR_PTR(ret); | ||
| 86 | } | ||
| 87 | nvbo->vmapping_count = 1; | ||
| 88 | out_unlock: | ||
| 89 | mutex_unlock(&dev->struct_mutex); | ||
| 90 | return nvbo->dma_buf_vmap.virtual; | ||
| 91 | } | ||
| 92 | |||
| 93 | static void nouveau_gem_prime_vunmap(struct dma_buf *dma_buf, void *vaddr) | ||
| 94 | { | ||
| 95 | struct nouveau_bo *nvbo = dma_buf->priv; | ||
| 96 | struct drm_device *dev = nvbo->gem->dev; | ||
| 97 | |||
| 98 | mutex_lock(&dev->struct_mutex); | ||
| 99 | nvbo->vmapping_count--; | ||
| 100 | if (nvbo->vmapping_count == 0) { | ||
| 101 | ttm_bo_kunmap(&nvbo->dma_buf_vmap); | ||
| 102 | } | ||
| 103 | mutex_unlock(&dev->struct_mutex); | ||
| 104 | } | ||
| 105 | |||
| 69 | static const struct dma_buf_ops nouveau_dmabuf_ops = { | 106 | static const struct dma_buf_ops nouveau_dmabuf_ops = { |
| 70 | .map_dma_buf = nouveau_gem_map_dma_buf, | 107 | .map_dma_buf = nouveau_gem_map_dma_buf, |
| 71 | .unmap_dma_buf = nouveau_gem_unmap_dma_buf, | 108 | .unmap_dma_buf = nouveau_gem_unmap_dma_buf, |
| @@ -75,6 +112,8 @@ static const struct dma_buf_ops nouveau_dmabuf_ops = { | |||
| 75 | .kunmap = nouveau_gem_kunmap, | 112 | .kunmap = nouveau_gem_kunmap, |
| 76 | .kunmap_atomic = nouveau_gem_kunmap_atomic, | 113 | .kunmap_atomic = nouveau_gem_kunmap_atomic, |
| 77 | .mmap = nouveau_gem_prime_mmap, | 114 | .mmap = nouveau_gem_prime_mmap, |
| 115 | .vmap = nouveau_gem_prime_vmap, | ||
| 116 | .vunmap = nouveau_gem_prime_vunmap, | ||
| 78 | }; | 117 | }; |
| 79 | 118 | ||
| 80 | static int | 119 | static int |
