sh: pci memory range checking code
authorMagnus Damm <magnus.damm@gmail.com>
Tue, 19 Feb 2008 12:35:22 +0000 (21:35 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 16 Apr 2009 07:00:14 +0000 (16:00 +0900)
This patch changes the code to use __is_pci_memory() instead of
is_pci_memaddr(). __is_pci_memory() loops through all the pci
channels on the system to match memory windows.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/boards/mach-titan/io.c
arch/sh/drivers/pci/pci.c
arch/sh/include/asm/pci.h
arch/sh/mm/ioremap_32.c

index 4badad4..053b3ed 100644 (file)
@@ -117,7 +117,7 @@ void titan_outsl(unsigned long port, const void *src, unsigned long count)
 
 void __iomem *titan_ioport_map(unsigned long port, unsigned int size)
 {
-       if (PXSEG(port) || is_pci_memaddr(port))
+       if (PXSEG(port))
                return (void __iomem *)port;
        else if (is_pci_ioaddr(port))
                return (void __iomem *)pci_ioaddr(port);
index 29ec16e..b9aca54 100644 (file)
@@ -167,9 +167,8 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
        /*
         * Presently the IORESOURCE_MEM case is a bit special, most
         * SH7751 style PCI controllers have PCI memory at a fixed
-        * location in the address space where no remapping is desired
-        * (typically at 0xfd000000, but is_pci_memaddr() will know
-        * best). With the IORESOURCE_MEM case more care has to be taken
+        * location in the address space where no remapping is desired.
+        * With the IORESOURCE_MEM case more care has to be taken
         * to inhibit page table mapping for legacy cores, but this is
         * punted off to __ioremap().
         *                                      -- PFM.
index 84d12eb..ccf5c5f 100644 (file)
@@ -61,12 +61,8 @@ extern unsigned long PCI_IO_AREA;
 #define is_pci_ioaddr(port)            \
        (((port) >= PCIBIOS_MIN_IO) &&  \
         ((port) < (PCIBIOS_MIN_IO + PCI_IO_SIZE)))
-#define is_pci_memaddr(port)           \
-       (((port) >= PCIBIOS_MIN_MEM) && \
-        ((port) < (PCIBIOS_MIN_MEM + PCI_MEM_SIZE)))
 #else
 #define is_pci_ioaddr(port)    (0)
-#define is_pci_memaddr(port)   (0)
 #endif
 
 struct pci_dev;
@@ -127,6 +123,25 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
        *strat = PCI_DMA_BURST_INFINITY;
        *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;
+}
+#else
+static inline int __is_pci_memory(unsigned long phys_addr, unsigned long size)
+{
+       return 0;
+}
 #endif
 
 /* Board-specific fixup routines. */
index 60cc486..7e04cc8 100644 (file)
@@ -56,7 +56,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
         * P1/P2 space, ioremap() will already do the right thing,
         * and we'll never get this far.
         */
-       if (is_pci_memaddr(phys_addr) && is_pci_memaddr(last_addr))
+       if (__is_pci_memory(phys_addr, size))
                return (void __iomem *)phys_addr;
 
 #if !defined(CONFIG_PMB_FIXED)
@@ -121,7 +121,7 @@ void __iounmap(void __iomem *addr)
        unsigned long seg = PXSEG(vaddr);
        struct vm_struct *p;
 
-       if (seg < P3SEG || vaddr >= P3_ADDR_MAX || is_pci_memaddr(vaddr))
+       if (seg < P3SEG || vaddr >= P3_ADDR_MAX || __is_pci_memory(vaddr, 0))
                return;
 
 #ifdef CONFIG_PMB