150a3056aSZelalem Aweke/* 250a3056aSZelalem Aweke * Copyright (c) 2021, 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> 850a3056aSZelalem Aweke#include <services/gtsi_svc.h> 950a3056aSZelalem Aweke#include <services/rmi_svc.h> 1050a3056aSZelalem Aweke#include "trp_private.h" 1150a3056aSZelalem Aweke 1250a3056aSZelalem Aweke.global trp_head 1350a3056aSZelalem Aweke.global trp_smc 1450a3056aSZelalem Aweke 1550a3056aSZelalem Aweke.section ".head.text", "ax" 1650a3056aSZelalem Aweke 1750a3056aSZelalem Aweke /* --------------------------------------------- 1850a3056aSZelalem Aweke * Populate the params in x0-x7 from the pointer 1950a3056aSZelalem Aweke * to the smc args structure in x0. 2050a3056aSZelalem Aweke * --------------------------------------------- 2150a3056aSZelalem Aweke */ 2250a3056aSZelalem Aweke .macro restore_args_call_smc 2350a3056aSZelalem Aweke ldp x6, x7, [x0, #TRP_ARG6] 2450a3056aSZelalem Aweke ldp x4, x5, [x0, #TRP_ARG4] 2550a3056aSZelalem Aweke ldp x2, x3, [x0, #TRP_ARG2] 2650a3056aSZelalem Aweke ldp x0, x1, [x0, #TRP_ARG0] 2750a3056aSZelalem Aweke smc #0 2850a3056aSZelalem Aweke .endm 2950a3056aSZelalem Aweke 3050a3056aSZelalem Aweke /* --------------------------------------------- 3150a3056aSZelalem Aweke * Entry point for TRP 3250a3056aSZelalem Aweke * --------------------------------------------- 3350a3056aSZelalem Aweke */ 3450a3056aSZelalem Aweketrp_head: 3550a3056aSZelalem Aweke bl plat_set_my_stack 36*00e81131SMark Dykes 37*00e81131SMark Dykes /* 38*00e81131SMark Dykes * Find out whether this is a cold or warm boot 39*00e81131SMark Dykes */ 40*00e81131SMark Dykes ldr x1, cold_boot_flag 41*00e81131SMark Dykes cbz x1, warm_boot 42*00e81131SMark Dykes 43*00e81131SMark Dykes /* 44*00e81131SMark Dykes * Update cold boot flag to indicate cold boot is done 45*00e81131SMark Dykes */ 46*00e81131SMark Dykes adr x2, cold_boot_flag 47*00e81131SMark Dykes str xzr, [x2] 48*00e81131SMark Dykes 4950a3056aSZelalem Aweke 5050a3056aSZelalem Aweke /* --------------------------------------------- 5150a3056aSZelalem Aweke * Zero out BSS section 5250a3056aSZelalem Aweke * --------------------------------------------- 5350a3056aSZelalem Aweke */ 5450a3056aSZelalem Aweke ldr x0, =__BSS_START__ 5550a3056aSZelalem Aweke ldr x1, =__BSS_SIZE__ 5650a3056aSZelalem Aweke bl zeromem 5750a3056aSZelalem Aweke 5850a3056aSZelalem Aweke bl trp_setup 5950a3056aSZelalem Aweke 6050a3056aSZelalem Aweke bl trp_main 61*00e81131SMark Dykeswarm_boot: 6250a3056aSZelalem Aweke mov_imm x0, RMI_RMM_REQ_COMPLETE 6350a3056aSZelalem Aweke mov x1, xzr 6450a3056aSZelalem Aweke smc #0 6550a3056aSZelalem Aweke b trp_handler 6650a3056aSZelalem Aweke 67*00e81131SMark Dykes /* 68*00e81131SMark Dykes * Flag to mark if it is a cold boot. 69*00e81131SMark Dykes * 1: cold boot, 0: warmboot. 70*00e81131SMark Dykes */ 71*00e81131SMark Dykes.align 3 72*00e81131SMark Dykescold_boot_flag: 73*00e81131SMark Dykes .dword 1 74*00e81131SMark Dykes 7550a3056aSZelalem Aweke /* --------------------------------------------- 7650a3056aSZelalem Aweke * Direct SMC call to BL31 service provided by 7750a3056aSZelalem Aweke * RMM Dispatcher 7850a3056aSZelalem Aweke * --------------------------------------------- 7950a3056aSZelalem Aweke */ 8050a3056aSZelalem Awekefunc trp_smc 8150a3056aSZelalem Aweke restore_args_call_smc 8250a3056aSZelalem Aweke ret 8350a3056aSZelalem Awekeendfunc trp_smc 8450a3056aSZelalem Aweke 8550a3056aSZelalem Aweke /* --------------------------------------------- 8650a3056aSZelalem Aweke * RMI call handler 8750a3056aSZelalem Aweke * --------------------------------------------- 8850a3056aSZelalem Aweke */ 8950a3056aSZelalem Awekefunc trp_handler 9050a3056aSZelalem Aweke bl trp_rmi_handler 9150a3056aSZelalem Aweke restore_args_call_smc 9250a3056aSZelalem Aweke b trp_handler 9350a3056aSZelalem Awekeendfunc trp_handler 94