tree e299e967a72bb9b70526d7b155a3baf7720f1a63
parent 9885c0d28f00c3877f900856e0cdb869ff7de4ff
author Benjamin Herrenschmidt <[EMAIL PROTECTED]> Tue Apr 12 08:25:07 2005
committer Linus Torvalds <[EMAIL PROTECTED]> Tue Apr 12 08:25:07 2005
[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 <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
kernel/maple_setup.c | 2 +-
kernel/pSeries_setup.c | 2 +-
kernel/pci.c | 12 +++++++-----
mm/init.c | 18 +++++++++---------
4 files changed, 18 insertions(+), 16 deletions(-)
Index: arch/ppc64/kernel/maple_setup.c
===================================================================
--- e379d4210eb7e6e0c9cf9b8cdbf32935f1b9bdb4/arch/ppc64/kernel/maple_setup.c
(mode:100644 sha1:7e9a0066e4286708464b3d44d49d40fc2bf3ee49)
+++ e299e967a72bb9b70526d7b155a3baf7720f1a63/arch/ppc64/kernel/maple_setup.c
(mode:100644 sha1:fc83c7ac8aa8a67ddea3933a40bba8bc0fe8b06f)
@@ -142,7 +142,7 @@
if (physport) {
void *comport;
/* Map the uart for udbg. */
- comport = (void *)__ioremap(physport, 16, _PAGE_NO_CACHE);
+ comport = (void *)ioremap(physport, 16);
udbg_init_uart(comport, default_speed);
ppc_md.udbg_putc = udbg_putc;
Index: arch/ppc64/kernel/pSeries_setup.c
===================================================================
--- e379d4210eb7e6e0c9cf9b8cdbf32935f1b9bdb4/arch/ppc64/kernel/pSeries_setup.c
(mode:100644 sha1:66b14126beb28aa9f05e25a65f5d59c79d33444e)
+++ e299e967a72bb9b70526d7b155a3baf7720f1a63/arch/ppc64/kernel/pSeries_setup.c
(mode:100644 sha1:cf872de80f617711df2d6b8e9e9a58b0bd8d558c)
@@ -363,7 +363,7 @@
find_udbg_vterm();
else if (physport) {
/* Map the uart for udbg. */
- comport = (void *)__ioremap(physport, 16, _PAGE_NO_CACHE);
+ comport = (void *)ioremap(physport, 16);
udbg_init_uart(comport, default_speed);
ppc_md.udbg_putc = udbg_putc;
Index: arch/ppc64/kernel/pci.c
===================================================================
--- e379d4210eb7e6e0c9cf9b8cdbf32935f1b9bdb4/arch/ppc64/kernel/pci.c
(mode:100644 sha1:85f7359cfd25e5a73bda9e2ee06705809ec3885d)
+++ e299e967a72bb9b70526d7b155a3baf7720f1a63/arch/ppc64/kernel/pci.c
(mode:100644 sha1:a0a52b1884ce2104ed6bd0516f8a9f351c4e22d8)
@@ -547,8 +547,9 @@
if (range == NULL || (rlen < sizeof(struct isa_range))) {
printk(KERN_ERR "no ISA ranges or unexpected isa range size,"
"mapping 64k\n");
- __ioremap_explicit(phb_io_base_phys, (unsigned
long)phb_io_base_virt,
- 0x10000, _PAGE_NO_CACHE);
+ __ioremap_explicit(phb_io_base_phys,
+ (unsigned long)phb_io_base_virt,
+ 0x10000, _PAGE_NO_CACHE | _PAGE_GUARDED);
return;
}
@@ -576,7 +577,7 @@
__ioremap_explicit(phb_io_base_phys,
(unsigned long) phb_io_base_virt,
- size, _PAGE_NO_CACHE);
+ size, _PAGE_NO_CACHE | _PAGE_GUARDED);
}
}
@@ -692,7 +693,7 @@
struct resource *res;
hose->io_base_virt = __ioremap(hose->io_base_phys, size,
- _PAGE_NO_CACHE);
+ _PAGE_NO_CACHE | _PAGE_GUARDED);
DBG("phb%d io_base_phys 0x%lx io_base_virt 0x%lx\n",
hose->global_number, hose->io_base_phys,
(unsigned long) hose->io_base_virt);
@@ -780,7 +781,8 @@
if (get_bus_io_range(bus, &start_phys, &start_virt, &size))
return 1;
printk("mapping IO %lx -> %lx, size: %lx\n", start_phys, start_virt,
size);
- if (__ioremap_explicit(start_phys, start_virt, size, _PAGE_NO_CACHE))
+ if (__ioremap_explicit(start_phys, start_virt, size,
+ _PAGE_NO_CACHE | _PAGE_GUARDED))
return 1;
return 0;
Index: arch/ppc64/mm/init.c
===================================================================
--- e379d4210eb7e6e0c9cf9b8cdbf32935f1b9bdb4/arch/ppc64/mm/init.c (mode:100644
sha1:3ee5153f77b4c8e58bc4c14969627de88ef4070f)
+++ e299e967a72bb9b70526d7b155a3baf7720f1a63/arch/ppc64/mm/init.c (mode:100644
sha1:8ab123a46cf200dfc197d88ae67b0d9258fc0540)
@@ -155,7 +155,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
* 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)
{
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html