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