Line data Source code
1 1 : /*
2 : * Copyright (c) 2023, Intel Corporation.
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_SIP_SVC_PROTO_H_
8 : #define ZEPHYR_INCLUDE_SIP_SVC_PROTO_H_
9 :
10 : /**
11 : * @file
12 : * @brief Arm SiP services communication protocol
13 : * between service provider and client.
14 : *
15 : * Client to fill in the input data in struct sip_svc_request format
16 : * when requesting SMC/HVC service via 'send' function.
17 : *
18 : * Service to fill in the SMC/HVC return value in struct sip_svc_response
19 : * format and pass to client via Callback.
20 : */
21 :
22 : /**
23 : * @brief Invalid id value
24 : */
25 1 : #define SIP_SVC_ID_INVALID 0xFFFFFFFF
26 :
27 : /** @brief Header format
28 : */
29 :
30 1 : #define SIP_SVC_PROTO_VER 0x0
31 :
32 0 : #define SIP_SVC_PROTO_HEADER_CODE_OFFSET 0
33 0 : #define SIP_SVC_PROTO_HEADER_CODE_MASK 0xFFFF
34 :
35 0 : #define SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET 16
36 0 : #define SIP_SVC_PROTO_HEADER_TRANS_ID_MASK 0xFF
37 :
38 0 : #define SIP_SVC_PROTO_HEADER_VER_OFFSET 30
39 0 : #define SIP_SVC_PROTO_HEADER_VER_MASK 0x3
40 :
41 0 : #define SIP_SVC_PROTO_HEADER(code, trans_id) \
42 : ((((code)&SIP_SVC_PROTO_HEADER_CODE_MASK) << SIP_SVC_PROTO_HEADER_CODE_OFFSET) | \
43 : (((trans_id)&SIP_SVC_PROTO_HEADER_TRANS_ID_MASK) \
44 : << SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET) | \
45 : ((SIP_SVC_PROTO_VER & SIP_SVC_PROTO_HEADER_VER_MASK) << SIP_SVC_PROTO_HEADER_VER_OFFSET))
46 :
47 0 : #define SIP_SVC_PROTO_HEADER_GET_CODE(header) \
48 : (((header) >> SIP_SVC_PROTO_HEADER_CODE_OFFSET) & SIP_SVC_PROTO_HEADER_CODE_MASK)
49 :
50 0 : #define SIP_SVC_PROTO_HEADER_GET_TRANS_ID(header) \
51 : (((header) >> SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET) & SIP_SVC_PROTO_HEADER_TRANS_ID_MASK)
52 :
53 0 : #define SIP_SVC_PROTO_HEADER_SET_TRANS_ID(header, trans_id) \
54 : (header) &= ~(SIP_SVC_PROTO_HEADER_TRANS_ID_MASK << SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET); \
55 : (header) |= (((trans_id)&SIP_SVC_PROTO_HEADER_TRANS_ID_MASK) \
56 : << SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET);
57 :
58 : /** @brief Arm SiP services command code in request header
59 : *
60 : * SIP_SVC_PROTO_CMD_SYNC
61 : * - Typical flow, synchronous request. Service expects EL3/EL2 firmware to
62 : * return the result immediately during SMC/HVC call.
63 : *
64 : * SIP_SVC_PROTO_CMD_ASYNC
65 : * - Asynchronous request. Service is required to poll the response via a
66 : * separate SMC/HVC call. Use this method if the request requires longer
67 : * processing in EL3/EL2.
68 : */
69 :
70 1 : #define SIP_SVC_PROTO_CMD_SYNC 0x0
71 0 : #define SIP_SVC_PROTO_CMD_ASYNC 0x1
72 0 : #define SIP_SVC_PROTO_CMD_MAX SIP_SVC_PROTO_CMD_ASYNC
73 :
74 : /** @brief Error code in response header
75 : *
76 : * SIP_SVC_PROTO_STATUS_OK
77 : * - Successfully execute the request.
78 : *
79 : * SIP_SVC_PROTO_STATUS_UNKNOWN
80 : * - Unrecognized SMC/HVC Function ID.
81 : *
82 : * SIP_SVC_PROTO_STATUS_BUSY
83 : * - The request is still in progress. Please try again.
84 : *
85 : * SIP_SVC_PROTO_STATUS_REJECT
86 : * - The request have been rejected due to improper input data.
87 : *
88 : * SIP_SVC_PROTO_STATUS_NO_RESPONSE
89 : * - No response from target hardware yet.
90 : *
91 : * SIP_SVC_PROTO_STATUS_ERROR
92 : * - Error occurred when executing the request.
93 : *
94 : * SIP_SVC_PROTO_STATUS_NOT_SUPPORT
95 : * - Unsupported Arm SiP services command code
96 : */
97 :
98 1 : #define SIP_SVC_PROTO_STATUS_OK 0x0
99 0 : #define SIP_SVC_PROTO_STATUS_UNKNOWN 0xFFFF
100 0 : #define SIP_SVC_PROTO_STATUS_BUSY 0x1
101 0 : #define SIP_SVC_PROTO_STATUS_REJECT 0x2
102 0 : #define SIP_SVC_PROTO_STATUS_NO_RESPONSE 0x3
103 0 : #define SIP_SVC_PROTO_STATUS_ERROR 0x4
104 :
105 : /** @brief SiP Service communication protocol
106 : * request format.
107 : *
108 : * request header
109 : * - bits [15: 0] Arm SiP services command code
110 : * - bits [23:16] Transaction ID (Filled in by sip_svc service)
111 : * - bits [29:24] Unused. Reserved.
112 : * - bits [31:30] Arm SiP services communication protocol version
113 : *
114 : * a0 - a7
115 : * - User input data to be filled into a0-a7 registers when trigger
116 : * SMC/HVC
117 : *
118 : * resp_data_addr
119 : * - This parameter only used by asynchronous command.
120 : * - Dynamic memory address for service to put the asynchronous response
121 : * data. The service will free this memory space if the client has
122 : * cancelled the transaction.
123 : *
124 : * resp_data_size
125 : * - This parameter only used by asynchronous command.
126 : * - Maximum memory size in bytes of resp_data_addr
127 : *
128 : * priv_data
129 : * - Memory address to client context. Service will pass this address back
130 : * to client in response format via callback.
131 : */
132 :
133 1 : struct sip_svc_request {
134 0 : uint32_t header;
135 0 : unsigned long a0;
136 0 : unsigned long a1;
137 0 : unsigned long a2;
138 0 : unsigned long a3;
139 0 : unsigned long a4;
140 0 : unsigned long a5;
141 0 : unsigned long a6;
142 0 : unsigned long a7;
143 0 : uint64_t resp_data_addr;
144 0 : uint32_t resp_data_size;
145 0 : void *priv_data;
146 : };
147 :
148 : /** @brief SiP Services service communication protocol
149 : * response format.
150 : *
151 : * response header
152 : * - bits [15: 0] Error code
153 : * - bits [23:16] Transaction ID
154 : * - bits [29:24] Unused. Reserved.
155 : * - bits [31:30] Arm SiP services communication protocol version
156 : *
157 : * a0 - a3
158 : * - SMC/HVC return value
159 : *
160 : * resp_data_addr
161 : * - This parameter only used by asynchronous command.
162 : * - Dynamic memory address that put the asynchronous response data.
163 : * This address is provided by client during request. Client is responsible
164 : * to free the memory space when receive the callback of a asynchronous
165 : * command transaction.The memory needs to be dynamically allocated,
166 : * the framework will free the allocated memory if the channel is in ABORT
167 : * state.
168 : *
169 : * resp_data_size
170 : * - This parameter only used by asynchronous command.
171 : * - Valid data size in bytes of resp_data_addr
172 : *
173 : * priv_data
174 : * - Memory address to client context which given during request.
175 : */
176 :
177 1 : struct sip_svc_response {
178 0 : uint32_t header;
179 0 : unsigned long a0;
180 0 : unsigned long a1;
181 0 : unsigned long a2;
182 0 : unsigned long a3;
183 0 : uint64_t resp_data_addr;
184 0 : uint32_t resp_data_size;
185 0 : void *priv_data;
186 : };
187 :
188 : #endif /* ZEPHYR_INCLUDE_SIP_SVC_PROTO_H_ */
|