1a31d8983SYatharth Kochar /* 2085e80ecSAntonio 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> 10085e80ecSAntonio 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 333eacacc0SJonathan Wright if (smc_fid == PMF_SMC_GET_TIMESTAMP_32) { 34a31d8983SYatharth Kochar /* 35a31d8983SYatharth Kochar * Return error code and the captured 36a31d8983SYatharth Kochar * time-stamp to the caller. 37a31d8983SYatharth Kochar * x0 --> error code. 38a31d8983SYatharth Kochar * x1 - x2 --> time-stamp value. 39a31d8983SYatharth Kochar */ 40*195e363fSAntonio Nino Diaz rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 41*195e363fSAntonio Nino Diaz (unsigned int)x3, &ts_value); 42a31d8983SYatharth Kochar SMC_RET3(handle, rc, (uint32_t)ts_value, 43a31d8983SYatharth Kochar (uint32_t)(ts_value >> 32)); 44a31d8983SYatharth Kochar } 45a31d8983SYatharth Kochar } else { 463eacacc0SJonathan Wright if (smc_fid == PMF_SMC_GET_TIMESTAMP_64) { 47a31d8983SYatharth Kochar /* 48a31d8983SYatharth Kochar * Return error code and the captured 49a31d8983SYatharth Kochar * time-stamp to the caller. 50a31d8983SYatharth Kochar * x0 --> error code. 51a31d8983SYatharth Kochar * x1 --> time-stamp value. 52a31d8983SYatharth Kochar */ 53*195e363fSAntonio Nino Diaz rc = pmf_get_timestamp_smc((unsigned int)x1, x2, 54*195e363fSAntonio Nino Diaz (unsigned int)x3, &ts_value); 55a31d8983SYatharth Kochar SMC_RET2(handle, rc, ts_value); 56a31d8983SYatharth Kochar } 57a31d8983SYatharth Kochar } 58a31d8983SYatharth Kochar 59a31d8983SYatharth Kochar WARN("Unimplemented PMF Call: 0x%x \n", smc_fid); 60a31d8983SYatharth Kochar SMC_RET1(handle, SMC_UNK); 61a31d8983SYatharth Kochar } 62