提交 b8ce0aad 编写于 作者: H Helge Deller 提交者: Kyle McMartin

[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: NHelge Deller <deller@parisc-linux.org>
Signed-off-by: NKyle McMartin <kyle@parisc-linux.org>
上级 b31059f7
...@@ -138,6 +138,17 @@ config 64BIT ...@@ -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---
......
...@@ -72,7 +72,7 @@ remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size, ...@@ -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, ...@@ -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); ...@@ -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 ...@@ -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) #ifdef CONFIG_HPPA_IOREMAP
return;
#else
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
} }
...@@ -26,11 +26,7 @@ extern unsigned long parisc_vmerge_max_size; ...@@ -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 (BITS_PER_LONG - 4)
#define NYBBLE_SHIFT 60
#else
#define NYBBLE_SHIFT 28
#endif
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) ...@@ -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 #ifdef CONFIG_HPPA_IOREMAP
#if USE_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 ...@@ -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 ...@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册