1a31d8983SYatharth Kochar /* 2*085e80ecSAntonio Nino Diaz * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 3a31d8983SYatharth Kochar * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5a31d8983SYatharth Kochar */ 6a31d8983SYatharth Kochar #include <assert.h> 7a31d8983SYatharth Kochar #include <debug.h> 8a31d8983SYatharth Kochar #include <platform.h> 9a31d8983SYatharth Kochar #include <pmf.h> 10*085e80ecSAntonio Nino Diaz #include <smccc_helpers.h> 11a31d8983SYatharth Kochar 12a31d8983SYatharth Kochar /* 13a31d8983SYatharth Kochar * This function is responsible for handling all PMF SMC calls. 14a31d8983SYatharth Kochar */ 15a31d8983SYatharth Kochar uintptr_t pmf_smc_handler(unsigned int smc_fid, 16a31d8983SYatharth Kochar u_register_t x1, 17a31d8983SYatharth Kochar u_register_t x2, 18a31d8983SYatharth Kochar u_register_t x3, 19a31d8983SYatharth Kochar u_register_t x4, 20a31d8983SYatharth Kochar void *cookie, 21a31d8983SYatharth Kochar void *handle, 22a31d8983SYatharth Kochar u_register_t flags) 23a31d8983SYatharth Kochar { 24a31d8983SYatharth Kochar int rc; 25a31d8983SYatharth Kochar unsigned long long ts_value; 26a31d8983SYatharth Kochar 27a31d8983SYatharth Kochar if (((smc_fid >> FUNCID_CC_SHIFT) & FUNCID_CC_MASK) == SMC_32) { 28a31d8983SYatharth Kochar 29a31d8983SYatharth Kochar x1 = (uint32_t)x1; 30a31d8983SYatharth Kochar x2 = (uint32_t)x2; 31a31d8983SYatharth Kochar x3 = (uint32_t)x3; 32a31d8983SYatharth Kochar 33a31d8983SYatharth Kochar switch (smc_fid) { 34a31d8983SYatharth Kochar case PMF_SMC_GET_TIMESTAMP_32: 35a31d8983SYatharth Kochar /* 36a31d8983SYatharth Kochar * Return error code and the captured 37a31d8983SYatharth Kochar * time-stamp to the caller. 38a31d8983SYatharth Kochar * x0 --> error code. 39a31d8983SYatharth Kochar * x1 - x2 --> time-stamp value. 40a31d8983SYatharth Kochar */ 41a31d8983SYatharth Kochar rc = pmf_get_timestamp_smc(x1, x2, x3, &ts_value); 42a31d8983SYatharth Kochar SMC_RET3(handle, rc, (uint32_t)ts_value, 43a31d8983SYatharth Kochar (uint32_t)(ts_value >> 32)); 44a31d8983SYatharth Kochar 45a31d8983SYatharth Kochar default: 46a31d8983SYatharth Kochar break; 47a31d8983SYatharth Kochar } 48a31d8983SYatharth Kochar } else { 49a31d8983SYatharth Kochar switch (smc_fid) { 50a31d8983SYatharth Kochar case PMF_SMC_GET_TIMESTAMP_64: 51a31d8983SYatharth Kochar /* 52a31d8983SYatharth Kochar * Return error code and the captured 53a31d8983SYatharth Kochar * time-stamp to the caller. 54a31d8983SYatharth Kochar * x0 --> error code. 55a31d8983SYatharth Kochar * x1 --> time-stamp value. 56a31d8983SYatharth Kochar */ 57a31d8983SYatharth Kochar rc = pmf_get_timestamp_smc(x1, x2, x3, &ts_value); 58a31d8983SYatharth Kochar SMC_RET2(handle, rc, ts_value); 59a31d8983SYatharth Kochar 60a31d8983SYatharth Kochar default: 61a31d8983SYatharth Kochar break; 62a31d8983SYatharth Kochar } 63a31d8983SYatharth Kochar } 64a31d8983SYatharth Kochar 65a31d8983SYatharth Kochar WARN("Unimplemented PMF Call: 0x%x \n", smc_fid); 66a31d8983SYatharth Kochar SMC_RET1(handle, SMC_UNK); 67a31d8983SYatharth Kochar } 68