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: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Родитель
de021bb79c
Коммит
ecd73cc5c9
|
@ -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,
|
||||||
* 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,
|
||||||
|
|
||||||
/* 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,
|
||||||
*
|
*
|
||||||
* 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,
|
||||||
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
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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 = {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#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,
|
||||||
}
|
}
|
||||||
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)
|
||||||
#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
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config PPC_INDIRECT_IO
|
config PPC_INDIRECT_PIO
|
||||||
bool
|
bool
|
||||||
select GENERIC_IOMAP
|
select GENERIC_IOMAP
|
||||||
|
|
||||||
config PPC_INDIRECT_PIO
|
|
||||||
bool
|
|
||||||
select PPC_INDIRECT_IO
|
|
||||||
|
|
||||||
config PPC_INDIRECT_MMIO
|
config PPC_INDIRECT_MMIO
|
||||||
bool
|
bool
|
||||||
select PPC_INDIRECT_IO
|
|
||||||
|
|
||||||
config PPC_IO_WORKAROUNDS
|
config PPC_IO_WORKAROUNDS
|
||||||
bool
|
bool
|
||||||
|
|
Загрузка…
Ссылка в новой задаче