aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch
diff options
context:
space:
mode:
authorAdrian Schmutzler <freifunk@adrianschmutzler.de>2020-02-08 21:58:55 +0100
committerAdrian Schmutzler <freifunk@adrianschmutzler.de>2020-02-14 14:10:51 +0100
commit7d7aa2fd924c27829ec25f825481554dd81bce97 (patch)
tree658b87b89331670266163e522ea5fb52535633cb /target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch
parente7bfda2c243e66a75ff966ba04c28b1590b5d24c (diff)
downloadupstream-7d7aa2fd924c27829ec25f825481554dd81bce97.tar.gz
upstream-7d7aa2fd924c27829ec25f825481554dd81bce97.tar.bz2
upstream-7d7aa2fd924c27829ec25f825481554dd81bce97.zip
brcm2708: rename target to bcm27xx
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch')
-rw-r--r--target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch280
1 files changed, 280 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch b/target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch
new file mode 100644
index 0000000000..468f036982
--- /dev/null
+++ b/target/linux/bcm27xx/patches-4.19/950-0236-staging-mmal-vchiq-Make-a-mmal_buf-struct-for-passin.patch
@@ -0,0 +1,280 @@
+From 862ee4fbd8c6b984f920b88908e33951e51134ca Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.org>
+Date: Mon, 24 Sep 2018 17:33:37 +0100
+Subject: [PATCH] staging: mmal-vchiq: Make a mmal_buf struct for
+ passing parameters
+
+The callback from vchi_mmal to the client was growing lots of extra
+parameters. Consolidate them into a single struct instead of
+growing the list further.
+The struct is associated with the client buffer, therefore there
+are various changes to setup various containers for the struct,
+and pass the appropriate members.
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
+---
+ .../bcm2835-camera/bcm2835-camera.c | 62 ++++++++++++-------
+ .../vc04_services/vchiq-mmal/mmal-common.h | 5 ++
+ .../vc04_services/vchiq-mmal/mmal-vchiq.c | 29 ++++++---
+ .../vc04_services/vchiq-mmal/mmal-vchiq.h | 3 +-
+ 4 files changed, 64 insertions(+), 35 deletions(-)
+
+--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
++++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
+@@ -72,6 +72,12 @@ static const struct v4l2_fract
+ tpf_max = {.numerator = 1, .denominator = FPS_MIN},
+ tpf_default = {.numerator = 1000, .denominator = 30000};
+
++/* Container for MMAL and VB2 buffers*/
++struct vb2_mmal_buffer {
++ struct vb2_v4l2_buffer vb;
++ struct mmal_buffer mmal;
++};
++
+ /* video formats */
+ static struct mmal_fmt formats[] = {
+ {
+@@ -267,14 +273,15 @@ static int buffer_init(struct vb2_buffer
+ {
+ struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
+ struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
+- struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
++ struct vb2_mmal_buffer *buf =
++ container_of(vb2, struct vb2_mmal_buffer, vb);
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n",
+ __func__, dev, vb);
+- buf->buffer = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
+- buf->buffer_size = vb2_plane_size(&buf->vb.vb2_buf, 0);
++ buf->mmal.buffer = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
++ buf->mmal.buffer_size = vb2_plane_size(&buf->vb.vb2_buf, 0);
+
+- return mmal_vchi_buffer_init(dev->instance, buf);
++ return mmal_vchi_buffer_init(dev->instance, &buf->mmal);
+ }
+
+ static int buffer_prepare(struct vb2_buffer *vb)
+@@ -303,11 +310,13 @@ static void buffer_cleanup(struct vb2_bu
+ {
+ struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
+ struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
+- struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
++ struct vb2_mmal_buffer *buf =
++ container_of(vb2, struct vb2_mmal_buffer, vb);
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n",
+ __func__, dev, vb);
+- mmal_vchi_buffer_cleanup(buf);
++
++ mmal_vchi_buffer_cleanup(&buf->mmal);
+ }
+
+ static inline bool is_capturing(struct bm2835_mmal_dev *dev)
+@@ -319,14 +328,16 @@ static inline bool is_capturing(struct b
+ static void buffer_cb(struct vchiq_mmal_instance *instance,
+ struct vchiq_mmal_port *port,
+ int status,
+- struct mmal_buffer *buf,
+- unsigned long length, u32 mmal_flags, s64 dts, s64 pts)
++ struct mmal_buffer *mmal_buf)
+ {
+ struct bm2835_mmal_dev *dev = port->cb_ctx;
++ struct vb2_mmal_buffer *buf =
++ container_of(mmal_buf, struct vb2_mmal_buffer, mmal);
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "%s: status:%d, buf:%p, length:%lu, flags %u, pts %lld\n",
+- __func__, status, buf, length, mmal_flags, pts);
++ __func__, status, buf, mmal_buf->length, mmal_buf->mmal_flags,
++ mmal_buf->pts);
+
+ if (status != 0) {
+ /* error in transfer */
+@@ -337,7 +348,7 @@ static void buffer_cb(struct vchiq_mmal_
+ return;
+ }
+
+- if (length == 0) {
++ if (mmal_buf->length == 0) {
+ /* stream ended */
+ if (dev->capture.frame_count) {
+ /* empty buffer whilst capturing - expected to be an
+@@ -353,7 +364,8 @@ static void buffer_cb(struct vchiq_mmal_
+ &dev->capture.frame_count,
+ sizeof(dev->capture.frame_count));
+ }
+- if (vchiq_mmal_submit_buffer(instance, port, buf))
++ if (vchiq_mmal_submit_buffer(instance, port,
++ &buf->mmal))
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Failed to return EOS buffer");
+ } else {
+@@ -382,16 +394,16 @@ static void buffer_cb(struct vchiq_mmal_
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Buffer time set as current time - %lld",
+ buf->vb.vb2_buf.timestamp);
+- } else if (pts != 0) {
++ } else if (mmal_buf->pts != 0) {
+ ktime_t timestamp;
+- s64 runtime_us = pts -
++ s64 runtime_us = mmal_buf->pts -
+ dev->capture.vc_start_timestamp;
+ timestamp = ktime_add_us(dev->capture.kernel_start_ts,
+ runtime_us);
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Convert start time %llu and %llu with offset %llu to %llu\n",
+ ktime_to_ns(dev->capture.kernel_start_ts),
+- dev->capture.vc_start_timestamp, pts,
++ dev->capture.vc_start_timestamp, mmal_buf->pts,
+ ktime_to_ns(timestamp));
+ if (timestamp < dev->capture.last_timestamp) {
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+@@ -416,15 +428,15 @@ static void buffer_cb(struct vchiq_mmal_
+ dev->capture.last_timestamp = buf->vb.vb2_buf.timestamp;
+ buf->vb.sequence = dev->capture.sequence++;
+
+- vb2_set_plane_payload(&buf->vb.vb2_buf, 0, length);
+- if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
++ vb2_set_plane_payload(&buf->vb.vb2_buf, 0, mmal_buf->length);
++ if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
+ buf->vb.flags |= V4L2_BUF_FLAG_KEYFRAME;
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Buffer has ts %llu", dev->capture.last_timestamp);
+ vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
+
+- if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
++ if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
+ is_capturing(dev)) {
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Grab another frame as buffer has EOS");
+@@ -507,14 +519,16 @@ static void buffer_queue(struct vb2_buff
+ {
+ struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
+ struct vb2_v4l2_buffer *vb2 = to_vb2_v4l2_buffer(vb);
+- struct mmal_buffer *buf = container_of(vb2, struct mmal_buffer, vb);
++ struct vb2_mmal_buffer *buf =
++ container_of(vb2, struct vb2_mmal_buffer, vb);
+ int ret;
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "%s: dev:%p buf:%p, idx %u\n",
+ __func__, dev, buf, vb2->vb2_buf.index);
+
+- ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port, buf);
++ ret = vchiq_mmal_submit_buffer(dev->instance, dev->capture.port,
++ &buf->mmal);
+ if (ret < 0)
+ v4l2_err(&dev->v4l2_dev, "%s: error submitting buffer\n",
+ __func__);
+@@ -628,7 +642,7 @@ static void stop_streaming(struct vb2_qu
+ dev->capture.frame_count = 0;
+
+ /* ensure a format has actually been set */
+- if (!dev->capture.port) {
++ if (!port) {
+ v4l2_err(&dev->v4l2_dev,
+ "no capture port - stream not started?\n");
+ return;
+@@ -648,11 +662,11 @@ static void stop_streaming(struct vb2_qu
+
+ /* disable the connection from camera to encoder */
+ ret = vchiq_mmal_port_disable(dev->instance, dev->capture.camera_port);
+- if (!ret && dev->capture.camera_port != dev->capture.port) {
++ if (!ret && dev->capture.camera_port != port) {
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "disabling port\n");
+- ret = vchiq_mmal_port_disable(dev->instance, dev->capture.port);
+- } else if (dev->capture.camera_port != dev->capture.port) {
++ ret = vchiq_mmal_port_disable(dev->instance, port);
++ } else if (dev->capture.camera_port != port) {
+ v4l2_err(&dev->v4l2_dev, "port_disable failed, error %d\n",
+ ret);
+ }
+@@ -1954,7 +1968,7 @@ static int bcm2835_mmal_probe(struct pla
+ q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
+ q->drv_priv = dev;
+- q->buf_struct_size = sizeof(struct mmal_buffer);
++ q->buf_struct_size = sizeof(struct vb2_mmal_buffer);
+ q->ops = &bm2835_mmal_video_qops;
+ q->mem_ops = &vb2_vmalloc_memops;
+ q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
+--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
++++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
+@@ -50,6 +50,11 @@ struct mmal_buffer {
+ unsigned long buffer_size; /* size of allocated buffer */
+
+ struct mmal_msg_context *msg_context;
++
++ unsigned long length;
++ u32 mmal_flags;
++ s64 dts;
++ s64 pts;
+ };
+
+ /* */
+--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
++++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
+@@ -259,17 +259,25 @@ static void buffer_work_cb(struct work_s
+ {
+ struct mmal_msg_context *msg_context =
+ container_of(work, struct mmal_msg_context, u.bulk.work);
++ struct mmal_buffer *buffer = msg_context->u.bulk.buffer;
++
++ if (!buffer) {
++ pr_err("%s: ctx: %p, No mmal buffer to pass details\n",
++ __func__, msg_context);
++ return;
++ }
++
++ buffer->length = msg_context->u.bulk.buffer_used;
++ buffer->mmal_flags = msg_context->u.bulk.mmal_flags;
++ buffer->dts = msg_context->u.bulk.dts;
++ buffer->pts = msg_context->u.bulk.pts;
+
+ atomic_dec(&msg_context->u.bulk.port->buffers_with_vpu);
+
+ msg_context->u.bulk.port->buffer_cb(msg_context->u.bulk.instance,
+ msg_context->u.bulk.port,
+ msg_context->u.bulk.status,
+- msg_context->u.bulk.buffer,
+- msg_context->u.bulk.buffer_used,
+- msg_context->u.bulk.mmal_flags,
+- msg_context->u.bulk.dts,
+- msg_context->u.bulk.pts);
++ msg_context->u.bulk.buffer);
+ }
+
+ /* workqueue scheduled callback to handle receiving buffers
+@@ -1327,11 +1335,14 @@ static int port_disable(struct vchiq_mma
+ mmalbuf = list_entry(buf_head, struct mmal_buffer,
+ list);
+ list_del(buf_head);
+- if (port->buffer_cb)
++ if (port->buffer_cb) {
++ mmalbuf->length = 0;
++ mmalbuf->mmal_flags = 0;
++ mmalbuf->dts = MMAL_TIME_UNKNOWN;
++ mmalbuf->pts = MMAL_TIME_UNKNOWN;
+ port->buffer_cb(instance,
+- port, 0, mmalbuf, 0, 0,
+- MMAL_TIME_UNKNOWN,
+- MMAL_TIME_UNKNOWN);
++ port, 0, mmalbuf);
++ }
+ }
+
+ spin_unlock_irqrestore(&port->slock, flags);
+--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
++++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
+@@ -44,8 +44,7 @@ struct vchiq_mmal_port;
+ typedef void (*vchiq_mmal_buffer_cb)(
+ struct vchiq_mmal_instance *instance,
+ struct vchiq_mmal_port *port,
+- int status, struct mmal_buffer *buffer,
+- unsigned long length, u32 mmal_flags, s64 dts, s64 pts);
++ int status, struct mmal_buffer *buffer);
+
+ struct vchiq_mmal_port {
+ u32 enabled:1;