1*ff2743e5SAnson Huang /* 2*ff2743e5SAnson Huang * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3*ff2743e5SAnson Huang * 4*ff2743e5SAnson Huang * SPDX-License-Identifier: BSD-3-Clause 5*ff2743e5SAnson Huang */ 6*ff2743e5SAnson Huang 7*ff2743e5SAnson Huang /*! 8*ff2743e5SAnson Huang * Header file for the RPC implementation. 9*ff2743e5SAnson Huang */ 10*ff2743e5SAnson Huang 11*ff2743e5SAnson Huang #ifndef SC_RPC_H 12*ff2743e5SAnson Huang #define SC_RPC_H 13*ff2743e5SAnson Huang 14*ff2743e5SAnson Huang /* Includes */ 15*ff2743e5SAnson Huang 16*ff2743e5SAnson Huang #include <sci/sci_types.h> 17*ff2743e5SAnson Huang #include <sci/sci_ipc.h> 18*ff2743e5SAnson Huang #include <stdbool.h> 19*ff2743e5SAnson Huang 20*ff2743e5SAnson Huang /* Defines */ 21*ff2743e5SAnson Huang 22*ff2743e5SAnson Huang #define SC_RPC_VERSION 1U 23*ff2743e5SAnson Huang 24*ff2743e5SAnson Huang #define SC_RPC_MAX_MSG 8U 25*ff2743e5SAnson Huang 26*ff2743e5SAnson Huang #define RPC_VER(MSG) ((MSG)->version) 27*ff2743e5SAnson Huang #define RPC_SIZE(MSG) ((MSG)->size) 28*ff2743e5SAnson Huang #define RPC_SVC(MSG) ((MSG)->svc) 29*ff2743e5SAnson Huang #define RPC_FUNC(MSG) ((MSG)->func) 30*ff2743e5SAnson Huang #define RPC_R8(MSG) ((MSG)->func) 31*ff2743e5SAnson Huang #define RPC_I32(MSG, IDX) ((MSG)->DATA.i32[(IDX) / 4U]) 32*ff2743e5SAnson Huang #define RPC_I16(MSG, IDX) ((MSG)->DATA.i16[(IDX) / 2U]) 33*ff2743e5SAnson Huang #define RPC_I8(MSG, IDX) ((MSG)->DATA.i8[(IDX)]) 34*ff2743e5SAnson Huang #define RPC_U32(MSG, IDX) ((MSG)->DATA.u32[(IDX) / 4U]) 35*ff2743e5SAnson Huang #define RPC_U16(MSG, IDX) ((MSG)->DATA.u16[(IDX) / 2U]) 36*ff2743e5SAnson Huang #define RPC_U8(MSG, IDX) ((MSG)->DATA.u8[(IDX)]) 37*ff2743e5SAnson Huang 38*ff2743e5SAnson Huang #define SC_RPC_SVC_UNKNOWN 0U 39*ff2743e5SAnson Huang #define SC_RPC_SVC_RETURN 1U 40*ff2743e5SAnson Huang #define SC_RPC_SVC_PM 2U 41*ff2743e5SAnson Huang #define SC_RPC_SVC_RM 3U 42*ff2743e5SAnson Huang #define SC_RPC_SVC_TIMER 5U 43*ff2743e5SAnson Huang #define SC_RPC_SVC_PAD 6U 44*ff2743e5SAnson Huang #define SC_RPC_SVC_MISC 7U 45*ff2743e5SAnson Huang #define SC_RPC_SVC_IRQ 8U 46*ff2743e5SAnson Huang #define SC_RPC_SVC_ABORT 9U 47*ff2743e5SAnson Huang 48*ff2743e5SAnson Huang #define SC_RPC_ASYNC_STATE_RD_START 0U 49*ff2743e5SAnson Huang #define SC_RPC_ASYNC_STATE_RD_ACTIVE 1U 50*ff2743e5SAnson Huang #define SC_RPC_ASYNC_STATE_RD_DONE 2U 51*ff2743e5SAnson Huang #define SC_RPC_ASYNC_STATE_WR_START 3U 52*ff2743e5SAnson Huang #define SC_RPC_ASYNC_STATE_WR_ACTIVE 4U 53*ff2743e5SAnson Huang #define SC_RPC_ASYNC_STATE_WR_DONE 5U 54*ff2743e5SAnson Huang 55*ff2743e5SAnson Huang #define SC_RPC_MU_GIR_SVC 0x1U 56*ff2743e5SAnson Huang #define SC_RPC_MU_GIR_DBG 0x8U 57*ff2743e5SAnson Huang 58*ff2743e5SAnson Huang /* Types */ 59*ff2743e5SAnson Huang 60*ff2743e5SAnson Huang typedef uint8_t sc_rpc_svc_t; 61*ff2743e5SAnson Huang 62*ff2743e5SAnson Huang typedef struct sc_rpc_msg_s { 63*ff2743e5SAnson Huang uint8_t version; 64*ff2743e5SAnson Huang uint8_t size; 65*ff2743e5SAnson Huang uint8_t svc; 66*ff2743e5SAnson Huang uint8_t func; 67*ff2743e5SAnson Huang union { 68*ff2743e5SAnson Huang int32_t i32[(SC_RPC_MAX_MSG - 1U)]; 69*ff2743e5SAnson Huang int16_t i16[(SC_RPC_MAX_MSG - 1U) * 2U]; 70*ff2743e5SAnson Huang int8_t i8[(SC_RPC_MAX_MSG - 1U) * 4U]; 71*ff2743e5SAnson Huang uint32_t u32[(SC_RPC_MAX_MSG - 1U)]; 72*ff2743e5SAnson Huang uint16_t u16[(SC_RPC_MAX_MSG - 1U) * 2U]; 73*ff2743e5SAnson Huang uint8_t u8[(SC_RPC_MAX_MSG - 1U) * 4U]; 74*ff2743e5SAnson Huang } DATA; 75*ff2743e5SAnson Huang } sc_rpc_msg_t; 76*ff2743e5SAnson Huang 77*ff2743e5SAnson Huang typedef uint8_t sc_rpc_async_state_t; 78*ff2743e5SAnson Huang 79*ff2743e5SAnson Huang typedef struct sc_rpc_async_msg_s { 80*ff2743e5SAnson Huang sc_rpc_async_state_t state; 81*ff2743e5SAnson Huang uint8_t wordIdx; 82*ff2743e5SAnson Huang sc_rpc_msg_t msg; 83*ff2743e5SAnson Huang uint32_t timeStamp; 84*ff2743e5SAnson Huang } sc_rpc_async_msg_t; 85*ff2743e5SAnson Huang 86*ff2743e5SAnson Huang /* Functions */ 87*ff2743e5SAnson Huang 88*ff2743e5SAnson Huang /*! 89*ff2743e5SAnson Huang * This is an internal function to send an RPC message over an IPC 90*ff2743e5SAnson Huang * channel. It is called by client-side SCFW API function shims. 91*ff2743e5SAnson Huang * 92*ff2743e5SAnson Huang * @param[in] ipc IPC handle 93*ff2743e5SAnson Huang * @param[in,out] msg handle to a message 94*ff2743e5SAnson Huang * @param[in] no_resp response flag 95*ff2743e5SAnson Huang * 96*ff2743e5SAnson Huang * If \a no_resp is SC_FALSE then this function waits for a response 97*ff2743e5SAnson Huang * and returns the result in \a msg. 98*ff2743e5SAnson Huang */ 99*ff2743e5SAnson Huang void sc_call_rpc(sc_ipc_t ipc, sc_rpc_msg_t *msg, bool no_resp); 100*ff2743e5SAnson Huang 101*ff2743e5SAnson Huang /*! 102*ff2743e5SAnson Huang * This is an internal function to dispath an RPC call that has 103*ff2743e5SAnson Huang * arrived via IPC over an MU. It is called by server-side SCFW. 104*ff2743e5SAnson Huang * 105*ff2743e5SAnson Huang * @param[in] mu MU message arrived on 106*ff2743e5SAnson Huang * @param[in,out] msg handle to a message 107*ff2743e5SAnson Huang * 108*ff2743e5SAnson Huang * The function result is returned in \a msg. 109*ff2743e5SAnson Huang */ 110*ff2743e5SAnson Huang void sc_rpc_dispatch(sc_rsrc_t mu, sc_rpc_msg_t *msg); 111*ff2743e5SAnson Huang 112*ff2743e5SAnson Huang /*! 113*ff2743e5SAnson Huang * This function translates an RPC message and forwards on to the 114*ff2743e5SAnson Huang * normal RPC API. It is used only by hypervisors. 115*ff2743e5SAnson Huang * 116*ff2743e5SAnson Huang * @param[in] ipc IPC handle 117*ff2743e5SAnson Huang * @param[in,out] msg handle to a message 118*ff2743e5SAnson Huang * 119*ff2743e5SAnson Huang * This function decodes a message, calls macros to translate the 120*ff2743e5SAnson Huang * resources, pads, addresses, partitions, memory regions, etc. and 121*ff2743e5SAnson Huang * then forwards on to the hypervisors SCFW API.Return results are 122*ff2743e5SAnson Huang * translated back abd placed back into the message to be returned 123*ff2743e5SAnson Huang * to the original API. 124*ff2743e5SAnson Huang */ 125*ff2743e5SAnson Huang void sc_rpc_xlate(sc_ipc_t ipc, sc_rpc_msg_t *msg); 126*ff2743e5SAnson Huang 127*ff2743e5SAnson Huang #endif /* SC_RPC_H */ 128