GNU Linux-libre 4.14.251-gnu1
[releases.git] / drivers / staging / vc04_services / bcm2835-camera / mmal-msg.h
1 /*
2  * Broadcom BM2835 V4L2 driver
3  *
4  * Copyright © 2013 Raspberry Pi (Trading) Ltd.
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License.  See the file COPYING in the main directory of this archive
8  * for more details.
9  *
10  * Authors: Vincent Sanders <vincent.sanders@collabora.co.uk>
11  *          Dave Stevenson <dsteve@broadcom.com>
12  *          Simon Mellor <simellor@broadcom.com>
13  *          Luke Diamand <luked@broadcom.com>
14  */
15
16 /* all the data structures which serialise the MMAL protocol. note
17  * these are directly mapped onto the recived message data.
18  *
19  * BEWARE: They seem to *assume* pointers are u32 and that there is no
20  * structure padding!
21  *
22  * NOTE: this implementation uses kernel types to ensure sizes. Rather
23  * than assigning values to enums to force their size the
24  * implementation uses fixed size types and not the enums (though the
25  * comments have the actual enum type
26  */
27
28 #define VC_MMAL_VER 15
29 #define VC_MMAL_MIN_VER 10
30 #define VC_MMAL_SERVER_NAME  MAKE_FOURCC("mmal")
31
32 /* max total message size is 512 bytes */
33 #define MMAL_MSG_MAX_SIZE 512
34 /* with six 32bit header elements max payload is therefore 488 bytes */
35 #define MMAL_MSG_MAX_PAYLOAD 488
36
37 #include "mmal-msg-common.h"
38 #include "mmal-msg-format.h"
39 #include "mmal-msg-port.h"
40
41 enum mmal_msg_type {
42         MMAL_MSG_TYPE_QUIT = 1,
43         MMAL_MSG_TYPE_SERVICE_CLOSED,
44         MMAL_MSG_TYPE_GET_VERSION,
45         MMAL_MSG_TYPE_COMPONENT_CREATE,
46         MMAL_MSG_TYPE_COMPONENT_DESTROY, /* 5 */
47         MMAL_MSG_TYPE_COMPONENT_ENABLE,
48         MMAL_MSG_TYPE_COMPONENT_DISABLE,
49         MMAL_MSG_TYPE_PORT_INFO_GET,
50         MMAL_MSG_TYPE_PORT_INFO_SET,
51         MMAL_MSG_TYPE_PORT_ACTION, /* 10 */
52         MMAL_MSG_TYPE_BUFFER_FROM_HOST,
53         MMAL_MSG_TYPE_BUFFER_TO_HOST,
54         MMAL_MSG_TYPE_GET_STATS,
55         MMAL_MSG_TYPE_PORT_PARAMETER_SET,
56         MMAL_MSG_TYPE_PORT_PARAMETER_GET, /* 15 */
57         MMAL_MSG_TYPE_EVENT_TO_HOST,
58         MMAL_MSG_TYPE_GET_CORE_STATS_FOR_PORT,
59         MMAL_MSG_TYPE_OPAQUE_ALLOCATOR,
60         MMAL_MSG_TYPE_CONSUME_MEM,
61         MMAL_MSG_TYPE_LMK, /* 20 */
62         MMAL_MSG_TYPE_OPAQUE_ALLOCATOR_DESC,
63         MMAL_MSG_TYPE_DRM_GET_LHS32,
64         MMAL_MSG_TYPE_DRM_GET_TIME,
65         MMAL_MSG_TYPE_BUFFER_FROM_HOST_ZEROLEN,
66         MMAL_MSG_TYPE_PORT_FLUSH, /* 25 */
67         MMAL_MSG_TYPE_HOST_LOG,
68         MMAL_MSG_TYPE_MSG_LAST
69 };
70
71 /* port action request messages differ depending on the action type */
72 enum mmal_msg_port_action_type {
73         MMAL_MSG_PORT_ACTION_TYPE_UNKNOWN = 0,      /* Unkown action */
74         MMAL_MSG_PORT_ACTION_TYPE_ENABLE,           /* Enable a port */
75         MMAL_MSG_PORT_ACTION_TYPE_DISABLE,          /* Disable a port */
76         MMAL_MSG_PORT_ACTION_TYPE_FLUSH,            /* Flush a port */
77         MMAL_MSG_PORT_ACTION_TYPE_CONNECT,          /* Connect ports */
78         MMAL_MSG_PORT_ACTION_TYPE_DISCONNECT,       /* Disconnect ports */
79         MMAL_MSG_PORT_ACTION_TYPE_SET_REQUIREMENTS, /* Set buffer requirements*/
80 };
81
82 struct mmal_msg_header {
83         u32 magic;
84         u32 type; /** enum mmal_msg_type */
85
86         /* Opaque handle to the control service */
87         u32 control_service;
88
89         u32 context; /** a u32 per message context */
90         u32 status; /** The status of the vchiq operation */
91         u32 padding;
92 };
93
94 /* Send from VC to host to report version */
95 struct mmal_msg_version {
96         u32 flags;
97         u32 major;
98         u32 minor;
99         u32 minimum;
100 };
101
102 /* request to VC to create component */
103 struct mmal_msg_component_create {
104         u32 client_component; /* component context */
105         char name[128];
106         u32 pid;                /* For debug */
107 };
108
109 /* reply from VC to component creation request */
110 struct mmal_msg_component_create_reply {
111         u32 status;     /* enum mmal_msg_status - how does this differ to
112                          * the one in the header?
113                          */
114         u32 component_handle; /* VideoCore handle for component */
115         u32 input_num;        /* Number of input ports */
116         u32 output_num;       /* Number of output ports */
117         u32 clock_num;        /* Number of clock ports */
118 };
119
120 /* request to VC to destroy a component */
121 struct mmal_msg_component_destroy {
122         u32 component_handle;
123 };
124
125 struct mmal_msg_component_destroy_reply {
126         u32 status; /** The component destruction status */
127 };
128
129 /* request and reply to VC to enable a component */
130 struct mmal_msg_component_enable {
131         u32 component_handle;
132 };
133
134 struct mmal_msg_component_enable_reply {
135         u32 status; /** The component enable status */
136 };
137
138 /* request and reply to VC to disable a component */
139 struct mmal_msg_component_disable {
140         u32 component_handle;
141 };
142
143 struct mmal_msg_component_disable_reply {
144         u32 status; /** The component disable status */
145 };
146
147 /* request to VC to get port information */
148 struct mmal_msg_port_info_get {
149         u32 component_handle;  /* component handle port is associated with */
150         u32 port_type;         /* enum mmal_msg_port_type */
151         u32 index;             /* port index to query */
152 };
153
154 /* reply from VC to get port info request */
155 struct mmal_msg_port_info_get_reply {
156         u32 status; /** enum mmal_msg_status */
157         u32 component_handle;  /* component handle port is associated with */
158         u32 port_type;         /* enum mmal_msg_port_type */
159         u32 port_index;        /* port indexed in query */
160         s32 found;             /* unused */
161         u32 port_handle;               /**< Handle to use for this port */
162         struct mmal_port port;
163         struct mmal_es_format format; /* elementary stream format */
164         union mmal_es_specific_format es; /* es type specific data */
165         u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE]; /* es extra data */
166 };
167
168 /* request to VC to set port information */
169 struct mmal_msg_port_info_set {
170         u32 component_handle;
171         u32 port_type;         /* enum mmal_msg_port_type */
172         u32 port_index;           /* port indexed in query */
173         struct mmal_port port;
174         struct mmal_es_format format;
175         union mmal_es_specific_format es;
176         u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
177 };
178
179 /* reply from VC to port info set request */
180 struct mmal_msg_port_info_set_reply {
181         u32 status;
182         u32 component_handle;  /* component handle port is associated with */
183         u32 port_type;         /* enum mmal_msg_port_type */
184         u32 index;             /* port indexed in query */
185         s32 found;             /* unused */
186         u32 port_handle;               /**< Handle to use for this port */
187         struct mmal_port port;
188         struct mmal_es_format format;
189         union mmal_es_specific_format es;
190         u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
191 };
192
193 /* port action requests that take a mmal_port as a parameter */
194 struct mmal_msg_port_action_port {
195         u32 component_handle;
196         u32 port_handle;
197         u32 action; /* enum mmal_msg_port_action_type */
198         struct mmal_port port;
199 };
200
201 /* port action requests that take handles as a parameter */
202 struct mmal_msg_port_action_handle {
203         u32 component_handle;
204         u32 port_handle;
205         u32 action; /* enum mmal_msg_port_action_type */
206         u32 connect_component_handle;
207         u32 connect_port_handle;
208 };
209
210 struct mmal_msg_port_action_reply {
211         u32 status; /** The port action operation status */
212 };
213
214 /* MMAL buffer transfer */
215
216 /** Size of space reserved in a buffer message for short messages. */
217 #define MMAL_VC_SHORT_DATA 128
218
219 /** Signals that the current payload is the end of the stream of data */
220 #define MMAL_BUFFER_HEADER_FLAG_EOS                    (1<<0)
221 /** Signals that the start of the current payload starts a frame */
222 #define MMAL_BUFFER_HEADER_FLAG_FRAME_START            (1<<1)
223 /** Signals that the end of the current payload ends a frame */
224 #define MMAL_BUFFER_HEADER_FLAG_FRAME_END              (1<<2)
225 /** Signals that the current payload contains only complete frames (>1) */
226 #define MMAL_BUFFER_HEADER_FLAG_FRAME                  \
227         (MMAL_BUFFER_HEADER_FLAG_FRAME_START|MMAL_BUFFER_HEADER_FLAG_FRAME_END)
228 /** Signals that the current payload is a keyframe (i.e. self decodable) */
229 #define MMAL_BUFFER_HEADER_FLAG_KEYFRAME               (1<<3)
230 /** Signals a discontinuity in the stream of data (e.g. after a seek).
231  * Can be used for instance by a decoder to reset its state
232  */
233 #define MMAL_BUFFER_HEADER_FLAG_DISCONTINUITY          (1<<4)
234 /** Signals a buffer containing some kind of config data for the component
235  * (e.g. codec config data)
236  */
237 #define MMAL_BUFFER_HEADER_FLAG_CONFIG                 (1<<5)
238 /** Signals an encrypted payload */
239 #define MMAL_BUFFER_HEADER_FLAG_ENCRYPTED              (1<<6)
240 /** Signals a buffer containing side information */
241 #define MMAL_BUFFER_HEADER_FLAG_CODECSIDEINFO          (1<<7)
242 /** Signals a buffer which is the snapshot/postview image from a stills
243  * capture
244  */
245 #define MMAL_BUFFER_HEADER_FLAGS_SNAPSHOT              (1<<8)
246 /** Signals a buffer which contains data known to be corrupted */
247 #define MMAL_BUFFER_HEADER_FLAG_CORRUPTED              (1<<9)
248 /** Signals that a buffer failed to be transmitted */
249 #define MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED    (1<<10)
250
251 struct mmal_driver_buffer {
252         u32 magic;
253         u32 component_handle;
254         u32 port_handle;
255         u32 client_context;
256 };
257
258 /* buffer header */
259 struct mmal_buffer_header {
260         u32 next; /* next header */
261         u32 priv; /* framework private data */
262         u32 cmd;
263         u32 data;
264         u32 alloc_size;
265         u32 length;
266         u32 offset;
267         u32 flags;
268         s64 pts;
269         s64 dts;
270         u32 type;
271         u32 user_data;
272 };
273
274 struct mmal_buffer_header_type_specific {
275         union {
276                 struct {
277                 u32 planes;
278                 u32 offset[4];
279                 u32 pitch[4];
280                 u32 flags;
281                 } video;
282         } u;
283 };
284
285 struct mmal_msg_buffer_from_host {
286         /* The front 32 bytes of the buffer header are copied
287          * back to us in the reply to allow for context. This
288          * area is used to store two mmal_driver_buffer structures to
289          * allow for multiple concurrent service users.
290          */
291         /* control data */
292         struct mmal_driver_buffer drvbuf;
293
294         /* referenced control data for passthrough buffer management */
295         struct mmal_driver_buffer drvbuf_ref;
296         struct mmal_buffer_header buffer_header; /* buffer header itself */
297         struct mmal_buffer_header_type_specific buffer_header_type_specific;
298         s32 is_zero_copy;
299         s32 has_reference;
300
301         /** allows short data to be xfered in control message */
302         u32 payload_in_message;
303         u8 short_data[MMAL_VC_SHORT_DATA];
304 };
305
306 /* port parameter setting */
307
308 #define MMAL_WORKER_PORT_PARAMETER_SPACE      96
309
310 struct mmal_msg_port_parameter_set {
311         u32 component_handle; /* component */
312         u32 port_handle;      /* port */
313         u32 id;     /* Parameter ID  */
314         u32 size;      /* Parameter size */
315         uint32_t value[MMAL_WORKER_PORT_PARAMETER_SPACE];
316 };
317
318 struct mmal_msg_port_parameter_set_reply {
319         u32 status;     /* enum mmal_msg_status todo: how does this
320                          * differ to the one in the header?
321                          */
322 };
323
324 /* port parameter getting */
325
326 struct mmal_msg_port_parameter_get {
327         u32 component_handle; /* component */
328         u32 port_handle;      /* port */
329         u32 id;     /* Parameter ID  */
330         u32 size;      /* Parameter size */
331 };
332
333 struct mmal_msg_port_parameter_get_reply {
334         u32 status;           /* Status of mmal_port_parameter_get call */
335         u32 id;     /* Parameter ID  */
336         u32 size;      /* Parameter size */
337         uint32_t value[MMAL_WORKER_PORT_PARAMETER_SPACE];
338 };
339
340 /* event messages */
341 #define MMAL_WORKER_EVENT_SPACE 256
342
343 struct mmal_msg_event_to_host {
344         u32 client_component; /* component context */
345
346         u32 port_type;
347         u32 port_num;
348
349         u32 cmd;
350         u32 length;
351         u8 data[MMAL_WORKER_EVENT_SPACE];
352         u32 delayed_buffer;
353 };
354
355 /* all mmal messages are serialised through this structure */
356 struct mmal_msg {
357         /* header */
358         struct mmal_msg_header h;
359         /* payload */
360         union {
361                 struct mmal_msg_version version;
362
363                 struct mmal_msg_component_create component_create;
364                 struct mmal_msg_component_create_reply component_create_reply;
365
366                 struct mmal_msg_component_destroy component_destroy;
367                 struct mmal_msg_component_destroy_reply component_destroy_reply;
368
369                 struct mmal_msg_component_enable component_enable;
370                 struct mmal_msg_component_enable_reply component_enable_reply;
371
372                 struct mmal_msg_component_disable component_disable;
373                 struct mmal_msg_component_disable_reply component_disable_reply;
374
375                 struct mmal_msg_port_info_get port_info_get;
376                 struct mmal_msg_port_info_get_reply port_info_get_reply;
377
378                 struct mmal_msg_port_info_set port_info_set;
379                 struct mmal_msg_port_info_set_reply port_info_set_reply;
380
381                 struct mmal_msg_port_action_port port_action_port;
382                 struct mmal_msg_port_action_handle port_action_handle;
383                 struct mmal_msg_port_action_reply port_action_reply;
384
385                 struct mmal_msg_buffer_from_host buffer_from_host;
386
387                 struct mmal_msg_port_parameter_set port_parameter_set;
388                 struct mmal_msg_port_parameter_set_reply
389                         port_parameter_set_reply;
390                 struct mmal_msg_port_parameter_get
391                         port_parameter_get;
392                 struct mmal_msg_port_parameter_get_reply
393                         port_parameter_get_reply;
394
395                 struct mmal_msg_event_to_host event_to_host;
396
397                 u8 payload[MMAL_MSG_MAX_PAYLOAD];
398         } u;
399 };