drm/ttm: Clean usage of ttm_io_prot() with TTM_PL_FLAG_CACHED
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 4 Sep 2014 07:47:23 +0000 (17:47 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 23 Sep 2014 05:00:26 +0000 (15:00 +1000)
Today, most callers of ttm_io_prot() check TTM_PL_FLAG_CACHED before
calling it since on some archs it will unconditionally create non-cached
mappings.

But not all callers do which is incorrect as far as I can tell.

Instead, move that check inside ttm_io_port() itself for all archs
and make powerpc use the same implementation as ia64 and arm

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/ttm/ttm_bo_vm.c

index 824af90cbe315c16caa543ef8f2d6ae26f90a374..882cccdad27249c8e3afa992419fb0fb16bec97b 100644 (file)
@@ -480,28 +480,24 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
 
 pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp)
 {
+       /* Cached mappings need no adjustment */
+       if (caching_flags & TTM_PL_FLAG_CACHED)
+               return tmp;
+
 #if defined(__i386__) || defined(__x86_64__)
        if (caching_flags & TTM_PL_FLAG_WC)
                tmp = pgprot_writecombine(tmp);
        else if (boot_cpu_data.x86 > 3)
                tmp = pgprot_noncached(tmp);
-
-#elif defined(__powerpc__)
-       if (!(caching_flags & TTM_PL_FLAG_CACHED)) {
-               pgprot_val(tmp) |= _PAGE_NO_CACHE;
-               if (caching_flags & TTM_PL_FLAG_UNCACHED)
-                       pgprot_val(tmp) |= _PAGE_GUARDED;
-       }
 #endif
-#if defined(__ia64__) || defined(__arm__)
+#if defined(__ia64__) || defined(__arm__) || defined(__powerpc__)
        if (caching_flags & TTM_PL_FLAG_WC)
                tmp = pgprot_writecombine(tmp);
        else
                tmp = pgprot_noncached(tmp);
 #endif
 #if defined(__sparc__) || defined(__mips__)
-       if (!(caching_flags & TTM_PL_FLAG_CACHED))
-               tmp = pgprot_noncached(tmp);
+       tmp = pgprot_noncached(tmp);
 #endif
        return tmp;
 }
@@ -560,9 +556,7 @@ static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo,
                 * We need to use vmap to get the desired page protection
                 * or to make the buffer object look contiguous.
                 */
-               prot = (mem->placement & TTM_PL_FLAG_CACHED) ?
-                       PAGE_KERNEL :
-                       ttm_io_prot(mem->placement, PAGE_KERNEL);
+               prot = ttm_io_prot(mem->placement, PAGE_KERNEL);
                map->bo_kmap_type = ttm_bo_map_vmap;
                map->virtual = vmap(ttm->pages + start_page, num_pages,
                                    0, prot);
index d05437f219e9ead8888226579c6301294e267fc9..8fb7213277cc9029d101f2006e7bc50289ab51df 100644 (file)
@@ -197,9 +197,8 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                                                cvma.vm_page_prot);
        } else {
                ttm = bo->ttm;
-               if (!(bo->mem.placement & TTM_PL_FLAG_CACHED))
-                       cvma.vm_page_prot = ttm_io_prot(bo->mem.placement,
-                                                       cvma.vm_page_prot);
+               cvma.vm_page_prot = ttm_io_prot(bo->mem.placement,
+                                               cvma.vm_page_prot);
 
                /* Allocate all page at once, most common usage */
                if (ttm->bdev->driver->ttm_tt_populate(ttm)) {