[v4,12/16] parisc: mm: Convert to GENERIC_IOREMAP

Message ID 20230216123419.461016-13-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 generic_ioremap_prot(),
generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap()
and iounmap() are all visible and available to arch. Arch needs to
provide wrapper functions to override the generic versions if there's
arch specific handling in its ioremap_prot(), ioremap() or iounmap().
This change will simplify implementation by removing duplicated codes
with generic_ioremap_prot() and generic_iounmap(), and has the equivalent
functioality as before.

Here, add wrapper function ioremap_prot() for parisc's special operation
when iounmap().

Meanwhile, add macro ARCH_HAS_IOREMAP_WC since the added ioremap_wc()
will conflict with the one in include/asm-generic/iomap.h, then an
compiling error is seen:

./include/asm-generic/iomap.h:97: warning: "ioremap_wc" redefined
   97 | #define ioremap_wc ioremap

And benefit from the commit 437b6b35362b ("parisc: Use the generic
IO helpers"), those macros don't need be added any more.

Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Cc: Helge Deller <deller@gmx.de>
Cc: linux-parisc@vger.kernel.org
---
 arch/parisc/Kconfig          |  1 +
 arch/parisc/include/asm/io.h | 17 +++++++---
 arch/parisc/mm/ioremap.c     | 62 +++---------------------------------
 3 files changed, 17 insertions(+), 63 deletions(-)
  

Comments

Matthew Wilcox Feb. 16, 2023, 1:50 p.m. UTC | #1
On Thu, Feb 16, 2023 at 08:34:15PM +0800, Baoquan He wrote:
> Meanwhile, add macro ARCH_HAS_IOREMAP_WC since the added ioremap_wc()
> will conflict with the one in include/asm-generic/iomap.h, then an
> compiling error is seen:

Huh?  ARCH_HAS_IOREMAP_WC comes up nowhere else in this patchset, and
the current definition of ioremap_wc() is guarded by an ifndef ioremap_wc

> +#define ioremap_wc(addr, size)  \
> +	ioremap_prot((addr), (size), _PAGE_IOREMAP)

This should be enough all by itself.
  
Baoquan He Feb. 16, 2023, 3:02 p.m. UTC | #2
On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
> On Thu, Feb 16, 2023 at 08:34:15PM +0800, Baoquan He wrote:
> > Meanwhile, add macro ARCH_HAS_IOREMAP_WC since the added ioremap_wc()
> > will conflict with the one in include/asm-generic/iomap.h, then an
> > compiling error is seen:
> 

Thanks for reviewing.

> Huh?  ARCH_HAS_IOREMAP_WC comes up nowhere else in this patchset, and
> the current definition of ioremap_wc() is guarded by an ifndef ioremap_wc

Because another patch of powerpc has got ARCH_HAS_IOREMAP_WC in the
existed code.

> 
> > +#define ioremap_wc(addr, size)  \
> > +	ioremap_prot((addr), (size), _PAGE_IOREMAP)
> 
> This should be enough all by itself.

It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
avoid redefinition there.

include/asm-generic/iomap.h:
----
#ifndef ARCH_HAS_IOREMAP_WC
#define ioremap_wc ioremap
#endif

>
  
Arnd Bergmann Feb. 16, 2023, 3:18 p.m. UTC | #3
On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
> On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
> It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
> avoid redefinition there.
>
> include/asm-generic/iomap.h:
> ----
> #ifndef ARCH_HAS_IOREMAP_WC
> #define ioremap_wc ioremap
> #endif

I'd change that to the usual '#ifndef ioremap_wc' in that case.

      Arnd
  
Baoquan He Feb. 17, 2023, 1:31 p.m. UTC | #4
On 02/16/23 at 04:18pm, Arnd Bergmann wrote:
> On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
> > On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
> > It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
> > avoid redefinition there.
> >
> > include/asm-generic/iomap.h:
> > ----
> > #ifndef ARCH_HAS_IOREMAP_WC
> > #define ioremap_wc ioremap
> > #endif
> 
> I'd change that to the usual '#ifndef ioremap_wc' in that case.

Not sure if I got you. Kill all ARCH_HAS_IOREMAP_xxx in kernel? If yes,
sounds like a good idea.
  
Christophe Leroy Feb. 17, 2023, 1:46 p.m. UTC | #5
Le 17/02/2023 à 14:31, Baoquan He a écrit :
> On 02/16/23 at 04:18pm, Arnd Bergmann wrote:
>> On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
>>> On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
>>> It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
>>> avoid redefinition there.
>>>
>>> include/asm-generic/iomap.h:
>>> ----
>>> #ifndef ARCH_HAS_IOREMAP_WC
>>> #define ioremap_wc ioremap
>>> #endif
>>
>> I'd change that to the usual '#ifndef ioremap_wc' in that case.
> 
> Not sure if I got you. Kill all ARCH_HAS_IOREMAP_xxx in kernel? If yes,
> sounds like a good idea.
> 

At least kill that one at the first place in your series, and then the 
other ones in a follow-up series maybe.
  
Baoquan He Feb. 17, 2023, 2:21 p.m. UTC | #6
On 02/17/23 at 01:46pm, Christophe Leroy wrote:
> 
> 
> Le 17/02/2023 à 14:31, Baoquan He a écrit :
> > On 02/16/23 at 04:18pm, Arnd Bergmann wrote:
> >> On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
> >>> On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
> >>> It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
> >>> avoid redefinition there.
> >>>
> >>> include/asm-generic/iomap.h:
> >>> ----
> >>> #ifndef ARCH_HAS_IOREMAP_WC
> >>> #define ioremap_wc ioremap
> >>> #endif
> >>
> >> I'd change that to the usual '#ifndef ioremap_wc' in that case.
> > 
> > Not sure if I got you. Kill all ARCH_HAS_IOREMAP_xxx in kernel? If yes,
> > sounds like a good idea.
> > 
> 
> At least kill that one at the first place in your series, and then the 
> other ones in a follow-up series maybe.

Then we can make a preparation patch to change that in iomap.h, then
remove all ARCH_HAS_IOREMAP_WC definition in arch. I thought to let this
patch as is,  then get rid of all ARCH_HAS_IOREMAP_xxx in a follow-up
series. While the former is also fine to me. Thanks, Christophe.

diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h
index 08237ae8b840..5fa1e9ca951c 100644
--- a/include/asm-generic/iomap.h
+++ b/include/asm-generic/iomap.h
@@ -93,7 +93,7 @@ extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
 extern void ioport_unmap(void __iomem *);
 #endif
 
-#ifndef ARCH_HAS_IOREMAP_WC
+#ifndef ioremap_wc
 #define ioremap_wc ioremap
 #endif

[~]$ git grep ARCH_HAS_IOREMAP_WC
arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
drivers/net/ethernet/sfc/io.h:#ifdef ARCH_HAS_IOREMAP_WC
drivers/net/ethernet/sfc/siena/io.h:#ifdef ARCH_HAS_IOREMAP_WC
include/asm-generic/iomap.h:#ifndef ARCH_HAS_IOREMAP_WC
  
Christophe Leroy Feb. 17, 2023, 2:33 p.m. UTC | #7
Le 17/02/2023 à 15:21, Baoquan He a écrit :
> On 02/17/23 at 01:46pm, Christophe Leroy wrote:
>>
>>
>> Le 17/02/2023 à 14:31, Baoquan He a écrit :
>>> On 02/16/23 at 04:18pm, Arnd Bergmann wrote:
>>>> On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
>>>>> On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
>>>>> It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
>>>>> avoid redefinition there.
>>>>>
>>>>> include/asm-generic/iomap.h:
>>>>> ----
>>>>> #ifndef ARCH_HAS_IOREMAP_WC
>>>>> #define ioremap_wc ioremap
>>>>> #endif
>>>>
>>>> I'd change that to the usual '#ifndef ioremap_wc' in that case.
>>>
>>> Not sure if I got you. Kill all ARCH_HAS_IOREMAP_xxx in kernel? If yes,
>>> sounds like a good idea.
>>>
>>
>> At least kill that one at the first place in your series, and then the
>> other ones in a follow-up series maybe.
> 
> Then we can make a preparation patch to change that in iomap.h, then
> remove all ARCH_HAS_IOREMAP_WC definition in arch. I thought to let this
> patch as is,  then get rid of all ARCH_HAS_IOREMAP_xxx in a follow-up
> series. While the former is also fine to me. Thanks, Christophe.
> 
> diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h
> index 08237ae8b840..5fa1e9ca951c 100644
> --- a/include/asm-generic/iomap.h
> +++ b/include/asm-generic/iomap.h
> @@ -93,7 +93,7 @@ extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
>   extern void ioport_unmap(void __iomem *);
>   #endif
>   
> -#ifndef ARCH_HAS_IOREMAP_WC
> +#ifndef ioremap_wc
>   #define ioremap_wc ioremap
>   #endif
> 
> [~]$ git grep ARCH_HAS_IOREMAP_WC
> arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> drivers/net/ethernet/sfc/io.h:#ifdef ARCH_HAS_IOREMAP_WC
> drivers/net/ethernet/sfc/siena/io.h:#ifdef ARCH_HAS_IOREMAP_WC
> include/asm-generic/iomap.h:#ifndef ARCH_HAS_IOREMAP_WC
> 
> 

Not so many:

$ git grep ARCH_HAS_IOREMAP_WC  | grep define
arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC

And also make sure they define ioremap_wc :

$ git grep "define ioremap_wc" `git grep -l "define ARCH_HAS_IOREMAP_WC"`
arch/loongarch/include/asm/io.h:#define ioremap_wc(offset, size)        \
arch/mips/include/asm/io.h:#define ioremap_wc(offset, size) 
                        \
arch/powerpc/include/asm/io.h:#define ioremap_wc ioremap_wc
arch/x86/include/asm/io.h:#define ioremap_wc ioremap_wc


Christophe
  
Christophe Leroy Feb. 17, 2023, 2:35 p.m. UTC | #8
Le 17/02/2023 à 15:33, Christophe Leroy a écrit :
> 
> 
> Le 17/02/2023 à 15:21, Baoquan He a écrit :
>> On 02/17/23 at 01:46pm, Christophe Leroy wrote:
>>>
>>>
>>> Le 17/02/2023 à 14:31, Baoquan He a écrit :
>>>> On 02/16/23 at 04:18pm, Arnd Bergmann wrote:
>>>>> On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
>>>>>> On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
>>>>>> It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx 
>>>>>> is to
>>>>>> avoid redefinition there.
>>>>>>
>>>>>> include/asm-generic/iomap.h:
>>>>>> ----
>>>>>> #ifndef ARCH_HAS_IOREMAP_WC
>>>>>> #define ioremap_wc ioremap
>>>>>> #endif
>>>>>
>>>>> I'd change that to the usual '#ifndef ioremap_wc' in that case.
>>>>
>>>> Not sure if I got you. Kill all ARCH_HAS_IOREMAP_xxx in kernel? If yes,
>>>> sounds like a good idea.
>>>>
>>>
>>> At least kill that one at the first place in your series, and then the
>>> other ones in a follow-up series maybe.
>>
>> Then we can make a preparation patch to change that in iomap.h, then
>> remove all ARCH_HAS_IOREMAP_WC definition in arch. I thought to let this
>> patch as is,  then get rid of all ARCH_HAS_IOREMAP_xxx in a follow-up
>> series. While the former is also fine to me. Thanks, Christophe.
>>
>> diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h
>> index 08237ae8b840..5fa1e9ca951c 100644
>> --- a/include/asm-generic/iomap.h
>> +++ b/include/asm-generic/iomap.h
>> @@ -93,7 +93,7 @@ extern void __iomem *ioport_map(unsigned long port, 
>> unsigned int nr);
>>   extern void ioport_unmap(void __iomem *);
>>   #endif
>> -#ifndef ARCH_HAS_IOREMAP_WC
>> +#ifndef ioremap_wc
>>   #define ioremap_wc ioremap
>>   #endif
>>
>> [~]$ git grep ARCH_HAS_IOREMAP_WC
>> arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
>> arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
>> arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
>> arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
>> drivers/net/ethernet/sfc/io.h:#ifdef ARCH_HAS_IOREMAP_WC
>> drivers/net/ethernet/sfc/siena/io.h:#ifdef ARCH_HAS_IOREMAP_WC
>> include/asm-generic/iomap.h:#ifndef ARCH_HAS_IOREMAP_WC
>>
>>
> 
> Not so many:
> 
> $ git grep ARCH_HAS_IOREMAP_WC  | grep define
> arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> 
> And also make sure they define ioremap_wc :
> 
> $ git grep "define ioremap_wc" `git grep -l "define ARCH_HAS_IOREMAP_WC"`
> arch/loongarch/include/asm/io.h:#define ioremap_wc(offset, size)        \
> arch/mips/include/asm/io.h:#define ioremap_wc(offset, size) 
>                         \
> arch/powerpc/include/asm/io.h:#define ioremap_wc ioremap_wc
> arch/x86/include/asm/io.h:#define ioremap_wc ioremap_wc
> 


By the way there are so few, you can make all at once:

$ git grep ARCH_HAS_IOREMAP_ | grep define
arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/m68k/include/asm/kmap.h:#define ARCH_HAS_IOREMAP_WT
arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WT
arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WT

Christophe
  
Baoquan He Feb. 21, 2023, 11:43 a.m. UTC | #9
On 02/17/23 at 02:35pm, Christophe Leroy wrote:
...... 
> > Not so many:
> > 
> > $ git grep ARCH_HAS_IOREMAP_WC  | grep define
> > arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> > arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> > arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> > arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> > 
> > And also make sure they define ioremap_wc :
> > 
> > $ git grep "define ioremap_wc" `git grep -l "define ARCH_HAS_IOREMAP_WC"`
> > arch/loongarch/include/asm/io.h:#define ioremap_wc(offset, size)        \
> > arch/mips/include/asm/io.h:#define ioremap_wc(offset, size) 
> >                         \
> > arch/powerpc/include/asm/io.h:#define ioremap_wc ioremap_wc
> > arch/x86/include/asm/io.h:#define ioremap_wc ioremap_wc
> > 
> 
> 
> By the way there are so few, you can make all at once:

OK, I will try to pack this into one preparation patch. Thanks.

> 
> $ git grep ARCH_HAS_IOREMAP_ | grep define
> arch/loongarch/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/m68k/include/asm/kmap.h:#define ARCH_HAS_IOREMAP_WT
> arch/mips/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/powerpc/include/asm/io.h:#define ARCH_HAS_IOREMAP_WT
> arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WC
> arch/x86/include/asm/io.h:#define ARCH_HAS_IOREMAP_WT
> 
> Christophe
  
Baoquan He Feb. 22, 2023, 8:35 a.m. UTC | #10
Hi Christophe, Arnd,

On 02/17/23 at 01:46pm, Christophe Leroy wrote:
> 
> 
> Le 17/02/2023 à 14:31, Baoquan He a écrit :
> > On 02/16/23 at 04:18pm, Arnd Bergmann wrote:
> >> On Thu, Feb 16, 2023, at 16:02, Baoquan He wrote:
> >>> On 02/16/23 at 01:50pm, Matthew Wilcox wrote:
> >>> It's not if including asm-generic/iomap.h. The ARCH_HAS_IOREMAP_xx is to
> >>> avoid redefinition there.
> >>>
> >>> include/asm-generic/iomap.h:
> >>> ----
> >>> #ifndef ARCH_HAS_IOREMAP_WC
> >>> #define ioremap_wc ioremap
> >>> #endif
> >>
> >> I'd change that to the usual '#ifndef ioremap_wc' in that case.
> > 
> > Not sure if I got you. Kill all ARCH_HAS_IOREMAP_xxx in kernel? If yes,
> > sounds like a good idea.
> > 
> 
> At least kill that one at the first place in your series, and then the 
> other ones in a follow-up series maybe.

I made a patch to remove all ARCH_HAS_IOREMAP_xx macros in architectures
and the ifdeffery of ARCH_HAS_IOREMAP_xx in asm-generic/iomap.h.
But the change will cause building error as below. Becuase we usually
have '#include <asm-generic/iomap.h>' at the beginning of
arch/xx/include/asm/io.h, and have '#include <asm-generic/io.h>' at the
end of arch/xx/include/asm/io.h. For architecutres which has
ARCH_HAS_IOREMAP_xx defining, we need move ''#include <asm-generic/iomap.h>
dowe to below '#include <asm-generic/io.h>'. Please help check if it's
still worth doing.


***move '#include <asm-generic/iomap.h>' below '#include <asm-generic/io.h>' 
***
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
index 8ab68cde1f13..a8d55fc62959 100644
--- a/arch/x86/include/asm/io.h
+++ b/arch/x86/include/asm/io.h
@@ -209,8 +209,6 @@ void memset_io(volatile void __iomem *, int, size_t);
 #define memcpy_toio memcpy_toio
 #define memset_io memset_io
 
-#include <asm-generic/iomap.h>
-
 /*
  * ISA space is 'always mapped' on a typical x86 system, no need to
  * explicitly ioremap() it. The fact that the ISA IO space is mapped
@@ -329,6 +327,8 @@ extern bool is_early_ioremap_ptep(pte_t *ptep);
 #include <asm-generic/io.h>
 #undef PCI_IOBASE
 
+#include <asm-generic/iomap.h>
+
 #ifdef CONFIG_MTRR
 extern int __must_check arch_phys_wc_index(int handle);
 #define arch_phys_wc_index arch_phys_wc_index


***Building error after removing ARCH_HAS_IOREMAP_xx
***
In file included from ./include/linux/io.h:13,
                 from ./include/linux/irq.h:20,
                 from ./include/xen/events.h:6,
                 from arch/x86/entry/common.c:25:
./arch/x86/include/asm/io.h:321: warning: "ioremap_wc" redefined
  321 | #define ioremap_wc ioremap_wc
      | 
In file included from ./arch/x86/include/asm/io.h:212:
./include/asm-generic/iomap.h:97: note: this is the location of the previous definition
   97 | #define ioremap_wc ioremap
      | 
./arch/x86/include/asm/io.h:323: warning: "ioremap_wt" redefined
  323 | #define ioremap_wt ioremap_wt
      | 
./include/asm-generic/iomap.h:101: note: this is the location of the previous definition
  101 | #define ioremap_wt ioremap
  

Patch

diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index a98940e64243..0ed18e673aba 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -36,6 +36,7 @@  config PARISC
 	select GENERIC_ATOMIC64 if !64BIT
 	select GENERIC_IRQ_PROBE
 	select GENERIC_PCI_IOMAP
+	select GENERIC_IOREMAP
 	select ARCH_HAVE_NMI_SAFE_CMPXCHG
 	select GENERIC_SMP_IDLE_THREAD
 	select GENERIC_ARCH_TOPOLOGY if SMP
diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h
index c05e781be2f5..4c386b0cee08 100644
--- a/arch/parisc/include/asm/io.h
+++ b/arch/parisc/include/asm/io.h
@@ -2,6 +2,8 @@ 
 #ifndef _ASM_IO_H
 #define _ASM_IO_H
 
+#define ARCH_HAS_IOREMAP_WC
+
 #include <linux/types.h>
 #include <linux/pgtable.h>
 
@@ -125,12 +127,17 @@  static inline void gsc_writeq(unsigned long long val, unsigned long addr)
 /*
  * The standard PCI ioremap interfaces
  */
-void __iomem *ioremap(unsigned long offset, unsigned long size);
-#define ioremap_wc			ioremap
-#define ioremap_uc			ioremap
-#define pci_iounmap			pci_iounmap
+#define ioremap_prot ioremap_prot
+
+#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | \
+		       _PAGE_ACCESSED | _PAGE_NO_CACHE)
 
-extern void iounmap(const volatile void __iomem *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
 
 void memset_io(volatile void __iomem *addr, unsigned char val, int count);
 void memcpy_fromio(void *dst, const volatile void __iomem *src, int count);
diff --git a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c
index 345ff0b66499..fd996472dfe7 100644
--- a/arch/parisc/mm/ioremap.c
+++ b/arch/parisc/mm/ioremap.c
@@ -13,25 +13,9 @@ 
 #include <linux/io.h>
 #include <linux/mm.h>
 
-/*
- * Generic mapping function (not visible outside):
- */
-
-/*
- * Remap an arbitrary physical address space into the kernel virtual
- * address space.
- *
- * NOTE! We need to allow non-page-aligned mappings too: we will obviously
- * have to convert them into an offset in a page-aligned mapping, but the
- * caller shouldn't need to know that small detail.
- */
-void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
+void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
+			   unsigned long prot)
 {
-	void __iomem *addr;
-	struct vm_struct *area;
-	unsigned long offset, last_addr;
-	pgprot_t pgprot;
-
 #ifdef CONFIG_EISA
 	unsigned long end = phys_addr + size - 1;
 	/* Support EISA addresses */
@@ -40,11 +24,6 @@  void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
 		phys_addr |= F_EXTEND(0xfc000000);
 #endif
 
-	/* Don't allow wraparound or zero size */
-	last_addr = phys_addr + size - 1;
-	if (!size || last_addr < phys_addr)
-		return NULL;
-
 	/*
 	 * Don't allow anybody to remap normal RAM that we're using..
 	 */
@@ -62,39 +41,6 @@  void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
 		}
 	}
 
-	pgprot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY |
-			  _PAGE_ACCESSED | _PAGE_NO_CACHE);
-
-	/*
-	 * Mappings have to be page-aligned
-	 */
-	offset = phys_addr & ~PAGE_MASK;
-	phys_addr &= PAGE_MASK;
-	size = PAGE_ALIGN(last_addr + 1) - phys_addr;
-
-	/*
-	 * Ok, go for it..
-	 */
-	area = get_vm_area(size, VM_IOREMAP);
-	if (!area)
-		return NULL;
-
-	addr = (void __iomem *) area->addr;
-	if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
-			       phys_addr, pgprot)) {
-		vunmap(addr);
-		return NULL;
-	}
-
-	return (void __iomem *) (offset + (char __iomem *)addr);
-}
-EXPORT_SYMBOL(ioremap);
-
-void iounmap(const volatile void __iomem *io_addr)
-{
-	unsigned long addr = (unsigned long)io_addr & PAGE_MASK;
-
-	if (is_vmalloc_addr((void *)addr))
-		vunmap((void *)addr);
+	return generic_ioremap_prot(phys_addr, size, __pgprot(prot));
 }
-EXPORT_SYMBOL(iounmap);
+EXPORT_SYMBOL(ioremap_prot);