xref: /rk3399_ARM-atf/plat/marvell/armada/a8k/common/aarch64/plat_helpers.S (revision 9935047b2086faa3bf3ccf0b95a76510eb5a160b)
1*a2847172SGrzegorz Jaszczyk/*
2*a2847172SGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd.
3*a2847172SGrzegorz Jaszczyk *
4*a2847172SGrzegorz Jaszczyk * SPDX-License-Identifier:     BSD-3-Clause
5*a2847172SGrzegorz Jaszczyk * https://spdx.org/licenses
6*a2847172SGrzegorz Jaszczyk */
7*a2847172SGrzegorz Jaszczyk
8*a2847172SGrzegorz Jaszczyk#include <asm_macros.S>
9*a2847172SGrzegorz Jaszczyk#include <platform_def.h>
10*a2847172SGrzegorz Jaszczyk#include <marvell_pm.h>
11*a2847172SGrzegorz Jaszczyk
12*a2847172SGrzegorz Jaszczyk	.globl	plat_secondary_cold_boot_setup
13*a2847172SGrzegorz Jaszczyk	.globl	plat_get_my_entrypoint
14*a2847172SGrzegorz Jaszczyk	.globl	plat_is_my_cpu_primary
15*a2847172SGrzegorz Jaszczyk	.globl  plat_reset_handler
16*a2847172SGrzegorz Jaszczyk
17*a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
18*a2847172SGrzegorz Jaszczyk	 * void plat_secondary_cold_boot_setup (void);
19*a2847172SGrzegorz Jaszczyk	 *
20*a2847172SGrzegorz Jaszczyk	 * This function performs any platform specific actions
21*a2847172SGrzegorz Jaszczyk	 * needed for a secondary cpu after a cold reset. Right
22*a2847172SGrzegorz Jaszczyk	 * now this is a stub function.
23*a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
24*a2847172SGrzegorz Jaszczyk	 */
25*a2847172SGrzegorz Jaszczykfunc plat_secondary_cold_boot_setup
26*a2847172SGrzegorz Jaszczyk	mov	x0, #0
27*a2847172SGrzegorz Jaszczyk	ret
28*a2847172SGrzegorz Jaszczykendfunc plat_secondary_cold_boot_setup
29*a2847172SGrzegorz Jaszczyk
30*a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------------------------------
31*a2847172SGrzegorz Jaszczyk	 * unsigned long plat_get_my_entrypoint (void);
32*a2847172SGrzegorz Jaszczyk	 *
33*a2847172SGrzegorz Jaszczyk	 * Main job of this routine is to distinguish
34*a2847172SGrzegorz Jaszczyk	 * between a cold and warm boot
35*a2847172SGrzegorz Jaszczyk	 * For a cold boot, return 0.
36*a2847172SGrzegorz Jaszczyk	 * For a warm boot, read the mailbox and return the address it contains.
37*a2847172SGrzegorz Jaszczyk	 *
38*a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------------------------------
39*a2847172SGrzegorz Jaszczyk	 */
40*a2847172SGrzegorz Jaszczykfunc plat_get_my_entrypoint
41*a2847172SGrzegorz Jaszczyk	/* Read first word and compare it with magic num */
42*a2847172SGrzegorz Jaszczyk	mov_imm x0, PLAT_MARVELL_MAILBOX_BASE
43*a2847172SGrzegorz Jaszczyk	ldr     x1, [x0]
44*a2847172SGrzegorz Jaszczyk	mov_imm x2, MVEBU_MAILBOX_MAGIC_NUM
45*a2847172SGrzegorz Jaszczyk	cmp     x1, x2
46*a2847172SGrzegorz Jaszczyk	beq     warm_boot  /* If compare failed, return 0, i.e. cold boot */
47*a2847172SGrzegorz Jaszczyk	mov     x0, #0
48*a2847172SGrzegorz Jaszczyk	ret
49*a2847172SGrzegorz Jaszczykwarm_boot:
50*a2847172SGrzegorz Jaszczyk	mov_imm x1, MBOX_IDX_SEC_ADDR		/* Get the jump address */
51*a2847172SGrzegorz Jaszczyk	subs	x1, x1, #1
52*a2847172SGrzegorz Jaszczyk	mov	x2, #(MBOX_IDX_SEC_ADDR * 8)
53*a2847172SGrzegorz Jaszczyk	lsl	x3, x2, x1
54*a2847172SGrzegorz Jaszczyk	add     x0, x0, x3
55*a2847172SGrzegorz Jaszczyk	ldr     x0, [x0]
56*a2847172SGrzegorz Jaszczyk	ret
57*a2847172SGrzegorz Jaszczykendfunc plat_get_my_entrypoint
58*a2847172SGrzegorz Jaszczyk
59*a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
60*a2847172SGrzegorz Jaszczyk	 * unsigned int plat_is_my_cpu_primary (void);
61*a2847172SGrzegorz Jaszczyk	 *
62*a2847172SGrzegorz Jaszczyk	 * Find out whether the current cpu is the primary
63*a2847172SGrzegorz Jaszczyk	 * cpu.
64*a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
65*a2847172SGrzegorz Jaszczyk	 */
66*a2847172SGrzegorz Jaszczykfunc plat_is_my_cpu_primary
67*a2847172SGrzegorz Jaszczyk	mrs	x0, mpidr_el1
68*a2847172SGrzegorz Jaszczyk	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
69*a2847172SGrzegorz Jaszczyk	cmp	x0, #MVEBU_PRIMARY_CPU
70*a2847172SGrzegorz Jaszczyk	cset	w0, eq
71*a2847172SGrzegorz Jaszczyk	ret
72*a2847172SGrzegorz Jaszczykendfunc plat_is_my_cpu_primary
73*a2847172SGrzegorz Jaszczyk
74*a2847172SGrzegorz Jaszczyk        /* -----------------------------------------------------
75*a2847172SGrzegorz Jaszczyk	 * void plat_reset_handler (void);
76*a2847172SGrzegorz Jaszczyk         *
77*a2847172SGrzegorz Jaszczyk	 * Platform specific configuration right after cpu is
78*a2847172SGrzegorz Jaszczyk	 * is our of reset.
79*a2847172SGrzegorz Jaszczyk	 *
80*a2847172SGrzegorz Jaszczyk         * The plat_reset_handler can clobber x0 - x18, x30.
81*a2847172SGrzegorz Jaszczyk         * -----------------------------------------------------
82*a2847172SGrzegorz Jaszczyk         */
83*a2847172SGrzegorz Jaszczykfunc plat_reset_handler
84*a2847172SGrzegorz Jaszczyk	/*
85*a2847172SGrzegorz Jaszczyk	 * Note: the configurations below  should be done before MMU,
86*a2847172SGrzegorz Jaszczyk	 *	  I Cache and L2are enabled.
87*a2847172SGrzegorz Jaszczyk	 *	  The reset handler is executed right after reset
88*a2847172SGrzegorz Jaszczyk	 * 	  and before Caches are enabled.
89*a2847172SGrzegorz Jaszczyk	 */
90*a2847172SGrzegorz Jaszczyk
91*a2847172SGrzegorz Jaszczyk	/* Enable L1/L2 ECC and Parity */
92*a2847172SGrzegorz Jaszczyk	mrs x5, s3_1_c11_c0_2  /* L2 Ctrl */
93*a2847172SGrzegorz Jaszczyk	orr x5, x5, #(1 << 21) /* Enable L1/L2 cache ECC & Parity */
94*a2847172SGrzegorz Jaszczyk	msr s3_1_c11_c0_2, x5  /* L2 Ctrl */
95*a2847172SGrzegorz Jaszczyk
96*a2847172SGrzegorz Jaszczyk#if LLC_ENABLE
97*a2847172SGrzegorz Jaszczyk	/*
98*a2847172SGrzegorz Jaszczyk	 * Enable L2 UniqueClean evictions
99*a2847172SGrzegorz Jaszczyk	 *  Note: this configuration assumes that LLC is configured
100*a2847172SGrzegorz Jaszczyk	 *	  in exclusive mode.
101*a2847172SGrzegorz Jaszczyk	 *	  Later on in the code this assumption will be validated
102*a2847172SGrzegorz Jaszczyk	 */
103*a2847172SGrzegorz Jaszczyk	mrs x5, s3_1_c15_c0_0  /* L2 Ctrl */
104*a2847172SGrzegorz Jaszczyk	orr x5, x5, #(1 << 14) /* Enable UniqueClean evictions with data */
105*a2847172SGrzegorz Jaszczyk	msr s3_1_c15_c0_0, x5  /* L2 Ctrl */
106*a2847172SGrzegorz Jaszczyk#endif
107*a2847172SGrzegorz Jaszczyk
108*a2847172SGrzegorz Jaszczyk	/* Instruction Barrier to allow msr command completion */
109*a2847172SGrzegorz Jaszczyk	isb
110*a2847172SGrzegorz Jaszczyk
111*a2847172SGrzegorz Jaszczyk        ret
112*a2847172SGrzegorz Jaszczykendfunc plat_reset_handler
113