linux/drivers/staging/vc04_services/vchiq-mmal/mmal-msg.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Broadcom BM2835 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
  42enum 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 */
  73enum 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
  83struct 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 */
  96struct mmal_msg_version {
  97        u32 flags;
  98        u32 major;
  99        u32 minor;
 100        u32 minimum;
 101};
 102
 103/* request to VC to create component */
 104struct 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 */
 111struct 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 */
 122struct mmal_msg_component_destroy {
 123        u32 component_handle;
 124};
 125
 126struct mmal_msg_component_destroy_reply {
 127        u32 status; /* The component destruction status */
 128};
 129
 130/* request and reply to VC to enable a component */
 131struct mmal_msg_component_enable {
 132        u32 component_handle;
 133};
 134
 135struct mmal_msg_component_enable_reply {
 136        u32 status; /* The component enable status */
 137};
 138
 139/* request and reply to VC to disable a component */
 140struct mmal_msg_component_disable {
 141        u32 component_handle;
 142};
 143
 144struct mmal_msg_component_disable_reply {
 145        u32 status; /* The component disable status */
 146};
 147
 148/* request to VC to get port information */
 149struct 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 */
 156struct 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 */
 170struct 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 */
 181struct 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 */
 195struct 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 */
 203struct 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
 211struct 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
 256struct mmal_driver_buffer {
 257        u32 magic;
 258        u32 component_handle;
 259        u32 port_handle;
 260        u32 client_context;
 261};
 262
 263/* buffer header */
 264struct 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
 279struct 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
 290struct 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
 316struct 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
 324struct 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
 332struct 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
 339struct 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
 349struct 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 */
 362struct 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