xref: /rk3399_ARM-atf/plat/imx/common/include/sci/sci_rpc.h (revision ff2743e544f0f82381ebb9dff8f14eacb837d2e0)
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