Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Atsushi Nemoto and committed by
Ralf Baechle
5ddcb3c3 bb33b19f

+112
+2
arch/mips/Makefile
··· 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 # ··· 588 587 # 589 588 core-$(CONFIG_TOSHIBA_RBTX4938) += arch/mips/tx4938/toshiba_rbtx4938/ 590 589 core-$(CONFIG_TOSHIBA_RBTX4938) += arch/mips/tx4938/common/ 590 + cflags-$(CONFIG_TOSHIBA_RBTX4938) += -Iinclude/asm-mips/mach-tx49xx 591 591 load-$(CONFIG_TOSHIBA_RBTX4938) += 0xffffffff80100000 592 592 593 593 cflags-y += -Iinclude/asm-mips/mach-generic
+8
include/asm-mips/io.h
··· 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) { ··· 287 282 288 283 static inline void iounmap(const volatile void __iomem *addr) 289 284 { 285 + if (plat_iounmap(addr)) 286 + return; 287 + 290 288 #define __IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == CKSEG1) 291 289 292 290 if (cpu_has_64bit_addresses ||
+11
include/asm-mips/mach-au1x00/ioremap.h
··· 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 */
+11
include/asm-mips/mach-generic/ioremap.h
··· 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 */
+38
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 */
+42
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 */