2023-09-22 03:43:36

by Baoquan He

[permalink] [raw]
Subject: [PATCH v5 0/4] arch/*/io.h: remove ioremap_uc in some architectures

This patchset tries to remove ioremap_uc() in the current architectures
except of x86 and ia64. They will use the default ioremap_uc version
in <asm-generic/io.h> which returns NULL. Anyone who wants to add new
invocation of ioremap_uc(), please consider using ioremap() instead or
adding a new ARCH specific ioremap_uc(), or refer to the callsite
in drivers/video/fbdev/aty/atyfb_base.c.

This change won't cuase breakage to the current kernel because in the
only ioremap_uc callsite, an adjustment is made to eliminate impact in
patch 1 of this series.

To get rid of all of them other than x86 and ia64, add asm-generic/io.h
to asm/io.h of mips ARCH. With this adding, we can get rid of the
ioremap_uc() in mips too. This is done in patch 2. And a followup patch
4 is added to remove duplicated code according to Arnd's suggestion.

Test:
=====
Except of Jiaxun's efficient testing on patch 2/4, I also did cross compiling
of this series on mips64, building passed.

History:
=======
v4->v5:
- In v4, Thomas reported that adding <asm-generic/io.h> including into
mips always cause crash on his malta qemu. Finally, Jiaxun stood up to
take over the patch 2/4 and make it work. This patchset collects
Jiaxun's patch v5 and add Arnd's tag. Thanks to Jiaxun.
- Meanwhile, the old patch 4/4 need be adjusted because Jiaxun has done
some removal of duplicated codes in <asm/io.h>.
- Add reviewers' tags from v4.
v3->v4:
- Add patch 1 to adjust code in the only ioremap_uc() callsite so that
later removing ioremap_uc() won't cause breakage.
- Update log and document writing in patch 3.
- Add followup patch 4 to clean up duplicated code in asm/io.h of MIPS.
v2->v3:
- In patch 1, move those macro definition of functio near its function
declaration according to Arnd's suggestion. And remove the unneeded
change in asm/mmiowb.h introduced in old version.
- In patch 2, clean up and rewrite the messy document related to
ioremap_uc() in Documentation/driver-api/device-io.rst.
v1->v2:
- Update log of patch 2, and document related to ioremap_uc()
according to Geert's comment.
- Add Geert's Acked-by.

Arnd Bergmann (1):
video: fbdev: atyfb: only use ioremap_uc() on i386 and ia64

Baoquan He (2):
arch/*/io.h: remove ioremap_uc in some architectures
mips: io: remove duplicated codes

Jiaxun Yang (1):
mips: add <asm-generic/io.h> including

Documentation/driver-api/device-io.rst | 9 +-
arch/alpha/include/asm/io.h | 1 -
arch/hexagon/include/asm/io.h | 3 -
arch/m68k/include/asm/kmap.h | 1 -
arch/mips/include/asm/io.h | 123 +++++++++++++++----------
arch/mips/include/asm/mmiowb.h | 4 +-
arch/mips/include/asm/smp-ops.h | 2 -
arch/mips/include/asm/smp.h | 4 +-
arch/mips/kernel/setup.c | 1 +
arch/mips/pci/pci-ip27.c | 3 +
arch/parisc/include/asm/io.h | 2 -
arch/powerpc/include/asm/io.h | 1 -
arch/sh/include/asm/io.h | 2 -
arch/sparc/include/asm/io_64.h | 1 -
drivers/video/fbdev/aty/atyfb_base.c | 4 +
15 files changed, 88 insertions(+), 73 deletions(-)

--
2.41.0


2023-09-22 06:28:26

by Baoquan He

[permalink] [raw]
Subject: [PATCH v5 3/4] arch/*/io.h: remove ioremap_uc in some architectures

ioremap_uc() is only meaningful on old x86-32 systems with the PAT
extension, and on ia64 with its slightly unconventional ioremap()
behavior. So remove the ioremap_uc() definition in architecutures
other than x86 and ia64. These architectures all have asm-generic/io.h
included and will have the default ioremap_uc() definition which
returns NULL.

This changes the existing behaviour, while no need to worry about
any breakage because in the only callsite of ioremap_uc(), code
has been adjusted to eliminate the impact. Please see
atyfb_setup_generic() of drivers/video/fbdev/aty/atyfb_base.c.

If any new invocation of ioremap_uc() need be added, please consider
using ioremap() intead or adding a ARCH specific version if necessary.

Signed-off-by: Baoquan He <[email protected]>
Acked-by: Geert Uytterhoeven <[email protected]>
Acked-by: Michael Ellerman <[email protected]> (powerpc)
Acked-by: Helge Deller <[email protected]> # parisc
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
Documentation/driver-api/device-io.rst | 9 +++++----
arch/alpha/include/asm/io.h | 1 -
arch/hexagon/include/asm/io.h | 3 ---
arch/m68k/include/asm/kmap.h | 1 -
arch/mips/include/asm/io.h | 1 -
arch/parisc/include/asm/io.h | 2 --
arch/powerpc/include/asm/io.h | 1 -
arch/sh/include/asm/io.h | 2 --
arch/sparc/include/asm/io_64.h | 1 -
9 files changed, 5 insertions(+), 16 deletions(-)

diff --git a/Documentation/driver-api/device-io.rst b/Documentation/driver-api/device-io.rst
index 2c7abd234f4e..d55384b106bd 100644
--- a/Documentation/driver-api/device-io.rst
+++ b/Documentation/driver-api/device-io.rst
@@ -408,11 +408,12 @@ functions for details on the CPU side of things.
ioremap_uc()
------------

-ioremap_uc() behaves like ioremap() except that on the x86 architecture without
-'PAT' mode, it marks memory as uncached even when the MTRR has designated
-it as cacheable, see Documentation/arch/x86/pat.rst.
+ioremap_uc() is only meaningful on old x86-32 systems with the PAT extension,
+and on ia64 with its slightly unconventional ioremap() behavior, everywhere
+elss ioremap_uc() defaults to return NULL.

-Portable drivers should avoid the use of ioremap_uc().
+
+Portable drivers should avoid the use of ioremap_uc(), use ioremap() instead.

ioremap_cache()
---------------
diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
index 7aeaf7c30a6f..076f0e4e7f1e 100644
--- a/arch/alpha/include/asm/io.h
+++ b/arch/alpha/include/asm/io.h
@@ -308,7 +308,6 @@ static inline void __iomem *ioremap(unsigned long port, unsigned long size)
}

#define ioremap_wc ioremap
-#define ioremap_uc ioremap

static inline void iounmap(volatile void __iomem *addr)
{
diff --git a/arch/hexagon/include/asm/io.h b/arch/hexagon/include/asm/io.h
index e2b308e32a37..b7bc246dbcb1 100644
--- a/arch/hexagon/include/asm/io.h
+++ b/arch/hexagon/include/asm/io.h
@@ -174,9 +174,6 @@ static inline void writel(u32 data, volatile void __iomem *addr)
#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

static inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
diff --git a/arch/m68k/include/asm/kmap.h b/arch/m68k/include/asm/kmap.h
index 4efb3efa593a..b778f015c917 100644
--- a/arch/m68k/include/asm/kmap.h
+++ b/arch/m68k/include/asm/kmap.h
@@ -25,7 +25,6 @@ static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size)
return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
}

-#define ioremap_uc ioremap
#define ioremap_wt ioremap_wt
static inline void __iomem *ioremap_wt(unsigned long physaddr,
unsigned long size)
diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h
index 41d8bd5adef8..1ecf255efb40 100644
--- a/arch/mips/include/asm/io.h
+++ b/arch/mips/include/asm/io.h
@@ -170,7 +170,6 @@ void iounmap(const volatile void __iomem *addr);
*/
#define ioremap(offset, size) \
ioremap_prot((offset), (size), _CACHE_UNCACHED)
-#define ioremap_uc ioremap

/*
* ioremap_cache - map bus memory into CPU space
diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h
index 366537042465..48630c78714a 100644
--- a/arch/parisc/include/asm/io.h
+++ b/arch/parisc/include/asm/io.h
@@ -132,8 +132,6 @@ static inline void gsc_writeq(unsigned long long val, unsigned long addr)

#define ioremap_wc(addr, size) \
ioremap_prot((addr), (size), _PAGE_IOREMAP)
-#define ioremap_uc(addr, size) \
- ioremap_prot((addr), (size), _PAGE_IOREMAP)

#define pci_iounmap pci_iounmap

diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h
index 0732b743e099..21bd3e8bffce 100644
--- a/arch/powerpc/include/asm/io.h
+++ b/arch/powerpc/include/asm/io.h
@@ -900,7 +900,6 @@ void __iomem *ioremap_wt(phys_addr_t address, unsigned long size);
#endif

void __iomem *ioremap_coherent(phys_addr_t address, unsigned long size);
-#define ioremap_uc(addr, size) ioremap((addr), (size))
#define ioremap_cache(addr, size) \
ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))

diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h
index f2f38e9d489a..790bea22c9b5 100644
--- a/arch/sh/include/asm/io.h
+++ b/arch/sh/include/asm/io.h
@@ -302,8 +302,6 @@ unsigned long long poke_real_address_q(unsigned long long addr,
ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))
#endif /* CONFIG_MMU */

-#define ioremap_uc ioremap
-
/*
* Convert a physical pointer to a virtual kernel pointer for /dev/mem
* access
diff --git a/arch/sparc/include/asm/io_64.h b/arch/sparc/include/asm/io_64.h
index 9303270b22f3..d8ee1442f303 100644
--- a/arch/sparc/include/asm/io_64.h
+++ b/arch/sparc/include/asm/io_64.h
@@ -423,7 +423,6 @@ static inline void __iomem *ioremap(unsigned long offset, unsigned long size)
return (void __iomem *)offset;
}

-#define ioremap_uc(X,Y) ioremap((X),(Y))
#define ioremap_wc(X,Y) ioremap((X),(Y))
#define ioremap_wt(X,Y) ioremap((X),(Y))
static inline void __iomem *ioremap_np(unsigned long offset, unsigned long size)
--
2.41.0

2023-10-06 08:25:31

by Thomas Bogendoerfer

[permalink] [raw]
Subject: Re: [PATCH v5 3/4] arch/*/io.h: remove ioremap_uc in some architectures

On Thu, Sep 21, 2023 at 07:04:23PM +0800, Baoquan He wrote:
> ioremap_uc() is only meaningful on old x86-32 systems with the PAT
> extension, and on ia64 with its slightly unconventional ioremap()
> behavior. So remove the ioremap_uc() definition in architecutures
> other than x86 and ia64. These architectures all have asm-generic/io.h
> included and will have the default ioremap_uc() definition which
> returns NULL.
>
> This changes the existing behaviour, while no need to worry about
> any breakage because in the only callsite of ioremap_uc(), code
> has been adjusted to eliminate the impact. Please see
> atyfb_setup_generic() of drivers/video/fbdev/aty/atyfb_base.c.
>
> If any new invocation of ioremap_uc() need be added, please consider
> using ioremap() intead or adding a ARCH specific version if necessary.
>
> Signed-off-by: Baoquan He <[email protected]>
> Acked-by: Geert Uytterhoeven <[email protected]>
> Acked-by: Michael Ellerman <[email protected]> (powerpc)
> Acked-by: Helge Deller <[email protected]> # parisc
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> ---
> Documentation/driver-api/device-io.rst | 9 +++++----
> arch/alpha/include/asm/io.h | 1 -
> arch/hexagon/include/asm/io.h | 3 ---
> arch/m68k/include/asm/kmap.h | 1 -
> arch/mips/include/asm/io.h | 1 -

Acked-by: Thomas Bogendoerfer <[email protected]>

--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]

Subject: Re: [PATCH v5 3/4] arch/*/io.h: remove ioremap_uc in some architectures

On Thu, 2023-09-21 at 19:04 +0800, Baoquan He wrote:
> ioremap_uc() is only meaningful on old x86-32 systems with the PAT
> extension, and on ia64 with its slightly unconventional ioremap()
> behavior. So remove the ioremap_uc() definition in architecutures
> other than x86 and ia64. These architectures all have asm-generic/io.h
> included and will have the default ioremap_uc() definition which
> returns NULL.
>
> This changes the existing behaviour, while no need to worry about
> any breakage because in the only callsite of ioremap_uc(), code
> has been adjusted to eliminate the impact. Please see
> atyfb_setup_generic() of drivers/video/fbdev/aty/atyfb_base.c.
>
> If any new invocation of ioremap_uc() need be added, please consider
> using ioremap() intead or adding a ARCH specific version if necessary.
>
> Signed-off-by: Baoquan He <[email protected]>
> Acked-by: Geert Uytterhoeven <[email protected]>
> Acked-by: Michael Ellerman <[email protected]> (powerpc)
> Acked-by: Helge Deller <[email protected]> # parisc
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> ---
> Documentation/driver-api/device-io.rst | 9 +++++----
> arch/alpha/include/asm/io.h | 1 -
> arch/hexagon/include/asm/io.h | 3 ---
> arch/m68k/include/asm/kmap.h | 1 -
> arch/mips/include/asm/io.h | 1 -
> arch/parisc/include/asm/io.h | 2 --
> arch/powerpc/include/asm/io.h | 1 -
> arch/sh/include/asm/io.h | 2 --
> arch/sparc/include/asm/io_64.h | 1 -
> 9 files changed, 5 insertions(+), 16 deletions(-)
>
> diff --git a/Documentation/driver-api/device-io.rst b/Documentation/driver-api/device-io.rst
> index 2c7abd234f4e..d55384b106bd 100644
> --- a/Documentation/driver-api/device-io.rst
> +++ b/Documentation/driver-api/device-io.rst
> @@ -408,11 +408,12 @@ functions for details on the CPU side of things.
> ioremap_uc()
> ------------
>
> -ioremap_uc() behaves like ioremap() except that on the x86 architecture without
> -'PAT' mode, it marks memory as uncached even when the MTRR has designated
> -it as cacheable, see Documentation/arch/x86/pat.rst.
> +ioremap_uc() is only meaningful on old x86-32 systems with the PAT extension,
> +and on ia64 with its slightly unconventional ioremap() behavior, everywhere
> +elss ioremap_uc() defaults to return NULL.
>
> -Portable drivers should avoid the use of ioremap_uc().
> +
> +Portable drivers should avoid the use of ioremap_uc(), use ioremap() instead.
>
> ioremap_cache()
> ---------------
> diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
> index 7aeaf7c30a6f..076f0e4e7f1e 100644
> --- a/arch/alpha/include/asm/io.h
> +++ b/arch/alpha/include/asm/io.h
> @@ -308,7 +308,6 @@ static inline void __iomem *ioremap(unsigned long port, unsigned long size)
> }
>
> #define ioremap_wc ioremap
> -#define ioremap_uc ioremap
>
> static inline void iounmap(volatile void __iomem *addr)
> {
> diff --git a/arch/hexagon/include/asm/io.h b/arch/hexagon/include/asm/io.h
> index e2b308e32a37..b7bc246dbcb1 100644
> --- a/arch/hexagon/include/asm/io.h
> +++ b/arch/hexagon/include/asm/io.h
> @@ -174,9 +174,6 @@ static inline void writel(u32 data, volatile void __iomem *addr)
> #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
>
> static inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
> diff --git a/arch/m68k/include/asm/kmap.h b/arch/m68k/include/asm/kmap.h
> index 4efb3efa593a..b778f015c917 100644
> --- a/arch/m68k/include/asm/kmap.h
> +++ b/arch/m68k/include/asm/kmap.h
> @@ -25,7 +25,6 @@ static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size)
> return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
> }
>
> -#define ioremap_uc ioremap
> #define ioremap_wt ioremap_wt
> static inline void __iomem *ioremap_wt(unsigned long physaddr,
> unsigned long size)
> diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h
> index 41d8bd5adef8..1ecf255efb40 100644
> --- a/arch/mips/include/asm/io.h
> +++ b/arch/mips/include/asm/io.h
> @@ -170,7 +170,6 @@ void iounmap(const volatile void __iomem *addr);
> */
> #define ioremap(offset, size) \
> ioremap_prot((offset), (size), _CACHE_UNCACHED)
> -#define ioremap_uc ioremap
>
> /*
> * ioremap_cache - map bus memory into CPU space
> diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h
> index 366537042465..48630c78714a 100644
> --- a/arch/parisc/include/asm/io.h
> +++ b/arch/parisc/include/asm/io.h
> @@ -132,8 +132,6 @@ static inline void gsc_writeq(unsigned long long val, unsigned long addr)
>
> #define ioremap_wc(addr, size) \
> ioremap_prot((addr), (size), _PAGE_IOREMAP)
> -#define ioremap_uc(addr, size) \
> - ioremap_prot((addr), (size), _PAGE_IOREMAP)
>
> #define pci_iounmap pci_iounmap
>
> diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h
> index 0732b743e099..21bd3e8bffce 100644
> --- a/arch/powerpc/include/asm/io.h
> +++ b/arch/powerpc/include/asm/io.h
> @@ -900,7 +900,6 @@ void __iomem *ioremap_wt(phys_addr_t address, unsigned long size);
> #endif
>
> void __iomem *ioremap_coherent(phys_addr_t address, unsigned long size);
> -#define ioremap_uc(addr, size) ioremap((addr), (size))
> #define ioremap_cache(addr, size) \
> ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))
>
> diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h
> index f2f38e9d489a..790bea22c9b5 100644
> --- a/arch/sh/include/asm/io.h
> +++ b/arch/sh/include/asm/io.h
> @@ -302,8 +302,6 @@ unsigned long long poke_real_address_q(unsigned long long addr,
> ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))
> #endif /* CONFIG_MMU */
>
> -#define ioremap_uc ioremap
> -
> /*
> * Convert a physical pointer to a virtual kernel pointer for /dev/mem
> * access
> diff --git a/arch/sparc/include/asm/io_64.h b/arch/sparc/include/asm/io_64.h
> index 9303270b22f3..d8ee1442f303 100644
> --- a/arch/sparc/include/asm/io_64.h
> +++ b/arch/sparc/include/asm/io_64.h
> @@ -423,7 +423,6 @@ static inline void __iomem *ioremap(unsigned long offset, unsigned long size)
> return (void __iomem *)offset;
> }
>
> -#define ioremap_uc(X,Y) ioremap((X),(Y))
> #define ioremap_wc(X,Y) ioremap((X),(Y))
> #define ioremap_wt(X,Y) ioremap((X),(Y))
> static inline void __iomem *ioremap_np(unsigned long offset, unsigned long size)

Acked-by: John Paul Adrian Glaubitz <[email protected]> (SuperH)

--
.''`. John Paul Adrian Glaubitz
: :' : Debian Developer
`. `' Physicist
`- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913

2023-10-26 12:36:59

by Jiaxun Yang

[permalink] [raw]
Subject: Re: [PATCH v5 0/4] arch/*/io.h: remove ioremap_uc in some architectures



在2023年9月21日九月 下午12:04,Baoquan He写道:
> This patchset tries to remove ioremap_uc() in the current architectures
> except of x86 and ia64. They will use the default ioremap_uc version
> in <asm-generic/io.h> which returns NULL. Anyone who wants to add new
> invocation of ioremap_uc(), please consider using ioremap() instead or
> adding a new ARCH specific ioremap_uc(), or refer to the callsite
> in drivers/video/fbdev/aty/atyfb_base.c.
>
> This change won't cuase breakage to the current kernel because in the
> only ioremap_uc callsite, an adjustment is made to eliminate impact in
> patch 1 of this series.
>
> To get rid of all of them other than x86 and ia64, add asm-generic/io.h
> to asm/io.h of mips ARCH. With this adding, we can get rid of the
> ioremap_uc() in mips too. This is done in patch 2. And a followup patch
> 4 is added to remove duplicated code according to Arnd's suggestion.
>
> Test:
> =====
> Except of Jiaxun's efficient testing on patch 2/4, I also did cross compiling
> of this series on mips64, building passed.
>

For whole series:

Tested-by: Jiaxun Yang <[email protected]>

Hi Arnd and Thomas,

I've got some work pending based on this series, however I'm unclear about
which tree this series will go since both of you give acked-by.

Given that there are some tree-wide modifications, I guess it should go into
Arnd's asm-generic tree?

Thanks
--
- Jiaxun

2023-10-26 23:19:27

by Baoquan He

[permalink] [raw]
Subject: Re: [PATCH v5 0/4] arch/*/io.h: remove ioremap_uc in some architectures

On 10/26/23 at 01:36pm, Jiaxun Yang wrote:
>
>
> 在2023年9月21日九月 下午12:04,Baoquan He写道:
> > This patchset tries to remove ioremap_uc() in the current architectures
> > except of x86 and ia64. They will use the default ioremap_uc version
> > in <asm-generic/io.h> which returns NULL. Anyone who wants to add new
> > invocation of ioremap_uc(), please consider using ioremap() instead or
> > adding a new ARCH specific ioremap_uc(), or refer to the callsite
> > in drivers/video/fbdev/aty/atyfb_base.c.
> >
> > This change won't cuase breakage to the current kernel because in the
> > only ioremap_uc callsite, an adjustment is made to eliminate impact in
> > patch 1 of this series.
> >
> > To get rid of all of them other than x86 and ia64, add asm-generic/io.h
> > to asm/io.h of mips ARCH. With this adding, we can get rid of the
> > ioremap_uc() in mips too. This is done in patch 2. And a followup patch
> > 4 is added to remove duplicated code according to Arnd's suggestion.
> >
> > Test:
> > =====
> > Except of Jiaxun's efficient testing on patch 2/4, I also did cross compiling
> > of this series on mips64, building passed.
> >
>
> For whole series:
>
> Tested-by: Jiaxun Yang <[email protected]>

Thanks for testing, Jiaxun.

>
> Hi Arnd and Thomas,
>
> I've got some work pending based on this series, however I'm unclear about
> which tree this series will go since both of you give acked-by.
>
> Given that there are some tree-wide modifications, I guess it should go into
> Arnd's asm-generic tree?

Previously Andrew merged my below patchset. This patchset is solving the
left issue during reviewing below patchset and discussing. Maybe Andrew
can help pick this patches?

[PATCH v8 00/19] mm: ioremap: Convert architectures to take GENERIC_IOREMAP way
https://lore.kernel.org/all/[email protected]/T/#u

Thanks
Baoquan