xref: /rk3399_ARM-atf/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S (revision 09d40e0e08283a249e7dce0e106c07c5141f9b7e)
1c8284409SSoren Brinkmann/*
2bde25ae2SAntonio Nino Diaz * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
3c8284409SSoren Brinkmann *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
5c8284409SSoren Brinkmann */
6c8284409SSoren Brinkmann
7c8284409SSoren Brinkmann#include <asm_macros.S>
8*09d40e0eSAntonio Nino Diaz#include <drivers/arm/gicv2.h>
9c8284409SSoren Brinkmann#include <platform_def.h>
10c8284409SSoren Brinkmann
11c8284409SSoren Brinkmann	.globl	plat_secondary_cold_boot_setup
12c8284409SSoren Brinkmann	.globl	plat_is_my_cpu_primary
13bde25ae2SAntonio Nino Diaz	.globl	zynqmp_calc_core_pos
14bde25ae2SAntonio Nino Diaz	.globl	plat_my_core_pos
15bde25ae2SAntonio Nino Diaz	.globl	plat_crash_console_init
16bde25ae2SAntonio Nino Diaz	.globl	plat_crash_console_putc
17bde25ae2SAntonio Nino Diaz	.globl	plat_crash_console_flush
18bde25ae2SAntonio Nino Diaz	.globl	platform_mem_init
19c8284409SSoren Brinkmann
20c8284409SSoren Brinkmann	/* -----------------------------------------------------
21c8284409SSoren Brinkmann	 * void plat_secondary_cold_boot_setup (void);
22c8284409SSoren Brinkmann	 *
23c8284409SSoren Brinkmann	 * This function performs any platform specific actions
24c8284409SSoren Brinkmann	 * needed for a secondary cpu after a cold reset e.g
25c8284409SSoren Brinkmann	 * mark the cpu's presence, mechanism to place it in a
26c8284409SSoren Brinkmann	 * holding pen etc.
27c8284409SSoren Brinkmann	 * TODO: Should we read the PSYS register to make sure
28c8284409SSoren Brinkmann	 * that the request has gone through.
29c8284409SSoren Brinkmann	 * -----------------------------------------------------
30c8284409SSoren Brinkmann	 */
31c8284409SSoren Brinkmannfunc plat_secondary_cold_boot_setup
32c8284409SSoren Brinkmann	mrs	x0, mpidr_el1
33c8284409SSoren Brinkmann
34c8284409SSoren Brinkmann	/* Deactivate the gic cpu interface */
35c8284409SSoren Brinkmann	ldr	x1, =BASE_GICC_BASE
36c8284409SSoren Brinkmann	mov	w0, #(IRQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP1)
37c8284409SSoren Brinkmann	orr	w0, w0, #(IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP0)
38c8284409SSoren Brinkmann	str	w0, [x1, #GICC_CTLR]
39c8284409SSoren Brinkmann
40c8284409SSoren Brinkmann	/*
41c8284409SSoren Brinkmann	 * There is no sane reason to come out of this wfi. This
42c8284409SSoren Brinkmann	 * cpu will be powered on and reset by the cpu_on pm api
43c8284409SSoren Brinkmann	 */
44c8284409SSoren Brinkmann	dsb	sy
45c8284409SSoren Brinkmann1:
46a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
47c8284409SSoren Brinkmannendfunc plat_secondary_cold_boot_setup
48c8284409SSoren Brinkmann
49c8284409SSoren Brinkmannfunc plat_is_my_cpu_primary
50c8284409SSoren Brinkmann	mov	x9, x30
51c8284409SSoren Brinkmann	bl	plat_my_core_pos
52c8284409SSoren Brinkmann	cmp	x0, #ZYNQMP_PRIMARY_CPU
53c8284409SSoren Brinkmann	cset	x0, eq
54c8284409SSoren Brinkmann	ret	x9
55c8284409SSoren Brinkmannendfunc plat_is_my_cpu_primary
56bde25ae2SAntonio Nino Diaz
57bde25ae2SAntonio Nino Diaz	/* -----------------------------------------------------
58bde25ae2SAntonio Nino Diaz	 *  unsigned int plat_my_core_pos(void)
59bde25ae2SAntonio Nino Diaz	 *  This function uses the zynqmp_calc_core_pos()
60bde25ae2SAntonio Nino Diaz	 *  definition to get the index of the calling CPU.
61bde25ae2SAntonio Nino Diaz	 * -----------------------------------------------------
62bde25ae2SAntonio Nino Diaz	 */
63bde25ae2SAntonio Nino Diazfunc plat_my_core_pos
64bde25ae2SAntonio Nino Diaz	mrs	x0, mpidr_el1
65bde25ae2SAntonio Nino Diaz	b	zynqmp_calc_core_pos
66bde25ae2SAntonio Nino Diazendfunc plat_my_core_pos
67bde25ae2SAntonio Nino Diaz
68bde25ae2SAntonio Nino Diaz	/* -----------------------------------------------------
69bde25ae2SAntonio Nino Diaz	 *  unsigned int zynqmp_calc_core_pos(u_register_t mpidr)
70bde25ae2SAntonio Nino Diaz	 *  Helper function to calculate the core position.
71bde25ae2SAntonio Nino Diaz	 *  With this function: CorePos = (ClusterId * 4) +
72bde25ae2SAntonio Nino Diaz	 *  				  CoreId
73bde25ae2SAntonio Nino Diaz	 * -----------------------------------------------------
74bde25ae2SAntonio Nino Diaz	 */
75bde25ae2SAntonio Nino Diazfunc zynqmp_calc_core_pos
76bde25ae2SAntonio Nino Diaz	and	x1, x0, #MPIDR_CPU_MASK
77bde25ae2SAntonio Nino Diaz	and	x0, x0, #MPIDR_CLUSTER_MASK
78bde25ae2SAntonio Nino Diaz	add	x0, x1, x0, LSR #6
79bde25ae2SAntonio Nino Diaz	ret
80bde25ae2SAntonio Nino Diazendfunc zynqmp_calc_core_pos
81bde25ae2SAntonio Nino Diaz
82bde25ae2SAntonio Nino Diaz	/* ---------------------------------------------
83bde25ae2SAntonio Nino Diaz	 * int plat_crash_console_init(void)
84bde25ae2SAntonio Nino Diaz	 * Function to initialize the crash console
85bde25ae2SAntonio Nino Diaz	 * without a C Runtime to print crash report.
86bde25ae2SAntonio Nino Diaz	 * Clobber list : x0 - x4
87bde25ae2SAntonio Nino Diaz	 * ---------------------------------------------
88bde25ae2SAntonio Nino Diaz	 */
89bde25ae2SAntonio Nino Diazfunc plat_crash_console_init
90bde25ae2SAntonio Nino Diaz	mov_imm	x0, ZYNQMP_CRASH_UART_BASE
91bde25ae2SAntonio Nino Diaz	mov_imm	x1, ZYNQMP_CRASH_UART_CLK_IN_HZ
92bde25ae2SAntonio Nino Diaz	mov_imm	x2, ZYNQMP_UART_BAUDRATE
93bde25ae2SAntonio Nino Diaz	b	console_core_init
94bde25ae2SAntonio Nino Diazendfunc plat_crash_console_init
95bde25ae2SAntonio Nino Diaz
96bde25ae2SAntonio Nino Diaz	/* ---------------------------------------------
97bde25ae2SAntonio Nino Diaz	 * int plat_crash_console_putc(int c)
98bde25ae2SAntonio Nino Diaz	 * Function to print a character on the crash
99bde25ae2SAntonio Nino Diaz	 * console without a C Runtime.
100bde25ae2SAntonio Nino Diaz	 * Clobber list : x1, x2
101bde25ae2SAntonio Nino Diaz	 * ---------------------------------------------
102bde25ae2SAntonio Nino Diaz	 */
103bde25ae2SAntonio Nino Diazfunc plat_crash_console_putc
104bde25ae2SAntonio Nino Diaz	mov_imm	x1, ZYNQMP_CRASH_UART_BASE
105bde25ae2SAntonio Nino Diaz	b	console_core_putc
106bde25ae2SAntonio Nino Diazendfunc plat_crash_console_putc
107bde25ae2SAntonio Nino Diaz
108bde25ae2SAntonio Nino Diaz	/* ---------------------------------------------
109bde25ae2SAntonio Nino Diaz	 * int plat_crash_console_flush()
110bde25ae2SAntonio Nino Diaz	 * Function to force a write of all buffered
111bde25ae2SAntonio Nino Diaz	 * data that hasn't been output.
112bde25ae2SAntonio Nino Diaz	 * Out : return -1 on error else return 0.
113bde25ae2SAntonio Nino Diaz	 * Clobber list : r0
114bde25ae2SAntonio Nino Diaz	 * ---------------------------------------------
115bde25ae2SAntonio Nino Diaz	 */
116bde25ae2SAntonio Nino Diazfunc plat_crash_console_flush
117bde25ae2SAntonio Nino Diaz	mov_imm	x0, ZYNQMP_CRASH_UART_BASE
118bde25ae2SAntonio Nino Diaz	b	console_core_flush
119bde25ae2SAntonio Nino Diazendfunc plat_crash_console_flush
120bde25ae2SAntonio Nino Diaz
121bde25ae2SAntonio Nino Diaz	/* ---------------------------------------------------------------------
122bde25ae2SAntonio Nino Diaz	 * We don't need to carry out any memory initialization on ARM
123bde25ae2SAntonio Nino Diaz	 * platforms. The Secure RAM is accessible straight away.
124bde25ae2SAntonio Nino Diaz	 * ---------------------------------------------------------------------
125bde25ae2SAntonio Nino Diaz	 */
126bde25ae2SAntonio Nino Diazfunc platform_mem_init
127bde25ae2SAntonio Nino Diaz	ret
128bde25ae2SAntonio Nino Diazendfunc platform_mem_init
129