提交 fd73caa5 编写于 作者: T Thierry Reding

drm/tegra: gem: Flush pages after allocation

Pages allocated from shmemfs don't end up being cleared and flushed on
ARMv7, so they must be flushed explicitly. Use the DMA mapping API for
that purpose, even though it's not used for anything else.
Signed-off-by: NThierry Reding <treding@nvidia.com>
上级 4553f733
...@@ -189,7 +189,6 @@ static void tegra_bo_free(struct drm_device *drm, struct tegra_bo *bo) ...@@ -189,7 +189,6 @@ static void tegra_bo_free(struct drm_device *drm, struct tegra_bo *bo)
static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo) static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo)
{ {
struct scatterlist *s; struct scatterlist *s;
struct sg_table *sgt;
unsigned int i; unsigned int i;
bo->pages = drm_gem_get_pages(&bo->gem); bo->pages = drm_gem_get_pages(&bo->gem);
...@@ -198,36 +197,28 @@ static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo) ...@@ -198,36 +197,28 @@ static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo)
bo->num_pages = bo->gem.size >> PAGE_SHIFT; bo->num_pages = bo->gem.size >> PAGE_SHIFT;
sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages); bo->sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages);
if (IS_ERR(sgt)) if (IS_ERR(bo->sgt))
goto put_pages; goto put_pages;
/* /*
* Fake up the SG table so that dma_map_sg() can be used to flush the * Fake up the SG table so that dma_sync_sg_for_device() can be used
* pages associated with it. Note that this relies on the fact that * to flush the pages associated with it.
* the DMA API doesn't hook into IOMMU on Tegra, therefore mapping is
* only cache maintenance.
* *
* TODO: Replace this by drm_clflash_sg() once it can be implemented * TODO: Replace this by drm_clflash_sg() once it can be implemented
* without relying on symbols that are not exported. * without relying on symbols that are not exported.
*/ */
for_each_sg(sgt->sgl, s, sgt->nents, i) for_each_sg(bo->sgt->sgl, s, bo->sgt->nents, i)
sg_dma_address(s) = sg_phys(s); sg_dma_address(s) = sg_phys(s);
if (dma_map_sg(drm->dev, sgt->sgl, sgt->nents, DMA_TO_DEVICE) == 0) dma_sync_sg_for_device(drm->dev, bo->sgt->sgl, bo->sgt->nents,
goto release_sgt; DMA_TO_DEVICE);
bo->sgt = sgt;
return 0; return 0;
release_sgt:
sg_free_table(sgt);
kfree(sgt);
sgt = ERR_PTR(-ENOMEM);
put_pages: put_pages:
drm_gem_put_pages(&bo->gem, bo->pages, false, false); drm_gem_put_pages(&bo->gem, bo->pages, false, false);
return PTR_ERR(sgt); return PTR_ERR(bo->sgt);
} }
static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo) static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册