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