smdk2410_start.S revision 1.4
11.4Sbsh/* $NetBSD: smdk2410_start.S,v 1.4 2003/08/29 12:41:12 bsh Exp $ */ 21.1Sbsh 31.1Sbsh/* 41.1Sbsh * Copyright (c) 2002, 2003 Fujitsu Component Limited 51.1Sbsh * Copyright (c) 2002, 2003 Genetec Corporation 61.1Sbsh * All rights reserved. 71.1Sbsh * 81.1Sbsh * Redistribution and use in source and binary forms, with or without 91.1Sbsh * modification, are permitted provided that the following conditions 101.1Sbsh * are met: 111.1Sbsh * 1. Redistributions of source code must retain the above copyright 121.1Sbsh * notice, this list of conditions and the following disclaimer. 131.1Sbsh * 2. Redistributions in binary form must reproduce the above copyright 141.1Sbsh * notice, this list of conditions and the following disclaimer in the 151.1Sbsh * documentation and/or other materials provided with the distribution. 161.1Sbsh * 3. Neither the name of The Fujitsu Component Limited nor the name of 171.1Sbsh * Genetec corporation may not be used to endorse or promote products 181.1Sbsh * derived from this software without specific prior written permission. 191.1Sbsh * 201.1Sbsh * THIS SOFTWARE IS PROVIDED BY FUJITSU COMPONENT LIMITED AND GENETEC 211.1Sbsh * CORPORATION ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 221.1Sbsh * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 231.1Sbsh * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 241.1Sbsh * DISCLAIMED. IN NO EVENT SHALL FUJITSU COMPONENT LIMITED OR GENETEC 251.1Sbsh * CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 261.1Sbsh * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 271.1Sbsh * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 281.1Sbsh * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 291.1Sbsh * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 301.1Sbsh * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 311.1Sbsh * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 321.1Sbsh * SUCH DAMAGE. 331.1Sbsh */ 341.1Sbsh 351.1Sbsh#include <machine/asm.h> 361.1Sbsh#include <arm/armreg.h> 371.1Sbsh#include <arm/arm32/pte.h> 381.1Sbsh#include <arm/arm32/pmap.h> /* for PMAP_DOMAIN_KERNEL */ 391.1Sbsh 401.1Sbsh#include <arm/s3c2xx0/s3c2410reg.h> /* for S3C2410_SDRAM_START */ 411.4Sbsh#include "opt_smdk2xx0.h" /* SMDK2XX0_CLOCK_CONFIG */ 421.1Sbsh 431.1Sbsh/* 441.1Sbsh * Kernel start routine for Samsung SMDK2410. 451.1Sbsh * This code is excuted at the very first after the kernel is loaded 461.1Sbsh * by boot program. 471.1Sbsh */ 481.1Sbsh .text 491.1Sbsh 501.1Sbsh#ifndef SDRAM_START 511.1Sbsh#define SDRAM_START S3C2410_SDRAM_START 521.1Sbsh#endif 531.1Sbsh#define KERNEL_TEXT_ADDR (SDRAM_START+0x00200000) 541.1Sbsh 551.1Sbsh .global _C_LABEL(smdk2410_start) 561.1Sbsh_C_LABEL(smdk2410_start): 571.2Sbsh /* Disable interrupt */ 581.2Sbsh mrs r0, cpsr 591.2Sbsh orr r0, r0, #I32_bit 601.2Sbsh msr cpsr, r0 611.2Sbsh 621.4Sbsh#ifdef SMDK2XX0_CLOCK_CONFIG 631.4Sbsh adr r4, clock_config_data 641.4Sbsh 651.4Sbsh mov r2, #S3C2410_CLKMAN_BASE 661.4Sbsh ldr r1, [r2, #CLKMAN_CLKSLOW] 671.4Sbsh orr r0, r1, #CLKSLOW_SLOW 681.4Sbsh str r0, [r2, #CLKMAN_CLKSLOW] 691.4Sbsh nop 701.4Sbsh nop 711.4Sbsh 721.4Sbsh ldmia r4, {r0,r3} 731.4Sbsh str r0, [r2, #CLKMAN_CLKDIVN] 741.4Sbsh 751.4Sbsh str r3, [r2, #CLKMAN_MPLLCON] 761.4Sbsh nop 771.4Sbsh nop 781.4Sbsh 791.4Sbsh str r1, [r2, #CLKMAN_CLKSLOW] 801.4Sbsh#endif 811.4Sbsh 821.1Sbsh /* Are we running on right place ? */ 831.1Sbsh adr r0, _C_LABEL(smdk2410_start) 841.1Sbsh ldr r2, =KERNEL_TEXT_ADDR 851.1Sbsh cmp r0, r2 861.1Sbsh beq smdk2410_start_ram 871.1Sbsh 881.1Sbsh /* 891.1Sbsh * move me to RAM 901.1Sbsh */ 911.1Sbsh ldr r1, Lcopy_size 921.1Sbsh adr r0, _C_LABEL(smdk2410_start) 931.1Sbsh add r1, r1, #3 941.1Sbsh mov r1, r1, LSR #2 951.1Sbsh mov r4, r2 961.1Sbsh 971.1Sbsh cmp r0, r2 981.1Sbsh bhs 5f 991.1Sbsh 1001.1Sbsh /* src < dest. copy from top */ 1011.1Sbsh add r0,r0,r1,LSL #2 1021.1Sbsh add r2,r2,r1,LSL #2 1031.1Sbsh 1041.1Sbsh3: ldr r3,[r0,#-4]! 1051.1Sbsh str r3,[r2,#-4]! 1061.1Sbsh subs r1,r1,#1 1071.1Sbsh bhi 3b 1081.1Sbsh b 7f 1091.1Sbsh 1101.1Sbsh /* src >= dest. copy from bottom */ 1111.1Sbsh5: ldr r3,[r0],#4 1121.1Sbsh str r3,[r2],#4 1131.1Sbsh subs r1,r1,#1 1141.1Sbsh bhi 5b 1151.1Sbsh 1161.1Sbsh7: 1171.1Sbsh /* Jump to RAM */ 1181.1Sbsh ldr r0, Lstart_off 1191.1Sbsh add pc, r4, r0 1201.1Sbsh 1211.1SbshLcopy_size: .word _edata-_C_LABEL(smdk2410_start) 1221.1SbshLstart_off: .word smdk2410_start_ram-_C_LABEL(smdk2410_start) 1231.1Sbsh 1241.1Sbshsmdk2410_start_ram: 1251.1Sbsh /* 1261.3Sbsh * Kernel is loaded in SDRAM (0x30200000..), and is expected to run 1271.1Sbsh * in VA 0xc0200000.. 1281.1Sbsh */ 1291.1Sbsh 1301.1Sbsh /* Disable MMU for a while */ 1311.1Sbsh mrc p15, 0, r2, c1, c0, 0 1321.1Sbsh bic r2, r2, #CPU_CONTROL_MMU_ENABLE 1331.1Sbsh mcr p15, 0, r2, c1, c0, 0 1341.1Sbsh 1351.1Sbsh nop 1361.1Sbsh nop 1371.1Sbsh nop 1381.1Sbsh 1391.1Sbsh mov r0,#SDRAM_START /* pagetable */ 1401.1Sbsh adr r4, mmu_init_table 1411.1Sbsh b 2f 1421.1Sbsh1: 1431.1Sbsh str r3, [r0, r2] 1441.1Sbsh add r2, r2, #4 1451.1Sbsh add r3, r3, #(L1_S_SIZE) 1461.1Sbsh adds r1, r1, #-1 1471.1Sbsh bhi 1b 1481.1Sbsh2: 1491.1Sbsh ldmia r4!, {r1,r2,r3} /* # of sections, PA|attr, VA */ 1501.1Sbsh cmp r1, #0 1511.1Sbsh bne 1b 1521.1Sbsh 1531.1Sbsh mcr p15, 0, r0, c2, c0, 0 /* Set TTB */ 1541.1Sbsh mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */ 1551.1Sbsh 1561.1Sbsh /* Set the Domain Access register. Very important! */ 1571.1Sbsh mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT) 1581.1Sbsh mcr p15, 0, r0, c3, c0, 0 1591.1Sbsh 1601.1Sbsh /* Enable MMU */ 1611.1Sbsh mrc p15, 0, r0, c1, c0, 0 1621.1Sbsh orr r0, r0, #CPU_CONTROL_MMU_ENABLE 1631.1Sbsh mcr p15, 0, r0, c1, c0, 0 1641.1Sbsh 1651.1Sbsh nop 1661.1Sbsh nop 1671.1Sbsh nop 1681.1Sbsh 1691.1Sbsh /* Jump to kernel code in TRUE VA */ 1701.1Sbsh adr r0, Lstart 1711.1Sbsh ldr pc, [r0] 1721.1Sbsh 1731.1SbshLstart: 1741.1Sbsh .word start 1751.4Sbsh 1761.4Sbsh .macro clock_data hdivn, pdivn, mdiv, pdiv, sdiv 1771.4Sbsh .word (\hdivn)<<1 | \pdivn 1781.4Sbsh .word (\mdiv)<<PLLCON_MDIV_SHIFT | (\pdiv)<<PLLCON_PDIV_SHIFT | (\sdiv)<<PLLCON_SDIV_SHIFT 1791.4Sbsh .endm 1801.4Sbsh#ifdef SMDK2XX0_CLOCK_CONFIG 1811.4Sbshclock_config_data: 1821.4Sbsh clock_data SMDK2XX0_CLOCK_CONFIG 1831.4Sbsh#endif 1841.1Sbsh 1851.1Sbsh#define MMU_INIT(va,pa,n_sec,attr) \ 1861.1Sbsh .word n_sec ; \ 1871.1Sbsh .word 4*((va)>>L1_S_SHIFT) ; \ 1881.1Sbsh .word (pa)|(attr) ; 1891.1Sbsh 1901.1Sbshmmu_init_table: 1911.1Sbsh /* fill all table VA==PA */ 1921.1Sbsh MMU_INIT(0x00000000, 0x00000000, 1<<(32-L1_S_SHIFT), L1_TYPE_S|L1_S_AP(AP_KRW)) 1931.1Sbsh /* map SDRAM VA==PA, WT cacheable */ 1941.1Sbsh MMU_INIT(SDRAM_START, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) 1951.1Sbsh /* map VA 0xc0000000..0xc3ffffff to PA 0x30000000..0x33ffffff */ 1961.1Sbsh MMU_INIT(0xc0000000, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) 1971.1Sbsh 1981.1Sbsh .word 0 /* end of table */ 1991.1Sbsh 200