185427debSSumit Garg/* 2*831b0e98SJimmy Brisson * Copyright (c) 2018-2020, 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 1767b40070SSumit Garg .global plat_crash_console_init 1867b40070SSumit Garg .global plat_crash_console_putc 1967b40070SSumit 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 7567b40070SSumit Garg 7667b40070SSumit Garg/* 7767b40070SSumit Garg * int plat_crash_console_init(void) 7867b40070SSumit Garg * Function to initialize the crash console 7967b40070SSumit Garg * without a C Runtime to print crash report. 8067b40070SSumit Garg * Clobber list : x0, x1, x2 8167b40070SSumit Garg */ 8267b40070SSumit Gargfunc plat_crash_console_init 8367b40070SSumit Garg mov_imm x0, PLAT_SQ_BOOT_UART_BASE 8467b40070SSumit Garg mov_imm x1, PLAT_SQ_BOOT_UART_CLK_IN_HZ 8567b40070SSumit Garg mov_imm x2, SQ_CONSOLE_BAUDRATE 8667b40070SSumit Garg b console_pl011_core_init 8767b40070SSumit Gargendfunc plat_crash_console_init 8867b40070SSumit Garg 8967b40070SSumit Garg/* 9067b40070SSumit Garg * int plat_crash_console_putc(int c) 9167b40070SSumit Garg * Function to print a character on the crash 9267b40070SSumit Garg * console without a C Runtime. 9367b40070SSumit Garg * Clobber list : x1, x2 9467b40070SSumit Garg */ 9567b40070SSumit Gargfunc plat_crash_console_putc 9667b40070SSumit Garg mov_imm x1, PLAT_SQ_BOOT_UART_BASE 9767b40070SSumit Garg b console_pl011_core_putc 9867b40070SSumit Gargendfunc plat_crash_console_putc 9967b40070SSumit Garg 10067b40070SSumit Garg/* 101*831b0e98SJimmy Brisson * void plat_crash_console_flush(int c) 10267b40070SSumit Garg * Function to force a write of all buffered 10367b40070SSumit Garg * data that hasn't been output. 104*831b0e98SJimmy Brisson * Out : void. 10567b40070SSumit Garg * Clobber list : x0, x1 10667b40070SSumit Garg */ 10767b40070SSumit Gargfunc plat_crash_console_flush 10867b40070SSumit Garg mov_imm x0, PLAT_SQ_BOOT_UART_BASE 10967b40070SSumit Garg b console_pl011_core_flush 11067b40070SSumit Gargendfunc plat_crash_console_flush 111