summaryrefslogtreecommitdiffstats
path: root/arch/ppc64/mm
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt2005-04-17 00:24:33 +0200
committerLinus Torvalds2005-04-17 00:24:33 +0200
commitdfbacdc1a0b568dfa69fb2c1b39b608074001083 (patch)
treef63fdb5db967253e46472ff776d1e22c38cee16e /arch/ppc64/mm
parent[PATCH] ppc64: very basic desktop g5 sound support (diff)
downloadkernel-qcow2-linux-dfbacdc1a0b568dfa69fb2c1b39b608074001083.tar.gz
kernel-qcow2-linux-dfbacdc1a0b568dfa69fb2c1b39b608074001083.tar.xz
kernel-qcow2-linux-dfbacdc1a0b568dfa69fb2c1b39b608074001083.zip
[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.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/arch/ppc64/mm/init.c b/arch/ppc64/mm/init.c
index 23813d03e1c4..a7149b9fc35c 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)
{