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