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 } else { 53 if (smc_fid == PMF_SMC_GET_TIMESTAMP_64 || 54 smc_fid == PMF_SMC_GET_TIMESTAMP_64_DEP) { 55 /* 56 * Return error code and the captured 57 * time-stamp to the caller. 58 * x0 --> error code. 59 * x1 --> time-stamp value. 60 */ 61 rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 62 (unsigned int)x3, &ts_value); 63 SMC_RET2(handle, rc, ts_value); 64 } 65 } 66 67 WARN("Unimplemented PMF Call: 0x%x \n", smc_fid); 68 SMC_RET1(handle, SMC_UNK); 69 } 70