From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> To: linux-pci@vger.kernel.org Cc: linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>, Arnd Bergmann <arnd@arndb.de>, Russell King <linux@armlinux.org.uk> Subject: [PATCH v3 30/32] arm: implement ioremap_nopost() interface Date: Tue, 11 Apr 2017 13:29:10 +0100 [thread overview] Message-ID: <20170411122923.6285-31-lorenzo.pieralisi@arm.com> (raw) In-Reply-To: <20170411122923.6285-1-lorenzo.pieralisi@arm.com> The PCI bus specifications (rev 3.0, 3.2.5 "Transaction Ordering and Posting") define rules for PCI configuration space transactions ordering and posting, that state that configuration writes have to be non-posted transactions. Current ioremap interface on ARM provides mapping functions that provide "bufferable" writes transactions (ie ioremap uses MT_DEVICE memory type) aka posted writes, so PCI host controller drivers have no arch interface to remap PCI configuration space with memory attributes that comply with the PCI specifications for configuration space. Implement an ARM specific ioremap_nopost() interface that allows to map PCI config memory regions with MT_UNCACHED memory type (ie strongly ordered - non-posted writes), providing a remap function that complies with PCI specifications for config space transactions. Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Russell King <linux@armlinux.org.uk> --- arch/arm/include/asm/io.h | 9 +++++++++ arch/arm/mm/ioremap.c | 7 +++++++ arch/arm/mm/nommu.c | 9 +++++++++ 3 files changed, 25 insertions(+) diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 42871fb..28b15be 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -352,6 +352,7 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from, * mapping has specific properties. * * Function Memory type Cacheability Cache hint + * ioremap_nopost() SO n/a n/a * ioremap() Device n/a n/a * ioremap_nocache() Device n/a n/a * ioremap_cache() Normal Writeback Read allocate @@ -372,6 +373,12 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from, * compiler may generate unaligned accesses - eg, via inlining its own * memcpy. * + * ioremap_nopost() maps memory as strongly ordered, to be used for + * specific mappings (eg PCI config space) that require non-posted + * write transactions. Strongly ordered transactions are ordered wrt + * device mappings, which means that ioremap_nopost() is the same + * as ioremap() except for non-posted writes behaviour. + * * All normal memory mappings have the following properties: * - reads can be repeated with no side effects * - repeated reads return the last value written @@ -407,6 +414,8 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size); #define ioremap_wc ioremap_wc #define ioremap_wt ioremap_wc +void __iomem *ioremap_nopost(resource_size_t res_cookie, size_t size); + void iounmap(volatile void __iomem *iomem_cookie); #define iounmap iounmap diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index ff0eed2..4ffaf16 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -463,6 +463,13 @@ void iounmap(volatile void __iomem *cookie) } EXPORT_SYMBOL(iounmap); +void __iomem *ioremap_nopost(resource_size_t res_cookie, size_t size) +{ + return arch_ioremap_caller(res_cookie, size, MT_UNCACHED, + __builtin_return_address(0)); +} +EXPORT_SYMBOL_GPL(ioremap_nopost); + #ifdef CONFIG_PCI static int pci_ioremap_mem_type = MT_DEVICE; diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 3b5c7aa..dfd736a 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c @@ -21,6 +21,8 @@ #include <asm/mpu.h> #include <asm/procinfo.h> +#include <asm/mach/map.h> + #include "mm.h" unsigned long vectors_base; @@ -433,6 +435,13 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size) } EXPORT_SYMBOL(ioremap_wc); +void __iomem *ioremap_nopost(resource_size_t res_cookie, size_t size) +{ + return __arm_ioremap_caller(res_cookie, size, MT_UNCACHED, + __builtin_return_address(0)); +} +EXPORT_SYMBOL(ioremap_nopost); + void *arch_memremap_wb(phys_addr_t phys_addr, size_t size) { return (void *)phys_addr; -- 2.10.0
WARNING: multiple messages have this Message-ID (diff)
From: lorenzo.pieralisi@arm.com (Lorenzo Pieralisi) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 30/32] arm: implement ioremap_nopost() interface Date: Tue, 11 Apr 2017 13:29:10 +0100 [thread overview] Message-ID: <20170411122923.6285-31-lorenzo.pieralisi@arm.com> (raw) In-Reply-To: <20170411122923.6285-1-lorenzo.pieralisi@arm.com> The PCI bus specifications (rev 3.0, 3.2.5 "Transaction Ordering and Posting") define rules for PCI configuration space transactions ordering and posting, that state that configuration writes have to be non-posted transactions. Current ioremap interface on ARM provides mapping functions that provide "bufferable" writes transactions (ie ioremap uses MT_DEVICE memory type) aka posted writes, so PCI host controller drivers have no arch interface to remap PCI configuration space with memory attributes that comply with the PCI specifications for configuration space. Implement an ARM specific ioremap_nopost() interface that allows to map PCI config memory regions with MT_UNCACHED memory type (ie strongly ordered - non-posted writes), providing a remap function that complies with PCI specifications for config space transactions. Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Russell King <linux@armlinux.org.uk> --- arch/arm/include/asm/io.h | 9 +++++++++ arch/arm/mm/ioremap.c | 7 +++++++ arch/arm/mm/nommu.c | 9 +++++++++ 3 files changed, 25 insertions(+) diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 42871fb..28b15be 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -352,6 +352,7 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from, * mapping has specific properties. * * Function Memory type Cacheability Cache hint + * ioremap_nopost() SO n/a n/a * ioremap() Device n/a n/a * ioremap_nocache() Device n/a n/a * ioremap_cache() Normal Writeback Read allocate @@ -372,6 +373,12 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from, * compiler may generate unaligned accesses - eg, via inlining its own * memcpy. * + * ioremap_nopost() maps memory as strongly ordered, to be used for + * specific mappings (eg PCI config space) that require non-posted + * write transactions. Strongly ordered transactions are ordered wrt + * device mappings, which means that ioremap_nopost() is the same + * as ioremap() except for non-posted writes behaviour. + * * All normal memory mappings have the following properties: * - reads can be repeated with no side effects * - repeated reads return the last value written @@ -407,6 +414,8 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size); #define ioremap_wc ioremap_wc #define ioremap_wt ioremap_wc +void __iomem *ioremap_nopost(resource_size_t res_cookie, size_t size); + void iounmap(volatile void __iomem *iomem_cookie); #define iounmap iounmap diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index ff0eed2..4ffaf16 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -463,6 +463,13 @@ void iounmap(volatile void __iomem *cookie) } EXPORT_SYMBOL(iounmap); +void __iomem *ioremap_nopost(resource_size_t res_cookie, size_t size) +{ + return arch_ioremap_caller(res_cookie, size, MT_UNCACHED, + __builtin_return_address(0)); +} +EXPORT_SYMBOL_GPL(ioremap_nopost); + #ifdef CONFIG_PCI static int pci_ioremap_mem_type = MT_DEVICE; diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 3b5c7aa..dfd736a 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c @@ -21,6 +21,8 @@ #include <asm/mpu.h> #include <asm/procinfo.h> +#include <asm/mach/map.h> + #include "mm.h" unsigned long vectors_base; @@ -433,6 +435,13 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size) } EXPORT_SYMBOL(ioremap_wc); +void __iomem *ioremap_nopost(resource_size_t res_cookie, size_t size) +{ + return __arm_ioremap_caller(res_cookie, size, MT_UNCACHED, + __builtin_return_address(0)); +} +EXPORT_SYMBOL(ioremap_nopost); + void *arch_memremap_wb(phys_addr_t phys_addr, size_t size) { return (void *)phys_addr; -- 2.10.0
next prev parent reply other threads:[~2017-04-11 12:30 UTC|newest] Thread overview: 171+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-04-11 12:28 [PATCH v3 00/32] PCI: fix config and I/O Address space memory mappings Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 01/32] PCI: remove __weak tag from pci_remap_iospace() Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 02/32] asm-generic/pgtable.h: introduce pgprot_nonposted remap attribute Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 03/32] PCI: fix pci_remap_iospace() " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 04/32] asm-generic: add ioremap_nopost() remap interface Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 13:39 ` Benjamin Herrenschmidt 2017-04-11 13:39 ` Benjamin Herrenschmidt 2017-04-11 13:39 ` Benjamin Herrenschmidt 2017-04-11 14:31 ` Lorenzo Pieralisi 2017-04-11 14:31 ` Lorenzo Pieralisi 2017-04-11 14:31 ` Lorenzo Pieralisi 2017-04-11 23:14 ` Benjamin Herrenschmidt 2017-04-11 23:14 ` Benjamin Herrenschmidt 2017-04-11 23:14 ` Benjamin Herrenschmidt 2017-04-12 10:00 ` Lorenzo Pieralisi 2017-04-12 10:00 ` Lorenzo Pieralisi 2017-04-12 10:00 ` Lorenzo Pieralisi 2017-04-12 11:20 ` Russell King - ARM Linux 2017-04-12 11:20 ` Russell King - ARM Linux 2017-04-12 11:20 ` Russell King - ARM Linux 2017-04-18 15:49 ` Lorenzo Pieralisi 2017-04-18 15:49 ` Lorenzo Pieralisi 2017-04-18 15:49 ` Lorenzo Pieralisi 2017-04-18 16:31 ` Bjorn Helgaas 2017-04-18 16:31 ` Bjorn Helgaas 2017-04-18 16:31 ` Bjorn Helgaas 2017-04-18 22:43 ` Benjamin Herrenschmidt 2017-04-18 22:43 ` Benjamin Herrenschmidt 2017-04-18 22:43 ` Benjamin Herrenschmidt 2017-04-11 12:28 ` [PATCH v3 05/32] alpha: include default ioremap_nopost() implementation Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 06/32] avr32: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 13:55 ` Nicolas Ferre 2017-04-11 13:55 ` Nicolas Ferre 2017-04-11 13:55 ` Nicolas Ferre 2017-04-11 13:55 ` Nicolas Ferre 2017-04-11 12:28 ` [PATCH v3 07/32] arc: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 08/32] cris: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 13:15 ` Jesper Nilsson 2017-04-11 13:15 ` Jesper Nilsson 2017-04-11 13:15 ` Jesper Nilsson 2017-04-11 12:28 ` [PATCH v3 09/32] frv: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 10/32] hexagon: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 11/32] ia64: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 12/32] m32r: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 13/32] m68k: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 14/32] metag: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 15/32] microblaze: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 16/32] mips: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 17/32] mn10300: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 18/32] nios2: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:28 ` [PATCH v3 19/32] openrisc: " Lorenzo Pieralisi 2017-04-11 12:28 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 20/32] parisc: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 21/32] powerpc: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 13:38 ` Benjamin Herrenschmidt 2017-04-11 13:38 ` Benjamin Herrenschmidt 2017-04-11 13:38 ` Benjamin Herrenschmidt 2017-04-11 13:38 ` Benjamin Herrenschmidt 2017-04-11 14:24 ` Lorenzo Pieralisi 2017-04-11 14:24 ` Lorenzo Pieralisi 2017-04-11 14:24 ` Lorenzo Pieralisi 2017-04-11 23:15 ` Benjamin Herrenschmidt 2017-04-11 23:15 ` Benjamin Herrenschmidt 2017-04-11 23:15 ` Benjamin Herrenschmidt 2017-04-11 23:15 ` Benjamin Herrenschmidt 2017-04-13 3:35 ` Michael Ellerman 2017-04-13 3:35 ` Michael Ellerman 2017-04-11 12:29 ` [PATCH v3 22/32] s390: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 23/32] sh: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 24/32] sparc: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 25/32] tile: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 26/32] unicore32: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 27/32] x86: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 28/32] xtensa: " Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 29/32] arm64: implement ioremap_nopost() interface Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi [this message] 2017-04-11 12:29 ` [PATCH v3 30/32] arm: " Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 31/32] lib: fix Devres devm_ioremap_* offset parameter kerneldoc description Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` [PATCH v3 32/32] lib: implement Devres ioremap_nopost() interface Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 12:29 ` Lorenzo Pieralisi 2017-04-11 13:38 ` [PATCH v3 00/32] PCI: fix config and I/O Address space memory mappings Benjamin Herrenschmidt 2017-04-11 13:38 ` Benjamin Herrenschmidt 2017-04-11 13:38 ` Benjamin Herrenschmidt 2017-04-11 14:08 ` Lorenzo Pieralisi 2017-04-11 14:08 ` Lorenzo Pieralisi 2017-04-11 14:08 ` Lorenzo Pieralisi 2017-04-11 23:12 ` Benjamin Herrenschmidt 2017-04-11 23:12 ` Benjamin Herrenschmidt 2017-04-11 23:12 ` Benjamin Herrenschmidt 2017-04-12 9:44 ` Lorenzo Pieralisi 2017-04-12 9:44 ` Lorenzo Pieralisi 2017-04-12 9:44 ` Lorenzo Pieralisi 2017-04-12 13:48 ` Benjamin Herrenschmidt 2017-04-12 13:48 ` Benjamin Herrenschmidt 2017-04-12 13:48 ` Benjamin Herrenschmidt 2017-04-12 11:31 ` Russell King - ARM Linux 2017-04-12 11:31 ` Russell King - ARM Linux 2017-04-12 11:31 ` Russell King - ARM Linux 2017-04-12 13:51 ` Benjamin Herrenschmidt 2017-04-12 13:51 ` Benjamin Herrenschmidt 2017-04-12 13:51 ` Benjamin Herrenschmidt 2017-04-12 14:16 ` Russell King - ARM Linux 2017-04-12 14:16 ` Russell King - ARM Linux 2017-04-12 14:16 ` Russell King - ARM Linux 2017-04-12 14:41 ` Lorenzo Pieralisi 2017-04-12 14:41 ` Lorenzo Pieralisi 2017-04-12 14:41 ` Lorenzo Pieralisi 2017-04-12 22:30 ` Benjamin Herrenschmidt 2017-04-12 22:30 ` Benjamin Herrenschmidt 2017-04-12 22:30 ` Benjamin Herrenschmidt 2017-04-12 22:45 ` Russell King - ARM Linux 2017-04-12 22:45 ` Russell King - ARM Linux 2017-04-12 22:45 ` Russell King - ARM Linux 2017-04-13 0:53 ` Benjamin Herrenschmidt 2017-04-13 0:53 ` Benjamin Herrenschmidt 2017-04-13 0:53 ` Benjamin Herrenschmidt 2017-04-18 8:57 ` Lorenzo Pieralisi 2017-04-18 8:57 ` Lorenzo Pieralisi 2017-04-18 8:57 ` Lorenzo Pieralisi 2017-04-18 10:36 ` Benjamin Herrenschmidt 2017-04-18 10:36 ` Benjamin Herrenschmidt 2017-04-18 10:36 ` Benjamin Herrenschmidt 2017-04-18 11:03 ` Lorenzo Pieralisi 2017-04-18 11:03 ` Lorenzo Pieralisi 2017-04-18 11:03 ` Lorenzo Pieralisi 2017-04-18 22:38 ` Benjamin Herrenschmidt 2017-04-18 22:38 ` Benjamin Herrenschmidt 2017-04-18 22:38 ` Benjamin Herrenschmidt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170411122923.6285-31-lorenzo.pieralisi@arm.com \ --to=lorenzo.pieralisi@arm.com \ --cc=arnd@arndb.de \ --cc=linux-arch@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pci@vger.kernel.org \ --cc=linux@armlinux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.