diff options
Diffstat (limited to 'arch')
30 files changed, 290 insertions, 915 deletions
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index 9eccfbd1b536..2e74cb0b7807 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
@@ -48,25 +48,10 @@ menu "Processor type and features" | |||
48 | 48 | ||
49 | choice | 49 | choice |
50 | prompt "Xtensa Processor Configuration" | 50 | prompt "Xtensa Processor Configuration" |
51 | default XTENSA_CPU_LINUX_BE | 51 | default XTENSA_VARIANT_FSF |
52 | 52 | ||
53 | config XTENSA_CPU_LINUX_BE | 53 | config XTENSA_VARIANT_FSF |
54 | bool "linux_be" | 54 | bool "fsf" |
55 | ---help--- | ||
56 | The linux_be processor configuration is the baseline Xtensa | ||
57 | configurations included in this kernel and also used by | ||
58 | binutils, gcc, and gdb. It contains no TIE, no coprocessors, | ||
59 | and the following configuration options: | ||
60 | |||
61 | Code Density Option 2 Misc Special Registers | ||
62 | NSA/NSAU Instructions 128-bit Data Bus Width | ||
63 | Processor ID 8K, 2-way I and D Caches | ||
64 | Zero-Overhead Loops 2 Inst Address Break Registers | ||
65 | Big Endian 2 Data Address Break Registers | ||
66 | 64 General-Purpose Registers JTAG Interface and Trace Port | ||
67 | 17 Interrupts MMU w/ TLBs and Autorefill | ||
68 | 3 Interrupt Levels 8 Autorefill Ways (I/D TLBs) | ||
69 | 3 Timers Unaligned Exceptions | ||
70 | endchoice | 55 | endchoice |
71 | 56 | ||
72 | config MMU | 57 | config MMU |
diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile index 3a3a4c66ef87..95f836db38fa 100644 --- a/arch/xtensa/Makefile +++ b/arch/xtensa/Makefile | |||
@@ -11,13 +11,13 @@ | |||
11 | # this architecture | 11 | # this architecture |
12 | 12 | ||
13 | # Core configuration. | 13 | # Core configuration. |
14 | # (Use CPU=<xtensa_config> to use another default compiler.) | 14 | # (Use VAR=<xtensa_config> to use another default compiler.) |
15 | 15 | ||
16 | cpu-$(CONFIG_XTENSA_CPU_LINUX_BE) := linux_be | 16 | variant-$(CONFIG_XTENSA_VARIANT_FSF) := fsf |
17 | cpu-$(CONFIG_XTENSA_CPU_LINUX_CUSTOM) := linux_custom | 17 | variant-$(CONFIG_XTENSA_VARIANT_LINUX_CUSTOM) := custom |
18 | 18 | ||
19 | CPU = $(cpu-y) | 19 | VARIANT = $(variant-y) |
20 | export CPU | 20 | export VARIANT |
21 | 21 | ||
22 | # Platform configuration | 22 | # Platform configuration |
23 | 23 | ||
@@ -27,8 +27,6 @@ platform-$(CONFIG_XTENSA_PLATFORM_ISS) := iss | |||
27 | PLATFORM = $(platform-y) | 27 | PLATFORM = $(platform-y) |
28 | export PLATFORM | 28 | export PLATFORM |
29 | 29 | ||
30 | CPPFLAGS += $(if $(KBUILD_SRC),-I$(srctree)/include/asm-xtensa/) | ||
31 | CPPFLAGS += -Iinclude/asm | ||
32 | CFLAGS += -pipe -mlongcalls | 30 | CFLAGS += -pipe -mlongcalls |
33 | 31 | ||
34 | KBUILD_DEFCONFIG := iss_defconfig | 32 | KBUILD_DEFCONFIG := iss_defconfig |
@@ -41,12 +39,12 @@ core-$(CONFIG_EMBEDDED_RAMDISK) += arch/xtensa/boot/ramdisk/ | |||
41 | 39 | ||
42 | # Test for cross compiling | 40 | # Test for cross compiling |
43 | 41 | ||
44 | ifneq ($(CPU),) | 42 | ifneq ($(VARIANT),) |
45 | COMPILE_ARCH = $(shell uname -m) | 43 | COMPILE_ARCH = $(shell uname -m) |
46 | 44 | ||
47 | ifneq ($(COMPILE_ARCH), xtensa) | 45 | ifneq ($(COMPILE_ARCH), xtensa) |
48 | ifndef CROSS_COMPILE | 46 | ifndef CROSS_COMPILE |
49 | CROSS_COMPILE = xtensa_$(CPU)- | 47 | CROSS_COMPILE = xtensa_$(VARIANT)- |
50 | endif | 48 | endif |
51 | endif | 49 | endif |
52 | endif | 50 | endif |
@@ -68,14 +66,13 @@ archinc := include/asm-xtensa | |||
68 | 66 | ||
69 | archprepare: $(archinc)/.platform | 67 | archprepare: $(archinc)/.platform |
70 | 68 | ||
71 | # Update machine cpu and platform symlinks if something which affects | 69 | # Update processor variant and platform symlinks if something which affects |
72 | # them changed. | 70 | # them changed. |
73 | 71 | ||
74 | $(archinc)/.platform: $(wildcard include/config/arch/*.h) include/config/auto.conf | 72 | $(archinc)/.platform: $(wildcard include/config/arch/*.h) include/config/auto.conf |
75 | @echo ' SYMLINK $(archinc)/xtensa/config -> $(archinc)/xtensa/config-$(CPU)' | 73 | @echo ' SYMLINK $(archinc)/variant -> $(archinc)/variant-$(VARIANT)' |
76 | $(Q)mkdir -p $(archinc) | 74 | $(Q)mkdir -p $(archinc) |
77 | $(Q)mkdir -p $(archinc)/xtensa | 75 | $(Q)ln -fsn $(srctree)/$(archinc)/variant-$(VARIANT) $(archinc)/variant |
78 | $(Q)ln -fsn $(srctree)/$(archinc)/xtensa/config-$(CPU) $(archinc)/xtensa/config | ||
79 | @echo ' SYMLINK $(archinc)/platform -> $(archinc)/platform-$(PLATFORM)' | 76 | @echo ' SYMLINK $(archinc)/platform -> $(archinc)/platform-$(PLATFORM)' |
80 | $(Q)ln -fsn $(srctree)/$(archinc)/platform-$(PLATFORM) $(archinc)/platform | 77 | $(Q)ln -fsn $(srctree)/$(archinc)/platform-$(PLATFORM) $(archinc)/platform |
81 | @touch $@ | 78 | @touch $@ |
@@ -89,7 +86,7 @@ zImage zImage.initrd: vmlinux | |||
89 | $(Q)$(MAKE) $(build)=$(boot) $@ | 86 | $(Q)$(MAKE) $(build)=$(boot) $@ |
90 | 87 | ||
91 | CLEAN_FILES += arch/xtensa/vmlinux.lds \ | 88 | CLEAN_FILES += arch/xtensa/vmlinux.lds \ |
92 | $(archinc)/platform $(archinc)/xtensa/config \ | 89 | $(archinc)/platform $(archinc)/variant \ |
93 | $(archinc)/.platform | 90 | $(archinc)/.platform |
94 | 91 | ||
95 | define archhelp | 92 | define archhelp |
diff --git a/arch/xtensa/boot/boot-elf/bootstrap.S b/arch/xtensa/boot/boot-elf/bootstrap.S index f857fc760aa8..464298bc348b 100644 --- a/arch/xtensa/boot/boot-elf/bootstrap.S +++ b/arch/xtensa/boot/boot-elf/bootstrap.S | |||
@@ -1,7 +1,4 @@ | |||
1 | 1 | ||
2 | #include <xtensa/config/specreg.h> | ||
3 | #include <xtensa/config/core.h> | ||
4 | |||
5 | #include <asm/bootparam.h> | 2 | #include <asm/bootparam.h> |
6 | 3 | ||
7 | 4 | ||
diff --git a/arch/xtensa/boot/boot-redboot/bootstrap.S b/arch/xtensa/boot/boot-redboot/bootstrap.S index ee636b0da81c..84848123e2a8 100644 --- a/arch/xtensa/boot/boot-redboot/bootstrap.S +++ b/arch/xtensa/boot/boot-redboot/bootstrap.S | |||
@@ -1,9 +1,7 @@ | |||
1 | 1 | #include <asm/variant/core.h> | |
2 | #define _ASMLANGUAGE | 2 | #include <asm/regs.h> |
3 | #include <xtensa/config/specreg.h> | 3 | #include <asm/asmmacro.h> |
4 | #include <xtensa/config/core.h> | 4 | #include <asm/cacheasm.h> |
5 | #include <xtensa/cacheasm.h> | ||
6 | |||
7 | /* | 5 | /* |
8 | * RB-Data: RedBoot data/bss | 6 | * RB-Data: RedBoot data/bss |
9 | * P: Boot-Parameters | 7 | * P: Boot-Parameters |
@@ -77,8 +75,14 @@ _start: | |||
77 | /* Note: The assembler cannot relax "addi a0, a0, ..." to an | 75 | /* Note: The assembler cannot relax "addi a0, a0, ..." to an |
78 | l32r, so we load to a4 first. */ | 76 | l32r, so we load to a4 first. */ |
79 | 77 | ||
80 | addi a4, a0, __start - __start_a0 | 78 | # addi a4, a0, __start - __start_a0 |
81 | mov a0, a4 | 79 | # mov a0, a4 |
80 | |||
81 | movi a4, __start | ||
82 | movi a5, __start_a0 | ||
83 | add a4, a0, a4 | ||
84 | sub a0, a4, a5 | ||
85 | |||
82 | movi a4, __start | 86 | movi a4, __start |
83 | movi a5, __reloc_end | 87 | movi a5, __reloc_end |
84 | 88 | ||
@@ -106,9 +110,13 @@ _start: | |||
106 | /* We have to flush and invalidate the caches here before we jump. */ | 110 | /* We have to flush and invalidate the caches here before we jump. */ |
107 | 111 | ||
108 | #if XCHAL_DCACHE_IS_WRITEBACK | 112 | #if XCHAL_DCACHE_IS_WRITEBACK |
109 | dcache_writeback_all a5, a6 | 113 | |
114 | ___flush_dcache_all a5 a6 | ||
115 | |||
110 | #endif | 116 | #endif |
111 | icache_invalidate_all a5, a6 | 117 | |
118 | ___invalidate_icache_all a5 a6 | ||
119 | isync | ||
112 | 120 | ||
113 | movi a11, _reloc | 121 | movi a11, _reloc |
114 | jx a11 | 122 | jx a11 |
@@ -209,9 +217,14 @@ _reloc: | |||
209 | /* jump to the kernel */ | 217 | /* jump to the kernel */ |
210 | 2: | 218 | 2: |
211 | #if XCHAL_DCACHE_IS_WRITEBACK | 219 | #if XCHAL_DCACHE_IS_WRITEBACK |
212 | dcache_writeback_all a5, a6 | 220 | |
221 | ___flush_dcache_all a5 a6 | ||
222 | |||
213 | #endif | 223 | #endif |
214 | icache_invalidate_all a5, a6 | 224 | |
225 | ___invalidate_icache_all a5 a6 | ||
226 | |||
227 | isync | ||
215 | 228 | ||
216 | movi a5, __start | 229 | movi a5, __start |
217 | movi a3, boot_initrd_start | 230 | movi a3, boot_initrd_start |
diff --git a/arch/xtensa/configs/iss_defconfig b/arch/xtensa/configs/iss_defconfig index 802621dd4867..f19854035e61 100644 --- a/arch/xtensa/configs/iss_defconfig +++ b/arch/xtensa/configs/iss_defconfig | |||
@@ -53,11 +53,7 @@ CONFIG_CC_ALIGN_JUMPS=0 | |||
53 | # | 53 | # |
54 | # Processor type and features | 54 | # Processor type and features |
55 | # | 55 | # |
56 | CONFIG_XTENSA_ARCH_LINUX_BE=y | 56 | CONFIG_XTENSA_VARIANT_FSF=y |
57 | # CONFIG_XTENSA_ARCH_LINUX_LE is not set | ||
58 | # CONFIG_XTENSA_ARCH_LINUX_TEST is not set | ||
59 | # CONFIG_XTENSA_ARCH_S5 is not set | ||
60 | # CONFIG_XTENSA_CUSTOM is not set | ||
61 | CONFIG_MMU=y | 57 | CONFIG_MMU=y |
62 | # CONFIG_XTENSA_UNALIGNED_USER is not set | 58 | # CONFIG_XTENSA_UNALIGNED_USER is not set |
63 | # CONFIG_PREEMPT is not set | 59 | # CONFIG_PREEMPT is not set |
diff --git a/arch/xtensa/kernel/align.S b/arch/xtensa/kernel/align.S index a4956578a24d..33d6e9d2e83c 100644 --- a/arch/xtensa/kernel/align.S +++ b/arch/xtensa/kernel/align.S | |||
@@ -16,14 +16,9 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <linux/linkage.h> | 18 | #include <linux/linkage.h> |
19 | #include <asm/ptrace.h> | ||
20 | #include <asm/ptrace.h> | ||
21 | #include <asm/current.h> | 19 | #include <asm/current.h> |
22 | #include <asm/asm-offsets.h> | 20 | #include <asm/asm-offsets.h> |
23 | #include <asm/pgtable.h> | ||
24 | #include <asm/processor.h> | 21 | #include <asm/processor.h> |
25 | #include <asm/page.h> | ||
26 | #include <asm/thread_info.h> | ||
27 | 22 | ||
28 | #if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION | 23 | #if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION |
29 | 24 | ||
@@ -216,7 +211,7 @@ ENTRY(fast_unaligned) | |||
216 | 211 | ||
217 | extui a5, a4, INSN_OP0, 4 # get insn.op0 nibble | 212 | extui a5, a4, INSN_OP0, 4 # get insn.op0 nibble |
218 | 213 | ||
219 | #if XCHAL_HAVE_NARROW | 214 | #if XCHAL_HAVE_DENSITY |
220 | _beqi a5, OP0_L32I_N, .Lload # L32I.N, jump | 215 | _beqi a5, OP0_L32I_N, .Lload # L32I.N, jump |
221 | addi a6, a5, -OP0_S32I_N | 216 | addi a6, a5, -OP0_S32I_N |
222 | _beqz a6, .Lstore # S32I.N, do a store | 217 | _beqz a6, .Lstore # S32I.N, do a store |
@@ -251,7 +246,7 @@ ENTRY(fast_unaligned) | |||
251 | #endif | 246 | #endif |
252 | __src_b a3, a5, a6 # a3 has the data word | 247 | __src_b a3, a5, a6 # a3 has the data word |
253 | 248 | ||
254 | #if XCHAL_HAVE_NARROW | 249 | #if XCHAL_HAVE_DENSITY |
255 | addi a7, a7, 2 # increment PC (assume 16-bit insn) | 250 | addi a7, a7, 2 # increment PC (assume 16-bit insn) |
256 | 251 | ||
257 | extui a5, a4, INSN_OP0, 4 | 252 | extui a5, a4, INSN_OP0, 4 |
@@ -279,14 +274,14 @@ ENTRY(fast_unaligned) | |||
279 | 274 | ||
280 | 1: | 275 | 1: |
281 | 276 | ||
282 | #if XCHAL_HAVE_LOOP | 277 | #if XCHAL_HAVE_LOOPS |
283 | rsr a3, LEND # check if we reached LEND | 278 | rsr a5, LEND # check if we reached LEND |
284 | bne a7, a3, 1f | 279 | bne a7, a5, 1f |
285 | rsr a3, LCOUNT # and LCOUNT != 0 | 280 | rsr a5, LCOUNT # and LCOUNT != 0 |
286 | beqz a3, 1f | 281 | beqz a5, 1f |
287 | addi a3, a3, -1 # decrement LCOUNT and set | 282 | addi a5, a5, -1 # decrement LCOUNT and set |
288 | rsr a7, LBEG # set PC to LBEGIN | 283 | rsr a7, LBEG # set PC to LBEGIN |
289 | wsr a3, LCOUNT | 284 | wsr a5, LCOUNT |
290 | #endif | 285 | #endif |
291 | 286 | ||
292 | 1: wsr a7, EPC_1 # skip load instruction | 287 | 1: wsr a7, EPC_1 # skip load instruction |
@@ -336,7 +331,7 @@ ENTRY(fast_unaligned) | |||
336 | 331 | ||
337 | movi a6, 0 # mask: ffffffff:00000000 | 332 | movi a6, 0 # mask: ffffffff:00000000 |
338 | 333 | ||
339 | #if XCHAL_HAVE_NARROW | 334 | #if XCHAL_HAVE_DENSITY |
340 | addi a7, a7, 2 # incr. PC,assume 16-bit instruction | 335 | addi a7, a7, 2 # incr. PC,assume 16-bit instruction |
341 | 336 | ||
342 | extui a5, a4, INSN_OP0, 4 # extract OP0 | 337 | extui a5, a4, INSN_OP0, 4 # extract OP0 |
@@ -359,14 +354,14 @@ ENTRY(fast_unaligned) | |||
359 | /* Get memory address */ | 354 | /* Get memory address */ |
360 | 355 | ||
361 | 1: | 356 | 1: |
362 | #if XCHAL_HAVE_LOOP | 357 | #if XCHAL_HAVE_LOOPS |
363 | rsr a3, LEND # check if we reached LEND | 358 | rsr a4, LEND # check if we reached LEND |
364 | bne a7, a3, 1f | 359 | bne a7, a4, 1f |
365 | rsr a3, LCOUNT # and LCOUNT != 0 | 360 | rsr a4, LCOUNT # and LCOUNT != 0 |
366 | beqz a3, 1f | 361 | beqz a4, 1f |
367 | addi a3, a3, -1 # decrement LCOUNT and set | 362 | addi a4, a4, -1 # decrement LCOUNT and set |
368 | rsr a7, LBEG # set PC to LBEGIN | 363 | rsr a7, LBEG # set PC to LBEGIN |
369 | wsr a3, LCOUNT | 364 | wsr a4, LCOUNT |
370 | #endif | 365 | #endif |
371 | 366 | ||
372 | 1: wsr a7, EPC_1 # skip store instruction | 367 | 1: wsr a7, EPC_1 # skip store instruction |
@@ -416,6 +411,7 @@ ENTRY(fast_unaligned) | |||
416 | 411 | ||
417 | /* Restore working register */ | 412 | /* Restore working register */ |
418 | 413 | ||
414 | l32i a8, a2, PT_AREG8 | ||
419 | l32i a7, a2, PT_AREG7 | 415 | l32i a7, a2, PT_AREG7 |
420 | l32i a6, a2, PT_AREG6 | 416 | l32i a6, a2, PT_AREG6 |
421 | l32i a5, a2, PT_AREG5 | 417 | l32i a5, a2, PT_AREG5 |
@@ -446,7 +442,7 @@ ENTRY(fast_unaligned) | |||
446 | mov a1, a2 | 442 | mov a1, a2 |
447 | 443 | ||
448 | rsr a0, PS | 444 | rsr a0, PS |
449 | bbsi.l a2, PS_UM_SHIFT, 1f # jump if user mode | 445 | bbsi.l a2, PS_UM_BIT, 1f # jump if user mode |
450 | 446 | ||
451 | movi a0, _kernel_exception | 447 | movi a0, _kernel_exception |
452 | jx a0 | 448 | jx a0 |
diff --git a/arch/xtensa/kernel/coprocessor.S b/arch/xtensa/kernel/coprocessor.S index cf5a93fb6a2e..01bcb9fcfcbd 100644 --- a/arch/xtensa/kernel/coprocessor.S +++ b/arch/xtensa/kernel/coprocessor.S | |||
@@ -90,7 +90,6 @@ ENTRY(enable_coprocessor) | |||
90 | rsync | 90 | rsync |
91 | retw | 91 | retw |
92 | 92 | ||
93 | #endif | ||
94 | 93 | ||
95 | ENTRY(save_coprocessor_extra) | 94 | ENTRY(save_coprocessor_extra) |
96 | entry sp, 16 | 95 | entry sp, 16 |
@@ -197,4 +196,5 @@ _xtensa_reginfo_tables: | |||
197 | XCHAL_CP7_SA_CONTENTS_LIBDB | 196 | XCHAL_CP7_SA_CONTENTS_LIBDB |
198 | .word 0xFC000000 /* invalid register number,marks end of table*/ | 197 | .word 0xFC000000 /* invalid register number,marks end of table*/ |
199 | _xtensa_reginfo_table_end: | 198 | _xtensa_reginfo_table_end: |
199 | #endif | ||
200 | 200 | ||
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index 89e409e9e0de..c0b56b17927f 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
25 | #include <asm/page.h> | 25 | #include <asm/page.h> |
26 | #include <asm/signal.h> | 26 | #include <asm/signal.h> |
27 | #include <xtensa/coreasm.h> | 27 | #include <asm/tlbflush.h> |
28 | 28 | ||
29 | /* Unimplemented features. */ | 29 | /* Unimplemented features. */ |
30 | 30 | ||
@@ -364,7 +364,7 @@ common_exception: | |||
364 | movi a2, 1 | 364 | movi a2, 1 |
365 | extui a3, a3, 0, 1 # a3 = PS.INTLEVEL[0] | 365 | extui a3, a3, 0, 1 # a3 = PS.INTLEVEL[0] |
366 | moveqz a3, a2, a0 # a3 = 1 iff interrupt exception | 366 | moveqz a3, a2, a0 # a3 = 1 iff interrupt exception |
367 | movi a2, PS_WOE_MASK | 367 | movi a2, 1 << PS_WOE_BIT |
368 | or a3, a3, a2 | 368 | or a3, a3, a2 |
369 | rsr a0, EXCCAUSE | 369 | rsr a0, EXCCAUSE |
370 | xsr a3, PS | 370 | xsr a3, PS |
@@ -399,7 +399,7 @@ common_exception_return: | |||
399 | /* Jump if we are returning from kernel exceptions. */ | 399 | /* Jump if we are returning from kernel exceptions. */ |
400 | 400 | ||
401 | 1: l32i a3, a1, PT_PS | 401 | 1: l32i a3, a1, PT_PS |
402 | _bbsi.l a3, PS_UM_SHIFT, 2f | 402 | _bbsi.l a3, PS_UM_BIT, 2f |
403 | j kernel_exception_exit | 403 | j kernel_exception_exit |
404 | 404 | ||
405 | /* Specific to a user exception exit: | 405 | /* Specific to a user exception exit: |
@@ -422,7 +422,7 @@ common_exception_return: | |||
422 | * (Hint: There is only one user exception frame on stack) | 422 | * (Hint: There is only one user exception frame on stack) |
423 | */ | 423 | */ |
424 | 424 | ||
425 | movi a3, PS_WOE_MASK | 425 | movi a3, 1 << PS_WOE_BIT |
426 | 426 | ||
427 | _bbsi.l a4, TIF_NEED_RESCHED, 3f | 427 | _bbsi.l a4, TIF_NEED_RESCHED, 3f |
428 | _bbci.l a4, TIF_SIGPENDING, 4f | 428 | _bbci.l a4, TIF_SIGPENDING, 4f |
@@ -694,7 +694,7 @@ common_exception_exit: | |||
694 | ENTRY(debug_exception) | 694 | ENTRY(debug_exception) |
695 | 695 | ||
696 | rsr a0, EPS + XCHAL_DEBUGLEVEL | 696 | rsr a0, EPS + XCHAL_DEBUGLEVEL |
697 | bbsi.l a0, PS_EXCM_SHIFT, 1f # exception mode | 697 | bbsi.l a0, PS_EXCM_BIT, 1f # exception mode |
698 | 698 | ||
699 | /* Set EPC_1 and EXCCAUSE */ | 699 | /* Set EPC_1 and EXCCAUSE */ |
700 | 700 | ||
@@ -707,7 +707,7 @@ ENTRY(debug_exception) | |||
707 | 707 | ||
708 | /* Restore PS to the value before the debug exc but with PS.EXCM set.*/ | 708 | /* Restore PS to the value before the debug exc but with PS.EXCM set.*/ |
709 | 709 | ||
710 | movi a2, 1 << PS_EXCM_SHIFT | 710 | movi a2, 1 << PS_EXCM_BIT |
711 | or a2, a0, a2 | 711 | or a2, a0, a2 |
712 | movi a0, debug_exception # restore a3, debug jump vector | 712 | movi a0, debug_exception # restore a3, debug jump vector |
713 | wsr a2, PS | 713 | wsr a2, PS |
@@ -715,7 +715,7 @@ ENTRY(debug_exception) | |||
715 | 715 | ||
716 | /* Switch to kernel/user stack, restore jump vector, and save a0 */ | 716 | /* Switch to kernel/user stack, restore jump vector, and save a0 */ |
717 | 717 | ||
718 | bbsi.l a2, PS_UM_SHIFT, 2f # jump if user mode | 718 | bbsi.l a2, PS_UM_BIT, 2f # jump if user mode |
719 | 719 | ||
720 | addi a2, a1, -16-PT_SIZE # assume kernel stack | 720 | addi a2, a1, -16-PT_SIZE # assume kernel stack |
721 | s32i a0, a2, PT_AREG0 | 721 | s32i a0, a2, PT_AREG0 |
@@ -778,7 +778,7 @@ ENTRY(unrecoverable_exception) | |||
778 | wsr a1, WINDOWBASE | 778 | wsr a1, WINDOWBASE |
779 | rsync | 779 | rsync |
780 | 780 | ||
781 | movi a1, PS_WOE_MASK | 1 | 781 | movi a1, (1 << PS_WOE_BIT) | 1 |
782 | wsr a1, PS | 782 | wsr a1, PS |
783 | rsync | 783 | rsync |
784 | 784 | ||
@@ -1491,7 +1491,7 @@ ENTRY(_spill_registers) | |||
1491 | */ | 1491 | */ |
1492 | 1492 | ||
1493 | rsr a0, PS | 1493 | rsr a0, PS |
1494 | _bbci.l a0, PS_UM_SHIFT, 1f | 1494 | _bbci.l a0, PS_UM_BIT, 1f |
1495 | 1495 | ||
1496 | /* User space: Setup a dummy frame and kill application. | 1496 | /* User space: Setup a dummy frame and kill application. |
1497 | * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer. | 1497 | * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer. |
@@ -1510,7 +1510,7 @@ ENTRY(_spill_registers) | |||
1510 | l32i a1, a3, EXC_TABLE_KSTK | 1510 | l32i a1, a3, EXC_TABLE_KSTK |
1511 | wsr a3, EXCSAVE_1 | 1511 | wsr a3, EXCSAVE_1 |
1512 | 1512 | ||
1513 | movi a4, PS_WOE_MASK | 1 | 1513 | movi a4, (1 << PS_WOE_BIT) | 1 |
1514 | wsr a4, PS | 1514 | wsr a4, PS |
1515 | rsync | 1515 | rsync |
1516 | 1516 | ||
@@ -1612,7 +1612,7 @@ ENTRY(fast_second_level_miss) | |||
1612 | rsr a1, PTEVADDR | 1612 | rsr a1, PTEVADDR |
1613 | srli a1, a1, PAGE_SHIFT | 1613 | srli a1, a1, PAGE_SHIFT |
1614 | slli a1, a1, PAGE_SHIFT # ptevaddr & PAGE_MASK | 1614 | slli a1, a1, PAGE_SHIFT # ptevaddr & PAGE_MASK |
1615 | addi a1, a1, DTLB_WAY_PGTABLE # ... + way_number | 1615 | addi a1, a1, DTLB_WAY_PGD # ... + way_number |
1616 | 1616 | ||
1617 | wdtlb a0, a1 | 1617 | wdtlb a0, a1 |
1618 | dsync | 1618 | dsync |
@@ -1654,7 +1654,7 @@ ENTRY(fast_second_level_miss) | |||
1654 | mov a1, a2 | 1654 | mov a1, a2 |
1655 | 1655 | ||
1656 | rsr a2, PS | 1656 | rsr a2, PS |
1657 | bbsi.l a2, PS_UM_SHIFT, 1f | 1657 | bbsi.l a2, PS_UM_BIT, 1f |
1658 | j _kernel_exception | 1658 | j _kernel_exception |
1659 | 1: j _user_exception | 1659 | 1: j _user_exception |
1660 | 1660 | ||
@@ -1753,7 +1753,7 @@ ENTRY(fast_store_prohibited) | |||
1753 | mov a1, a2 | 1753 | mov a1, a2 |
1754 | 1754 | ||
1755 | rsr a2, PS | 1755 | rsr a2, PS |
1756 | bbsi.l a2, PS_UM_SHIFT, 1f | 1756 | bbsi.l a2, PS_UM_BIT, 1f |
1757 | j _kernel_exception | 1757 | j _kernel_exception |
1758 | 1: j _user_exception | 1758 | 1: j _user_exception |
1759 | 1759 | ||
@@ -1924,7 +1924,7 @@ ENTRY(_switch_to) | |||
1924 | 1924 | ||
1925 | /* Disable ints while we manipulate the stack pointer; spill regs. */ | 1925 | /* Disable ints while we manipulate the stack pointer; spill regs. */ |
1926 | 1926 | ||
1927 | movi a5, PS_EXCM_MASK | LOCKLEVEL | 1927 | movi a5, (1 << PS_EXCM_BIT) | LOCKLEVEL |
1928 | xsr a5, PS | 1928 | xsr a5, PS |
1929 | rsr a3, EXCSAVE_1 | 1929 | rsr a3, EXCSAVE_1 |
1930 | rsync | 1930 | rsync |
diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S index c07cb2522993..ea89910efa44 100644 --- a/arch/xtensa/kernel/head.S +++ b/arch/xtensa/kernel/head.S | |||
@@ -15,9 +15,9 @@ | |||
15 | * Kevin Chea | 15 | * Kevin Chea |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <xtensa/cacheasm.h> | ||
19 | #include <asm/processor.h> | 18 | #include <asm/processor.h> |
20 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | #include <asm/cacheasm.h> | ||
21 | 21 | ||
22 | /* | 22 | /* |
23 | * This module contains the entry code for kernel images. It performs the | 23 | * This module contains the entry code for kernel images. It performs the |
@@ -32,13 +32,6 @@ | |||
32 | * | 32 | * |
33 | */ | 33 | */ |
34 | 34 | ||
35 | .macro iterate from, to , cmd | ||
36 | .ifeq ((\to - \from) & ~0xfff) | ||
37 | \cmd \from | ||
38 | iterate "(\from+1)", \to, \cmd | ||
39 | .endif | ||
40 | .endm | ||
41 | |||
42 | /* | 35 | /* |
43 | * _start | 36 | * _start |
44 | * | 37 | * |
@@ -64,7 +57,7 @@ _startup: | |||
64 | 57 | ||
65 | /* Disable interrupts and exceptions. */ | 58 | /* Disable interrupts and exceptions. */ |
66 | 59 | ||
67 | movi a0, XCHAL_PS_EXCM_MASK | 60 | movi a0, LOCKLEVEL |
68 | wsr a0, PS | 61 | wsr a0, PS |
69 | 62 | ||
70 | /* Preserve the pointer to the boot parameter list in EXCSAVE_1 */ | 63 | /* Preserve the pointer to the boot parameter list in EXCSAVE_1 */ |
@@ -91,11 +84,11 @@ _startup: | |||
91 | movi a1, 15 | 84 | movi a1, 15 |
92 | wsr a0, ICOUNTLEVEL | 85 | wsr a0, ICOUNTLEVEL |
93 | 86 | ||
94 | .macro reset_dbreak num | 87 | .set _index, 0 |
95 | wsr a0, DBREAKC + \num | 88 | .rept XCHAL_NUM_DBREAK - 1 |
96 | .endm | 89 | wsr a0, DBREAKC + _index |
97 | 90 | .set _index, _index + 1 | |
98 | iterate 0, XCHAL_NUM_IBREAK-1, reset_dbreak | 91 | .endr |
99 | #endif | 92 | #endif |
100 | 93 | ||
101 | /* Clear CCOUNT (not really necessary, but nice) */ | 94 | /* Clear CCOUNT (not really necessary, but nice) */ |
@@ -110,10 +103,11 @@ _startup: | |||
110 | 103 | ||
111 | /* Disable all timers. */ | 104 | /* Disable all timers. */ |
112 | 105 | ||
113 | .macro reset_timer num | 106 | .set _index, 0 |
114 | wsr a0, CCOMPARE_0 + \num | 107 | .rept XCHAL_NUM_TIMERS - 1 |
115 | .endm | 108 | wsr a0, CCOMPARE + _index |
116 | iterate 0, XCHAL_NUM_TIMERS-1, reset_timer | 109 | .set _index, _index + 1 |
110 | .endr | ||
117 | 111 | ||
118 | /* Interrupt initialization. */ | 112 | /* Interrupt initialization. */ |
119 | 113 | ||
@@ -139,12 +133,21 @@ _startup: | |||
139 | rsync | 133 | rsync |
140 | 134 | ||
141 | /* Initialize the caches. | 135 | /* Initialize the caches. |
142 | * Does not include flushing writeback d-cache. | 136 | * a2, a3 are just working registers (clobbered). |
143 | * a6, a7 are just working registers (clobbered). | ||
144 | */ | 137 | */ |
145 | 138 | ||
146 | icache_reset a2, a3 | 139 | #if XCHAL_DCACHE_LINE_LOCKABLE |
147 | dcache_reset a2, a3 | 140 | ___unlock_dcache_all a2 a3 |
141 | #endif | ||
142 | |||
143 | #if XCHAL_ICACHE_LINE_LOCKABLE | ||
144 | ___unlock_icache_all a2 a3 | ||
145 | #endif | ||
146 | |||
147 | ___invalidate_dcache_all a2 a3 | ||
148 | ___invalidate_icache_all a2 a3 | ||
149 | |||
150 | isync | ||
148 | 151 | ||
149 | /* Unpack data sections | 152 | /* Unpack data sections |
150 | * | 153 | * |
@@ -181,9 +184,9 @@ _startup: | |||
181 | movi a2, _bss_start # start of BSS | 184 | movi a2, _bss_start # start of BSS |
182 | movi a3, _bss_end # end of BSS | 185 | movi a3, _bss_end # end of BSS |
183 | 186 | ||
184 | 1: addi a2, a2, 4 | 187 | __loopt a2, a3, a4, 2 |
185 | s32i a0, a2, 0 | 188 | s32i a0, a2, 0 |
186 | blt a2, a3, 1b | 189 | __endla a2, a4, 4 |
187 | 190 | ||
188 | #if XCHAL_DCACHE_IS_WRITEBACK | 191 | #if XCHAL_DCACHE_IS_WRITEBACK |
189 | 192 | ||
@@ -191,7 +194,7 @@ _startup: | |||
191 | * instructions/data are available. | 194 | * instructions/data are available. |
192 | */ | 195 | */ |
193 | 196 | ||
194 | dcache_writeback_all a2, a3 | 197 | ___flush_dcache_all a2 a3 |
195 | #endif | 198 | #endif |
196 | 199 | ||
197 | /* Setup stack and enable window exceptions (keep irqs disabled) */ | 200 | /* Setup stack and enable window exceptions (keep irqs disabled) */ |
diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c index 6648fa9d9192..ca76f071666e 100644 --- a/arch/xtensa/kernel/pci-dma.c +++ b/arch/xtensa/kernel/pci-dma.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * arch/xtensa/kernel/pci-dma.c | 2 | * arch/xtensa/pci-dma.c |
3 | * | 3 | * |
4 | * DMA coherent memory allocation. | 4 | * DMA coherent memory allocation. |
5 | * | 5 | * |
@@ -29,28 +29,48 @@ | |||
29 | */ | 29 | */ |
30 | 30 | ||
31 | void * | 31 | void * |
32 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) | 32 | dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *handle,gfp_t flag) |
33 | { | 33 | { |
34 | void *ret; | 34 | unsigned long ret; |
35 | unsigned long uncached = 0; | ||
35 | 36 | ||
36 | /* ignore region speicifiers */ | 37 | /* ignore region speicifiers */ |
37 | gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); | ||
38 | 38 | ||
39 | if (dev == NULL || (*dev->dma_mask < 0xffffffff)) | 39 | flag &= ~(__GFP_DMA | __GFP_HIGHMEM); |
40 | gfp |= GFP_DMA; | ||
41 | ret = (void *)__get_free_pages(gfp, get_order(size)); | ||
42 | 40 | ||
43 | if (ret != NULL) { | 41 | if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff)) |
44 | memset(ret, 0, size); | 42 | flag |= GFP_DMA; |
45 | *handle = virt_to_bus(ret); | 43 | ret = (unsigned long)__get_free_pages(flag, get_order(size)); |
44 | |||
45 | if (ret == 0) | ||
46 | return NULL; | ||
47 | |||
48 | /* We currently don't support coherent memory outside KSEG */ | ||
49 | |||
50 | if (ret < XCHAL_KSEG_CACHED_VADDR | ||
51 | || ret >= XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE) | ||
52 | BUG(); | ||
53 | |||
54 | |||
55 | if (ret != 0) { | ||
56 | memset((void*) ret, 0, size); | ||
57 | uncached = ret+XCHAL_KSEG_BYPASS_VADDR-XCHAL_KSEG_CACHED_VADDR; | ||
58 | *handle = virt_to_bus((void*)ret); | ||
59 | __flush_invalidate_dcache_range(ret, size); | ||
46 | } | 60 | } |
47 | return (void*) BYPASS_ADDR((unsigned long)ret); | 61 | |
62 | return (void*)uncached; | ||
48 | } | 63 | } |
49 | 64 | ||
50 | void dma_free_coherent(struct device *hwdev, size_t size, | 65 | void dma_free_coherent(struct device *hwdev, size_t size, |
51 | void *vaddr, dma_addr_t dma_handle) | 66 | void *vaddr, dma_addr_t dma_handle) |
52 | { | 67 | { |
53 | free_pages(CACHED_ADDR((unsigned long)vaddr), get_order(size)); | 68 | long addr=(long)vaddr+XCHAL_KSEG_CACHED_VADDR-XCHAL_KSEG_BYPASS_VADDR; |
69 | |||
70 | if (addr < 0 || addr >= XCHAL_KSEG_SIZE) | ||
71 | BUG(); | ||
72 | |||
73 | free_pages(addr, get_order(size)); | ||
54 | } | 74 | } |
55 | 75 | ||
56 | 76 | ||
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c index a7c4178c2a8c..3785f3481d71 100644 --- a/arch/xtensa/kernel/process.c +++ b/arch/xtensa/kernel/process.c | |||
@@ -1,4 +1,3 @@ | |||
1 | // TODO verify coprocessor handling | ||
2 | /* | 1 | /* |
3 | * arch/xtensa/kernel/process.c | 2 | * arch/xtensa/kernel/process.c |
4 | * | 3 | * |
@@ -43,7 +42,7 @@ | |||
43 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
44 | #include <asm/atomic.h> | 43 | #include <asm/atomic.h> |
45 | #include <asm/asm-offsets.h> | 44 | #include <asm/asm-offsets.h> |
46 | #include <asm/coprocessor.h> | 45 | #include <asm/regs.h> |
47 | 46 | ||
48 | extern void ret_from_fork(void); | 47 | extern void ret_from_fork(void); |
49 | 48 | ||
@@ -67,25 +66,6 @@ void (*pm_power_off)(void) = NULL; | |||
67 | EXPORT_SYMBOL(pm_power_off); | 66 | EXPORT_SYMBOL(pm_power_off); |
68 | 67 | ||
69 | 68 | ||
70 | #if XCHAL_CP_NUM > 0 | ||
71 | |||
72 | /* | ||
73 | * Coprocessor ownership. | ||
74 | */ | ||
75 | |||
76 | coprocessor_info_t coprocessor_info[] = { | ||
77 | { 0, XTENSA_CPE_CP0_OFFSET }, | ||
78 | { 0, XTENSA_CPE_CP1_OFFSET }, | ||
79 | { 0, XTENSA_CPE_CP2_OFFSET }, | ||
80 | { 0, XTENSA_CPE_CP3_OFFSET }, | ||
81 | { 0, XTENSA_CPE_CP4_OFFSET }, | ||
82 | { 0, XTENSA_CPE_CP5_OFFSET }, | ||
83 | { 0, XTENSA_CPE_CP6_OFFSET }, | ||
84 | { 0, XTENSA_CPE_CP7_OFFSET }, | ||
85 | }; | ||
86 | |||
87 | #endif | ||
88 | |||
89 | /* | 69 | /* |
90 | * Powermanagement idle function, if any is provided by the platform. | 70 | * Powermanagement idle function, if any is provided by the platform. |
91 | */ | 71 | */ |
@@ -110,12 +90,10 @@ void cpu_idle(void) | |||
110 | 90 | ||
111 | void exit_thread(void) | 91 | void exit_thread(void) |
112 | { | 92 | { |
113 | release_coprocessors(current); /* Empty macro if no CPs are defined */ | ||
114 | } | 93 | } |
115 | 94 | ||
116 | void flush_thread(void) | 95 | void flush_thread(void) |
117 | { | 96 | { |
118 | release_coprocessors(current); /* Empty macro if no CPs are defined */ | ||
119 | } | 97 | } |
120 | 98 | ||
121 | /* | 99 | /* |
@@ -275,7 +253,7 @@ void do_copy_regs (xtensa_gregset_t *elfregs, struct pt_regs *regs, | |||
275 | */ | 253 | */ |
276 | 254 | ||
277 | elfregs->pc = regs->pc; | 255 | elfregs->pc = regs->pc; |
278 | elfregs->ps = (regs->ps & ~XCHAL_PS_EXCM_MASK); | 256 | elfregs->ps = (regs->ps & ~(1 << PS_EXCM_BIT)); |
279 | elfregs->exccause = regs->exccause; | 257 | elfregs->exccause = regs->exccause; |
280 | elfregs->excvaddr = regs->excvaddr; | 258 | elfregs->excvaddr = regs->excvaddr; |
281 | elfregs->windowbase = regs->windowbase; | 259 | elfregs->windowbase = regs->windowbase; |
@@ -325,7 +303,7 @@ void do_restore_regs (xtensa_gregset_t *elfregs, struct pt_regs *regs, | |||
325 | */ | 303 | */ |
326 | 304 | ||
327 | regs->pc = elfregs->pc; | 305 | regs->pc = elfregs->pc; |
328 | regs->ps = (elfregs->ps | XCHAL_PS_EXCM_MASK); | 306 | regs->ps = (elfregs->ps | (1 << PS_EXCM_BIT)); |
329 | regs->exccause = elfregs->exccause; | 307 | regs->exccause = elfregs->exccause; |
330 | regs->excvaddr = elfregs->excvaddr; | 308 | regs->excvaddr = elfregs->excvaddr; |
331 | regs->windowbase = elfregs->windowbase; | 309 | regs->windowbase = elfregs->windowbase; |
@@ -459,16 +437,7 @@ int do_restore_fpregs (elf_fpregset_t *fpregs, struct pt_regs *regs, | |||
459 | int | 437 | int |
460 | dump_task_fpu(struct pt_regs *regs, struct task_struct *task, elf_fpregset_t *r) | 438 | dump_task_fpu(struct pt_regs *regs, struct task_struct *task, elf_fpregset_t *r) |
461 | { | 439 | { |
462 | /* see asm/coprocessor.h for this magic number 16 */ | ||
463 | #if XTENSA_CP_EXTRA_SIZE > 16 | ||
464 | do_save_fpregs (r, regs, task); | ||
465 | |||
466 | /* For now, bit 16 means some extra state may be present: */ | ||
467 | // FIXME!! need to track to return more accurate mask | ||
468 | return 0x10000 | XCHAL_CP_MASK; | ||
469 | #else | ||
470 | return 0; /* no coprocessors active on this processor */ | 440 | return 0; /* no coprocessors active on this processor */ |
471 | #endif | ||
472 | } | 441 | } |
473 | 442 | ||
474 | /* | 443 | /* |
diff --git a/arch/xtensa/kernel/ptrace.c b/arch/xtensa/kernel/ptrace.c index 9aea23cc0dc5..604c3c3c6759 100644 --- a/arch/xtensa/kernel/ptrace.c +++ b/arch/xtensa/kernel/ptrace.c | |||
@@ -96,7 +96,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
96 | /* Note: PS.EXCM is not set while user task is running; | 96 | /* Note: PS.EXCM is not set while user task is running; |
97 | * its being set in regs is for exception handling | 97 | * its being set in regs is for exception handling |
98 | * convenience. */ | 98 | * convenience. */ |
99 | tmp = (regs->ps & ~XCHAL_PS_EXCM_MASK); | 99 | tmp = (regs->ps & ~(1 << PS_EXCM_BIT)); |
100 | break; | 100 | break; |
101 | case REG_WB: | 101 | case REG_WB: |
102 | tmp = regs->windowbase; | 102 | tmp = regs->windowbase; |
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c index c99ab72b41b6..b6374c09de20 100644 --- a/arch/xtensa/kernel/setup.c +++ b/arch/xtensa/kernel/setup.c | |||
@@ -42,8 +42,6 @@ | |||
42 | #include <asm/page.h> | 42 | #include <asm/page.h> |
43 | #include <asm/setup.h> | 43 | #include <asm/setup.h> |
44 | 44 | ||
45 | #include <xtensa/config/system.h> | ||
46 | |||
47 | #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) | 45 | #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) |
48 | struct screen_info screen_info = { 0, 24, 0, 0, 0, 80, 0, 0, 0, 24, 1, 16}; | 46 | struct screen_info screen_info = { 0, 24, 0, 0, 0, 80, 0, 0, 0, 24, 1, 16}; |
49 | #endif | 47 | #endif |
@@ -336,7 +334,7 @@ c_show(struct seq_file *f, void *slot) | |||
336 | /* high-level stuff */ | 334 | /* high-level stuff */ |
337 | seq_printf(f,"processor\t: 0\n" | 335 | seq_printf(f,"processor\t: 0\n" |
338 | "vendor_id\t: Tensilica\n" | 336 | "vendor_id\t: Tensilica\n" |
339 | "model\t\t: Xtensa " XCHAL_HW_RELEASE_NAME "\n" | 337 | "model\t\t: Xtensa " XCHAL_HW_VERSION_NAME "\n" |
340 | "core ID\t\t: " XCHAL_CORE_ID "\n" | 338 | "core ID\t\t: " XCHAL_CORE_ID "\n" |
341 | "build ID\t: 0x%x\n" | 339 | "build ID\t: 0x%x\n" |
342 | "byte order\t: %s\n" | 340 | "byte order\t: %s\n" |
@@ -420,25 +418,6 @@ c_show(struct seq_file *f, void *slot) | |||
420 | XCHAL_NUM_TIMERS, | 418 | XCHAL_NUM_TIMERS, |
421 | XCHAL_DEBUGLEVEL); | 419 | XCHAL_DEBUGLEVEL); |
422 | 420 | ||
423 | /* Coprocessors */ | ||
424 | #if XCHAL_HAVE_CP | ||
425 | seq_printf(f, "coprocessors\t: %d\n", XCHAL_CP_NUM); | ||
426 | #else | ||
427 | seq_printf(f, "coprocessors\t: none\n"); | ||
428 | #endif | ||
429 | |||
430 | /* {I,D}{RAM,ROM} and XLMI */ | ||
431 | seq_printf(f,"inst ROMs\t: %d\n" | ||
432 | "inst RAMs\t: %d\n" | ||
433 | "data ROMs\t: %d\n" | ||
434 | "data RAMs\t: %d\n" | ||
435 | "XLMI ports\t: %d\n", | ||
436 | XCHAL_NUM_IROM, | ||
437 | XCHAL_NUM_IRAM, | ||
438 | XCHAL_NUM_DROM, | ||
439 | XCHAL_NUM_DRAM, | ||
440 | XCHAL_NUM_XLMI); | ||
441 | |||
442 | /* Cache */ | 421 | /* Cache */ |
443 | seq_printf(f,"icache line size: %d\n" | 422 | seq_printf(f,"icache line size: %d\n" |
444 | "icache ways\t: %d\n" | 423 | "icache ways\t: %d\n" |
@@ -466,24 +445,6 @@ c_show(struct seq_file *f, void *slot) | |||
466 | XCHAL_DCACHE_WAYS, | 445 | XCHAL_DCACHE_WAYS, |
467 | XCHAL_DCACHE_SIZE); | 446 | XCHAL_DCACHE_SIZE); |
468 | 447 | ||
469 | /* MMU */ | ||
470 | seq_printf(f,"ASID bits\t: %d\n" | ||
471 | "ASID invalid\t: %d\n" | ||
472 | "ASID kernel\t: %d\n" | ||
473 | "rings\t\t: %d\n" | ||
474 | "itlb ways\t: %d\n" | ||
475 | "itlb AR ways\t: %d\n" | ||
476 | "dtlb ways\t: %d\n" | ||
477 | "dtlb AR ways\t: %d\n", | ||
478 | XCHAL_MMU_ASID_BITS, | ||
479 | XCHAL_MMU_ASID_INVALID, | ||
480 | XCHAL_MMU_ASID_KERNEL, | ||
481 | XCHAL_MMU_RINGS, | ||
482 | XCHAL_ITLB_WAYS, | ||
483 | XCHAL_ITLB_ARF_WAYS, | ||
484 | XCHAL_DTLB_WAYS, | ||
485 | XCHAL_DTLB_ARF_WAYS); | ||
486 | |||
487 | return 0; | 448 | return 0; |
488 | } | 449 | } |
489 | 450 | ||
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index c494f0826fc5..6af7f4145990 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c | |||
@@ -12,8 +12,8 @@ | |||
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <xtensa/config/core.h> | 15 | #include <asm/variant/core.h> |
16 | #include <xtensa/hal.h> | 16 | #include <asm/coprocessor.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
@@ -216,8 +216,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) | |||
216 | * handler, or the user mode value doesn't matter (e.g. PS.OWB). | 216 | * handler, or the user mode value doesn't matter (e.g. PS.OWB). |
217 | */ | 217 | */ |
218 | err |= __get_user(ps, &sc->sc_ps); | 218 | err |= __get_user(ps, &sc->sc_ps); |
219 | regs->ps = (regs->ps & ~XCHAL_PS_CALLINC_MASK) | 219 | regs->ps = (regs->ps & ~PS_CALLINC_MASK) |
220 | | (ps & XCHAL_PS_CALLINC_MASK); | 220 | | (ps & PS_CALLINC_MASK); |
221 | 221 | ||
222 | /* Additional corruption checks */ | 222 | /* Additional corruption checks */ |
223 | 223 | ||
@@ -280,7 +280,7 @@ flush_my_cpstate(struct task_struct *tsk) | |||
280 | static int | 280 | static int |
281 | save_cpextra (struct _cpstate *buf) | 281 | save_cpextra (struct _cpstate *buf) |
282 | { | 282 | { |
283 | #if (XCHAL_EXTRA_SA_SIZE == 0) && (XCHAL_CP_NUM == 0) | 283 | #if XCHAL_CP_NUM == 0 |
284 | return 0; | 284 | return 0; |
285 | #else | 285 | #else |
286 | 286 | ||
@@ -497,8 +497,10 @@ gen_return_code(unsigned char *codemem, unsigned int use_rt_sigreturn) | |||
497 | 497 | ||
498 | /* Flush generated code out of the data cache */ | 498 | /* Flush generated code out of the data cache */ |
499 | 499 | ||
500 | if (err == 0) | 500 | if (err == 0) { |
501 | __flush_invalidate_cache_range((unsigned long)codemem, 6UL); | 501 | __invalidate_icache_range((unsigned long)codemem, 6UL); |
502 | __flush_invalidate_dcache_range((unsigned long)codemem, 6UL); | ||
503 | } | ||
502 | 504 | ||
503 | return err; | 505 | return err; |
504 | } | 506 | } |
diff --git a/arch/xtensa/kernel/syscalls.c b/arch/xtensa/kernel/syscalls.c index f49cb239e603..f9a5a752ca69 100644 --- a/arch/xtensa/kernel/syscalls.c +++ b/arch/xtensa/kernel/syscalls.c | |||
@@ -175,8 +175,8 @@ void system_call (struct pt_regs *regs) | |||
175 | * interrupts in the first place: | 175 | * interrupts in the first place: |
176 | */ | 176 | */ |
177 | local_save_flags (ps); | 177 | local_save_flags (ps); |
178 | local_irq_restore((ps & ~XCHAL_PS_INTLEVEL_MASK) | | 178 | local_irq_restore((ps & ~PS_INTLEVEL_MASK) | |
179 | (regs->ps & XCHAL_PS_INTLEVEL_MASK) ); | 179 | (regs->ps & PS_INTLEVEL_MASK) ); |
180 | 180 | ||
181 | if (syscallnr > __NR_Linux_syscalls) { | 181 | if (syscallnr > __NR_Linux_syscalls) { |
182 | regs->areg[2] = -ENOSYS; | 182 | regs->areg[2] = -ENOSYS; |
diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c index ce077d6bf3a0..693ab268485e 100644 --- a/arch/xtensa/kernel/traps.c +++ b/arch/xtensa/kernel/traps.c | |||
@@ -75,7 +75,7 @@ extern void system_call (struct pt_regs*); | |||
75 | #define USER 0x02 | 75 | #define USER 0x02 |
76 | 76 | ||
77 | #define COPROCESSOR(x) \ | 77 | #define COPROCESSOR(x) \ |
78 | { XCHAL_EXCCAUSE_COPROCESSOR ## x ## _DISABLED, USER, fast_coprocessor } | 78 | { EXCCAUSE_COPROCESSOR ## x ## _DISABLED, USER, fast_coprocessor } |
79 | 79 | ||
80 | typedef struct { | 80 | typedef struct { |
81 | int cause; | 81 | int cause; |
@@ -85,38 +85,38 @@ typedef struct { | |||
85 | 85 | ||
86 | dispatch_init_table_t __init dispatch_init_table[] = { | 86 | dispatch_init_table_t __init dispatch_init_table[] = { |
87 | 87 | ||
88 | { XCHAL_EXCCAUSE_ILLEGAL_INSTRUCTION, 0, do_illegal_instruction}, | 88 | { EXCCAUSE_ILLEGAL_INSTRUCTION, 0, do_illegal_instruction}, |
89 | { XCHAL_EXCCAUSE_SYSTEM_CALL, KRNL, fast_syscall_kernel }, | 89 | { EXCCAUSE_SYSTEM_CALL, KRNL, fast_syscall_kernel }, |
90 | { XCHAL_EXCCAUSE_SYSTEM_CALL, USER, fast_syscall_user }, | 90 | { EXCCAUSE_SYSTEM_CALL, USER, fast_syscall_user }, |
91 | { XCHAL_EXCCAUSE_SYSTEM_CALL, 0, system_call }, | 91 | { EXCCAUSE_SYSTEM_CALL, 0, system_call }, |
92 | /* XCHAL_EXCCAUSE_INSTRUCTION_FETCH unhandled */ | 92 | /* EXCCAUSE_INSTRUCTION_FETCH unhandled */ |
93 | /* XCHAL_EXCCAUSE_LOAD_STORE_ERROR unhandled*/ | 93 | /* EXCCAUSE_LOAD_STORE_ERROR unhandled*/ |
94 | { XCHAL_EXCCAUSE_LEVEL1_INTERRUPT, 0, do_interrupt }, | 94 | { EXCCAUSE_LEVEL1_INTERRUPT, 0, do_interrupt }, |
95 | { XCHAL_EXCCAUSE_ALLOCA, USER|KRNL, fast_alloca }, | 95 | { EXCCAUSE_ALLOCA, USER|KRNL, fast_alloca }, |
96 | /* XCHAL_EXCCAUSE_INTEGER_DIVIDE_BY_ZERO unhandled */ | 96 | /* EXCCAUSE_INTEGER_DIVIDE_BY_ZERO unhandled */ |
97 | /* XCHAL_EXCCAUSE_PRIVILEGED unhandled */ | 97 | /* EXCCAUSE_PRIVILEGED unhandled */ |
98 | #if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION | 98 | #if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION |
99 | #ifdef CONFIG_UNALIGNED_USER | 99 | #ifdef CONFIG_UNALIGNED_USER |
100 | { XCHAL_EXCCAUSE_UNALIGNED, USER, fast_unaligned }, | 100 | { EXCCAUSE_UNALIGNED, USER, fast_unaligned }, |
101 | #else | 101 | #else |
102 | { XCHAL_EXCCAUSE_UNALIGNED, 0, do_unaligned_user }, | 102 | { EXCCAUSE_UNALIGNED, 0, do_unaligned_user }, |
103 | #endif | 103 | #endif |
104 | { XCHAL_EXCCAUSE_UNALIGNED, KRNL, fast_unaligned }, | 104 | { EXCCAUSE_UNALIGNED, KRNL, fast_unaligned }, |
105 | #endif | 105 | #endif |
106 | { XCHAL_EXCCAUSE_ITLB_MISS, 0, do_page_fault }, | 106 | { EXCCAUSE_ITLB_MISS, 0, do_page_fault }, |
107 | { XCHAL_EXCCAUSE_ITLB_MISS, USER|KRNL, fast_second_level_miss}, | 107 | { EXCCAUSE_ITLB_MISS, USER|KRNL, fast_second_level_miss}, |
108 | { XCHAL_EXCCAUSE_ITLB_MULTIHIT, 0, do_multihit }, | 108 | { EXCCAUSE_ITLB_MULTIHIT, 0, do_multihit }, |
109 | { XCHAL_EXCCAUSE_ITLB_PRIVILEGE, 0, do_page_fault }, | 109 | { EXCCAUSE_ITLB_PRIVILEGE, 0, do_page_fault }, |
110 | /* XCHAL_EXCCAUSE_SIZE_RESTRICTION unhandled */ | 110 | /* EXCCAUSE_SIZE_RESTRICTION unhandled */ |
111 | { XCHAL_EXCCAUSE_FETCH_CACHE_ATTRIBUTE, 0, do_page_fault }, | 111 | { EXCCAUSE_FETCH_CACHE_ATTRIBUTE, 0, do_page_fault }, |
112 | { XCHAL_EXCCAUSE_DTLB_MISS, USER|KRNL, fast_second_level_miss}, | 112 | { EXCCAUSE_DTLB_MISS, USER|KRNL, fast_second_level_miss}, |
113 | { XCHAL_EXCCAUSE_DTLB_MISS, 0, do_page_fault }, | 113 | { EXCCAUSE_DTLB_MISS, 0, do_page_fault }, |
114 | { XCHAL_EXCCAUSE_DTLB_MULTIHIT, 0, do_multihit }, | 114 | { EXCCAUSE_DTLB_MULTIHIT, 0, do_multihit }, |
115 | { XCHAL_EXCCAUSE_DTLB_PRIVILEGE, 0, do_page_fault }, | 115 | { EXCCAUSE_DTLB_PRIVILEGE, 0, do_page_fault }, |
116 | /* XCHAL_EXCCAUSE_DTLB_SIZE_RESTRICTION unhandled */ | 116 | /* EXCCAUSE_DTLB_SIZE_RESTRICTION unhandled */ |
117 | { XCHAL_EXCCAUSE_STORE_CACHE_ATTRIBUTE, USER|KRNL, fast_store_prohibited }, | 117 | { EXCCAUSE_STORE_CACHE_ATTRIBUTE, USER|KRNL, fast_store_prohibited }, |
118 | { XCHAL_EXCCAUSE_STORE_CACHE_ATTRIBUTE, 0, do_page_fault }, | 118 | { EXCCAUSE_STORE_CACHE_ATTRIBUTE, 0, do_page_fault }, |
119 | { XCHAL_EXCCAUSE_LOAD_CACHE_ATTRIBUTE, 0, do_page_fault }, | 119 | { EXCCAUSE_LOAD_CACHE_ATTRIBUTE, 0, do_page_fault }, |
120 | /* XCCHAL_EXCCAUSE_FLOATING_POINT unhandled */ | 120 | /* XCCHAL_EXCCAUSE_FLOATING_POINT unhandled */ |
121 | #if (XCHAL_CP_MASK & 1) | 121 | #if (XCHAL_CP_MASK & 1) |
122 | COPROCESSOR(0), | 122 | COPROCESSOR(0), |
diff --git a/arch/xtensa/kernel/vectors.S b/arch/xtensa/kernel/vectors.S index 0e74397bfa2b..eb2d7bb69ee0 100644 --- a/arch/xtensa/kernel/vectors.S +++ b/arch/xtensa/kernel/vectors.S | |||
@@ -53,6 +53,8 @@ | |||
53 | #include <asm/thread_info.h> | 53 | #include <asm/thread_info.h> |
54 | #include <asm/processor.h> | 54 | #include <asm/processor.h> |
55 | 55 | ||
56 | #define WINDOW_VECTORS_SIZE 0x180 | ||
57 | |||
56 | 58 | ||
57 | /* | 59 | /* |
58 | * User exception vector. (Exceptions with PS.UM == 1, PS.EXCM == 0) | 60 | * User exception vector. (Exceptions with PS.UM == 1, PS.EXCM == 0) |
@@ -210,7 +212,7 @@ ENTRY(_DoubleExceptionVector) | |||
210 | /* Check for kernel double exception (usually fatal). */ | 212 | /* Check for kernel double exception (usually fatal). */ |
211 | 213 | ||
212 | rsr a3, PS | 214 | rsr a3, PS |
213 | _bbci.l a3, PS_UM_SHIFT, .Lksp | 215 | _bbci.l a3, PS_UM_BIT, .Lksp |
214 | 216 | ||
215 | /* Check if we are currently handling a window exception. */ | 217 | /* Check if we are currently handling a window exception. */ |
216 | /* Note: We don't need to indicate that we enter a critical section. */ | 218 | /* Note: We don't need to indicate that we enter a critical section. */ |
@@ -219,7 +221,7 @@ ENTRY(_DoubleExceptionVector) | |||
219 | 221 | ||
220 | movi a3, XCHAL_WINDOW_VECTORS_VADDR | 222 | movi a3, XCHAL_WINDOW_VECTORS_VADDR |
221 | _bltu a0, a3, .Lfixup | 223 | _bltu a0, a3, .Lfixup |
222 | addi a3, a3, XSHAL_WINDOW_VECTORS_SIZE | 224 | addi a3, a3, WINDOW_VECTORS_SIZE |
223 | _bgeu a0, a3, .Lfixup | 225 | _bgeu a0, a3, .Lfixup |
224 | 226 | ||
225 | /* Window overflow/underflow exception. Get stack pointer. */ | 227 | /* Window overflow/underflow exception. Get stack pointer. */ |
@@ -245,7 +247,7 @@ ENTRY(_DoubleExceptionVector) | |||
245 | 247 | ||
246 | wsr a2, DEPC # save stack pointer temporarily | 248 | wsr a2, DEPC # save stack pointer temporarily |
247 | rsr a0, PS | 249 | rsr a0, PS |
248 | extui a0, a0, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS | 250 | extui a0, a0, PS_OWB_SHIFT, 4 |
249 | wsr a0, WINDOWBASE | 251 | wsr a0, WINDOWBASE |
250 | rsync | 252 | rsync |
251 | 253 | ||
@@ -312,8 +314,8 @@ ENTRY(_DoubleExceptionVector) | |||
312 | .Lksp: /* a0: a0, a1: a1, a2: a2, a3: trashed, depc: depc, excsave: a3 */ | 314 | .Lksp: /* a0: a0, a1: a1, a2: a2, a3: trashed, depc: depc, excsave: a3 */ |
313 | 315 | ||
314 | rsr a3, EXCCAUSE | 316 | rsr a3, EXCCAUSE |
315 | beqi a3, XCHAL_EXCCAUSE_ITLB_MISS, 1f | 317 | beqi a3, EXCCAUSE_ITLB_MISS, 1f |
316 | addi a3, a3, -XCHAL_EXCCAUSE_DTLB_MISS | 318 | addi a3, a3, -EXCCAUSE_DTLB_MISS |
317 | bnez a3, .Lunrecoverable | 319 | bnez a3, .Lunrecoverable |
318 | 1: movi a3, fast_second_level_miss_double_kernel | 320 | 1: movi a3, fast_second_level_miss_double_kernel |
319 | jx a3 | 321 | jx a3 |
diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S index e01131fec69e..a36c104c3a52 100644 --- a/arch/xtensa/kernel/vmlinux.lds.S +++ b/arch/xtensa/kernel/vmlinux.lds.S | |||
@@ -16,20 +16,17 @@ | |||
16 | 16 | ||
17 | #include <asm-generic/vmlinux.lds.h> | 17 | #include <asm-generic/vmlinux.lds.h> |
18 | 18 | ||
19 | #define _NOCLANGUAGE | 19 | #include <asm/variant/core.h> |
20 | #undef __ASSEMBLER__ | ||
21 | #include <xtensa/config/core.h> | ||
22 | #include <xtensa/config/system.h> | ||
23 | OUTPUT_ARCH(xtensa) | 20 | OUTPUT_ARCH(xtensa) |
24 | ENTRY(_start) | 21 | ENTRY(_start) |
25 | 22 | ||
26 | #if XCHAL_MEMORY_ORDER == XTHAL_BIGENDIAN | 23 | #ifdef __XTENSA_EB__ |
27 | jiffies = jiffies_64 + 4; | 24 | jiffies = jiffies_64 + 4; |
28 | #else | 25 | #else |
29 | jiffies = jiffies_64; | 26 | jiffies = jiffies_64; |
30 | #endif | 27 | #endif |
31 | 28 | ||
32 | #define KERNELOFFSET 0x1000 | 29 | #define KERNELOFFSET 0xd0001000 |
33 | 30 | ||
34 | /* Note: In the following macros, it would be nice to specify only the | 31 | /* Note: In the following macros, it would be nice to specify only the |
35 | vector name and section kind and construct "sym" and "section" using | 32 | vector name and section kind and construct "sym" and "section" using |
@@ -76,7 +73,7 @@ jiffies = jiffies_64; | |||
76 | 73 | ||
77 | SECTIONS | 74 | SECTIONS |
78 | { | 75 | { |
79 | . = XCHAL_KSEG_CACHED_VADDR + KERNELOFFSET; | 76 | . = KERNELOFFSET; |
80 | /* .text section */ | 77 | /* .text section */ |
81 | 78 | ||
82 | _text = .; | 79 | _text = .; |
@@ -160,7 +157,7 @@ SECTIONS | |||
160 | 157 | ||
161 | /* Initialization code and data: */ | 158 | /* Initialization code and data: */ |
162 | 159 | ||
163 | . = ALIGN(1<<XCHAL_MMU_MIN_PTE_PAGE_SIZE); | 160 | . = ALIGN(1 << 12); |
164 | __init_begin = .; | 161 | __init_begin = .; |
165 | .init.text : { | 162 | .init.text : { |
166 | _sinittext = .; | 163 | _sinittext = .; |
@@ -224,32 +221,32 @@ SECTIONS | |||
224 | .dummy) | 221 | .dummy) |
225 | SECTION_VECTOR (_DebugInterruptVector_literal, | 222 | SECTION_VECTOR (_DebugInterruptVector_literal, |
226 | .DebugInterruptVector.literal, | 223 | .DebugInterruptVector.literal, |
227 | XCHAL_INTLEVEL_VECTOR_VADDR(XCHAL_DEBUGLEVEL) - 4, | 224 | XCHAL_DEBUG_VECTOR_VADDR - 4, |
228 | SIZEOF(.WindowVectors.text), | 225 | SIZEOF(.WindowVectors.text), |
229 | .WindowVectors.text) | 226 | .WindowVectors.text) |
230 | SECTION_VECTOR (_DebugInterruptVector_text, | 227 | SECTION_VECTOR (_DebugInterruptVector_text, |
231 | .DebugInterruptVector.text, | 228 | .DebugInterruptVector.text, |
232 | XCHAL_INTLEVEL_VECTOR_VADDR(XCHAL_DEBUGLEVEL), | 229 | XCHAL_DEBUG_VECTOR_VADDR, |
233 | 4, | 230 | 4, |
234 | .DebugInterruptVector.literal) | 231 | .DebugInterruptVector.literal) |
235 | SECTION_VECTOR (_KernelExceptionVector_literal, | 232 | SECTION_VECTOR (_KernelExceptionVector_literal, |
236 | .KernelExceptionVector.literal, | 233 | .KernelExceptionVector.literal, |
237 | XCHAL_KERNELEXC_VECTOR_VADDR - 4, | 234 | XCHAL_KERNEL_VECTOR_VADDR - 4, |
238 | SIZEOF(.DebugInterruptVector.text), | 235 | SIZEOF(.DebugInterruptVector.text), |
239 | .DebugInterruptVector.text) | 236 | .DebugInterruptVector.text) |
240 | SECTION_VECTOR (_KernelExceptionVector_text, | 237 | SECTION_VECTOR (_KernelExceptionVector_text, |
241 | .KernelExceptionVector.text, | 238 | .KernelExceptionVector.text, |
242 | XCHAL_KERNELEXC_VECTOR_VADDR, | 239 | XCHAL_KERNEL_VECTOR_VADDR, |
243 | 4, | 240 | 4, |
244 | .KernelExceptionVector.literal) | 241 | .KernelExceptionVector.literal) |
245 | SECTION_VECTOR (_UserExceptionVector_literal, | 242 | SECTION_VECTOR (_UserExceptionVector_literal, |
246 | .UserExceptionVector.literal, | 243 | .UserExceptionVector.literal, |
247 | XCHAL_USEREXC_VECTOR_VADDR - 4, | 244 | XCHAL_USER_VECTOR_VADDR - 4, |
248 | SIZEOF(.KernelExceptionVector.text), | 245 | SIZEOF(.KernelExceptionVector.text), |
249 | .KernelExceptionVector.text) | 246 | .KernelExceptionVector.text) |
250 | SECTION_VECTOR (_UserExceptionVector_text, | 247 | SECTION_VECTOR (_UserExceptionVector_text, |
251 | .UserExceptionVector.text, | 248 | .UserExceptionVector.text, |
252 | XCHAL_USEREXC_VECTOR_VADDR, | 249 | XCHAL_USER_VECTOR_VADDR, |
253 | 4, | 250 | 4, |
254 | .UserExceptionVector.literal) | 251 | .UserExceptionVector.literal) |
255 | SECTION_VECTOR (_DoubleExceptionVector_literal, | 252 | SECTION_VECTOR (_DoubleExceptionVector_literal, |
@@ -264,7 +261,7 @@ SECTIONS | |||
264 | .DoubleExceptionVector.literal) | 261 | .DoubleExceptionVector.literal) |
265 | 262 | ||
266 | . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3; | 263 | . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3; |
267 | . = ALIGN(1<<XCHAL_MMU_MIN_PTE_PAGE_SIZE); | 264 | . = ALIGN(1 << 12); |
268 | 265 | ||
269 | __init_end = .; | 266 | __init_end = .; |
270 | 267 | ||
diff --git a/arch/xtensa/lib/checksum.S b/arch/xtensa/lib/checksum.S index e2d64dfd530c..9d9cd990afa6 100644 --- a/arch/xtensa/lib/checksum.S +++ b/arch/xtensa/lib/checksum.S | |||
@@ -16,8 +16,7 @@ | |||
16 | 16 | ||
17 | #include <asm/errno.h> | 17 | #include <asm/errno.h> |
18 | #include <linux/linkage.h> | 18 | #include <linux/linkage.h> |
19 | #define _ASMLANGUAGE | 19 | #include <asm/variant/core.h> |
20 | #include <xtensa/config/core.h> | ||
21 | 20 | ||
22 | /* | 21 | /* |
23 | * computes a partial checksum, e.g. for TCP/UDP fragments | 22 | * computes a partial checksum, e.g. for TCP/UDP fragments |
diff --git a/arch/xtensa/lib/memcopy.S b/arch/xtensa/lib/memcopy.S index e8f6d7eb7222..ddda8f4bc862 100644 --- a/arch/xtensa/lib/memcopy.S +++ b/arch/xtensa/lib/memcopy.S | |||
@@ -9,7 +9,7 @@ | |||
9 | * Copyright (C) 2002 - 2005 Tensilica Inc. | 9 | * Copyright (C) 2002 - 2005 Tensilica Inc. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <xtensa/coreasm.h> | 12 | #include <asm/variant/core.h> |
13 | 13 | ||
14 | .macro src_b r, w0, w1 | 14 | .macro src_b r, w0, w1 |
15 | #ifdef __XTENSA_EB__ | 15 | #ifdef __XTENSA_EB__ |
diff --git a/arch/xtensa/lib/memset.S b/arch/xtensa/lib/memset.S index 4de25134bc62..56a17495b2db 100644 --- a/arch/xtensa/lib/memset.S +++ b/arch/xtensa/lib/memset.S | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright (C) 2002 Tensilica Inc. | 11 | * Copyright (C) 2002 Tensilica Inc. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <xtensa/coreasm.h> | 14 | #include <asm/variant/core.h> |
15 | 15 | ||
16 | /* | 16 | /* |
17 | * void *memset(void *dst, int c, size_t length) | 17 | * void *memset(void *dst, int c, size_t length) |
diff --git a/arch/xtensa/lib/strncpy_user.S b/arch/xtensa/lib/strncpy_user.S index 71d55df43893..a834057bda6b 100644 --- a/arch/xtensa/lib/strncpy_user.S +++ b/arch/xtensa/lib/strncpy_user.S | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright (C) 2002 Tensilica Inc. | 11 | * Copyright (C) 2002 Tensilica Inc. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <xtensa/coreasm.h> | 14 | #include <asm/variant/core.h> |
15 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
16 | 16 | ||
17 | /* Load or store instructions that may cause exceptions use the EX macro. */ | 17 | /* Load or store instructions that may cause exceptions use the EX macro. */ |
diff --git a/arch/xtensa/lib/strnlen_user.S b/arch/xtensa/lib/strnlen_user.S index cdff4d670f3b..5e9c1e709b2e 100644 --- a/arch/xtensa/lib/strnlen_user.S +++ b/arch/xtensa/lib/strnlen_user.S | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright (C) 2002 Tensilica Inc. | 11 | * Copyright (C) 2002 Tensilica Inc. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <xtensa/coreasm.h> | 14 | #include <asm/variant/core.h> |
15 | 15 | ||
16 | /* Load or store instructions that may cause exceptions use the EX macro. */ | 16 | /* Load or store instructions that may cause exceptions use the EX macro. */ |
17 | 17 | ||
diff --git a/arch/xtensa/lib/usercopy.S b/arch/xtensa/lib/usercopy.S index 4641ef510f0e..a8ab1d4fe0ae 100644 --- a/arch/xtensa/lib/usercopy.S +++ b/arch/xtensa/lib/usercopy.S | |||
@@ -53,7 +53,7 @@ | |||
53 | * a11/ original length | 53 | * a11/ original length |
54 | */ | 54 | */ |
55 | 55 | ||
56 | #include <xtensa/coreasm.h> | 56 | #include <asm/variant/core.h> |
57 | 57 | ||
58 | #ifdef __XTENSA_EB__ | 58 | #ifdef __XTENSA_EB__ |
59 | #define ALIGN(R, W0, W1) src R, W0, W1 | 59 | #define ALIGN(R, W0, W1) src R, W0, W1 |
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c index dd0dbec2e57e..3dc6f2f07bbe 100644 --- a/arch/xtensa/mm/fault.c +++ b/arch/xtensa/mm/fault.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <asm/system.h> | 21 | #include <asm/system.h> |
22 | #include <asm/pgalloc.h> | 22 | #include <asm/pgalloc.h> |
23 | 23 | ||
24 | unsigned long asid_cache = ASID_FIRST_VERSION; | 24 | unsigned long asid_cache = ASID_USER_FIRST; |
25 | void bad_page_fault(struct pt_regs*, unsigned long, int); | 25 | void bad_page_fault(struct pt_regs*, unsigned long, int); |
26 | 26 | ||
27 | /* | 27 | /* |
@@ -58,10 +58,10 @@ void do_page_fault(struct pt_regs *regs) | |||
58 | return; | 58 | return; |
59 | } | 59 | } |
60 | 60 | ||
61 | is_write = (exccause == XCHAL_EXCCAUSE_STORE_CACHE_ATTRIBUTE) ? 1 : 0; | 61 | is_write = (exccause == EXCCAUSE_STORE_CACHE_ATTRIBUTE) ? 1 : 0; |
62 | is_exec = (exccause == XCHAL_EXCCAUSE_ITLB_PRIVILEGE || | 62 | is_exec = (exccause == EXCCAUSE_ITLB_PRIVILEGE || |
63 | exccause == XCHAL_EXCCAUSE_ITLB_MISS || | 63 | exccause == EXCCAUSE_ITLB_MISS || |
64 | exccause == XCHAL_EXCCAUSE_FETCH_CACHE_ATTRIBUTE) ? 1 : 0; | 64 | exccause == EXCCAUSE_FETCH_CACHE_ATTRIBUTE) ? 1 : 0; |
65 | 65 | ||
66 | #if 0 | 66 | #if 0 |
67 | printk("[%s:%d:%08x:%d:%08x:%s%s]\n", current->comm, current->pid, | 67 | printk("[%s:%d:%08x:%d:%08x:%s%s]\n", current->comm, current->pid, |
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index 660ef058c149..e1ec2d1e8189 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c | |||
@@ -141,8 +141,8 @@ void __init bootmem_init(void) | |||
141 | if (min_low_pfn > max_pfn) | 141 | if (min_low_pfn > max_pfn) |
142 | panic("No memory found!\n"); | 142 | panic("No memory found!\n"); |
143 | 143 | ||
144 | max_low_pfn = max_pfn < MAX_LOW_MEMORY >> PAGE_SHIFT ? | 144 | max_low_pfn = max_pfn < MAX_MEM_PFN >> PAGE_SHIFT ? |
145 | max_pfn : MAX_LOW_MEMORY >> PAGE_SHIFT; | 145 | max_pfn : MAX_MEM_PFN >> PAGE_SHIFT; |
146 | 146 | ||
147 | /* Find an area to use for the bootmem bitmap. */ | 147 | /* Find an area to use for the bootmem bitmap. */ |
148 | 148 | ||
@@ -215,7 +215,7 @@ void __init init_mmu (void) | |||
215 | 215 | ||
216 | /* Set rasid register to a known value. */ | 216 | /* Set rasid register to a known value. */ |
217 | 217 | ||
218 | set_rasid_register (ASID_ALL_RESERVED); | 218 | set_rasid_register (ASID_USER_FIRST); |
219 | 219 | ||
220 | /* Set PTEVADDR special register to the start of the page | 220 | /* Set PTEVADDR special register to the start of the page |
221 | * table, which is in kernel mappable space (ie. not | 221 | * table, which is in kernel mappable space (ie. not |
diff --git a/arch/xtensa/mm/misc.S b/arch/xtensa/mm/misc.S index 327c0f17187c..ae085332c607 100644 --- a/arch/xtensa/mm/misc.S +++ b/arch/xtensa/mm/misc.S | |||
@@ -19,9 +19,8 @@ | |||
19 | #include <linux/linkage.h> | 19 | #include <linux/linkage.h> |
20 | #include <asm/page.h> | 20 | #include <asm/page.h> |
21 | #include <asm/pgtable.h> | 21 | #include <asm/pgtable.h> |
22 | 22 | #include <asm/asmmacro.h> | |
23 | #include <xtensa/cacheasm.h> | 23 | #include <asm/cacheasm.h> |
24 | #include <xtensa/cacheattrasm.h> | ||
25 | 24 | ||
26 | /* clear_page (page) */ | 25 | /* clear_page (page) */ |
27 | 26 | ||
@@ -74,104 +73,66 @@ ENTRY(copy_page) | |||
74 | 73 | ||
75 | retw | 74 | retw |
76 | 75 | ||
77 | |||
78 | /* | 76 | /* |
79 | * void __flush_invalidate_cache_all(void) | 77 | * void __invalidate_icache_page(ulong start) |
80 | */ | 78 | */ |
81 | 79 | ||
82 | ENTRY(__flush_invalidate_cache_all) | 80 | ENTRY(__invalidate_icache_page) |
83 | entry sp, 16 | 81 | entry sp, 16 |
84 | dcache_writeback_inv_all a2, a3 | ||
85 | icache_invalidate_all a2, a3 | ||
86 | retw | ||
87 | 82 | ||
88 | /* | 83 | ___invalidate_icache_page a2 a3 |
89 | * void __invalidate_icache_all(void) | 84 | isync |
90 | */ | ||
91 | 85 | ||
92 | ENTRY(__invalidate_icache_all) | ||
93 | entry sp, 16 | ||
94 | icache_invalidate_all a2, a3 | ||
95 | retw | 86 | retw |
96 | 87 | ||
97 | /* | 88 | /* |
98 | * void __flush_invalidate_dcache_all(void) | 89 | * void __invalidate_dcache_page(ulong start) |
99 | */ | 90 | */ |
100 | 91 | ||
101 | ENTRY(__flush_invalidate_dcache_all) | 92 | ENTRY(__invalidate_dcache_page) |
102 | entry sp, 16 | 93 | entry sp, 16 |
103 | dcache_writeback_inv_all a2, a3 | ||
104 | retw | ||
105 | |||
106 | 94 | ||
107 | /* | 95 | ___invalidate_dcache_page a2 a3 |
108 | * void __flush_invalidate_cache_range(ulong start, ulong size) | 96 | dsync |
109 | */ | ||
110 | 97 | ||
111 | ENTRY(__flush_invalidate_cache_range) | ||
112 | entry sp, 16 | ||
113 | mov a4, a2 | ||
114 | mov a5, a3 | ||
115 | dcache_writeback_inv_region a4, a5, a6 | ||
116 | icache_invalidate_region a2, a3, a4 | ||
117 | retw | 98 | retw |
118 | 99 | ||
119 | /* | 100 | /* |
120 | * void __invalidate_icache_page(ulong start) | 101 | * void __flush_invalidate_dcache_page(ulong start) |
121 | */ | 102 | */ |
122 | 103 | ||
123 | ENTRY(__invalidate_icache_page) | 104 | ENTRY(__flush_invalidate_dcache_page) |
124 | entry sp, 16 | 105 | entry sp, 16 |
125 | movi a3, PAGE_SIZE | ||
126 | icache_invalidate_region a2, a3, a4 | ||
127 | retw | ||
128 | 106 | ||
129 | /* | 107 | ___flush_invalidate_dcache_page a2 a3 |
130 | * void __invalidate_dcache_page(ulong start) | ||
131 | */ | ||
132 | 108 | ||
133 | ENTRY(__invalidate_dcache_page) | 109 | dsync |
134 | entry sp, 16 | ||
135 | movi a3, PAGE_SIZE | ||
136 | dcache_invalidate_region a2, a3, a4 | ||
137 | retw | 110 | retw |
138 | 111 | ||
139 | /* | 112 | /* |
140 | * void __invalidate_icache_range(ulong start, ulong size) | 113 | * void __flush_dcache_page(ulong start) |
141 | */ | 114 | */ |
142 | 115 | ||
143 | ENTRY(__invalidate_icache_range) | 116 | ENTRY(__flush_dcache_page) |
144 | entry sp, 16 | 117 | entry sp, 16 |
145 | icache_invalidate_region a2, a3, a4 | ||
146 | retw | ||
147 | 118 | ||
148 | /* | 119 | ___flush_dcache_page a2 a3 |
149 | * void __invalidate_dcache_range(ulong start, ulong size) | ||
150 | */ | ||
151 | 120 | ||
152 | ENTRY(__invalidate_dcache_range) | 121 | dsync |
153 | entry sp, 16 | ||
154 | dcache_invalidate_region a2, a3, a4 | ||
155 | retw | 122 | retw |
156 | 123 | ||
157 | /* | ||
158 | * void __flush_dcache_page(ulong start) | ||
159 | */ | ||
160 | 124 | ||
161 | ENTRY(__flush_dcache_page) | ||
162 | entry sp, 16 | ||
163 | movi a3, PAGE_SIZE | ||
164 | dcache_writeback_region a2, a3, a4 | ||
165 | retw | ||
166 | 125 | ||
167 | /* | 126 | /* |
168 | * void __flush_invalidate_dcache_page(ulong start) | 127 | * void __invalidate_icache_range(ulong start, ulong size) |
169 | */ | 128 | */ |
170 | 129 | ||
171 | ENTRY(__flush_invalidate_dcache_page) | 130 | ENTRY(__invalidate_icache_range) |
172 | entry sp, 16 | 131 | entry sp, 16 |
173 | movi a3, PAGE_SIZE | 132 | |
174 | dcache_writeback_inv_region a2, a3, a4 | 133 | ___invalidate_icache_range a2 a3 a4 |
134 | isync | ||
135 | |||
175 | retw | 136 | retw |
176 | 137 | ||
177 | /* | 138 | /* |
@@ -180,195 +141,69 @@ ENTRY(__flush_invalidate_dcache_page) | |||
180 | 141 | ||
181 | ENTRY(__flush_invalidate_dcache_range) | 142 | ENTRY(__flush_invalidate_dcache_range) |
182 | entry sp, 16 | 143 | entry sp, 16 |
183 | dcache_writeback_inv_region a2, a3, a4 | ||
184 | retw | ||
185 | 144 | ||
186 | /* | 145 | ___flush_invalidate_dcache_range a2 a3 a4 |
187 | * void __invalidate_dcache_all(void) | 146 | dsync |
188 | */ | ||
189 | 147 | ||
190 | ENTRY(__invalidate_dcache_all) | ||
191 | entry sp, 16 | ||
192 | dcache_invalidate_all a2, a3 | ||
193 | retw | 148 | retw |
194 | 149 | ||
195 | /* | 150 | /* |
196 | * void __flush_invalidate_dcache_page_phys(ulong start) | 151 | * void _flush_dcache_range(ulong start, ulong size) |
197 | */ | 152 | */ |
198 | 153 | ||
199 | ENTRY(__flush_invalidate_dcache_page_phys) | 154 | ENTRY(__flush_dcache_range) |
200 | entry sp, 16 | 155 | entry sp, 16 |
201 | 156 | ||
202 | movi a3, XCHAL_DCACHE_SIZE | 157 | ___flush_dcache_range a2 a3 a4 |
203 | movi a4, PAGE_MASK | 1 | ||
204 | addi a2, a2, 1 | ||
205 | |||
206 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
207 | |||
208 | ldct a6, a3 | ||
209 | dsync | 158 | dsync |
210 | and a6, a6, a4 | ||
211 | beq a6, a2, 2f | ||
212 | bgeui a3, 2, 1b | ||
213 | retw | ||
214 | 159 | ||
215 | 2: diwbi a3, 0 | ||
216 | bgeui a3, 2, 1b | ||
217 | retw | 160 | retw |
218 | 161 | ||
219 | ENTRY(check_dcache_low0) | 162 | /* |
220 | entry sp, 16 | 163 | * void _invalidate_dcache_range(ulong start, ulong size) |
221 | 164 | */ | |
222 | movi a3, XCHAL_DCACHE_SIZE / 4 | ||
223 | movi a4, PAGE_MASK | 1 | ||
224 | addi a2, a2, 1 | ||
225 | |||
226 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
227 | |||
228 | ldct a6, a3 | ||
229 | dsync | ||
230 | and a6, a6, a4 | ||
231 | beq a6, a2, 2f | ||
232 | bgeui a3, 2, 1b | ||
233 | retw | ||
234 | |||
235 | 2: j 2b | ||
236 | |||
237 | ENTRY(check_dcache_high0) | ||
238 | entry sp, 16 | ||
239 | |||
240 | movi a5, XCHAL_DCACHE_SIZE / 4 | ||
241 | movi a3, XCHAL_DCACHE_SIZE / 2 | ||
242 | movi a4, PAGE_MASK | 1 | ||
243 | addi a2, a2, 1 | ||
244 | |||
245 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
246 | addi a5, a5, -XCHAL_DCACHE_LINESIZE | ||
247 | |||
248 | ldct a6, a3 | ||
249 | dsync | ||
250 | and a6, a6, a4 | ||
251 | beq a6, a2, 2f | ||
252 | bgeui a5, 2, 1b | ||
253 | retw | ||
254 | |||
255 | 2: j 2b | ||
256 | 165 | ||
257 | ENTRY(check_dcache_low1) | 166 | ENTRY(__invalidate_dcache_range) |
258 | entry sp, 16 | 167 | entry sp, 16 |
259 | 168 | ||
260 | movi a5, XCHAL_DCACHE_SIZE / 4 | 169 | ___invalidate_dcache_range a2 a3 a4 |
261 | movi a3, XCHAL_DCACHE_SIZE * 3 / 4 | ||
262 | movi a4, PAGE_MASK | 1 | ||
263 | addi a2, a2, 1 | ||
264 | 170 | ||
265 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
266 | addi a5, a5, -XCHAL_DCACHE_LINESIZE | ||
267 | 171 | ||
268 | ldct a6, a3 | ||
269 | dsync | ||
270 | and a6, a6, a4 | ||
271 | beq a6, a2, 2f | ||
272 | bgeui a5, 2, 1b | ||
273 | retw | 172 | retw |
274 | 173 | ||
275 | 2: j 2b | 174 | /* |
175 | * void _invalidate_icache_all(void) | ||
176 | */ | ||
276 | 177 | ||
277 | ENTRY(check_dcache_high1) | 178 | ENTRY(__invalidate_icache_all) |
278 | entry sp, 16 | 179 | entry sp, 16 |
279 | 180 | ||
280 | movi a5, XCHAL_DCACHE_SIZE / 4 | 181 | ___invalidate_icache_all a2 a3 |
281 | movi a3, XCHAL_DCACHE_SIZE | 182 | isync |
282 | movi a4, PAGE_MASK | 1 | ||
283 | addi a2, a2, 1 | ||
284 | |||
285 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
286 | addi a5, a5, -XCHAL_DCACHE_LINESIZE | ||
287 | 183 | ||
288 | ldct a6, a3 | ||
289 | dsync | ||
290 | and a6, a6, a4 | ||
291 | beq a6, a2, 2f | ||
292 | bgeui a5, 2, 1b | ||
293 | retw | 184 | retw |
294 | 185 | ||
295 | 2: j 2b | ||
296 | |||
297 | |||
298 | /* | 186 | /* |
299 | * void __invalidate_icache_page_phys(ulong start) | 187 | * void _flush_invalidate_dcache_all(void) |
300 | */ | 188 | */ |
301 | 189 | ||
302 | ENTRY(__invalidate_icache_page_phys) | 190 | ENTRY(__flush_invalidate_dcache_all) |
303 | entry sp, 16 | 191 | entry sp, 16 |
304 | 192 | ||
305 | movi a3, XCHAL_ICACHE_SIZE | 193 | ___flush_invalidate_dcache_all a2 a3 |
306 | movi a4, PAGE_MASK | 1 | 194 | dsync |
307 | addi a2, a2, 1 | ||
308 | |||
309 | 1: addi a3, a3, -XCHAL_ICACHE_LINESIZE | ||
310 | |||
311 | lict a6, a3 | ||
312 | isync | ||
313 | and a6, a6, a4 | ||
314 | beq a6, a2, 2f | ||
315 | bgeui a3, 2, 1b | ||
316 | retw | ||
317 | 195 | ||
318 | 2: iii a3, 0 | ||
319 | bgeui a3, 2, 1b | ||
320 | retw | 196 | retw |
321 | 197 | ||
198 | /* | ||
199 | * void _invalidate_dcache_all(void) | ||
200 | */ | ||
322 | 201 | ||
323 | #if 0 | 202 | ENTRY(__invalidate_dcache_all) |
324 | |||
325 | movi a3, XCHAL_DCACHE_WAYS - 1 | ||
326 | movi a4, PAGE_SIZE | ||
327 | |||
328 | 1: mov a5, a2 | ||
329 | add a6, a2, a4 | ||
330 | |||
331 | 2: diwbi a5, 0 | ||
332 | diwbi a5, XCHAL_DCACHE_LINESIZE | ||
333 | diwbi a5, XCHAL_DCACHE_LINESIZE * 2 | ||
334 | diwbi a5, XCHAL_DCACHE_LINESIZE * 3 | ||
335 | |||
336 | addi a5, a5, XCHAL_DCACHE_LINESIZE * 4 | ||
337 | blt a5, a6, 2b | ||
338 | |||
339 | addi a3, a3, -1 | ||
340 | addi a2, a2, XCHAL_DCACHE_SIZE / XCHAL_DCACHE_WAYS | ||
341 | bgez a3, 1b | ||
342 | |||
343 | retw | ||
344 | |||
345 | ENTRY(__invalidate_icache_page_index) | ||
346 | entry sp, 16 | 203 | entry sp, 16 |
347 | 204 | ||
348 | movi a3, XCHAL_ICACHE_WAYS - 1 | 205 | ___invalidate_dcache_all a2 a3 |
349 | movi a4, PAGE_SIZE | 206 | dsync |
350 | |||
351 | 1: mov a5, a2 | ||
352 | add a6, a2, a4 | ||
353 | |||
354 | 2: iii a5, 0 | ||
355 | iii a5, XCHAL_ICACHE_LINESIZE | ||
356 | iii a5, XCHAL_ICACHE_LINESIZE * 2 | ||
357 | iii a5, XCHAL_ICACHE_LINESIZE * 3 | ||
358 | |||
359 | addi a5, a5, XCHAL_ICACHE_LINESIZE * 4 | ||
360 | blt a5, a6, 2b | ||
361 | |||
362 | addi a3, a3, -1 | ||
363 | addi a2, a2, XCHAL_ICACHE_SIZE / XCHAL_ICACHE_WAYS | ||
364 | bgez a3, 2b | ||
365 | 207 | ||
366 | retw | 208 | retw |
367 | 209 | ||
368 | #endif | ||
369 | |||
370 | |||
371 | |||
372 | |||
373 | |||
374 | |||
diff --git a/arch/xtensa/mm/tlb.c b/arch/xtensa/mm/tlb.c index 0fefb8666874..239461d8ea88 100644 --- a/arch/xtensa/mm/tlb.c +++ b/arch/xtensa/mm/tlb.c | |||
@@ -24,12 +24,12 @@ | |||
24 | 24 | ||
25 | static inline void __flush_itlb_all (void) | 25 | static inline void __flush_itlb_all (void) |
26 | { | 26 | { |
27 | int way, index; | 27 | int w, i; |
28 | 28 | ||
29 | for (way = 0; way < XCHAL_ITLB_ARF_WAYS; way++) { | 29 | for (w = 0; w < ITLB_ARF_WAYS; w++) { |
30 | for (index = 0; index < ITLB_ENTRIES_PER_ARF_WAY; index++) { | 30 | for (i = 0; i < (1 << XCHAL_ITLB_ARF_ENTRIES_LOG2); i++) { |
31 | int entry = way + (index << PAGE_SHIFT); | 31 | int e = w + (i << PAGE_SHIFT); |
32 | invalidate_itlb_entry_no_isync (entry); | 32 | invalidate_itlb_entry_no_isync(e); |
33 | } | 33 | } |
34 | } | 34 | } |
35 | asm volatile ("isync\n"); | 35 | asm volatile ("isync\n"); |
@@ -37,12 +37,12 @@ static inline void __flush_itlb_all (void) | |||
37 | 37 | ||
38 | static inline void __flush_dtlb_all (void) | 38 | static inline void __flush_dtlb_all (void) |
39 | { | 39 | { |
40 | int way, index; | 40 | int w, i; |
41 | 41 | ||
42 | for (way = 0; way < XCHAL_DTLB_ARF_WAYS; way++) { | 42 | for (w = 0; w < DTLB_ARF_WAYS; w++) { |
43 | for (index = 0; index < DTLB_ENTRIES_PER_ARF_WAY; index++) { | 43 | for (i = 0; i < (1 << XCHAL_DTLB_ARF_ENTRIES_LOG2); i++) { |
44 | int entry = way + (index << PAGE_SHIFT); | 44 | int e = w + (i << PAGE_SHIFT); |
45 | invalidate_dtlb_entry_no_isync (entry); | 45 | invalidate_dtlb_entry_no_isync(e); |
46 | } | 46 | } |
47 | } | 47 | } |
48 | asm volatile ("isync\n"); | 48 | asm volatile ("isync\n"); |
@@ -63,21 +63,25 @@ void flush_tlb_all (void) | |||
63 | 63 | ||
64 | void flush_tlb_mm(struct mm_struct *mm) | 64 | void flush_tlb_mm(struct mm_struct *mm) |
65 | { | 65 | { |
66 | #if 0 | ||
67 | printk("[tlbmm<%lx>]\n", (unsigned long)mm->context); | ||
68 | #endif | ||
69 | |||
70 | if (mm == current->active_mm) { | 66 | if (mm == current->active_mm) { |
71 | int flags; | 67 | int flags; |
72 | local_save_flags(flags); | 68 | local_save_flags(flags); |
73 | get_new_mmu_context(mm, asid_cache); | 69 | __get_new_mmu_context(mm); |
74 | set_rasid_register(ASID_INSERT(mm->context)); | 70 | __load_mmu_context(mm); |
75 | local_irq_restore(flags); | 71 | local_irq_restore(flags); |
76 | } | 72 | } |
77 | else | 73 | else |
78 | mm->context = 0; | 74 | mm->context = 0; |
79 | } | 75 | } |
80 | 76 | ||
77 | #define _ITLB_ENTRIES (ITLB_ARF_WAYS << XCHAL_ITLB_ARF_ENTRIES_LOG2) | ||
78 | #define _DTLB_ENTRIES (DTLB_ARF_WAYS << XCHAL_DTLB_ARF_ENTRIES_LOG2) | ||
79 | #if _ITLB_ENTRIES > _DTLB_ENTRIES | ||
80 | # define _TLB_ENTRIES _ITLB_ENTRIES | ||
81 | #else | ||
82 | # define _TLB_ENTRIES _DTLB_ENTRIES | ||
83 | #endif | ||
84 | |||
81 | void flush_tlb_range (struct vm_area_struct *vma, | 85 | void flush_tlb_range (struct vm_area_struct *vma, |
82 | unsigned long start, unsigned long end) | 86 | unsigned long start, unsigned long end) |
83 | { | 87 | { |
@@ -93,7 +97,7 @@ void flush_tlb_range (struct vm_area_struct *vma, | |||
93 | #endif | 97 | #endif |
94 | local_save_flags(flags); | 98 | local_save_flags(flags); |
95 | 99 | ||
96 | if (end-start + (PAGE_SIZE-1) <= SMALLEST_NTLB_ENTRIES << PAGE_SHIFT) { | 100 | if (end-start + (PAGE_SIZE-1) <= _TLB_ENTRIES << PAGE_SHIFT) { |
97 | int oldpid = get_rasid_register(); | 101 | int oldpid = get_rasid_register(); |
98 | set_rasid_register (ASID_INSERT(mm->context)); | 102 | set_rasid_register (ASID_INSERT(mm->context)); |
99 | start &= PAGE_MASK; | 103 | start &= PAGE_MASK; |
@@ -111,9 +115,7 @@ void flush_tlb_range (struct vm_area_struct *vma, | |||
111 | 115 | ||
112 | set_rasid_register(oldpid); | 116 | set_rasid_register(oldpid); |
113 | } else { | 117 | } else { |
114 | get_new_mmu_context(mm, asid_cache); | 118 | flush_tlb_mm(mm); |
115 | if (mm == current->active_mm) | ||
116 | set_rasid_register(ASID_INSERT(mm->context)); | ||
117 | } | 119 | } |
118 | local_irq_restore(flags); | 120 | local_irq_restore(flags); |
119 | } | 121 | } |
@@ -123,10 +125,6 @@ void flush_tlb_page (struct vm_area_struct *vma, unsigned long page) | |||
123 | struct mm_struct* mm = vma->vm_mm; | 125 | struct mm_struct* mm = vma->vm_mm; |
124 | unsigned long flags; | 126 | unsigned long flags; |
125 | int oldpid; | 127 | int oldpid; |
126 | #if 0 | ||
127 | printk("[tlbpage<%02lx,%08lx>]\n", | ||
128 | (unsigned long)mm->context, page); | ||
129 | #endif | ||
130 | 128 | ||
131 | if(mm->context == NO_CONTEXT) | 129 | if(mm->context == NO_CONTEXT) |
132 | return; | 130 | return; |
@@ -142,404 +140,5 @@ void flush_tlb_page (struct vm_area_struct *vma, unsigned long page) | |||
142 | set_rasid_register(oldpid); | 140 | set_rasid_register(oldpid); |
143 | 141 | ||
144 | local_irq_restore(flags); | 142 | local_irq_restore(flags); |
145 | |||
146 | #if 0 | ||
147 | flush_tlb_all(); | ||
148 | return; | ||
149 | #endif | ||
150 | } | ||
151 | |||
152 | |||
153 | #ifdef DEBUG_TLB | ||
154 | |||
155 | #define USE_ITLB 0 | ||
156 | #define USE_DTLB 1 | ||
157 | |||
158 | struct way_config_t { | ||
159 | int indicies; | ||
160 | int indicies_log2; | ||
161 | int pgsz_log2; | ||
162 | int arf; | ||
163 | }; | ||
164 | |||
165 | static struct way_config_t itlb[XCHAL_ITLB_WAYS] = | ||
166 | { | ||
167 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY0_SET, ENTRIES), | ||
168 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY0_SET, ENTRIES_LOG2), | ||
169 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY0_SET, PAGESZ_LOG2_MIN), | ||
170 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY0_SET, ARF) | ||
171 | }, | ||
172 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY1_SET, ENTRIES), | ||
173 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY1_SET, ENTRIES_LOG2), | ||
174 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY1_SET, PAGESZ_LOG2_MIN), | ||
175 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY1_SET, ARF) | ||
176 | }, | ||
177 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY2_SET, ENTRIES), | ||
178 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY2_SET, ENTRIES_LOG2), | ||
179 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY2_SET, PAGESZ_LOG2_MIN), | ||
180 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY2_SET, ARF) | ||
181 | }, | ||
182 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY3_SET, ENTRIES), | ||
183 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY3_SET, ENTRIES_LOG2), | ||
184 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY3_SET, PAGESZ_LOG2_MIN), | ||
185 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY3_SET, ARF) | ||
186 | }, | ||
187 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY4_SET, ENTRIES), | ||
188 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY4_SET, ENTRIES_LOG2), | ||
189 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY4_SET, PAGESZ_LOG2_MIN), | ||
190 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY4_SET, ARF) | ||
191 | }, | ||
192 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY5_SET, ENTRIES), | ||
193 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY5_SET, ENTRIES_LOG2), | ||
194 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY5_SET, PAGESZ_LOG2_MIN), | ||
195 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY5_SET, ARF) | ||
196 | }, | ||
197 | { XCHAL_ITLB_SET(XCHAL_ITLB_WAY6_SET, ENTRIES), | ||
198 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY6_SET, ENTRIES_LOG2), | ||
199 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY6_SET, PAGESZ_LOG2_MIN), | ||
200 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY6_SET, ARF) | ||
201 | } | ||
202 | }; | ||
203 | |||
204 | static struct way_config_t dtlb[XCHAL_DTLB_WAYS] = | ||
205 | { | ||
206 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY0_SET, ENTRIES), | ||
207 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY0_SET, ENTRIES_LOG2), | ||
208 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY0_SET, PAGESZ_LOG2_MIN), | ||
209 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY0_SET, ARF) | ||
210 | }, | ||
211 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY1_SET, ENTRIES), | ||
212 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY1_SET, ENTRIES_LOG2), | ||
213 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY1_SET, PAGESZ_LOG2_MIN), | ||
214 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY1_SET, ARF) | ||
215 | }, | ||
216 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY2_SET, ENTRIES), | ||
217 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY2_SET, ENTRIES_LOG2), | ||
218 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY2_SET, PAGESZ_LOG2_MIN), | ||
219 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY2_SET, ARF) | ||
220 | }, | ||
221 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY3_SET, ENTRIES), | ||
222 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY3_SET, ENTRIES_LOG2), | ||
223 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY3_SET, PAGESZ_LOG2_MIN), | ||
224 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY3_SET, ARF) | ||
225 | }, | ||
226 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY4_SET, ENTRIES), | ||
227 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY4_SET, ENTRIES_LOG2), | ||
228 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY4_SET, PAGESZ_LOG2_MIN), | ||
229 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY4_SET, ARF) | ||
230 | }, | ||
231 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY5_SET, ENTRIES), | ||
232 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY5_SET, ENTRIES_LOG2), | ||
233 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY5_SET, PAGESZ_LOG2_MIN), | ||
234 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY5_SET, ARF) | ||
235 | }, | ||
236 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY6_SET, ENTRIES), | ||
237 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY6_SET, ENTRIES_LOG2), | ||
238 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY6_SET, PAGESZ_LOG2_MIN), | ||
239 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY6_SET, ARF) | ||
240 | }, | ||
241 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY7_SET, ENTRIES), | ||
242 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY7_SET, ENTRIES_LOG2), | ||
243 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY7_SET, PAGESZ_LOG2_MIN), | ||
244 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY7_SET, ARF) | ||
245 | }, | ||
246 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY8_SET, ENTRIES), | ||
247 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY8_SET, ENTRIES_LOG2), | ||
248 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY8_SET, PAGESZ_LOG2_MIN), | ||
249 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY8_SET, ARF) | ||
250 | }, | ||
251 | { XCHAL_DTLB_SET(XCHAL_DTLB_WAY9_SET, ENTRIES), | ||
252 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY9_SET, ENTRIES_LOG2), | ||
253 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY9_SET, PAGESZ_LOG2_MIN), | ||
254 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY9_SET, ARF) | ||
255 | } | ||
256 | }; | ||
257 | |||
258 | /* Total number of entries: */ | ||
259 | #define ITLB_TOTAL_ENTRIES \ | ||
260 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY0_SET, ENTRIES) + \ | ||
261 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY1_SET, ENTRIES) + \ | ||
262 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY2_SET, ENTRIES) + \ | ||
263 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY3_SET, ENTRIES) + \ | ||
264 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY4_SET, ENTRIES) + \ | ||
265 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY5_SET, ENTRIES) + \ | ||
266 | XCHAL_ITLB_SET(XCHAL_ITLB_WAY6_SET, ENTRIES) | ||
267 | #define DTLB_TOTAL_ENTRIES \ | ||
268 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY0_SET, ENTRIES) + \ | ||
269 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY1_SET, ENTRIES) + \ | ||
270 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY2_SET, ENTRIES) + \ | ||
271 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY3_SET, ENTRIES) + \ | ||
272 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY4_SET, ENTRIES) + \ | ||
273 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY5_SET, ENTRIES) + \ | ||
274 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY6_SET, ENTRIES) + \ | ||
275 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY7_SET, ENTRIES) + \ | ||
276 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY8_SET, ENTRIES) + \ | ||
277 | XCHAL_DTLB_SET(XCHAL_DTLB_WAY9_SET, ENTRIES) | ||
278 | |||
279 | |||
280 | typedef struct { | ||
281 | unsigned va; | ||
282 | unsigned pa; | ||
283 | unsigned char asid; | ||
284 | unsigned char ca; | ||
285 | unsigned char way; | ||
286 | unsigned char index; | ||
287 | unsigned char pgsz_log2; /* 0 .. 32 */ | ||
288 | unsigned char type; /* 0=ITLB 1=DTLB */ | ||
289 | } tlb_dump_entry_t; | ||
290 | |||
291 | /* Return -1 if a precedes b, +1 if a follows b, 0 if same: */ | ||
292 | int cmp_tlb_dump_info( tlb_dump_entry_t *a, tlb_dump_entry_t *b ) | ||
293 | { | ||
294 | if (a->asid < b->asid) return -1; | ||
295 | if (a->asid > b->asid) return 1; | ||
296 | if (a->va < b->va) return -1; | ||
297 | if (a->va > b->va) return 1; | ||
298 | if (a->pa < b->pa) return -1; | ||
299 | if (a->pa > b->pa) return 1; | ||
300 | if (a->ca < b->ca) return -1; | ||
301 | if (a->ca > b->ca) return 1; | ||
302 | if (a->way < b->way) return -1; | ||
303 | if (a->way > b->way) return 1; | ||
304 | if (a->index < b->index) return -1; | ||
305 | if (a->index > b->index) return 1; | ||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | void sort_tlb_dump_info( tlb_dump_entry_t *t, int n ) | ||
310 | { | ||
311 | int i, j; | ||
312 | /* Simple O(n*n) sort: */ | ||
313 | for (i = 0; i < n-1; i++) | ||
314 | for (j = i+1; j < n; j++) | ||
315 | if (cmp_tlb_dump_info(t+i, t+j) > 0) { | ||
316 | tlb_dump_entry_t tmp = t[i]; | ||
317 | t[i] = t[j]; | ||
318 | t[j] = tmp; | ||
319 | } | ||
320 | } | ||
321 | |||
322 | |||
323 | static tlb_dump_entry_t itlb_dump_info[ITLB_TOTAL_ENTRIES]; | ||
324 | static tlb_dump_entry_t dtlb_dump_info[DTLB_TOTAL_ENTRIES]; | ||
325 | |||
326 | |||
327 | static inline char *way_type (int type) | ||
328 | { | ||
329 | return type ? "autorefill" : "non-autorefill"; | ||
330 | } | ||
331 | |||
332 | void print_entry (struct way_config_t *way_info, | ||
333 | unsigned int way, | ||
334 | unsigned int index, | ||
335 | unsigned int virtual, | ||
336 | unsigned int translation) | ||
337 | { | ||
338 | char valid_chr; | ||
339 | unsigned int va, pa, asid, ca; | ||
340 | |||
341 | va = virtual & | ||
342 | ~((1 << (way_info->pgsz_log2 + way_info->indicies_log2)) - 1); | ||
343 | asid = virtual & ((1 << XCHAL_MMU_ASID_BITS) - 1); | ||
344 | pa = translation & ~((1 << way_info->pgsz_log2) - 1); | ||
345 | ca = translation & ((1 << XCHAL_MMU_CA_BITS) - 1); | ||
346 | valid_chr = asid ? 'V' : 'I'; | ||
347 | |||
348 | /* Compute and incorporate the effect of the index bits on the | ||
349 | * va. It's more useful for kernel debugging, since we always | ||
350 | * want to know the effective va anyway. */ | ||
351 | |||
352 | va += index << way_info->pgsz_log2; | ||
353 | |||
354 | printk ("\t[%d,%d] (%c) vpn 0x%.8x ppn 0x%.8x asid 0x%.2x am 0x%x\n", | ||
355 | way, index, valid_chr, va, pa, asid, ca); | ||
356 | } | ||
357 | |||
358 | void print_itlb_entry (struct way_config_t *way_info, int way, int index) | ||
359 | { | ||
360 | print_entry (way_info, way, index, | ||
361 | read_itlb_virtual (way + (index << way_info->pgsz_log2)), | ||
362 | read_itlb_translation (way + (index << way_info->pgsz_log2))); | ||
363 | } | ||
364 | |||
365 | void print_dtlb_entry (struct way_config_t *way_info, int way, int index) | ||
366 | { | ||
367 | print_entry (way_info, way, index, | ||
368 | read_dtlb_virtual (way + (index << way_info->pgsz_log2)), | ||
369 | read_dtlb_translation (way + (index << way_info->pgsz_log2))); | ||
370 | } | ||
371 | |||
372 | void dump_itlb (void) | ||
373 | { | ||
374 | int way, index; | ||
375 | |||
376 | printk ("\nITLB: ways = %d\n", XCHAL_ITLB_WAYS); | ||
377 | |||
378 | for (way = 0; way < XCHAL_ITLB_WAYS; way++) { | ||
379 | printk ("\nWay: %d, Entries: %d, MinPageSize: %d, Type: %s\n", | ||
380 | way, itlb[way].indicies, | ||
381 | itlb[way].pgsz_log2, way_type(itlb[way].arf)); | ||
382 | for (index = 0; index < itlb[way].indicies; index++) { | ||
383 | print_itlb_entry(&itlb[way], way, index); | ||
384 | } | ||
385 | } | ||
386 | } | ||
387 | |||
388 | void dump_dtlb (void) | ||
389 | { | ||
390 | int way, index; | ||
391 | |||
392 | printk ("\nDTLB: ways = %d\n", XCHAL_DTLB_WAYS); | ||
393 | |||
394 | for (way = 0; way < XCHAL_DTLB_WAYS; way++) { | ||
395 | printk ("\nWay: %d, Entries: %d, MinPageSize: %d, Type: %s\n", | ||
396 | way, dtlb[way].indicies, | ||
397 | dtlb[way].pgsz_log2, way_type(dtlb[way].arf)); | ||
398 | for (index = 0; index < dtlb[way].indicies; index++) { | ||
399 | print_dtlb_entry(&dtlb[way], way, index); | ||
400 | } | ||
401 | } | ||
402 | } | ||
403 | |||
404 | void dump_tlb (tlb_dump_entry_t *tinfo, struct way_config_t *config, | ||
405 | int entries, int ways, int type, int show_invalid) | ||
406 | { | ||
407 | tlb_dump_entry_t *e = tinfo; | ||
408 | int way, i; | ||
409 | |||
410 | /* Gather all info: */ | ||
411 | for (way = 0; way < ways; way++) { | ||
412 | struct way_config_t *cfg = config + way; | ||
413 | for (i = 0; i < cfg->indicies; i++) { | ||
414 | unsigned wayindex = way + (i << cfg->pgsz_log2); | ||
415 | unsigned vv = (type ? read_dtlb_virtual (wayindex) | ||
416 | : read_itlb_virtual (wayindex)); | ||
417 | unsigned pp = (type ? read_dtlb_translation (wayindex) | ||
418 | : read_itlb_translation (wayindex)); | ||
419 | |||
420 | /* Compute and incorporate the effect of the index bits on the | ||
421 | * va. It's more useful for kernel debugging, since we always | ||
422 | * want to know the effective va anyway. */ | ||
423 | |||
424 | e->va = (vv & ~((1 << (cfg->pgsz_log2 + cfg->indicies_log2)) - 1)); | ||
425 | e->va += (i << cfg->pgsz_log2); | ||
426 | e->pa = (pp & ~((1 << cfg->pgsz_log2) - 1)); | ||
427 | e->asid = (vv & ((1 << XCHAL_MMU_ASID_BITS) - 1)); | ||
428 | e->ca = (pp & ((1 << XCHAL_MMU_CA_BITS) - 1)); | ||
429 | e->way = way; | ||
430 | e->index = i; | ||
431 | e->pgsz_log2 = cfg->pgsz_log2; | ||
432 | e->type = type; | ||
433 | e++; | ||
434 | } | ||
435 | } | ||
436 | #if 1 | ||
437 | /* Sort by ASID and VADDR: */ | ||
438 | sort_tlb_dump_info (tinfo, entries); | ||
439 | #endif | ||
440 | |||
441 | /* Display all sorted info: */ | ||
442 | printk ("\n%cTLB dump:\n", (type ? 'D' : 'I')); | ||
443 | for (e = tinfo, i = 0; i < entries; i++, e++) { | ||
444 | #if 0 | ||
445 | if (e->asid == 0 && !show_invalid) | ||
446 | continue; | ||
447 | #endif | ||
448 | printk ("%c way=%d i=%d ASID=%02X V=%08X -> P=%08X CA=%X (%d %cB)\n", | ||
449 | (e->type ? 'D' : 'I'), e->way, e->index, | ||
450 | e->asid, e->va, e->pa, e->ca, | ||
451 | (1 << (e->pgsz_log2 % 10)), | ||
452 | " kMG"[e->pgsz_log2 / 10] | ||
453 | ); | ||
454 | } | ||
455 | } | ||
456 | |||
457 | void dump_tlbs2 (int showinv) | ||
458 | { | ||
459 | dump_tlb (itlb_dump_info, itlb, ITLB_TOTAL_ENTRIES, XCHAL_ITLB_WAYS, 0, showinv); | ||
460 | dump_tlb (dtlb_dump_info, dtlb, DTLB_TOTAL_ENTRIES, XCHAL_DTLB_WAYS, 1, showinv); | ||
461 | } | ||
462 | |||
463 | void dump_all_tlbs (void) | ||
464 | { | ||
465 | dump_tlbs2 (1); | ||
466 | } | ||
467 | |||
468 | void dump_valid_tlbs (void) | ||
469 | { | ||
470 | dump_tlbs2 (0); | ||
471 | } | 143 | } |
472 | 144 | ||
473 | |||
474 | void dump_tlbs (void) | ||
475 | { | ||
476 | dump_itlb(); | ||
477 | dump_dtlb(); | ||
478 | } | ||
479 | |||
480 | void dump_cache_tag(int dcache, int idx) | ||
481 | { | ||
482 | int w, i, s, e; | ||
483 | unsigned long tag, index; | ||
484 | unsigned long num_lines, num_ways, cache_size, line_size; | ||
485 | |||
486 | num_ways = dcache ? XCHAL_DCACHE_WAYS : XCHAL_ICACHE_WAYS; | ||
487 | cache_size = dcache ? XCHAL_DCACHE_SIZE : XCHAL_ICACHE_SIZE; | ||
488 | line_size = dcache ? XCHAL_DCACHE_LINESIZE : XCHAL_ICACHE_LINESIZE; | ||
489 | |||
490 | num_lines = cache_size / num_ways; | ||
491 | |||
492 | s = 0; e = num_lines; | ||
493 | |||
494 | if (idx >= 0) | ||
495 | e = (s = idx * line_size) + 1; | ||
496 | |||
497 | for (i = s; i < e; i+= line_size) { | ||
498 | printk("\nline %#08x:", i); | ||
499 | for (w = 0; w < num_ways; w++) { | ||
500 | index = w * num_lines + i; | ||
501 | if (dcache) | ||
502 | __asm__ __volatile__("ldct %0, %1\n\t" | ||
503 | : "=a"(tag) : "a"(index)); | ||
504 | else | ||
505 | __asm__ __volatile__("lict %0, %1\n\t" | ||
506 | : "=a"(tag) : "a"(index)); | ||
507 | |||
508 | printk(" %#010lx", tag); | ||
509 | } | ||
510 | } | ||
511 | printk ("\n"); | ||
512 | } | ||
513 | |||
514 | void dump_icache(int index) | ||
515 | { | ||
516 | unsigned long data, addr; | ||
517 | int w, i; | ||
518 | |||
519 | const unsigned long num_ways = XCHAL_ICACHE_WAYS; | ||
520 | const unsigned long cache_size = XCHAL_ICACHE_SIZE; | ||
521 | const unsigned long line_size = XCHAL_ICACHE_LINESIZE; | ||
522 | const unsigned long num_lines = cache_size / num_ways / line_size; | ||
523 | |||
524 | for (w = 0; w < num_ways; w++) { | ||
525 | printk ("\nWay %d", w); | ||
526 | |||
527 | for (i = 0; i < line_size; i+= 4) { | ||
528 | addr = w * num_lines + index * line_size + i; | ||
529 | __asm__ __volatile__("licw %0, %1\n\t" | ||
530 | : "=a"(data) : "a"(addr)); | ||
531 | printk(" %#010lx", data); | ||
532 | } | ||
533 | } | ||
534 | printk ("\n"); | ||
535 | } | ||
536 | |||
537 | void dump_cache_tags(void) | ||
538 | { | ||
539 | printk("Instruction cache\n"); | ||
540 | dump_cache_tag(0, -1); | ||
541 | printk("Data cache\n"); | ||
542 | dump_cache_tag(1, -1); | ||
543 | } | ||
544 | |||
545 | #endif | ||
diff --git a/arch/xtensa/platform-iss/console.c b/arch/xtensa/platform-iss/console.c index 5c947cae7520..2f4f20ffe666 100644 --- a/arch/xtensa/platform-iss/console.c +++ b/arch/xtensa/platform-iss/console.c | |||
@@ -25,11 +25,15 @@ | |||
25 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
26 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
27 | 27 | ||
28 | #include <xtensa/simcall.h> | 28 | #include <asm/platform/simcall.h> |
29 | 29 | ||
30 | #include <linux/tty.h> | 30 | #include <linux/tty.h> |
31 | #include <linux/tty_flip.h> | 31 | #include <linux/tty_flip.h> |
32 | 32 | ||
33 | #ifdef SERIAL_INLINE | ||
34 | #define _INLINE_ inline | ||
35 | #endif | ||
36 | |||
33 | #define SERIAL_MAX_NUM_LINES 1 | 37 | #define SERIAL_MAX_NUM_LINES 1 |
34 | #define SERIAL_TIMER_VALUE (20 * HZ) | 38 | #define SERIAL_TIMER_VALUE (20 * HZ) |
35 | 39 | ||
@@ -191,7 +195,7 @@ static int rs_read_proc(char *page, char **start, off_t off, int count, | |||
191 | } | 195 | } |
192 | 196 | ||
193 | 197 | ||
194 | static const struct tty_operations serial_ops = { | 198 | static struct tty_operations serial_ops = { |
195 | .open = rs_open, | 199 | .open = rs_open, |
196 | .close = rs_close, | 200 | .close = rs_close, |
197 | .write = rs_write, | 201 | .write = rs_write, |
diff --git a/arch/xtensa/platform-iss/network.c b/arch/xtensa/platform-iss/network.c index 15d64414bd60..8ebfc8761229 100644 --- a/arch/xtensa/platform-iss/network.c +++ b/arch/xtensa/platform-iss/network.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/timer.h> | 34 | #include <linux/timer.h> |
35 | #include <linux/platform_device.h> | 35 | #include <linux/platform_device.h> |
36 | 36 | ||
37 | #include <xtensa/simcall.h> | 37 | #include <asm/platform/simcall.h> |
38 | 38 | ||
39 | #define DRIVER_NAME "iss-netdev" | 39 | #define DRIVER_NAME "iss-netdev" |
40 | #define ETH_MAX_PACKET 1500 | 40 | #define ETH_MAX_PACKET 1500 |