Home | History | Annotate | Line # | Download | only in armadaxp
armadaxp_start.S revision 1.1
      1  1.1  rkujawa /*******************************************************************************
      2  1.1  rkujawa Copyright (C) Marvell International Ltd. and its affiliates
      3  1.1  rkujawa 
      4  1.1  rkujawa Developed by Semihalf
      5  1.1  rkujawa 
      6  1.1  rkujawa ********************************************************************************
      7  1.1  rkujawa Marvell BSD License
      8  1.1  rkujawa 
      9  1.1  rkujawa If you received this File from Marvell, you may opt to use, redistribute and/or
     10  1.1  rkujawa modify this File under the following licensing terms.
     11  1.1  rkujawa Redistribution and use in source and binary forms, with or without modification,
     12  1.1  rkujawa are permitted provided that the following conditions are met:
     13  1.1  rkujawa 
     14  1.1  rkujawa     *   Redistributions of source code must retain the above copyright notice,
     15  1.1  rkujawa             this list of conditions and the following disclaimer.
     16  1.1  rkujawa 
     17  1.1  rkujawa     *   Redistributions in binary form must reproduce the above copyright
     18  1.1  rkujawa         notice, this list of conditions and the following disclaimer in the
     19  1.1  rkujawa         documentation and/or other materials provided with the distribution.
     20  1.1  rkujawa 
     21  1.1  rkujawa     *   Neither the name of Marvell nor the names of its contributors may be
     22  1.1  rkujawa         used to endorse or promote products derived from this software without
     23  1.1  rkujawa         specific prior written permission.
     24  1.1  rkujawa 
     25  1.1  rkujawa THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     26  1.1  rkujawa ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     27  1.1  rkujawa WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     28  1.1  rkujawa DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     29  1.1  rkujawa ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     30  1.1  rkujawa (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     31  1.1  rkujawa LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     32  1.1  rkujawa ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     33  1.1  rkujawa (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     34  1.1  rkujawa SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     35  1.1  rkujawa 
     36  1.1  rkujawa *******************************************************************************/
     37  1.1  rkujawa 
     38  1.1  rkujawa #include "opt_cputypes.h"
     39  1.1  rkujawa 
     40  1.1  rkujawa #include <machine/asm.h>
     41  1.1  rkujawa #include <arm/armreg.h>
     42  1.1  rkujawa #include <arm/arm32/pmap.h>
     43  1.1  rkujawa 
     44  1.1  rkujawa RCSID("$NetBSD: armadaxp_start.S,v 1.1 2013/05/29 19:55:56 rkujawa Exp $")
     45  1.1  rkujawa 
     46  1.1  rkujawa #define	CPWAIT_BRANCH							 \
     47  1.1  rkujawa 	sub	pc, pc, #4
     48  1.1  rkujawa 
     49  1.1  rkujawa #define	CPWAIT(tmp)							 \
     50  1.1  rkujawa 	mrc	p15, 0, tmp, c2, c0, 0	/* arbitrary read of CP15 */	;\
     51  1.1  rkujawa 	mov	tmp, tmp		/* wait for it to complete */	;\
     52  1.1  rkujawa 	CPWAIT_BRANCH			/* branch to next insn */
     53  1.1  rkujawa 
     54  1.1  rkujawa /*
     55  1.1  rkujawa  * We don't want to hard-code some basic things like RAM start etc.
     56  1.1  rkujawa  * Hence, it is important to set the following options to resanoable values
     57  1.1  rkujawa  * in std.armadaxp configuration file.
     58  1.1  rkujawa  */
     59  1.1  rkujawa #if !defined(STARTUP_PAGETABLE_ADDR)
     60  1.1  rkujawa #error STARTUP_PAGETABLE_ADDR not defined. Please define it in std.armadaxp
     61  1.1  rkujawa #elif !defined(MEMSTART)
     62  1.1  rkujawa #error MEMSTART not defined. Please define it in std.armadaxp
     63  1.1  rkujawa #endif
     64  1.1  rkujawa 
     65  1.1  rkujawa 	.text
     66  1.1  rkujawa 
     67  1.1  rkujawa 	.global	_C_LABEL(armadaxp_start)
     68  1.1  rkujawa _C_LABEL(armadaxp_start):
     69  1.1  rkujawa 	/* Move into supervisor mode and disable IRQs/FIQs. */
     70  1.1  rkujawa 	mrs	r0, cpsr
     71  1.1  rkujawa 	bic	r0, r0, #PSR_MODE
     72  1.1  rkujawa 	orr	r0, r0, #(I32_bit | F32_bit)
     73  1.1  rkujawa 	msr	cpsr_c, r0
     74  1.1  rkujawa 
     75  1.1  rkujawa 	adr	r7, Lunmapped
     76  1.1  rkujawa 	bic	r7, r7, #0xf0000000
     77  1.1  rkujawa 	orr	r7, r7, #MEMSTART
     78  1.1  rkujawa disable_mmu:
     79  1.1  rkujawa 	/* Disable MMU for a while */
     80  1.1  rkujawa 	mrc     p15, 0, r2, c1, c0, 0
     81  1.1  rkujawa 	bic	r2, r2, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE |\
     82  1.1  rkujawa 	    CPU_CONTROL_WBUF_ENABLE)
     83  1.1  rkujawa 	bic	r2, r2, #(CPU_CONTROL_IC_ENABLE)
     84  1.1  rkujawa 	bic	r2, r2, #(CPU_CONTROL_BPRD_ENABLE)
     85  1.1  rkujawa 	mcr	p15, 0, r2, c1, c0, 0
     86  1.1  rkujawa 
     87  1.1  rkujawa 	nop
     88  1.1  rkujawa 	nop
     89  1.1  rkujawa 	nop
     90  1.1  rkujawa 	mov	pc, r7
     91  1.1  rkujawa Lunmapped:
     92  1.1  rkujawa 	/* build page table from scratch */
     93  1.1  rkujawa 	ldr	r0, Lstartup_pagetable
     94  1.1  rkujawa 	adr	r4, mmu_init_table
     95  1.1  rkujawa 	b	3f
     96  1.1  rkujawa 
     97  1.1  rkujawa 2:
     98  1.1  rkujawa 	str	r3, [r0, r2]
     99  1.1  rkujawa 	add	r2, r2, #4
    100  1.1  rkujawa 	add	r3, r3, #(L1_S_SIZE)
    101  1.1  rkujawa 	adds	r1, r1, #-1
    102  1.1  rkujawa 	bhi	2b
    103  1.1  rkujawa 3:
    104  1.1  rkujawa 	ldmia	r4!, {r1,r2,r3}   /* # of sections, VA, PA|attr */
    105  1.1  rkujawa 	cmp	r1, #0
    106  1.1  rkujawa 	adrne	r5, 2b
    107  1.1  rkujawa 	bicne	r5, r5, #0xf0000000
    108  1.1  rkujawa 	orrne	r5, r5, #MEMSTART
    109  1.1  rkujawa 	movne	pc, r5
    110  1.1  rkujawa 
    111  1.1  rkujawa 	mcr	p15, 0, r0, c2, c0, 0	/* Set TTB */
    112  1.1  rkujawa 	mcr	p15, 0, r0, c8, c7, 0	/* Flush TLB */
    113  1.1  rkujawa 
    114  1.1  rkujawa 	mov	r0, #0
    115  1.1  rkujawa 	mcr	p15, 0, r0, c13, c0, 1	/* Set ASID to 0 */
    116  1.1  rkujawa 
    117  1.1  rkujawa 	/* Set the Domain Access register.  Very important! */
    118  1.1  rkujawa 	mov	r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
    119  1.1  rkujawa 	mcr	p15, 0, r0, c3, c0, 0
    120  1.1  rkujawa 
    121  1.1  rkujawa 	/* Enable MMU */
    122  1.1  rkujawa 	mrc	p15, 0, r0, c1, c0, 0
    123  1.1  rkujawa 	orr	r0, r0, #CPU_CONTROL_XP_ENABLE
    124  1.1  rkujawa 	orr	r0, r0, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE)
    125  1.1  rkujawa 	mcr	p15, 0, r0, c1, c0, 0
    126  1.1  rkujawa 	nop
    127  1.1  rkujawa 	nop
    128  1.1  rkujawa 	nop
    129  1.1  rkujawa 	CPWAIT(r0)
    130  1.1  rkujawa 
    131  1.1  rkujawa 	/* Jump to kernel code in TRUE VA */
    132  1.1  rkujawa 	adr	r0, Lstart
    133  1.1  rkujawa 	ldr	pc, [r0]
    134  1.1  rkujawa Lstart:
    135  1.1  rkujawa 	.word	start
    136  1.1  rkujawa 
    137  1.1  rkujawa 	/* NOTREACHED */
    138  1.1  rkujawa Lstartup_pagetable:
    139  1.1  rkujawa 	.word	STARTUP_PAGETABLE_ADDR
    140  1.1  rkujawa 
    141  1.1  rkujawa #define MMU_INIT(va,pa,n_sec,attr) \
    142  1.1  rkujawa 	.word	n_sec					; \
    143  1.1  rkujawa 	.word	4*((va)>>L1_S_SHIFT)			; \
    144  1.1  rkujawa 	.word	(pa)|(attr)				;
    145  1.1  rkujawa 
    146  1.1  rkujawa mmu_init_table:
    147  1.1  rkujawa 	/* fill all table VA==PA */
    148  1.1  rkujawa 	/* map SDRAM VA==PA, WT cacheable */
    149  1.1  rkujawa 	MMU_INIT(0, 0, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
    150  1.1  rkujawa 	/* map VA 0xc0000000..0xc3ffffff to PA */
    151  1.1  rkujawa 	MMU_INIT(0xc0000000, 0, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
    152  1.1  rkujawa 	/*
    153  1.1  rkujawa 	 * In case of early start debugging it might be useful to map
    154  1.1  rkujawa 	 * SoC registers (for UART access).
    155  1.1  rkujawa 	 */
    156  1.1  rkujawa 	MMU_INIT(0xd0000000, 0xd0000000, 1, L1_TYPE_S|L1_S_PROTO|L1_S_AP(AP_KRW))
    157  1.1  rkujawa 	/* end of table */
    158  1.1  rkujawa 	MMU_INIT(0, 0, 0, 0)
    159