1301d27d9SRadoslaw Biernacki/* 2*831b0e98SJimmy 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 Biernacki 24301d27d9SRadoslaw Biernackifunc plat_my_core_pos 25301d27d9SRadoslaw Biernacki ldcopr r0, MPIDR 26301d27d9SRadoslaw Biernacki b plat_qemu_calc_core_pos 27301d27d9SRadoslaw Biernackiendfunc plat_my_core_pos 28301d27d9SRadoslaw Biernacki 29301d27d9SRadoslaw Biernacki/* 30301d27d9SRadoslaw Biernacki * unsigned int plat_qemu_calc_core_pos(u_register_t mpidr); 31301d27d9SRadoslaw Biernacki * With this function: CorePos = (ClusterId * 4) + CoreId 32301d27d9SRadoslaw Biernacki */ 33301d27d9SRadoslaw Biernackifunc plat_qemu_calc_core_pos 34301d27d9SRadoslaw Biernacki and r1, r0, #MPIDR_CPU_MASK 35301d27d9SRadoslaw Biernacki and r0, r0, #MPIDR_CLUSTER_MASK 36301d27d9SRadoslaw Biernacki add r0, r1, r0, LSR #6 37301d27d9SRadoslaw Biernacki bx lr 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 ldcopr r0, MPIDR 49301d27d9SRadoslaw Biernacki ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 50301d27d9SRadoslaw Biernacki and r0, r1 51301d27d9SRadoslaw Biernacki cmp r0, #QEMU_PRIMARY_CPU 52301d27d9SRadoslaw Biernacki moveq r0, #1 53301d27d9SRadoslaw Biernacki movne r0, #0 54301d27d9SRadoslaw Biernacki bx lr 55301d27d9SRadoslaw Biernackiendfunc plat_is_my_cpu_primary 56301d27d9SRadoslaw Biernacki 57301d27d9SRadoslaw Biernacki /* ----------------------------------------------------- 58301d27d9SRadoslaw Biernacki * void plat_secondary_cold_boot_setup (void); 59301d27d9SRadoslaw Biernacki * 60301d27d9SRadoslaw Biernacki * This function performs any platform specific actions 61301d27d9SRadoslaw Biernacki * needed for a secondary cpu after a cold reset e.g 62301d27d9SRadoslaw Biernacki * mark the cpu's presence, mechanism to place it in a 63301d27d9SRadoslaw Biernacki * holding pen etc. 64301d27d9SRadoslaw Biernacki * ----------------------------------------------------- 65301d27d9SRadoslaw Biernacki */ 66301d27d9SRadoslaw Biernackifunc plat_secondary_cold_boot_setup 67301d27d9SRadoslaw Biernacki /* Calculate address of our hold entry */ 68301d27d9SRadoslaw Biernacki bl plat_my_core_pos 69301d27d9SRadoslaw Biernacki lsl r0, r0, #PLAT_QEMU_HOLD_ENTRY_SHIFT 70301d27d9SRadoslaw Biernacki mov_imm r2, PLAT_QEMU_HOLD_BASE 71301d27d9SRadoslaw Biernacki 72301d27d9SRadoslaw Biernacki /* Wait until we have a go */ 73301d27d9SRadoslaw Biernackipoll_mailbox: 74301d27d9SRadoslaw Biernacki ldr r1, [r2, r0] 7533e8c569SAndrew Walbran cmp r1, #PLAT_QEMU_HOLD_STATE_WAIT 76301d27d9SRadoslaw Biernacki beq 1f 7733e8c569SAndrew Walbran 7833e8c569SAndrew Walbran /* Clear the mailbox again ready for next time. */ 7933e8c569SAndrew Walbran mov r1, #PLAT_QEMU_HOLD_STATE_WAIT 8033e8c569SAndrew Walbran str r1, [r2, r0] 8133e8c569SAndrew Walbran 8233e8c569SAndrew Walbran /* Jump to the provided entrypoint. */ 83301d27d9SRadoslaw Biernacki mov_imm r0, PLAT_QEMU_TRUSTED_MAILBOX_BASE 84301d27d9SRadoslaw Biernacki ldr r1, [r0] 85301d27d9SRadoslaw Biernacki bx r1 86301d27d9SRadoslaw Biernacki1: 87301d27d9SRadoslaw Biernacki wfe 88301d27d9SRadoslaw Biernacki b poll_mailbox 89301d27d9SRadoslaw Biernackiendfunc plat_secondary_cold_boot_setup 90301d27d9SRadoslaw Biernacki 91301d27d9SRadoslaw Biernackifunc plat_get_my_entrypoint 92301d27d9SRadoslaw Biernacki /* TODO support warm boot */ 93301d27d9SRadoslaw Biernacki mov r0, #0 94301d27d9SRadoslaw Biernacki bx lr 95301d27d9SRadoslaw Biernackiendfunc plat_get_my_entrypoint 96301d27d9SRadoslaw Biernacki 97301d27d9SRadoslaw Biernackifunc platform_mem_init 98301d27d9SRadoslaw Biernacki bx lr 99301d27d9SRadoslaw Biernackiendfunc platform_mem_init 100301d27d9SRadoslaw Biernacki 101301d27d9SRadoslaw Biernacki /* --------------------------------------------- 102301d27d9SRadoslaw Biernacki * int plat_crash_console_init(void) 103301d27d9SRadoslaw Biernacki * Function to initialize the crash console 104301d27d9SRadoslaw Biernacki * without a C Runtime to print crash report. 105301d27d9SRadoslaw Biernacki * Clobber list : x0, x1, x2 106301d27d9SRadoslaw Biernacki * --------------------------------------------- 107301d27d9SRadoslaw Biernacki */ 108301d27d9SRadoslaw Biernackifunc plat_crash_console_init 109301d27d9SRadoslaw Biernacki mov_imm r0, PLAT_QEMU_CRASH_UART_BASE 110301d27d9SRadoslaw Biernacki mov_imm r1, PLAT_QEMU_CRASH_UART_CLK_IN_HZ 111301d27d9SRadoslaw Biernacki mov_imm r2, PLAT_QEMU_CONSOLE_BAUDRATE 112301d27d9SRadoslaw Biernacki b console_pl011_core_init 113301d27d9SRadoslaw Biernackiendfunc plat_crash_console_init 114301d27d9SRadoslaw Biernacki 115301d27d9SRadoslaw Biernacki /* --------------------------------------------- 116301d27d9SRadoslaw Biernacki * int plat_crash_console_putc(int c) 117301d27d9SRadoslaw Biernacki * Function to print a character on the crash 118301d27d9SRadoslaw Biernacki * console without a C Runtime. 119301d27d9SRadoslaw Biernacki * Clobber list : x1, x2 120301d27d9SRadoslaw Biernacki * --------------------------------------------- 121301d27d9SRadoslaw Biernacki */ 122301d27d9SRadoslaw Biernackifunc plat_crash_console_putc 123301d27d9SRadoslaw Biernacki mov_imm r1, PLAT_QEMU_CRASH_UART_BASE 124301d27d9SRadoslaw Biernacki b console_pl011_core_putc 125301d27d9SRadoslaw Biernackiendfunc plat_crash_console_putc 126301d27d9SRadoslaw Biernacki 127301d27d9SRadoslaw Biernacki /* --------------------------------------------- 128*831b0e98SJimmy Brisson * void plat_crash_console_flush(int c) 129301d27d9SRadoslaw Biernacki * Function to force a write of all buffered 130301d27d9SRadoslaw Biernacki * data that hasn't been output. 131*831b0e98SJimmy Brisson * Out : void. 132301d27d9SRadoslaw Biernacki * Clobber list : x0, x1 133301d27d9SRadoslaw Biernacki * --------------------------------------------- 134301d27d9SRadoslaw Biernacki */ 135301d27d9SRadoslaw Biernackifunc plat_crash_console_flush 136301d27d9SRadoslaw Biernacki mov_imm r0, PLAT_QEMU_CRASH_UART_BASE 137301d27d9SRadoslaw Biernacki b console_pl011_core_flush 138301d27d9SRadoslaw Biernackiendfunc plat_crash_console_flush 139301d27d9SRadoslaw Biernacki 140