11.1Snisimura/*- 21.1Snisimura * Copyright (c) 2012 The NetBSD Foundation, Inc. 31.1Snisimura * All rights reserved. 41.1Snisimura * 51.1Snisimura * This code is derived from software contributed to The NetBSD Foundation 61.1Snisimura * by Paul Fleischer <paul@xpg.dk> 71.1Snisimura * 81.1Snisimura * Redistribution and use in source and binary forms, with or without 91.1Snisimura * modification, are permitted provided that the following conditions 101.1Snisimura * are met: 111.1Snisimura * 1. Redistributions of source code must retain the above copyright 121.1Snisimura * notice, this list of conditions and the following disclaimer. 131.1Snisimura * 2. Redistributions in binary form must reproduce the above copyright 141.1Snisimura * notice, this list of conditions and the following disclaimer in the 151.1Snisimura * documentation and/or other materials provided with the distribution. 161.1Snisimura * 171.1Snisimura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 181.1Snisimura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 191.1Snisimura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 201.1Snisimura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 211.1Snisimura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 221.1Snisimura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 231.1Snisimura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 241.1Snisimura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 251.1Snisimura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 261.1Snisimura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 271.1Snisimura * POSSIBILITY OF SUCH DAMAGE. 281.1Snisimura */ 291.1Snisimura 301.1Snisimura#define _LOCORE 311.1Snisimura#define _KERNEL 321.1Snisimura 331.1Snisimura#include <machine/asm.h> 341.1Snisimura#include <arm/armreg.h> 351.1Snisimura#include <arm/arm32/pte.h> 361.1Snisimura#include <arm/arm32/pmap.h> /* for PMAP_DOMAIN_KERNEL */ 371.1Snisimura 381.1Snisimura#include <arm/s3c2xx0/s3c2440reg.h> /* for S3C2440_SDRAM_START */ 391.1Snisimura 401.1Snisimura#ifndef SDRAM_START 411.1Snisimura#define SDRAM_START S3C2440_SDRAM_START 421.1Snisimura#endif 431.2Snisimura 441.2Snisimura/* LED1/2/3/4 are manipulated by GPIO B5/6/7/8. */ 451.1Snisimura#define LED1 (1<<5) 461.1Snisimura#define LED2 (1<<6) 471.1Snisimura#define LED3 (1<<7) 481.1Snisimura#define LED4 (1<<8) 491.1Snisimura 501.1Snisimura .text 511.1Snisimura .global _start 521.1Snisimura_start: 531.1Snisimura /* Get arguments from boot-loader (stored in r0 and r1) */ 541.2Snisimura adr r2, Largs 551.1Snisimura stmia r2, {r0, r1} 561.1Snisimura 571.1Snisimura /* Disable interrupt */ 581.1Snisimura mrs r0, cpsr 591.1Snisimura orr r0, r0, #I32_bit 601.1Snisimura msr cpsr, r0 611.1Snisimura 621.1Snisimura /* Turn off all LEDS except LED2 */ 631.1Snisimura mov r1, #S3C2440_GPIO_BASE 641.1Snisimura add r1, r1, #0x14 651.1Snisimura ldr r3, [r1] 661.1Snisimura orr r3, r3, #LED1 /* LEDS are active-low, so we set their bit to turn them off */ 671.1Snisimura bic r3, r3, #LED2 681.1Snisimura orr r3, r3, #LED3 691.1Snisimura orr r3, r3, #LED4 701.1Snisimura str r3, [r1] 711.1Snisimura 721.1Snisimura /* Setup BANK6/7 memory map */ 731.1Snisimura mov r1, #S3C2440_MEMCTL_BASE 741.1Snisimura ldr r2, [r1, #MEMCTL_BANKSIZE] 751.1Snisimura bic r2, r2, #0x7 /* Clear the three lowest bits (BK67MAP) */ 761.1Snisimura add r2, r2, #0x1 /* Set BK67MAP to b001 = 64MB/64MB */ 771.1Snisimura str r2, [r1, #MEMCTL_BANKSIZE] 781.1Snisimura 791.1Snisimura /* Disable MMU for a while */ 801.1Snisimura mrc p15, 0, r2, c1, c0, 0 811.1Snisimura bic r2, r2, #CPU_CONTROL_MMU_ENABLE 821.1Snisimura mcr p15, 0, r2, c1, c0, 0 831.1Snisimura 841.1Snisimura nop 851.1Snisimura nop 861.1Snisimura nop 871.1Snisimura 881.1Snisimura ldr r0, LpageTable /* pagetable */ 891.1Snisimura adr r4, mmu_init_table 901.1Snisimura b 2f 911.1Snisimura1: 921.1Snisimura str r3, [r0, r2] 931.1Snisimura add r2, r2, #4 941.1Snisimura add r3, r3, #(L1_S_SIZE) 951.1Snisimura adds r1, r1, #-1 961.1Snisimura bhi 1b 971.1Snisimura2: 981.1Snisimura ldmia r4!, {r1,r2,r3} /* # of sections, PA|attr, VA */ 991.1Snisimura cmp r1, #0 1001.1Snisimura bne 1b 1011.1Snisimura 1021.1Snisimura mcr p15, 0, r0, c2, c0, 0 /* Set TTB */ 1031.1Snisimura mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */ 1041.1Snisimura 1051.1Snisimura /* Set the Domain Access register. Very important! */ 1061.1Snisimura mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT) 1071.1Snisimura mcr p15, 0, r0, c3, c0, 0 1081.1Snisimura 1091.1Snisimura /* Enable MMU */ 1101.1Snisimura mrc p15, 0, r0, c1, c0, 0 1111.1Snisimura orr r0, r0, #CPU_CONTROL_MMU_ENABLE 1121.1Snisimura mcr p15, 0, r0, c1, c0, 0 1131.1Snisimura 1141.1Snisimura nop 1151.1Snisimura nop 1161.1Snisimura nop 1171.1Snisimura 1181.1Snisimura /* Prepare stack */ 1191.1Snisimura adr r1, Lcrtsetup 1201.1Snisimura ldmia r1, {r1, r2, sp} 1211.1Snisimura sub r2, r2, r1 /* get zero init data */ 1221.1Snisimura mov r3, #0 1231.1Snisimura.L1: 1241.1Snisimura str r3, [r1], #0x0004 /* zero the bss */ 1251.1Snisimura subs r2, r2, #4 1261.1Snisimura bgt .L1 1271.1Snisimura 1281.1Snisimura 1291.2Snisimura adr r2, Largs 1301.1Snisimura ldmia r2, {r0, r1} 1311.1Snisimura 1321.1Snisimura /* Jump to kernel code in TRUE VA */ 1331.1Snisimura ldr pc, Lstart 1341.1Snisimura 1351.1SnisimuraLstart: 1361.1Snisimura .word main 1371.1Snisimura 1381.1Snisimura#define MMU_INIT(va,pa,n_sec,attr) \ 1391.1Snisimura .word n_sec ; \ 1401.1Snisimura .word 4*((va)>>L1_S_SHIFT) ; \ 1411.1Snisimura .word (pa)|(attr) ; 1421.1Snisimura 1431.1Snisimurammu_init_table: 1441.1Snisimura /* fill all table VA==PA */ 1451.1Snisimura MMU_INIT(0x00000000, 0x00000000, 1<<(32-L1_S_SHIFT), L1_TYPE_S|L1_S_AP(AP_KRW)) 1461.1Snisimura /* map SDRAM VA==PA, WT cacheable */ 1471.1Snisimura MMU_INIT(SDRAM_START, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) 1481.1Snisimura /* map VA 0xc0000000..0xc3ffffff to PA 0x30000000..0x33ffffff */ 1491.1Snisimura MMU_INIT(0xc0000000, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) 1501.1Snisimura 1511.1Snisimura .word 0 /* end of table */ 1521.1Snisimura 1531.1SnisimuraLpageTable: 1541.1Snisimura .word 0x30000000 1551.1SnisimuraLcrtsetup: 1561.1Snisimura .word _edata /* Start of BSS */ 1571.1Snisimura .word _end /* End of BSS */ 1581.1Snisimura .word 0x30A00000 /* Place stack-bottom at load-point of libsa bootloader */ 1591.1Snisimura 1601.2SnisimuraLargs: 1611.2Snisimura .space 8 /* to save r0/r1 registers */ 162