xref: /rk3399_ARM-atf/plat/nxp/s32/s32g274ardb2/plat_helpers.S (revision 95ac568b6137ee8d3a53d3ec911a7116c90e8d5d)
18b81a39eSGhennadi Procopciuc/*
28b81a39eSGhennadi Procopciuc * Copyright 2024 NXP
38b81a39eSGhennadi Procopciuc *
48b81a39eSGhennadi Procopciuc * SPDX-License-Identifier: BSD-3-Clause
58b81a39eSGhennadi Procopciuc */
68b81a39eSGhennadi Procopciuc
78b81a39eSGhennadi Procopciuc#include <asm_macros.S>
88b81a39eSGhennadi Procopciuc#include <platform_def.h>
98b81a39eSGhennadi Procopciuc
108b81a39eSGhennadi Procopciuc#define S32G_NCORE_CAIU0_BASE_ADDR		UL(0x50400000)
118b81a39eSGhennadi Procopciuc#define S32G_NCORE_CAIUTC_OFF			U(0x0)
128b81a39eSGhennadi Procopciuc#define S32G_NCORE_CAIUTC_ISOLEN_SHIFT		U(1)
138b81a39eSGhennadi Procopciuc
148b81a39eSGhennadi Procopciuc.globl	plat_crash_console_flush
158b81a39eSGhennadi Procopciuc.globl	plat_crash_console_init
168b81a39eSGhennadi Procopciuc.globl	plat_crash_console_putc
178b81a39eSGhennadi Procopciuc.globl	plat_is_my_cpu_primary
18e73c3c3aSGhennadi Procopciuc.globl	plat_my_core_pos
198b81a39eSGhennadi Procopciuc.globl	plat_reset_handler
208b81a39eSGhennadi Procopciuc.globl	plat_secondary_cold_boot_setup
218b81a39eSGhennadi Procopciuc.globl	platform_mem_init
228b81a39eSGhennadi Procopciuc.globl	s32g2_core_pos_by_mpidr
238b81a39eSGhennadi Procopciuc
248b81a39eSGhennadi Procopciuc/* int plat_crash_console_init(void); */
258b81a39eSGhennadi Procopciucfunc plat_crash_console_init
268b81a39eSGhennadi Procopciuc	mov_imm	x0, UART_BASE
278b81a39eSGhennadi Procopciuc	mov_imm	x1, UART_CLOCK_HZ
288b81a39eSGhennadi Procopciuc	mov_imm	x2, UART_BAUDRATE
298b81a39eSGhennadi Procopciuc	b	console_linflex_core_init
308b81a39eSGhennadi Procopciucendfunc plat_crash_console_init
318b81a39eSGhennadi Procopciuc
328b81a39eSGhennadi Procopciuc/* int plat_crash_console_putc(int); */
338b81a39eSGhennadi Procopciucfunc plat_crash_console_putc
348b81a39eSGhennadi Procopciuc	mov_imm	x1, UART_BASE
358b81a39eSGhennadi Procopciuc	b	console_linflex_core_putc
368b81a39eSGhennadi Procopciuc	ret
378b81a39eSGhennadi Procopciucendfunc plat_crash_console_putc
388b81a39eSGhennadi Procopciuc
398b81a39eSGhennadi Procopciuc/* void plat_crash_console_flush(void); */
408b81a39eSGhennadi Procopciucfunc plat_crash_console_flush
41*95ac568bSGhennadi Procopciuc	mov_imm	x0, UART_BASE
42*95ac568bSGhennadi Procopciuc	b	console_linflex_core_flush
438b81a39eSGhennadi Procopciuc	ret
448b81a39eSGhennadi Procopciucendfunc plat_crash_console_flush
458b81a39eSGhennadi Procopciuc
468b81a39eSGhennadi Procopciuc/**
478b81a39eSGhennadi Procopciuc * unsigned int s32g2_core_pos_by_mpidr(u_register_t mpidr);
488b81a39eSGhennadi Procopciuc *
498b81a39eSGhennadi Procopciuc * In: x0 -  MPIDR_EL1
508b81a39eSGhennadi Procopciuc * Out: x0
518b81a39eSGhennadi Procopciuc * Clobber list: x0, x1
528b81a39eSGhennadi Procopciuc */
538b81a39eSGhennadi Procopciucfunc s32g2_core_pos_by_mpidr
548b81a39eSGhennadi Procopciuc	and	x1, x0, #MPIDR_CPU_MASK
558b81a39eSGhennadi Procopciuc	and	x0, x0, #MPIDR_CLUSTER_MASK
568b81a39eSGhennadi Procopciuc	lsr	x0, x0, #MPIDR_AFF1_SHIFT
578b81a39eSGhennadi Procopciuc	add	x0, x1, x0, lsl #PLATFORM_MPIDR_CPU_MASK_BITS
588b81a39eSGhennadi Procopciuc	ret
598b81a39eSGhennadi Procopciucendfunc s32g2_core_pos_by_mpidr
608b81a39eSGhennadi Procopciuc
618b81a39eSGhennadi Procopciuc/**
628b81a39eSGhennadi Procopciuc * unsigned int plat_my_core_pos(void);
638b81a39eSGhennadi Procopciuc *
648b81a39eSGhennadi Procopciuc * Out: x0
658b81a39eSGhennadi Procopciuc * Clobber list: x0, x1, x8
668b81a39eSGhennadi Procopciuc */
678b81a39eSGhennadi Procopciucfunc plat_my_core_pos
688b81a39eSGhennadi Procopciuc	mov	x8, x30
698b81a39eSGhennadi Procopciuc	mrs x0, mpidr_el1
708b81a39eSGhennadi Procopciuc	bl	s32g2_core_pos_by_mpidr
718b81a39eSGhennadi Procopciuc	mov	x30, x8
728b81a39eSGhennadi Procopciuc	ret
738b81a39eSGhennadi Procopciucendfunc plat_my_core_pos
748b81a39eSGhennadi Procopciuc
758b81a39eSGhennadi Procopciuc/**
768b81a39eSGhennadi Procopciuc * unsigned int plat_is_my_cpu_primary(void);
778b81a39eSGhennadi Procopciuc *
788b81a39eSGhennadi Procopciuc * Clobber list: x0, x1, x7, x8
798b81a39eSGhennadi Procopciuc */
808b81a39eSGhennadi Procopciucfunc plat_is_my_cpu_primary
818b81a39eSGhennadi Procopciuc	mov	x7, x30
828b81a39eSGhennadi Procopciuc	bl	plat_my_core_pos
838b81a39eSGhennadi Procopciuc	cmp	x0, #PLATFORM_PRIMARY_CPU
848b81a39eSGhennadi Procopciuc	cset	x0, eq
858b81a39eSGhennadi Procopciuc	mov	x30, x7
868b81a39eSGhennadi Procopciuc	ret
878b81a39eSGhennadi Procopciucendfunc plat_is_my_cpu_primary
888b81a39eSGhennadi Procopciuc
898b81a39eSGhennadi Procopciuc
908b81a39eSGhennadi Procopciuc/**
918b81a39eSGhennadi Procopciuc * void plat_secondary_cold_boot_setup (void);
928b81a39eSGhennadi Procopciuc */
938b81a39eSGhennadi Procopciucfunc plat_secondary_cold_boot_setup
948b81a39eSGhennadi Procopciuc	ret
958b81a39eSGhennadi Procopciucendfunc plat_secondary_cold_boot_setup
968b81a39eSGhennadi Procopciuc
978b81a39eSGhennadi Procopciuc/**
988b81a39eSGhennadi Procopciuc * void plat_reset_handler(void);
998b81a39eSGhennadi Procopciuc *
1008b81a39eSGhennadi Procopciuc * Set the CAIUTC[IsolEn] bit for the primary A53 cluster.
1018b81a39eSGhennadi Procopciuc * This is so cache invalidate operations from the early TF-A boot code
1028b81a39eSGhennadi Procopciuc * won't cause Ncore to crash.
1038b81a39eSGhennadi Procopciuc *
1048b81a39eSGhennadi Procopciuc * Clobber list: x0, x1, x2
1058b81a39eSGhennadi Procopciuc */
1068b81a39eSGhennadi Procopciucfunc plat_reset_handler
1078b81a39eSGhennadi Procopciuc	mov	x0, #S32G_NCORE_CAIU0_BASE_ADDR
1088b81a39eSGhennadi Procopciuc	ldr	w1, [x0, #S32G_NCORE_CAIUTC_OFF]
1098b81a39eSGhennadi Procopciuc	movz	w2, #1
1108b81a39eSGhennadi Procopciuc	lsl	w2, w2, #S32G_NCORE_CAIUTC_ISOLEN_SHIFT
1118b81a39eSGhennadi Procopciuc	orr	w1, w1, w2
1128b81a39eSGhennadi Procopciuc	str	w1, [x0, #S32G_NCORE_CAIUTC_OFF]
1138b81a39eSGhennadi Procopciuc	ret
1148b81a39eSGhennadi Procopciucendfunc plat_reset_handler
1158b81a39eSGhennadi Procopciuc
1168b81a39eSGhennadi Procopciuc/* void platform_mem_init(void); */
1178b81a39eSGhennadi Procopciucfunc platform_mem_init
1188b81a39eSGhennadi Procopciuc	mov	x10, x30
1198b81a39eSGhennadi Procopciuc	mov	x0, #BL31_BASE
1208b81a39eSGhennadi Procopciuc	mov	x1, #(BL31_LIMIT & 0xFFFFU)
1218b81a39eSGhennadi Procopciuc	movk	x1, #(BL31_LIMIT >> 16), lsl #16
1228b81a39eSGhennadi Procopciuc	sub	x1, x1, x0
1238b81a39eSGhennadi Procopciuc	bl	zeromem
1248b81a39eSGhennadi Procopciuc	mov	x0, #BL33_BASE
1258b81a39eSGhennadi Procopciuc	mov	x1, #(BL33_LIMIT & 0xFFFFU)
1268b81a39eSGhennadi Procopciuc	movk	x1, #(BL33_LIMIT >> 16), lsl #16
1278b81a39eSGhennadi Procopciuc	sub	x1, x1, x0
1288b81a39eSGhennadi Procopciuc	bl	zeromem
1298b81a39eSGhennadi Procopciuc	mov	x30, x10
1308b81a39eSGhennadi Procopciuc	ret
1318b81a39eSGhennadi Procopciucendfunc platform_mem_init
1328b81a39eSGhennadi Procopciuc
133