1b18ee53aSJacopo Mondi /* SPDX-License-Identifier: GPL-2.0 */ 2b18ee53aSJacopo Mondi /* 3b33721baSGaston Gonzalez * Broadcom BCM2835 V4L2 driver 4b18ee53aSJacopo Mondi * 5b18ee53aSJacopo Mondi * Copyright © 2013 Raspberry Pi (Trading) Ltd. 6b18ee53aSJacopo Mondi * 7b18ee53aSJacopo Mondi * Authors: Vincent Sanders @ Collabora 8b18ee53aSJacopo Mondi * Dave Stevenson @ Broadcom 9b18ee53aSJacopo Mondi * (now dave.stevenson@raspberrypi.org) 10b18ee53aSJacopo Mondi * Simon Mellor @ Broadcom 11b18ee53aSJacopo Mondi * Luke Diamand @ Broadcom 12b18ee53aSJacopo Mondi * 13b18ee53aSJacopo Mondi * MMAL interface to VCHIQ message passing 14b18ee53aSJacopo Mondi */ 15b18ee53aSJacopo Mondi 16b18ee53aSJacopo Mondi #ifndef MMAL_VCHIQ_H 17b18ee53aSJacopo Mondi #define MMAL_VCHIQ_H 18b18ee53aSJacopo Mondi 194a38e550SDave Stevenson #include "mmal-common.h" 20b18ee53aSJacopo Mondi #include "mmal-msg-format.h" 21b18ee53aSJacopo Mondi 22b18ee53aSJacopo Mondi #define MAX_PORT_COUNT 4 23b18ee53aSJacopo Mondi 24b18ee53aSJacopo Mondi /* Maximum size of the format extradata. */ 25b18ee53aSJacopo Mondi #define MMAL_FORMAT_EXTRADATA_MAX_SIZE 128 26b18ee53aSJacopo Mondi 27b18ee53aSJacopo Mondi struct vchiq_mmal_instance; 28*42a2f666SUmang Jain struct device; 29b18ee53aSJacopo Mondi 30b18ee53aSJacopo Mondi enum vchiq_mmal_es_type { 31b18ee53aSJacopo Mondi MMAL_ES_TYPE_UNKNOWN, /**< Unknown elementary stream type */ 32b18ee53aSJacopo Mondi MMAL_ES_TYPE_CONTROL, /**< Elementary stream of control commands */ 33b18ee53aSJacopo Mondi MMAL_ES_TYPE_AUDIO, /**< Audio elementary stream */ 34b18ee53aSJacopo Mondi MMAL_ES_TYPE_VIDEO, /**< Video elementary stream */ 35b18ee53aSJacopo Mondi MMAL_ES_TYPE_SUBPICTURE /**< Sub-picture elementary stream */ 36b18ee53aSJacopo Mondi }; 37b18ee53aSJacopo Mondi 38b18ee53aSJacopo Mondi struct vchiq_mmal_port_buffer { 39b18ee53aSJacopo Mondi unsigned int num; /* number of buffers */ 40b18ee53aSJacopo Mondi u32 size; /* size of buffers */ 41b18ee53aSJacopo Mondi u32 alignment; /* alignment of buffers */ 42b18ee53aSJacopo Mondi }; 43b18ee53aSJacopo Mondi 44b18ee53aSJacopo Mondi struct vchiq_mmal_port; 45b18ee53aSJacopo Mondi 46e0279bb8SSumadhura Kalyan typedef void (*vchiq_mmal_buffer_cb)(struct vchiq_mmal_instance *instance, 47b18ee53aSJacopo Mondi struct vchiq_mmal_port *port, 48959fc47cSDave Stevenson int status, struct mmal_buffer *buffer); 49b18ee53aSJacopo Mondi 50b18ee53aSJacopo Mondi struct vchiq_mmal_port { 5173361173SUmang Jain bool enabled; 52b18ee53aSJacopo Mondi u32 handle; 53b18ee53aSJacopo Mondi u32 type; /* port type, cached to use on port info set */ 54b18ee53aSJacopo Mondi u32 index; /* port index, cached to use on port info set */ 55b18ee53aSJacopo Mondi 56b18ee53aSJacopo Mondi /* component port belongs to, allows simple deref */ 57b18ee53aSJacopo Mondi struct vchiq_mmal_component *component; 58b18ee53aSJacopo Mondi 59b18ee53aSJacopo Mondi struct vchiq_mmal_port *connected; /* port connected to */ 60b18ee53aSJacopo Mondi 61b18ee53aSJacopo Mondi /* buffer info */ 62b18ee53aSJacopo Mondi struct vchiq_mmal_port_buffer minimum_buffer; 63b18ee53aSJacopo Mondi struct vchiq_mmal_port_buffer recommended_buffer; 64b18ee53aSJacopo Mondi struct vchiq_mmal_port_buffer current_buffer; 65b18ee53aSJacopo Mondi 66b18ee53aSJacopo Mondi /* stream format */ 67b18ee53aSJacopo Mondi struct mmal_es_format_local format; 68b18ee53aSJacopo Mondi /* elementary stream format */ 69b18ee53aSJacopo Mondi union mmal_es_specific_format es; 70b18ee53aSJacopo Mondi 71b18ee53aSJacopo Mondi /* data buffers to fill */ 72b18ee53aSJacopo Mondi struct list_head buffers; 73b18ee53aSJacopo Mondi /* lock to serialise adding and removing buffers from list */ 74b18ee53aSJacopo Mondi spinlock_t slock; 75b18ee53aSJacopo Mondi 76b18ee53aSJacopo Mondi /* Count of buffers the VPU has yet to return */ 77b18ee53aSJacopo Mondi atomic_t buffers_with_vpu; 78b18ee53aSJacopo Mondi /* callback on buffer completion */ 79b18ee53aSJacopo Mondi vchiq_mmal_buffer_cb buffer_cb; 80b18ee53aSJacopo Mondi /* callback context */ 81b18ee53aSJacopo Mondi void *cb_ctx; 82b18ee53aSJacopo Mondi }; 83b18ee53aSJacopo Mondi 84b18ee53aSJacopo Mondi struct vchiq_mmal_component { 85c0012a39SUmang Jain bool in_use; 8673361173SUmang Jain bool enabled; 87b18ee53aSJacopo Mondi u32 handle; /* VideoCore handle for component */ 88b18ee53aSJacopo Mondi u32 inputs; /* Number of input ports */ 89b18ee53aSJacopo Mondi u32 outputs; /* Number of output ports */ 90b18ee53aSJacopo Mondi u32 clocks; /* Number of clock ports */ 91b18ee53aSJacopo Mondi struct vchiq_mmal_port control; /* control port */ 92b18ee53aSJacopo Mondi struct vchiq_mmal_port input[MAX_PORT_COUNT]; /* input ports */ 93b18ee53aSJacopo Mondi struct vchiq_mmal_port output[MAX_PORT_COUNT]; /* output ports */ 94b18ee53aSJacopo Mondi struct vchiq_mmal_port clock[MAX_PORT_COUNT]; /* clock ports */ 9522e64b48SDave Stevenson u32 client_component; /* Used to ref back to client struct */ 96b18ee53aSJacopo Mondi }; 97b18ee53aSJacopo Mondi 98*42a2f666SUmang Jain int vchiq_mmal_init(struct device *dev, struct vchiq_mmal_instance **out_instance); 99b18ee53aSJacopo Mondi int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance); 100b18ee53aSJacopo Mondi 101b18ee53aSJacopo Mondi /* Initialise a mmal component and its ports 102b18ee53aSJacopo Mondi * 103b18ee53aSJacopo Mondi */ 104e0279bb8SSumadhura Kalyan int vchiq_mmal_component_init(struct vchiq_mmal_instance *instance, 105e0279bb8SSumadhura Kalyan const char *name, struct vchiq_mmal_component **component_out); 106b18ee53aSJacopo Mondi 107e0279bb8SSumadhura Kalyan int vchiq_mmal_component_finalise(struct vchiq_mmal_instance *instance, 108b18ee53aSJacopo Mondi struct vchiq_mmal_component *component); 109b18ee53aSJacopo Mondi 110e0279bb8SSumadhura Kalyan int vchiq_mmal_component_enable(struct vchiq_mmal_instance *instance, 111b18ee53aSJacopo Mondi struct vchiq_mmal_component *component); 112b18ee53aSJacopo Mondi 113e0279bb8SSumadhura Kalyan int vchiq_mmal_component_disable(struct vchiq_mmal_instance *instance, 114b18ee53aSJacopo Mondi struct vchiq_mmal_component *component); 115b18ee53aSJacopo Mondi 116b18ee53aSJacopo Mondi /* enable a mmal port 117b18ee53aSJacopo Mondi * 118b18ee53aSJacopo Mondi * enables a port and if a buffer callback provided enque buffer 119b18ee53aSJacopo Mondi * headers as appropriate for the port. 120b18ee53aSJacopo Mondi */ 121e0279bb8SSumadhura Kalyan int vchiq_mmal_port_enable(struct vchiq_mmal_instance *instance, 122b18ee53aSJacopo Mondi struct vchiq_mmal_port *port, 123b18ee53aSJacopo Mondi vchiq_mmal_buffer_cb buffer_cb); 124b18ee53aSJacopo Mondi 125b18ee53aSJacopo Mondi /* disable a port 126b18ee53aSJacopo Mondi * 127b18ee53aSJacopo Mondi * disable a port will dequeue any pending buffers 128b18ee53aSJacopo Mondi */ 129b18ee53aSJacopo Mondi int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance, 130b18ee53aSJacopo Mondi struct vchiq_mmal_port *port); 131b18ee53aSJacopo Mondi 132b18ee53aSJacopo Mondi int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance, 133b18ee53aSJacopo Mondi struct vchiq_mmal_port *port, 134b18ee53aSJacopo Mondi u32 parameter, 135b18ee53aSJacopo Mondi void *value, 136b18ee53aSJacopo Mondi u32 value_size); 137b18ee53aSJacopo Mondi 138b18ee53aSJacopo Mondi int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance, 139b18ee53aSJacopo Mondi struct vchiq_mmal_port *port, 140b18ee53aSJacopo Mondi u32 parameter, 141b18ee53aSJacopo Mondi void *value, 142b18ee53aSJacopo Mondi u32 *value_size); 143b18ee53aSJacopo Mondi 144b18ee53aSJacopo Mondi int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance, 145b18ee53aSJacopo Mondi struct vchiq_mmal_port *port); 146b18ee53aSJacopo Mondi 147b18ee53aSJacopo Mondi int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance, 148b18ee53aSJacopo Mondi struct vchiq_mmal_port *src, 149b18ee53aSJacopo Mondi struct vchiq_mmal_port *dst); 150b18ee53aSJacopo Mondi 151b18ee53aSJacopo Mondi int vchiq_mmal_version(struct vchiq_mmal_instance *instance, 152b18ee53aSJacopo Mondi u32 *major_out, 153b18ee53aSJacopo Mondi u32 *minor_out); 154b18ee53aSJacopo Mondi 155b18ee53aSJacopo Mondi int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance, 156b18ee53aSJacopo Mondi struct vchiq_mmal_port *port, 157b18ee53aSJacopo Mondi struct mmal_buffer *buf); 158b18ee53aSJacopo Mondi 159b18ee53aSJacopo Mondi int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance, 160b18ee53aSJacopo Mondi struct mmal_buffer *buf); 161b18ee53aSJacopo Mondi int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf); 162b18ee53aSJacopo Mondi #endif /* MMAL_VCHIQ_H */ 163