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