sh: pci memory range checking code

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>
This commit is contained in:
Magnus Damm 2008-02-19 21:35:22 +09:00 committed by Paul Mundt
parent ef53fdeb7e
commit ef339f241b
4 changed files with 24 additions and 10 deletions

View 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) 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; return (void __iomem *)port;
else if (is_pci_ioaddr(port)) else if (is_pci_ioaddr(port))
return (void __iomem *)pci_ioaddr(port); return (void __iomem *)pci_ioaddr(port);

View 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 * Presently the IORESOURCE_MEM case is a bit special, most
* SH7751 style PCI controllers have PCI memory at a fixed * SH7751 style PCI controllers have PCI memory at a fixed
* location in the address space where no remapping is desired * location in the address space where no remapping is desired.
* (typically at 0xfd000000, but is_pci_memaddr() will know * With the IORESOURCE_MEM case more care has to be taken
* best). With the IORESOURCE_MEM case more care has to be taken
* to inhibit page table mapping for legacy cores, but this is * to inhibit page table mapping for legacy cores, but this is
* punted off to __ioremap(). * punted off to __ioremap().
* -- PFM. * -- PFM.

View File

@ -61,12 +61,8 @@ extern unsigned long PCI_IO_AREA;
#define is_pci_ioaddr(port) \ #define is_pci_ioaddr(port) \
(((port) >= PCIBIOS_MIN_IO) && \ (((port) >= PCIBIOS_MIN_IO) && \
((port) < (PCIBIOS_MIN_IO + PCI_IO_SIZE))) ((port) < (PCIBIOS_MIN_IO + PCI_IO_SIZE)))
#define is_pci_memaddr(port) \
(((port) >= PCIBIOS_MIN_MEM) && \
((port) < (PCIBIOS_MIN_MEM + PCI_MEM_SIZE)))
#else #else
#define is_pci_ioaddr(port) (0) #define is_pci_ioaddr(port) (0)
#define is_pci_memaddr(port) (0)
#endif #endif
struct pci_dev; struct pci_dev;
@ -127,6 +123,25 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
*strat = PCI_DMA_BURST_INFINITY; *strat = PCI_DMA_BURST_INFINITY;
*strategy_parameter = ~0UL; *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 #endif
/* Board-specific fixup routines. */ /* Board-specific fixup routines. */

View 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, * P1/P2 space, ioremap() will already do the right thing,
* and we'll never get this far. * 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; return (void __iomem *)phys_addr;
#if !defined(CONFIG_PMB_FIXED) #if !defined(CONFIG_PMB_FIXED)
@ -121,7 +121,7 @@ void __iounmap(void __iomem *addr)
unsigned long seg = PXSEG(vaddr); unsigned long seg = PXSEG(vaddr);
struct vm_struct *p; 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; return;
#ifdef CONFIG_PMB #ifdef CONFIG_PMB