150a3056aSZelalem Aweke/* 2*319fb084SSoby 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> 8*319fb084SSoby Mathew#include <services/rmmd_svc.h> 950a3056aSZelalem Aweke#include "trp_private.h" 1050a3056aSZelalem Aweke 1150a3056aSZelalem Aweke.global trp_head 1250a3056aSZelalem Aweke.global trp_smc 1350a3056aSZelalem Aweke 1450a3056aSZelalem Aweke.section ".head.text", "ax" 1550a3056aSZelalem Aweke 1650a3056aSZelalem Aweke /* --------------------------------------------- 1750a3056aSZelalem Aweke * Populate the params in x0-x7 from the pointer 1850a3056aSZelalem Aweke * to the smc args structure in x0. 1950a3056aSZelalem Aweke * --------------------------------------------- 2050a3056aSZelalem Aweke */ 2150a3056aSZelalem Aweke .macro restore_args_call_smc 2250a3056aSZelalem Aweke ldp x6, x7, [x0, #TRP_ARG6] 2350a3056aSZelalem Aweke ldp x4, x5, [x0, #TRP_ARG4] 2450a3056aSZelalem Aweke ldp x2, x3, [x0, #TRP_ARG2] 2550a3056aSZelalem Aweke ldp x0, x1, [x0, #TRP_ARG0] 2650a3056aSZelalem Aweke smc #0 2750a3056aSZelalem Aweke .endm 2850a3056aSZelalem Aweke 2950a3056aSZelalem Aweke /* --------------------------------------------- 3050a3056aSZelalem Aweke * Entry point for TRP 3150a3056aSZelalem Aweke * --------------------------------------------- 3250a3056aSZelalem Aweke */ 3350a3056aSZelalem Aweketrp_head: 3450a3056aSZelalem Aweke bl plat_set_my_stack 3500e81131SMark Dykes 3600e81131SMark Dykes /* 3700e81131SMark Dykes * Find out whether this is a cold or warm boot 3800e81131SMark Dykes */ 3900e81131SMark Dykes ldr x1, cold_boot_flag 4000e81131SMark Dykes cbz x1, warm_boot 4100e81131SMark Dykes 4200e81131SMark Dykes /* 4300e81131SMark Dykes * Update cold boot flag to indicate cold boot is done 4400e81131SMark Dykes */ 4500e81131SMark Dykes adr x2, cold_boot_flag 4600e81131SMark Dykes str xzr, [x2] 4700e81131SMark Dykes 4850a3056aSZelalem Aweke 4950a3056aSZelalem Aweke /* --------------------------------------------- 5050a3056aSZelalem Aweke * Zero out BSS section 5150a3056aSZelalem Aweke * --------------------------------------------- 5250a3056aSZelalem Aweke */ 5350a3056aSZelalem Aweke ldr x0, =__BSS_START__ 5450a3056aSZelalem Aweke ldr x1, =__BSS_SIZE__ 5550a3056aSZelalem Aweke bl zeromem 5650a3056aSZelalem Aweke 5750a3056aSZelalem Aweke bl trp_setup 5850a3056aSZelalem Aweke 5950a3056aSZelalem Aweke bl trp_main 6000e81131SMark Dykeswarm_boot: 61*319fb084SSoby Mathew mov_imm x0, RMMD_RMI_REQ_COMPLETE 6250a3056aSZelalem Aweke mov x1, xzr 6350a3056aSZelalem Aweke smc #0 6450a3056aSZelalem Aweke b trp_handler 6550a3056aSZelalem Aweke 6600e81131SMark Dykes /* 6700e81131SMark Dykes * Flag to mark if it is a cold boot. 6800e81131SMark Dykes * 1: cold boot, 0: warmboot. 6900e81131SMark Dykes */ 7000e81131SMark Dykes.align 3 7100e81131SMark Dykescold_boot_flag: 7200e81131SMark Dykes .dword 1 7300e81131SMark Dykes 7450a3056aSZelalem Aweke /* --------------------------------------------- 7550a3056aSZelalem Aweke * Direct SMC call to BL31 service provided by 7650a3056aSZelalem Aweke * RMM Dispatcher 7750a3056aSZelalem Aweke * --------------------------------------------- 7850a3056aSZelalem Aweke */ 7950a3056aSZelalem Awekefunc trp_smc 8050a3056aSZelalem Aweke restore_args_call_smc 8150a3056aSZelalem Aweke ret 8250a3056aSZelalem Awekeendfunc trp_smc 8350a3056aSZelalem Aweke 8450a3056aSZelalem Aweke /* --------------------------------------------- 8550a3056aSZelalem Aweke * RMI call handler 8650a3056aSZelalem Aweke * --------------------------------------------- 8750a3056aSZelalem Aweke */ 8850a3056aSZelalem Awekefunc trp_handler 8950a3056aSZelalem Aweke bl trp_rmi_handler 9050a3056aSZelalem Aweke restore_args_call_smc 9150a3056aSZelalem Aweke b trp_handler 9250a3056aSZelalem Awekeendfunc trp_handler 93