Commit 5ddcb3c35be995517a32799796e2acda90a784e0
Committed by
Ralf Baechle
1 parent
bb33b19ff9
Exists in
master
and in
7 other branches
[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
arch/mips/Makefile
... | ... | @@ -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 */ |