xref: /rk3399_ARM-atf/plat/nxp/s32/s32g274ardb2/plat_helpers.S (revision 8b81a39e28a087e1123271a42c04a7ce3b496a58)
1*8b81a39eSGhennadi Procopciuc/*
2*8b81a39eSGhennadi Procopciuc * Copyright 2024 NXP
3*8b81a39eSGhennadi Procopciuc *
4*8b81a39eSGhennadi Procopciuc * SPDX-License-Identifier: BSD-3-Clause
5*8b81a39eSGhennadi Procopciuc */
6*8b81a39eSGhennadi Procopciuc
7*8b81a39eSGhennadi Procopciuc#include <asm_macros.S>
8*8b81a39eSGhennadi Procopciuc#include <platform_def.h>
9*8b81a39eSGhennadi Procopciuc
10*8b81a39eSGhennadi Procopciuc#define S32G_NCORE_CAIU0_BASE_ADDR		UL(0x50400000)
11*8b81a39eSGhennadi Procopciuc#define S32G_NCORE_CAIUTC_OFF			U(0x0)
12*8b81a39eSGhennadi Procopciuc#define S32G_NCORE_CAIUTC_ISOLEN_SHIFT		U(1)
13*8b81a39eSGhennadi Procopciuc
14*8b81a39eSGhennadi Procopciuc.globl	plat_crash_console_flush
15*8b81a39eSGhennadi Procopciuc.globl	plat_crash_console_init
16*8b81a39eSGhennadi Procopciuc.globl	plat_crash_console_putc
17*8b81a39eSGhennadi Procopciuc.globl	plat_is_my_cpu_primary
18*8b81a39eSGhennadi Procopciuc.globl	plat_reset_handler
19*8b81a39eSGhennadi Procopciuc.globl	plat_secondary_cold_boot_setup
20*8b81a39eSGhennadi Procopciuc.globl	platform_mem_init
21*8b81a39eSGhennadi Procopciuc.globl	s32g2_core_pos_by_mpidr
22*8b81a39eSGhennadi Procopciuc
23*8b81a39eSGhennadi Procopciuc/* int plat_crash_console_init(void); */
24*8b81a39eSGhennadi Procopciucfunc plat_crash_console_init
25*8b81a39eSGhennadi Procopciuc	mov_imm	x0, UART_BASE
26*8b81a39eSGhennadi Procopciuc	mov_imm	x1, UART_CLOCK_HZ
27*8b81a39eSGhennadi Procopciuc	mov_imm	x2, UART_BAUDRATE
28*8b81a39eSGhennadi Procopciuc	b	console_linflex_core_init
29*8b81a39eSGhennadi Procopciucendfunc plat_crash_console_init
30*8b81a39eSGhennadi Procopciuc
31*8b81a39eSGhennadi Procopciuc/* int plat_crash_console_putc(int); */
32*8b81a39eSGhennadi Procopciucfunc plat_crash_console_putc
33*8b81a39eSGhennadi Procopciuc	mov_imm	x1, UART_BASE
34*8b81a39eSGhennadi Procopciuc	b	console_linflex_core_putc
35*8b81a39eSGhennadi Procopciuc	ret
36*8b81a39eSGhennadi Procopciucendfunc plat_crash_console_putc
37*8b81a39eSGhennadi Procopciuc
38*8b81a39eSGhennadi Procopciuc/* void plat_crash_console_flush(void); */
39*8b81a39eSGhennadi Procopciucfunc plat_crash_console_flush
40*8b81a39eSGhennadi Procopciuc	ret
41*8b81a39eSGhennadi Procopciucendfunc plat_crash_console_flush
42*8b81a39eSGhennadi Procopciuc
43*8b81a39eSGhennadi Procopciuc/**
44*8b81a39eSGhennadi Procopciuc * unsigned int s32g2_core_pos_by_mpidr(u_register_t mpidr);
45*8b81a39eSGhennadi Procopciuc *
46*8b81a39eSGhennadi Procopciuc * In: x0 -  MPIDR_EL1
47*8b81a39eSGhennadi Procopciuc * Out: x0
48*8b81a39eSGhennadi Procopciuc * Clobber list: x0, x1
49*8b81a39eSGhennadi Procopciuc */
50*8b81a39eSGhennadi Procopciucfunc s32g2_core_pos_by_mpidr
51*8b81a39eSGhennadi Procopciuc	and	x1, x0, #MPIDR_CPU_MASK
52*8b81a39eSGhennadi Procopciuc	and	x0, x0, #MPIDR_CLUSTER_MASK
53*8b81a39eSGhennadi Procopciuc	lsr	x0, x0, #MPIDR_AFF1_SHIFT
54*8b81a39eSGhennadi Procopciuc	add	x0, x1, x0, lsl #PLATFORM_MPIDR_CPU_MASK_BITS
55*8b81a39eSGhennadi Procopciuc	ret
56*8b81a39eSGhennadi Procopciucendfunc s32g2_core_pos_by_mpidr
57*8b81a39eSGhennadi Procopciuc
58*8b81a39eSGhennadi Procopciuc/**
59*8b81a39eSGhennadi Procopciuc * unsigned int plat_my_core_pos(void);
60*8b81a39eSGhennadi Procopciuc *
61*8b81a39eSGhennadi Procopciuc * Out: x0
62*8b81a39eSGhennadi Procopciuc * Clobber list: x0, x1, x8
63*8b81a39eSGhennadi Procopciuc */
64*8b81a39eSGhennadi Procopciucfunc plat_my_core_pos
65*8b81a39eSGhennadi Procopciuc	mov	x8, x30
66*8b81a39eSGhennadi Procopciuc	mrs x0, mpidr_el1
67*8b81a39eSGhennadi Procopciuc	bl	s32g2_core_pos_by_mpidr
68*8b81a39eSGhennadi Procopciuc	mov	x30, x8
69*8b81a39eSGhennadi Procopciuc	ret
70*8b81a39eSGhennadi Procopciucendfunc plat_my_core_pos
71*8b81a39eSGhennadi Procopciuc
72*8b81a39eSGhennadi Procopciuc/**
73*8b81a39eSGhennadi Procopciuc * unsigned int plat_is_my_cpu_primary(void);
74*8b81a39eSGhennadi Procopciuc *
75*8b81a39eSGhennadi Procopciuc * Clobber list: x0, x1, x7, x8
76*8b81a39eSGhennadi Procopciuc */
77*8b81a39eSGhennadi Procopciucfunc plat_is_my_cpu_primary
78*8b81a39eSGhennadi Procopciuc	mov	x7, x30
79*8b81a39eSGhennadi Procopciuc	bl	plat_my_core_pos
80*8b81a39eSGhennadi Procopciuc	cmp	x0, #PLATFORM_PRIMARY_CPU
81*8b81a39eSGhennadi Procopciuc	cset	x0, eq
82*8b81a39eSGhennadi Procopciuc	mov	x30, x7
83*8b81a39eSGhennadi Procopciuc	ret
84*8b81a39eSGhennadi Procopciucendfunc plat_is_my_cpu_primary
85*8b81a39eSGhennadi Procopciuc
86*8b81a39eSGhennadi Procopciuc
87*8b81a39eSGhennadi Procopciuc/**
88*8b81a39eSGhennadi Procopciuc * void plat_secondary_cold_boot_setup (void);
89*8b81a39eSGhennadi Procopciuc */
90*8b81a39eSGhennadi Procopciucfunc plat_secondary_cold_boot_setup
91*8b81a39eSGhennadi Procopciuc	ret
92*8b81a39eSGhennadi Procopciucendfunc plat_secondary_cold_boot_setup
93*8b81a39eSGhennadi Procopciuc
94*8b81a39eSGhennadi Procopciuc/**
95*8b81a39eSGhennadi Procopciuc * void plat_reset_handler(void);
96*8b81a39eSGhennadi Procopciuc *
97*8b81a39eSGhennadi Procopciuc * Set the CAIUTC[IsolEn] bit for the primary A53 cluster.
98*8b81a39eSGhennadi Procopciuc * This is so cache invalidate operations from the early TF-A boot code
99*8b81a39eSGhennadi Procopciuc * won't cause Ncore to crash.
100*8b81a39eSGhennadi Procopciuc *
101*8b81a39eSGhennadi Procopciuc * Clobber list: x0, x1, x2
102*8b81a39eSGhennadi Procopciuc */
103*8b81a39eSGhennadi Procopciucfunc plat_reset_handler
104*8b81a39eSGhennadi Procopciuc	mov	x0, #S32G_NCORE_CAIU0_BASE_ADDR
105*8b81a39eSGhennadi Procopciuc	ldr	w1, [x0, #S32G_NCORE_CAIUTC_OFF]
106*8b81a39eSGhennadi Procopciuc	movz	w2, #1
107*8b81a39eSGhennadi Procopciuc	lsl	w2, w2, #S32G_NCORE_CAIUTC_ISOLEN_SHIFT
108*8b81a39eSGhennadi Procopciuc	orr	w1, w1, w2
109*8b81a39eSGhennadi Procopciuc	str	w1, [x0, #S32G_NCORE_CAIUTC_OFF]
110*8b81a39eSGhennadi Procopciuc	ret
111*8b81a39eSGhennadi Procopciucendfunc plat_reset_handler
112*8b81a39eSGhennadi Procopciuc
113*8b81a39eSGhennadi Procopciuc/* void platform_mem_init(void); */
114*8b81a39eSGhennadi Procopciucfunc platform_mem_init
115*8b81a39eSGhennadi Procopciuc	mov	x10, x30
116*8b81a39eSGhennadi Procopciuc	mov	x0, #BL31_BASE
117*8b81a39eSGhennadi Procopciuc	mov	x1, #(BL31_LIMIT & 0xFFFFU)
118*8b81a39eSGhennadi Procopciuc	movk	x1, #(BL31_LIMIT >> 16), lsl #16
119*8b81a39eSGhennadi Procopciuc	sub	x1, x1, x0
120*8b81a39eSGhennadi Procopciuc	bl	zeromem
121*8b81a39eSGhennadi Procopciuc	mov	x0, #BL33_BASE
122*8b81a39eSGhennadi Procopciuc	mov	x1, #(BL33_LIMIT & 0xFFFFU)
123*8b81a39eSGhennadi Procopciuc	movk	x1, #(BL33_LIMIT >> 16), lsl #16
124*8b81a39eSGhennadi Procopciuc	sub	x1, x1, x0
125*8b81a39eSGhennadi Procopciuc	bl	zeromem
126*8b81a39eSGhennadi Procopciuc	mov	x30, x10
127*8b81a39eSGhennadi Procopciuc	ret
128*8b81a39eSGhennadi Procopciucendfunc platform_mem_init
129*8b81a39eSGhennadi Procopciuc
130