1c8284409SSoren Brinkmann /* 2c8284409SSoren Brinkmann * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. 3c8284409SSoren Brinkmann * 4*82cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5c8284409SSoren Brinkmann */ 6c8284409SSoren Brinkmann 7c8284409SSoren Brinkmann /* Top level SMC handler for SiP calls. Dispatch PM calls to PM SMC handler. */ 8c8284409SSoren Brinkmann 9c8284409SSoren Brinkmann #include <runtime_svc.h> 10c8284409SSoren Brinkmann #include <uuid.h> 11c8284409SSoren Brinkmann #include "pm_svc_main.h" 12c8284409SSoren Brinkmann 13c8284409SSoren Brinkmann /* SMC function IDs for SiP Service queries */ 14c8284409SSoren Brinkmann #define ZYNQMP_SIP_SVC_CALL_COUNT 0x8200ff00 15c8284409SSoren Brinkmann #define ZYNQMP_SIP_SVC_UID 0x8200ff01 16c8284409SSoren Brinkmann #define ZYNQMP_SIP_SVC_VERSION 0x8200ff03 17c8284409SSoren Brinkmann 18c8284409SSoren Brinkmann /* SiP Service Calls version numbers */ 19c8284409SSoren Brinkmann #define SIP_SVC_VERSION_MAJOR 0 20c8284409SSoren Brinkmann #define SIP_SVC_VERSION_MINOR 1 21c8284409SSoren Brinkmann 22c8284409SSoren Brinkmann /* These macros are used to identify PM calls from the SMC function ID */ 23c8284409SSoren Brinkmann #define PM_FID_MASK 0xf000u 24c8284409SSoren Brinkmann #define PM_FID_VALUE 0u 25c8284409SSoren Brinkmann #define is_pm_fid(_fid) (((_fid) & PM_FID_MASK) == PM_FID_VALUE) 26c8284409SSoren Brinkmann 27c8284409SSoren Brinkmann /* SiP Service UUID */ 28c8284409SSoren Brinkmann DEFINE_SVC_UUID(zynqmp_sip_uuid, 29c8284409SSoren Brinkmann 0x2a1d9b5c, 0x8605, 0x4023, 0xa6, 0x1b, 30c8284409SSoren Brinkmann 0xb9, 0x25, 0x82, 0x2d, 0xe3, 0xa5); 31c8284409SSoren Brinkmann 32c8284409SSoren Brinkmann /** 33c8284409SSoren Brinkmann * sip_svc_setup() - Setup SiP Service 34c8284409SSoren Brinkmann * 35c8284409SSoren Brinkmann * Invokes PM setup 36c8284409SSoren Brinkmann */ 37c8284409SSoren Brinkmann static int32_t sip_svc_setup(void) 38c8284409SSoren Brinkmann { 39c8284409SSoren Brinkmann /* PM implementation as SiP Service */ 40c8284409SSoren Brinkmann pm_setup(); 41c8284409SSoren Brinkmann 42c8284409SSoren Brinkmann return 0; 43c8284409SSoren Brinkmann } 44c8284409SSoren Brinkmann 45c8284409SSoren Brinkmann /** 46c8284409SSoren Brinkmann * sip_svc_smc_handler() - Top-level SiP Service SMC handler 47c8284409SSoren Brinkmann * 48c8284409SSoren Brinkmann * Handler for all SiP SMC calls. Handles standard SIP requests 49c8284409SSoren Brinkmann * and calls PM SMC handler if the call is for a PM-API function. 50c8284409SSoren Brinkmann */ 51c8284409SSoren Brinkmann uint64_t sip_svc_smc_handler(uint32_t smc_fid, 52c8284409SSoren Brinkmann uint64_t x1, 53c8284409SSoren Brinkmann uint64_t x2, 54c8284409SSoren Brinkmann uint64_t x3, 55c8284409SSoren Brinkmann uint64_t x4, 56c8284409SSoren Brinkmann void *cookie, 57c8284409SSoren Brinkmann void *handle, 58c8284409SSoren Brinkmann uint64_t flags) 59c8284409SSoren Brinkmann { 60c8284409SSoren Brinkmann /* Let PM SMC handler deal with PM-related requests */ 61c8284409SSoren Brinkmann if (is_pm_fid(smc_fid)) { 62c8284409SSoren Brinkmann return pm_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, 63c8284409SSoren Brinkmann flags); 64c8284409SSoren Brinkmann } 65c8284409SSoren Brinkmann 66c8284409SSoren Brinkmann switch (smc_fid) { 67c8284409SSoren Brinkmann case ZYNQMP_SIP_SVC_CALL_COUNT: 68c8284409SSoren Brinkmann /* PM functions + default functions */ 69c8284409SSoren Brinkmann SMC_RET1(handle, PM_API_MAX + 2); 70c8284409SSoren Brinkmann 71c8284409SSoren Brinkmann case ZYNQMP_SIP_SVC_UID: 72c8284409SSoren Brinkmann SMC_UUID_RET(handle, zynqmp_sip_uuid); 73c8284409SSoren Brinkmann 74c8284409SSoren Brinkmann case ZYNQMP_SIP_SVC_VERSION: 75c8284409SSoren Brinkmann SMC_RET2(handle, SIP_SVC_VERSION_MAJOR, SIP_SVC_VERSION_MINOR); 76c8284409SSoren Brinkmann 77c8284409SSoren Brinkmann default: 78c8284409SSoren Brinkmann WARN("Unimplemented SiP Service Call: 0x%x\n", smc_fid); 79c8284409SSoren Brinkmann SMC_RET1(handle, SMC_UNK); 80c8284409SSoren Brinkmann } 81c8284409SSoren Brinkmann } 82c8284409SSoren Brinkmann 83c8284409SSoren Brinkmann /* Register PM Service Calls as runtime service */ 84c8284409SSoren Brinkmann DECLARE_RT_SVC( 85c8284409SSoren Brinkmann sip_svc, 86c8284409SSoren Brinkmann OEN_SIP_START, 87c8284409SSoren Brinkmann OEN_SIP_END, 88c8284409SSoren Brinkmann SMC_TYPE_FAST, 89c8284409SSoren Brinkmann sip_svc_setup, 90c8284409SSoren Brinkmann sip_svc_smc_handler); 91