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
rockchip_plat_sip_handler(uint32_t smc_fid,u_register_t x1,u_register_t x2,u_register_t x3,u_register_t x4,void * cookie,void * handle,u_register_t flags)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 */
sip_smc_handler(uint32_t smc_fid,u_register_t x1,u_register_t x2,u_register_t x3,u_register_t x4,void * cookie,void * handle,u_register_t flags)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