drm/ttm: Clean usage of ttm_io_prot() with TTM_PL_FLAG_CACHED
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>
This commit is contained in:
parent
6bd3110ce6
commit
94318d50ff
@ -480,27 +480,23 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
|
|||||||
|
|
||||||
pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp)
|
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 defined(__i386__) || defined(__x86_64__)
|
||||||
if (caching_flags & TTM_PL_FLAG_WC)
|
if (caching_flags & TTM_PL_FLAG_WC)
|
||||||
tmp = pgprot_writecombine(tmp);
|
tmp = pgprot_writecombine(tmp);
|
||||||
else if (boot_cpu_data.x86 > 3)
|
else if (boot_cpu_data.x86 > 3)
|
||||||
tmp = pgprot_noncached(tmp);
|
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
|
#endif
|
||||||
#if defined(__ia64__) || defined(__arm__)
|
#if defined(__ia64__) || defined(__arm__) || defined(__powerpc__)
|
||||||
if (caching_flags & TTM_PL_FLAG_WC)
|
if (caching_flags & TTM_PL_FLAG_WC)
|
||||||
tmp = pgprot_writecombine(tmp);
|
tmp = pgprot_writecombine(tmp);
|
||||||
else
|
else
|
||||||
tmp = pgprot_noncached(tmp);
|
tmp = pgprot_noncached(tmp);
|
||||||
#endif
|
#endif
|
||||||
#if defined(__sparc__) || defined(__mips__)
|
#if defined(__sparc__) || defined(__mips__)
|
||||||
if (!(caching_flags & TTM_PL_FLAG_CACHED))
|
|
||||||
tmp = pgprot_noncached(tmp);
|
tmp = pgprot_noncached(tmp);
|
||||||
#endif
|
#endif
|
||||||
return tmp;
|
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
|
* We need to use vmap to get the desired page protection
|
||||||
* or to make the buffer object look contiguous.
|
* or to make the buffer object look contiguous.
|
||||||
*/
|
*/
|
||||||
prot = (mem->placement & TTM_PL_FLAG_CACHED) ?
|
prot = ttm_io_prot(mem->placement, PAGE_KERNEL);
|
||||||
PAGE_KERNEL :
|
|
||||||
ttm_io_prot(mem->placement, PAGE_KERNEL);
|
|
||||||
map->bo_kmap_type = ttm_bo_map_vmap;
|
map->bo_kmap_type = ttm_bo_map_vmap;
|
||||||
map->virtual = vmap(ttm->pages + start_page, num_pages,
|
map->virtual = vmap(ttm->pages + start_page, num_pages,
|
||||||
0, prot);
|
0, prot);
|
||||||
|
@ -197,7 +197,6 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
cvma.vm_page_prot);
|
cvma.vm_page_prot);
|
||||||
} else {
|
} else {
|
||||||
ttm = bo->ttm;
|
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 = ttm_io_prot(bo->mem.placement,
|
||||||
cvma.vm_page_prot);
|
cvma.vm_page_prot);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user