1 From 32d3fb2930b7e6f47959f0765c13f7cfda2baa7e Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dave.stevenson@raspberrypi.org>
3 Date: Mon, 24 Sep 2018 17:33:37 +0100
4 Subject: [PATCH 271/703] staging: mmal-vchiq: Make a mmal_buf struct for
7 The callback from vchi_mmal to the client was growing lots of extra
8 parameters. Consolidate them into a single struct instead of
9 growing the list further.
10 The struct is associated with the client buffer, therefore there
11 are various changes to setup various containers for the struct,
12 and pass the appropriate members.
14 Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
16 .../bcm2835-camera/bcm2835-camera.c | 62 ++++++++++++-------
17 .../vc04_services/vchiq-mmal/mmal-common.h | 5 ++
18 .../vc04_services/vchiq-mmal/mmal-vchiq.c | 29 ++++++---
19 .../vc04_services/vchiq-mmal/mmal-vchiq.h | 3 +-
20 4 files changed, 64 insertions(+), 35 deletions(-)
22 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
23 +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
24 @@ -72,6 +72,12 @@ static const struct v4l2_fract
25 tpf_max = {.numerator = 1, .denominator = FPS_MIN},
26 tpf_default = {.numerator = 1000, .denominator = 30000};
28 +/* Container for MMAL and VB2 buffers*/
29 +struct vb2_mmal_buffer {
30 + struct vb2_v4l2_buffer vb;
31 + struct mmal_buffer mmal;
35 static struct mmal_fmt formats[] = {
37 @@ -267,14 +273,15 @@ static int buffer_init(struct vb2_buffer
39 struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
40 struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
41 - struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
42 + struct vb2_mmal_buffer *buf =
43 + container_of(vb2, struct vb2_mmal_buffer, vb);
45 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n",
47 - buf->buffer = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
48 - buf->buffer_size = vb2_plane_size(&buf->vb.vb2_buf, 0);
49 + buf->mmal.buffer = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
50 + buf->mmal.buffer_size = vb2_plane_size(&buf->vb.vb2_buf, 0);
52 - return mmal_vchi_buffer_init(dev->instance, buf);
53 + return mmal_vchi_buffer_init(dev->instance, &buf->mmal);
56 static int buffer_prepare(struct vb2_buffer *vb)
57 @@ -303,11 +310,13 @@ static void buffer_cleanup(struct vb2_bu
59 struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
60 struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
61 - struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
62 + struct vb2_mmal_buffer *buf =
63 + container_of(vb2, struct vb2_mmal_buffer, vb);
65 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n",
67 - mmal_vchi_buffer_cleanup(buf);
69 + mmal_vchi_buffer_cleanup(&buf->mmal);
72 static inline bool is_capturing(struct bm2835_mmal_dev *dev)
73 @@ -319,14 +328,16 @@ static inline bool is_capturing(struct b
74 static void buffer_cb(struct vchiq_mmal_instance *instance,
75 struct vchiq_mmal_port *port,
77 - struct mmal_buffer *buf,
78 - unsigned long length, u32 mmal_flags, s64 dts, s64 pts)
79 + struct mmal_buffer *mmal_buf)
81 struct bm2835_mmal_dev *dev = port->cb_ctx;
82 + struct vb2_mmal_buffer *buf =
83 + container_of(mmal_buf, struct vb2_mmal_buffer, mmal);
85 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
86 "%s: status:%d, buf:%p, length:%lu, flags %u, pts %lld\n",
87 - __func__, status, buf, length, mmal_flags, pts);
88 + __func__, status, buf, mmal_buf->length, mmal_buf->mmal_flags,
92 /* error in transfer */
93 @@ -337,7 +348,7 @@ static void buffer_cb(struct vchiq_mmal_
98 + if (mmal_buf->length == 0) {
100 if (dev->capture.frame_count) {
101 /* empty buffer whilst capturing - expected to be an
102 @@ -353,7 +364,8 @@ static void buffer_cb(struct vchiq_mmal_
103 &dev->capture.frame_count,
104 sizeof(dev->capture.frame_count));
106 - if (vchiq_mmal_submit_buffer(instance, port, buf))
107 + if (vchiq_mmal_submit_buffer(instance, port,
109 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
110 "Failed to return EOS buffer");
112 @@ -382,16 +394,16 @@ static void buffer_cb(struct vchiq_mmal_
113 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
114 "Buffer time set as current time - %lld",
115 buf->vb.vb2_buf.timestamp);
116 - } else if (pts != 0) {
117 + } else if (mmal_buf->pts != 0) {
119 - s64 runtime_us = pts -
120 + s64 runtime_us = mmal_buf->pts -
121 dev->capture.vc_start_timestamp;
122 timestamp = ktime_add_us(dev->capture.kernel_start_ts,
124 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
125 "Convert start time %llu and %llu with offset %llu to %llu\n",
126 ktime_to_ns(dev->capture.kernel_start_ts),
127 - dev->capture.vc_start_timestamp, pts,
128 + dev->capture.vc_start_timestamp, mmal_buf->pts,
129 ktime_to_ns(timestamp));
130 if (timestamp < dev->capture.last_timestamp) {
131 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
132 @@ -416,15 +428,15 @@ static void buffer_cb(struct vchiq_mmal_
133 dev->capture.last_timestamp = buf->vb.vb2_buf.timestamp;
134 buf->vb.sequence = dev->capture.sequence++;
136 - vb2_set_plane_payload(&buf->vb.vb2_buf, 0, length);
137 - if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
138 + vb2_set_plane_payload(&buf->vb.vb2_buf, 0, mmal_buf->length);
139 + if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
140 buf->vb.flags |= V4L2_BUF_FLAG_KEYFRAME;
142 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
143 "Buffer has ts %llu", dev->capture.last_timestamp);
144 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
146 - if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
147 + if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
149 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
150 "Grab another frame as buffer has EOS");
151 @@ -507,14 +519,16 @@ static void buffer_queue(struct vb2_buff
153 struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
154 struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
155 - struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
156 + struct vb2_mmal_buffer *buf =
157 + container_of(vb2, struct vb2_mmal_buffer, vb);
160 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
161 "%s: dev:%p buf:%p, idx %u\n",
162 __func__, dev, buf, vb2->vb2_buf.index);
164 - ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port, buf);
165 + ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port,
168 v4l2_err(&dev->v4l2_dev, "%s: error submitting buffer\n",
170 @@ -628,7 +642,7 @@ static void stop_streaming(struct vb2_qu
171 dev->capture.frame_count = 0;
173 /* ensure a format has actually been set */
174 - if (!dev->capture.port) {
176 v4l2_err(&dev->v4l2_dev,
177 "no capture port - stream not started?\n");
179 @@ -648,11 +662,11 @@ static void stop_streaming(struct vb2_qu
181 /* disable the connection from camera to encoder */
182 ret = vchiq_mmal_port_disable(dev->instance, dev->capture.camera_port);
183 - if (!ret && dev->capture.camera_port != dev->capture.port) {
184 + if (!ret && dev->capture.camera_port != port) {
185 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
187 - ret = vchiq_mmal_port_disable(dev->instance, dev->capture.port);
188 - } else if (dev->capture.camera_port != dev->capture.port) {
189 + ret = vchiq_mmal_port_disable(dev->instance, port);
190 + } else if (dev->capture.camera_port != port) {
191 v4l2_err(&dev->v4l2_dev, "port_disable failed, error %d\n",
194 @@ -1954,7 +1968,7 @@ static int bcm2835_mmal_probe(struct pla
195 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
196 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
198 - q->buf_struct_size = sizeof(struct mmal_buffer);
199 + q->buf_struct_size = sizeof(struct vb2_mmal_buffer);
200 q->ops = &bm2835_mmal_video_qops;
201 q->mem_ops = &vb2_vmalloc_memops;
202 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
203 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
204 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
205 @@ -50,6 +50,11 @@ struct mmal_buffer {
206 unsigned long buffer_size; /* size of allocated buffer */
208 struct mmal_msg_context *msg_context;
210 + unsigned long length;
217 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
218 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
219 @@ -258,17 +258,25 @@ static void buffer_work_cb(struct work_s
221 struct mmal_msg_context *msg_context =
222 container_of(work, struct mmal_msg_context, u.bulk.work);
223 + struct mmal_buffer *buffer = msg_context->u.bulk.buffer;
226 + pr_err("%s: ctx: %p, No mmal buffer to pass details\n",
227 + __func__, msg_context);
231 + buffer->length = msg_context->u.bulk.buffer_used;
232 + buffer->mmal_flags = msg_context->u.bulk.mmal_flags;
233 + buffer->dts = msg_context->u.bulk.dts;
234 + buffer->pts = msg_context->u.bulk.pts;
236 atomic_dec(&msg_context->u.bulk.port->buffers_with_vpu);
238 msg_context->u.bulk.port->buffer_cb(msg_context->u.bulk.instance,
239 msg_context->u.bulk.port,
240 msg_context->u.bulk.status,
241 - msg_context->u.bulk.buffer,
242 - msg_context->u.bulk.buffer_used,
243 - msg_context->u.bulk.mmal_flags,
244 - msg_context->u.bulk.dts,
245 - msg_context->u.bulk.pts);
246 + msg_context->u.bulk.buffer);
249 /* workqueue scheduled callback to handle receiving buffers
250 @@ -1326,11 +1334,14 @@ static int port_disable(struct vchiq_mma
251 mmalbuf = list_entry(buf_head, struct mmal_buffer,
254 - if (port->buffer_cb)
255 + if (port->buffer_cb) {
256 + mmalbuf->length = 0;
257 + mmalbuf->mmal_flags = 0;
258 + mmalbuf->dts = MMAL_TIME_UNKNOWN;
259 + mmalbuf->pts = MMAL_TIME_UNKNOWN;
260 port->buffer_cb(instance,
261 - port, 0, mmalbuf, 0, 0,
263 - MMAL_TIME_UNKNOWN);
268 spin_unlock_irqrestore(&port->slock, flags);
269 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
270 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
271 @@ -44,8 +44,7 @@ struct vchiq_mmal_port;
272 typedef void (*vchiq_mmal_buffer_cb)(
273 struct vchiq_mmal_instance *instance,
274 struct vchiq_mmal_port *port,
275 - int status, struct mmal_buffer *buffer,
276 - unsigned long length, u32 mmal_flags, s64 dts, s64 pts);
277 + int status, struct mmal_buffer *buffer);
279 struct vchiq_mmal_port {