Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99f95f11 authored by Paul Mundt's avatar Paul Mundt
Browse files

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: default avatarPaul Mundt <lethal@linux-sh.org>
parent 0bb34a6b
Loading
Loading
Loading
Loading
+11 −18
Original line number Diff line number Diff line
@@ -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. */
+7 −7
Original line number Diff line number Diff line
@@ -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