150a3056aSZelalem Aweke/* 2319fb084SSoby Mathew * Copyright (c) 2021-2022, Arm Limited. All rights reserved. 350a3056aSZelalem Aweke * 450a3056aSZelalem Aweke * SPDX-License-Identifier: BSD-3-Clause 550a3056aSZelalem Aweke */ 650a3056aSZelalem Aweke 750a3056aSZelalem Aweke#include <asm_macros.S> 8319fb084SSoby Mathew#include <services/rmmd_svc.h> 9*8c980a4aSJavier Almansa Sobrino 10*8c980a4aSJavier Almansa Sobrino#include <platform_def.h> 1150a3056aSZelalem Aweke#include "trp_private.h" 1250a3056aSZelalem Aweke 1350a3056aSZelalem Aweke.global trp_head 1450a3056aSZelalem Aweke.global trp_smc 1550a3056aSZelalem Aweke 1650a3056aSZelalem Aweke.section ".head.text", "ax" 1750a3056aSZelalem Aweke 1850a3056aSZelalem Aweke /* --------------------------------------------- 1950a3056aSZelalem Aweke * Populate the params in x0-x7 from the pointer 2050a3056aSZelalem Aweke * to the smc args structure in x0. 2150a3056aSZelalem Aweke * --------------------------------------------- 2250a3056aSZelalem Aweke */ 2350a3056aSZelalem Aweke .macro restore_args_call_smc 2450a3056aSZelalem Aweke ldp x6, x7, [x0, #TRP_ARG6] 2550a3056aSZelalem Aweke ldp x4, x5, [x0, #TRP_ARG4] 2650a3056aSZelalem Aweke ldp x2, x3, [x0, #TRP_ARG2] 2750a3056aSZelalem Aweke ldp x0, x1, [x0, #TRP_ARG0] 2850a3056aSZelalem Aweke smc #0 2950a3056aSZelalem Aweke .endm 3050a3056aSZelalem Aweke 3150a3056aSZelalem Aweke /* --------------------------------------------- 3250a3056aSZelalem Aweke * Entry point for TRP 3350a3056aSZelalem Aweke * --------------------------------------------- 3450a3056aSZelalem Aweke */ 3550a3056aSZelalem Aweketrp_head: 36*8c980a4aSJavier Almansa Sobrino /* 37*8c980a4aSJavier Almansa Sobrino * Stash arguments from previous boot stage 38*8c980a4aSJavier Almansa Sobrino */ 39*8c980a4aSJavier Almansa Sobrino mov x20, x0 40*8c980a4aSJavier Almansa Sobrino mov x21, x1 41*8c980a4aSJavier Almansa Sobrino mov x22, x2 42*8c980a4aSJavier Almansa Sobrino mov x23, x3 43*8c980a4aSJavier Almansa Sobrino 44*8c980a4aSJavier Almansa Sobrino /* 45*8c980a4aSJavier Almansa Sobrino * Validate CPUId before allocating a stack. 46*8c980a4aSJavier Almansa Sobrino */ 47*8c980a4aSJavier Almansa Sobrino cmp x20, #PLATFORM_CORE_COUNT 48*8c980a4aSJavier Almansa Sobrino b.lo 1f 49*8c980a4aSJavier Almansa Sobrino 50*8c980a4aSJavier Almansa Sobrino mov_imm x0, RMM_BOOT_COMPLETE 51*8c980a4aSJavier Almansa Sobrino mov_imm x1, E_RMM_BOOT_CPU_ID_OUT_OF_RANGE 52*8c980a4aSJavier Almansa Sobrino smc #0 53*8c980a4aSJavier Almansa Sobrino 54*8c980a4aSJavier Almansa Sobrino /* EL3 should never return back here, so panic if it does */ 55*8c980a4aSJavier Almansa Sobrino b trp_panic 56*8c980a4aSJavier Almansa Sobrino 57*8c980a4aSJavier Almansa Sobrino1: 5850a3056aSZelalem Aweke bl plat_set_my_stack 5900e81131SMark Dykes 6000e81131SMark Dykes /* 6100e81131SMark Dykes * Find out whether this is a cold or warm boot 6200e81131SMark Dykes */ 6300e81131SMark Dykes ldr x1, cold_boot_flag 6400e81131SMark Dykes cbz x1, warm_boot 6500e81131SMark Dykes 6600e81131SMark Dykes /* 6700e81131SMark Dykes * Update cold boot flag to indicate cold boot is done 6800e81131SMark Dykes */ 6900e81131SMark Dykes adr x2, cold_boot_flag 7000e81131SMark Dykes str xzr, [x2] 7100e81131SMark Dykes 7250a3056aSZelalem Aweke /* --------------------------------------------- 7350a3056aSZelalem Aweke * Zero out BSS section 7450a3056aSZelalem Aweke * --------------------------------------------- 7550a3056aSZelalem Aweke */ 7650a3056aSZelalem Aweke ldr x0, =__BSS_START__ 7750a3056aSZelalem Aweke ldr x1, =__BSS_SIZE__ 7850a3056aSZelalem Aweke bl zeromem 7950a3056aSZelalem Aweke 80*8c980a4aSJavier Almansa Sobrino mov x0, x20 81*8c980a4aSJavier Almansa Sobrino mov x1, x21 82*8c980a4aSJavier Almansa Sobrino mov x2, x22 83*8c980a4aSJavier Almansa Sobrino mov x3, x23 8450a3056aSZelalem Aweke bl trp_setup 8550a3056aSZelalem Aweke bl trp_main 8600e81131SMark Dykeswarm_boot: 87*8c980a4aSJavier Almansa Sobrino mov_imm x0, RMM_BOOT_COMPLETE 88*8c980a4aSJavier Almansa Sobrino mov x1, xzr /* RMM_BOOT_SUCCESS */ 8950a3056aSZelalem Aweke smc #0 9050a3056aSZelalem Aweke b trp_handler 9150a3056aSZelalem Aweke 92*8c980a4aSJavier Almansa Sobrinotrp_panic: 93*8c980a4aSJavier Almansa Sobrino no_ret plat_panic_handler 94*8c980a4aSJavier Almansa Sobrino 9500e81131SMark Dykes /* 9600e81131SMark Dykes * Flag to mark if it is a cold boot. 9700e81131SMark Dykes * 1: cold boot, 0: warmboot. 9800e81131SMark Dykes */ 9900e81131SMark Dykes.align 3 10000e81131SMark Dykescold_boot_flag: 10100e81131SMark Dykes .dword 1 10200e81131SMark Dykes 10350a3056aSZelalem Aweke /* --------------------------------------------- 10450a3056aSZelalem Aweke * Direct SMC call to BL31 service provided by 10550a3056aSZelalem Aweke * RMM Dispatcher 10650a3056aSZelalem Aweke * --------------------------------------------- 10750a3056aSZelalem Aweke */ 10850a3056aSZelalem Awekefunc trp_smc 10950a3056aSZelalem Aweke restore_args_call_smc 11050a3056aSZelalem Aweke ret 11150a3056aSZelalem Awekeendfunc trp_smc 11250a3056aSZelalem Aweke 11350a3056aSZelalem Aweke /* --------------------------------------------- 11450a3056aSZelalem Aweke * RMI call handler 11550a3056aSZelalem Aweke * --------------------------------------------- 11650a3056aSZelalem Aweke */ 11750a3056aSZelalem Awekefunc trp_handler 11850a3056aSZelalem Aweke bl trp_rmi_handler 11950a3056aSZelalem Aweke restore_args_call_smc 12050a3056aSZelalem Aweke b trp_handler 12150a3056aSZelalem Awekeendfunc trp_handler 122