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