OSDN Git Service

drm: omapdrm: DMA-unmap pages for all buffer types when freeing buffers
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 20 Apr 2017 21:33:57 +0000 (00:33 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 2 Jun 2017 07:57:07 +0000 (10:57 +0300)
Both coherent (uncached) and non-coherent (cached) buffers can have
their pages mapped to the device through the DMA mapping API. Make sure
to unmap any mapped page when freeing a buffer, regardless of its type.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/gpu/drm/omapdrm/omap_gem.c

index eb02a13..94aef52 100644 (file)
@@ -316,18 +316,13 @@ static int get_pages(struct drm_gem_object *obj, struct page ***pages)
 static void omap_gem_detach_pages(struct drm_gem_object *obj)
 {
        struct omap_gem_object *omap_obj = to_omap_bo(obj);
+       unsigned int npages = obj->size >> PAGE_SHIFT;
+       unsigned int i;
 
-       /* for non-cached buffers, ensure the new pages are clean because
-        * DSS, GPU, etc. are not cache coherent:
-        */
-       if (omap_obj->flags & (OMAP_BO_WC|OMAP_BO_UNCACHED)) {
-               int i, npages = obj->size >> PAGE_SHIFT;
-               for (i = 0; i < npages; i++) {
-                       if (omap_obj->dma_addrs[i])
-                               dma_unmap_page(obj->dev->dev,
-                                              omap_obj->dma_addrs[i],
-                                              PAGE_SIZE, DMA_BIDIRECTIONAL);
-               }
+       for (i = 0; i < npages; i++) {
+               if (omap_obj->dma_addrs[i])
+                       dma_unmap_page(obj->dev->dev, omap_obj->dma_addrs[i],
+                                      PAGE_SIZE, DMA_BIDIRECTIONAL);
        }
 
        kfree(omap_obj->dma_addrs);