185427debSSumit Garg/* 285427debSSumit Garg * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 385427debSSumit Garg * 485427debSSumit Garg * SPDX-License-Identifier: BSD-3-Clause 585427debSSumit Garg */ 685427debSSumit Garg 785427debSSumit Garg#include <arch.h> 885427debSSumit Garg#include <asm_macros.S> 985427debSSumit Garg#include <assert_macros.S> 1085427debSSumit Garg#include <platform_def.h> 1185427debSSumit Garg 1285427debSSumit Garg .global sq_calc_core_pos 1385427debSSumit Garg .global plat_my_core_pos 1485427debSSumit Garg .global platform_mem_init 1585427debSSumit Garg .global plat_is_my_cpu_primary 1685427debSSumit Garg .global plat_secondary_cold_boot_setup 17*67b40070SSumit Garg .global plat_crash_console_init 18*67b40070SSumit Garg .global plat_crash_console_putc 19*67b40070SSumit Garg .global plat_crash_console_flush 2085427debSSumit Garg 2185427debSSumit Garg/* 2285427debSSumit Garg * unsigned int sq_calc_core_pos(u_register_t mpidr) 2385427debSSumit Garg * core_pos = (cluster_id * max_cpus_per_cluster) + core_id 2485427debSSumit Garg */ 2585427debSSumit Gargfunc sq_calc_core_pos 2685427debSSumit Garg and x1, x0, #MPIDR_CPU_MASK 2785427debSSumit Garg and x0, x0, #MPIDR_CLUSTER_MASK 2885427debSSumit Garg add x0, x1, x0, lsr #7 2985427debSSumit Garg ret 3085427debSSumit Gargendfunc sq_calc_core_pos 3185427debSSumit Garg 3285427debSSumit Gargfunc plat_my_core_pos 3385427debSSumit Garg mrs x0, mpidr_el1 3485427debSSumit Garg b sq_calc_core_pos 3585427debSSumit Gargendfunc plat_my_core_pos 3685427debSSumit Garg 3785427debSSumit Gargfunc platform_mem_init 3885427debSSumit Garg ret 3985427debSSumit Gargendfunc platform_mem_init 4085427debSSumit Garg 4185427debSSumit Garg/* 4285427debSSumit Garg * Secondary CPUs are placed in a holding pen, waiting for their mailbox 4385427debSSumit Garg * to be populated. Note that all CPUs share the same mailbox ; therefore, 4485427debSSumit Garg * populating it will release all CPUs from their holding pen. If 4585427debSSumit Garg * finer-grained control is needed then this should be handled in the 4685427debSSumit Garg * code that secondary CPUs jump to. 4785427debSSumit Garg */ 4885427debSSumit Gargfunc plat_secondary_cold_boot_setup 4985427debSSumit Garg ldr x0, sq_sec_entrypoint 5085427debSSumit Garg 5185427debSSumit Garg /* Wait until the mailbox gets populated */ 5285427debSSumit Gargpoll_mailbox: 5385427debSSumit Garg cbz x0, 1f 5485427debSSumit Garg br x0 5585427debSSumit Garg1: 5685427debSSumit Garg wfe 5785427debSSumit Garg b poll_mailbox 5885427debSSumit Gargendfunc plat_secondary_cold_boot_setup 5985427debSSumit Garg 6085427debSSumit Garg/* 6185427debSSumit Garg * Find out whether the current cpu is the primary 6285427debSSumit Garg * cpu (applicable only after a cold boot) 6385427debSSumit Garg */ 6485427debSSumit Gargfunc plat_is_my_cpu_primary 6585427debSSumit Garg mov x9, x30 6685427debSSumit Garg bl plat_my_core_pos 6785427debSSumit Garg ldr x1, =SQ_BOOT_CFG_ADDR 6885427debSSumit Garg ldr x1, [x1] 6985427debSSumit Garg ubfx x1, x1, #PLAT_SQ_PRIMARY_CPU_SHIFT, \ 7085427debSSumit Garg #PLAT_SQ_PRIMARY_CPU_BIT_WIDTH 7185427debSSumit Garg cmp x0, x1 7285427debSSumit Garg cset w0, eq 7385427debSSumit Garg ret x9 7485427debSSumit Gargendfunc plat_is_my_cpu_primary 75*67b40070SSumit Garg 76*67b40070SSumit Garg/* 77*67b40070SSumit Garg * int plat_crash_console_init(void) 78*67b40070SSumit Garg * Function to initialize the crash console 79*67b40070SSumit Garg * without a C Runtime to print crash report. 80*67b40070SSumit Garg * Clobber list : x0, x1, x2 81*67b40070SSumit Garg */ 82*67b40070SSumit Gargfunc plat_crash_console_init 83*67b40070SSumit Garg mov_imm x0, PLAT_SQ_BOOT_UART_BASE 84*67b40070SSumit Garg mov_imm x1, PLAT_SQ_BOOT_UART_CLK_IN_HZ 85*67b40070SSumit Garg mov_imm x2, SQ_CONSOLE_BAUDRATE 86*67b40070SSumit Garg b console_pl011_core_init 87*67b40070SSumit Gargendfunc plat_crash_console_init 88*67b40070SSumit Garg 89*67b40070SSumit Garg/* 90*67b40070SSumit Garg * int plat_crash_console_putc(int c) 91*67b40070SSumit Garg * Function to print a character on the crash 92*67b40070SSumit Garg * console without a C Runtime. 93*67b40070SSumit Garg * Clobber list : x1, x2 94*67b40070SSumit Garg */ 95*67b40070SSumit Gargfunc plat_crash_console_putc 96*67b40070SSumit Garg mov_imm x1, PLAT_SQ_BOOT_UART_BASE 97*67b40070SSumit Garg b console_pl011_core_putc 98*67b40070SSumit Gargendfunc plat_crash_console_putc 99*67b40070SSumit Garg 100*67b40070SSumit Garg/* 101*67b40070SSumit Garg * int plat_crash_console_flush(int c) 102*67b40070SSumit Garg * Function to force a write of all buffered 103*67b40070SSumit Garg * data that hasn't been output. 104*67b40070SSumit Garg * Out : return -1 on error else return 0. 105*67b40070SSumit Garg * Clobber list : x0, x1 106*67b40070SSumit Garg */ 107*67b40070SSumit Gargfunc plat_crash_console_flush 108*67b40070SSumit Garg mov_imm x0, PLAT_SQ_BOOT_UART_BASE 109*67b40070SSumit Garg b console_pl011_core_flush 110*67b40070SSumit Gargendfunc plat_crash_console_flush 111