diff options
author | Dave Airlie <airlied@redhat.com> | 2012-05-31 08:52:17 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-05-31 09:14:00 -0400 |
commit | 35916acedd8dadb361ef6439d05d60fbe8f53032 (patch) | |
tree | a28efb80e00b96028ce6152c888801e27c8ef58f | |
parent | e8aa1d1ebcbcf98fbb20cad83098f25c7d52753f (diff) |
nouveau: add vmap support to nouveau prime support
Tested sharing to udl.
Signed-off-by: Dave Airlie <airlied@redhat.com>
-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 |