11760db68SCaesar Wang /* 21760db68SCaesar Wang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 31760db68SCaesar Wang * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 51760db68SCaesar Wang */ 61760db68SCaesar Wang 71760db68SCaesar Wang #include <assert.h> 8*09d40e0eSAntonio Nino Diaz 9*09d40e0eSAntonio Nino Diaz #include <common/debug.h> 10*09d40e0eSAntonio Nino Diaz #include <common/runtime_svc.h> 11*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 12*09d40e0eSAntonio Nino Diaz #include <tools_share/uuid.h> 13*09d40e0eSAntonio Nino Diaz 141760db68SCaesar Wang #include <plat_sip_calls.h> 151760db68SCaesar Wang #include <rockchip_sip_svc.h> 161760db68SCaesar Wang 171760db68SCaesar Wang /* Rockchip SiP Service UUID */ 1803364865SRoberto Vargas DEFINE_SVC_UUID2(rk_sip_svc_uid, 1903364865SRoberto Vargas 0xe2c76fe8, 0x3e31, 0xe611, 0xb7, 0x0d, 201760db68SCaesar Wang 0x8f, 0x88, 0xee, 0x74, 0x7b, 0x72); 211760db68SCaesar Wang 221760db68SCaesar Wang #pragma weak rockchip_plat_sip_handler 2357d1e5faSMasahiro Yamada uintptr_t rockchip_plat_sip_handler(uint32_t smc_fid, 2457d1e5faSMasahiro Yamada u_register_t x1, 2557d1e5faSMasahiro Yamada u_register_t x2, 2657d1e5faSMasahiro Yamada u_register_t x3, 2757d1e5faSMasahiro Yamada u_register_t x4, 281760db68SCaesar Wang void *cookie, 291760db68SCaesar Wang void *handle, 3057d1e5faSMasahiro Yamada u_register_t flags) 311760db68SCaesar Wang { 321760db68SCaesar Wang ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 331760db68SCaesar Wang SMC_RET1(handle, SMC_UNK); 341760db68SCaesar Wang } 351760db68SCaesar Wang 361760db68SCaesar Wang /* 371760db68SCaesar Wang * This function is responsible for handling all SiP calls from the NS world 381760db68SCaesar Wang */ 3957d1e5faSMasahiro Yamada uintptr_t sip_smc_handler(uint32_t smc_fid, 4057d1e5faSMasahiro Yamada u_register_t x1, 4157d1e5faSMasahiro Yamada u_register_t x2, 4257d1e5faSMasahiro Yamada u_register_t x3, 4357d1e5faSMasahiro Yamada u_register_t x4, 441760db68SCaesar Wang void *cookie, 451760db68SCaesar Wang void *handle, 4657d1e5faSMasahiro Yamada u_register_t flags) 471760db68SCaesar Wang { 481760db68SCaesar Wang uint32_t ns; 491760db68SCaesar Wang 501760db68SCaesar Wang /* Determine which security state this SMC originated from */ 511760db68SCaesar Wang ns = is_caller_non_secure(flags); 521760db68SCaesar Wang if (!ns) 531760db68SCaesar Wang SMC_RET1(handle, SMC_UNK); 541760db68SCaesar Wang 551760db68SCaesar Wang switch (smc_fid) { 561760db68SCaesar Wang case SIP_SVC_CALL_COUNT: 571760db68SCaesar Wang /* Return the number of Rockchip SiP Service Calls. */ 581760db68SCaesar Wang SMC_RET1(handle, 591760db68SCaesar Wang RK_COMMON_SIP_NUM_CALLS + RK_PLAT_SIP_NUM_CALLS); 601760db68SCaesar Wang 611760db68SCaesar Wang case SIP_SVC_UID: 621760db68SCaesar Wang /* Return UID to the caller */ 631760db68SCaesar Wang SMC_UUID_RET(handle, rk_sip_svc_uid); 641760db68SCaesar Wang 651760db68SCaesar Wang case SIP_SVC_VERSION: 661760db68SCaesar Wang /* Return the version of current implementation */ 671760db68SCaesar Wang SMC_RET2(handle, RK_SIP_SVC_VERSION_MAJOR, 681760db68SCaesar Wang RK_SIP_SVC_VERSION_MINOR); 691760db68SCaesar Wang 701760db68SCaesar Wang default: 711760db68SCaesar Wang return rockchip_plat_sip_handler(smc_fid, x1, x2, x3, x4, 721760db68SCaesar Wang cookie, handle, flags); 731760db68SCaesar Wang } 741760db68SCaesar Wang } 751760db68SCaesar Wang 761760db68SCaesar Wang /* Define a runtime service descriptor for fast SMC calls */ 771760db68SCaesar Wang DECLARE_RT_SVC( 781760db68SCaesar Wang rockchip_sip_svc, 791760db68SCaesar Wang OEN_SIP_START, 801760db68SCaesar Wang OEN_SIP_END, 811760db68SCaesar Wang SMC_TYPE_FAST, 821760db68SCaesar Wang NULL, 831760db68SCaesar Wang sip_smc_handler 841760db68SCaesar Wang ); 85