1301d27d9SRadoslaw Biernacki/* 2831b0e98SJimmy Brisson * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved. 3301d27d9SRadoslaw Biernacki * 4301d27d9SRadoslaw Biernacki * SPDX-License-Identifier: BSD-3-Clause 5301d27d9SRadoslaw Biernacki */ 6301d27d9SRadoslaw Biernacki 7301d27d9SRadoslaw Biernacki#include <arch.h> 8301d27d9SRadoslaw Biernacki#include <asm_macros.S> 9301d27d9SRadoslaw Biernacki#include <assert_macros.S> 10301d27d9SRadoslaw Biernacki#include <platform_def.h> 11301d27d9SRadoslaw Biernacki 12301d27d9SRadoslaw Biernacki .globl plat_my_core_pos 13301d27d9SRadoslaw Biernacki .globl plat_get_my_entrypoint 14301d27d9SRadoslaw Biernacki .globl platform_mem_init 15301d27d9SRadoslaw Biernacki .globl plat_qemu_calc_core_pos 16301d27d9SRadoslaw Biernacki .globl plat_crash_console_init 17301d27d9SRadoslaw Biernacki .globl plat_crash_console_putc 18301d27d9SRadoslaw Biernacki .globl plat_crash_console_flush 19301d27d9SRadoslaw Biernacki .globl plat_secondary_cold_boot_setup 20301d27d9SRadoslaw Biernacki .globl plat_get_my_entrypoint 21301d27d9SRadoslaw Biernacki .globl plat_is_my_cpu_primary 22301d27d9SRadoslaw Biernacki 23301d27d9SRadoslaw Biernackifunc plat_my_core_pos 24301d27d9SRadoslaw Biernacki mrs x0, mpidr_el1 25301d27d9SRadoslaw Biernacki b plat_qemu_calc_core_pos 26301d27d9SRadoslaw Biernackiendfunc plat_my_core_pos 27301d27d9SRadoslaw Biernacki 28301d27d9SRadoslaw Biernacki/* 29301d27d9SRadoslaw Biernacki * unsigned int plat_qemu_calc_core_pos(u_register_t mpidr); 30301d27d9SRadoslaw Biernacki * With this function: CorePos = (ClusterId * 4) + CoreId 31301d27d9SRadoslaw Biernacki */ 32301d27d9SRadoslaw Biernackifunc plat_qemu_calc_core_pos 33301d27d9SRadoslaw Biernacki and x1, x0, #MPIDR_CPU_MASK 34301d27d9SRadoslaw Biernacki and x0, x0, #MPIDR_CLUSTER_MASK 35*3063177eSGraeme Gregory add x0, x1, x0, LSR #(MPIDR_AFFINITY_BITS -\ 36*3063177eSGraeme Gregory PLATFORM_CPU_PER_CLUSTER_SHIFT) 37301d27d9SRadoslaw Biernacki ret 38301d27d9SRadoslaw Biernackiendfunc plat_qemu_calc_core_pos 39301d27d9SRadoslaw Biernacki 40301d27d9SRadoslaw Biernacki /* ----------------------------------------------------- 41301d27d9SRadoslaw Biernacki * unsigned int plat_is_my_cpu_primary (void); 42301d27d9SRadoslaw Biernacki * 43301d27d9SRadoslaw Biernacki * Find out whether the current cpu is the primary 44301d27d9SRadoslaw Biernacki * cpu. 45301d27d9SRadoslaw Biernacki * ----------------------------------------------------- 46301d27d9SRadoslaw Biernacki */ 47301d27d9SRadoslaw Biernackifunc plat_is_my_cpu_primary 48301d27d9SRadoslaw Biernacki mrs x0, mpidr_el1 49301d27d9SRadoslaw Biernacki and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 50301d27d9SRadoslaw Biernacki cmp x0, #QEMU_PRIMARY_CPU 51301d27d9SRadoslaw Biernacki cset w0, eq 52301d27d9SRadoslaw Biernacki ret 53301d27d9SRadoslaw Biernackiendfunc plat_is_my_cpu_primary 54301d27d9SRadoslaw Biernacki 55301d27d9SRadoslaw Biernacki /* ----------------------------------------------------- 56301d27d9SRadoslaw Biernacki * void plat_secondary_cold_boot_setup (void); 57301d27d9SRadoslaw Biernacki * 58301d27d9SRadoslaw Biernacki * This function performs any platform specific actions 59301d27d9SRadoslaw Biernacki * needed for a secondary cpu after a cold reset e.g 60301d27d9SRadoslaw Biernacki * mark the cpu's presence, mechanism to place it in a 61301d27d9SRadoslaw Biernacki * holding pen etc. 62301d27d9SRadoslaw Biernacki * ----------------------------------------------------- 63301d27d9SRadoslaw Biernacki */ 64301d27d9SRadoslaw Biernackifunc plat_secondary_cold_boot_setup 65301d27d9SRadoslaw Biernacki /* Calculate address of our hold entry */ 66301d27d9SRadoslaw Biernacki bl plat_my_core_pos 67301d27d9SRadoslaw Biernacki lsl x0, x0, #PLAT_QEMU_HOLD_ENTRY_SHIFT 68301d27d9SRadoslaw Biernacki mov_imm x2, PLAT_QEMU_HOLD_BASE 69301d27d9SRadoslaw Biernacki 70301d27d9SRadoslaw Biernacki /* Wait until we have a go */ 71301d27d9SRadoslaw Biernackipoll_mailbox: 72301d27d9SRadoslaw Biernacki ldr x1, [x2, x0] 73301d27d9SRadoslaw Biernacki cbz x1, 1f 7433e8c569SAndrew Walbran 7533e8c569SAndrew Walbran /* Clear the mailbox again ready for next time. */ 7633e8c569SAndrew Walbran mov x1, #PLAT_QEMU_HOLD_STATE_WAIT 7733e8c569SAndrew Walbran str x1, [x2, x0] 7833e8c569SAndrew Walbran 7933e8c569SAndrew Walbran /* Jump to the provided entrypoint. */ 80301d27d9SRadoslaw Biernacki mov_imm x0, PLAT_QEMU_TRUSTED_MAILBOX_BASE 81301d27d9SRadoslaw Biernacki ldr x1, [x0] 82301d27d9SRadoslaw Biernacki br x1 83301d27d9SRadoslaw Biernacki1: 84301d27d9SRadoslaw Biernacki wfe 85301d27d9SRadoslaw Biernacki b poll_mailbox 86301d27d9SRadoslaw Biernackiendfunc plat_secondary_cold_boot_setup 87301d27d9SRadoslaw Biernacki 88301d27d9SRadoslaw Biernackifunc plat_get_my_entrypoint 89301d27d9SRadoslaw Biernacki /* TODO support warm boot */ 90301d27d9SRadoslaw Biernacki mov x0, #0 91301d27d9SRadoslaw Biernacki ret 92301d27d9SRadoslaw Biernackiendfunc plat_get_my_entrypoint 93301d27d9SRadoslaw Biernacki 94301d27d9SRadoslaw Biernackifunc platform_mem_init 95301d27d9SRadoslaw Biernacki ret 96301d27d9SRadoslaw Biernackiendfunc platform_mem_init 97301d27d9SRadoslaw Biernacki 98301d27d9SRadoslaw Biernacki /* --------------------------------------------- 99301d27d9SRadoslaw Biernacki * int plat_crash_console_init(void) 100301d27d9SRadoslaw Biernacki * Function to initialize the crash console 101301d27d9SRadoslaw Biernacki * without a C Runtime to print crash report. 102301d27d9SRadoslaw Biernacki * Clobber list : x0, x1, x2 103301d27d9SRadoslaw Biernacki * --------------------------------------------- 104301d27d9SRadoslaw Biernacki */ 105301d27d9SRadoslaw Biernackifunc plat_crash_console_init 106301d27d9SRadoslaw Biernacki mov_imm x0, PLAT_QEMU_CRASH_UART_BASE 107301d27d9SRadoslaw Biernacki mov_imm x1, PLAT_QEMU_CRASH_UART_CLK_IN_HZ 108301d27d9SRadoslaw Biernacki mov_imm x2, PLAT_QEMU_CONSOLE_BAUDRATE 109301d27d9SRadoslaw Biernacki b console_pl011_core_init 110301d27d9SRadoslaw Biernackiendfunc plat_crash_console_init 111301d27d9SRadoslaw Biernacki 112301d27d9SRadoslaw Biernacki /* --------------------------------------------- 113301d27d9SRadoslaw Biernacki * int plat_crash_console_putc(int c) 114301d27d9SRadoslaw Biernacki * Function to print a character on the crash 115301d27d9SRadoslaw Biernacki * console without a C Runtime. 116301d27d9SRadoslaw Biernacki * Clobber list : x1, x2 117301d27d9SRadoslaw Biernacki * --------------------------------------------- 118301d27d9SRadoslaw Biernacki */ 119301d27d9SRadoslaw Biernackifunc plat_crash_console_putc 120301d27d9SRadoslaw Biernacki mov_imm x1, PLAT_QEMU_CRASH_UART_BASE 121301d27d9SRadoslaw Biernacki b console_pl011_core_putc 122301d27d9SRadoslaw Biernackiendfunc plat_crash_console_putc 123301d27d9SRadoslaw Biernacki 124301d27d9SRadoslaw Biernacki /* --------------------------------------------- 125831b0e98SJimmy Brisson * void plat_crash_console_flush(int c) 126301d27d9SRadoslaw Biernacki * Function to force a write of all buffered 127301d27d9SRadoslaw Biernacki * data that hasn't been output. 128831b0e98SJimmy Brisson * Out : void. 129301d27d9SRadoslaw Biernacki * Clobber list : x0, x1 130301d27d9SRadoslaw Biernacki * --------------------------------------------- 131301d27d9SRadoslaw Biernacki */ 132301d27d9SRadoslaw Biernackifunc plat_crash_console_flush 133301d27d9SRadoslaw Biernacki mov_imm x0, PLAT_QEMU_CRASH_UART_BASE 134301d27d9SRadoslaw Biernacki b console_pl011_core_flush 135301d27d9SRadoslaw Biernackiendfunc plat_crash_console_flush 136301d27d9SRadoslaw Biernacki 137