mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +08:00
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:
parent
ef53fdeb7e
commit
ef339f241b
@ -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);
|
||||||
|
@ -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.
|
||||||
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user