sh: pci: Rework fixed region checks in ioremap().
authorPaul Mundt <lethal@linux-sh.org>
Mon, 20 Apr 2009 09:24:57 +0000 (18:24 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 20 Apr 2009 09:24:57 +0000 (18:24 +0900)
Not all PCI channels have non-translatable memory windows, this is a
special property of the on-chip PCIC with its 0xfd00... mapping, handle
this explicitly.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/include/asm/pci.h
arch/sh/mm/ioremap_32.c

index 532428289772911c74d6a0880eb84d0c3a3d9d88..82a9369511b5a7a0763009b13b07c936059892a4 100644 (file)
@@ -90,7 +90,6 @@ static inline void pcibios_penalize_isa_irq(int irq, int active)
 #define pci_unmap_len_set(PTR, LEN_NAME, VAL)  do { } while (0)
 #endif
 
-#ifdef CONFIG_PCI
 static inline void pci_dma_burst_advice(struct pci_dev *pdev,
                                        enum pci_dma_burst_strategy *strat,
                                        unsigned long *strategy_parameter)
@@ -99,24 +98,18 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
        *strategy_parameter = ~0UL;
 }
 
-static inline int __is_pci_memory(unsigned long phys_addr, unsigned long size)
-{
-       struct pci_channel *p;
-       struct resource *res;
-
-       for (p = board_pci_channels; p->init; p++) {
-               res = p->mem_resource;
-               if (p->enabled && (phys_addr >= res->start) &&
-                   (phys_addr + size) <= (res->end + 1))
-                       return 1;
-       }
-       return 0;
-}
+#ifdef CONFIG_SUPERH32
+/*
+ * If we're on an SH7751 or SH7780 PCI controller, PCI memory is mapped
+ * at the end of the address space in a special non-translatable area.
+ */
+#define PCI_MEM_FIXED_START    0xfd000000
+#define PCI_MEM_FIXED_END      (PCI_MEM_FIXED_START + 0x01000000)
+
+#define is_pci_memory_fixed_range(s, e)        \
+       ((s) >= PCI_MEM_FIXED_START && (e) < PCI_MEM_FIXED_END)
 #else
-static inline int __is_pci_memory(unsigned long phys_addr, unsigned long size)
-{
-       return 0;
-}
+#define is_pci_memory_fixed_range(s, e)        (0)
 #endif
 
 /* Board-specific fixup routines. */
index 7e04cc8f3b9b62ed0c0abb3052ec3ba6d0ba8d24..da2f4186f2cd32017418ede1205185cdd38d8897 100644 (file)
@@ -46,17 +46,15 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
                return NULL;
 
        /*
-        * If we're on an SH7751 or SH7780 PCI controller, PCI memory is
-        * mapped at the end of the address space (typically 0xfd000000)
-        * in a non-translatable area, so mapping through page tables for
-        * this area is not only pointless, but also fundamentally
-        * broken. Just return the physical address instead.
+        * If we're in the fixed PCI memory range, mapping through page
+        * tables is not only pointless, but also fundamentally broken.
+        * Just return the physical address instead.
         *
         * For boards that map a small PCI memory aperture somewhere in
         * P1/P2 space, ioremap() will already do the right thing,
         * and we'll never get this far.
         */
-       if (__is_pci_memory(phys_addr, size))
+       if (is_pci_memory_fixed_range(phys_addr, size))
                return (void __iomem *)phys_addr;
 
 #if !defined(CONFIG_PMB_FIXED)
@@ -121,7 +119,9 @@ void __iounmap(void __iomem *addr)
        unsigned long seg = PXSEG(vaddr);
        struct vm_struct *p;
 
-       if (seg < P3SEG || vaddr >= P3_ADDR_MAX || __is_pci_memory(vaddr, 0))
+       if (seg < P3SEG || vaddr >= P3_ADDR_MAX)
+               return;
+       if (is_pci_memory_fixed_range(vaddr, 0))
                return;
 
 #ifdef CONFIG_PMB