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