aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/xtensa/mmu.txt18
-rw-r--r--arch/xtensa/include/asm/initialize_mmu.h9
-rw-r--r--arch/xtensa/include/asm/io.h10
-rw-r--r--arch/xtensa/include/asm/vectors.h8
-rw-r--r--arch/xtensa/kernel/setup.c37
-rw-r--r--arch/xtensa/mm/mmu.c16
6 files changed, 93 insertions, 5 deletions
diff --git a/Documentation/xtensa/mmu.txt b/Documentation/xtensa/mmu.txt
index 2b1af7606d57..0312fe66475c 100644
--- a/Documentation/xtensa/mmu.txt
+++ b/Documentation/xtensa/mmu.txt
@@ -44,3 +44,21 @@ After step 4, we jump to intended (linked) address of this code.
44 40..5F -> 40 40..5F -> pc -> pc 40..5F -> pc 44 40..5F -> 40 40..5F -> pc -> pc 40..5F -> pc
45 20..3F -> 20 -> 20 20..3F -> 20 45 20..3F -> 20 -> 20 20..3F -> 20
46 00..1F -> 00 -> 00 00..1F -> 00 46 00..1F -> 00 -> 00 00..1F -> 00
47
48The default location of IO peripherals is above 0xf0000000. This may change
49using a "ranges" property in a device tree simple-bus node. See ePAPR 1.1, ยง6.5
50for details on the syntax and semantic of simple-bus nodes. The following
51limitations apply:
52
531. Only top level simple-bus nodes are considered
54
552. Only one (first) simple-bus node is considered
56
573. Empty "ranges" properties are not supported
58
594. Only the first triplet in the "ranges" property is considered
60
615. The parent-bus-address value is rounded down to the nearest 256MB boundary
62
636. The IO area covers the entire 256MB segment of parent-bus-address; the
64 "ranges" triplet length field is ignored
diff --git a/arch/xtensa/include/asm/initialize_mmu.h b/arch/xtensa/include/asm/initialize_mmu.h
index a2078a2e5476..600781edc8a3 100644
--- a/arch/xtensa/include/asm/initialize_mmu.h
+++ b/arch/xtensa/include/asm/initialize_mmu.h
@@ -26,6 +26,9 @@
26#include <asm/pgtable.h> 26#include <asm/pgtable.h>
27#include <asm/vectors.h> 27#include <asm/vectors.h>
28 28
29#define CA_BYPASS (_PAGE_CA_BYPASS | _PAGE_HW_WRITE | _PAGE_HW_EXEC)
30#define CA_WRITEBACK (_PAGE_CA_WB | _PAGE_HW_WRITE | _PAGE_HW_EXEC)
31
29#ifdef __ASSEMBLY__ 32#ifdef __ASSEMBLY__
30 33
31#define XTENSA_HWVERSION_RC_2009_0 230000 34#define XTENSA_HWVERSION_RC_2009_0 230000
@@ -80,8 +83,6 @@
80 /* Step 2: map 0x40000000..0x47FFFFFF to paddr containing this code 83 /* Step 2: map 0x40000000..0x47FFFFFF to paddr containing this code
81 * and jump to the new mapping. 84 * and jump to the new mapping.
82 */ 85 */
83#define CA_BYPASS (_PAGE_CA_BYPASS | _PAGE_HW_WRITE | _PAGE_HW_EXEC)
84#define CA_WRITEBACK (_PAGE_CA_WB | _PAGE_HW_WRITE | _PAGE_HW_EXEC)
85 86
86 srli a3, a0, 27 87 srli a3, a0, 27
87 slli a3, a3, 27 88 slli a3, a3, 27
@@ -124,12 +125,12 @@
124 witlb a4, a5 125 witlb a4, a5
125 126
126 movi a5, XCHAL_KIO_CACHED_VADDR + 6 127 movi a5, XCHAL_KIO_CACHED_VADDR + 6
127 movi a4, XCHAL_KIO_PADDR + CA_WRITEBACK 128 movi a4, XCHAL_KIO_DEFAULT_PADDR + CA_WRITEBACK
128 wdtlb a4, a5 129 wdtlb a4, a5
129 witlb a4, a5 130 witlb a4, a5
130 131
131 movi a5, XCHAL_KIO_BYPASS_VADDR + 6 132 movi a5, XCHAL_KIO_BYPASS_VADDR + 6
132 movi a4, XCHAL_KIO_PADDR + CA_BYPASS 133 movi a4, XCHAL_KIO_DEFAULT_PADDR + CA_BYPASS
133 wdtlb a4, a5 134 wdtlb a4, a5
134 witlb a4, a5 135 witlb a4, a5
135 136
diff --git a/arch/xtensa/include/asm/io.h b/arch/xtensa/include/asm/io.h
index 1482a3636381..2a042d430c25 100644
--- a/arch/xtensa/include/asm/io.h
+++ b/arch/xtensa/include/asm/io.h
@@ -24,6 +24,16 @@
24#define IO_SPACE_LIMIT ~0 24#define IO_SPACE_LIMIT ~0
25 25
26#ifdef CONFIG_MMU 26#ifdef CONFIG_MMU
27
28#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF
29extern unsigned long xtensa_kio_paddr;
30
31static inline unsigned long xtensa_get_kio_paddr(void)
32{
33 return xtensa_kio_paddr;
34}
35#endif
36
27/* 37/*
28 * Return the virtual address for the specified bus memory. 38 * Return the virtual address for the specified bus memory.
29 * Note that we currently don't support any address outside the KIO segment. 39 * Note that we currently don't support any address outside the KIO segment.
diff --git a/arch/xtensa/include/asm/vectors.h b/arch/xtensa/include/asm/vectors.h
index 221a60d804d5..5791b45d5a5d 100644
--- a/arch/xtensa/include/asm/vectors.h
+++ b/arch/xtensa/include/asm/vectors.h
@@ -22,9 +22,15 @@
22 22
23#define XCHAL_KIO_CACHED_VADDR 0xe0000000 23#define XCHAL_KIO_CACHED_VADDR 0xe0000000
24#define XCHAL_KIO_BYPASS_VADDR 0xf0000000 24#define XCHAL_KIO_BYPASS_VADDR 0xf0000000
25#define XCHAL_KIO_PADDR 0xf0000000 25#define XCHAL_KIO_DEFAULT_PADDR 0xf0000000
26#define XCHAL_KIO_SIZE 0x10000000 26#define XCHAL_KIO_SIZE 0x10000000
27 27
28#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF
29#define XCHAL_KIO_PADDR xtensa_get_kio_paddr()
30#else
31#define XCHAL_KIO_PADDR XCHAL_KIO_DEFAULT_PADDR
32#endif
33
28#if defined(CONFIG_MMU) 34#if defined(CONFIG_MMU)
29 35
30/* Will Become VECBASE */ 36/* Will Become VECBASE */
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c
index f38badeb7747..7d12af1317f1 100644
--- a/arch/xtensa/kernel/setup.c
+++ b/arch/xtensa/kernel/setup.c
@@ -212,6 +212,42 @@ static int __init parse_bootparam(const bp_tag_t* tag)
212#ifdef CONFIG_OF 212#ifdef CONFIG_OF
213bool __initdata dt_memory_scan = false; 213bool __initdata dt_memory_scan = false;
214 214
215#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
216unsigned long xtensa_kio_paddr = XCHAL_KIO_DEFAULT_PADDR;
217EXPORT_SYMBOL(xtensa_kio_paddr);
218
219static int __init xtensa_dt_io_area(unsigned long node, const char *uname,
220 int depth, void *data)
221{
222 const __be32 *ranges;
223 unsigned long len;
224
225 if (depth > 1)
226 return 0;
227
228 if (!of_flat_dt_is_compatible(node, "simple-bus"))
229 return 0;
230
231 ranges = of_get_flat_dt_prop(node, "ranges", &len);
232 if (!ranges)
233 return 1;
234 if (len == 0)
235 return 1;
236
237 xtensa_kio_paddr = of_read_ulong(ranges+1, 1);
238 /* round down to nearest 256MB boundary */
239 xtensa_kio_paddr &= 0xf0000000;
240
241 return 1;
242}
243#else
244static int __init xtensa_dt_io_area(unsigned long node, const char *uname,
245 int depth, void *data)
246{
247 return 1;
248}
249#endif
250
215void __init early_init_dt_add_memory_arch(u64 base, u64 size) 251void __init early_init_dt_add_memory_arch(u64 base, u64 size)
216{ 252{
217 if (!dt_memory_scan) 253 if (!dt_memory_scan)
@@ -232,6 +268,7 @@ void __init early_init_devtree(void *params)
232 dt_memory_scan = true; 268 dt_memory_scan = true;
233 269
234 early_init_dt_scan(params); 270 early_init_dt_scan(params);
271 of_scan_flat_dt(xtensa_dt_io_area, NULL);
235 272
236 if (!command_line[0]) 273 if (!command_line[0])
237 strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); 274 strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c
index 5bb8e3c61d85..36ec171698b8 100644
--- a/arch/xtensa/mm/mmu.c
+++ b/arch/xtensa/mm/mmu.c
@@ -13,6 +13,8 @@
13#include <asm/tlbflush.h> 13#include <asm/tlbflush.h>
14#include <asm/mmu_context.h> 14#include <asm/mmu_context.h>
15#include <asm/page.h> 15#include <asm/page.h>
16#include <asm/initialize_mmu.h>
17#include <asm/io.h>
16 18
17void __init paging_init(void) 19void __init paging_init(void)
18{ 20{
@@ -37,6 +39,20 @@ void init_mmu(void)
37 set_itlbcfg_register(0); 39 set_itlbcfg_register(0);
38 set_dtlbcfg_register(0); 40 set_dtlbcfg_register(0);
39#endif 41#endif
42#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF
43 /*
44 * Update the IO area mapping in case xtensa_kio_paddr has changed
45 */
46 write_dtlb_entry(__pte(xtensa_kio_paddr + CA_WRITEBACK),
47 XCHAL_KIO_CACHED_VADDR + 6);
48 write_itlb_entry(__pte(xtensa_kio_paddr + CA_WRITEBACK),
49 XCHAL_KIO_CACHED_VADDR + 6);
50 write_dtlb_entry(__pte(xtensa_kio_paddr + CA_BYPASS),
51 XCHAL_KIO_BYPASS_VADDR + 6);
52 write_itlb_entry(__pte(xtensa_kio_paddr + CA_BYPASS),
53 XCHAL_KIO_BYPASS_VADDR + 6);
54#endif
55
40 local_flush_tlb_all(); 56 local_flush_tlb_all();
41 57
42 /* Set rasid register to a known value. */ 58 /* Set rasid register to a known value. */