468f036982788bc59ee0a01d38a1493333bbe673
[oweals/openwrt.git] /
1 From 862ee4fbd8c6b984f920b88908e33951e51134ca 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] staging: mmal-vchiq: Make a mmal_buf struct for
5  passing parameters
6
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.
13
14 Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
15 ---
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(-)
21
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};
27  
28 +/* Container for MMAL and VB2 buffers*/
29 +struct vb2_mmal_buffer {
30 +       struct vb2_v4l2_buffer  vb;
31 +       struct mmal_buffer      mmal;
32 +};
33 +
34  /* video formats */
35  static struct mmal_fmt formats[] = {
36         {
37 @@ -267,14 +273,15 @@ static int buffer_init(struct vb2_buffer
38  {
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);
44  
45         v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n",
46                  __func__, dev, vb);
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);
51  
52 -       return mmal_vchi_buffer_init(dev->instance, buf);
53 +       return mmal_vchi_buffer_init(dev->instance, &buf->mmal);
54  }
55  
56  static int buffer_prepare(struct vb2_buffer *vb)
57 @@ -303,11 +310,13 @@ static void buffer_cleanup(struct vb2_bu
58  {
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);
64  
65         v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n",
66                  __func__, dev, vb);
67 -       mmal_vchi_buffer_cleanup(buf);
68 +
69 +       mmal_vchi_buffer_cleanup(&buf->mmal);
70  }
71  
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,
76                       int status,
77 -                     struct mmal_buffer *buf,
78 -                     unsigned long length, u32 mmal_flags, s64 dts, s64 pts)
79 +                     struct mmal_buffer *mmal_buf)
80  {
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);
84  
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,
89 +                mmal_buf->pts);
90  
91         if (status != 0) {
92                 /* error in transfer */
93 @@ -337,7 +348,7 @@ static void buffer_cb(struct vchiq_mmal_
94                 return;
95         }
96  
97 -       if (length == 0) {
98 +       if (mmal_buf->length == 0) {
99                 /* stream ended */
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));
105                         }
106 -                       if (vchiq_mmal_submit_buffer(instance, port, buf))
107 +                       if (vchiq_mmal_submit_buffer(instance, port,
108 +                                                    &buf->mmal))
109                                 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
110                                          "Failed to return EOS buffer");
111                 } else {
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) {
118                 ktime_t timestamp;
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,
123                                          runtime_us);
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++;
135  
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;
141  
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);
145  
146 -       if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
147 +       if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
148             is_capturing(dev)) {
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
152  {
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);
158         int ret;
159  
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);
163  
164 -       ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port, buf);
165 +       ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port,
166 +                                      &buf->mmal);
167         if (ret < 0)
168                 v4l2_err(&dev->v4l2_dev, "%s: error submitting buffer\n",
169                          __func__);
170 @@ -628,7 +642,7 @@ static void stop_streaming(struct vb2_qu
171         dev->capture.frame_count = 0;
172  
173         /* ensure a format has actually been set */
174 -       if (!dev->capture.port) {
175 +       if (!port) {
176                 v4l2_err(&dev->v4l2_dev,
177                          "no capture port - stream not started?\n");
178                 return;
179 @@ -648,11 +662,11 @@ static void stop_streaming(struct vb2_qu
180  
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,
186                          "disabling port\n");
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",
192                          ret);
193         }
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;
197                 q->drv_priv = dev;
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 */
207  
208         struct mmal_msg_context *msg_context;
209 +
210 +       unsigned long length;
211 +       u32 mmal_flags;
212 +       s64 dts;
213 +       s64 pts;
214  };
215  
216  /* */
217 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
218 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
219 @@ -259,17 +259,25 @@ static void buffer_work_cb(struct work_s
220  {
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;
224 +
225 +       if (!buffer) {
226 +               pr_err("%s: ctx: %p, No mmal buffer to pass details\n",
227 +                      __func__, msg_context);
228 +               return;
229 +       }
230 +
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;
235  
236         atomic_dec(&msg_context->u.bulk.port->buffers_with_vpu);
237  
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);
247  }
248  
249  /* workqueue scheduled callback to handle receiving buffers
250 @@ -1327,11 +1335,14 @@ static int port_disable(struct vchiq_mma
251                         mmalbuf = list_entry(buf_head, struct mmal_buffer,
252                                              list);
253                         list_del(buf_head);
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,
262 -                                               MMAL_TIME_UNKNOWN,
263 -                                               MMAL_TIME_UNKNOWN);
264 +                                               port, 0, mmalbuf);
265 +                       }
266                 }
267  
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);
278  
279  struct vchiq_mmal_port {
280         u32 enabled:1;