These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / tegra / gem.c
index 1217272..01e16e1 100644 (file)
@@ -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)
 {
        struct scatterlist *s;
-       struct sg_table *sgt;
        unsigned int i;
 
        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)
 
        bo->num_pages = bo->gem.size >> PAGE_SHIFT;
 
-       sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages);
-       if (IS_ERR(sgt))
+       bo->sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages);
+       if (IS_ERR(bo->sgt))
                goto put_pages;
 
        /*
-        * Fake up the SG table so that dma_map_sg() can be used to flush the
-        * pages associated with it. Note that this relies on the fact that
-        * the DMA API doesn't hook into IOMMU on Tegra, therefore mapping is
-        * only cache maintenance.
+        * Fake up the SG table so that dma_sync_sg_for_device() can be used
+        * to flush the pages associated with it.
         *
         * TODO: Replace this by drm_clflash_sg() once it can be implemented
         * 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);
 
-       if (dma_map_sg(drm->dev, sgt->sgl, sgt->nents, DMA_TO_DEVICE) == 0)
-               goto release_sgt;
-
-       bo->sgt = sgt;
+       dma_sync_sg_for_device(drm->dev, bo->sgt->sgl, bo->sgt->nents,
+                              DMA_TO_DEVICE);
 
        return 0;
 
-release_sgt:
-       sg_free_table(sgt);
-       kfree(sgt);
-       sgt = ERR_PTR(-ENOMEM);
 put_pages:
        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)