1/**
2 * Copyright(c) 2011 Trusted Logic.   All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 *  * Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in
12 *    the documentation and/or other materials provided with the
13 *    distribution.
14 *  * Neither the name Trusted Logic nor the names of its
15 *    contributors may be used to endorse or promote products derived
16 *    from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef __SCHANNEL6_PROTOCOL_H__
32#define __SCHANNEL6_PROTOCOL_H__
33
34#include "s_type.h"
35
36/**
37 * Time representation.
38 */
39typedef uint64_t SCTIME;
40
41#define SCTIME_IMMEDIATE ((uint64_t) 0x0000000000000000ULL)
42#define SCTIME_INFINITE  ((uint64_t) 0xFFFFFFFFFFFFFFFFULL)
43
44/*
45 * Message types
46 */
47#define SCX_CREATE_DEVICE_CONTEXT   0x02
48#define SCX_DESTROY_DEVICE_CONTEXT  0xFD
49#define SCX_REGISTER_SHARED_MEMORY  0xF7
50#define SCX_RELEASE_SHARED_MEMORY   0xF9
51#define SCX_OPEN_CLIENT_SESSION     0xF0
52#define SCX_CLOSE_CLIENT_SESSION    0xF2
53#define SCX_INVOKE_CLIENT_COMMAND   0xF5
54#define SCX_CANCEL_CLIENT_OPERATION 0xF4
55#define SCX_MANAGEMENT              0xFE
56
57/*
58 * Shared mem flags
59 */
60#define SCX_SHARED_MEM_FLAG_INPUT   1
61#define SCX_SHARED_MEM_FLAG_OUTPUT  2
62#define SCX_SHARED_MEM_FLAG_INOUT   3
63
64/*
65 * Parameter types
66 */
67#define SCX_PARAM_TYPE_NONE                     0x0
68#define SCX_PARAM_TYPE_VALUE_INPUT              0x1
69#define SCX_PARAM_TYPE_VALUE_OUTPUT             0x2
70#define SCX_PARAM_TYPE_VALUE_INOUT              0x3
71#define SCX_PARAM_TYPE_MEMREF_TEMP_INPUT        0x5
72#define SCX_PARAM_TYPE_MEMREF_TEMP_OUTPUT       0x6
73#define SCX_PARAM_TYPE_MEMREF_TEMP_INOUT        0x7
74#define SCX_PARAM_TYPE_MEMREF_INPUT             0xD
75#define SCX_PARAM_TYPE_MEMREF_OUTPUT            0xE
76#define SCX_PARAM_TYPE_MEMREF_INOUT             0xF
77
78#define SCX_PARAM_TYPE_INPUT_FLAG                0x1
79#define SCX_PARAM_TYPE_OUTPUT_FLAG               0x2
80#define SCX_PARAM_TYPE_MEMREF_FLAG               0x4
81#define SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG    0x8
82
83#define SCX_PARAM_TYPE_IS_TMPREF(nParamType) (((nParamType) & (SCX_PARAM_TYPE_MEMREF_FLAG | SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG)) == SCX_PARAM_TYPE_MEMREF_FLAG)
84
85#define SCX_MAKE_PARAM_TYPES(t0, t1, t2, t3) ((t0) | ((t1) << 4) | ((t2) << 8) | ((t3) << 12))
86#define SCX_GET_PARAM_TYPE(t, i) (((t) >> (4*i)) & 0xF)
87
88/*
89 * return origins
90 */
91#define SCX_ORIGIN_COMMS       2
92#define SCX_ORIGIN_TEE         3
93#define SCX_ORIGIN_TRUSTED_APP 4
94
95/*
96 * Login types
97 */
98#include "schannel6_logins.h"
99
100/*
101 * Limits and sizes
102 */
103
104/* Maximum number of L1 descriptors covered by a registered shared memory block.
105   Must be kept in synch with TF_MAX_COARSE_PAGES in tf_protocol.h
106   in the Linux kernel driver. */
107#define SCHANNEL6_MAX_DESCRIPTORS_PER_REGISTERED_SHARED_MEM 128
108
109/**
110 * Command parameters.
111 */
112typedef struct
113{
114   uint32_t    a;
115   uint32_t    b;
116}SCHANNEL6_COMMAND_PARAM_VALUE;
117
118typedef struct
119{
120   uint32_t    nDescriptor;
121   uint32_t    nSize;
122   uint32_t    nOffset;     /* Socket: 4 weak bits of the address (for alignement checks) */
123
124}SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF;
125
126typedef struct
127{
128   S_HANDLE    hBlock;
129   uint32_t    nSize;
130   uint32_t    nOffset;
131
132}SCHANNEL6_COMMAND_PARAM_MEMREF;
133
134typedef union
135{
136   SCHANNEL6_COMMAND_PARAM_VALUE        sValue;
137   SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF  sTempMemref;
138   SCHANNEL6_COMMAND_PARAM_MEMREF       sMemref;
139
140} SCHANNEL6_COMMAND_PARAM;
141
142typedef struct
143{
144   uint32_t a;
145   uint32_t b;
146} SCHANNEL6_ANSWER_PARAM_VALUE;
147
148typedef struct
149{
150   uint32_t _ignored;
151   uint32_t nSize;
152} SCHANNEL6_ANSWER_PARAM_SIZE;
153
154typedef union
155{
156   SCHANNEL6_ANSWER_PARAM_SIZE  sSize;
157   SCHANNEL6_ANSWER_PARAM_VALUE sValue;
158} SCHANNEL6_ANSWER_PARAM;
159
160/**
161 * Command messages.
162 */
163 typedef struct
164{
165   uint8_t                       nMessageSize;
166   uint8_t                       nMessageType;
167   uint16_t                      nMessageInfo;
168   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
169}SCHANNEL6_COMMAND_HEADER;
170
171typedef struct
172{
173   uint8_t                       nMessageSize;
174   uint8_t                       nMessageType;
175   uint16_t                      nMessageInfo_RFU;
176   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
177   uint32_t                      nDeviceContextID; /* an opaque Normal World identifier for the device context */
178}SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND;
179
180typedef struct
181{
182   uint8_t                       nMessageSize;
183   uint8_t                       nMessageType;
184   uint16_t                      nParamTypes;
185   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
186   S_HANDLE                      hDeviceContext;
187   S_HANDLE                      hClientSession;
188   uint64_t                      sTimeout;
189   uint32_t                      nCancellationID;
190   uint32_t                      nClientCommandIdentifier;
191   SCHANNEL6_COMMAND_PARAM       sParams[4];
192}SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND;
193
194typedef struct
195{
196   uint8_t                       nMessageSize;
197   uint8_t                       nMessageType;
198   uint16_t                      nParamTypes;
199   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
200   S_HANDLE                      hDeviceContext;
201   uint32_t                      nCancellationID;
202   SCTIME                        sTimeout;
203   S_UUID                        sDestinationUUID;
204   SCHANNEL6_COMMAND_PARAM       sParams[4];
205   uint32_t                      nLoginType;
206   uint8_t                       sLoginData[20]; /* Size depends on the login type. */
207
208}SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND;
209
210typedef struct
211{
212   uint8_t                       nMessageSize;
213   uint8_t                       nMessageType;
214   uint16_t                      nMemoryFlags;
215   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
216   S_HANDLE                      hDeviceContext;
217   uint32_t                      nBlockID;
218   uint32_t                      nSharedMemSize;
219   uint32_t                      nSharedMemStartOffset;
220   uint32_t                      nSharedMemDescriptors[SCHANNEL6_MAX_DESCRIPTORS_PER_REGISTERED_SHARED_MEM];
221
222}SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND;
223
224typedef struct
225{
226   uint8_t                       nMessageSize;
227   uint8_t                       nMessageType;
228   uint16_t                      nMessageInfo_RFU;
229   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
230   S_HANDLE                      hDeviceContext;
231   S_HANDLE                      hBlock;
232
233}SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND;
234
235typedef struct
236{
237   uint8_t                       nMessageSize;
238   uint8_t                       nMessageType;
239   uint16_t                      nMessageInfo_RFU;
240   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
241   S_HANDLE                      hDeviceContext;
242   S_HANDLE                      hClientSession;
243   uint32_t                      nCancellationID;
244
245}SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND;
246
247typedef struct
248{
249   uint8_t                       nMessageSize;
250   uint8_t                       nMessageType;
251   uint16_t                      nMessageInfo_RFU;
252   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
253   S_HANDLE                      hDeviceContext;
254   S_HANDLE                      hClientSession;
255
256}SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND;
257
258typedef struct
259{
260   uint8_t                       nMessageSize;
261   uint8_t                       nMessageType;
262   uint16_t                      nMessageInfo_RFU;
263   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
264   S_HANDLE                      hDeviceContext;
265
266}SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND;
267
268#define SCHANNEL6_MANAGEMENT_COMMAND_HIBERNATE            1
269#define SCHANNEL6_MANAGEMENT_COMMAND_SHUTDOWN             2
270#define SCHANNEL6_MANAGEMENT_COMMAND_PREPARE_FOR_CORE_OFF 3
271#define SCHANNEL6_MANAGEMENT_COMMAND_RESUME_FROM_CORE_OFF 4
272
273typedef struct
274{
275   uint8_t                       nMessageSize;
276   uint8_t                       nMessageType;
277   uint16_t                      nCommand;
278   uint32_t                      nOperationID; /* an opaque Normal World identifier for the operation */
279   uint32_t                      nW3BSize;
280   uint32_t                      nW3BStartOffset;
281#ifdef SCHANNEL_TRUSTZONE
282   uint32_t                      nSharedMemDescriptors[128];
283#endif
284}SCHANNEL6_MANAGEMENT_COMMAND;
285
286typedef union
287{
288   SCHANNEL6_COMMAND_HEADER                            sHeader;
289   SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND             sCreateDeviceContext;
290   SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND            sDestroyDeviceContext;
291   SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND               sOpenClientSession;
292   SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND              sCloseClientSession;
293   SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND            sRegisterSharedMemory;
294   SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND             sReleaseSharedMemory;
295   SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND             sInvokeClientCommand;
296   SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND           sCancelClientOperation;
297   SCHANNEL6_MANAGEMENT_COMMAND                        sManagement;
298
299}SCHANNEL6_COMMAND;
300
301/**
302 * Answer messages.
303 */
304typedef struct
305{
306   uint8_t                   nMessageSize;
307   uint8_t                   nMessageType;
308   uint16_t                  nMessageInfo;
309   uint32_t                  nOperationID;
310   uint32_t                  nErrorCode;
311}SCHANNEL6_ANSWER_HEADER;
312
313typedef struct
314{
315   uint8_t                   nMessageSize;
316   uint8_t                   nMessageType;
317   uint16_t                  nMessageInfo_RFU;
318   uint32_t                  nOperationID;
319   uint32_t                  nErrorCode;
320   S_HANDLE                  hDeviceContext;
321}SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER;
322
323typedef struct
324{
325   uint8_t                   nMessageSize;
326   uint8_t                   nMessageType;
327   uint8_t                   nReturnOrigin;
328   uint8_t                   __nReserved;
329   uint32_t                  nOperationID;
330   uint32_t                  nErrorCode;
331   SCHANNEL6_ANSWER_PARAM    sAnswers[4];
332
333}SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER;
334
335typedef struct
336{
337   uint8_t                   nMessageSize;
338   uint8_t                   nMessageType;
339   uint8_t                   nReturnOrigin;
340   uint8_t                   __nReserved;
341   uint32_t                  nOperationID;
342   uint32_t                  nErrorCode;
343   S_HANDLE                  hClientSession;
344   SCHANNEL6_ANSWER_PARAM    sAnswers[4];
345}SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER;
346
347typedef struct
348{
349   uint8_t                   nMessageSize;
350   uint8_t                   nMessageType;
351   uint16_t                  nMessageInfo_RFU;
352   uint32_t                  nOperationID;
353   uint32_t                  nErrorCode;
354}SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER;
355
356typedef struct
357{
358   uint8_t                   nMessageSize;
359   uint8_t                   nMessageType;
360   uint16_t                  nMessageInfo_RFU;
361   uint32_t                  nOperationID;
362   uint32_t                  nErrorCode;
363   S_HANDLE                  hBlock;
364
365}SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER;
366
367typedef struct
368{
369   uint8_t                   nMessageSize;
370   uint8_t                   nMessageType;
371   uint16_t                  nMessageInfo_RFU;
372   uint32_t                  nOperationID;
373   uint32_t                  nErrorCode;
374   uint32_t                  nBlockID;
375
376}SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER;
377
378typedef struct
379{
380   uint8_t                   nMessageSize;
381   uint8_t                   nMessageType;
382   uint16_t                  nMessageInfo_RFU;
383   uint32_t                  nOperationID;
384   uint32_t                  nErrorCode;
385   uint32_t                  nDeviceContextID;
386
387}SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER;
388
389typedef struct
390{
391   uint8_t                   nMessageSize;
392   uint8_t                   nMessageType;
393   uint16_t                  nMessageInfo_RFU;
394   uint32_t                  nOperationID;
395   uint32_t                  nErrorCode;
396
397}SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER;
398
399typedef struct
400{
401   uint8_t                   nMessageSize;
402   uint8_t                   nMessageType;
403   uint16_t                  nMessageInfo_RFU;
404   uint32_t                  nOperationID;
405   uint32_t                  nErrorCode;
406
407}SCHANNEL6_MANAGEMENT_ANSWER;
408
409typedef union
410{
411   SCHANNEL6_ANSWER_HEADER                    sHeader;
412   SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER     sCreateDeviceContext;
413   SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER       sOpenClientSession;
414   SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER    sRegisterSharedMemory;
415   SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER     sReleaseSharedMemory;
416   SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER     sInvokeClientCommand;
417   SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER    sDestroyDeviceContext;
418   SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER   sCancelClientOperation;
419   SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER      sCloseClientSession;
420   SCHANNEL6_MANAGEMENT_ANSWER                sManagement;
421
422}SCHANNEL6_ANSWER;
423
424
425#endif /* __SCHANNEL6_PROTOCOL_H__ */
426