linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Baoquan He <bhe@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org, akpm@linux-foundation.org, hch@infradead.org,
	agordeev@linux.ibm.com, wangkefeng.wang@huawei.com,
	linux-arm-kernel@lists.infradead.org, Baoquan He <bhe@redhat.com>
Subject: [PATCH v2 01/11] mm/ioremap: change the return value of io[re|un]map_allowed and rename
Date: Sat, 20 Aug 2022 08:31:15 +0800	[thread overview]
Message-ID: <20220820003125.353570-2-bhe@redhat.com> (raw)
In-Reply-To: <20220820003125.353570-1-bhe@redhat.com>

In some architectures, there are ARCH specifici io address mapping
handling when calling ioremap() or ioremap_prot(), e.g, arc, ia64,
openrisc, s390, sh.

In oder to convert them to take GENERIC_IOREMAP method, we need change
the return value of hook ioremap_allowed() and iounmap_allowed().
Meanwhile, rename them to arch_ioremap() and arch_iounmap() to reflect
their current behaviour.

===
 arch_ioremap() return a bool,
   - IS_ERR means return an error
   - NULL means continue to remap
   - a non-NULL, non-IS_ERR pointer is returned directly
 arch_iounmap() return a bool,
   - 0 means continue to vunmap
   - error code means skip vunmap and return directly

This is taken from Kefeng's below old patch. Christoph suggested the
return value because he foresaw the doablity of converting to take
GENERIC_IOREMAP on more architectures.
 - [PATCH v3 4/6] mm: ioremap: Add arch_ioremap/iounmap()
 - https://lore.kernel.org/all/20220519082552.117736-5-wangkefeng.wang@huawei.com/T/#u

While at it, the invocation of arch_ioremap() need be moved to the
beginning of ioremap_prot() because architectures like sh, openrisc,
ia64, need do the ARCH specific io address mapping on the original
physical address. And in the later patch, the address fix up code
in arch_ioremap() also need be done on the original addre on some
architectures.

This is preparation for later patch, no functionality change.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 arch/arm64/include/asm/io.h |  4 ++--
 arch/arm64/mm/ioremap.c     | 15 ++++++++++-----
 include/asm-generic/io.h    | 29 +++++++++++++++--------------
 mm/ioremap.c                | 12 ++++++++----
 4 files changed, 35 insertions(+), 25 deletions(-)

diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
index 877495a0fd0c..dd7e1c2dc86c 100644
--- a/arch/arm64/include/asm/io.h
+++ b/arch/arm64/include/asm/io.h
@@ -139,8 +139,8 @@ extern void __memset_io(volatile void __iomem *, int, size_t);
  * I/O memory mapping functions.
  */
 
-bool ioremap_allowed(phys_addr_t phys_addr, size_t size, unsigned long prot);
-#define ioremap_allowed ioremap_allowed
+void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size, unsigned long prot);
+#define arch_ioremap arch_ioremap
 
 #define _PAGE_IOREMAP PROT_DEVICE_nGnRE
 
diff --git a/arch/arm64/mm/ioremap.c b/arch/arm64/mm/ioremap.c
index c5af103d4ad4..b0f4cea86f0e 100644
--- a/arch/arm64/mm/ioremap.c
+++ b/arch/arm64/mm/ioremap.c
@@ -3,19 +3,24 @@
 #include <linux/mm.h>
 #include <linux/io.h>
 
-bool ioremap_allowed(phys_addr_t phys_addr, size_t size, unsigned long prot)
+void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size, unsigned long prot)
 {
-	unsigned long last_addr = phys_addr + size - 1;
+	unsigned long last_addr, offset;
+
+	offset = phys_addr & (~PAGE_MASK);
+	phys_addr -= offset;
+	size = PAGE_ALIGN(size + offset);
+	last_addr = phys_addr + size - 1;
 
 	/* Don't allow outside PHYS_MASK */
 	if (last_addr & ~PHYS_MASK)
-		return false;
+		return IOMEM_ERR_PTR(-EINVAL);
 
 	/* Don't allow RAM to be mapped. */
 	if (WARN_ON(pfn_is_map_memory(__phys_to_pfn(phys_addr))))
-		return false;
+		return IOMEM_ERR_PTR(-EINVAL);
 
-	return true;
+	return NULL;
 }
 
 /*
diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h
index a68f8fbf423b..7b6bfb62ef80 100644
--- a/include/asm-generic/io.h
+++ b/include/asm-generic/io.h
@@ -1049,27 +1049,28 @@ static inline void iounmap(volatile void __iomem *addr)
 
 /*
  * Arch code can implement the following two hooks when using GENERIC_IOREMAP
- * ioremap_allowed() return a bool,
- *   - true means continue to remap
- *   - false means skip remap and return directly
- * iounmap_allowed() return a bool,
- *   - true means continue to vunmap
- *   - false means skip vunmap and return directly
+ * arch_ioremap() return a bool,
+ *   - IS_ERR means return an error
+ *   - NULL means continue to remap
+ *   - a non-NULL, non-IS_ERR pointer is returned directly
+ * arch_iounmap() return a bool,
+ *   - 0 means continue to vunmap
+ *   - error code means skip vunmap and return directly
  */
-#ifndef ioremap_allowed
-#define ioremap_allowed ioremap_allowed
-static inline bool ioremap_allowed(phys_addr_t phys_addr, size_t size,
+#ifndef arch_ioremap
+#define arch_ioremap arch_ioremap
+static inline void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size,
 				   unsigned long prot)
 {
-	return true;
+	return NULL;
 }
 #endif
 
-#ifndef iounmap_allowed
-#define iounmap_allowed iounmap_allowed
-static inline bool iounmap_allowed(void *addr)
+#ifndef arch_iounmap
+#define arch_iounmap arch_iounmap
+static inline int arch_iounmap(void __iomem *addr)
 {
-	return true;
+	return 0;
 }
 #endif
 
diff --git a/mm/ioremap.c b/mm/ioremap.c
index 8652426282cc..99fde69becc7 100644
--- a/mm/ioremap.c
+++ b/mm/ioremap.c
@@ -17,6 +17,13 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
 	unsigned long offset, vaddr;
 	phys_addr_t last_addr;
 	struct vm_struct *area;
+	void __iomem *ioaddr;
+
+	ioaddr = arch_ioremap(phys_addr, size, prot);
+	if (IS_ERR(ioaddr))
+		return NULL;
+	else if (ioaddr)
+		return ioaddr;
 
 	/* Disallow wrap-around or zero size */
 	last_addr = phys_addr + size - 1;
@@ -28,9 +35,6 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
 	phys_addr -= offset;
 	size = PAGE_ALIGN(size + offset);
 
-	if (!ioremap_allowed(phys_addr, size, prot))
-		return NULL;
-
 	area = get_vm_area_caller(size, VM_IOREMAP,
 			__builtin_return_address(0));
 	if (!area)
@@ -52,7 +56,7 @@ void iounmap(volatile void __iomem *addr)
 {
 	void *vaddr = (void *)((unsigned long)addr & PAGE_MASK);
 
-	if (!iounmap_allowed(vaddr))
+	if (arch_iounmap((void __iomem *)addr))
 		return;
 
 	if (is_vmalloc_addr(vaddr))
-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2022-08-20  0:33 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-20  0:31 [PATCH v2 00/11] mm: ioremap: Convert architectures to take GENERIC_IOREMAP way Baoquan He
2022-08-20  0:31 ` Baoquan He [this message]
2022-08-21  6:53   ` [PATCH v2 01/11] mm/ioremap: change the return value of io[re|un]map_allowed and rename Christoph Hellwig
2022-08-22 23:55     ` Baoquan He
2022-08-22  6:25   ` Christophe Leroy
2022-08-23  0:20     ` Baoquan He
2022-08-23  5:24       ` Christophe Leroy
2022-08-23 15:14         ` Baoquan He
2022-08-23 15:26           ` Christophe Leroy
2022-08-24  8:16             ` David Laight
2022-08-28 14:44               ` Baoquan He
2022-08-28  8:36   ` Alexander Gordeev
2022-08-28  9:55     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 02/11] mm: ioremap: fixup the physical address and page prot Baoquan He
2022-08-21  6:54   ` Christoph Hellwig
2022-08-23  1:13     ` Baoquan He
2022-08-22  6:30   ` Christophe Leroy
2022-08-23  1:19     ` Baoquan He
2022-08-23  5:33       ` Christophe Leroy
2022-08-23 12:32         ` Baoquan He
2022-08-23 19:03           ` Christophe Leroy
2022-08-28 11:10             ` Baoquan He
2022-09-12  2:55               ` Baoquan He
2022-09-12  7:10                 ` Christophe Leroy
2022-09-13 15:11                   ` Baoquan He
2022-09-21 16:40                     ` Christophe Leroy
2022-09-22 13:23                       ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 03/11] mm: ioremap: allow ARCH to have its own ioremap definition Baoquan He
2022-08-21  6:57   ` Christoph Hellwig
2022-08-23  2:42     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 04/11] arc: mm: Convert to GENERIC_IOREMAP Baoquan He
2022-08-20  0:31 ` [PATCH v2 05/11] hexagon: " Baoquan He
2022-08-20  1:23   ` Brian Cain
2022-08-21  7:00   ` Christoph Hellwig
2022-08-28 15:08     ` Baoquan He
2022-08-22  6:38   ` Christophe Leroy
2022-08-28 15:12     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 06/11] ia64: " Baoquan He
2022-08-21  7:02   ` Christoph Hellwig
2022-08-28 15:12     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 07/11] openrisc: " Baoquan He
2022-08-21  7:03   ` Christoph Hellwig
2022-08-29  1:40     ` Baoquan He
2022-08-29  6:42       ` Stafford Horne
2022-08-29  8:18         ` Baoquan He
2022-08-30  6:05     ` Christophe Leroy
2022-08-29  6:32   ` Stafford Horne
2022-08-29  8:19     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 08/11] parisc: " Baoquan He
2022-08-20  4:03   ` kernel test robot
2022-08-30 13:00     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 09/11] s390: " Baoquan He
2022-08-21  7:05   ` Christoph Hellwig
2022-08-22 15:08     ` Niklas Schnelle
2022-08-31  8:59       ` Baoquan He
2022-08-22 15:19   ` Niklas Schnelle
2022-08-31  8:58     ` Baoquan He
2022-08-23 12:30   ` Niklas Schnelle
2022-08-31  8:50     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 10/11] sh: " Baoquan He
2022-08-21  7:06   ` Christoph Hellwig
2022-09-01  7:36     ` Baoquan He
     [not found]   ` <202208201146.8VeY9pez-lkp@intel.com>
2022-09-01 10:39     ` Baoquan He
2022-09-01 12:11       ` [kbuild-all] " Chen, Rong A
2022-09-01 12:31         ` Baoquan He
2022-09-02  9:48     ` Baoquan He
2022-08-20  0:31 ` [PATCH v2 11/11] xtensa: " Baoquan He

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=20220820003125.353570-2-bhe@redhat.com \
    --to=bhe@redhat.com \
    --cc=agordeev@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=hch@infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=wangkefeng.wang@huawei.com \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).