1 /* 2 * Copyright (c) 2016-2024, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 9 #include <common/debug.h> 10 #include <lib/pmf/pmf.h> 11 #include <plat/common/platform.h> 12 #include <smccc_helpers.h> 13 14 /* 15 * This function is responsible for handling all PMF SMC calls. 16 */ 17 uintptr_t pmf_smc_handler(unsigned int smc_fid, 18 u_register_t x1, 19 u_register_t x2, 20 u_register_t x3, 21 u_register_t x4, 22 void *cookie, 23 void *handle, 24 u_register_t flags) 25 { 26 int rc; 27 unsigned long long ts_value; 28 29 /* Determine if the cpu exists of not */ 30 if (!is_valid_mpidr(x2)) 31 return PSCI_E_INVALID_PARAMS; 32 33 if (((smc_fid >> FUNCID_CC_SHIFT) & FUNCID_CC_MASK) == SMC_32) { 34 35 x1 = (uint32_t)x1; 36 x2 = (uint32_t)x2; 37 x3 = (uint32_t)x3; 38 39 if (smc_fid == PMF_SMC_GET_TIMESTAMP_32 || 40 smc_fid == PMF_SMC_GET_TIMESTAMP_32_DEP) { 41 /* 42 * Return error code and the captured 43 * time-stamp to the caller. 44 * x0 --> error code. 45 * x1 - x2 --> time-stamp value. 46 */ 47 rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 48 (unsigned int)x3, &ts_value); 49 SMC_RET3(handle, rc, (uint32_t)ts_value, 50 (uint32_t)(ts_value >> 32)); 51 } 52 53 if (smc_fid == PMF_SMC_GET_VERSION_32) { 54 SMC_RET2(handle, SMC_OK, PMF_SMC_VERSION); 55 } 56 } else { 57 if (smc_fid == PMF_SMC_GET_TIMESTAMP_64 || 58 smc_fid == PMF_SMC_GET_TIMESTAMP_64_DEP) { 59 /* 60 * Return error code and the captured 61 * time-stamp to the caller. 62 * x0 --> error code. 63 * x1 --> time-stamp value. 64 */ 65 rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 66 (unsigned int)x3, &ts_value); 67 SMC_RET2(handle, rc, ts_value); 68 } 69 70 if (smc_fid == PMF_SMC_GET_VERSION_64) { 71 SMC_RET2(handle, SMC_OK, PMF_SMC_VERSION); 72 } 73 } 74 75 WARN("Unimplemented PMF Call: 0x%x \n", smc_fid); 76 SMC_RET1(handle, SMC_UNK); 77 } 78