diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2005-04-16 15:24:33 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:24:33 -0700 |
commit | dfbacdc1a0b568dfa69fb2c1b39b608074001083 (patch) | |
tree | f63fdb5db967253e46472ff776d1e22c38cee16e /arch/ppc64/mm | |
parent | 7bbd827750e630003896c96d0212962276ee5d91 (diff) |
[PATCH] ppc64: Fix semantics of __ioremap
This patch fixes ppc64 __ioremap() so that it stops adding implicitely
_PAGE_GUARDED when the cache is not writeback, and instead, let the callers
provide the flag they want here. This allows things like framebuffers to
explicitely request a non-cacheable and non-guarded mapping which is more
efficient for that type of memory without side effects. The patch also
fixes all current callers to add _PAGE_GUARDED except btext, which is fine
without it.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/ppc64/mm')
-rw-r--r-- | arch/ppc64/mm/init.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/arch/ppc64/mm/init.c b/arch/ppc64/mm/init.c index 23813d03e1c..a7149b9fc35 100644 --- a/arch/ppc64/mm/init.c +++ b/arch/ppc64/mm/init.c @@ -155,7 +155,8 @@ static void map_io_page(unsigned long ea, unsigned long pa, int flags) ptep = pte_alloc_kernel(&ioremap_mm, pmdp, ea); pa = abs_to_phys(pa); - set_pte_at(&ioremap_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, __pgprot(flags))); + set_pte_at(&ioremap_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, + __pgprot(flags))); spin_unlock(&ioremap_mm.page_table_lock); } else { unsigned long va, vpn, hash, hpteg; @@ -191,12 +192,9 @@ static void __iomem * __ioremap_com(unsigned long addr, unsigned long pa, if ((flags & _PAGE_PRESENT) == 0) flags |= pgprot_val(PAGE_KERNEL); - if (flags & (_PAGE_NO_CACHE | _PAGE_WRITETHRU)) - flags |= _PAGE_GUARDED; - for (i = 0; i < size; i += PAGE_SIZE) { + for (i = 0; i < size; i += PAGE_SIZE) map_io_page(ea+i, pa+i, flags); - } return (void __iomem *) (ea + (addr & ~PAGE_MASK)); } @@ -205,7 +203,7 @@ static void __iomem * __ioremap_com(unsigned long addr, unsigned long pa, void __iomem * ioremap(unsigned long addr, unsigned long size) { - return __ioremap(addr, size, _PAGE_NO_CACHE); + return __ioremap(addr, size, _PAGE_NO_CACHE | _PAGE_GUARDED); } void __iomem * @@ -272,7 +270,8 @@ int __ioremap_explicit(unsigned long pa, unsigned long ea, return 1; } if (ea != (unsigned long) area->addr) { - printk(KERN_ERR "unexpected addr return from im_get_area\n"); + printk(KERN_ERR "unexpected addr return from " + "im_get_area\n"); return 1; } } @@ -315,7 +314,8 @@ static void unmap_im_area_pte(pmd_t *pmd, unsigned long address, continue; if (pte_present(page)) continue; - printk(KERN_CRIT "Whee.. Swapped out page in kernel page table\n"); + printk(KERN_CRIT "Whee.. Swapped out page in kernel page" + " table\n"); } while (address < end); } @@ -352,7 +352,7 @@ static void unmap_im_area_pmd(pgd_t *dir, unsigned long address, * Access to IO memory should be serialized by driver. * This code is modeled after vmalloc code - unmap_vm_area() * - * XXX what about calls before mem_init_done (ie python_countermeasures()) + * XXX what about calls before mem_init_done (ie python_countermeasures()) */ void iounmap(volatile void __iomem *token) { |