[v4,01/16] hexagon: mm: Convert to GENERIC_IOREMAP

Message ID 20230216123419.461016-2-bhe@redhat.com
State New
Headers
Series mm: ioremap: Convert architectures to take GENERIC_IOREMAP way |

Commit Message

Baoquan He Feb. 16, 2023, 12:34 p.m. UTC
  By taking GENERIC_IOREMAP method, the generic ioremap_prot() and
iounmap() are visible and available to arch. This change will
simplify implementation by removing duplicated codes with generic
ioremap_prot() and iounmap(), and has the equivalent functioality.

For hexagon, the current ioremap() and iounmap() are the same as
generic version. After taking GENERIC_IOREMAP way, the old ioremap()
and iounmap() can be completely removed.

Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: Brian Cain <bcain@quicinc.com>
Cc: linux-hexagon@vger.kernel.org
---
 arch/hexagon/Kconfig          |  1 +
 arch/hexagon/include/asm/io.h |  9 +++++--
 arch/hexagon/mm/ioremap.c     | 44 -----------------------------------
 3 files changed, 8 insertions(+), 46 deletions(-)
 delete mode 100644 arch/hexagon/mm/ioremap.c
  

Comments

Arnd Bergmann Feb. 16, 2023, 12:53 p.m. UTC | #1
On Thu, Feb 16, 2023, at 13:34, Baoquan He wrote:
> diff --git a/arch/hexagon/include/asm/io.h 
> b/arch/hexagon/include/asm/io.h
> index 46a099de85b7..dcd9cbbf5934 100644
> --- a/arch/hexagon/include/asm/io.h
> +++ b/arch/hexagon/include/asm/io.h
> @@ -170,8 +170,13 @@ static inline void writel(u32 data, volatile void 
> __iomem *addr)
>  #define writew_relaxed __raw_writew
>  #define writel_relaxed __raw_writel
> 
> -void __iomem *ioremap(unsigned long phys_addr, unsigned long size);
> -#define ioremap_uc(X, Y) ioremap((X), (Y))
> +/*
> + * I/O memory mapping functions.
> + */
> +#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
> +		       (__HEXAGON_C_DEV << 6))
> +
> +#define ioremap_uc(addr, size) ioremap((addr), (size))

I think we probably want to kill off ioremap_uc() here, and use
the generic version that just returns NULL.

I see that there are only two callers of {devm_,}ioremap_uc() left in the
tree, so maybe we can even take that final step and remove it from
the interface. Maybe we can revisit [1] as part of this series.

     Arnd

[1] https://lore.kernel.org/all/20191111192258.2234502-1-arnd@arndb.de/
  
Baoquan He Feb. 16, 2023, 2:47 p.m. UTC | #2
On 02/16/23 at 01:53pm, Arnd Bergmann wrote:
> On Thu, Feb 16, 2023, at 13:34, Baoquan He wrote:
> > diff --git a/arch/hexagon/include/asm/io.h 
> > b/arch/hexagon/include/asm/io.h
> > index 46a099de85b7..dcd9cbbf5934 100644
> > --- a/arch/hexagon/include/asm/io.h
> > +++ b/arch/hexagon/include/asm/io.h
> > @@ -170,8 +170,13 @@ static inline void writel(u32 data, volatile void 
> > __iomem *addr)
> >  #define writew_relaxed __raw_writew
> >  #define writel_relaxed __raw_writel
> > 
> > -void __iomem *ioremap(unsigned long phys_addr, unsigned long size);
> > -#define ioremap_uc(X, Y) ioremap((X), (Y))
> > +/*
> > + * I/O memory mapping functions.
> > + */
> > +#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
> > +		       (__HEXAGON_C_DEV << 6))
> > +

Thanks for reviewing.

> > +#define ioremap_uc(addr, size) ioremap((addr), (size))
> 
> I think we probably want to kill off ioremap_uc() here, and use
> the generic version that just returns NULL.


-#define ioremap_uc(X, Y) ioremap((X), (Y))
+#define ioremap_uc(addr, size) ioremap((addr), (size))

Here, in fact the ioremap_uc() definition is not related. I just
improve the old definition passingly. And similar for other
ioremap_uc() adaptation.

> 
> I see that there are only two callers of {devm_,}ioremap_uc() left in the
> tree, so maybe we can even take that final step and remove it from
> the interface. Maybe we can revisit [1] as part of this series.

I see now. Christoph Hellwig ever mentioned in v2 reviewing, I
didn't get why. Thanks for the details. 
https://lore.kernel.org/all/YwHX98KBEnZw9t6e@infradead.org/T/#u

I am not sure if it's OK to do the change in this patchset, maybe
another patch?

Thanks
Baoquan
  
Arnd Bergmann Feb. 16, 2023, 2:51 p.m. UTC | #3
On Thu, Feb 16, 2023, at 15:47, Baoquan He wrote:
> On 02/16/23 at 01:53pm, Arnd Bergmann wrote:
>> On Thu, Feb 16, 2023, at 13:34, Baoquan He wrote:
>> I see that there are only two callers of {devm_,}ioremap_uc() left in the
>> tree, so maybe we can even take that final step and remove it from
>> the interface. Maybe we can revisit [1] as part of this series.
>
> I see now. Christoph Hellwig ever mentioned in v2 reviewing, I
> didn't get why. Thanks for the details. 
> https://lore.kernel.org/all/YwHX98KBEnZw9t6e@infradead.org/T/#u
>
> I am not sure if it's OK to do the change in this patchset, maybe
> another patch?

Yes, a separate patch would be ideal. If you do the same change in
more than one architecture (other than ia64 and x86), you can combine
those into one patch.

    Arnd
  
Baoquan He Feb. 17, 2023, 12:11 p.m. UTC | #4
On 02/16/23 at 03:51pm, Arnd Bergmann wrote:
> On Thu, Feb 16, 2023, at 15:47, Baoquan He wrote:
> > On 02/16/23 at 01:53pm, Arnd Bergmann wrote:
> >> On Thu, Feb 16, 2023, at 13:34, Baoquan He wrote:
> >> I see that there are only two callers of {devm_,}ioremap_uc() left in the
> >> tree, so maybe we can even take that final step and remove it from
> >> the interface. Maybe we can revisit [1] as part of this series.
> >
> > I see now. Christoph Hellwig ever mentioned in v2 reviewing, I
> > didn't get why. Thanks for the details. 
> > https://lore.kernel.org/all/YwHX98KBEnZw9t6e@infradead.org/T/#u
> >
> > I am not sure if it's OK to do the change in this patchset, maybe
> > another patch?
> 
> Yes, a separate patch would be ideal. If you do the same change in
> more than one architecture (other than ia64 and x86), you can combine
> those into one patch.

I am making a patch to achieve this. There's trouble in mips since it
hasn't had <asm-generic/io.h> in <asm/io.h>, and adding that will cuase
build error. I will post the patch for reviewing.
  

Patch

diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig
index 54eadf265178..17afffde1a7f 100644
--- a/arch/hexagon/Kconfig
+++ b/arch/hexagon/Kconfig
@@ -25,6 +25,7 @@  config HEXAGON
 	select NEED_SG_DMA_LENGTH
 	select NO_IOPORT_MAP
 	select GENERIC_IOMAP
+	select GENERIC_IOREMAP
 	select GENERIC_SMP_IDLE_THREAD
 	select STACKTRACE_SUPPORT
 	select GENERIC_CLOCKEVENTS_BROADCAST
diff --git a/arch/hexagon/include/asm/io.h b/arch/hexagon/include/asm/io.h
index 46a099de85b7..dcd9cbbf5934 100644
--- a/arch/hexagon/include/asm/io.h
+++ b/arch/hexagon/include/asm/io.h
@@ -170,8 +170,13 @@  static inline void writel(u32 data, volatile void __iomem *addr)
 #define writew_relaxed __raw_writew
 #define writel_relaxed __raw_writel
 
-void __iomem *ioremap(unsigned long phys_addr, unsigned long size);
-#define ioremap_uc(X, Y) ioremap((X), (Y))
+/*
+ * I/O memory mapping functions.
+ */
+#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
+		       (__HEXAGON_C_DEV << 6))
+
+#define ioremap_uc(addr, size) ioremap((addr), (size))
 
 
 #define __raw_writel writel
diff --git a/arch/hexagon/mm/ioremap.c b/arch/hexagon/mm/ioremap.c
deleted file mode 100644
index 255c5b1ee1a7..000000000000
--- a/arch/hexagon/mm/ioremap.c
+++ /dev/null
@@ -1,44 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * I/O remap functions for Hexagon
- *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
- */
-
-#include <linux/io.h>
-#include <linux/vmalloc.h>
-#include <linux/mm.h>
-
-void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
-{
-	unsigned long last_addr, addr;
-	unsigned long offset = phys_addr & ~PAGE_MASK;
-	struct vm_struct *area;
-
-	pgprot_t prot = __pgprot(_PAGE_PRESENT|_PAGE_READ|_PAGE_WRITE
-					|(__HEXAGON_C_DEV << 6));
-
-	last_addr = phys_addr + size - 1;
-
-	/*  Wrapping not allowed  */
-	if (!size || (last_addr < phys_addr))
-		return NULL;
-
-	/*  Rounds up to next page size, including whole-page offset */
-	size = PAGE_ALIGN(offset + size);
-
-	area = get_vm_area(size, VM_IOREMAP);
-	addr = (unsigned long)area->addr;
-
-	if (ioremap_page_range(addr, addr+size, phys_addr, prot)) {
-		vunmap((void *)addr);
-		return NULL;
-	}
-
-	return (void __iomem *) (offset + addr);
-}
-
-void iounmap(const volatile void __iomem *addr)
-{
-	vunmap((void *) ((unsigned long) addr & PAGE_MASK));
-}