kernel: bump 5.4 to 5.4.48
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0170-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch
1 From b4c0c420e616e1cdf7abd309000e779b350fb2da 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           | 60 ++++++++++++-------
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, 63 insertions(+), 34 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 @@ -258,14 +264,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 @@ -294,11 +301,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 @@ -310,14 +319,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) {
92                 /* error in transfer */
93 @@ -328,7 +339,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 @@ -344,7 +355,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 @@ -371,14 +383,14 @@ static void buffer_cb(struct vchiq_mmal_
113                         buf->vb.vb2_buf.timestamp);
114         } else if (mmal_buf->pts != 0) {
115                 ktime_t timestamp;
116 -               s64 runtime_us = pts -
117 +               s64 runtime_us = mmal_buf->pts -
118                     dev->capture.vc_start_timestamp;
119                 timestamp = ktime_add_us(dev->capture.kernel_start_ts,
120                                          runtime_us);
121                 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
122                          "Convert start time %llu and %llu with offset %llu to %llu\n",
123                          ktime_to_ns(dev->capture.kernel_start_ts),
124 -                        dev->capture.vc_start_timestamp, pts,
125 +                        dev->capture.vc_start_timestamp, mmal_buf->pts,
126                          ktime_to_ns(timestamp));
127                 if (timestamp < dev->capture.last_timestamp) {
128                         v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
129 @@ -407,8 +419,8 @@ static void buffer_cb(struct vchiq_mmal_
130         buf->vb.sequence = dev->capture.sequence++;
131         buf->vb.field = V4L2_FIELD_NONE;
132  
133 -       vb2_set_plane_payload(&buf->vb.vb2_buf, 0, length);
134 -       if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
135 +       vb2_set_plane_payload(&buf->vb.vb2_buf, 0, mmal_buf->length);
136 +       if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
137                 buf->vb.flags |= V4L2_BUF_FLAG_KEYFRAME;
138  
139         v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
140 @@ -416,7 +428,7 @@ static void buffer_cb(struct vchiq_mmal_
141                 dev->capture.last_timestamp);
142         vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
143  
144 -       if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
145 +       if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
146             is_capturing(dev)) {
147                 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
148                          "Grab another frame as buffer has EOS");
149 @@ -500,14 +512,16 @@ static void buffer_queue(struct vb2_buff
150  {
151         struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
152         struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
153 -       struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
154 +       struct vb2_mmal_buffer *buf =
155 +                               container_of(vb2, struct vb2_mmal_buffer, vb);
156         int ret;
157  
158         v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
159                  "%s: dev:%p buf:%p, idx %u\n",
160                  __func__, dev, buf, vb2->vb2_buf.index);
161  
162 -       ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port, buf);
163 +       ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port,
164 +                                      &buf->mmal);
165         if (ret < 0)
166                 v4l2_err(&dev->v4l2_dev, "%s: error submitting buffer\n",
167                          __func__);
168 @@ -621,7 +635,7 @@ static void stop_streaming(struct vb2_qu
169         dev->capture.frame_count = 0;
170  
171         /* ensure a format has actually been set */
172 -       if (!dev->capture.port) {
173 +       if (!port) {
174                 v4l2_err(&dev->v4l2_dev,
175                          "no capture port - stream not started?\n");
176                 return;
177 @@ -641,11 +655,11 @@ static void stop_streaming(struct vb2_qu
178  
179         /* disable the connection from camera to encoder */
180         ret = vchiq_mmal_port_disable(dev->instance, dev->capture.camera_port);
181 -       if (!ret && dev->capture.camera_port != dev->capture.port) {
182 +       if (!ret && dev->capture.camera_port != port) {
183                 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
184                          "disabling port\n");
185 -               ret = vchiq_mmal_port_disable(dev->instance, dev->capture.port);
186 -       } else if (dev->capture.camera_port != dev->capture.port) {
187 +               ret = vchiq_mmal_port_disable(dev->instance, port);
188 +       } else if (dev->capture.camera_port != port) {
189                 v4l2_err(&dev->v4l2_dev, "port_disable failed, error %d\n",
190                          ret);
191         }
192 @@ -1947,7 +1961,7 @@ static int bcm2835_mmal_probe(struct pla
193                 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
194                 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
195                 q->drv_priv = dev;
196 -               q->buf_struct_size = sizeof(struct mmal_buffer);
197 +               q->buf_struct_size = sizeof(struct vb2_mmal_buffer);
198                 q->ops = &bm2835_mmal_video_qops;
199                 q->mem_ops = &vb2_vmalloc_memops;
200                 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
201 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
202 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
203 @@ -49,6 +49,11 @@ struct mmal_buffer {
204         unsigned long buffer_size; /* size of allocated buffer */
205  
206         struct mmal_msg_context *msg_context;
207 +
208 +       unsigned long length;
209 +       u32 mmal_flags;
210 +       s64 dts;
211 +       s64 pts;
212  };
213  
214  /* */
215 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
216 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
217 @@ -258,17 +258,25 @@ static void buffer_work_cb(struct work_s
218  {
219         struct mmal_msg_context *msg_context =
220                 container_of(work, struct mmal_msg_context, u.bulk.work);
221 +       struct mmal_buffer *buffer = msg_context->u.bulk.buffer;
222 +
223 +       if (!buffer) {
224 +               pr_err("%s: ctx: %p, No mmal buffer to pass details\n",
225 +                      __func__, msg_context);
226 +               return;
227 +       }
228 +
229 +       buffer->length = msg_context->u.bulk.buffer_used;
230 +       buffer->mmal_flags = msg_context->u.bulk.mmal_flags;
231 +       buffer->dts = msg_context->u.bulk.dts;
232 +       buffer->pts = msg_context->u.bulk.pts;
233  
234         atomic_dec(&msg_context->u.bulk.port->buffers_with_vpu);
235  
236         msg_context->u.bulk.port->buffer_cb(msg_context->u.bulk.instance,
237                                             msg_context->u.bulk.port,
238                                             msg_context->u.bulk.status,
239 -                                           msg_context->u.bulk.buffer,
240 -                                           msg_context->u.bulk.buffer_used,
241 -                                           msg_context->u.bulk.mmal_flags,
242 -                                           msg_context->u.bulk.dts,
243 -                                           msg_context->u.bulk.pts);
244 +                                           msg_context->u.bulk.buffer);
245  }
246  
247  /* workqueue scheduled callback to handle receiving buffers
248 @@ -1326,11 +1334,14 @@ static int port_disable(struct vchiq_mma
249                         mmalbuf = list_entry(buf_head, struct mmal_buffer,
250                                              list);
251                         list_del(buf_head);
252 -                       if (port->buffer_cb)
253 +                       if (port->buffer_cb) {
254 +                               mmalbuf->length = 0;
255 +                               mmalbuf->mmal_flags = 0;
256 +                               mmalbuf->dts = MMAL_TIME_UNKNOWN;
257 +                               mmalbuf->pts = MMAL_TIME_UNKNOWN;
258                                 port->buffer_cb(instance,
259 -                                               port, 0, mmalbuf, 0, 0,
260 -                                               MMAL_TIME_UNKNOWN,
261 -                                               MMAL_TIME_UNKNOWN);
262 +                                               port, 0, mmalbuf);
263 +                       }
264                 }
265  
266                 spin_unlock_irqrestore(&port->slock, flags);
267 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
268 +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
269 @@ -44,8 +44,7 @@ struct vchiq_mmal_port;
270  typedef void (*vchiq_mmal_buffer_cb)(
271                 struct vchiq_mmal_instance  *instance,
272                 struct vchiq_mmal_port *port,
273 -               int status, struct mmal_buffer *buffer,
274 -               unsigned long length, u32 mmal_flags, s64 dts, s64 pts);
275 +               int status, struct mmal_buffer *buffer);
276  
277  struct vchiq_mmal_port {
278         u32 enabled:1;