linux/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.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 * MMAL interface to VCHIQ message passing
  14 */
  15
  16#ifndef MMAL_VCHIQ_H
  17#define MMAL_VCHIQ_H
  18
  19#include "mmal-common.h"
  20#include "mmal-msg-format.h"
  21
  22#define MAX_PORT_COUNT 4
  23
  24/* Maximum size of the format extradata. */
  25#define MMAL_FORMAT_EXTRADATA_MAX_SIZE 128
  26
  27struct vchiq_mmal_instance;
  28
  29enum vchiq_mmal_es_type {
  30        MMAL_ES_TYPE_UNKNOWN,     /**< Unknown elementary stream type */
  31        MMAL_ES_TYPE_CONTROL,     /**< Elementary stream of control commands */
  32        MMAL_ES_TYPE_AUDIO,       /**< Audio elementary stream */
  33        MMAL_ES_TYPE_VIDEO,       /**< Video elementary stream */
  34        MMAL_ES_TYPE_SUBPICTURE   /**< Sub-picture elementary stream */
  35};
  36
  37struct vchiq_mmal_port_buffer {
  38        unsigned int num; /* number of buffers */
  39        u32 size; /* size of buffers */
  40        u32 alignment; /* alignment of buffers */
  41};
  42
  43struct vchiq_mmal_port;
  44
  45typedef void (*vchiq_mmal_buffer_cb)(
  46                struct vchiq_mmal_instance  *instance,
  47                struct vchiq_mmal_port *port,
  48                int status, struct mmal_buffer *buffer);
  49
  50struct vchiq_mmal_port {
  51        u32 enabled:1;
  52        u32 handle;
  53        u32 type; /* port type, cached to use on port info set */
  54        u32 index; /* port index, cached to use on port info set */
  55
  56        /* component port belongs to, allows simple deref */
  57        struct vchiq_mmal_component *component;
  58
  59        struct vchiq_mmal_port *connected; /* port connected to */
  60
  61        /* buffer info */
  62        struct vchiq_mmal_port_buffer minimum_buffer;
  63        struct vchiq_mmal_port_buffer recommended_buffer;
  64        struct vchiq_mmal_port_buffer current_buffer;
  65
  66        /* stream format */
  67        struct mmal_es_format_local format;
  68        /* elementary stream format */
  69        union mmal_es_specific_format es;
  70
  71        /* data buffers to fill */
  72        struct list_head buffers;
  73        /* lock to serialise adding and removing buffers from list */
  74        spinlock_t slock;
  75
  76        /* Count of buffers the VPU has yet to return */
  77        atomic_t buffers_with_vpu;
  78        /* callback on buffer completion */
  79        vchiq_mmal_buffer_cb buffer_cb;
  80        /* callback context */
  81        void *cb_ctx;
  82};
  83
  84struct vchiq_mmal_component {
  85        u32 in_use:1;
  86        u32 enabled:1;
  87        u32 handle;  /* VideoCore handle for component */
  88        u32 inputs;  /* Number of input ports */
  89        u32 outputs; /* Number of output ports */
  90        u32 clocks;  /* Number of clock ports */
  91        struct vchiq_mmal_port control; /* control port */
  92        struct vchiq_mmal_port input[MAX_PORT_COUNT]; /* input ports */
  93        struct vchiq_mmal_port output[MAX_PORT_COUNT]; /* output ports */
  94        struct vchiq_mmal_port clock[MAX_PORT_COUNT]; /* clock ports */
  95        u32 client_component;   /* Used to ref back to client struct */
  96};
  97
  98int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance);
  99int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance);
 100
 101/* Initialise a mmal component and its ports
 102 *
 103 */
 104int vchiq_mmal_component_init(
 105                struct vchiq_mmal_instance *instance,
 106                const char *name,
 107                struct vchiq_mmal_component **component_out);
 108
 109int vchiq_mmal_component_finalise(
 110                struct vchiq_mmal_instance *instance,
 111                struct vchiq_mmal_component *component);
 112
 113int vchiq_mmal_component_enable(
 114                struct vchiq_mmal_instance *instance,
 115                struct vchiq_mmal_component *component);
 116
 117int vchiq_mmal_component_disable(
 118                struct vchiq_mmal_instance *instance,
 119                struct vchiq_mmal_component *component);
 120
 121/* enable a mmal port
 122 *
 123 * enables a port and if a buffer callback provided enque buffer
 124 * headers as appropriate for the port.
 125 */
 126int vchiq_mmal_port_enable(
 127                struct vchiq_mmal_instance *instance,
 128                struct vchiq_mmal_port *port,
 129                vchiq_mmal_buffer_cb buffer_cb);
 130
 131/* disable a port
 132 *
 133 * disable a port will dequeue any pending buffers
 134 */
 135int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance,
 136                            struct vchiq_mmal_port *port);
 137
 138int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance,
 139                                  struct vchiq_mmal_port *port,
 140                                  u32 parameter,
 141                                  void *value,
 142                                  u32 value_size);
 143
 144int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance,
 145                                  struct vchiq_mmal_port *port,
 146                                  u32 parameter,
 147                                  void *value,
 148                                  u32 *value_size);
 149
 150int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance,
 151                               struct vchiq_mmal_port *port);
 152
 153int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance,
 154                                   struct vchiq_mmal_port *src,
 155                                   struct vchiq_mmal_port *dst);
 156
 157int vchiq_mmal_version(struct vchiq_mmal_instance *instance,
 158                       u32 *major_out,
 159                       u32 *minor_out);
 160
 161int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
 162                             struct vchiq_mmal_port *port,
 163                             struct mmal_buffer *buf);
 164
 165int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance,
 166                          struct mmal_buffer *buf);
 167int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf);
 168#endif /* MMAL_VCHIQ_H */
 169