^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/boot/compressed/head-sharpsl.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2004-2005 Richard Purdie <rpurdie@rpsys.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Sharp's bootloader doesn't pass any kind of machine ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * so we have to figure out the machine for ourselves...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Support for Poodle, Corgi (SL-C700), Shepherd (SL-C750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Husky (SL-C760), Tosa (SL-C6000), Spitz (SL-C3000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Akita (SL-C1000) and Borzoi (SL-C3100).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/mach-types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifndef CONFIG_PXA_SHARPSL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #error What am I doing here...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) .section ".start", "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) __SharpSL_start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* Check for TC6393 - if found we have a Tosa */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ldr r7, .TOSAID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) mov r1, #0x10000000 @ Base address of TC6393 chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) mov r6, #0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) ldrh r3, [r1, #8] @ Load TC6393XB Revison: This is 0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) cmp r6, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) beq .SHARPEND @ Success -> tosa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* Check for pxa270 - if found, branch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) mrc p15, 0, r4, c0, c0 @ Get Processor ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) and r4, r4, #0xffffff00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ldr r3, .PXA270ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) cmp r4, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) beq .PXA270
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* Check for w100 - if not found we have a Poodle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ldr r1, .W100ADDR @ Base address of w100 chip + regs offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) mov r6, #0x31 @ Load Magic Init value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) str r6, [r1, #0x280] @ to SCRATCH_UMSK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) mov r5, #0x3000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .W100LOOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) subs r5, r5, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) bne .W100LOOP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) mov r6, #0x30 @ Load 2nd Magic Init value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) str r6, [r1, #0x280] @ to SCRATCH_UMSK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ldr r6, [r1, #0] @ Load Chip ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ldr r3, .W100ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ldr r7, .POODLEID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) cmp r6, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) bne .SHARPEND @ We have no w100 - Poodle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* Check for pxa250 - if found we have a Corgi */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ldr r7, .CORGIID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ldr r3, .PXA255ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) cmp r4, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) blo .SHARPEND @ We have a PXA250 - Corgi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Check for 64MiB flash - if found we have a Shepherd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) bl get_flash_ids
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ldr r7, .SHEPHERDID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) cmp r3, #0x76 @ 64MiB flash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) beq .SHARPEND @ We have Shepherd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Must be a Husky */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ldr r7, .HUSKYID @ Must be Husky
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) b .SHARPEND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .PXA270:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /* Check for 16MiB flash - if found we have Spitz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) bl get_flash_ids
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ldr r7, .SPITZID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) cmp r3, #0x73 @ 16MiB flash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) beq .SHARPEND @ We have Spitz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* Check for a second SCOOP chip - if found we have Borzoi */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ldr r1, .SCOOP2ADDR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ldr r7, .BORZOIID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) mov r6, #0x0140
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) strh r6, [r1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) ldrh r6, [r1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) cmp r6, #0x0140
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) beq .SHARPEND @ We have Borzoi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* Must be Akita */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) ldr r7, .AKITAID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) b .SHARPEND @ We have Borzoi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .PXA255ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .word 0x69052d00 @ PXA255 Processor ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .PXA270ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .word 0x69054100 @ PXA270 Processor ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .W100ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .word 0x57411002 @ w100 Chip ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .W100ADDR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .word 0x08010000 @ w100 Chip ID Reg Address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .SCOOP2ADDR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .word 0x08800040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .POODLEID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .word MACH_TYPE_POODLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .CORGIID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .word MACH_TYPE_CORGI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) .SHEPHERDID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .word MACH_TYPE_SHEPHERD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .HUSKYID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .word MACH_TYPE_HUSKY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .TOSAID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .word MACH_TYPE_TOSA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .SPITZID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) .word MACH_TYPE_SPITZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .AKITAID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .word MACH_TYPE_AKITA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .BORZOIID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .word MACH_TYPE_BORZOI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * Return: r2 - NAND Manufacturer ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * r3 - NAND Chip ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * Corrupts: r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) get_flash_ids:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) mov r1, #0x0c000000 @ Base address of NAND chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) ldrb r3, [r1, #24] @ Load FLASHCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) bic r3, r3, #0x11 @ SET NCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) orr r3, r3, #0x0a @ SET CLR + FLWP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) strb r3, [r1, #24] @ Save to FLASHCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) mov r2, #0x90 @ Command "readid"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) strb r2, [r1, #20] @ Save to FLASHIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) bic r3, r3, #2 @ CLR CLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) orr r3, r3, #4 @ SET ALE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) strb r3, [r1, #24] @ Save to FLASHCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) mov r2, #0 @ Address 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) strb r2, [r1, #20] @ Save to FLASHIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) bic r3, r3, #4 @ CLR ALE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) strb r3, [r1, #24] @ Save to FLASHCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .fids1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ldrb r3, [r1, #24] @ Load FLASHCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) tst r3, #32 @ Is chip ready?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) beq .fids1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) ldrb r2, [r1, #20] @ NAND Manufacturer ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ldrb r3, [r1, #20] @ NAND Chip ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) mov pc, lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) .SHARPEND: