1a42bad37SYann Gautier /* 2a42bad37SYann Gautier * Copyright (c) 2014-2019, STMicroelectronics - All Rights Reserved 3a42bad37SYann Gautier * 4a42bad37SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 5a42bad37SYann Gautier */ 6a42bad37SYann Gautier 7a42bad37SYann Gautier #include <stdbool.h> 8a42bad37SYann Gautier #include <stdint.h> 9a42bad37SYann Gautier 10a42bad37SYann Gautier #include <common/debug.h> 11a42bad37SYann Gautier #include <common/runtime_svc.h> 12*b4734308SPeng Fan #include <drivers/scmi-msg.h> 13a42bad37SYann Gautier #include <lib/psci/psci.h> 14a42bad37SYann Gautier #include <tools_share/uuid.h> 15a42bad37SYann Gautier 16a42bad37SYann Gautier #include <stm32mp1_smc.h> 17a42bad37SYann Gautier 18c7ba52daSYann Gautier #include "bsec_svc.h" 19c7ba52daSYann Gautier 20a42bad37SYann Gautier /* STM32 SiP Service UUID */ 21a42bad37SYann Gautier DEFINE_SVC_UUID2(stm32_sip_svc_uid, 22a42bad37SYann Gautier 0xa778aa50, 0xf49b, 0x144a, 0x8a, 0x5e, 23a42bad37SYann Gautier 0x26, 0x4d, 0x59, 0x94, 0xc2, 0x14); 24a42bad37SYann Gautier 25a42bad37SYann Gautier /* Setup STM32MP1 Standard Services */ 26a42bad37SYann Gautier static int32_t stm32mp1_svc_setup(void) 27a42bad37SYann Gautier { 28a42bad37SYann Gautier /* 29a42bad37SYann Gautier * PSCI is the only specification implemented as a Standard Service. 30a42bad37SYann Gautier * Invoke PSCI setup from here. 31a42bad37SYann Gautier */ 32a42bad37SYann Gautier return 0; 33a42bad37SYann Gautier } 34a42bad37SYann Gautier 35a42bad37SYann Gautier /* 36a42bad37SYann Gautier * Top-level Standard Service SMC handler. This handler will in turn dispatch 37a42bad37SYann Gautier * calls to PSCI SMC handler. 38a42bad37SYann Gautier */ 39a42bad37SYann Gautier static uintptr_t stm32mp1_svc_smc_handler(uint32_t smc_fid, u_register_t x1, 40a42bad37SYann Gautier u_register_t x2, u_register_t x3, 41a42bad37SYann Gautier u_register_t x4, void *cookie, 42a42bad37SYann Gautier void *handle, u_register_t flags) 43a42bad37SYann Gautier { 44a42bad37SYann Gautier uint32_t ret1 = 0U, ret2 = 0U; 45a42bad37SYann Gautier bool ret_uid = false, ret2_enabled = false; 46a42bad37SYann Gautier 47a42bad37SYann Gautier switch (smc_fid) { 48a42bad37SYann Gautier case STM32_SIP_SVC_CALL_COUNT: 49a42bad37SYann Gautier ret1 = STM32_COMMON_SIP_NUM_CALLS; 50a42bad37SYann Gautier break; 51a42bad37SYann Gautier 52a42bad37SYann Gautier case STM32_SIP_SVC_UID: 53a42bad37SYann Gautier /* Return UUID to the caller */ 54a42bad37SYann Gautier ret_uid = true; 55a42bad37SYann Gautier break; 56a42bad37SYann Gautier 57a42bad37SYann Gautier case STM32_SIP_SVC_VERSION: 58a42bad37SYann Gautier /* Return the version of current implementation */ 59a42bad37SYann Gautier ret1 = STM32_SIP_SVC_VERSION_MAJOR; 60a42bad37SYann Gautier ret2 = STM32_SIP_SVC_VERSION_MINOR; 61a42bad37SYann Gautier ret2_enabled = true; 62a42bad37SYann Gautier break; 63a42bad37SYann Gautier 64c7ba52daSYann Gautier case STM32_SMC_BSEC: 65c7ba52daSYann Gautier ret1 = bsec_main(x1, x2, x3, &ret2); 66c7ba52daSYann Gautier ret2_enabled = true; 67c7ba52daSYann Gautier break; 68c7ba52daSYann Gautier 69fdaaaeb4SEtienne Carriere case STM32_SIP_SMC_SCMI_AGENT0: 70fdaaaeb4SEtienne Carriere scmi_smt_fastcall_smc_entry(0); 71fdaaaeb4SEtienne Carriere break; 72fdaaaeb4SEtienne Carriere case STM32_SIP_SMC_SCMI_AGENT1: 73fdaaaeb4SEtienne Carriere scmi_smt_fastcall_smc_entry(1); 74fdaaaeb4SEtienne Carriere break; 75fdaaaeb4SEtienne Carriere 76a42bad37SYann Gautier default: 77a42bad37SYann Gautier WARN("Unimplemented STM32MP1 Service Call: 0x%x\n", smc_fid); 78a42bad37SYann Gautier ret1 = SMC_UNK; 79a42bad37SYann Gautier break; 80a42bad37SYann Gautier } 81a42bad37SYann Gautier 82a42bad37SYann Gautier if (ret_uid) { 83a42bad37SYann Gautier SMC_UUID_RET(handle, stm32_sip_svc_uid); 84a42bad37SYann Gautier } 85a42bad37SYann Gautier 86a42bad37SYann Gautier if (ret2_enabled) { 87a42bad37SYann Gautier SMC_RET2(handle, ret1, ret2); 88a42bad37SYann Gautier } 89a42bad37SYann Gautier 90a42bad37SYann Gautier SMC_RET1(handle, ret1); 91a42bad37SYann Gautier } 92a42bad37SYann Gautier 93a42bad37SYann Gautier /* Register Standard Service Calls as runtime service */ 94a42bad37SYann Gautier DECLARE_RT_SVC(stm32mp1_sip_svc, 95a42bad37SYann Gautier OEN_SIP_START, 96a42bad37SYann Gautier OEN_SIP_END, 97a42bad37SYann Gautier SMC_TYPE_FAST, 98a42bad37SYann Gautier stm32mp1_svc_setup, 99a42bad37SYann Gautier stm32mp1_svc_smc_handler 100a42bad37SYann Gautier ); 101