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 * 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 27 struct vchiq_mmal_instance; 28 29 enum 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 37 struct 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 43 struct vchiq_mmal_port; 44 45 typedef 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 50 struct vchiq_mmal_port { 51 bool enabled; 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 84 struct vchiq_mmal_component { 85 bool in_use; 86 bool enabled; 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 98 int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance); 99 int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance); 100 101 /* Initialise a mmal component and its ports 102 * 103 */ 104 int vchiq_mmal_component_init( 105 struct vchiq_mmal_instance *instance, 106 const char *name, 107 struct vchiq_mmal_component **component_out); 108 109 int vchiq_mmal_component_finalise( 110 struct vchiq_mmal_instance *instance, 111 struct vchiq_mmal_component *component); 112 113 int vchiq_mmal_component_enable( 114 struct vchiq_mmal_instance *instance, 115 struct vchiq_mmal_component *component); 116 117 int 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 */ 126 int 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 */ 135 int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance, 136 struct vchiq_mmal_port *port); 137 138 int 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 144 int 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 150 int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance, 151 struct vchiq_mmal_port *port); 152 153 int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance, 154 struct vchiq_mmal_port *src, 155 struct vchiq_mmal_port *dst); 156 157 int vchiq_mmal_version(struct vchiq_mmal_instance *instance, 158 u32 *major_out, 159 u32 *minor_out); 160 161 int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance, 162 struct vchiq_mmal_port *port, 163 struct mmal_buffer *buf); 164 165 int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance, 166 struct mmal_buffer *buf); 167 int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf); 168 #endif /* MMAL_VCHIQ_H */ 169