xref: /rk3399_ARM-atf/plat/mediatek/helpers/armv8_2/arch_helpers.S (revision 45711e4e1614fbed75ea645777cc2bb11d4be96f)
1*45711e4eSEdward-JW Yang/*
2*45711e4eSEdward-JW Yang * Copyright (c) 2022, Mediatek Inc. All rights reserved.
3*45711e4eSEdward-JW Yang *
4*45711e4eSEdward-JW Yang * SPDX-License-Identifier: BSD-3-Clause
5*45711e4eSEdward-JW Yang */
6*45711e4eSEdward-JW Yang
7*45711e4eSEdward-JW Yang#include <arch.h>
8*45711e4eSEdward-JW Yang#include <asm_macros.S>
9*45711e4eSEdward-JW Yang#include <assert_macros.S>
10*45711e4eSEdward-JW Yang#include <cpu_macros.S>
11*45711e4eSEdward-JW Yang#if CONFIG_MTK_MCUSYS
12*45711e4eSEdward-JW Yang#include <mcucfg.h>
13*45711e4eSEdward-JW Yang#endif
14*45711e4eSEdward-JW Yang#include <platform_def.h>
15*45711e4eSEdward-JW Yang	/*
16*45711e4eSEdward-JW Yang	 * Declare as weak function so that can be
17*45711e4eSEdward-JW Yang	 * overwritten by platform helpers
18*45711e4eSEdward-JW Yang	 */
19*45711e4eSEdward-JW Yang	.weak platform_mem_init
20*45711e4eSEdward-JW Yang	.weak plat_core_pos_by_mpidr
21*45711e4eSEdward-JW Yang	.weak plat_my_core_pos
22*45711e4eSEdward-JW Yang	.weak plat_mediatek_calc_core_pos
23*45711e4eSEdward-JW Yang	.global plat_mpidr_by_core_pos
24*45711e4eSEdward-JW Yang	.global plat_reset_handler
25*45711e4eSEdward-JW Yang
26*45711e4eSEdward-JW Yang	/* -----------------------------------------------------
27*45711e4eSEdward-JW Yang	 * unsigned long plat_mpidr_by_core_pos(uint32_t cpuid)
28*45711e4eSEdward-JW Yang	 * This function calcuate mpidr by cpu pos if cpu
29*45711e4eSEdward-JW Yang	 * topology is linear.
30*45711e4eSEdward-JW Yang	 *
31*45711e4eSEdward-JW Yang	 * Clobbers: x0-x1
32*45711e4eSEdward-JW Yang	 * -----------------------------------------------------
33*45711e4eSEdward-JW Yang	 */
34*45711e4eSEdward-JW Yangfunc plat_mpidr_by_core_pos
35*45711e4eSEdward-JW Yang	lsl x0, x0, #MPIDR_AFF1_SHIFT
36*45711e4eSEdward-JW Yang	mrs x1, mpidr_el1
37*45711e4eSEdward-JW Yang	and x1, x1, #MPIDR_MT_MASK
38*45711e4eSEdward-JW Yang	orr x0, x0, x1
39*45711e4eSEdward-JW Yang	ret
40*45711e4eSEdward-JW Yangendfunc plat_mpidr_by_core_pos
41*45711e4eSEdward-JW Yang
42*45711e4eSEdward-JW Yang	/* -----------------------------------------------------
43*45711e4eSEdward-JW Yang	 *  unsigned int plat_my_core_pos(void)
44*45711e4eSEdward-JW Yang	 *  This function uses the plat_arm_calc_core_pos()
45*45711e4eSEdward-JW Yang	 *  definition to get the index of the calling CPU.
46*45711e4eSEdward-JW Yang	 * -----------------------------------------------------
47*45711e4eSEdward-JW Yang	 */
48*45711e4eSEdward-JW Yangfunc plat_my_core_pos
49*45711e4eSEdward-JW Yang	mrs	x0, mpidr_el1
50*45711e4eSEdward-JW Yang	b plat_mediatek_calc_core_pos
51*45711e4eSEdward-JW Yangendfunc plat_my_core_pos
52*45711e4eSEdward-JW Yang
53*45711e4eSEdward-JW Yang	/* -----------------------------------------------------
54*45711e4eSEdward-JW Yang	 * int plat_mediatek_calc_core_pos(u_register_t mpidr);
55*45711e4eSEdward-JW Yang	 *
56*45711e4eSEdward-JW Yang	 * In ARMv8.2, AFF2 is cluster id, AFF1 is core id and
57*45711e4eSEdward-JW Yang	 * AFF0 is thread id. There is only one cluster in ARMv8.2
58*45711e4eSEdward-JW Yang	 * and one thread in current implementation.
59*45711e4eSEdward-JW Yang	 *
60*45711e4eSEdward-JW Yang	 * With this function: CorePos = CoreID (AFF1)
61*45711e4eSEdward-JW Yang	 * we do it with x0 = (x0 >> 8) & 0xff
62*45711e4eSEdward-JW Yang	 * -----------------------------------------------------
63*45711e4eSEdward-JW Yang	 */
64*45711e4eSEdward-JW Yangfunc plat_mediatek_calc_core_pos
65*45711e4eSEdward-JW Yang	b plat_core_pos_by_mpidr
66*45711e4eSEdward-JW Yangendfunc plat_mediatek_calc_core_pos
67*45711e4eSEdward-JW Yang
68*45711e4eSEdward-JW Yang	/* ------------------------------------------------------
69*45711e4eSEdward-JW Yang	 * int32_t plat_core_pos_by_mpidr(u_register_t mpidr)
70*45711e4eSEdward-JW Yang	 *
71*45711e4eSEdward-JW Yang	 * This function implements a part of the critical
72*45711e4eSEdward-JW Yang	 * interface between the psci generic layer and the
73*45711e4eSEdward-JW Yang	 * platform that allows the former to query the platform
74*45711e4eSEdward-JW Yang	 * to convert an MPIDR to a unique linear index.
75*45711e4eSEdward-JW Yang	 *
76*45711e4eSEdward-JW Yang	 * Clobbers: x0-x1
77*45711e4eSEdward-JW Yang	 * ------------------------------------------------------
78*45711e4eSEdward-JW Yang	 */
79*45711e4eSEdward-JW Yangfunc plat_core_pos_by_mpidr
80*45711e4eSEdward-JW Yang	mov	x1, #MPIDR_AFFLVL_MASK
81*45711e4eSEdward-JW Yang	and	x0, x1, x0, lsr #MPIDR_AFF1_SHIFT
82*45711e4eSEdward-JW Yang	ret
83*45711e4eSEdward-JW Yangendfunc plat_core_pos_by_mpidr
84*45711e4eSEdward-JW Yang
85*45711e4eSEdward-JW Yang	/* --------------------------------------------------------
86*45711e4eSEdward-JW Yang	 * void platform_mem_init (void);
87*45711e4eSEdward-JW Yang	 *
88*45711e4eSEdward-JW Yang	 * Any memory init, relocation to be done before the
89*45711e4eSEdward-JW Yang	 * platform boots. Called very early in the boot process.
90*45711e4eSEdward-JW Yang	 * --------------------------------------------------------
91*45711e4eSEdward-JW Yang	 */
92*45711e4eSEdward-JW Yangfunc platform_mem_init
93*45711e4eSEdward-JW Yang	ret
94*45711e4eSEdward-JW Yangendfunc platform_mem_init
95*45711e4eSEdward-JW Yang
96*45711e4eSEdward-JW Yangfunc plat_reset_handler
97*45711e4eSEdward-JW Yang#if CONFIG_MTK_MCUSYS
98*45711e4eSEdward-JW Yang	mov	x10, x30
99*45711e4eSEdward-JW Yang	bl	plat_my_core_pos
100*45711e4eSEdward-JW Yang	mov	x30, x10
101*45711e4eSEdward-JW Yang	mov     w1, #0x1
102*45711e4eSEdward-JW Yang	lsl     w1, w1, w0
103*45711e4eSEdward-JW Yang	ldr	x0, =CPC_MCUSYS_CPU_ON_SW_HINT_SET
104*45711e4eSEdward-JW Yang	str     w1, [x0]
105*45711e4eSEdward-JW Yang	dsb     sy
106*45711e4eSEdward-JW Yang#endif
107*45711e4eSEdward-JW Yang
108*45711e4eSEdward-JW Yang#if CONFIG_MTK_ECC
109*45711e4eSEdward-JW Yang	mov x10, x30
110*45711e4eSEdward-JW Yang	/* enable sequence of ecc for cpus */
111*45711e4eSEdward-JW Yang	bl disable_core_ecc
112*45711e4eSEdward-JW Yang	bl ft_ecc_clear_per_core
113*45711e4eSEdward-JW Yang	bl enable_core_ecc
114*45711e4eSEdward-JW Yang	mov x30, x10
115*45711e4eSEdward-JW Yang#endif
116*45711e4eSEdward-JW Yang
117*45711e4eSEdward-JW Yang	ret
118*45711e4eSEdward-JW Yangendfunc plat_reset_handler
119