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 | 15 | ||||
| -rw-r--r-- | arch/arm/boot/compressed/vmlinux.lds.in | 5 |
3 files changed, 64 insertions, 0 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..393c81641314 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
| @@ -46,6 +46,21 @@ static void icedcc_putc(int ch) | |||
| 46 | 46 | ||
| 47 | asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch)); | 47 | asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch)); |
| 48 | } | 48 | } |
| 49 | #elif defined(CONFIG_CPU_XSCALE) | ||
| 50 | |||
| 51 | static void icedcc_putc(int ch) | ||
| 52 | { | ||
| 53 | int status, i = 0x4000000; | ||
| 54 | |||
| 55 | do { | ||
| 56 | if (--i < 0) | ||
| 57 | return; | ||
| 58 | |||
| 59 | asm volatile ("mrc p14, 0, %0, c14, c0, 0" : "=r" (status)); | ||
| 60 | } while (status & (1 << 28)); | ||
| 61 | |||
| 62 | asm("mcr p14, 0, %0, c8, c0, 0" : : "r" (ch)); | ||
| 63 | } | ||
| 49 | 64 | ||
| 50 | #else | 65 | #else |
| 51 | 66 | ||
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 | ||
