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