diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c index 5f8908a5d7fd..de0c5948521d 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c | |||
@@ -146,7 +146,7 @@ static void vmw_gmr_fire_descriptors(struct vmw_private *dev_priv, | |||
146 | */ | 146 | */ |
147 | 147 | ||
148 | static unsigned long vmw_gmr_count_descriptors(struct page *pages[], | 148 | static unsigned long vmw_gmr_count_descriptors(struct page *pages[], |
149 | unsigned long num_pages) | 149 | unsigned long num_pages) |
150 | { | 150 | { |
151 | unsigned long prev_pfn = ~(0UL); | 151 | unsigned long prev_pfn = ~(0UL); |
152 | unsigned long pfn; | 152 | unsigned long pfn; |
@@ -163,45 +163,33 @@ static unsigned long vmw_gmr_count_descriptors(struct page *pages[], | |||
163 | } | 163 | } |
164 | 164 | ||
165 | int vmw_gmr_bind(struct vmw_private *dev_priv, | 165 | int vmw_gmr_bind(struct vmw_private *dev_priv, |
166 | struct ttm_buffer_object *bo) | 166 | struct page *pages[], |
167 | unsigned long num_pages, | ||
168 | int gmr_id) | ||
167 | { | 169 | { |
168 | struct ttm_tt *ttm = bo->ttm; | ||
169 | unsigned long descriptors; | ||
170 | int ret; | ||
171 | uint32_t id; | ||
172 | struct list_head desc_pages; | 170 | struct list_head desc_pages; |
171 | int ret; | ||
173 | 172 | ||
174 | if (!(dev_priv->capabilities & SVGA_CAP_GMR)) | 173 | if (unlikely(!(dev_priv->capabilities & SVGA_CAP_GMR))) |
175 | return -EINVAL; | 174 | return -EINVAL; |
176 | 175 | ||
177 | ret = ttm_tt_populate(ttm); | 176 | if (vmw_gmr_count_descriptors(pages, num_pages) > |
178 | if (unlikely(ret != 0)) | 177 | dev_priv->max_gmr_descriptors) |
179 | return ret; | ||
180 | |||
181 | descriptors = vmw_gmr_count_descriptors(ttm->pages, ttm->num_pages); | ||
182 | if (unlikely(descriptors > dev_priv->max_gmr_descriptors)) | ||
183 | return -EINVAL; | 178 | return -EINVAL; |
184 | 179 | ||
185 | INIT_LIST_HEAD(&desc_pages); | 180 | INIT_LIST_HEAD(&desc_pages); |
186 | ret = vmw_gmr_build_descriptors(&desc_pages, ttm->pages, | ||
187 | ttm->num_pages); | ||
188 | if (unlikely(ret != 0)) | ||
189 | return ret; | ||
190 | 181 | ||
191 | ret = vmw_gmr_id_alloc(dev_priv, &id); | 182 | ret = vmw_gmr_build_descriptors(&desc_pages, pages, num_pages); |
192 | if (unlikely(ret != 0)) | 183 | if (unlikely(ret != 0)) |
193 | goto out_no_id; | 184 | return ret; |
194 | 185 | ||
195 | vmw_gmr_fire_descriptors(dev_priv, id, &desc_pages); | 186 | vmw_gmr_fire_descriptors(dev_priv, gmr_id, &desc_pages); |
196 | vmw_gmr_free_descriptors(&desc_pages); | 187 | vmw_gmr_free_descriptors(&desc_pages); |
197 | vmw_dmabuf_set_gmr(bo, id); | ||
198 | return 0; | ||
199 | 188 | ||
200 | out_no_id: | 189 | return 0; |
201 | vmw_gmr_free_descriptors(&desc_pages); | ||
202 | return ret; | ||
203 | } | 190 | } |
204 | 191 | ||
192 | |||
205 | void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id) | 193 | void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id) |
206 | { | 194 | { |
207 | mutex_lock(&dev_priv->hw_mutex); | 195 | mutex_lock(&dev_priv->hw_mutex); |