aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-12-16 10:41:47 -0500
committerThierry Reding <treding@nvidia.com>2014-12-17 08:27:38 -0500
commit73c42c79767a03ae64d11457e3ce80e80e09e514 (patch)
treecfe2babf0f91fadcf5f38ff13810f5e5e108b7d4
parenta04251fc94b58ec25476e57986dfec727b812c22 (diff)
drm/tegra: gem: Use the proper size for GEM objects
If the requested buffer size wasn't a multiple of the page size, the IOMMU code would round down the size to the next multiple of the page size, thereby causing translation errors. To fix this we no longer pass around the requested size but reuse the computed size of the GEM object. This is already rounded to the next page boundary, so mapping that size works out fine. Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/drm/tegra/gem.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index c888bed4036f..8777b7f75791 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -216,8 +216,7 @@ static void tegra_bo_free(struct drm_device *drm, struct tegra_bo *bo)
216 } 216 }
217} 217}
218 218
219static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo, 219static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo)
220 size_t size)
221{ 220{
222 struct scatterlist *s; 221 struct scatterlist *s;
223 struct sg_table *sgt; 222 struct sg_table *sgt;
@@ -227,7 +226,7 @@ static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo,
227 if (IS_ERR(bo->pages)) 226 if (IS_ERR(bo->pages))
228 return PTR_ERR(bo->pages); 227 return PTR_ERR(bo->pages);
229 228
230 bo->num_pages = size >> PAGE_SHIFT; 229 bo->num_pages = bo->gem.size >> PAGE_SHIFT;
231 230
232 sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages); 231 sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages);
233 if (IS_ERR(sgt)) 232 if (IS_ERR(sgt))
@@ -262,14 +261,13 @@ put_pages:
262 return PTR_ERR(sgt); 261 return PTR_ERR(sgt);
263} 262}
264 263
265static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo, 264static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo)
266 size_t size)
267{ 265{
268 struct tegra_drm *tegra = drm->dev_private; 266 struct tegra_drm *tegra = drm->dev_private;
269 int err; 267 int err;
270 268
271 if (tegra->domain) { 269 if (tegra->domain) {
272 err = tegra_bo_get_pages(drm, bo, size); 270 err = tegra_bo_get_pages(drm, bo);
273 if (err < 0) 271 if (err < 0)
274 return err; 272 return err;
275 273
@@ -279,6 +277,8 @@ static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo,
279 return err; 277 return err;
280 } 278 }
281 } else { 279 } else {
280 size_t size = bo->gem.size;
281
282 bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr, 282 bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr,
283 GFP_KERNEL | __GFP_NOWARN); 283 GFP_KERNEL | __GFP_NOWARN);
284 if (!bo->vaddr) { 284 if (!bo->vaddr) {
@@ -302,7 +302,7 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, size_t size,
302 if (IS_ERR(bo)) 302 if (IS_ERR(bo))
303 return bo; 303 return bo;
304 304
305 err = tegra_bo_alloc(drm, bo, size); 305 err = tegra_bo_alloc(drm, bo);
306 if (err < 0) 306 if (err < 0)
307 goto release; 307 goto release;
308 308