X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fparisc%2Fmm%2Fioremap.c;fp=arch%2Fparisc%2Fmm%2Fioremap.c;h=edd9a9559cba92298704e3428499e8995be22c00;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=27384567a1d0a12e3719c7c9631c362e75e6636a;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c index 27384567a..edd9a9559 100644 --- a/arch/parisc/mm/ioremap.c +++ b/arch/parisc/mm/ioremap.c @@ -2,7 +2,7 @@ * arch/parisc/mm/ioremap.c * * (C) Copyright 1995 1996 Linus Torvalds - * (C) Copyright 2001-2006 Helge Deller + * (C) Copyright 2001 Helge Deller * (C) Copyright 2005 Kyle McMartin */ @@ -72,6 +72,7 @@ remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size, return 0; } +#if USE_HPPA_IOREMAP static int remap_area_pages(unsigned long address, unsigned long phys_addr, unsigned long size, unsigned long flags) @@ -113,6 +114,31 @@ remap_area_pages(unsigned long address, unsigned long phys_addr, return error; } +#endif /* USE_HPPA_IOREMAP */ + +#ifdef CONFIG_DEBUG_IOREMAP +static unsigned long last = 0; + +void gsc_bad_addr(unsigned long addr) +{ + if (time_after(jiffies, last + HZ*10)) { + printk("gsc_foo() called with bad address 0x%lx\n", addr); + dump_stack(); + last = jiffies; + } +} +EXPORT_SYMBOL(gsc_bad_addr); + +void __raw_bad_addr(const volatile void __iomem *addr) +{ + if (time_after(jiffies, last + HZ*10)) { + printk("__raw_foo() called with bad address 0x%p\n", addr); + dump_stack(); + last = jiffies; + } +} +EXPORT_SYMBOL(__raw_bad_addr); +#endif /* * Generic mapping function (not visible outside): @@ -128,20 +154,26 @@ remap_area_pages(unsigned long address, unsigned long phys_addr, */ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) { - void *addr; - struct vm_struct *area; - unsigned long offset, last_addr; +#if !(USE_HPPA_IOREMAP) -#ifdef CONFIG_EISA unsigned long end = phys_addr + size - 1; /* Support EISA addresses */ - if ((phys_addr >= 0x00080000 && end < 0x000fffff) || - (phys_addr >= 0x00500000 && end < 0x03bfffff)) { - phys_addr |= F_EXTEND(0xfc000000); - flags |= _PAGE_NO_CACHE; + if ((phys_addr >= 0x00080000 && end < 0x000fffff) + || (phys_addr >= 0x00500000 && end < 0x03bfffff)) { + phys_addr |= 0xfc000000; } + +#ifdef CONFIG_DEBUG_IOREMAP + return (void __iomem *)(phys_addr - (0x1UL << NYBBLE_SHIFT)); +#else + return (void __iomem *)phys_addr; #endif +#else + void *addr; + struct vm_struct *area; + unsigned long offset, last_addr; + /* Don't allow wraparound or zero size */ last_addr = phys_addr + size - 1; if (!size || last_addr < phys_addr) @@ -185,12 +217,15 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l } return (void __iomem *) (offset + (char *)addr); +#endif } -EXPORT_SYMBOL(__ioremap); void iounmap(void __iomem *addr) { +#if !(USE_HPPA_IOREMAP) + return; +#else if (addr > high_memory) return vfree((void *) (PAGE_MASK & (unsigned long __force) addr)); +#endif } -EXPORT_SYMBOL(iounmap);