xref: /rk3399_ARM-atf/plat/rockchip/common/aarch32/plat_helpers.S (revision 338dbe2f1f4b98da260e556d3f0fbdd8123caf06)
182e18f89SHeiko Stuebner/*
282e18f89SHeiko Stuebner * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
382e18f89SHeiko Stuebner *
482e18f89SHeiko Stuebner * SPDX-License-Identifier: BSD-3-Clause
582e18f89SHeiko Stuebner */
682e18f89SHeiko Stuebner
782e18f89SHeiko Stuebner#include <platform_def.h>
882e18f89SHeiko Stuebner
982e18f89SHeiko Stuebner#include <arch.h>
1082e18f89SHeiko Stuebner#include <asm_macros.S>
1182e18f89SHeiko Stuebner#include <common/bl_common.h>
1282e18f89SHeiko Stuebner#include <cortex_a12.h>
1382e18f89SHeiko Stuebner#include <plat_private.h>
1482e18f89SHeiko Stuebner#include <plat_pmu_macros.S>
1582e18f89SHeiko Stuebner
1682e18f89SHeiko Stuebner	.globl	cpuson_entry_point
1782e18f89SHeiko Stuebner	.globl	cpuson_flags
1882e18f89SHeiko Stuebner	.globl	platform_cpu_warmboot
1982e18f89SHeiko Stuebner	.globl	plat_secondary_cold_boot_setup
2082e18f89SHeiko Stuebner	.globl	plat_report_exception
2182e18f89SHeiko Stuebner	.globl	plat_is_my_cpu_primary
2282e18f89SHeiko Stuebner	.globl	plat_my_core_pos
2382e18f89SHeiko Stuebner	.globl	plat_reset_handler
2482e18f89SHeiko Stuebner	.globl	plat_panic_handler
2582e18f89SHeiko Stuebner
2682e18f89SHeiko Stuebner	/*
2782e18f89SHeiko Stuebner	 * void plat_reset_handler(void);
2882e18f89SHeiko Stuebner	 *
2982e18f89SHeiko Stuebner	 * Determine the SOC type and call the appropriate reset
3082e18f89SHeiko Stuebner	 * handler.
3182e18f89SHeiko Stuebner	 *
3282e18f89SHeiko Stuebner	 */
3382e18f89SHeiko Stuebnerfunc plat_reset_handler
3482e18f89SHeiko Stuebner	bx	lr
3582e18f89SHeiko Stuebnerendfunc plat_reset_handler
3682e18f89SHeiko Stuebner
3782e18f89SHeiko Stuebnerfunc plat_my_core_pos
3882e18f89SHeiko Stuebner	ldcopr	r0, MPIDR
3982e18f89SHeiko Stuebner	and	r1, r0, #MPIDR_CPU_MASK
4082e18f89SHeiko Stuebner#ifdef PLAT_RK_MPIDR_CLUSTER_MASK
4182e18f89SHeiko Stuebner	and	r0, r0, #PLAT_RK_MPIDR_CLUSTER_MASK
4282e18f89SHeiko Stuebner#else
4382e18f89SHeiko Stuebner	and	r0, r0, #MPIDR_CLUSTER_MASK
4482e18f89SHeiko Stuebner#endif
4582e18f89SHeiko Stuebner	add	r0, r1, r0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT
4682e18f89SHeiko Stuebner	bx	lr
4782e18f89SHeiko Stuebnerendfunc plat_my_core_pos
4882e18f89SHeiko Stuebner
4982e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
5082e18f89SHeiko Stuebner	 * void plat_secondary_cold_boot_setup (void);
5182e18f89SHeiko Stuebner	 *
5282e18f89SHeiko Stuebner	 * This function performs any platform specific actions
5382e18f89SHeiko Stuebner	 * needed for a secondary cpu after a cold reset e.g
5482e18f89SHeiko Stuebner	 * mark the cpu's presence, mechanism to place it in a
5582e18f89SHeiko Stuebner	 * holding pen etc.
5682e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
5782e18f89SHeiko Stuebner	 */
5882e18f89SHeiko Stuebnerfunc plat_secondary_cold_boot_setup
5982e18f89SHeiko Stuebner	/* rk3288 does not do cold boot for secondary CPU */
6082e18f89SHeiko Stuebnercb_panic:
6182e18f89SHeiko Stuebner	b	cb_panic
6282e18f89SHeiko Stuebnerendfunc plat_secondary_cold_boot_setup
6382e18f89SHeiko Stuebner
6482e18f89SHeiko Stuebnerfunc plat_is_my_cpu_primary
6582e18f89SHeiko Stuebner	ldcopr	r0, MPIDR
6682e18f89SHeiko Stuebner#ifdef PLAT_RK_MPIDR_CLUSTER_MASK
6782e18f89SHeiko Stuebner	ldr	r1, =(PLAT_RK_MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
6882e18f89SHeiko Stuebner#else
6982e18f89SHeiko Stuebner	ldr	r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
7082e18f89SHeiko Stuebner#endif
7182e18f89SHeiko Stuebner	and	r0, r1
7282e18f89SHeiko Stuebner	cmp	r0, #PLAT_RK_PRIMARY_CPU
7382e18f89SHeiko Stuebner	moveq	r0, #1
7482e18f89SHeiko Stuebner	movne	r0, #0
7582e18f89SHeiko Stuebner	bx	lr
7682e18f89SHeiko Stuebnerendfunc plat_is_my_cpu_primary
7782e18f89SHeiko Stuebner
7882e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
7982e18f89SHeiko Stuebner	 * void plat_panic_handler(void)
8082e18f89SHeiko Stuebner	 * Call system reset function on panic. Set up an emergency stack so we
8182e18f89SHeiko Stuebner	 * can run C functions (it only needs to last for a few calls until we
8282e18f89SHeiko Stuebner	 * reboot anyway).
8382e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
8482e18f89SHeiko Stuebner	 */
8582e18f89SHeiko Stuebnerfunc plat_panic_handler
8682e18f89SHeiko Stuebner	bl	plat_set_my_stack
8782e18f89SHeiko Stuebner	b	rockchip_soc_soft_reset
8882e18f89SHeiko Stuebnerendfunc plat_panic_handler
8982e18f89SHeiko Stuebner
9082e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
9182e18f89SHeiko Stuebner	 * void platform_cpu_warmboot (void);
9282e18f89SHeiko Stuebner	 * cpus online or resume entrypoint
9382e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
9482e18f89SHeiko Stuebner	 */
9582e18f89SHeiko Stuebnerfunc platform_cpu_warmboot _align=16
9682e18f89SHeiko Stuebner	push	{ r4 - r7, lr }
9782e18f89SHeiko Stuebner	ldcopr	r0, MPIDR
9882e18f89SHeiko Stuebner	and	r5, r0, #MPIDR_CPU_MASK
9982e18f89SHeiko Stuebner#ifdef PLAT_RK_MPIDR_CLUSTER_MASK
10082e18f89SHeiko Stuebner	and	r6, r0, #PLAT_RK_MPIDR_CLUSTER_MASK
10182e18f89SHeiko Stuebner#else
10282e18f89SHeiko Stuebner	and	r6, r0, #MPIDR_CLUSTER_MASK
10382e18f89SHeiko Stuebner#endif
10482e18f89SHeiko Stuebner	mov	r0, r6
10582e18f89SHeiko Stuebner
10682e18f89SHeiko Stuebner	func_rockchip_clst_warmboot
10782e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
10882e18f89SHeiko Stuebner	 * big cluster id is 1
10982e18f89SHeiko Stuebner	 * big cores id is from 0-3, little cores id 4-7
11082e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
11182e18f89SHeiko Stuebner	 */
11282e18f89SHeiko Stuebner	add	r7, r5, r6, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT
11382e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
11482e18f89SHeiko Stuebner	 * get per cpuup flag
11582e18f89SHeiko Stuebner         * --------------------------------------------------------------------
11682e18f89SHeiko Stuebner	 */
11782e18f89SHeiko Stuebner	ldr	r4, =cpuson_flags
11882e18f89SHeiko Stuebner	add	r4, r4, r7, lsl #2
11982e18f89SHeiko Stuebner	ldr	r1, [r4]
12082e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
12182e18f89SHeiko Stuebner	 * check cpuon reason
12282e18f89SHeiko Stuebner         * --------------------------------------------------------------------
12382e18f89SHeiko Stuebner	 */
12482e18f89SHeiko Stuebner	cmp	r1, #PMU_CPU_AUTO_PWRDN
12582e18f89SHeiko Stuebner	beq	boot_entry
12682e18f89SHeiko Stuebner	cmp	r1, #PMU_CPU_HOTPLUG
12782e18f89SHeiko Stuebner	beq	boot_entry
12882e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
12982e18f89SHeiko Stuebner	 * If the boot core cpuson_flags or cpuson_entry_point is not
13082e18f89SHeiko Stuebner	 * expection. force the core into wfe.
13182e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
13282e18f89SHeiko Stuebner	 */
13382e18f89SHeiko Stuebnerwfe_loop:
13482e18f89SHeiko Stuebner	wfe
13582e18f89SHeiko Stuebner	b	wfe_loop
13682e18f89SHeiko Stuebnerboot_entry:
13782e18f89SHeiko Stuebner	mov	r1, #0
13882e18f89SHeiko Stuebner	str	r1, [r4]
13982e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
14082e18f89SHeiko Stuebner	 * get per cpuup boot addr
14182e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
14282e18f89SHeiko Stuebner	 */
14382e18f89SHeiko Stuebner	ldr	r5, =cpuson_entry_point
14482e18f89SHeiko Stuebner	ldr	r2, [r5, r7, lsl #2] /* ehem. #3 */
14582e18f89SHeiko Stuebner	pop	{ r4 - r7, lr }
14682e18f89SHeiko Stuebner
14782e18f89SHeiko Stuebner	bx	r2
14882e18f89SHeiko Stuebnerendfunc platform_cpu_warmboot
14982e18f89SHeiko Stuebner
15082e18f89SHeiko Stuebner	/* --------------------------------------------------------------------
15182e18f89SHeiko Stuebner	 * Per-CPU Secure entry point - resume or power up
15282e18f89SHeiko Stuebner	 * --------------------------------------------------------------------
15382e18f89SHeiko Stuebner	 */
154*da04341eSChris Kay	.section .tzfw_coherent_mem, "a"
15582e18f89SHeiko Stuebner	.align  3
15682e18f89SHeiko Stuebnercpuson_entry_point:
15782e18f89SHeiko Stuebner	.rept	PLATFORM_CORE_COUNT
15882e18f89SHeiko Stuebner	.quad	0
15982e18f89SHeiko Stuebner	.endr
16082e18f89SHeiko Stuebnercpuson_flags:
16182e18f89SHeiko Stuebner	.rept	PLATFORM_CORE_COUNT
16282e18f89SHeiko Stuebner	.word	0
16382e18f89SHeiko Stuebner	.endr
16482e18f89SHeiko Stuebnerrockchip_clst_warmboot_data
165