mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
sh: pci: Rework fixed region checks in ioremap().
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>
This commit is contained in:
parent
0bb34a6bf1
commit
99f95f1178
@ -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;
|
||||
#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)
|
||||
|
||||
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;
|
||||
}
|
||||
#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. */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user