Browse Source

[PARISC] Add CONFIG_HPPA_IOREMAP to conditionally enable ioremap

Instead of making it a #define in asm/io.h, allow user to select
to turn on IOREMAP from the config menu.

Signed-off-by: Helge Deller <deller@parisc-linux.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
Helge Deller 19 years ago
parent
commit
b8ce0aadcd
3 changed files with 22 additions and 18 deletions
  1. 11 0
      arch/parisc/Kconfig
  2. 6 7
      arch/parisc/mm/ioremap.c
  3. 5 11
      include/asm-parisc/io.h

+ 11 - 0
arch/parisc/Kconfig

@@ -138,6 +138,17 @@ config 64BIT
 	  enable this option otherwise. The 64bit kernel is significantly bigger
 	  enable this option otherwise. The 64bit kernel is significantly bigger
 	  and slower than the 32bit one.
 	  and slower than the 32bit one.
 
 
+config HPPA_IOREMAP
+	bool "Enable IOREMAP functionality (EXPERIMENTAL)"
+	depends on EXPERIMENTAL
+	default n
+	help
+	  Enable this option if you want to enable real IOREMAPPING on PA-RISC.
+	  Currently we just "simulate" I/O remapping, and enabling this option
+	  will just crash your machine.
+
+	  Say N here, unless you are a real PA-RISC Linux kernel hacker.
+
 config SMP
 config SMP
 	bool "Symmetric multi-processing support"
 	bool "Symmetric multi-processing support"
 	---help---
 	---help---

+ 6 - 7
arch/parisc/mm/ioremap.c

@@ -72,7 +72,7 @@ remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size,
 	return 0;
 	return 0;
 }
 }
 
 
-#if USE_HPPA_IOREMAP
+#ifdef CONFIG_HPPA_IOREMAP
 static int 
 static int 
 remap_area_pages(unsigned long address, unsigned long phys_addr,
 remap_area_pages(unsigned long address, unsigned long phys_addr,
 		 unsigned long size, unsigned long flags)
 		 unsigned long size, unsigned long flags)
@@ -114,7 +114,7 @@ remap_area_pages(unsigned long address, unsigned long phys_addr,
 
 
 	return error;
 	return error;
 }
 }
-#endif /* USE_HPPA_IOREMAP */
+#endif /* CONFIG_HPPA_IOREMAP */
 
 
 #ifdef CONFIG_DEBUG_IOREMAP
 #ifdef CONFIG_DEBUG_IOREMAP
 static unsigned long last = 0;
 static unsigned long last = 0;
@@ -154,8 +154,7 @@ EXPORT_SYMBOL(__raw_bad_addr);
  */
  */
 void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
 void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
 {
 {
-#if !(USE_HPPA_IOREMAP)
-
+#if !defined(CONFIG_HPPA_IOREMAP)
 	unsigned long end = phys_addr + size - 1;
 	unsigned long end = phys_addr + size - 1;
 	/* Support EISA addresses */
 	/* Support EISA addresses */
 	if ((phys_addr >= 0x00080000 && end < 0x000fffff)
 	if ((phys_addr >= 0x00080000 && end < 0x000fffff)
@@ -222,10 +221,10 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
 
 
 void iounmap(void __iomem *addr)
 void iounmap(void __iomem *addr)
 {
 {
-#if !(USE_HPPA_IOREMAP)
-	return;
-#else
+#ifdef CONFIG_HPPA_IOREMAP
 	if (addr > high_memory)
 	if (addr > high_memory)
 		return vfree((void *) (PAGE_MASK & (unsigned long __force) addr));
 		return vfree((void *) (PAGE_MASK & (unsigned long __force) addr));
+#else
+	return;
 #endif
 #endif
 }
 }

+ 5 - 11
include/asm-parisc/io.h

@@ -26,11 +26,7 @@ extern unsigned long parisc_vmerge_max_size;
  */
  */
 
 
 #ifdef CONFIG_DEBUG_IOREMAP
 #ifdef CONFIG_DEBUG_IOREMAP
-#ifdef CONFIG_64BIT
-#define NYBBLE_SHIFT 60
-#else
-#define NYBBLE_SHIFT 28
-#endif
+#define NYBBLE_SHIFT (BITS_PER_LONG - 4)
 extern void gsc_bad_addr(unsigned long addr);
 extern void gsc_bad_addr(unsigned long addr);
 extern void __raw_bad_addr(const volatile void __iomem *addr);
 extern void __raw_bad_addr(const volatile void __iomem *addr);
 #define gsc_check_addr(addr)					\
 #define gsc_check_addr(addr)					\
@@ -181,13 +177,11 @@ extern inline void * ioremap_nocache(unsigned long offset, unsigned long size)
 extern void iounmap(void __iomem *addr);
 extern void iounmap(void __iomem *addr);
 
 
 /*
 /*
- * USE_HPPA_IOREMAP is the magic flag to enable or disable real ioremap()
+ * CONFIG_HPPA_IOREMAP is the magic flag to enable or disable real ioremap()
  * functionality.  It's currently disabled because it may not work on some
  * functionality.  It's currently disabled because it may not work on some
  * machines.
  * machines.
  */
  */
-#define USE_HPPA_IOREMAP 0
-
-#if USE_HPPA_IOREMAP
+#ifdef CONFIG_HPPA_IOREMAP
 static inline unsigned char __raw_readb(const volatile void __iomem *addr)
 static inline unsigned char __raw_readb(const volatile void __iomem *addr)
 {
 {
 	return (*(volatile unsigned char __force *) (addr));
 	return (*(volatile unsigned char __force *) (addr));
@@ -221,7 +215,7 @@ static inline void __raw_writeq(unsigned long long b, volatile void __iomem *add
 {
 {
 	*(volatile unsigned long long __force *) addr = b;
 	*(volatile unsigned long long __force *) addr = b;
 }
 }
-#else /* !USE_HPPA_IOREMAP */
+#else /* !CONFIG_HPPA_IOREMAP */
 static inline unsigned char __raw_readb(const volatile void __iomem *addr)
 static inline unsigned char __raw_readb(const volatile void __iomem *addr)
 {
 {
 	__raw_check_addr(addr);
 	__raw_check_addr(addr);
@@ -271,7 +265,7 @@ static inline void __raw_writeq(unsigned long long b, volatile void __iomem *add
 
 
 	gsc_writeq(b, (unsigned long) addr);
 	gsc_writeq(b, (unsigned long) addr);
 }
 }
-#endif /* !USE_HPPA_IOREMAP */
+#endif /* !CONFIG_HPPA_IOREMAP */
 
 
 /* readb can never be const, so use __fswab instead of le*_to_cpu */
 /* readb can never be const, so use __fswab instead of le*_to_cpu */
 #define readb(addr) __raw_readb(addr)
 #define readb(addr) __raw_readb(addr)