| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Broadcom BCM2835 V4L2 driver
- *
- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
- *
- * Authors: Vincent Sanders @ Collabora
- * Dave Stevenson @ Broadcom
- * (now dave.stevenson@raspberrypi.org)
- * Simon Mellor @ Broadcom
- * Luke Diamand @ Broadcom
- */
- /*
- * all the data structures which serialise the MMAL protocol. note
- * these are directly mapped onto the received message data.
- *
- * BEWARE: They seem to *assume* pointers are u32 and that there is no
- * structure padding!
- *
- * NOTE: this implementation uses kernel types to ensure sizes. Rather
- * than assigning values to enums to force their size the
- * implementation uses fixed size types and not the enums (though the
- * comments have the actual enum type
- */
- #ifndef MMAL_MSG_H
- #define MMAL_MSG_H
- #define VC_MMAL_VER 15
- #define VC_MMAL_MIN_VER 10
- /* max total message size is 512 bytes */
- #define MMAL_MSG_MAX_SIZE 512
- /* with six 32bit header elements max payload is therefore 488 bytes */
- #define MMAL_MSG_MAX_PAYLOAD 488
- #include "mmal-msg-common.h"
- #include "mmal-msg-format.h"
- #include "mmal-msg-port.h"
- #include "mmal-vchiq.h"
- enum mmal_msg_type {
- MMAL_MSG_TYPE_QUIT = 1,
- MMAL_MSG_TYPE_SERVICE_CLOSED,
- MMAL_MSG_TYPE_GET_VERSION,
- MMAL_MSG_TYPE_COMPONENT_CREATE,
- MMAL_MSG_TYPE_COMPONENT_DESTROY, /* 5 */
- MMAL_MSG_TYPE_COMPONENT_ENABLE,
- MMAL_MSG_TYPE_COMPONENT_DISABLE,
- MMAL_MSG_TYPE_PORT_INFO_GET,
- MMAL_MSG_TYPE_PORT_INFO_SET,
- MMAL_MSG_TYPE_PORT_ACTION, /* 10 */
- MMAL_MSG_TYPE_BUFFER_FROM_HOST,
- MMAL_MSG_TYPE_BUFFER_TO_HOST,
- MMAL_MSG_TYPE_GET_STATS,
- MMAL_MSG_TYPE_PORT_PARAMETER_SET,
- MMAL_MSG_TYPE_PORT_PARAMETER_GET, /* 15 */
- MMAL_MSG_TYPE_EVENT_TO_HOST,
- MMAL_MSG_TYPE_GET_CORE_STATS_FOR_PORT,
- MMAL_MSG_TYPE_OPAQUE_ALLOCATOR,
- MMAL_MSG_TYPE_CONSUME_MEM,
- MMAL_MSG_TYPE_LMK, /* 20 */
- MMAL_MSG_TYPE_OPAQUE_ALLOCATOR_DESC,
- MMAL_MSG_TYPE_DRM_GET_LHS32,
- MMAL_MSG_TYPE_DRM_GET_TIME,
- MMAL_MSG_TYPE_BUFFER_FROM_HOST_ZEROLEN,
- MMAL_MSG_TYPE_PORT_FLUSH, /* 25 */
- MMAL_MSG_TYPE_HOST_LOG,
- MMAL_MSG_TYPE_MSG_LAST
- };
- /* port action request messages differ depending on the action type */
- enum mmal_msg_port_action_type {
- MMAL_MSG_PORT_ACTION_TYPE_UNKNOWN = 0, /* Unknown action */
- MMAL_MSG_PORT_ACTION_TYPE_ENABLE, /* Enable a port */
- MMAL_MSG_PORT_ACTION_TYPE_DISABLE, /* Disable a port */
- MMAL_MSG_PORT_ACTION_TYPE_FLUSH, /* Flush a port */
- MMAL_MSG_PORT_ACTION_TYPE_CONNECT, /* Connect ports */
- MMAL_MSG_PORT_ACTION_TYPE_DISCONNECT, /* Disconnect ports */
- MMAL_MSG_PORT_ACTION_TYPE_SET_REQUIREMENTS, /* Set buffer requirements*/
- };
- struct mmal_msg_header {
- u32 magic;
- u32 type; /* enum mmal_msg_type */
- /* Opaque handle to the control service */
- u32 control_service;
- u32 context; /* a u32 per message context */
- u32 status; /* The status of the vchiq operation */
- u32 padding;
- };
- /* Send from VC to host to report version */
- struct mmal_msg_version {
- u32 flags;
- u32 major;
- u32 minor;
- u32 minimum;
- };
- /* request to VC to create component */
- struct mmal_msg_component_create {
- u32 client_component; /* component context */
- char name[128];
- u32 pid; /* For debug */
- };
- /* reply from VC to component creation request */
- struct mmal_msg_component_create_reply {
- u32 status; /* enum mmal_msg_status - how does this differ to
- * the one in the header?
- */
- u32 component_handle; /* VideoCore handle for component */
- u32 input_num; /* Number of input ports */
- u32 output_num; /* Number of output ports */
- u32 clock_num; /* Number of clock ports */
- };
- /* request to VC to destroy a component */
- struct mmal_msg_component_destroy {
- u32 component_handle;
- };
- struct mmal_msg_component_destroy_reply {
- u32 status; /* The component destruction status */
- };
- /* request and reply to VC to enable a component */
- struct mmal_msg_component_enable {
- u32 component_handle;
- };
- struct mmal_msg_component_enable_reply {
- u32 status; /* The component enable status */
- };
- /* request and reply to VC to disable a component */
- struct mmal_msg_component_disable {
- u32 component_handle;
- };
- struct mmal_msg_component_disable_reply {
- u32 status; /* The component disable status */
- };
- /* request to VC to get port information */
- struct mmal_msg_port_info_get {
- u32 component_handle; /* component handle port is associated with */
- u32 port_type; /* enum mmal_msg_port_type */
- u32 index; /* port index to query */
- };
- /* reply from VC to get port info request */
- struct mmal_msg_port_info_get_reply {
- u32 status; /* enum mmal_msg_status */
- u32 component_handle; /* component handle port is associated with */
- u32 port_type; /* enum mmal_msg_port_type */
- u32 port_index; /* port indexed in query */
- s32 found; /* unused */
- u32 port_handle; /* Handle to use for this port */
- struct mmal_port port;
- struct mmal_es_format format; /* elementary stream format */
- union mmal_es_specific_format es; /* es type specific data */
- u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE]; /* es extra data */
- };
- /* request to VC to set port information */
- struct mmal_msg_port_info_set {
- u32 component_handle;
- u32 port_type; /* enum mmal_msg_port_type */
- u32 port_index; /* port indexed in query */
- struct mmal_port port;
- struct mmal_es_format format;
- union mmal_es_specific_format es;
- u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
- };
- /* reply from VC to port info set request */
- struct mmal_msg_port_info_set_reply {
- u32 status;
- u32 component_handle; /* component handle port is associated with */
- u32 port_type; /* enum mmal_msg_port_type */
- u32 index; /* port indexed in query */
- s32 found; /* unused */
- u32 port_handle; /* Handle to use for this port */
- struct mmal_port port;
- struct mmal_es_format format;
- union mmal_es_specific_format es;
- u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
- };
- /* port action requests that take a mmal_port as a parameter */
- struct mmal_msg_port_action_port {
- u32 component_handle;
- u32 port_handle;
- u32 action; /* enum mmal_msg_port_action_type */
- struct mmal_port port;
- };
- /* port action requests that take handles as a parameter */
- struct mmal_msg_port_action_handle {
- u32 component_handle;
- u32 port_handle;
- u32 action; /* enum mmal_msg_port_action_type */
- u32 connect_component_handle;
- u32 connect_port_handle;
- };
- struct mmal_msg_port_action_reply {
- u32 status; /* The port action operation status */
- };
- /* MMAL buffer transfer */
- /* Size of space reserved in a buffer message for short messages. */
- #define MMAL_VC_SHORT_DATA 128
- /* Signals that the current payload is the end of the stream of data */
- #define MMAL_BUFFER_HEADER_FLAG_EOS BIT(0)
- /* Signals that the start of the current payload starts a frame */
- #define MMAL_BUFFER_HEADER_FLAG_FRAME_START BIT(1)
- /* Signals that the end of the current payload ends a frame */
- #define MMAL_BUFFER_HEADER_FLAG_FRAME_END BIT(2)
- /* Signals that the current payload contains only complete frames (>1) */
- #define MMAL_BUFFER_HEADER_FLAG_FRAME \
- (MMAL_BUFFER_HEADER_FLAG_FRAME_START | \
- MMAL_BUFFER_HEADER_FLAG_FRAME_END)
- /* Signals that the current payload is a keyframe (i.e. self decodable) */
- #define MMAL_BUFFER_HEADER_FLAG_KEYFRAME BIT(3)
- /*
- * Signals a discontinuity in the stream of data (e.g. after a seek).
- * Can be used for instance by a decoder to reset its state
- */
- #define MMAL_BUFFER_HEADER_FLAG_DISCONTINUITY BIT(4)
- /*
- * Signals a buffer containing some kind of config data for the component
- * (e.g. codec config data)
- */
- #define MMAL_BUFFER_HEADER_FLAG_CONFIG BIT(5)
- /* Signals an encrypted payload */
- #define MMAL_BUFFER_HEADER_FLAG_ENCRYPTED BIT(6)
- /* Signals a buffer containing side information */
- #define MMAL_BUFFER_HEADER_FLAG_CODECSIDEINFO BIT(7)
- /*
- * Signals a buffer which is the snapshot/postview image from a stills
- * capture
- */
- #define MMAL_BUFFER_HEADER_FLAGS_SNAPSHOT BIT(8)
- /* Signals a buffer which contains data known to be corrupted */
- #define MMAL_BUFFER_HEADER_FLAG_CORRUPTED BIT(9)
- /* Signals that a buffer failed to be transmitted */
- #define MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED BIT(10)
- struct mmal_driver_buffer {
- u32 magic;
- u32 component_handle;
- u32 port_handle;
- u32 client_context;
- };
- /* buffer header */
- struct mmal_buffer_header {
- u32 next; /* next header */
- u32 priv; /* framework private data */
- u32 cmd;
- u32 data;
- u32 alloc_size;
- u32 length;
- u32 offset;
- u32 flags;
- s64 pts;
- s64 dts;
- u32 type;
- u32 user_data;
- };
- struct mmal_buffer_header_type_specific {
- union {
- struct {
- u32 planes;
- u32 offset[4];
- u32 pitch[4];
- u32 flags;
- } video;
- } u;
- };
- struct mmal_msg_buffer_from_host {
- /*
- *The front 32 bytes of the buffer header are copied
- * back to us in the reply to allow for context. This
- * area is used to store two mmal_driver_buffer structures to
- * allow for multiple concurrent service users.
- */
- /* control data */
- struct mmal_driver_buffer drvbuf;
- /* referenced control data for passthrough buffer management */
- struct mmal_driver_buffer drvbuf_ref;
- struct mmal_buffer_header buffer_header; /* buffer header itself */
- struct mmal_buffer_header_type_specific buffer_header_type_specific;
- s32 is_zero_copy;
- s32 has_reference;
- /* allows short data to be xfered in control message */
- u32 payload_in_message;
- u8 short_data[MMAL_VC_SHORT_DATA];
- };
- /* port parameter setting */
- #define MMAL_WORKER_PORT_PARAMETER_SPACE 96
- struct mmal_msg_port_parameter_set {
- u32 component_handle; /* component */
- u32 port_handle; /* port */
- u32 id; /* Parameter ID */
- u32 size; /* Parameter size */
- u32 value[MMAL_WORKER_PORT_PARAMETER_SPACE];
- };
- struct mmal_msg_port_parameter_set_reply {
- u32 status; /* enum mmal_msg_status todo: how does this
- * differ to the one in the header?
- */
- };
- /* port parameter getting */
- struct mmal_msg_port_parameter_get {
- u32 component_handle; /* component */
- u32 port_handle; /* port */
- u32 id; /* Parameter ID */
- u32 size; /* Parameter size */
- };
- struct mmal_msg_port_parameter_get_reply {
- u32 status; /* Status of mmal_port_parameter_get call */
- u32 id; /* Parameter ID */
- u32 size; /* Parameter size */
- u32 value[MMAL_WORKER_PORT_PARAMETER_SPACE];
- };
- /* event messages */
- #define MMAL_WORKER_EVENT_SPACE 256
- struct mmal_msg_event_to_host {
- u32 client_component; /* component context */
- u32 port_type;
- u32 port_num;
- u32 cmd;
- u32 length;
- u8 data[MMAL_WORKER_EVENT_SPACE];
- u32 delayed_buffer;
- };
- /* all mmal messages are serialised through this structure */
- struct mmal_msg {
- /* header */
- struct mmal_msg_header h;
- /* payload */
- union {
- struct mmal_msg_version version;
- struct mmal_msg_component_create component_create;
- struct mmal_msg_component_create_reply component_create_reply;
- struct mmal_msg_component_destroy component_destroy;
- struct mmal_msg_component_destroy_reply component_destroy_reply;
- struct mmal_msg_component_enable component_enable;
- struct mmal_msg_component_enable_reply component_enable_reply;
- struct mmal_msg_component_disable component_disable;
- struct mmal_msg_component_disable_reply component_disable_reply;
- struct mmal_msg_port_info_get port_info_get;
- struct mmal_msg_port_info_get_reply port_info_get_reply;
- struct mmal_msg_port_info_set port_info_set;
- struct mmal_msg_port_info_set_reply port_info_set_reply;
- struct mmal_msg_port_action_port port_action_port;
- struct mmal_msg_port_action_handle port_action_handle;
- struct mmal_msg_port_action_reply port_action_reply;
- struct mmal_msg_buffer_from_host buffer_from_host;
- struct mmal_msg_port_parameter_set port_parameter_set;
- struct mmal_msg_port_parameter_set_reply
- port_parameter_set_reply;
- struct mmal_msg_port_parameter_get
- port_parameter_get;
- struct mmal_msg_port_parameter_get_reply
- port_parameter_get_reply;
- struct mmal_msg_event_to_host event_to_host;
- u8 payload[MMAL_MSG_MAX_PAYLOAD];
- } u;
- };
- #endif
|