diff options
Diffstat (limited to 'arch/arm/boot')
-rw-r--r-- | arch/arm/boot/compressed/head.S | 44 | ||||
-rw-r--r-- | arch/arm/boot/compressed/misc.c | 20 | ||||
-rw-r--r-- | arch/arm/boot/compressed/vmlinux.lds.in | 5 |
3 files changed, 68 insertions, 1 deletions
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 77d614232d81..b371fba1b954 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -27,6 +27,12 @@ | |||
27 | .macro writeb, ch, rb | 27 | .macro writeb, ch, rb |
28 | mcr p14, 0, \ch, c0, c5, 0 | 28 | mcr p14, 0, \ch, c0, c5, 0 |
29 | .endm | 29 | .endm |
30 | #elif defined(CONFIG_CPU_XSCALE) | ||
31 | .macro loadsp, rb | ||
32 | .endm | ||
33 | .macro writeb, ch, rb | ||
34 | mcr p14, 0, \ch, c8, c0, 0 | ||
35 | .endm | ||
30 | #else | 36 | #else |
31 | .macro loadsp, rb | 37 | .macro loadsp, rb |
32 | .endm | 38 | .endm |
@@ -459,6 +465,20 @@ __armv7_mmu_cache_on: | |||
459 | mcr p15, 0, r0, c7, c5, 4 @ ISB | 465 | mcr p15, 0, r0, c7, c5, 4 @ ISB |
460 | mov pc, r12 | 466 | mov pc, r12 |
461 | 467 | ||
468 | __fa526_cache_on: | ||
469 | mov r12, lr | ||
470 | bl __setup_mmu | ||
471 | mov r0, #0 | ||
472 | mcr p15, 0, r0, c7, c7, 0 @ Invalidate whole cache | ||
473 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | ||
474 | mcr p15, 0, r0, c8, c7, 0 @ flush UTLB | ||
475 | mrc p15, 0, r0, c1, c0, 0 @ read control reg | ||
476 | orr r0, r0, #0x1000 @ I-cache enable | ||
477 | bl __common_mmu_cache_on | ||
478 | mov r0, #0 | ||
479 | mcr p15, 0, r0, c8, c7, 0 @ flush UTLB | ||
480 | mov pc, r12 | ||
481 | |||
462 | __arm6_mmu_cache_on: | 482 | __arm6_mmu_cache_on: |
463 | mov r12, lr | 483 | mov r12, lr |
464 | bl __setup_mmu | 484 | bl __setup_mmu |
@@ -630,12 +650,30 @@ proc_types: | |||
630 | b __armv4_mmu_cache_off | 650 | b __armv4_mmu_cache_off |
631 | b __armv4_mmu_cache_flush | 651 | b __armv4_mmu_cache_flush |
632 | 652 | ||
653 | .word 0x56158000 @ PXA168 | ||
654 | .word 0xfffff000 | ||
655 | b __armv4_mmu_cache_on | ||
656 | b __armv4_mmu_cache_off | ||
657 | b __armv5tej_mmu_cache_flush | ||
658 | |||
659 | .word 0x56056930 | ||
660 | .word 0xff0ffff0 @ PXA935 | ||
661 | b __armv4_mmu_cache_on | ||
662 | b __armv4_mmu_cache_off | ||
663 | b __armv4_mmu_cache_flush | ||
664 | |||
633 | .word 0x56050000 @ Feroceon | 665 | .word 0x56050000 @ Feroceon |
634 | .word 0xff0f0000 | 666 | .word 0xff0f0000 |
635 | b __armv4_mmu_cache_on | 667 | b __armv4_mmu_cache_on |
636 | b __armv4_mmu_cache_off | 668 | b __armv4_mmu_cache_off |
637 | b __armv5tej_mmu_cache_flush | 669 | b __armv5tej_mmu_cache_flush |
638 | 670 | ||
671 | .word 0x66015261 @ FA526 | ||
672 | .word 0xff01fff1 | ||
673 | b __fa526_cache_on | ||
674 | b __armv4_mmu_cache_off | ||
675 | b __fa526_cache_flush | ||
676 | |||
639 | @ These match on the architecture ID | 677 | @ These match on the architecture ID |
640 | 678 | ||
641 | .word 0x00020000 @ ARMv4T | 679 | .word 0x00020000 @ ARMv4T |
@@ -775,6 +813,12 @@ __armv4_mpu_cache_flush: | |||
775 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 813 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
776 | mov pc, lr | 814 | mov pc, lr |
777 | 815 | ||
816 | __fa526_cache_flush: | ||
817 | mov r1, #0 | ||
818 | mcr p15, 0, r1, c7, c14, 0 @ clean and invalidate D cache | ||
819 | mcr p15, 0, r1, c7, c5, 0 @ flush I cache | ||
820 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | ||
821 | mov pc, lr | ||
778 | 822 | ||
779 | __armv6_mmu_cache_flush: | 823 | __armv6_mmu_cache_flush: |
780 | mov r1, #0 | 824 | mov r1, #0 |
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index 3fc08413fff0..9e6e512f0117 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
@@ -18,7 +18,10 @@ | |||
18 | 18 | ||
19 | unsigned int __machine_arch_type; | 19 | unsigned int __machine_arch_type; |
20 | 20 | ||
21 | #include <linux/string.h> | 21 | #include <linux/compiler.h> /* for inline */ |
22 | #include <linux/types.h> /* for size_t */ | ||
23 | #include <linux/stddef.h> /* for NULL */ | ||
24 | #include <asm/string.h> | ||
22 | 25 | ||
23 | #ifdef STANDALONE_DEBUG | 26 | #ifdef STANDALONE_DEBUG |
24 | #define putstr printf | 27 | #define putstr printf |
@@ -46,6 +49,21 @@ static void icedcc_putc(int ch) | |||
46 | 49 | ||
47 | asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch)); | 50 | asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch)); |
48 | } | 51 | } |
52 | #elif defined(CONFIG_CPU_XSCALE) | ||
53 | |||
54 | static void icedcc_putc(int ch) | ||
55 | { | ||
56 | int status, i = 0x4000000; | ||
57 | |||
58 | do { | ||
59 | if (--i < 0) | ||
60 | return; | ||
61 | |||
62 | asm volatile ("mrc p14, 0, %0, c14, c0, 0" : "=r" (status)); | ||
63 | } while (status & (1 << 28)); | ||
64 | |||
65 | asm("mcr p14, 0, %0, c8, c0, 0" : : "r" (ch)); | ||
66 | } | ||
49 | 67 | ||
50 | #else | 68 | #else |
51 | 69 | ||
diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in index 153a07e7222b..a5924b9b88bd 100644 --- a/arch/arm/boot/compressed/vmlinux.lds.in +++ b/arch/arm/boot/compressed/vmlinux.lds.in | |||
@@ -11,6 +11,11 @@ OUTPUT_ARCH(arm) | |||
11 | ENTRY(_start) | 11 | ENTRY(_start) |
12 | SECTIONS | 12 | SECTIONS |
13 | { | 13 | { |
14 | /DISCARD/ : { | ||
15 | *(.ARM.exidx*) | ||
16 | *(.ARM.extab*) | ||
17 | } | ||
18 | |||
14 | . = TEXT_START; | 19 | . = TEXT_START; |
15 | _text = .; | 20 | _text = .; |
16 | 21 | ||