1c8284409SSoren Brinkmann/* 2bde25ae2SAntonio Nino Diaz * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. 3c8284409SSoren Brinkmann * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5c8284409SSoren Brinkmann */ 6c8284409SSoren Brinkmann 7c8284409SSoren Brinkmann#include <asm_macros.S> 8*09d40e0eSAntonio Nino Diaz#include <drivers/arm/gicv2.h> 9c8284409SSoren Brinkmann#include <platform_def.h> 10c8284409SSoren Brinkmann 11c8284409SSoren Brinkmann .globl plat_secondary_cold_boot_setup 12c8284409SSoren Brinkmann .globl plat_is_my_cpu_primary 13bde25ae2SAntonio Nino Diaz .globl zynqmp_calc_core_pos 14bde25ae2SAntonio Nino Diaz .globl plat_my_core_pos 15bde25ae2SAntonio Nino Diaz .globl plat_crash_console_init 16bde25ae2SAntonio Nino Diaz .globl plat_crash_console_putc 17bde25ae2SAntonio Nino Diaz .globl plat_crash_console_flush 18bde25ae2SAntonio Nino Diaz .globl platform_mem_init 19c8284409SSoren Brinkmann 20c8284409SSoren Brinkmann /* ----------------------------------------------------- 21c8284409SSoren Brinkmann * void plat_secondary_cold_boot_setup (void); 22c8284409SSoren Brinkmann * 23c8284409SSoren Brinkmann * This function performs any platform specific actions 24c8284409SSoren Brinkmann * needed for a secondary cpu after a cold reset e.g 25c8284409SSoren Brinkmann * mark the cpu's presence, mechanism to place it in a 26c8284409SSoren Brinkmann * holding pen etc. 27c8284409SSoren Brinkmann * TODO: Should we read the PSYS register to make sure 28c8284409SSoren Brinkmann * that the request has gone through. 29c8284409SSoren Brinkmann * ----------------------------------------------------- 30c8284409SSoren Brinkmann */ 31c8284409SSoren Brinkmannfunc plat_secondary_cold_boot_setup 32c8284409SSoren Brinkmann mrs x0, mpidr_el1 33c8284409SSoren Brinkmann 34c8284409SSoren Brinkmann /* Deactivate the gic cpu interface */ 35c8284409SSoren Brinkmann ldr x1, =BASE_GICC_BASE 36c8284409SSoren Brinkmann mov w0, #(IRQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP1) 37c8284409SSoren Brinkmann orr w0, w0, #(IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP0) 38c8284409SSoren Brinkmann str w0, [x1, #GICC_CTLR] 39c8284409SSoren Brinkmann 40c8284409SSoren Brinkmann /* 41c8284409SSoren Brinkmann * There is no sane reason to come out of this wfi. This 42c8284409SSoren Brinkmann * cpu will be powered on and reset by the cpu_on pm api 43c8284409SSoren Brinkmann */ 44c8284409SSoren Brinkmann dsb sy 45c8284409SSoren Brinkmann1: 46a806dad5SJeenu Viswambharan no_ret plat_panic_handler 47c8284409SSoren Brinkmannendfunc plat_secondary_cold_boot_setup 48c8284409SSoren Brinkmann 49c8284409SSoren Brinkmannfunc plat_is_my_cpu_primary 50c8284409SSoren Brinkmann mov x9, x30 51c8284409SSoren Brinkmann bl plat_my_core_pos 52c8284409SSoren Brinkmann cmp x0, #ZYNQMP_PRIMARY_CPU 53c8284409SSoren Brinkmann cset x0, eq 54c8284409SSoren Brinkmann ret x9 55c8284409SSoren Brinkmannendfunc plat_is_my_cpu_primary 56bde25ae2SAntonio Nino Diaz 57bde25ae2SAntonio Nino Diaz /* ----------------------------------------------------- 58bde25ae2SAntonio Nino Diaz * unsigned int plat_my_core_pos(void) 59bde25ae2SAntonio Nino Diaz * This function uses the zynqmp_calc_core_pos() 60bde25ae2SAntonio Nino Diaz * definition to get the index of the calling CPU. 61bde25ae2SAntonio Nino Diaz * ----------------------------------------------------- 62bde25ae2SAntonio Nino Diaz */ 63bde25ae2SAntonio Nino Diazfunc plat_my_core_pos 64bde25ae2SAntonio Nino Diaz mrs x0, mpidr_el1 65bde25ae2SAntonio Nino Diaz b zynqmp_calc_core_pos 66bde25ae2SAntonio Nino Diazendfunc plat_my_core_pos 67bde25ae2SAntonio Nino Diaz 68bde25ae2SAntonio Nino Diaz /* ----------------------------------------------------- 69bde25ae2SAntonio Nino Diaz * unsigned int zynqmp_calc_core_pos(u_register_t mpidr) 70bde25ae2SAntonio Nino Diaz * Helper function to calculate the core position. 71bde25ae2SAntonio Nino Diaz * With this function: CorePos = (ClusterId * 4) + 72bde25ae2SAntonio Nino Diaz * CoreId 73bde25ae2SAntonio Nino Diaz * ----------------------------------------------------- 74bde25ae2SAntonio Nino Diaz */ 75bde25ae2SAntonio Nino Diazfunc zynqmp_calc_core_pos 76bde25ae2SAntonio Nino Diaz and x1, x0, #MPIDR_CPU_MASK 77bde25ae2SAntonio Nino Diaz and x0, x0, #MPIDR_CLUSTER_MASK 78bde25ae2SAntonio Nino Diaz add x0, x1, x0, LSR #6 79bde25ae2SAntonio Nino Diaz ret 80bde25ae2SAntonio Nino Diazendfunc zynqmp_calc_core_pos 81bde25ae2SAntonio Nino Diaz 82bde25ae2SAntonio Nino Diaz /* --------------------------------------------- 83bde25ae2SAntonio Nino Diaz * int plat_crash_console_init(void) 84bde25ae2SAntonio Nino Diaz * Function to initialize the crash console 85bde25ae2SAntonio Nino Diaz * without a C Runtime to print crash report. 86bde25ae2SAntonio Nino Diaz * Clobber list : x0 - x4 87bde25ae2SAntonio Nino Diaz * --------------------------------------------- 88bde25ae2SAntonio Nino Diaz */ 89bde25ae2SAntonio Nino Diazfunc plat_crash_console_init 90bde25ae2SAntonio Nino Diaz mov_imm x0, ZYNQMP_CRASH_UART_BASE 91bde25ae2SAntonio Nino Diaz mov_imm x1, ZYNQMP_CRASH_UART_CLK_IN_HZ 92bde25ae2SAntonio Nino Diaz mov_imm x2, ZYNQMP_UART_BAUDRATE 93bde25ae2SAntonio Nino Diaz b console_core_init 94bde25ae2SAntonio Nino Diazendfunc plat_crash_console_init 95bde25ae2SAntonio Nino Diaz 96bde25ae2SAntonio Nino Diaz /* --------------------------------------------- 97bde25ae2SAntonio Nino Diaz * int plat_crash_console_putc(int c) 98bde25ae2SAntonio Nino Diaz * Function to print a character on the crash 99bde25ae2SAntonio Nino Diaz * console without a C Runtime. 100bde25ae2SAntonio Nino Diaz * Clobber list : x1, x2 101bde25ae2SAntonio Nino Diaz * --------------------------------------------- 102bde25ae2SAntonio Nino Diaz */ 103bde25ae2SAntonio Nino Diazfunc plat_crash_console_putc 104bde25ae2SAntonio Nino Diaz mov_imm x1, ZYNQMP_CRASH_UART_BASE 105bde25ae2SAntonio Nino Diaz b console_core_putc 106bde25ae2SAntonio Nino Diazendfunc plat_crash_console_putc 107bde25ae2SAntonio Nino Diaz 108bde25ae2SAntonio Nino Diaz /* --------------------------------------------- 109bde25ae2SAntonio Nino Diaz * int plat_crash_console_flush() 110bde25ae2SAntonio Nino Diaz * Function to force a write of all buffered 111bde25ae2SAntonio Nino Diaz * data that hasn't been output. 112bde25ae2SAntonio Nino Diaz * Out : return -1 on error else return 0. 113bde25ae2SAntonio Nino Diaz * Clobber list : r0 114bde25ae2SAntonio Nino Diaz * --------------------------------------------- 115bde25ae2SAntonio Nino Diaz */ 116bde25ae2SAntonio Nino Diazfunc plat_crash_console_flush 117bde25ae2SAntonio Nino Diaz mov_imm x0, ZYNQMP_CRASH_UART_BASE 118bde25ae2SAntonio Nino Diaz b console_core_flush 119bde25ae2SAntonio Nino Diazendfunc plat_crash_console_flush 120bde25ae2SAntonio Nino Diaz 121bde25ae2SAntonio Nino Diaz /* --------------------------------------------------------------------- 122bde25ae2SAntonio Nino Diaz * We don't need to carry out any memory initialization on ARM 123bde25ae2SAntonio Nino Diaz * platforms. The Secure RAM is accessible straight away. 124bde25ae2SAntonio Nino Diaz * --------------------------------------------------------------------- 125bde25ae2SAntonio Nino Diaz */ 126bde25ae2SAntonio Nino Diazfunc platform_mem_init 127bde25ae2SAntonio Nino Diaz ret 128bde25ae2SAntonio Nino Diazendfunc platform_mem_init 129