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