| From 61b51fb51c01a519a249d28ec55c6513a13be5a3 Mon Sep 17 00:00:00 2001 |
| From: Dmitry Osipenko <digetx@gmail.com> |
| Date: Thu, 7 Mar 2019 01:55:19 +0300 |
| Subject: drm/tegra: gem: Fix CPU-cache maintenance for BO's allocated using get_pages() |
| |
| From: Dmitry Osipenko <digetx@gmail.com> |
| |
| commit 61b51fb51c01a519a249d28ec55c6513a13be5a3 upstream. |
| |
| The allocated pages need to be invalidated in CPU caches. On ARM32 the |
| DMA_BIDIRECTIONAL flag only ensures that data is written-back to DRAM and |
| the data stays in CPU cache lines. While the DMA_FROM_DEVICE flag ensures |
| that the corresponding CPU cache lines are getting invalidated and nothing |
| more, that's exactly what is needed for a newly allocated pages. |
| |
| This fixes randomly failing rendercheck tests on Tegra30 using the |
| Opentegra driver for tests that use small-sized pixmaps (10x10 and less, |
| i.e. 1-2 memory pages) because apparently CPU reads out stale data from |
| caches and/or that data is getting evicted to DRAM at the time of HW job |
| execution. |
| |
| Fixes: bd43c9f0fa1f ("drm/tegra: gem: Map pages via the DMA API") |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Dmitry Osipenko <digetx@gmail.com> |
| Signed-off-by: Thierry Reding <treding@nvidia.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/tegra/gem.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/tegra/gem.c |
| +++ b/drivers/gpu/drm/tegra/gem.c |
| @@ -204,7 +204,7 @@ static void tegra_bo_free(struct drm_dev |
| { |
| if (bo->pages) { |
| dma_unmap_sg(drm->dev, bo->sgt->sgl, bo->sgt->nents, |
| - DMA_BIDIRECTIONAL); |
| + DMA_FROM_DEVICE); |
| drm_gem_put_pages(&bo->gem, bo->pages, true, true); |
| sg_free_table(bo->sgt); |
| kfree(bo->sgt); |
| @@ -230,7 +230,7 @@ static int tegra_bo_get_pages(struct drm |
| } |
| |
| err = dma_map_sg(drm->dev, bo->sgt->sgl, bo->sgt->nents, |
| - DMA_BIDIRECTIONAL); |
| + DMA_FROM_DEVICE); |
| if (err == 0) { |
| err = -EFAULT; |
| goto free_sgt; |