1 /* 2 * Copyright (c) 2016-2018, 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 /* 41 * Return error code and the captured 42 * time-stamp to the caller. 43 * x0 --> error code. 44 * x1 - x2 --> time-stamp value. 45 */ 46 rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 47 (unsigned int)x3, &ts_value); 48 SMC_RET3(handle, rc, (uint32_t)ts_value, 49 (uint32_t)(ts_value >> 32)); 50 } 51 } else { 52 if (smc_fid == PMF_SMC_GET_TIMESTAMP_64) { 53 /* 54 * Return error code and the captured 55 * time-stamp to the caller. 56 * x0 --> error code. 57 * x1 --> time-stamp value. 58 */ 59 rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 60 (unsigned int)x3, &ts_value); 61 SMC_RET2(handle, rc, ts_value); 62 } 63 } 64 65 WARN("Unimplemented PMF Call: 0x%x \n", smc_fid); 66 SMC_RET1(handle, SMC_UNK); 67 } 68