1*c8284409SSoren Brinkmann /* 2*c8284409SSoren Brinkmann * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. 3*c8284409SSoren Brinkmann * 4*c8284409SSoren Brinkmann * Redistribution and use in source and binary forms, with or without 5*c8284409SSoren Brinkmann * modification, are permitted provided that the following conditions are met: 6*c8284409SSoren Brinkmann * 7*c8284409SSoren Brinkmann * Redistributions of source code must retain the above copyright notice, this 8*c8284409SSoren Brinkmann * list of conditions and the following disclaimer. 9*c8284409SSoren Brinkmann * 10*c8284409SSoren Brinkmann * Redistributions in binary form must reproduce the above copyright notice, 11*c8284409SSoren Brinkmann * this list of conditions and the following disclaimer in the documentation 12*c8284409SSoren Brinkmann * and/or other materials provided with the distribution. 13*c8284409SSoren Brinkmann * 14*c8284409SSoren Brinkmann * Neither the name of ARM nor the names of its contributors may be used 15*c8284409SSoren Brinkmann * to endorse or promote products derived from this software without specific 16*c8284409SSoren Brinkmann * prior written permission. 17*c8284409SSoren Brinkmann * 18*c8284409SSoren Brinkmann * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*c8284409SSoren Brinkmann * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*c8284409SSoren Brinkmann * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*c8284409SSoren Brinkmann * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*c8284409SSoren Brinkmann * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*c8284409SSoren Brinkmann * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*c8284409SSoren Brinkmann * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*c8284409SSoren Brinkmann * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*c8284409SSoren Brinkmann * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*c8284409SSoren Brinkmann * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*c8284409SSoren Brinkmann * POSSIBILITY OF SUCH DAMAGE. 29*c8284409SSoren Brinkmann */ 30*c8284409SSoren Brinkmann 31*c8284409SSoren Brinkmann /* Top level SMC handler for SiP calls. Dispatch PM calls to PM SMC handler. */ 32*c8284409SSoren Brinkmann 33*c8284409SSoren Brinkmann #include <runtime_svc.h> 34*c8284409SSoren Brinkmann #include <uuid.h> 35*c8284409SSoren Brinkmann #include "pm_svc_main.h" 36*c8284409SSoren Brinkmann 37*c8284409SSoren Brinkmann /* SMC function IDs for SiP Service queries */ 38*c8284409SSoren Brinkmann #define ZYNQMP_SIP_SVC_CALL_COUNT 0x8200ff00 39*c8284409SSoren Brinkmann #define ZYNQMP_SIP_SVC_UID 0x8200ff01 40*c8284409SSoren Brinkmann #define ZYNQMP_SIP_SVC_VERSION 0x8200ff03 41*c8284409SSoren Brinkmann 42*c8284409SSoren Brinkmann /* SiP Service Calls version numbers */ 43*c8284409SSoren Brinkmann #define SIP_SVC_VERSION_MAJOR 0 44*c8284409SSoren Brinkmann #define SIP_SVC_VERSION_MINOR 1 45*c8284409SSoren Brinkmann 46*c8284409SSoren Brinkmann /* These macros are used to identify PM calls from the SMC function ID */ 47*c8284409SSoren Brinkmann #define PM_FID_MASK 0xf000u 48*c8284409SSoren Brinkmann #define PM_FID_VALUE 0u 49*c8284409SSoren Brinkmann #define is_pm_fid(_fid) (((_fid) & PM_FID_MASK) == PM_FID_VALUE) 50*c8284409SSoren Brinkmann 51*c8284409SSoren Brinkmann /* SiP Service UUID */ 52*c8284409SSoren Brinkmann DEFINE_SVC_UUID(zynqmp_sip_uuid, 53*c8284409SSoren Brinkmann 0x2a1d9b5c, 0x8605, 0x4023, 0xa6, 0x1b, 54*c8284409SSoren Brinkmann 0xb9, 0x25, 0x82, 0x2d, 0xe3, 0xa5); 55*c8284409SSoren Brinkmann 56*c8284409SSoren Brinkmann /** 57*c8284409SSoren Brinkmann * sip_svc_setup() - Setup SiP Service 58*c8284409SSoren Brinkmann * 59*c8284409SSoren Brinkmann * Invokes PM setup 60*c8284409SSoren Brinkmann */ 61*c8284409SSoren Brinkmann static int32_t sip_svc_setup(void) 62*c8284409SSoren Brinkmann { 63*c8284409SSoren Brinkmann /* PM implementation as SiP Service */ 64*c8284409SSoren Brinkmann pm_setup(); 65*c8284409SSoren Brinkmann 66*c8284409SSoren Brinkmann return 0; 67*c8284409SSoren Brinkmann } 68*c8284409SSoren Brinkmann 69*c8284409SSoren Brinkmann /** 70*c8284409SSoren Brinkmann * sip_svc_smc_handler() - Top-level SiP Service SMC handler 71*c8284409SSoren Brinkmann * 72*c8284409SSoren Brinkmann * Handler for all SiP SMC calls. Handles standard SIP requests 73*c8284409SSoren Brinkmann * and calls PM SMC handler if the call is for a PM-API function. 74*c8284409SSoren Brinkmann */ 75*c8284409SSoren Brinkmann uint64_t sip_svc_smc_handler(uint32_t smc_fid, 76*c8284409SSoren Brinkmann uint64_t x1, 77*c8284409SSoren Brinkmann uint64_t x2, 78*c8284409SSoren Brinkmann uint64_t x3, 79*c8284409SSoren Brinkmann uint64_t x4, 80*c8284409SSoren Brinkmann void *cookie, 81*c8284409SSoren Brinkmann void *handle, 82*c8284409SSoren Brinkmann uint64_t flags) 83*c8284409SSoren Brinkmann { 84*c8284409SSoren Brinkmann /* Let PM SMC handler deal with PM-related requests */ 85*c8284409SSoren Brinkmann if (is_pm_fid(smc_fid)) { 86*c8284409SSoren Brinkmann return pm_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, 87*c8284409SSoren Brinkmann flags); 88*c8284409SSoren Brinkmann } 89*c8284409SSoren Brinkmann 90*c8284409SSoren Brinkmann switch (smc_fid) { 91*c8284409SSoren Brinkmann case ZYNQMP_SIP_SVC_CALL_COUNT: 92*c8284409SSoren Brinkmann /* PM functions + default functions */ 93*c8284409SSoren Brinkmann SMC_RET1(handle, PM_API_MAX + 2); 94*c8284409SSoren Brinkmann 95*c8284409SSoren Brinkmann case ZYNQMP_SIP_SVC_UID: 96*c8284409SSoren Brinkmann SMC_UUID_RET(handle, zynqmp_sip_uuid); 97*c8284409SSoren Brinkmann 98*c8284409SSoren Brinkmann case ZYNQMP_SIP_SVC_VERSION: 99*c8284409SSoren Brinkmann SMC_RET2(handle, SIP_SVC_VERSION_MAJOR, SIP_SVC_VERSION_MINOR); 100*c8284409SSoren Brinkmann 101*c8284409SSoren Brinkmann default: 102*c8284409SSoren Brinkmann WARN("Unimplemented SiP Service Call: 0x%x\n", smc_fid); 103*c8284409SSoren Brinkmann SMC_RET1(handle, SMC_UNK); 104*c8284409SSoren Brinkmann } 105*c8284409SSoren Brinkmann } 106*c8284409SSoren Brinkmann 107*c8284409SSoren Brinkmann /* Register PM Service Calls as runtime service */ 108*c8284409SSoren Brinkmann DECLARE_RT_SVC( 109*c8284409SSoren Brinkmann sip_svc, 110*c8284409SSoren Brinkmann OEN_SIP_START, 111*c8284409SSoren Brinkmann OEN_SIP_END, 112*c8284409SSoren Brinkmann SMC_TYPE_FAST, 113*c8284409SSoren Brinkmann sip_svc_setup, 114*c8284409SSoren Brinkmann sip_svc_smc_handler); 115