pci: use generic pci_iomap on all architectures
Subsystems (15)
v2 cover pci: use generic pci_iomap on all architectures
This reposting combines the latest version of the patches. As this is just a repost, separate versions was already sent to maintainers, I cut down the To list to just lkml and linux-arch.
This patchset has been on linux-next for several weeks now. I intend to send pull request to Linus come 3.3 merge window:
They touch a lot of arches and have interdependencies, so merging separately seems to make sense.
As Jesse Barnes noted: the PCI changes look nice (pulling all that duplicated code out looks good), though it would be good to get a few more arch maintainer acks/tested-bys for this.
The patchset is available from my tree:git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git linux-next or from linux-next.
Many architectures don't want to pull in iomap.c, so they ended up duplicating pci_iomap from that file. That function isn't trivial, and we are going to modify it
https://lkml.org/lkml/2011/11/14/183
so the duplication hurts.
This reduces the scope of the problem significantly, by moving pci_iomap to a separate file and referencing that from all architectures.
Tested on x86, build tested on alpha, mips64 and powerpc64.
Signature · 77 lines
1.7.5.53.gc233e Michael S. Tsirkin (16): lib: move GENERIC_IOMAP to lib/Kconfig lib: add GENERIC_PCI_IOMAP alpha: switch to GENERIC_PCI_IOMAP arm: switch to GENERIC_PCI_IOMAP microblaze: switch to GENERIC_PCI_IOMAP mips: switch to GENERIC_PCI_IOMAP parisc: switch to GENERIC_PCI_IOMAP powerpc: switch to GENERIC_PCI_IOMAP sh: switch to GENERIC_PCI_IOMAP sparc: switch to GENERIC_PCI_IOMAP tile: don't panic on iomap tile: switch to GENERIC_PCI_IOMAP frv: switch to GENERIC_PCI_IOMAP mn10300: add missing __iomap markers mn10300: switch to GENERIC_PCI_IOMAP alpha: drop pci_iomap/pci_iounmap from pci-noop.c arch/alpha/Kconfig | 5 +--- arch/alpha/kernel/pci-noop.c | 12 -------- arch/alpha/kernel/pci.c | 26 +----------------- arch/arm/Kconfig | 1 + arch/arm/include/asm/io.h | 2 +- arch/arm/mm/iomap.c | 21 -------------- arch/cris/Kconfig | 5 +--- arch/frv/Kconfig | 1 + arch/frv/include/asm/io.h | 2 +- arch/frv/mb93090-mb00/Makefile | 2 +- arch/frv/mb93090-mb00/pci-iomap.c | 29 -------------------- arch/hexagon/Kconfig | 4 +-- arch/ia64/Kconfig | 5 +--- arch/m68k/Kconfig | 4 +-- arch/microblaze/Kconfig | 1 + arch/microblaze/pci/iomap.c | 19 ------------- arch/mips/Kconfig | 1 + arch/mips/lib/iomap-pci.c | 26 ------------------ arch/mn10300/Kconfig | 1 + arch/mn10300/include/asm/io.h | 17 +++++------ arch/mn10300/unit-asb2305/Makefile | 2 +- arch/mn10300/unit-asb2305/pci-iomap.c | 31 --------------------- arch/openrisc/Kconfig | 3 -- arch/parisc/Kconfig | 1 + arch/parisc/lib/iomap.c | 23 --------------- arch/powerpc/Kconfig | 1 + arch/powerpc/kernel/iomap.c | 19 ------------- arch/powerpc/platforms/Kconfig | 3 -- arch/score/Kconfig | 4 +-- arch/sh/Kconfig | 4 +-- arch/sh/drivers/pci/pci.c | 23 --------------- arch/sparc/Kconfig | 1 + arch/sparc/include/asm/io_32.h | 2 +- arch/sparc/include/asm/io_64.h | 2 +- arch/sparc/lib/iomap.c | 23 --------------- arch/tile/Kconfig | 1 + arch/tile/include/asm/io.h | 3 +- arch/tile/include/asm/pci.h | 2 +- arch/tile/kernel/pci.c | 21 -------------- arch/unicore32/Kconfig | 4 +-- arch/x86/Kconfig | 4 +-- include/asm-generic/io.h | 4 +- include/asm-generic/iomap.h | 9 ++---- include/asm-generic/pci_iomap.h | 25 +++++++++++++++++ lib/Kconfig | 7 +++++ lib/Makefile | 1 + lib/iomap.c | 38 +------------------------ lib/pci_iomap.c | 48 +++++++++++++++++++++++++++++++++ 48 files changed, 124 insertions(+), 369 deletions(-) delete mode 100644 arch/frv/mb93090-mb00/pci-iomap.c delete mode 100644 arch/mn10300/unit-asb2305/pci-iomap.c create mode 100644 include/asm-generic/pci_iomap.h create mode 100644 lib/pci_iomap.c -- 1.7.8.382.g3daff
RFC PATCH v2 1/16 lib: move GENERIC_IOMAP to lib/Kconfig
define GENERIC_IOMAP in a central location instead of all architectures. This will be helpful for the follow-up patch which makes it select other configs. Code is also a bit shorter this way.
--- arch/alpha/Kconfig | 4 ---- arch/cris/Kconfig | 5 +---- arch/hexagon/Kconfig | 4 +--- arch/ia64/Kconfig | 5 +---- arch/m68k/Kconfig | 4 +--- arch/openrisc/Kconfig | 3 --- arch/powerpc/platforms/Kconfig | 3 --- arch/score/Kconfig | 4 +--- arch/sh/Kconfig | 3 --- arch/unicore32/Kconfig | 4 +--- arch/x86/Kconfig | 4 +--- lib/Kconfig | 3 +++ 12 files changed, 10 insertions(+), 36 deletions(-)
arch/alpha/Kconfig +0 -4
@@ -70,10 +70,6 @@ config GENERIC_ISA_DMA bool default y -config GENERIC_IOMAP - bool - default n - source "init/Kconfig" source "kernel/Kconfig.freezer"
arch/cris/Kconfig +1 -4
@@ -19,10 +19,6 @@ config GENERIC_CMOS_UPDATE config ARCH_USES_GETTIMEOFFSET def_bool n -config GENERIC_IOMAP - bool - default y - config ARCH_HAS_ILOG2_U32 bool default n
@@ -52,6 +48,7 @@ config CRIS select HAVE_IDE select HAVE_GENERIC_HARDIRQS select GENERIC_IRQ_SHOW + select GENERIC_IOMAP config HZ int
arch/hexagon/Kconfig +1 -3
@@ -26,6 +26,7 @@ config HEXAGON select HAVE_ARCH_KGDB select HAVE_ARCH_TRACEHOOK select NO_IOPORT + select GENERIC_IOMAP # mostly generic routines, with some accelerated ones ---help--- Qualcomm Hexagon is a processor architecture designed for high
@@ -73,9 +74,6 @@ config GENERIC_CSUM config GENERIC_IRQ_PROBE def_bool y -config GENERIC_IOMAP - def_bool y - #config ZONE_DMA # bool # default y
arch/ia64/Kconfig +1 -4
@@ -29,6 +29,7 @@ config IA64 select GENERIC_IRQ_SHOW select ARCH_WANT_OPTIONAL_GPIOLIB select ARCH_HAVE_NMI_SAFE_CMPXCHG + select GENERIC_IOMAP default y help The Itanium Processor Family is Intel's 64-bit successor to
@@ -102,10 +103,6 @@ config EFI bool default y -config GENERIC_IOMAP - bool - default y - config ARCH_CLOCKSOURCE_DATA def_bool y
arch/m68k/Kconfig +1 -3
@@ -38,9 +38,6 @@ config GENERIC_CALIBRATE_DELAY bool default y -config GENERIC_IOMAP - def_bool MMU - config TIME_LOW_RES bool default y
@@ -73,6 +70,7 @@ source "kernel/Kconfig.freezer" config MMU bool "MMU-based Paged Memory Management Support" default y + select GENERIC_IOMAP help Select if you want MMU-based virtualised addressing space support by paged memory management. If unsure, say 'Y'.
arch/openrisc/Kconfig +0 -3
@@ -38,9 +38,6 @@ config RWSEM_XCHGADD_ALGORITHM config GENERIC_HWEIGHT def_bool y -config GENERIC_IOMAP - def_bool y - config NO_IOPORT def_bool y
arch/powerpc/platforms/Kconfig +0 -3
@@ -175,9 +175,6 @@ config PPC_INDIRECT_MMIO config PPC_IO_WORKAROUNDS bool -config GENERIC_IOMAP - bool - source "drivers/cpufreq/Kconfig" menu "CPU Frequency drivers"
arch/score/Kconfig +1 -3
@@ -4,6 +4,7 @@ config SCORE def_bool y select HAVE_GENERIC_HARDIRQS select GENERIC_IRQ_SHOW + select GENERIC_IOMAP choice prompt "System type"
@@ -33,9 +34,6 @@ endmenu config CPU_SCORE7 bool -config GENERIC_IOMAP - def_bool y - config NO_DMA bool default y
arch/sh/Kconfig +0 -3
@@ -84,9 +84,6 @@ config GENERIC_GPIO config GENERIC_CALIBRATE_DELAY bool -config GENERIC_IOMAP - bool - config GENERIC_CLOCKEVENTS def_bool y
arch/unicore32/Kconfig +1 -3
@@ -12,6 +12,7 @@ config UNICORE32 select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW select ARCH_WANT_FRAME_POINTERS + select GENERIC_IOMAP help UniCore-32 is 32-bit Instruction Set Architecture, including a series of low-power-consumption RISC chip
@@ -30,9 +31,6 @@ config GENERIC_CLOCKEVENTS config GENERIC_CSUM def_bool y -config GENERIC_IOMAP - def_bool y - config NO_IOPORT bool
arch/x86/Kconfig +1 -3
@@ -75,6 +75,7 @@ config X86 select HAVE_BPF_JIT if (X86_64 && NET) select CLKEVT_I8253 select ARCH_HAVE_NMI_SAFE_CMPXCHG + select GENERIC_IOMAP config INSTRUCTION_DECODER def_bool (KPROBES || PERF_EVENTS)
@@ -140,9 +141,6 @@ config NEED_SG_DMA_LENGTH config GENERIC_ISA_DMA def_bool ISA_DMA_API -config GENERIC_IOMAP - def_bool y - config GENERIC_BUG def_bool y depends on BUG
lib/Kconfig +3 -0
@@ -19,6 +19,9 @@ config RATIONAL config GENERIC_FIND_FIRST_BIT bool +config GENERIC_IOMAP + bool + config CRC_CCITT tristate "CRC-CCITT functions" help
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 2/16 lib: add GENERIC_PCI_IOMAP
In reply to Michael S. TsirkinMany architectures want a generic pci_iomap but not the rest of iomap.c. Split that to a separate .c file and add a new config symbol. select automatically by GENERIC_IOMAP.
--- include/asm-generic/io.h | 4 +- include/asm-generic/iomap.h | 9 ++----- include/asm-generic/pci_iomap.h | 25 ++++++++++++++++++++ lib/Kconfig | 4 +++ lib/Makefile | 1 + lib/iomap.c | 38 +----------------------------- lib/pci_iomap.c | 48 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 85 insertions(+), 44 deletions(-) create mode 100644 include/asm-generic/pci_iomap.h create mode 100644 lib/pci_iomap.c
include/asm-generic/io.h +2 -2
@@ -19,6 +19,8 @@#include <asm-generic/iomap.h> #endif +#include <asm-generic/pci_iomap.h> +#ifndef mmiowb#define mmiowb () do {} while (0)#endif
@@ -283,9 +285,7 @@ static inline void writesb(const void __iomem *addr, const void *buf, int len)#define __io_virt (x) ((void __force *) (x))#ifndef CONFIG_GENERIC_IOMAP -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);static inline void pci_iounmap (struct pci_dev *dev,void __iomem *p) { }
include/asm-generic/iomap.h +3 -6
@@ -67,18 +67,15 @@ extern void ioport_unmap(void __iomem *);#endif #ifdef CONFIG_PCI -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +/* Destroy a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);extern void pci_iounmap (struct pci_dev *dev,void __iomem *);#else struct pci_dev ; -static inline void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max) -{ -return NULL ; -}static inline void pci_iounmap (struct pci_dev *dev,void __iomem *addr) { }#endif +#include <asm-generic/pci_iomap.h> +#endif
include/asm-generic/pci_iomap.h new file +25 -0
@@ -0,0 +1,25 @@ +/* Generic I/O port emulation, based on MN10300 code +* +* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. +* Written by David Howells ([email protected]) +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public Licence +* as published by the Free Software Foundation; either version +* 2 of the Licence, or (at your option) any later version. +*/ +#ifndef __ASM_GENERIC_PCI_IOMAP_H +#define __ASM_GENERIC_PCI_IOMAP_H + +struct pci_dev ; +#ifdef CONFIG_PCI +/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max); +#else +static inline void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max) +{ +return NULL ; +} +#endif + +#endif /* __ASM_GENERIC_IO_H */
lib/Kconfig +4 -0
@@ -19,8 +19,12 @@ config RATIONAL config GENERIC_FIND_FIRST_BIT bool +config GENERIC_PCI_IOMAP + bool + config GENERIC_IOMAP bool + select GENERIC_PCI_IOMAP config CRC_CCITT tristate "CRC-CCITT functions"
lib/Makefile +1 -0
@@ -33,6 +33,7 @@ endif lib-$(CONFIG_HOTPLUG) += kobject_uevent.o obj-$(CONFIG_GENERIC_IOMAP) += iomap.o +obj-$(CONFIG_GENERIC_PCI_IOMAP) += pci_iomap.o obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
lib/iomap.c +2 -36
@@ -242,45 +242,11 @@ EXPORT_SYMBOL(ioport_unmap);#endif /* CONFIG_HAS_IOPORT */ #ifdef CONFIG_PCI -/** -* pci_iomap - create a virtual mapping cookie for a PCI BAR -* @dev: PCI device that owns the BAR -* @bar: BAR number -* @maxlen: length of the memory to map -* -* Using this function you will get a __iomem address to your device BAR. -* You can access it using ioread*() and iowrite*(). These functions hide -* the details if this is a MMIO or PIO address space and will just do what -* you expect from them in the correct way. -* -* @maxlen specifies the maximum length to map. If you want to get access to -* the complete BAR without checking for its length first, pass %0 here. -* */ -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) { -if (flags &IORESOURCE_CACHEABLE ) -return ioremap (start, len); -return ioremap_nocache (start, len); - } -/* What? */ -return NULL ; -} - +/* Hide the details if this is a MMIO or PIO address space and just do what +* you expect in the correct way. */ void pci_iounmap (struct pci_dev *dev,void __iomem * addr) { IO_COND(addr, /* nothing */, iounmap(addr)); } -EXPORT_SYMBOL (pci_iomap);EXPORT_SYMBOL (pci_iounmap);#endif /* CONFIG_PCI */
lib/pci_iomap.c new file +48 -0
48 lines not on this page · raw message
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 3/16 alpha: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinalpha copied pci_iomap from generic code to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
The only difference is handling of nocache flag, that turns out to be done correctly by the generic code since arch/alpha/include/asm/io.h defines ioremap_nocache same as ioremap.
--- arch/alpha/Kconfig | 1 + arch/alpha/kernel/pci.c | 26 +------------------------- 2 files changed, 2 insertions(+), 25 deletions(-)
arch/alpha/Kconfig +1 -0
@@ -315,6 +315,7 @@ config ISA_DMA_API config PCI bool depends on !ALPHA_JENSEN + select GENERIC_PCI_IOMAP default y help Find out whether you have a PCI motherboard. PCI is the name of a
arch/alpha/kernel/pci.c +1 -25
@@ -508,30 +508,7 @@ sys_pciconfig_iobase(long which, unsigned long bus, unsigned long dfn)return -EOPNOTSUPP ; } -/* Create an __iomem token from a PCI BAR. Copied from lib/iomap.c with -no changes, since we don't want the other things in that object file. */ - -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) { -/* Not checking IORESOURCE_CACHEABLE because alpha does -not distinguish between ioremap and ioremap_nocache. */ -return ioremap (start, len); - } -return NULL ; -} - -/* Destroy that token. Not copied from lib/iomap.c. */ +/* Destroy an __iomem token. Not copied from lib/iomap.c. */ void pci_iounmap (struct pci_dev *dev,void __iomem * addr) {
@@ -539,7 +516,6 @@ void pci_iounmap(struct pci_dev *dev, void __iomem * addr)iounmap (addr); } -EXPORT_SYMBOL (pci_iomap);EXPORT_SYMBOL (pci_iounmap);/* FIXME: Some boxes have multiple ISA bridges! */
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 4/16 arm: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinarm copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
--- arch/arm/Kconfig | 1 + arch/arm/include/asm/io.h | 2 +- arch/arm/mm/iomap.c | 21 --------------------- 3 files changed, 2 insertions(+), 22 deletions(-)
arch/arm/Kconfig +1 -0
@@ -30,6 +30,7 @@ config ARM select HAVE_SPARSE_IRQ select GENERIC_IRQ_SHOW select CPU_PM if (SUSPEND || CPU_IDLE) + select GENERIC_PCI_IOMAP help The ARM series is a line of low-power-consumption RISC chip designs licensed by ARM Ltd and targeted at embedded applications and
arch/arm/include/asm/io.h +1 -1
@@ -27,6 +27,7 @@#include <asm/byteorder.h> #include <asm/memory.h> #include <asm/system.h> +#include <asm-generic/pci_iomap.h> /* * ISA I/O bus memory addresses are 1:1 with the physical address.
@@ -306,7 +307,6 @@ extern void ioport_unmap(void __iomem *addr);struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen);extern void pci_iounmap (struct pci_dev *dev,void __iomem *addr);/*
arch/arm/mm/iomap.c +0 -21
@@ -35,27 +35,6 @@ EXPORT_SYMBOL(pcibios_min_mem);unsigned int pci_flags =PCI_REASSIGN_ALL_RSRC ;EXPORT_SYMBOL (pci_flags); -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) { -if (flags &IORESOURCE_CACHEABLE ) -return ioremap (start, len); -return ioremap_nocache (start, len); - } -return NULL ; -} -EXPORT_SYMBOL (pci_iomap); -void pci_iounmap (struct pci_dev *dev,void __iomem *addr) { if ((unsigned long)addr >= VMALLOC_START &&
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 5/16 microblaze: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinmicroblaze copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
The only difference is handling of nocache flag, that turns out to be done correctly by the generic code since arch/microblaze/include/asm/io.h defines ioremap_nocache same as ioremap.
--- arch/microblaze/Kconfig | 1 + arch/microblaze/pci/iomap.c | 19 ------------------- 2 files changed, 1 insertions(+), 19 deletions(-)
arch/microblaze/Kconfig +1 -0
@@ -17,6 +17,7 @@ config MICROBLAZE select HAVE_GENERIC_HARDIRQS select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW + select GENERIC_PCI_IOMAP config SWAP def_bool n
arch/microblaze/pci/iomap.c +0 -19
@@ -10,25 +10,6 @@#include <asm/io.h> #include <asm/pci-bridge.h> -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len) -return NULL ; -if (max && len > max) - len = max; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) -return ioremap (start, len); -/* What? */ -return NULL ; -} -EXPORT_SYMBOL (pci_iomap); -void pci_iounmap (struct pci_dev *dev,void __iomem *addr) {if (isa_vaddr_is_ioport (addr))
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 6/16 mips: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinmips copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
--- arch/mips/Kconfig | 1 + arch/mips/lib/iomap-pci.c | 26 -------------------------- 2 files changed, 1 insertions(+), 26 deletions(-)
arch/mips/Kconfig +1 -0
@@ -2317,6 +2317,7 @@ config PCI bool "Support for PCI controller" depends on HW_HAS_PCI select PCI_DOMAINS + select GENERIC_PCI_IOMAP help Find out whether you have a PCI motherboard. PCI is the name of a bus system, i.e. the way the CPU talks to the other stuff inside
arch/mips/lib/iomap-pci.c +0 -26
@@ -40,32 +40,6 @@ static void __iomem *ioport_map_pci(struct pci_dev *dev,return (void __iomem *) (ctrl->io_map_base + port); } -/* -* Create a virtual mapping cookie for a PCI BAR (memory or IO) -*/ -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; -if (flags &IORESOURCE_IO ) -return ioport_map_pci (dev, start, len); -if (flags &IORESOURCE_MEM ) { -if (flags &IORESOURCE_CACHEABLE ) -return ioremap (start, len); -return ioremap_nocache (start, len); - } -/* What? */ -return NULL ; -} - -EXPORT_SYMBOL (pci_iomap); -void pci_iounmap (struct pci_dev *dev,void __iomem * addr) {iounmap (addr);
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 7/16 parisc: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinparisc copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
--- arch/parisc/Kconfig | 1 + arch/parisc/lib/iomap.c | 23 ----------------------- 2 files changed, 1 insertions(+), 23 deletions(-)
arch/parisc/Kconfig +1 -0
@@ -14,6 +14,7 @@ config PARISC select GENERIC_ATOMIC64 if !64BIT select HAVE_GENERIC_HARDIRQS select GENERIC_IRQ_PROBE + select GENERIC_PCI_IOMAP select IRQ_PER_CPU select ARCH_HAVE_NMI_SAFE_CMPXCHG
arch/parisc/lib/iomap.c +0 -23
@@ -436,28 +436,6 @@ void ioport_unmap(void __iomem *addr) } } -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) { -if (flags &IORESOURCE_CACHEABLE ) -return ioremap (start, len); -return ioremap_nocache (start, len); - } -/* What? */ -return NULL ; -} -void pci_iounmap (struct pci_dev *dev,void __iomem * addr) {if (!INDIRECT_ADDR (addr)) {
@@ -483,5 +461,4 @@ EXPORT_SYMBOL(iowrite16_rep);EXPORT_SYMBOL (iowrite32_rep);EXPORT_SYMBOL (ioport_map);EXPORT_SYMBOL (ioport_unmap); -EXPORT_SYMBOL (pci_iomap);EXPORT_SYMBOL (pci_iounmap);
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 8/16 powerpc: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinpowerpc copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
The only difference is handling of nocache flag,
that turns out to be done correctly by the
generic code since arch/powerpc/include/asm/io.h
defines ioremap_nocache same as ioremap.
--- arch/powerpc/Kconfig | 1 + arch/powerpc/kernel/iomap.c | 19 ------------------- 2 files changed, 1 insertions(+), 19 deletions(-)
arch/powerpc/Kconfig +1 -0
@@ -710,6 +710,7 @@ config PCI default PCI_PERMEDIA if !4xx && !CPM2 && !8xx default PCI_QSPAN if !4xx && !CPM2 && 8xx select ARCH_SUPPORTS_MSI + select GENERIC_PCI_IOMAP help Find out whether your system includes a PCI bus. PCI is the name of a bus system, i.e. the way the CPU talks to the other stuff inside
arch/powerpc/kernel/iomap.c +0 -19
@@ -119,24 +119,6 @@ EXPORT_SYMBOL(ioport_map);EXPORT_SYMBOL (ioport_unmap);#ifdef CONFIG_PCI -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len) -return NULL ; -if (max && len > max) - len = max; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) -return ioremap (start, len); -/* What? */ -return NULL ; -} -void pci_iounmap (struct pci_dev *dev,void __iomem *addr) {if (isa_vaddr_is_ioport (addr))
@@ -146,6 +128,5 @@ void pci_iounmap(struct pci_dev *dev, void __iomem *addr) iounmap(addr); } -EXPORT_SYMBOL (pci_iomap);EXPORT_SYMBOL (pci_iounmap);#endif /* CONFIG_PCI */
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 9/16 sh: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinsh copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
--- arch/sh/Kconfig | 1 + arch/sh/drivers/pci/pci.c | 23 ----------------------- 2 files changed, 1 insertions(+), 23 deletions(-)
arch/sh/Kconfig +1 -0
@@ -857,6 +857,7 @@ config PCI bool "PCI support" depends on SYS_SUPPORTS_PCI select PCI_DOMAINS + select GENERIC_PCI_IOMAP help Find out whether you have a PCI motherboard. PCI is the name of a bus system, i.e. the way the CPU talks to the other stuff inside
arch/sh/drivers/pci/pci.c +0 -23
@@ -393,29 +393,6 @@ static void __iomem *ioport_map_pci(struct pci_dev *dev,return (void __iomem *)(chan->io_map_base + port); } -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (unlikely (!len || !start)) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; - -if (flags &IORESOURCE_IO ) -return ioport_map_pci (dev, start, len); -if (flags &IORESOURCE_MEM ) { -if (flags &IORESOURCE_CACHEABLE ) -return ioremap (start, len); -return ioremap_nocache (start, len); - } - -return NULL ; -} -EXPORT_SYMBOL (pci_iomap); -void pci_iounmap (struct pci_dev *dev,void __iomem *addr) {iounmap (addr);
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 10/16 sparc: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinsparc copied pci_iomap from generic code, probably to avoid pulling the rest of iomap.c in. Since that's in
a separate file now, we can reuse the common implementation.
--- arch/sparc/Kconfig | 1 + arch/sparc/include/asm/io_32.h | 2 +- arch/sparc/include/asm/io_64.h | 2 +- arch/sparc/lib/iomap.c | 23 ----------------------- 4 files changed, 3 insertions(+), 25 deletions(-)
arch/sparc/Kconfig +1 -0
@@ -28,6 +28,7 @@ config SPARC select HAVE_GENERIC_HARDIRQS select GENERIC_IRQ_SHOW select USE_GENERIC_SMP_HELPERS if SMP + select GENERIC_PCI_IOMAP config SPARC32 def_bool !64BIT
arch/sparc/include/asm/io_32.h +1 -1
@@ -7,6 +7,7 @@#include <asm/page.h> /* IO address mapping routines need this */ #include <asm/system.h> +#include <asm-generic/pci_iomap.h> #define page_to_phys (page) (page_to_pfn(page) << PAGE_SHIFT)
@@ -324,7 +325,6 @@ extern void ioport_unmap(void __iomem *);/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);extern void pci_iounmap (struct pci_dev *dev,void __iomem *);/*
arch/sparc/include/asm/io_64.h +1 -1
@@ -8,6 +8,7 @@#include <asm/page.h> /* IO address mapping routines need this */ #include <asm/system.h> #include <asm/asi.h> +#include <asm-generic/pci_iomap.h> /* PC crapola... */ #define __SLOW_DOWN_IO do { } while (0)
@@ -514,7 +515,6 @@ extern void ioport_unmap(void __iomem *);/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);extern void pci_iounmap (struct pci_dev *dev,void __iomem *);static inline int sbus_can_dma_64bit (void )
arch/sparc/lib/iomap.c +0 -23
@@ -18,31 +18,8 @@ void ioport_unmap(void __iomem *addr)EXPORT_SYMBOL (ioport_map);EXPORT_SYMBOL (ioport_unmap); -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; -if (maxlen && len > maxlen) - len = maxlen; -if (flags &IORESOURCE_IO ) -return ioport_map (start, len); -if (flags &IORESOURCE_MEM ) { -if (flags &IORESOURCE_CACHEABLE ) -return ioremap (start, len); -return ioremap_nocache (start, len); - } -/* What? */ -return NULL ; -} -void pci_iounmap (struct pci_dev *dev,void __iomem * addr) {/* nothing to do */ } -EXPORT_SYMBOL (pci_iomap);EXPORT_SYMBOL (pci_iounmap);
Signature · 1 line
1.7.8.382.g3daff
David Miller
maintainerRe: [PATCHv2 RFC (repost) 10/16] sparc: switch to GENERIC_PCI_IOMAP
From: "Michael S. Tsirkin" <[email protected]>
Date: Wed, 21 Dec 2011 18:29:51 +0200
Quoted 6 lines
sparc copied
pci_iomapfrom generic code, probably to avoid pulling the rest ofiomap.cin. Since that's in
a separate file now, we can reuse the common implementation.Signed-off-by Michael S. Tsirkin <[email protected]>Acked-by David S. Miller <[email protected]>
FWIW, I just tested this as well and it works fine.
BTW, must be a thinko that you're CC:'ing linux-alpha for this patch :-)
Re: [PATCHv2 RFC (repost) 10/16] sparc: switch to GENERIC_PCI_IOMAP
Quoted 11 lines · David Miller
From: "Michael S. Tsirkin" <[email protected]>
Date: Wed, 21 Dec 2011 18:29:51 +0200Quoted 6 lines
sparc copied
pci_iomapfrom generic code, probably to avoid pulling the rest ofiomap.cin. Since that's in
a separate file now, we can reuse the common implementation.Signed-off-by Michael S. Tsirkin <[email protected]>Acked-by David S. Miller <[email protected]>FWIW, I just tested this as well and it works fine.
Thanks very much.
Quoted 2 lines
BTW, must be a thinko that you're CC:'ing linux-alpha for this patch :-)
Ugh. Thanks for pointing this out: I really intended linux-arch. I guess I won't repost this yet another time, made enough noise already. At least linux-kernel was spelled correctly :)
Will try to Cc the pull request correctly.
Thanks,
Signature · 1 line
MST
RFC PATCH v2 11/16 tile: don't panic on iomap
In reply to Michael S. TsirkinI think panic on iomap is there just for debugging. If we return NULL instead, the generic pci_iomap will DTRT so we don't need to roll our own.
--- arch/tile/include/asm/io.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
arch/tile/include/asm/io.h +2 -1
@@ -204,7 +204,8 @@ static inline long ioport_panic(void)static inline void __iomem *ioport_map (unsigned long port,unsigned int len) { -return (void __iomem *)ioport_panic (); +pr_info ("ioport_map: mapping IO resources is unsupported on tile.\n" ); +return NULL ; }static inline void ioport_unmap (void __iomem *addr)
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 12/16 tile: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkintile now has working stubs for ioport_map and ioremap such that the generic pci_iomap will DTRT: cast to pointer on memory and return NULL and log message on IO map.
Switch it over to GENERIC_PCI_IOMAP.
--- arch/tile/Kconfig | 1 + arch/tile/include/asm/pci.h | 2 +- arch/tile/kernel/pci.c | 21 --------------------- 3 files changed, 2 insertions(+), 22 deletions(-)
arch/tile/Kconfig +1 -0
@@ -321,6 +321,7 @@ config PCI bool "PCI support" default y select PCI_DOMAINS + select GENERIC_PCI_IOMAP ---help--- Enable PCI root complex support, so PCIe endpoint devices can be attached to the Tile chip. Many, but not all, PCI devices
arch/tile/include/asm/pci.h +1 -1
@@ -16,6 +16,7 @@#define _ASM_TILE_PCI_H#include <linux/pci.h> +#include <asm-generic/pci_iomap.h> /* * Structure of a PCI controller (host bridge)
@@ -49,7 +50,6 @@ struct pci_controller {int __devinit tile_pci_init (void );int __devinit pcibios_init (void ); -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);static inline void pci_iounmap (struct pci_dev *dev,void __iomem *addr) {}void __devinit pcibios_fixup_bus (struct pci_bus *bus);
arch/tile/kernel/pci.c +0 -21
@@ -466,27 +466,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)return 0 ; } -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max) -{ -unsigned long start =pci_resource_start (dev, bar); -unsigned long len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len) -return NULL ; -if (max && len > max) - len = max; - -if (!(flags &IORESOURCE_MEM )) { -pr_info ("PCI: Trying to map invalid resource %#lx\n" , flags); - start =0 ; - } - -return (void __iomem *)start; -} -EXPORT_SYMBOL (pci_iomap); - -/**************************************************************** * * Tile PCI config space read/write routines
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 13/16 frv: switch to GENERIC_PCI_IOMAP
In reply to Michael S. Tsirkinfrv uses a version of pci_iomap that simply casts and returns back the start address. Looking closely, both ioremap and ioport_map seem to do this on this platform, so the generic pci_iomap will DTRT automatically.
--- arch/frv/Kconfig | 1 + arch/frv/include/asm/io.h | 2 +- arch/frv/mb93090-mb00/Makefile | 2 +- arch/frv/mb93090-mb00/pci-iomap.c | 29 ----------------------------- 4 files changed, 3 insertions(+), 31 deletions(-) delete mode 100644 arch/frv/mb93090-mb00/pci-iomap.c
arch/frv/Kconfig +1 -0
@@ -317,6 +317,7 @@ config PCI bool "Use PCI" depends on MB93090_MB00 default y + select GENERIC_PCI_IOMAP help Some FR-V systems (such as the MB93090-MB00 VDK) have PCI onboard. If you have one of these boards and you wish to use the PCI
arch/frv/include/asm/io.h +1 -1
@@ -21,6 +21,7 @@#include <asm/virtconvert.h> #include <asm/string.h> #include <asm/mb-regs.h> +#include <asm-generic/pci_iomap.h> #include <linux/delay.h> /*
@@ -370,7 +371,6 @@ static inline void iowrite32_rep(void __iomem *p, const void *src, unsigned long/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);static inline void pci_iounmap (struct pci_dev *dev,void __iomem *p) { }
arch/frv/mb93090-mb00/Makefile +1 -1
@@ -3,7 +3,7 @@ # ifeq "$(CONFIG_PCI)" "y" -obj-y := pci-frv.o pci-irq.o pci-vdk.o pci-iomap.o +obj-y := pci-frv.o pci-irq.o pci-vdk.o ifeq "$(CONFIG_MMU)" "y" obj-y += pci-dma.o
arch/frv/mb93090-mb00/pci-iomap.c deleted +0 -29
@@ -1,29 +0,0 @@ -/* pci-iomap.c: description -* -* Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. -* Written by David Howells ([email protected]) -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version -* 2 of the License, or (at your option) any later version. -*/ -#include <linux/pci.h> -#include <linux/module.h> - -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; - -if ((flags &IORESOURCE_IO ) || (flags &IORESOURCE_MEM )) -return (void __iomem *) start; - -return NULL ; -} - -EXPORT_SYMBOL (pci_iomap);
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 14/16 mn10300: add missing __iomap markers
In reply to Michael S. TsirkinMN10300's *ioremap*() collection lacks __iomem markers. Fix that.
--- arch/mn10300/include/asm/io.h | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-)
arch/mn10300/include/asm/io.h +8 -8
@@ -251,15 +251,15 @@ static inline void *phys_to_virt(unsigned long address)/* * Change "struct page" to physical address. */ -static inline void *__ioremap (unsigned long offset,unsigned long size, -unsigned long flags) +static inline void __iomem *__ioremap (unsigned long offset,unsigned long size, +unsigned long flags) { -return (void *) offset; +return (void __iomem *) offset; } -static inline void *ioremap (unsigned long offset,unsigned long size) +static inline void __iomem *ioremap (unsigned long offset,unsigned long size) { -return (void *) offset; +return (void __iomem *) offset; }/*
@@ -267,14 +267,14 @@ static inline void *ioremap(unsigned long offset, unsigned long size)* area. it's useful if some control registers are in such an area and write * combining or read caching is not desirable: */ -static inline void *ioremap_nocache (unsigned long offset,unsigned long size) +static inline void __iomem *ioremap_nocache (unsigned long offset,unsigned long size) { -return (void *) (offset |0x20000000 ); +return (void __iomem *) (offset |0x20000000 ); }#define ioremap_wc ioremap_nocache -static inline void iounmap (void *addr) +static inline void iounmap (void __iomem *addr) { }
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 15/16 mn10300: switch to GENERIC_PCI_IOMAP
In reply to Michael S. TsirkinThe pci_iomap variant that arch/mn10300/unit-asb2305/pci-iomap.c uses differs from the generic one in that it does
not use ioremap_nocache for PCI addresses.
However, it turns out that PCI addresses are automatically noncached, so switching to ioremap_nocache and to the generic implementation is safe.
--- arch/mn10300/Kconfig | 1 + arch/mn10300/include/asm/io.h | 1 - arch/mn10300/unit-asb2305/Makefile | 2 +- arch/mn10300/unit-asb2305/pci-iomap.c | 31 ------------------------------- 4 files changed, 2 insertions(+), 33 deletions(-) delete mode 100644 arch/mn10300/unit-asb2305/pci-iomap.c
arch/mn10300/Kconfig +1 -0
@@ -252,6 +252,7 @@ config PCI bool "Use PCI" depends on MN10300_UNIT_ASB2305 default y + select GENERIC_PCI_IOMAP help Some systems (such as the ASB2305) have PCI onboard. If you have one of these boards and you wish to use the PCI facilities, say Y here.
arch/mn10300/include/asm/io.h +0 -1
@@ -229,7 +229,6 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev ; -extern void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long max);static inline void pci_iounmap (struct pci_dev *dev,void __iomem *p) { }
arch/mn10300/unit-asb2305/Makefile +1 -1
@@ -5,4 +5,4 @@ ############################################################################### obj-y := unit-init.o leds.o -obj-$(CONFIG_PCI) += pci.o pci-asb2305.o pci-irq.o pci-iomap.o +obj-$(CONFIG_PCI) += pci.o pci-asb2305.o pci-irq.o
arch/mn10300/unit-asb2305/pci-iomap.c deleted +0 -31
@@ -1,31 +0,0 @@ -/* ASB2305 PCI I/O mapping handler -* -* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. -* Written by David Howells ([email protected]) -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public Licence -* as published by the Free Software Foundation; either version -* 2 of the Licence, or (at your option) any later version. -*/ -#include <linux/pci.h> -#include <linux/module.h> - -/* -* Create a virtual mapping cookie for a PCI BAR (memory or IO) -*/ -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -resource_size_t start =pci_resource_start (dev, bar); -resource_size_t len =pci_resource_len (dev, bar); -unsigned long flags =pci_resource_flags (dev, bar); - -if (!len || !start) -return NULL ; - -if ((flags &IORESOURCE_IO ) || (flags &IORESOURCE_MEM )) -return (void __iomem *) start; - -return NULL ; -} -EXPORT_SYMBOL (pci_iomap);
Signature · 1 line
1.7.8.382.g3daff
RFC PATCH v2 16/16 alpha: drop pci_iomap/pci_iounmap from pci-noop.c
In reply to Michael S. TsirkinJenkins disables PCI so asm-generic provides inline stubs for these, we don't need offline stubs as well.
--- arch/alpha/kernel/pci-noop.c | 12 ------------ 1 files changed, 0 insertions(+), 12 deletions(-)
arch/alpha/kernel/pci-noop.c +0 -12
@@ -185,15 +185,3 @@ struct dma_map_ops alpha_noop_ops = {struct dma_map_ops *dma_ops = &alpha_noop_ops;EXPORT_SYMBOL (dma_ops); - -void __iomem *pci_iomap (struct pci_dev *dev,int bar,unsigned long maxlen) -{ -return NULL ; -} - -void pci_iounmap (struct pci_dev *dev,void __iomem * addr) -{ -} - -EXPORT_SYMBOL (pci_iomap); -EXPORT_SYMBOL (pci_iounmap);
Signature · 1 line
1.7.8.382.g3daff