Commit 5ddcb3c35be995517a32799796e2acda90a784e0

Authored by Atsushi Nemoto
Committed by Ralf Baechle
1 parent bb33b19ff9

[MIPS] Make ioremap() work on TX39/49 special unmapped segment

TX39XX and TX49XX have "reserved" segment in CKSEG3 area.
0xff000000-0xff3fffff on TX49XX and 0xff000000-0xfffeffff on TX39XX
are reserved (unmapped, uncached).  Controllers on these SoCs are
placed in this segment.

This patch add plat_ioremap() and plat_iounmap() to override default
behavior and implement these hooks for TX39/TX49.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

Showing 6 changed files with 112 additions and 0 deletions Side-by-side Diff

... ... @@ -580,6 +580,7 @@
580 580 #
581 581 core-$(CONFIG_TOSHIBA_RBTX4927) += arch/mips/tx4927/toshiba_rbtx4927/
582 582 core-$(CONFIG_TOSHIBA_RBTX4927) += arch/mips/tx4927/common/
  583 +cflags-$(CONFIG_TOSHIBA_RBTX4927) += -Iinclude/asm-mips/mach-tx49xx
583 584 load-$(CONFIG_TOSHIBA_RBTX4927) += 0xffffffff80020000
584 585  
585 586 #
... ... @@ -587,6 +588,7 @@
587 588 #
588 589 core-$(CONFIG_TOSHIBA_RBTX4938) += arch/mips/tx4938/toshiba_rbtx4938/
589 590 core-$(CONFIG_TOSHIBA_RBTX4938) += arch/mips/tx4938/common/
  591 +cflags-$(CONFIG_TOSHIBA_RBTX4938) += -Iinclude/asm-mips/mach-tx49xx
590 592 load-$(CONFIG_TOSHIBA_RBTX4938) += 0xffffffff80100000
591 593  
592 594 cflags-y += -Iinclude/asm-mips/mach-generic
include/asm-mips/io.h
... ... @@ -178,6 +178,11 @@
178 178 static inline void __iomem * __ioremap_mode(phys_t offset, unsigned long size,
179 179 unsigned long flags)
180 180 {
  181 + void __iomem *addr = plat_ioremap(offset, size, flags);
  182 +
  183 + if (addr)
  184 + return addr;
  185 +
181 186 #define __IS_LOW512(addr) (!((phys_t)(addr) & (phys_t) ~0x1fffffffULL))
182 187  
183 188 if (cpu_has_64bit_addresses) {
... ... @@ -282,6 +287,9 @@
282 287  
283 288 static inline void iounmap(const volatile void __iomem *addr)
284 289 {
  290 + if (plat_iounmap(addr))
  291 + return;
  292 +
285 293 #define __IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == CKSEG1)
286 294  
287 295 if (cpu_has_64bit_addresses ||
include/asm-mips/mach-au1x00/ioremap.h
... ... @@ -28,5 +28,16 @@
28 28 return __fixup_bigphys_addr(phys_addr, size);
29 29 }
30 30  
  31 +static inline void __iomem *plat_ioremap(phys_t offset, unsigned long size,
  32 + unsigned long flags)
  33 +{
  34 + return NULL;
  35 +}
  36 +
  37 +static inline int plat_iounmap(const volatile void __iomem *addr)
  38 +{
  39 + return 0;
  40 +}
  41 +
31 42 #endif /* __ASM_MACH_AU1X00_IOREMAP_H */
include/asm-mips/mach-generic/ioremap.h
... ... @@ -20,5 +20,16 @@
20 20 return phys_addr;
21 21 }
22 22  
  23 +static inline void __iomem *plat_ioremap(phys_t offset, unsigned long size,
  24 + unsigned long flags)
  25 +{
  26 + return NULL;
  27 +}
  28 +
  29 +static inline int plat_iounmap(const volatile void __iomem *addr)
  30 +{
  31 + return 0;
  32 +}
  33 +
23 34 #endif /* __ASM_MACH_GENERIC_IOREMAP_H */
include/asm-mips/mach-jmr3927/ioremap.h
  1 +/*
  2 + * include/asm-mips/mach-jmr3927/ioremap.h
  3 + *
  4 + * This program is free software; you can redistribute it and/or
  5 + * modify it under the terms of the GNU General Public License
  6 + * as published by the Free Software Foundation; either version
  7 + * 2 of the License, or (at your option) any later version.
  8 + */
  9 +#ifndef __ASM_MACH_JMR3927_IOREMAP_H
  10 +#define __ASM_MACH_JMR3927_IOREMAP_H
  11 +
  12 +#include <linux/types.h>
  13 +
  14 +/*
  15 + * Allow physical addresses to be fixed up to help peripherals located
  16 + * outside the low 32-bit range -- generic pass-through version.
  17 + */
  18 +static inline phys_t fixup_bigphys_addr(phys_t phys_addr, phys_t size)
  19 +{
  20 + return phys_addr;
  21 +}
  22 +
  23 +static inline void __iomem *plat_ioremap(phys_t offset, unsigned long size,
  24 + unsigned long flags)
  25 +{
  26 +#define TXX9_DIRECTMAP_BASE 0xff000000ul
  27 + if (offset >= TXX9_DIRECTMAP_BASE &&
  28 + offset < TXX9_DIRECTMAP_BASE + 0xf0000)
  29 + return (void __iomem *)offset;
  30 + return NULL;
  31 +}
  32 +
  33 +static inline int plat_iounmap(const volatile void __iomem *addr)
  34 +{
  35 + return (unsigned long)addr >= TXX9_DIRECTMAP_BASE;
  36 +}
  37 +
  38 +#endif /* __ASM_MACH_JMR3927_IOREMAP_H */
include/asm-mips/mach-tx49xx/ioremap.h
  1 +/*
  2 + * include/asm-mips/mach-tx49xx/ioremap.h
  3 + *
  4 + * This program is free software; you can redistribute it and/or
  5 + * modify it under the terms of the GNU General Public License
  6 + * as published by the Free Software Foundation; either version
  7 + * 2 of the License, or (at your option) any later version.
  8 + */
  9 +#ifndef __ASM_MACH_TX49XX_IOREMAP_H
  10 +#define __ASM_MACH_TX49XX_IOREMAP_H
  11 +
  12 +#include <linux/types.h>
  13 +
  14 +/*
  15 + * Allow physical addresses to be fixed up to help peripherals located
  16 + * outside the low 32-bit range -- generic pass-through version.
  17 + */
  18 +static inline phys_t fixup_bigphys_addr(phys_t phys_addr, phys_t size)
  19 +{
  20 + return phys_addr;
  21 +}
  22 +
  23 +static inline void __iomem *plat_ioremap(phys_t offset, unsigned long size,
  24 + unsigned long flags)
  25 +{
  26 +#ifdef CONFIG_64BIT
  27 +#define TXX9_DIRECTMAP_BASE 0xfff000000ul
  28 +#else
  29 +#define TXX9_DIRECTMAP_BASE 0xff000000ul
  30 +#endif
  31 + if (offset >= TXX9_DIRECTMAP_BASE &&
  32 + offset < TXX9_DIRECTMAP_BASE + 0x400000)
  33 + return (void __iomem *)(unsigned long)(int)offset;
  34 + return NULL;
  35 +}
  36 +
  37 +static inline int plat_iounmap(const volatile void __iomem *addr)
  38 +{
  39 + return (unsigned long)addr >= (unsigned long)(int)TXX9_DIRECTMAP_BASE;
  40 +}
  41 +
  42 +#endif /* __ASM_MACH_TX49XX_IOREMAP_H */