powerpc: Better split CONFIG_PPC_INDIRECT_PIO and CONFIG_PPC_INDIRECT_MMIO

Remove the generic PPC_INDIRECT_IO and ensure we only add overhead
to the right accessors. IE. If only CONFIG_PPC_INDIRECT_PIO is set,
we don't add overhead to all MMIO accessors.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent de021bb7
...@@ -69,8 +69,10 @@ extern unsigned long pci_dram_offset; ...@@ -69,8 +69,10 @@ extern unsigned long pci_dram_offset;
extern resource_size_t isa_mem_base; extern resource_size_t isa_mem_base;
#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_INDIRECT_IO) #ifdef CONFIG_PPC32
#error CONFIG_PPC_INDIRECT_IO is not yet supported on 32 bits #if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO)
#error CONFIG_PPC_INDIRECT_{PIO,MMIO} are not yet supported on 32 bits
#endif
#endif #endif
/* /*
...@@ -222,9 +224,9 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src, ...@@ -222,9 +224,9 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
* for PowerPC is as close as possible to the x86 version of these, and thus * for PowerPC is as close as possible to the x86 version of these, and thus
* provides fairly heavy weight barriers for the non-raw versions * provides fairly heavy weight barriers for the non-raw versions
* *
* In addition, they support a hook mechanism when CONFIG_PPC_INDIRECT_IO * In addition, they support a hook mechanism when CONFIG_PPC_INDIRECT_MMIO
* allowing the platform to provide its own implementation of some or all * or CONFIG_PPC_INDIRECT_PIO are set allowing the platform to provide its
* of the accessors. * own implementation of some or all of the accessors.
*/ */
/* /*
...@@ -240,8 +242,8 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src, ...@@ -240,8 +242,8 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
/* Indirect IO address tokens: /* Indirect IO address tokens:
* *
* When CONFIG_PPC_INDIRECT_IO is set, the platform can provide hooks * When CONFIG_PPC_INDIRECT_MMIO is set, the platform can provide hooks
* on all IOs. (Note that this is all 64 bits only for now) * on all MMIOs. (Note that this is all 64 bits only for now)
* *
* To help platforms who may need to differenciate MMIO addresses in * To help platforms who may need to differenciate MMIO addresses in
* their hooks, a bitfield is reserved for use by the platform near the * their hooks, a bitfield is reserved for use by the platform near the
...@@ -263,11 +265,14 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src, ...@@ -263,11 +265,14 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
* *
* The direct IO mapping operations will then mask off those bits * The direct IO mapping operations will then mask off those bits
* before doing the actual access, though that only happen when * before doing the actual access, though that only happen when
* CONFIG_PPC_INDIRECT_IO is set, thus be careful when you use that * CONFIG_PPC_INDIRECT_MMIO is set, thus be careful when you use that
* mechanism * mechanism
*
* For PIO, there is a separate CONFIG_PPC_INDIRECT_PIO which makes
* all PIO functions call through a hook.
*/ */
#ifdef CONFIG_PPC_INDIRECT_IO #ifdef CONFIG_PPC_INDIRECT_MMIO
#define PCI_IO_IND_TOKEN_MASK 0x0fff000000000000ul #define PCI_IO_IND_TOKEN_MASK 0x0fff000000000000ul
#define PCI_IO_IND_TOKEN_SHIFT 48 #define PCI_IO_IND_TOKEN_SHIFT 48
#define PCI_FIX_ADDR(addr) \ #define PCI_FIX_ADDR(addr) \
...@@ -672,7 +677,7 @@ extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea, ...@@ -672,7 +677,7 @@ extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea,
extern void __iounmap_at(void *ea, unsigned long size); extern void __iounmap_at(void *ea, unsigned long size);
/* /*
* When CONFIG_PPC_INDIRECT_IO is set, we use the generic iomap implementation * When CONFIG_PPC_INDIRECT_PIO is set, we use the generic iomap implementation
* which needs some additional definitions here. They basically allow PIO * which needs some additional definitions here. They basically allow PIO
* space overall to be 1GB. This will work as long as we never try to use * space overall to be 1GB. This will work as long as we never try to use
* iomap to map MMIO below 1GB which should be fine on ppc64 * iomap to map MMIO below 1GB which should be fine on ppc64
......
...@@ -119,7 +119,7 @@ obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o ...@@ -119,7 +119,7 @@ obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o
obj-$(CONFIG_8XX_MINIMAL_FPEMU) += softemu8xx.o obj-$(CONFIG_8XX_MINIMAL_FPEMU) += softemu8xx.o
ifneq ($(CONFIG_PPC_INDIRECT_IO),y) ifneq ($(CONFIG_PPC_INDIRECT_PIO),y)
obj-y += iomap.o obj-y += iomap.o
endif endif
......
...@@ -53,6 +53,7 @@ static struct iowa_bus *iowa_pci_find(unsigned long vaddr, unsigned long paddr) ...@@ -53,6 +53,7 @@ static struct iowa_bus *iowa_pci_find(unsigned long vaddr, unsigned long paddr)
return NULL; return NULL;
} }
#ifdef CONFIG_PPC_INDIRECT_MMIO
struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr) struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr)
{ {
unsigned hugepage_shift; unsigned hugepage_shift;
...@@ -90,13 +91,25 @@ struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr) ...@@ -90,13 +91,25 @@ struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr)
return bus; return bus;
} }
#else /* CONFIG_PPC_INDIRECT_MMIO */
struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr)
{
return NULL;
}
#endif /* !CONFIG_PPC_INDIRECT_MMIO */
#ifdef CONFIG_PPC_INDIRECT_PIO
struct iowa_bus *iowa_pio_find_bus(unsigned long port) struct iowa_bus *iowa_pio_find_bus(unsigned long port)
{ {
unsigned long vaddr = (unsigned long)pci_io_base + port; unsigned long vaddr = (unsigned long)pci_io_base + port;
return iowa_pci_find(vaddr, 0); return iowa_pci_find(vaddr, 0);
} }
#else
struct iowa_bus *iowa_pio_find_bus(unsigned long port)
{
return NULL;
}
#endif
#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \ #define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \
static ret iowa_##name at \ static ret iowa_##name at \
...@@ -137,6 +150,7 @@ static const struct ppc_pci_io iowa_pci_io = { ...@@ -137,6 +150,7 @@ static const struct ppc_pci_io iowa_pci_io = {
}; };
#ifdef CONFIG_PPC_INDIRECT_MMIO
static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size, static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
unsigned long flags, void *caller) unsigned long flags, void *caller)
{ {
...@@ -151,6 +165,9 @@ static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size, ...@@ -151,6 +165,9 @@ static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
} }
return res; return res;
} }
#else /* CONFIG_PPC_INDIRECT_MMIO */
#define iowa_ioremap NULL
#endif /* !CONFIG_PPC_INDIRECT_MMIO */
/* Enable IO workaround */ /* Enable IO workaround */
static void io_workaround_init(void) static void io_workaround_init(void)
......
...@@ -716,8 +716,7 @@ void __init setup_per_cpu_areas(void) ...@@ -716,8 +716,7 @@ void __init setup_per_cpu_areas(void)
#endif #endif
#ifdef CONFIG_PPC_INDIRECT_IO #if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO)
struct ppc_pci_io ppc_pci_io; struct ppc_pci_io ppc_pci_io;
EXPORT_SYMBOL(ppc_pci_io); EXPORT_SYMBOL(ppc_pci_io);
#endif /* CONFIG_PPC_INDIRECT_IO */ #endif
...@@ -202,17 +202,12 @@ config PPC_P7_NAP ...@@ -202,17 +202,12 @@ config PPC_P7_NAP
bool bool
default n default n
config PPC_INDIRECT_IO
bool
select GENERIC_IOMAP
config PPC_INDIRECT_PIO config PPC_INDIRECT_PIO
bool bool
select PPC_INDIRECT_IO select GENERIC_IOMAP
config PPC_INDIRECT_MMIO config PPC_INDIRECT_MMIO
bool bool
select PPC_INDIRECT_IO
config PPC_IO_WORKAROUNDS config PPC_IO_WORKAROUNDS
bool bool
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment