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