aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-4.19/950-0232-staging-vc04_services-Split-vchiq-mmal-into-a-module.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-4.19/950-0232-staging-vc04_services-Split-vchiq-mmal-into-a-module.patch')
-rw-r--r--target/linux/bcm27xx/patches-4.19/950-0232-staging-vc04_services-Split-vchiq-mmal-into-a-module.patch7535
1 files changed, 0 insertions, 7535 deletions
diff --git a/target/linux/bcm27xx/patches-4.19/950-0232-staging-vc04_services-Split-vchiq-mmal-into-a-module.patch b/target/linux/bcm27xx/patches-4.19/950-0232-staging-vc04_services-Split-vchiq-mmal-into-a-module.patch
deleted file mode 100644
index 1cd23da288..0000000000
--- a/target/linux/bcm27xx/patches-4.19/950-0232-staging-vc04_services-Split-vchiq-mmal-into-a-module.patch
+++ /dev/null
@@ -1,7535 +0,0 @@
-From e7723c6bcf31a440b8762e9e22497ff3fbbb7056 Mon Sep 17 00:00:00 2001
-From: Dave Stevenson <dave.stevenson@raspberrypi.org>
-Date: Mon, 24 Sep 2018 16:30:37 +0100
-Subject: [PATCH] staging: vc04_services: Split vchiq-mmal into a
- module
-
-In preparation for adding a video codec V4L2 module which also
-wants to use vchiq-mmal functions, split it out into an
-independent module.
-The minimum number of changes have been made to achieve this
-(eg straight moves where possible) so existing checkpatch
-errors will still be present.
-
-Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
----
- drivers/staging/vc04_services/Kconfig | 1 +
- drivers/staging/vc04_services/Makefile | 1 +
- .../vc04_services/bcm2835-camera/Kconfig | 2 +-
- .../vc04_services/bcm2835-camera/Makefile | 4 ++--
- .../staging/vc04_services/vchiq-mmal/Kconfig | 7 ++++++
- .../staging/vc04_services/vchiq-mmal/Makefile | 8 +++++++
- .../mmal-common.h | 0
- .../mmal-encodings.h | 0
- .../mmal-msg-common.h | 0
- .../mmal-msg-format.h | 0
- .../mmal-msg-port.h | 0
- .../{bcm2835-camera => vchiq-mmal}/mmal-msg.h | 0
- .../mmal-parameters.h | 0
- .../mmal-vchiq.c | 22 +++++++++++++++++++
- .../mmal-vchiq.h | 0
- 15 files changed, 42 insertions(+), 3 deletions(-)
- create mode 100644 drivers/staging/vc04_services/vchiq-mmal/Kconfig
- create mode 100644 drivers/staging/vc04_services/vchiq-mmal/Makefile
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-common.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-encodings.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-msg-common.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-msg-format.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-msg-port.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-msg.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-parameters.h (100%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-vchiq.c (98%)
- rename drivers/staging/vc04_services/{bcm2835-camera => vchiq-mmal}/mmal-vchiq.h (100%)
-
---- a/drivers/staging/vc04_services/Kconfig
-+++ b/drivers/staging/vc04_services/Kconfig
-@@ -21,6 +21,7 @@ config BCM2835_VCHIQ
- source "drivers/staging/vc04_services/bcm2835-audio/Kconfig"
-
- source "drivers/staging/vc04_services/bcm2835-camera/Kconfig"
-+source "drivers/staging/vc04_services/vchiq-mmal/Kconfig"
-
- endif
-
---- a/drivers/staging/vc04_services/Makefile
-+++ b/drivers/staging/vc04_services/Makefile
-@@ -12,6 +12,7 @@ vchiq-objs := \
-
- obj-$(CONFIG_SND_BCM2835) += bcm2835-audio/
- obj-$(CONFIG_VIDEO_BCM2835) += bcm2835-camera/
-+obj-$(CONFIG_BCM2835_VCHIQ_MMAL) += vchiq-mmal/
-
- ccflags-y += -Idrivers/staging/vc04_services -D__VCCOREVER__=0x04000000
-
---- a/drivers/staging/vc04_services/bcm2835-camera/Kconfig
-+++ b/drivers/staging/vc04_services/bcm2835-camera/Kconfig
-@@ -2,7 +2,7 @@ config VIDEO_BCM2835
- tristate "BCM2835 Camera"
- depends on MEDIA_SUPPORT
- depends on VIDEO_V4L2 && (ARCH_BCM2835 || COMPILE_TEST)
-- select BCM2835_VCHIQ
-+ select BCM2835_VCHIQ_MMAL
- select VIDEOBUF2_VMALLOC
- select BTREE
- help
---- a/drivers/staging/vc04_services/bcm2835-camera/Makefile
-+++ b/drivers/staging/vc04_services/bcm2835-camera/Makefile
-@@ -1,11 +1,11 @@
- # SPDX-License-Identifier: GPL-2.0
- bcm2835-v4l2-$(CONFIG_VIDEO_BCM2835) := \
- bcm2835-camera.o \
-- controls.o \
-- mmal-vchiq.o
-+ controls.o
-
- obj-$(CONFIG_VIDEO_BCM2835) += bcm2835-v4l2.o
-
- ccflags-y += \
- -Idrivers/staging/vc04_services \
-+ -Idrivers/staging/vc04_services/vchiq-mmal \
- -D__VCCOREVER__=0x04000000
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/Kconfig
-@@ -0,0 +1,7 @@
-+config BCM2835_VCHIQ_MMAL
-+ tristate "BCM2835 MMAL VCHIQ service"
-+ depends on (ARCH_BCM2835 || COMPILE_TEST)
-+ select BCM2835_VCHIQ
-+ help
-+ Enables the MMAL API over VCHIQ as used for the
-+ majority of the multimedia services on VideoCore.
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/Makefile
-@@ -0,0 +1,8 @@
-+# SPDX-License-Identifier: GPL-2.0
-+bcm2835-mmal-vchiq-objs := mmal-vchiq.o
-+
-+obj-$(CONFIG_BCM2835_VCHIQ_MMAL) += bcm2835-mmal-vchiq.o
-+
-+ccflags-y += \
-+ -Idrivers/staging/vc04_services \
-+ -D__VCCOREVER__=0x04000000
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c
-+++ /dev/null
-@@ -1,1899 +0,0 @@
--// SPDX-License-Identifier: GPL-2.0
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- *
-- * V4L2 driver MMAL vchiq interface code
-- */
--
--#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
--
--#include <linux/errno.h>
--#include <linux/kernel.h>
--#include <linux/mutex.h>
--#include <linux/mm.h>
--#include <linux/slab.h>
--#include <linux/completion.h>
--#include <linux/vmalloc.h>
--#include <asm/cacheflush.h>
--#include <media/videobuf2-vmalloc.h>
--
--#include "mmal-common.h"
--#include "mmal-vchiq.h"
--#include "mmal-msg.h"
--
--#define USE_VCHIQ_ARM
--#include "interface/vchi/vchi.h"
--
--/* maximum number of components supported */
--#define VCHIQ_MMAL_MAX_COMPONENTS 4
--
--/*#define FULL_MSG_DUMP 1*/
--
--#ifdef DEBUG
--static const char *const msg_type_names[] = {
-- "UNKNOWN",
-- "QUIT",
-- "SERVICE_CLOSED",
-- "GET_VERSION",
-- "COMPONENT_CREATE",
-- "COMPONENT_DESTROY",
-- "COMPONENT_ENABLE",
-- "COMPONENT_DISABLE",
-- "PORT_INFO_GET",
-- "PORT_INFO_SET",
-- "PORT_ACTION",
-- "BUFFER_FROM_HOST",
-- "BUFFER_TO_HOST",
-- "GET_STATS",
-- "PORT_PARAMETER_SET",
-- "PORT_PARAMETER_GET",
-- "EVENT_TO_HOST",
-- "GET_CORE_STATS_FOR_PORT",
-- "OPAQUE_ALLOCATOR",
-- "CONSUME_MEM",
-- "LMK",
-- "OPAQUE_ALLOCATOR_DESC",
-- "DRM_GET_LHS32",
-- "DRM_GET_TIME",
-- "BUFFER_FROM_HOST_ZEROLEN",
-- "PORT_FLUSH",
-- "HOST_LOG",
--};
--#endif
--
--static const char *const port_action_type_names[] = {
-- "UNKNOWN",
-- "ENABLE",
-- "DISABLE",
-- "FLUSH",
-- "CONNECT",
-- "DISCONNECT",
-- "SET_REQUIREMENTS",
--};
--
--#if defined(DEBUG)
--#if defined(FULL_MSG_DUMP)
--#define DBG_DUMP_MSG(MSG, MSG_LEN, TITLE) \
-- do { \
-- pr_debug(TITLE" type:%s(%d) length:%d\n", \
-- msg_type_names[(MSG)->h.type], \
-- (MSG)->h.type, (MSG_LEN)); \
-- print_hex_dump(KERN_DEBUG, "<<h: ", DUMP_PREFIX_OFFSET, \
-- 16, 4, (MSG), \
-- sizeof(struct mmal_msg_header), 1); \
-- print_hex_dump(KERN_DEBUG, "<<p: ", DUMP_PREFIX_OFFSET, \
-- 16, 4, \
-- ((u8 *)(MSG)) + sizeof(struct mmal_msg_header),\
-- (MSG_LEN) - sizeof(struct mmal_msg_header), 1); \
-- } while (0)
--#else
--#define DBG_DUMP_MSG(MSG, MSG_LEN, TITLE) \
-- { \
-- pr_debug(TITLE" type:%s(%d) length:%d\n", \
-- msg_type_names[(MSG)->h.type], \
-- (MSG)->h.type, (MSG_LEN)); \
-- }
--#endif
--#else
--#define DBG_DUMP_MSG(MSG, MSG_LEN, TITLE)
--#endif
--
--struct vchiq_mmal_instance;
--
--/* normal message context */
--struct mmal_msg_context {
-- struct vchiq_mmal_instance *instance;
--
-- /* Index in the context_map idr so that we can find the
-- * mmal_msg_context again when servicing the VCHI reply.
-- */
-- int handle;
--
-- union {
-- struct {
-- /* work struct for buffer_cb callback */
-- struct work_struct work;
-- /* work struct for deferred callback */
-- struct work_struct buffer_to_host_work;
-- /* mmal instance */
-- struct vchiq_mmal_instance *instance;
-- /* mmal port */
-- struct vchiq_mmal_port *port;
-- /* actual buffer used to store bulk reply */
-- struct mmal_buffer *buffer;
-- /* amount of buffer used */
-- unsigned long buffer_used;
-- /* MMAL buffer flags */
-- u32 mmal_flags;
-- /* Presentation and Decode timestamps */
-- s64 pts;
-- s64 dts;
--
-- int status; /* context status */
--
-- } bulk; /* bulk data */
--
-- struct {
-- /* message handle to release */
-- VCHI_HELD_MSG_T msg_handle;
-- /* pointer to received message */
-- struct mmal_msg *msg;
-- /* received message length */
-- u32 msg_len;
-- /* completion upon reply */
-- struct completion cmplt;
-- } sync; /* synchronous response */
-- } u;
--
--};
--
--struct vchiq_mmal_instance {
-- VCHI_SERVICE_HANDLE_T handle;
--
-- /* ensure serialised access to service */
-- struct mutex vchiq_mutex;
--
-- /* vmalloc page to receive scratch bulk xfers into */
-- void *bulk_scratch;
--
-- struct idr context_map;
-- /* protect accesses to context_map */
-- struct mutex context_map_lock;
--
-- /* component to use next */
-- int component_idx;
-- struct vchiq_mmal_component component[VCHIQ_MMAL_MAX_COMPONENTS];
--
-- /* ordered workqueue to process all bulk operations */
-- struct workqueue_struct *bulk_wq;
--};
--
--static struct mmal_msg_context *
--get_msg_context(struct vchiq_mmal_instance *instance)
--{
-- struct mmal_msg_context *msg_context;
-- int handle;
--
-- /* todo: should this be allocated from a pool to avoid kzalloc */
-- msg_context = kzalloc(sizeof(*msg_context), GFP_KERNEL);
--
-- if (!msg_context)
-- return ERR_PTR(-ENOMEM);
--
-- /* Create an ID that will be passed along with our message so
-- * that when we service the VCHI reply, we can look up what
-- * message is being replied to.
-- */
-- mutex_lock(&instance->context_map_lock);
-- handle = idr_alloc(&instance->context_map, msg_context,
-- 0, 0, GFP_KERNEL);
-- mutex_unlock(&instance->context_map_lock);
--
-- if (handle < 0) {
-- kfree(msg_context);
-- return ERR_PTR(handle);
-- }
--
-- msg_context->instance = instance;
-- msg_context->handle = handle;
--
-- return msg_context;
--}
--
--static struct mmal_msg_context *
--lookup_msg_context(struct vchiq_mmal_instance *instance, int handle)
--{
-- return idr_find(&instance->context_map, handle);
--}
--
--static void
--release_msg_context(struct mmal_msg_context *msg_context)
--{
-- struct vchiq_mmal_instance *instance = msg_context->instance;
--
-- mutex_lock(&instance->context_map_lock);
-- idr_remove(&instance->context_map, msg_context->handle);
-- mutex_unlock(&instance->context_map_lock);
-- kfree(msg_context);
--}
--
--/* deals with receipt of event to host message */
--static void event_to_host_cb(struct vchiq_mmal_instance *instance,
-- struct mmal_msg *msg, u32 msg_len)
--{
-- pr_debug("unhandled event\n");
-- pr_debug("component:%u port type:%d num:%d cmd:0x%x length:%d\n",
-- msg->u.event_to_host.client_component,
-- msg->u.event_to_host.port_type,
-- msg->u.event_to_host.port_num,
-- msg->u.event_to_host.cmd, msg->u.event_to_host.length);
--}
--
--/* workqueue scheduled callback
-- *
-- * we do this because it is important we do not call any other vchiq
-- * sync calls from witin the message delivery thread
-- */
--static void buffer_work_cb(struct work_struct *work)
--{
-- struct mmal_msg_context *msg_context =
-- container_of(work, struct mmal_msg_context, u.bulk.work);
--
-- 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);
--}
--
--/* workqueue scheduled callback to handle receiving buffers
-- *
-- * VCHI will allow up to 4 bulk receives to be scheduled before blocking.
-- * If we block in the service_callback context then we can't process the
-- * VCHI_CALLBACK_BULK_RECEIVED message that would otherwise allow the blocked
-- * vchi_bulk_queue_receive() call to complete.
-- */
--static void buffer_to_host_work_cb(struct work_struct *work)
--{
-- struct mmal_msg_context *msg_context =
-- container_of(work, struct mmal_msg_context,
-- u.bulk.buffer_to_host_work);
-- struct vchiq_mmal_instance *instance = msg_context->instance;
-- unsigned long len = msg_context->u.bulk.buffer_used;
-- int ret;
--
-- if (!len)
-- /* Dummy receive to ensure the buffers remain in order */
-- len = 8;
-- /* queue the bulk submission */
-- vchi_service_use(instance->handle);
-- ret = vchi_bulk_queue_receive(instance->handle,
-- msg_context->u.bulk.buffer->buffer,
-- /* Actual receive needs to be a multiple
-- * of 4 bytes
-- */
-- (len + 3) & ~3,
-- VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE |
-- VCHI_FLAGS_BLOCK_UNTIL_QUEUED,
-- msg_context);
--
-- vchi_service_release(instance->handle);
--
-- if (ret != 0)
-- pr_err("%s: ctx: %p, vchi_bulk_queue_receive failed %d\n",
-- __func__, msg_context, ret);
--}
--
--/* enqueue a bulk receive for a given message context */
--static int bulk_receive(struct vchiq_mmal_instance *instance,
-- struct mmal_msg *msg,
-- struct mmal_msg_context *msg_context)
--{
-- unsigned long rd_len;
--
-- rd_len = msg->u.buffer_from_host.buffer_header.length;
--
-- if (!msg_context->u.bulk.buffer) {
-- pr_err("bulk.buffer not configured - error in buffer_from_host\n");
--
-- /* todo: this is a serious error, we should never have
-- * committed a buffer_to_host operation to the mmal
-- * port without the buffer to back it up (underflow
-- * handling) and there is no obvious way to deal with
-- * this - how is the mmal servie going to react when
-- * we fail to do the xfer and reschedule a buffer when
-- * it arrives? perhaps a starved flag to indicate a
-- * waiting bulk receive?
-- */
--
-- return -EINVAL;
-- }
--
-- /* ensure we do not overrun the available buffer */
-- if (rd_len > msg_context->u.bulk.buffer->buffer_size) {
-- rd_len = msg_context->u.bulk.buffer->buffer_size;
-- pr_warn("short read as not enough receive buffer space\n");
-- /* todo: is this the correct response, what happens to
-- * the rest of the message data?
-- */
-- }
--
-- /* store length */
-- msg_context->u.bulk.buffer_used = rd_len;
-- msg_context->u.bulk.dts = msg->u.buffer_from_host.buffer_header.dts;
-- msg_context->u.bulk.pts = msg->u.buffer_from_host.buffer_header.pts;
--
-- queue_work(msg_context->instance->bulk_wq,
-- &msg_context->u.bulk.buffer_to_host_work);
--
-- return 0;
--}
--
--/* data in message, memcpy from packet into output buffer */
--static int inline_receive(struct vchiq_mmal_instance *instance,
-- struct mmal_msg *msg,
-- struct mmal_msg_context *msg_context)
--{
-- memcpy(msg_context->u.bulk.buffer->buffer,
-- msg->u.buffer_from_host.short_data,
-- msg->u.buffer_from_host.payload_in_message);
--
-- msg_context->u.bulk.buffer_used =
-- msg->u.buffer_from_host.payload_in_message;
--
-- return 0;
--}
--
--/* queue the buffer availability with MMAL_MSG_TYPE_BUFFER_FROM_HOST */
--static int
--buffer_from_host(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port, struct mmal_buffer *buf)
--{
-- struct mmal_msg_context *msg_context;
-- struct mmal_msg m;
-- int ret;
--
-- if (!port->enabled)
-- return -EINVAL;
--
-- pr_debug("instance:%p buffer:%p\n", instance->handle, buf);
--
-- /* get context */
-- if (!buf->msg_context) {
-- pr_err("%s: msg_context not allocated, buf %p\n", __func__,
-- buf);
-- return -EINVAL;
-- }
-- msg_context = buf->msg_context;
--
-- /* store bulk message context for when data arrives */
-- msg_context->u.bulk.instance = instance;
-- msg_context->u.bulk.port = port;
-- msg_context->u.bulk.buffer = buf;
-- msg_context->u.bulk.buffer_used = 0;
--
-- /* initialise work structure ready to schedule callback */
-- INIT_WORK(&msg_context->u.bulk.work, buffer_work_cb);
-- INIT_WORK(&msg_context->u.bulk.buffer_to_host_work,
-- buffer_to_host_work_cb);
--
-- atomic_inc(&port->buffers_with_vpu);
--
-- /* prep the buffer from host message */
-- memset(&m, 0xbc, sizeof(m)); /* just to make debug clearer */
--
-- m.h.type = MMAL_MSG_TYPE_BUFFER_FROM_HOST;
-- m.h.magic = MMAL_MAGIC;
-- m.h.context = msg_context->handle;
-- m.h.status = 0;
--
-- /* drvbuf is our private data passed back */
-- m.u.buffer_from_host.drvbuf.magic = MMAL_MAGIC;
-- m.u.buffer_from_host.drvbuf.component_handle = port->component->handle;
-- m.u.buffer_from_host.drvbuf.port_handle = port->handle;
-- m.u.buffer_from_host.drvbuf.client_context = msg_context->handle;
--
-- /* buffer header */
-- m.u.buffer_from_host.buffer_header.cmd = 0;
-- m.u.buffer_from_host.buffer_header.data =
-- (u32)(unsigned long)buf->buffer;
-- m.u.buffer_from_host.buffer_header.alloc_size = buf->buffer_size;
-- m.u.buffer_from_host.buffer_header.length = 0; /* nothing used yet */
-- m.u.buffer_from_host.buffer_header.offset = 0; /* no offset */
-- m.u.buffer_from_host.buffer_header.flags = 0; /* no flags */
-- m.u.buffer_from_host.buffer_header.pts = MMAL_TIME_UNKNOWN;
-- m.u.buffer_from_host.buffer_header.dts = MMAL_TIME_UNKNOWN;
--
-- /* clear buffer type sepecific data */
-- memset(&m.u.buffer_from_host.buffer_header_type_specific, 0,
-- sizeof(m.u.buffer_from_host.buffer_header_type_specific));
--
-- /* no payload in message */
-- m.u.buffer_from_host.payload_in_message = 0;
--
-- vchi_service_use(instance->handle);
--
-- ret = vchi_queue_kernel_message(instance->handle,
-- &m,
-- sizeof(struct mmal_msg_header) +
-- sizeof(m.u.buffer_from_host));
--
-- vchi_service_release(instance->handle);
--
-- return ret;
--}
--
--/* deals with receipt of buffer to host message */
--static void buffer_to_host_cb(struct vchiq_mmal_instance *instance,
-- struct mmal_msg *msg, u32 msg_len)
--{
-- struct mmal_msg_context *msg_context;
-- u32 handle;
--
-- pr_debug("%s: instance:%p msg:%p msg_len:%d\n",
-- __func__, instance, msg, msg_len);
--
-- if (msg->u.buffer_from_host.drvbuf.magic == MMAL_MAGIC) {
-- handle = msg->u.buffer_from_host.drvbuf.client_context;
-- msg_context = lookup_msg_context(instance, handle);
--
-- if (!msg_context) {
-- pr_err("drvbuf.client_context(%u) is invalid\n",
-- handle);
-- return;
-- }
-- } else {
-- pr_err("MMAL_MSG_TYPE_BUFFER_TO_HOST with bad magic\n");
-- return;
-- }
--
-- msg_context->u.bulk.mmal_flags =
-- msg->u.buffer_from_host.buffer_header.flags;
--
-- if (msg->h.status != MMAL_MSG_STATUS_SUCCESS) {
-- /* message reception had an error */
-- pr_warn("error %d in reply\n", msg->h.status);
--
-- msg_context->u.bulk.status = msg->h.status;
--
-- } else if (msg->u.buffer_from_host.buffer_header.length == 0) {
-- /* empty buffer */
-- if (msg->u.buffer_from_host.buffer_header.flags &
-- MMAL_BUFFER_HEADER_FLAG_EOS) {
-- msg_context->u.bulk.status =
-- bulk_receive(instance, msg, msg_context);
-- if (msg_context->u.bulk.status == 0)
-- return; /* successful bulk submission, bulk
-- * completion will trigger callback
-- */
-- } else {
-- /* do callback with empty buffer - not EOS though */
-- msg_context->u.bulk.status = 0;
-- msg_context->u.bulk.buffer_used = 0;
-- }
-- } else if (msg->u.buffer_from_host.payload_in_message == 0) {
-- /* data is not in message, queue a bulk receive */
-- msg_context->u.bulk.status =
-- bulk_receive(instance, msg, msg_context);
-- if (msg_context->u.bulk.status == 0)
-- return; /* successful bulk submission, bulk
-- * completion will trigger callback
-- */
--
-- /* failed to submit buffer, this will end badly */
-- pr_err("error %d on bulk submission\n",
-- msg_context->u.bulk.status);
--
-- } else if (msg->u.buffer_from_host.payload_in_message <=
-- MMAL_VC_SHORT_DATA) {
-- /* data payload within message */
-- msg_context->u.bulk.status = inline_receive(instance, msg,
-- msg_context);
-- } else {
-- pr_err("message with invalid short payload\n");
--
-- /* signal error */
-- msg_context->u.bulk.status = -EINVAL;
-- msg_context->u.bulk.buffer_used =
-- msg->u.buffer_from_host.payload_in_message;
-- }
--
-- /* schedule the port callback */
-- schedule_work(&msg_context->u.bulk.work);
--}
--
--static void bulk_receive_cb(struct vchiq_mmal_instance *instance,
-- struct mmal_msg_context *msg_context)
--{
-- msg_context->u.bulk.status = 0;
--
-- /* schedule the port callback */
-- schedule_work(&msg_context->u.bulk.work);
--}
--
--static void bulk_abort_cb(struct vchiq_mmal_instance *instance,
-- struct mmal_msg_context *msg_context)
--{
-- pr_err("%s: bulk ABORTED msg_context:%p\n", __func__, msg_context);
--
-- msg_context->u.bulk.status = -EINTR;
--
-- schedule_work(&msg_context->u.bulk.work);
--}
--
--/* incoming event service callback */
--static void service_callback(void *param,
-- const VCHI_CALLBACK_REASON_T reason,
-- void *bulk_ctx)
--{
-- struct vchiq_mmal_instance *instance = param;
-- int status;
-- u32 msg_len;
-- struct mmal_msg *msg;
-- VCHI_HELD_MSG_T msg_handle;
-- struct mmal_msg_context *msg_context;
--
-- if (!instance) {
-- pr_err("Message callback passed NULL instance\n");
-- return;
-- }
--
-- switch (reason) {
-- case VCHI_CALLBACK_MSG_AVAILABLE:
-- status = vchi_msg_hold(instance->handle, (void **)&msg,
-- &msg_len, VCHI_FLAGS_NONE, &msg_handle);
-- if (status) {
-- pr_err("Unable to dequeue a message (%d)\n", status);
-- break;
-- }
--
-- DBG_DUMP_MSG(msg, msg_len, "<<< reply message");
--
-- /* handling is different for buffer messages */
-- switch (msg->h.type) {
-- case MMAL_MSG_TYPE_BUFFER_FROM_HOST:
-- vchi_held_msg_release(&msg_handle);
-- break;
--
-- case MMAL_MSG_TYPE_EVENT_TO_HOST:
-- event_to_host_cb(instance, msg, msg_len);
-- vchi_held_msg_release(&msg_handle);
--
-- break;
--
-- case MMAL_MSG_TYPE_BUFFER_TO_HOST:
-- buffer_to_host_cb(instance, msg, msg_len);
-- vchi_held_msg_release(&msg_handle);
-- break;
--
-- default:
-- /* messages dependent on header context to complete */
-- if (!msg->h.context) {
-- pr_err("received message context was null!\n");
-- vchi_held_msg_release(&msg_handle);
-- break;
-- }
--
-- msg_context = lookup_msg_context(instance,
-- msg->h.context);
-- if (!msg_context) {
-- pr_err("received invalid message context %u!\n",
-- msg->h.context);
-- vchi_held_msg_release(&msg_handle);
-- break;
-- }
--
-- /* fill in context values */
-- msg_context->u.sync.msg_handle = msg_handle;
-- msg_context->u.sync.msg = msg;
-- msg_context->u.sync.msg_len = msg_len;
--
-- /* todo: should this check (completion_done()
-- * == 1) for no one waiting? or do we need a
-- * flag to tell us the completion has been
-- * interrupted so we can free the message and
-- * its context. This probably also solves the
-- * message arriving after interruption todo
-- * below
-- */
--
-- /* complete message so caller knows it happened */
-- complete(&msg_context->u.sync.cmplt);
-- break;
-- }
--
-- break;
--
-- case VCHI_CALLBACK_BULK_RECEIVED:
-- bulk_receive_cb(instance, bulk_ctx);
-- break;
--
-- case VCHI_CALLBACK_BULK_RECEIVE_ABORTED:
-- bulk_abort_cb(instance, bulk_ctx);
-- break;
--
-- case VCHI_CALLBACK_SERVICE_CLOSED:
-- /* TODO: consider if this requires action if received when
-- * driver is not explicitly closing the service
-- */
-- break;
--
-- default:
-- pr_err("Received unhandled message reason %d\n", reason);
-- break;
-- }
--}
--
--static int send_synchronous_mmal_msg(struct vchiq_mmal_instance *instance,
-- struct mmal_msg *msg,
-- unsigned int payload_len,
-- struct mmal_msg **msg_out,
-- VCHI_HELD_MSG_T *msg_handle_out)
--{
-- struct mmal_msg_context *msg_context;
-- int ret;
-- unsigned long timeout;
--
-- /* payload size must not cause message to exceed max size */
-- if (payload_len >
-- (MMAL_MSG_MAX_SIZE - sizeof(struct mmal_msg_header))) {
-- pr_err("payload length %d exceeds max:%d\n", payload_len,
-- (int)(MMAL_MSG_MAX_SIZE -
-- sizeof(struct mmal_msg_header)));
-- return -EINVAL;
-- }
--
-- msg_context = get_msg_context(instance);
-- if (IS_ERR(msg_context))
-- return PTR_ERR(msg_context);
--
-- init_completion(&msg_context->u.sync.cmplt);
--
-- msg->h.magic = MMAL_MAGIC;
-- msg->h.context = msg_context->handle;
-- msg->h.status = 0;
--
-- DBG_DUMP_MSG(msg, (sizeof(struct mmal_msg_header) + payload_len),
-- ">>> sync message");
--
-- vchi_service_use(instance->handle);
--
-- ret = vchi_queue_kernel_message(instance->handle,
-- msg,
-- sizeof(struct mmal_msg_header) +
-- payload_len);
--
-- vchi_service_release(instance->handle);
--
-- if (ret) {
-- pr_err("error %d queuing message\n", ret);
-- release_msg_context(msg_context);
-- return ret;
-- }
--
-- timeout = wait_for_completion_timeout(&msg_context->u.sync.cmplt,
-- 3 * HZ);
-- if (timeout == 0) {
-- pr_err("timed out waiting for sync completion\n");
-- ret = -ETIME;
-- /* todo: what happens if the message arrives after aborting */
-- release_msg_context(msg_context);
-- return ret;
-- }
--
-- *msg_out = msg_context->u.sync.msg;
-- *msg_handle_out = msg_context->u.sync.msg_handle;
-- release_msg_context(msg_context);
--
-- return 0;
--}
--
--static void dump_port_info(struct vchiq_mmal_port *port)
--{
-- pr_debug("port handle:0x%x enabled:%d\n", port->handle, port->enabled);
--
-- pr_debug("buffer minimum num:%d size:%d align:%d\n",
-- port->minimum_buffer.num,
-- port->minimum_buffer.size, port->minimum_buffer.alignment);
--
-- pr_debug("buffer recommended num:%d size:%d align:%d\n",
-- port->recommended_buffer.num,
-- port->recommended_buffer.size,
-- port->recommended_buffer.alignment);
--
-- pr_debug("buffer current values num:%d size:%d align:%d\n",
-- port->current_buffer.num,
-- port->current_buffer.size, port->current_buffer.alignment);
--
-- pr_debug("elementary stream: type:%d encoding:0x%x variant:0x%x\n",
-- port->format.type,
-- port->format.encoding, port->format.encoding_variant);
--
-- pr_debug(" bitrate:%d flags:0x%x\n",
-- port->format.bitrate, port->format.flags);
--
-- if (port->format.type == MMAL_ES_TYPE_VIDEO) {
-- pr_debug
-- ("es video format: width:%d height:%d colourspace:0x%x\n",
-- port->es.video.width, port->es.video.height,
-- port->es.video.color_space);
--
-- pr_debug(" : crop xywh %d,%d,%d,%d\n",
-- port->es.video.crop.x,
-- port->es.video.crop.y,
-- port->es.video.crop.width, port->es.video.crop.height);
-- pr_debug(" : framerate %d/%d aspect %d/%d\n",
-- port->es.video.frame_rate.num,
-- port->es.video.frame_rate.den,
-- port->es.video.par.num, port->es.video.par.den);
-- }
--}
--
--static void port_to_mmal_msg(struct vchiq_mmal_port *port, struct mmal_port *p)
--{
-- /* todo do readonly fields need setting at all? */
-- p->type = port->type;
-- p->index = port->index;
-- p->index_all = 0;
-- p->is_enabled = port->enabled;
-- p->buffer_num_min = port->minimum_buffer.num;
-- p->buffer_size_min = port->minimum_buffer.size;
-- p->buffer_alignment_min = port->minimum_buffer.alignment;
-- p->buffer_num_recommended = port->recommended_buffer.num;
-- p->buffer_size_recommended = port->recommended_buffer.size;
--
-- /* only three writable fields in a port */
-- p->buffer_num = port->current_buffer.num;
-- p->buffer_size = port->current_buffer.size;
-- p->userdata = (u32)(unsigned long)port;
--}
--
--static int port_info_set(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- pr_debug("setting port info port %p\n", port);
-- if (!port)
-- return -1;
-- dump_port_info(port);
--
-- m.h.type = MMAL_MSG_TYPE_PORT_INFO_SET;
--
-- m.u.port_info_set.component_handle = port->component->handle;
-- m.u.port_info_set.port_type = port->type;
-- m.u.port_info_set.port_index = port->index;
--
-- port_to_mmal_msg(port, &m.u.port_info_set.port);
--
-- /* elementary stream format setup */
-- m.u.port_info_set.format.type = port->format.type;
-- m.u.port_info_set.format.encoding = port->format.encoding;
-- m.u.port_info_set.format.encoding_variant =
-- port->format.encoding_variant;
-- m.u.port_info_set.format.bitrate = port->format.bitrate;
-- m.u.port_info_set.format.flags = port->format.flags;
--
-- memcpy(&m.u.port_info_set.es, &port->es,
-- sizeof(union mmal_es_specific_format));
--
-- m.u.port_info_set.format.extradata_size = port->format.extradata_size;
-- memcpy(&m.u.port_info_set.extradata, port->format.extradata,
-- port->format.extradata_size);
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.port_info_set),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != MMAL_MSG_TYPE_PORT_INFO_SET) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- /* return operation status */
-- ret = -rmsg->u.port_info_get_reply.status;
--
-- pr_debug("%s:result:%d component:0x%x port:%d\n", __func__, ret,
-- port->component->handle, port->handle);
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* use port info get message to retrieve port information */
--static int port_info_get(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- /* port info time */
-- m.h.type = MMAL_MSG_TYPE_PORT_INFO_GET;
-- m.u.port_info_get.component_handle = port->component->handle;
-- m.u.port_info_get.port_type = port->type;
-- m.u.port_info_get.index = port->index;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.port_info_get),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != MMAL_MSG_TYPE_PORT_INFO_GET) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- /* return operation status */
-- ret = -rmsg->u.port_info_get_reply.status;
-- if (ret != MMAL_MSG_STATUS_SUCCESS)
-- goto release_msg;
--
-- if (rmsg->u.port_info_get_reply.port.is_enabled == 0)
-- port->enabled = false;
-- else
-- port->enabled = true;
--
-- /* copy the values out of the message */
-- port->handle = rmsg->u.port_info_get_reply.port_handle;
--
-- /* port type and index cached to use on port info set because
-- * it does not use a port handle
-- */
-- port->type = rmsg->u.port_info_get_reply.port_type;
-- port->index = rmsg->u.port_info_get_reply.port_index;
--
-- port->minimum_buffer.num =
-- rmsg->u.port_info_get_reply.port.buffer_num_min;
-- port->minimum_buffer.size =
-- rmsg->u.port_info_get_reply.port.buffer_size_min;
-- port->minimum_buffer.alignment =
-- rmsg->u.port_info_get_reply.port.buffer_alignment_min;
--
-- port->recommended_buffer.alignment =
-- rmsg->u.port_info_get_reply.port.buffer_alignment_min;
-- port->recommended_buffer.num =
-- rmsg->u.port_info_get_reply.port.buffer_num_recommended;
--
-- port->current_buffer.num = rmsg->u.port_info_get_reply.port.buffer_num;
-- port->current_buffer.size =
-- rmsg->u.port_info_get_reply.port.buffer_size;
--
-- /* stream format */
-- port->format.type = rmsg->u.port_info_get_reply.format.type;
-- port->format.encoding = rmsg->u.port_info_get_reply.format.encoding;
-- port->format.encoding_variant =
-- rmsg->u.port_info_get_reply.format.encoding_variant;
-- port->format.bitrate = rmsg->u.port_info_get_reply.format.bitrate;
-- port->format.flags = rmsg->u.port_info_get_reply.format.flags;
--
-- /* elementary stream format */
-- memcpy(&port->es,
-- &rmsg->u.port_info_get_reply.es,
-- sizeof(union mmal_es_specific_format));
-- port->format.es = &port->es;
--
-- port->format.extradata_size =
-- rmsg->u.port_info_get_reply.format.extradata_size;
-- memcpy(port->format.extradata,
-- rmsg->u.port_info_get_reply.extradata,
-- port->format.extradata_size);
--
-- pr_debug("received port info\n");
-- dump_port_info(port);
--
--release_msg:
--
-- pr_debug("%s:result:%d component:0x%x port:%d\n",
-- __func__, ret, port->component->handle, port->handle);
--
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* create comonent on vc */
--static int create_component(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component,
-- const char *name)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- /* build component create message */
-- m.h.type = MMAL_MSG_TYPE_COMPONENT_CREATE;
-- m.u.component_create.client_component = (u32)(unsigned long)component;
-- strncpy(m.u.component_create.name, name,
-- sizeof(m.u.component_create.name));
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.component_create),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != m.h.type) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.component_create_reply.status;
-- if (ret != MMAL_MSG_STATUS_SUCCESS)
-- goto release_msg;
--
-- /* a valid component response received */
-- component->handle = rmsg->u.component_create_reply.component_handle;
-- component->inputs = rmsg->u.component_create_reply.input_num;
-- component->outputs = rmsg->u.component_create_reply.output_num;
-- component->clocks = rmsg->u.component_create_reply.clock_num;
--
-- pr_debug("Component handle:0x%x in:%d out:%d clock:%d\n",
-- component->handle,
-- component->inputs, component->outputs, component->clocks);
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* destroys a component on vc */
--static int destroy_component(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_COMPONENT_DESTROY;
-- m.u.component_destroy.component_handle = component->handle;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.component_destroy),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != m.h.type) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.component_destroy_reply.status;
--
--release_msg:
--
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* enable a component on vc */
--static int enable_component(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_COMPONENT_ENABLE;
-- m.u.component_enable.component_handle = component->handle;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.component_enable),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != m.h.type) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.component_enable_reply.status;
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* disable a component on vc */
--static int disable_component(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_COMPONENT_DISABLE;
-- m.u.component_disable.component_handle = component->handle;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.component_disable),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != m.h.type) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.component_disable_reply.status;
--
--release_msg:
--
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* get version of mmal implementation */
--static int get_version(struct vchiq_mmal_instance *instance,
-- u32 *major_out, u32 *minor_out)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_GET_VERSION;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.version),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != m.h.type) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- *major_out = rmsg->u.version.major;
-- *minor_out = rmsg->u.version.minor;
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* do a port action with a port as a parameter */
--static int port_action_port(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- enum mmal_msg_port_action_type action_type)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_PORT_ACTION;
-- m.u.port_action_port.component_handle = port->component->handle;
-- m.u.port_action_port.port_handle = port->handle;
-- m.u.port_action_port.action = action_type;
--
-- port_to_mmal_msg(port, &m.u.port_action_port.port);
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.port_action_port),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != MMAL_MSG_TYPE_PORT_ACTION) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.port_action_reply.status;
--
-- pr_debug("%s:result:%d component:0x%x port:%d action:%s(%d)\n",
-- __func__,
-- ret, port->component->handle, port->handle,
-- port_action_type_names[action_type], action_type);
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* do a port action with handles as parameters */
--static int port_action_handle(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- enum mmal_msg_port_action_type action_type,
-- u32 connect_component_handle,
-- u32 connect_port_handle)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_PORT_ACTION;
--
-- m.u.port_action_handle.component_handle = port->component->handle;
-- m.u.port_action_handle.port_handle = port->handle;
-- m.u.port_action_handle.action = action_type;
--
-- m.u.port_action_handle.connect_component_handle =
-- connect_component_handle;
-- m.u.port_action_handle.connect_port_handle = connect_port_handle;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(m.u.port_action_handle),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != MMAL_MSG_TYPE_PORT_ACTION) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.port_action_reply.status;
--
-- pr_debug("%s:result:%d component:0x%x port:%d action:%s(%d) connect component:0x%x connect port:%d\n",
-- __func__,
-- ret, port->component->handle, port->handle,
-- port_action_type_names[action_type],
-- action_type, connect_component_handle, connect_port_handle);
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--static int port_parameter_set(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- u32 parameter_id, void *value, u32 value_size)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_PORT_PARAMETER_SET;
--
-- m.u.port_parameter_set.component_handle = port->component->handle;
-- m.u.port_parameter_set.port_handle = port->handle;
-- m.u.port_parameter_set.id = parameter_id;
-- m.u.port_parameter_set.size = (2 * sizeof(u32)) + value_size;
-- memcpy(&m.u.port_parameter_set.value, value, value_size);
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- (4 * sizeof(u32)) + value_size,
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != MMAL_MSG_TYPE_PORT_PARAMETER_SET) {
-- /* got an unexpected message type in reply */
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.port_parameter_set_reply.status;
--
-- pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n",
-- __func__,
-- ret, port->component->handle, port->handle, parameter_id);
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--static int port_parameter_get(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- u32 parameter_id, void *value, u32 *value_size)
--{
-- int ret;
-- struct mmal_msg m;
-- struct mmal_msg *rmsg;
-- VCHI_HELD_MSG_T rmsg_handle;
--
-- m.h.type = MMAL_MSG_TYPE_PORT_PARAMETER_GET;
--
-- m.u.port_parameter_get.component_handle = port->component->handle;
-- m.u.port_parameter_get.port_handle = port->handle;
-- m.u.port_parameter_get.id = parameter_id;
-- m.u.port_parameter_get.size = (2 * sizeof(u32)) + *value_size;
--
-- ret = send_synchronous_mmal_msg(instance, &m,
-- sizeof(struct
-- mmal_msg_port_parameter_get),
-- &rmsg, &rmsg_handle);
-- if (ret)
-- return ret;
--
-- if (rmsg->h.type != MMAL_MSG_TYPE_PORT_PARAMETER_GET) {
-- /* got an unexpected message type in reply */
-- pr_err("Incorrect reply type %d\n", rmsg->h.type);
-- ret = -EINVAL;
-- goto release_msg;
-- }
--
-- ret = -rmsg->u.port_parameter_get_reply.status;
-- /* port_parameter_get_reply.size includes the header,
-- * whilst *value_size doesn't.
-- */
-- rmsg->u.port_parameter_get_reply.size -= (2 * sizeof(u32));
--
-- if (ret || rmsg->u.port_parameter_get_reply.size > *value_size) {
-- /* Copy only as much as we have space for
-- * but report true size of parameter
-- */
-- memcpy(value, &rmsg->u.port_parameter_get_reply.value,
-- *value_size);
-- *value_size = rmsg->u.port_parameter_get_reply.size;
-- } else {
-- memcpy(value, &rmsg->u.port_parameter_get_reply.value,
-- rmsg->u.port_parameter_get_reply.size);
-- }
--
-- pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__,
-- ret, port->component->handle, port->handle, parameter_id);
--
--release_msg:
-- vchi_held_msg_release(&rmsg_handle);
--
-- return ret;
--}
--
--/* disables a port and drains buffers from it */
--static int port_disable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port)
--{
-- int ret;
-- struct list_head *q, *buf_head;
-- unsigned long flags = 0;
--
-- if (!port->enabled)
-- return 0;
--
-- port->enabled = false;
--
-- ret = port_action_port(instance, port,
-- MMAL_MSG_PORT_ACTION_TYPE_DISABLE);
-- if (ret == 0) {
-- /*
-- * Drain all queued buffers on port. This should only
-- * apply to buffers that have been queued before the port
-- * has been enabled. If the port has been enabled and buffers
-- * passed, then the buffers should have been removed from this
-- * list, and we should get the relevant callbacks via VCHIQ
-- * to release the buffers.
-- */
-- spin_lock_irqsave(&port->slock, flags);
--
-- list_for_each_safe(buf_head, q, &port->buffers) {
-- struct mmal_buffer *mmalbuf;
--
-- mmalbuf = list_entry(buf_head, struct mmal_buffer,
-- list);
-- list_del(buf_head);
-- if (port->buffer_cb)
-- port->buffer_cb(instance,
-- port, 0, mmalbuf, 0, 0,
-- MMAL_TIME_UNKNOWN,
-- MMAL_TIME_UNKNOWN);
-- }
--
-- spin_unlock_irqrestore(&port->slock, flags);
--
-- ret = port_info_get(instance, port);
-- }
--
-- return ret;
--}
--
--/* enable a port */
--static int port_enable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port)
--{
-- unsigned int hdr_count;
-- struct list_head *q, *buf_head;
-- int ret;
--
-- if (port->enabled)
-- return 0;
--
-- ret = port_action_port(instance, port,
-- MMAL_MSG_PORT_ACTION_TYPE_ENABLE);
-- if (ret)
-- goto done;
--
-- port->enabled = true;
--
-- if (port->buffer_cb) {
-- /* send buffer headers to videocore */
-- hdr_count = 1;
-- list_for_each_safe(buf_head, q, &port->buffers) {
-- struct mmal_buffer *mmalbuf;
--
-- mmalbuf = list_entry(buf_head, struct mmal_buffer,
-- list);
-- ret = buffer_from_host(instance, port, mmalbuf);
-- if (ret)
-- goto done;
--
-- list_del(buf_head);
-- hdr_count++;
-- if (hdr_count > port->current_buffer.num)
-- break;
-- }
-- }
--
-- ret = port_info_get(instance, port);
--
--done:
-- return ret;
--}
--
--/* ------------------------------------------------------------------
-- * Exported API
-- *------------------------------------------------------------------
-- */
--
--int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- ret = port_info_set(instance, port);
-- if (ret)
-- goto release_unlock;
--
-- /* read what has actually been set */
-- ret = port_info_get(instance, port);
--
--release_unlock:
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- u32 parameter, void *value, u32 value_size)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- ret = port_parameter_set(instance, port, parameter, value, value_size);
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- u32 parameter, void *value, u32 *value_size)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- ret = port_parameter_get(instance, port, parameter, value, value_size);
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--/* enable a port
-- *
-- * enables a port and queues buffers for satisfying callbacks if we
-- * provide a callback handler
-- */
--int vchiq_mmal_port_enable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- vchiq_mmal_buffer_cb buffer_cb)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- /* already enabled - noop */
-- if (port->enabled) {
-- ret = 0;
-- goto unlock;
-- }
--
-- port->buffer_cb = buffer_cb;
--
-- ret = port_enable(instance, port);
--
--unlock:
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- if (!port->enabled) {
-- mutex_unlock(&instance->vchiq_mutex);
-- return 0;
-- }
--
-- ret = port_disable(instance, port);
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--/* ports will be connected in a tunneled manner so data buffers
-- * are not handled by client.
-- */
--int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *src,
-- struct vchiq_mmal_port *dst)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- /* disconnect ports if connected */
-- if (src->connected) {
-- ret = port_disable(instance, src);
-- if (ret) {
-- pr_err("failed disabling src port(%d)\n", ret);
-- goto release_unlock;
-- }
--
-- /* do not need to disable the destination port as they
-- * are connected and it is done automatically
-- */
--
-- ret = port_action_handle(instance, src,
-- MMAL_MSG_PORT_ACTION_TYPE_DISCONNECT,
-- src->connected->component->handle,
-- src->connected->handle);
-- if (ret < 0) {
-- pr_err("failed disconnecting src port\n");
-- goto release_unlock;
-- }
-- src->connected->enabled = false;
-- src->connected = NULL;
-- }
--
-- if (!dst) {
-- /* do not make new connection */
-- ret = 0;
-- pr_debug("not making new connection\n");
-- goto release_unlock;
-- }
--
-- /* copy src port format to dst */
-- dst->format.encoding = src->format.encoding;
-- dst->es.video.width = src->es.video.width;
-- dst->es.video.height = src->es.video.height;
-- dst->es.video.crop.x = src->es.video.crop.x;
-- dst->es.video.crop.y = src->es.video.crop.y;
-- dst->es.video.crop.width = src->es.video.crop.width;
-- dst->es.video.crop.height = src->es.video.crop.height;
-- dst->es.video.frame_rate.num = src->es.video.frame_rate.num;
-- dst->es.video.frame_rate.den = src->es.video.frame_rate.den;
--
-- /* set new format */
-- ret = port_info_set(instance, dst);
-- if (ret) {
-- pr_debug("setting port info failed\n");
-- goto release_unlock;
-- }
--
-- /* read what has actually been set */
-- ret = port_info_get(instance, dst);
-- if (ret) {
-- pr_debug("read back port info failed\n");
-- goto release_unlock;
-- }
--
-- /* connect two ports together */
-- ret = port_action_handle(instance, src,
-- MMAL_MSG_PORT_ACTION_TYPE_CONNECT,
-- dst->component->handle, dst->handle);
-- if (ret < 0) {
-- pr_debug("connecting port %d:%d to %d:%d failed\n",
-- src->component->handle, src->handle,
-- dst->component->handle, dst->handle);
-- goto release_unlock;
-- }
-- src->connected = dst;
--
--release_unlock:
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- struct mmal_buffer *buffer)
--{
-- unsigned long flags = 0;
-- int ret;
--
-- ret = buffer_from_host(instance, port, buffer);
-- if (ret == -EINVAL) {
-- /* Port is disabled. Queue for when it is enabled. */
-- spin_lock_irqsave(&port->slock, flags);
-- list_add_tail(&buffer->list, &port->buffers);
-- spin_unlock_irqrestore(&port->slock, flags);
-- }
--
-- return 0;
--}
--
--int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance,
-- struct mmal_buffer *buf)
--{
-- struct mmal_msg_context *msg_context = get_msg_context(instance);
--
-- if (IS_ERR(msg_context))
-- return (PTR_ERR(msg_context));
--
-- buf->msg_context = msg_context;
-- return 0;
--}
--
--int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf)
--{
-- struct mmal_msg_context *msg_context = buf->msg_context;
--
-- if (msg_context)
-- release_msg_context(msg_context);
-- buf->msg_context = NULL;
--
-- return 0;
--}
--
--/* Initialise a mmal component and its ports
-- *
-- */
--int vchiq_mmal_component_init(struct vchiq_mmal_instance *instance,
-- const char *name,
-- struct vchiq_mmal_component **component_out)
--{
-- int ret;
-- int idx; /* port index */
-- struct vchiq_mmal_component *component;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- if (instance->component_idx == VCHIQ_MMAL_MAX_COMPONENTS) {
-- ret = -EINVAL; /* todo is this correct error? */
-- goto unlock;
-- }
--
-- component = &instance->component[instance->component_idx];
--
-- ret = create_component(instance, component, name);
-- if (ret < 0) {
-- pr_err("%s: failed to create component %d (Not enough GPU mem?)\n",
-- __func__, ret);
-- goto unlock;
-- }
--
-- /* ports info needs gathering */
-- component->control.type = MMAL_PORT_TYPE_CONTROL;
-- component->control.index = 0;
-- component->control.component = component;
-- spin_lock_init(&component->control.slock);
-- INIT_LIST_HEAD(&component->control.buffers);
-- ret = port_info_get(instance, &component->control);
-- if (ret < 0)
-- goto release_component;
--
-- for (idx = 0; idx < component->inputs; idx++) {
-- component->input[idx].type = MMAL_PORT_TYPE_INPUT;
-- component->input[idx].index = idx;
-- component->input[idx].component = component;
-- spin_lock_init(&component->input[idx].slock);
-- INIT_LIST_HEAD(&component->input[idx].buffers);
-- ret = port_info_get(instance, &component->input[idx]);
-- if (ret < 0)
-- goto release_component;
-- }
--
-- for (idx = 0; idx < component->outputs; idx++) {
-- component->output[idx].type = MMAL_PORT_TYPE_OUTPUT;
-- component->output[idx].index = idx;
-- component->output[idx].component = component;
-- spin_lock_init(&component->output[idx].slock);
-- INIT_LIST_HEAD(&component->output[idx].buffers);
-- ret = port_info_get(instance, &component->output[idx]);
-- if (ret < 0)
-- goto release_component;
-- }
--
-- for (idx = 0; idx < component->clocks; idx++) {
-- component->clock[idx].type = MMAL_PORT_TYPE_CLOCK;
-- component->clock[idx].index = idx;
-- component->clock[idx].component = component;
-- spin_lock_init(&component->clock[idx].slock);
-- INIT_LIST_HEAD(&component->clock[idx].buffers);
-- ret = port_info_get(instance, &component->clock[idx]);
-- if (ret < 0)
-- goto release_component;
-- }
--
-- instance->component_idx++;
--
-- *component_out = component;
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return 0;
--
--release_component:
-- destroy_component(instance, component);
--unlock:
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--/*
-- * cause a mmal component to be destroyed
-- */
--int vchiq_mmal_component_finalise(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- if (component->enabled)
-- ret = disable_component(instance, component);
--
-- ret = destroy_component(instance, component);
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--/*
-- * cause a mmal component to be enabled
-- */
--int vchiq_mmal_component_enable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- if (component->enabled) {
-- mutex_unlock(&instance->vchiq_mutex);
-- return 0;
-- }
--
-- ret = enable_component(instance, component);
-- if (ret == 0)
-- component->enabled = true;
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--/*
-- * cause a mmal component to be enabled
-- */
--int vchiq_mmal_component_disable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- if (!component->enabled) {
-- mutex_unlock(&instance->vchiq_mutex);
-- return 0;
-- }
--
-- ret = disable_component(instance, component);
-- if (ret == 0)
-- component->enabled = false;
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--int vchiq_mmal_version(struct vchiq_mmal_instance *instance,
-- u32 *major_out, u32 *minor_out)
--{
-- int ret;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- ret = get_version(instance, major_out, minor_out);
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- return ret;
--}
--
--int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance)
--{
-- int status = 0;
--
-- if (!instance)
-- return -EINVAL;
--
-- if (mutex_lock_interruptible(&instance->vchiq_mutex))
-- return -EINTR;
--
-- vchi_service_use(instance->handle);
--
-- status = vchi_service_close(instance->handle);
-- if (status != 0)
-- pr_err("mmal-vchiq: VCHIQ close failed\n");
--
-- mutex_unlock(&instance->vchiq_mutex);
--
-- flush_workqueue(instance->bulk_wq);
-- destroy_workqueue(instance->bulk_wq);
--
-- vfree(instance->bulk_scratch);
--
-- idr_destroy(&instance->context_map);
--
-- kfree(instance);
--
-- return status;
--}
--
--int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)
--{
-- int status;
-- struct vchiq_mmal_instance *instance;
-- static VCHI_CONNECTION_T *vchi_connection;
-- static VCHI_INSTANCE_T vchi_instance;
-- SERVICE_CREATION_T params = {
-- .version = VCHI_VERSION_EX(VC_MMAL_VER, VC_MMAL_MIN_VER),
-- .service_id = VC_MMAL_SERVER_NAME,
-- .connection = vchi_connection,
-- .rx_fifo_size = 0,
-- .tx_fifo_size = 0,
-- .callback = service_callback,
-- .callback_param = NULL,
-- .want_unaligned_bulk_rx = 1,
-- .want_unaligned_bulk_tx = 1,
-- .want_crc = 0
-- };
--
-- /* compile time checks to ensure structure size as they are
-- * directly (de)serialised from memory.
-- */
--
-- /* ensure the header structure has packed to the correct size */
-- BUILD_BUG_ON(sizeof(struct mmal_msg_header) != 24);
--
-- /* ensure message structure does not exceed maximum length */
-- BUILD_BUG_ON(sizeof(struct mmal_msg) > MMAL_MSG_MAX_SIZE);
--
-- /* mmal port struct is correct size */
-- BUILD_BUG_ON(sizeof(struct mmal_port) != 64);
--
-- /* create a vchi instance */
-- status = vchi_initialise(&vchi_instance);
-- if (status) {
-- pr_err("Failed to initialise VCHI instance (status=%d)\n",
-- status);
-- return -EIO;
-- }
--
-- status = vchi_connect(NULL, 0, vchi_instance);
-- if (status) {
-- pr_err("Failed to connect VCHI instance (status=%d)\n", status);
-- return -EIO;
-- }
--
-- instance = kzalloc(sizeof(*instance), GFP_KERNEL);
--
-- if (!instance)
-- return -ENOMEM;
--
-- mutex_init(&instance->vchiq_mutex);
--
-- instance->bulk_scratch = vmalloc(PAGE_SIZE);
--
-- mutex_init(&instance->context_map_lock);
-- idr_init_base(&instance->context_map, 1);
--
-- params.callback_param = instance;
--
-- instance->bulk_wq = alloc_ordered_workqueue("mmal-vchiq",
-- WQ_MEM_RECLAIM);
-- if (!instance->bulk_wq)
-- goto err_free;
--
-- status = vchi_service_open(vchi_instance, &params, &instance->handle);
-- if (status) {
-- pr_err("Failed to open VCHI service connection (status=%d)\n",
-- status);
-- goto err_close_services;
-- }
--
-- vchi_service_release(instance->handle);
--
-- *out_instance = instance;
--
-- return 0;
--
--err_close_services:
-- vchi_service_close(instance->handle);
-- destroy_workqueue(instance->bulk_wq);
--err_free:
-- vfree(instance->bulk_scratch);
-- kfree(instance);
-- return -ENODEV;
--}
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
-@@ -0,0 +1,1921 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ *
-+ * V4L2 driver MMAL vchiq interface code
-+ */
-+
-+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-+
-+#include <linux/errno.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/mutex.h>
-+#include <linux/mm.h>
-+#include <linux/slab.h>
-+#include <linux/completion.h>
-+#include <linux/vmalloc.h>
-+#include <asm/cacheflush.h>
-+#include <media/videobuf2-vmalloc.h>
-+
-+#include "mmal-common.h"
-+#include "mmal-vchiq.h"
-+#include "mmal-msg.h"
-+
-+#define USE_VCHIQ_ARM
-+#include "interface/vchi/vchi.h"
-+
-+MODULE_DESCRIPTION("BCM2835 MMAL VCHIQ interface");
-+MODULE_AUTHOR("Dave Stevenson, <dave.stevenson@raspberrypi.org>");
-+MODULE_LICENSE("GPL");
-+MODULE_VERSION("0.0.1");
-+
-+/* maximum number of components supported */
-+#define VCHIQ_MMAL_MAX_COMPONENTS 4
-+
-+/*#define FULL_MSG_DUMP 1*/
-+
-+#ifdef DEBUG
-+static const char *const msg_type_names[] = {
-+ "UNKNOWN",
-+ "QUIT",
-+ "SERVICE_CLOSED",
-+ "GET_VERSION",
-+ "COMPONENT_CREATE",
-+ "COMPONENT_DESTROY",
-+ "COMPONENT_ENABLE",
-+ "COMPONENT_DISABLE",
-+ "PORT_INFO_GET",
-+ "PORT_INFO_SET",
-+ "PORT_ACTION",
-+ "BUFFER_FROM_HOST",
-+ "BUFFER_TO_HOST",
-+ "GET_STATS",
-+ "PORT_PARAMETER_SET",
-+ "PORT_PARAMETER_GET",
-+ "EVENT_TO_HOST",
-+ "GET_CORE_STATS_FOR_PORT",
-+ "OPAQUE_ALLOCATOR",
-+ "CONSUME_MEM",
-+ "LMK",
-+ "OPAQUE_ALLOCATOR_DESC",
-+ "DRM_GET_LHS32",
-+ "DRM_GET_TIME",
-+ "BUFFER_FROM_HOST_ZEROLEN",
-+ "PORT_FLUSH",
-+ "HOST_LOG",
-+};
-+#endif
-+
-+static const char *const port_action_type_names[] = {
-+ "UNKNOWN",
-+ "ENABLE",
-+ "DISABLE",
-+ "FLUSH",
-+ "CONNECT",
-+ "DISCONNECT",
-+ "SET_REQUIREMENTS",
-+};
-+
-+#if defined(DEBUG)
-+#if defined(FULL_MSG_DUMP)
-+#define DBG_DUMP_MSG(MSG, MSG_LEN, TITLE) \
-+ do { \
-+ pr_debug(TITLE" type:%s(%d) length:%d\n", \
-+ msg_type_names[(MSG)->h.type], \
-+ (MSG)->h.type, (MSG_LEN)); \
-+ print_hex_dump(KERN_DEBUG, "<<h: ", DUMP_PREFIX_OFFSET, \
-+ 16, 4, (MSG), \
-+ sizeof(struct mmal_msg_header), 1); \
-+ print_hex_dump(KERN_DEBUG, "<<p: ", DUMP_PREFIX_OFFSET, \
-+ 16, 4, \
-+ ((u8 *)(MSG)) + sizeof(struct mmal_msg_header),\
-+ (MSG_LEN) - sizeof(struct mmal_msg_header), 1); \
-+ } while (0)
-+#else
-+#define DBG_DUMP_MSG(MSG, MSG_LEN, TITLE) \
-+ { \
-+ pr_debug(TITLE" type:%s(%d) length:%d\n", \
-+ msg_type_names[(MSG)->h.type], \
-+ (MSG)->h.type, (MSG_LEN)); \
-+ }
-+#endif
-+#else
-+#define DBG_DUMP_MSG(MSG, MSG_LEN, TITLE)
-+#endif
-+
-+struct vchiq_mmal_instance;
-+
-+/* normal message context */
-+struct mmal_msg_context {
-+ struct vchiq_mmal_instance *instance;
-+
-+ /* Index in the context_map idr so that we can find the
-+ * mmal_msg_context again when servicing the VCHI reply.
-+ */
-+ int handle;
-+
-+ union {
-+ struct {
-+ /* work struct for buffer_cb callback */
-+ struct work_struct work;
-+ /* work struct for deferred callback */
-+ struct work_struct buffer_to_host_work;
-+ /* mmal instance */
-+ struct vchiq_mmal_instance *instance;
-+ /* mmal port */
-+ struct vchiq_mmal_port *port;
-+ /* actual buffer used to store bulk reply */
-+ struct mmal_buffer *buffer;
-+ /* amount of buffer used */
-+ unsigned long buffer_used;
-+ /* MMAL buffer flags */
-+ u32 mmal_flags;
-+ /* Presentation and Decode timestamps */
-+ s64 pts;
-+ s64 dts;
-+
-+ int status; /* context status */
-+
-+ } bulk; /* bulk data */
-+
-+ struct {
-+ /* message handle to release */
-+ VCHI_HELD_MSG_T msg_handle;
-+ /* pointer to received message */
-+ struct mmal_msg *msg;
-+ /* received message length */
-+ u32 msg_len;
-+ /* completion upon reply */
-+ struct completion cmplt;
-+ } sync; /* synchronous response */
-+ } u;
-+
-+};
-+
-+struct vchiq_mmal_instance {
-+ VCHI_SERVICE_HANDLE_T handle;
-+
-+ /* ensure serialised access to service */
-+ struct mutex vchiq_mutex;
-+
-+ /* vmalloc page to receive scratch bulk xfers into */
-+ void *bulk_scratch;
-+
-+ struct idr context_map;
-+ /* protect accesses to context_map */
-+ struct mutex context_map_lock;
-+
-+ /* component to use next */
-+ int component_idx;
-+ struct vchiq_mmal_component component[VCHIQ_MMAL_MAX_COMPONENTS];
-+
-+ /* ordered workqueue to process all bulk operations */
-+ struct workqueue_struct *bulk_wq;
-+};
-+
-+static struct mmal_msg_context *
-+get_msg_context(struct vchiq_mmal_instance *instance)
-+{
-+ struct mmal_msg_context *msg_context;
-+ int handle;
-+
-+ /* todo: should this be allocated from a pool to avoid kzalloc */
-+ msg_context = kzalloc(sizeof(*msg_context), GFP_KERNEL);
-+
-+ if (!msg_context)
-+ return ERR_PTR(-ENOMEM);
-+
-+ /* Create an ID that will be passed along with our message so
-+ * that when we service the VCHI reply, we can look up what
-+ * message is being replied to.
-+ */
-+ mutex_lock(&instance->context_map_lock);
-+ handle = idr_alloc(&instance->context_map, msg_context,
-+ 0, 0, GFP_KERNEL);
-+ mutex_unlock(&instance->context_map_lock);
-+
-+ if (handle < 0) {
-+ kfree(msg_context);
-+ return ERR_PTR(handle);
-+ }
-+
-+ msg_context->instance = instance;
-+ msg_context->handle = handle;
-+
-+ return msg_context;
-+}
-+
-+static struct mmal_msg_context *
-+lookup_msg_context(struct vchiq_mmal_instance *instance, int handle)
-+{
-+ return idr_find(&instance->context_map, handle);
-+}
-+
-+static void
-+release_msg_context(struct mmal_msg_context *msg_context)
-+{
-+ struct vchiq_mmal_instance *instance = msg_context->instance;
-+
-+ mutex_lock(&instance->context_map_lock);
-+ idr_remove(&instance->context_map, msg_context->handle);
-+ mutex_unlock(&instance->context_map_lock);
-+ kfree(msg_context);
-+}
-+
-+/* deals with receipt of event to host message */
-+static void event_to_host_cb(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg *msg, u32 msg_len)
-+{
-+ pr_debug("unhandled event\n");
-+ pr_debug("component:%u port type:%d num:%d cmd:0x%x length:%d\n",
-+ msg->u.event_to_host.client_component,
-+ msg->u.event_to_host.port_type,
-+ msg->u.event_to_host.port_num,
-+ msg->u.event_to_host.cmd, msg->u.event_to_host.length);
-+}
-+
-+/* workqueue scheduled callback
-+ *
-+ * we do this because it is important we do not call any other vchiq
-+ * sync calls from witin the message delivery thread
-+ */
-+static void buffer_work_cb(struct work_struct *work)
-+{
-+ struct mmal_msg_context *msg_context =
-+ container_of(work, struct mmal_msg_context, u.bulk.work);
-+
-+ 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);
-+}
-+
-+/* workqueue scheduled callback to handle receiving buffers
-+ *
-+ * VCHI will allow up to 4 bulk receives to be scheduled before blocking.
-+ * If we block in the service_callback context then we can't process the
-+ * VCHI_CALLBACK_BULK_RECEIVED message that would otherwise allow the blocked
-+ * vchi_bulk_queue_receive() call to complete.
-+ */
-+static void buffer_to_host_work_cb(struct work_struct *work)
-+{
-+ struct mmal_msg_context *msg_context =
-+ container_of(work, struct mmal_msg_context,
-+ u.bulk.buffer_to_host_work);
-+ struct vchiq_mmal_instance *instance = msg_context->instance;
-+ unsigned long len = msg_context->u.bulk.buffer_used;
-+ int ret;
-+
-+ if (!len)
-+ /* Dummy receive to ensure the buffers remain in order */
-+ len = 8;
-+ /* queue the bulk submission */
-+ vchi_service_use(instance->handle);
-+ ret = vchi_bulk_queue_receive(instance->handle,
-+ msg_context->u.bulk.buffer->buffer,
-+ /* Actual receive needs to be a multiple
-+ * of 4 bytes
-+ */
-+ (len + 3) & ~3,
-+ VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE |
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED,
-+ msg_context);
-+
-+ vchi_service_release(instance->handle);
-+
-+ if (ret != 0)
-+ pr_err("%s: ctx: %p, vchi_bulk_queue_receive failed %d\n",
-+ __func__, msg_context, ret);
-+}
-+
-+/* enqueue a bulk receive for a given message context */
-+static int bulk_receive(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg *msg,
-+ struct mmal_msg_context *msg_context)
-+{
-+ unsigned long rd_len;
-+
-+ rd_len = msg->u.buffer_from_host.buffer_header.length;
-+
-+ if (!msg_context->u.bulk.buffer) {
-+ pr_err("bulk.buffer not configured - error in buffer_from_host\n");
-+
-+ /* todo: this is a serious error, we should never have
-+ * committed a buffer_to_host operation to the mmal
-+ * port without the buffer to back it up (underflow
-+ * handling) and there is no obvious way to deal with
-+ * this - how is the mmal servie going to react when
-+ * we fail to do the xfer and reschedule a buffer when
-+ * it arrives? perhaps a starved flag to indicate a
-+ * waiting bulk receive?
-+ */
-+
-+ return -EINVAL;
-+ }
-+
-+ /* ensure we do not overrun the available buffer */
-+ if (rd_len > msg_context->u.bulk.buffer->buffer_size) {
-+ rd_len = msg_context->u.bulk.buffer->buffer_size;
-+ pr_warn("short read as not enough receive buffer space\n");
-+ /* todo: is this the correct response, what happens to
-+ * the rest of the message data?
-+ */
-+ }
-+
-+ /* store length */
-+ msg_context->u.bulk.buffer_used = rd_len;
-+ msg_context->u.bulk.dts = msg->u.buffer_from_host.buffer_header.dts;
-+ msg_context->u.bulk.pts = msg->u.buffer_from_host.buffer_header.pts;
-+
-+ queue_work(msg_context->instance->bulk_wq,
-+ &msg_context->u.bulk.buffer_to_host_work);
-+
-+ return 0;
-+}
-+
-+/* data in message, memcpy from packet into output buffer */
-+static int inline_receive(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg *msg,
-+ struct mmal_msg_context *msg_context)
-+{
-+ memcpy(msg_context->u.bulk.buffer->buffer,
-+ msg->u.buffer_from_host.short_data,
-+ msg->u.buffer_from_host.payload_in_message);
-+
-+ msg_context->u.bulk.buffer_used =
-+ msg->u.buffer_from_host.payload_in_message;
-+
-+ return 0;
-+}
-+
-+/* queue the buffer availability with MMAL_MSG_TYPE_BUFFER_FROM_HOST */
-+static int
-+buffer_from_host(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port, struct mmal_buffer *buf)
-+{
-+ struct mmal_msg_context *msg_context;
-+ struct mmal_msg m;
-+ int ret;
-+
-+ if (!port->enabled)
-+ return -EINVAL;
-+
-+ pr_debug("instance:%p buffer:%p\n", instance->handle, buf);
-+
-+ /* get context */
-+ if (!buf->msg_context) {
-+ pr_err("%s: msg_context not allocated, buf %p\n", __func__,
-+ buf);
-+ return -EINVAL;
-+ }
-+ msg_context = buf->msg_context;
-+
-+ /* store bulk message context for when data arrives */
-+ msg_context->u.bulk.instance = instance;
-+ msg_context->u.bulk.port = port;
-+ msg_context->u.bulk.buffer = buf;
-+ msg_context->u.bulk.buffer_used = 0;
-+
-+ /* initialise work structure ready to schedule callback */
-+ INIT_WORK(&msg_context->u.bulk.work, buffer_work_cb);
-+ INIT_WORK(&msg_context->u.bulk.buffer_to_host_work,
-+ buffer_to_host_work_cb);
-+
-+ atomic_inc(&port->buffers_with_vpu);
-+
-+ /* prep the buffer from host message */
-+ memset(&m, 0xbc, sizeof(m)); /* just to make debug clearer */
-+
-+ m.h.type = MMAL_MSG_TYPE_BUFFER_FROM_HOST;
-+ m.h.magic = MMAL_MAGIC;
-+ m.h.context = msg_context->handle;
-+ m.h.status = 0;
-+
-+ /* drvbuf is our private data passed back */
-+ m.u.buffer_from_host.drvbuf.magic = MMAL_MAGIC;
-+ m.u.buffer_from_host.drvbuf.component_handle = port->component->handle;
-+ m.u.buffer_from_host.drvbuf.port_handle = port->handle;
-+ m.u.buffer_from_host.drvbuf.client_context = msg_context->handle;
-+
-+ /* buffer header */
-+ m.u.buffer_from_host.buffer_header.cmd = 0;
-+ m.u.buffer_from_host.buffer_header.data =
-+ (u32)(unsigned long)buf->buffer;
-+ m.u.buffer_from_host.buffer_header.alloc_size = buf->buffer_size;
-+ m.u.buffer_from_host.buffer_header.length = 0; /* nothing used yet */
-+ m.u.buffer_from_host.buffer_header.offset = 0; /* no offset */
-+ m.u.buffer_from_host.buffer_header.flags = 0; /* no flags */
-+ m.u.buffer_from_host.buffer_header.pts = MMAL_TIME_UNKNOWN;
-+ m.u.buffer_from_host.buffer_header.dts = MMAL_TIME_UNKNOWN;
-+
-+ /* clear buffer type sepecific data */
-+ memset(&m.u.buffer_from_host.buffer_header_type_specific, 0,
-+ sizeof(m.u.buffer_from_host.buffer_header_type_specific));
-+
-+ /* no payload in message */
-+ m.u.buffer_from_host.payload_in_message = 0;
-+
-+ vchi_service_use(instance->handle);
-+
-+ ret = vchi_queue_kernel_message(instance->handle,
-+ &m,
-+ sizeof(struct mmal_msg_header) +
-+ sizeof(m.u.buffer_from_host));
-+
-+ vchi_service_release(instance->handle);
-+
-+ return ret;
-+}
-+
-+/* deals with receipt of buffer to host message */
-+static void buffer_to_host_cb(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg *msg, u32 msg_len)
-+{
-+ struct mmal_msg_context *msg_context;
-+ u32 handle;
-+
-+ pr_debug("%s: instance:%p msg:%p msg_len:%d\n",
-+ __func__, instance, msg, msg_len);
-+
-+ if (msg->u.buffer_from_host.drvbuf.magic == MMAL_MAGIC) {
-+ handle = msg->u.buffer_from_host.drvbuf.client_context;
-+ msg_context = lookup_msg_context(instance, handle);
-+
-+ if (!msg_context) {
-+ pr_err("drvbuf.client_context(%u) is invalid\n",
-+ handle);
-+ return;
-+ }
-+ } else {
-+ pr_err("MMAL_MSG_TYPE_BUFFER_TO_HOST with bad magic\n");
-+ return;
-+ }
-+
-+ msg_context->u.bulk.mmal_flags =
-+ msg->u.buffer_from_host.buffer_header.flags;
-+
-+ if (msg->h.status != MMAL_MSG_STATUS_SUCCESS) {
-+ /* message reception had an error */
-+ pr_warn("error %d in reply\n", msg->h.status);
-+
-+ msg_context->u.bulk.status = msg->h.status;
-+
-+ } else if (msg->u.buffer_from_host.buffer_header.length == 0) {
-+ /* empty buffer */
-+ if (msg->u.buffer_from_host.buffer_header.flags &
-+ MMAL_BUFFER_HEADER_FLAG_EOS) {
-+ msg_context->u.bulk.status =
-+ bulk_receive(instance, msg, msg_context);
-+ if (msg_context->u.bulk.status == 0)
-+ return; /* successful bulk submission, bulk
-+ * completion will trigger callback
-+ */
-+ } else {
-+ /* do callback with empty buffer - not EOS though */
-+ msg_context->u.bulk.status = 0;
-+ msg_context->u.bulk.buffer_used = 0;
-+ }
-+ } else if (msg->u.buffer_from_host.payload_in_message == 0) {
-+ /* data is not in message, queue a bulk receive */
-+ msg_context->u.bulk.status =
-+ bulk_receive(instance, msg, msg_context);
-+ if (msg_context->u.bulk.status == 0)
-+ return; /* successful bulk submission, bulk
-+ * completion will trigger callback
-+ */
-+
-+ /* failed to submit buffer, this will end badly */
-+ pr_err("error %d on bulk submission\n",
-+ msg_context->u.bulk.status);
-+
-+ } else if (msg->u.buffer_from_host.payload_in_message <=
-+ MMAL_VC_SHORT_DATA) {
-+ /* data payload within message */
-+ msg_context->u.bulk.status = inline_receive(instance, msg,
-+ msg_context);
-+ } else {
-+ pr_err("message with invalid short payload\n");
-+
-+ /* signal error */
-+ msg_context->u.bulk.status = -EINVAL;
-+ msg_context->u.bulk.buffer_used =
-+ msg->u.buffer_from_host.payload_in_message;
-+ }
-+
-+ /* schedule the port callback */
-+ schedule_work(&msg_context->u.bulk.work);
-+}
-+
-+static void bulk_receive_cb(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg_context *msg_context)
-+{
-+ msg_context->u.bulk.status = 0;
-+
-+ /* schedule the port callback */
-+ schedule_work(&msg_context->u.bulk.work);
-+}
-+
-+static void bulk_abort_cb(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg_context *msg_context)
-+{
-+ pr_err("%s: bulk ABORTED msg_context:%p\n", __func__, msg_context);
-+
-+ msg_context->u.bulk.status = -EINTR;
-+
-+ schedule_work(&msg_context->u.bulk.work);
-+}
-+
-+/* incoming event service callback */
-+static void service_callback(void *param,
-+ const VCHI_CALLBACK_REASON_T reason,
-+ void *bulk_ctx)
-+{
-+ struct vchiq_mmal_instance *instance = param;
-+ int status;
-+ u32 msg_len;
-+ struct mmal_msg *msg;
-+ VCHI_HELD_MSG_T msg_handle;
-+ struct mmal_msg_context *msg_context;
-+
-+ if (!instance) {
-+ pr_err("Message callback passed NULL instance\n");
-+ return;
-+ }
-+
-+ switch (reason) {
-+ case VCHI_CALLBACK_MSG_AVAILABLE:
-+ status = vchi_msg_hold(instance->handle, (void **)&msg,
-+ &msg_len, VCHI_FLAGS_NONE, &msg_handle);
-+ if (status) {
-+ pr_err("Unable to dequeue a message (%d)\n", status);
-+ break;
-+ }
-+
-+ DBG_DUMP_MSG(msg, msg_len, "<<< reply message");
-+
-+ /* handling is different for buffer messages */
-+ switch (msg->h.type) {
-+ case MMAL_MSG_TYPE_BUFFER_FROM_HOST:
-+ vchi_held_msg_release(&msg_handle);
-+ break;
-+
-+ case MMAL_MSG_TYPE_EVENT_TO_HOST:
-+ event_to_host_cb(instance, msg, msg_len);
-+ vchi_held_msg_release(&msg_handle);
-+
-+ break;
-+
-+ case MMAL_MSG_TYPE_BUFFER_TO_HOST:
-+ buffer_to_host_cb(instance, msg, msg_len);
-+ vchi_held_msg_release(&msg_handle);
-+ break;
-+
-+ default:
-+ /* messages dependent on header context to complete */
-+ if (!msg->h.context) {
-+ pr_err("received message context was null!\n");
-+ vchi_held_msg_release(&msg_handle);
-+ break;
-+ }
-+
-+ msg_context = lookup_msg_context(instance,
-+ msg->h.context);
-+ if (!msg_context) {
-+ pr_err("received invalid message context %u!\n",
-+ msg->h.context);
-+ vchi_held_msg_release(&msg_handle);
-+ break;
-+ }
-+
-+ /* fill in context values */
-+ msg_context->u.sync.msg_handle = msg_handle;
-+ msg_context->u.sync.msg = msg;
-+ msg_context->u.sync.msg_len = msg_len;
-+
-+ /* todo: should this check (completion_done()
-+ * == 1) for no one waiting? or do we need a
-+ * flag to tell us the completion has been
-+ * interrupted so we can free the message and
-+ * its context. This probably also solves the
-+ * message arriving after interruption todo
-+ * below
-+ */
-+
-+ /* complete message so caller knows it happened */
-+ complete(&msg_context->u.sync.cmplt);
-+ break;
-+ }
-+
-+ break;
-+
-+ case VCHI_CALLBACK_BULK_RECEIVED:
-+ bulk_receive_cb(instance, bulk_ctx);
-+ break;
-+
-+ case VCHI_CALLBACK_BULK_RECEIVE_ABORTED:
-+ bulk_abort_cb(instance, bulk_ctx);
-+ break;
-+
-+ case VCHI_CALLBACK_SERVICE_CLOSED:
-+ /* TODO: consider if this requires action if received when
-+ * driver is not explicitly closing the service
-+ */
-+ break;
-+
-+ default:
-+ pr_err("Received unhandled message reason %d\n", reason);
-+ break;
-+ }
-+}
-+
-+static int send_synchronous_mmal_msg(struct vchiq_mmal_instance *instance,
-+ struct mmal_msg *msg,
-+ unsigned int payload_len,
-+ struct mmal_msg **msg_out,
-+ VCHI_HELD_MSG_T *msg_handle_out)
-+{
-+ struct mmal_msg_context *msg_context;
-+ int ret;
-+ unsigned long timeout;
-+
-+ /* payload size must not cause message to exceed max size */
-+ if (payload_len >
-+ (MMAL_MSG_MAX_SIZE - sizeof(struct mmal_msg_header))) {
-+ pr_err("payload length %d exceeds max:%d\n", payload_len,
-+ (int)(MMAL_MSG_MAX_SIZE -
-+ sizeof(struct mmal_msg_header)));
-+ return -EINVAL;
-+ }
-+
-+ msg_context = get_msg_context(instance);
-+ if (IS_ERR(msg_context))
-+ return PTR_ERR(msg_context);
-+
-+ init_completion(&msg_context->u.sync.cmplt);
-+
-+ msg->h.magic = MMAL_MAGIC;
-+ msg->h.context = msg_context->handle;
-+ msg->h.status = 0;
-+
-+ DBG_DUMP_MSG(msg, (sizeof(struct mmal_msg_header) + payload_len),
-+ ">>> sync message");
-+
-+ vchi_service_use(instance->handle);
-+
-+ ret = vchi_queue_kernel_message(instance->handle,
-+ msg,
-+ sizeof(struct mmal_msg_header) +
-+ payload_len);
-+
-+ vchi_service_release(instance->handle);
-+
-+ if (ret) {
-+ pr_err("error %d queuing message\n", ret);
-+ release_msg_context(msg_context);
-+ return ret;
-+ }
-+
-+ timeout = wait_for_completion_timeout(&msg_context->u.sync.cmplt,
-+ 3 * HZ);
-+ if (timeout == 0) {
-+ pr_err("timed out waiting for sync completion\n");
-+ ret = -ETIME;
-+ /* todo: what happens if the message arrives after aborting */
-+ release_msg_context(msg_context);
-+ return ret;
-+ }
-+
-+ *msg_out = msg_context->u.sync.msg;
-+ *msg_handle_out = msg_context->u.sync.msg_handle;
-+ release_msg_context(msg_context);
-+
-+ return 0;
-+}
-+
-+static void dump_port_info(struct vchiq_mmal_port *port)
-+{
-+ pr_debug("port handle:0x%x enabled:%d\n", port->handle, port->enabled);
-+
-+ pr_debug("buffer minimum num:%d size:%d align:%d\n",
-+ port->minimum_buffer.num,
-+ port->minimum_buffer.size, port->minimum_buffer.alignment);
-+
-+ pr_debug("buffer recommended num:%d size:%d align:%d\n",
-+ port->recommended_buffer.num,
-+ port->recommended_buffer.size,
-+ port->recommended_buffer.alignment);
-+
-+ pr_debug("buffer current values num:%d size:%d align:%d\n",
-+ port->current_buffer.num,
-+ port->current_buffer.size, port->current_buffer.alignment);
-+
-+ pr_debug("elementary stream: type:%d encoding:0x%x variant:0x%x\n",
-+ port->format.type,
-+ port->format.encoding, port->format.encoding_variant);
-+
-+ pr_debug(" bitrate:%d flags:0x%x\n",
-+ port->format.bitrate, port->format.flags);
-+
-+ if (port->format.type == MMAL_ES_TYPE_VIDEO) {
-+ pr_debug
-+ ("es video format: width:%d height:%d colourspace:0x%x\n",
-+ port->es.video.width, port->es.video.height,
-+ port->es.video.color_space);
-+
-+ pr_debug(" : crop xywh %d,%d,%d,%d\n",
-+ port->es.video.crop.x,
-+ port->es.video.crop.y,
-+ port->es.video.crop.width, port->es.video.crop.height);
-+ pr_debug(" : framerate %d/%d aspect %d/%d\n",
-+ port->es.video.frame_rate.num,
-+ port->es.video.frame_rate.den,
-+ port->es.video.par.num, port->es.video.par.den);
-+ }
-+}
-+
-+static void port_to_mmal_msg(struct vchiq_mmal_port *port, struct mmal_port *p)
-+{
-+ /* todo do readonly fields need setting at all? */
-+ p->type = port->type;
-+ p->index = port->index;
-+ p->index_all = 0;
-+ p->is_enabled = port->enabled;
-+ p->buffer_num_min = port->minimum_buffer.num;
-+ p->buffer_size_min = port->minimum_buffer.size;
-+ p->buffer_alignment_min = port->minimum_buffer.alignment;
-+ p->buffer_num_recommended = port->recommended_buffer.num;
-+ p->buffer_size_recommended = port->recommended_buffer.size;
-+
-+ /* only three writable fields in a port */
-+ p->buffer_num = port->current_buffer.num;
-+ p->buffer_size = port->current_buffer.size;
-+ p->userdata = (u32)(unsigned long)port;
-+}
-+
-+static int port_info_set(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ pr_debug("setting port info port %p\n", port);
-+ if (!port)
-+ return -1;
-+ dump_port_info(port);
-+
-+ m.h.type = MMAL_MSG_TYPE_PORT_INFO_SET;
-+
-+ m.u.port_info_set.component_handle = port->component->handle;
-+ m.u.port_info_set.port_type = port->type;
-+ m.u.port_info_set.port_index = port->index;
-+
-+ port_to_mmal_msg(port, &m.u.port_info_set.port);
-+
-+ /* elementary stream format setup */
-+ m.u.port_info_set.format.type = port->format.type;
-+ m.u.port_info_set.format.encoding = port->format.encoding;
-+ m.u.port_info_set.format.encoding_variant =
-+ port->format.encoding_variant;
-+ m.u.port_info_set.format.bitrate = port->format.bitrate;
-+ m.u.port_info_set.format.flags = port->format.flags;
-+
-+ memcpy(&m.u.port_info_set.es, &port->es,
-+ sizeof(union mmal_es_specific_format));
-+
-+ m.u.port_info_set.format.extradata_size = port->format.extradata_size;
-+ memcpy(&m.u.port_info_set.extradata, port->format.extradata,
-+ port->format.extradata_size);
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.port_info_set),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != MMAL_MSG_TYPE_PORT_INFO_SET) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ /* return operation status */
-+ ret = -rmsg->u.port_info_get_reply.status;
-+
-+ pr_debug("%s:result:%d component:0x%x port:%d\n", __func__, ret,
-+ port->component->handle, port->handle);
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* use port info get message to retrieve port information */
-+static int port_info_get(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ /* port info time */
-+ m.h.type = MMAL_MSG_TYPE_PORT_INFO_GET;
-+ m.u.port_info_get.component_handle = port->component->handle;
-+ m.u.port_info_get.port_type = port->type;
-+ m.u.port_info_get.index = port->index;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.port_info_get),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != MMAL_MSG_TYPE_PORT_INFO_GET) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ /* return operation status */
-+ ret = -rmsg->u.port_info_get_reply.status;
-+ if (ret != MMAL_MSG_STATUS_SUCCESS)
-+ goto release_msg;
-+
-+ if (rmsg->u.port_info_get_reply.port.is_enabled == 0)
-+ port->enabled = false;
-+ else
-+ port->enabled = true;
-+
-+ /* copy the values out of the message */
-+ port->handle = rmsg->u.port_info_get_reply.port_handle;
-+
-+ /* port type and index cached to use on port info set because
-+ * it does not use a port handle
-+ */
-+ port->type = rmsg->u.port_info_get_reply.port_type;
-+ port->index = rmsg->u.port_info_get_reply.port_index;
-+
-+ port->minimum_buffer.num =
-+ rmsg->u.port_info_get_reply.port.buffer_num_min;
-+ port->minimum_buffer.size =
-+ rmsg->u.port_info_get_reply.port.buffer_size_min;
-+ port->minimum_buffer.alignment =
-+ rmsg->u.port_info_get_reply.port.buffer_alignment_min;
-+
-+ port->recommended_buffer.alignment =
-+ rmsg->u.port_info_get_reply.port.buffer_alignment_min;
-+ port->recommended_buffer.num =
-+ rmsg->u.port_info_get_reply.port.buffer_num_recommended;
-+
-+ port->current_buffer.num = rmsg->u.port_info_get_reply.port.buffer_num;
-+ port->current_buffer.size =
-+ rmsg->u.port_info_get_reply.port.buffer_size;
-+
-+ /* stream format */
-+ port->format.type = rmsg->u.port_info_get_reply.format.type;
-+ port->format.encoding = rmsg->u.port_info_get_reply.format.encoding;
-+ port->format.encoding_variant =
-+ rmsg->u.port_info_get_reply.format.encoding_variant;
-+ port->format.bitrate = rmsg->u.port_info_get_reply.format.bitrate;
-+ port->format.flags = rmsg->u.port_info_get_reply.format.flags;
-+
-+ /* elementary stream format */
-+ memcpy(&port->es,
-+ &rmsg->u.port_info_get_reply.es,
-+ sizeof(union mmal_es_specific_format));
-+ port->format.es = &port->es;
-+
-+ port->format.extradata_size =
-+ rmsg->u.port_info_get_reply.format.extradata_size;
-+ memcpy(port->format.extradata,
-+ rmsg->u.port_info_get_reply.extradata,
-+ port->format.extradata_size);
-+
-+ pr_debug("received port info\n");
-+ dump_port_info(port);
-+
-+release_msg:
-+
-+ pr_debug("%s:result:%d component:0x%x port:%d\n",
-+ __func__, ret, port->component->handle, port->handle);
-+
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* create comonent on vc */
-+static int create_component(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component,
-+ const char *name)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ /* build component create message */
-+ m.h.type = MMAL_MSG_TYPE_COMPONENT_CREATE;
-+ m.u.component_create.client_component = (u32)(unsigned long)component;
-+ strncpy(m.u.component_create.name, name,
-+ sizeof(m.u.component_create.name));
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.component_create),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != m.h.type) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.component_create_reply.status;
-+ if (ret != MMAL_MSG_STATUS_SUCCESS)
-+ goto release_msg;
-+
-+ /* a valid component response received */
-+ component->handle = rmsg->u.component_create_reply.component_handle;
-+ component->inputs = rmsg->u.component_create_reply.input_num;
-+ component->outputs = rmsg->u.component_create_reply.output_num;
-+ component->clocks = rmsg->u.component_create_reply.clock_num;
-+
-+ pr_debug("Component handle:0x%x in:%d out:%d clock:%d\n",
-+ component->handle,
-+ component->inputs, component->outputs, component->clocks);
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* destroys a component on vc */
-+static int destroy_component(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_COMPONENT_DESTROY;
-+ m.u.component_destroy.component_handle = component->handle;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.component_destroy),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != m.h.type) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.component_destroy_reply.status;
-+
-+release_msg:
-+
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* enable a component on vc */
-+static int enable_component(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_COMPONENT_ENABLE;
-+ m.u.component_enable.component_handle = component->handle;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.component_enable),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != m.h.type) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.component_enable_reply.status;
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* disable a component on vc */
-+static int disable_component(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_COMPONENT_DISABLE;
-+ m.u.component_disable.component_handle = component->handle;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.component_disable),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != m.h.type) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.component_disable_reply.status;
-+
-+release_msg:
-+
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* get version of mmal implementation */
-+static int get_version(struct vchiq_mmal_instance *instance,
-+ u32 *major_out, u32 *minor_out)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_GET_VERSION;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.version),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != m.h.type) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ *major_out = rmsg->u.version.major;
-+ *minor_out = rmsg->u.version.minor;
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* do a port action with a port as a parameter */
-+static int port_action_port(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ enum mmal_msg_port_action_type action_type)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_PORT_ACTION;
-+ m.u.port_action_port.component_handle = port->component->handle;
-+ m.u.port_action_port.port_handle = port->handle;
-+ m.u.port_action_port.action = action_type;
-+
-+ port_to_mmal_msg(port, &m.u.port_action_port.port);
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.port_action_port),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != MMAL_MSG_TYPE_PORT_ACTION) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.port_action_reply.status;
-+
-+ pr_debug("%s:result:%d component:0x%x port:%d action:%s(%d)\n",
-+ __func__,
-+ ret, port->component->handle, port->handle,
-+ port_action_type_names[action_type], action_type);
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* do a port action with handles as parameters */
-+static int port_action_handle(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ enum mmal_msg_port_action_type action_type,
-+ u32 connect_component_handle,
-+ u32 connect_port_handle)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_PORT_ACTION;
-+
-+ m.u.port_action_handle.component_handle = port->component->handle;
-+ m.u.port_action_handle.port_handle = port->handle;
-+ m.u.port_action_handle.action = action_type;
-+
-+ m.u.port_action_handle.connect_component_handle =
-+ connect_component_handle;
-+ m.u.port_action_handle.connect_port_handle = connect_port_handle;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(m.u.port_action_handle),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != MMAL_MSG_TYPE_PORT_ACTION) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.port_action_reply.status;
-+
-+ pr_debug("%s:result:%d component:0x%x port:%d action:%s(%d) connect component:0x%x connect port:%d\n",
-+ __func__,
-+ ret, port->component->handle, port->handle,
-+ port_action_type_names[action_type],
-+ action_type, connect_component_handle, connect_port_handle);
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+static int port_parameter_set(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ u32 parameter_id, void *value, u32 value_size)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_PORT_PARAMETER_SET;
-+
-+ m.u.port_parameter_set.component_handle = port->component->handle;
-+ m.u.port_parameter_set.port_handle = port->handle;
-+ m.u.port_parameter_set.id = parameter_id;
-+ m.u.port_parameter_set.size = (2 * sizeof(u32)) + value_size;
-+ memcpy(&m.u.port_parameter_set.value, value, value_size);
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ (4 * sizeof(u32)) + value_size,
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != MMAL_MSG_TYPE_PORT_PARAMETER_SET) {
-+ /* got an unexpected message type in reply */
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.port_parameter_set_reply.status;
-+
-+ pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n",
-+ __func__,
-+ ret, port->component->handle, port->handle, parameter_id);
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+static int port_parameter_get(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ u32 parameter_id, void *value, u32 *value_size)
-+{
-+ int ret;
-+ struct mmal_msg m;
-+ struct mmal_msg *rmsg;
-+ VCHI_HELD_MSG_T rmsg_handle;
-+
-+ m.h.type = MMAL_MSG_TYPE_PORT_PARAMETER_GET;
-+
-+ m.u.port_parameter_get.component_handle = port->component->handle;
-+ m.u.port_parameter_get.port_handle = port->handle;
-+ m.u.port_parameter_get.id = parameter_id;
-+ m.u.port_parameter_get.size = (2 * sizeof(u32)) + *value_size;
-+
-+ ret = send_synchronous_mmal_msg(instance, &m,
-+ sizeof(struct
-+ mmal_msg_port_parameter_get),
-+ &rmsg, &rmsg_handle);
-+ if (ret)
-+ return ret;
-+
-+ if (rmsg->h.type != MMAL_MSG_TYPE_PORT_PARAMETER_GET) {
-+ /* got an unexpected message type in reply */
-+ pr_err("Incorrect reply type %d\n", rmsg->h.type);
-+ ret = -EINVAL;
-+ goto release_msg;
-+ }
-+
-+ ret = -rmsg->u.port_parameter_get_reply.status;
-+ /* port_parameter_get_reply.size includes the header,
-+ * whilst *value_size doesn't.
-+ */
-+ rmsg->u.port_parameter_get_reply.size -= (2 * sizeof(u32));
-+
-+ if (ret || rmsg->u.port_parameter_get_reply.size > *value_size) {
-+ /* Copy only as much as we have space for
-+ * but report true size of parameter
-+ */
-+ memcpy(value, &rmsg->u.port_parameter_get_reply.value,
-+ *value_size);
-+ *value_size = rmsg->u.port_parameter_get_reply.size;
-+ } else {
-+ memcpy(value, &rmsg->u.port_parameter_get_reply.value,
-+ rmsg->u.port_parameter_get_reply.size);
-+ }
-+
-+ pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__,
-+ ret, port->component->handle, port->handle, parameter_id);
-+
-+release_msg:
-+ vchi_held_msg_release(&rmsg_handle);
-+
-+ return ret;
-+}
-+
-+/* disables a port and drains buffers from it */
-+static int port_disable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port)
-+{
-+ int ret;
-+ struct list_head *q, *buf_head;
-+ unsigned long flags = 0;
-+
-+ if (!port->enabled)
-+ return 0;
-+
-+ port->enabled = false;
-+
-+ ret = port_action_port(instance, port,
-+ MMAL_MSG_PORT_ACTION_TYPE_DISABLE);
-+ if (ret == 0) {
-+ /*
-+ * Drain all queued buffers on port. This should only
-+ * apply to buffers that have been queued before the port
-+ * has been enabled. If the port has been enabled and buffers
-+ * passed, then the buffers should have been removed from this
-+ * list, and we should get the relevant callbacks via VCHIQ
-+ * to release the buffers.
-+ */
-+ spin_lock_irqsave(&port->slock, flags);
-+
-+ list_for_each_safe(buf_head, q, &port->buffers) {
-+ struct mmal_buffer *mmalbuf;
-+
-+ mmalbuf = list_entry(buf_head, struct mmal_buffer,
-+ list);
-+ list_del(buf_head);
-+ if (port->buffer_cb)
-+ port->buffer_cb(instance,
-+ port, 0, mmalbuf, 0, 0,
-+ MMAL_TIME_UNKNOWN,
-+ MMAL_TIME_UNKNOWN);
-+ }
-+
-+ spin_unlock_irqrestore(&port->slock, flags);
-+
-+ ret = port_info_get(instance, port);
-+ }
-+
-+ return ret;
-+}
-+
-+/* enable a port */
-+static int port_enable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port)
-+{
-+ unsigned int hdr_count;
-+ struct list_head *q, *buf_head;
-+ int ret;
-+
-+ if (port->enabled)
-+ return 0;
-+
-+ ret = port_action_port(instance, port,
-+ MMAL_MSG_PORT_ACTION_TYPE_ENABLE);
-+ if (ret)
-+ goto done;
-+
-+ port->enabled = true;
-+
-+ if (port->buffer_cb) {
-+ /* send buffer headers to videocore */
-+ hdr_count = 1;
-+ list_for_each_safe(buf_head, q, &port->buffers) {
-+ struct mmal_buffer *mmalbuf;
-+
-+ mmalbuf = list_entry(buf_head, struct mmal_buffer,
-+ list);
-+ ret = buffer_from_host(instance, port, mmalbuf);
-+ if (ret)
-+ goto done;
-+
-+ list_del(buf_head);
-+ hdr_count++;
-+ if (hdr_count > port->current_buffer.num)
-+ break;
-+ }
-+ }
-+
-+ ret = port_info_get(instance, port);
-+
-+done:
-+ return ret;
-+}
-+
-+/* ------------------------------------------------------------------
-+ * Exported API
-+ *------------------------------------------------------------------
-+ */
-+
-+int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ ret = port_info_set(instance, port);
-+ if (ret)
-+ goto release_unlock;
-+
-+ /* read what has actually been set */
-+ ret = port_info_get(instance, port);
-+
-+release_unlock:
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_port_set_format);
-+
-+int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ u32 parameter, void *value, u32 value_size)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ ret = port_parameter_set(instance, port, parameter, value, value_size);
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_port_parameter_set);
-+
-+int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ u32 parameter, void *value, u32 *value_size)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ ret = port_parameter_get(instance, port, parameter, value, value_size);
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_port_parameter_get);
-+
-+/* enable a port
-+ *
-+ * enables a port and queues buffers for satisfying callbacks if we
-+ * provide a callback handler
-+ */
-+int vchiq_mmal_port_enable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ vchiq_mmal_buffer_cb buffer_cb)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ /* already enabled - noop */
-+ if (port->enabled) {
-+ ret = 0;
-+ goto unlock;
-+ }
-+
-+ port->buffer_cb = buffer_cb;
-+
-+ ret = port_enable(instance, port);
-+
-+unlock:
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_port_enable);
-+
-+int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ if (!port->enabled) {
-+ mutex_unlock(&instance->vchiq_mutex);
-+ return 0;
-+ }
-+
-+ ret = port_disable(instance, port);
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_port_disable);
-+
-+/* ports will be connected in a tunneled manner so data buffers
-+ * are not handled by client.
-+ */
-+int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *src,
-+ struct vchiq_mmal_port *dst)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ /* disconnect ports if connected */
-+ if (src->connected) {
-+ ret = port_disable(instance, src);
-+ if (ret) {
-+ pr_err("failed disabling src port(%d)\n", ret);
-+ goto release_unlock;
-+ }
-+
-+ /* do not need to disable the destination port as they
-+ * are connected and it is done automatically
-+ */
-+
-+ ret = port_action_handle(instance, src,
-+ MMAL_MSG_PORT_ACTION_TYPE_DISCONNECT,
-+ src->connected->component->handle,
-+ src->connected->handle);
-+ if (ret < 0) {
-+ pr_err("failed disconnecting src port\n");
-+ goto release_unlock;
-+ }
-+ src->connected->enabled = false;
-+ src->connected = NULL;
-+ }
-+
-+ if (!dst) {
-+ /* do not make new connection */
-+ ret = 0;
-+ pr_debug("not making new connection\n");
-+ goto release_unlock;
-+ }
-+
-+ /* copy src port format to dst */
-+ dst->format.encoding = src->format.encoding;
-+ dst->es.video.width = src->es.video.width;
-+ dst->es.video.height = src->es.video.height;
-+ dst->es.video.crop.x = src->es.video.crop.x;
-+ dst->es.video.crop.y = src->es.video.crop.y;
-+ dst->es.video.crop.width = src->es.video.crop.width;
-+ dst->es.video.crop.height = src->es.video.crop.height;
-+ dst->es.video.frame_rate.num = src->es.video.frame_rate.num;
-+ dst->es.video.frame_rate.den = src->es.video.frame_rate.den;
-+
-+ /* set new format */
-+ ret = port_info_set(instance, dst);
-+ if (ret) {
-+ pr_debug("setting port info failed\n");
-+ goto release_unlock;
-+ }
-+
-+ /* read what has actually been set */
-+ ret = port_info_get(instance, dst);
-+ if (ret) {
-+ pr_debug("read back port info failed\n");
-+ goto release_unlock;
-+ }
-+
-+ /* connect two ports together */
-+ ret = port_action_handle(instance, src,
-+ MMAL_MSG_PORT_ACTION_TYPE_CONNECT,
-+ dst->component->handle, dst->handle);
-+ if (ret < 0) {
-+ pr_debug("connecting port %d:%d to %d:%d failed\n",
-+ src->component->handle, src->handle,
-+ dst->component->handle, dst->handle);
-+ goto release_unlock;
-+ }
-+ src->connected = dst;
-+
-+release_unlock:
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_port_connect_tunnel);
-+
-+int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ struct mmal_buffer *buffer)
-+{
-+ unsigned long flags = 0;
-+ int ret;
-+
-+ ret = buffer_from_host(instance, port, buffer);
-+ if (ret == -EINVAL) {
-+ /* Port is disabled. Queue for when it is enabled. */
-+ spin_lock_irqsave(&port->slock, flags);
-+ list_add_tail(&buffer->list, &port->buffers);
-+ spin_unlock_irqrestore(&port->slock, flags);
-+ }
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_submit_buffer);
-+
-+int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance,
-+ struct mmal_buffer *buf)
-+{
-+ struct mmal_msg_context *msg_context = get_msg_context(instance);
-+
-+ if (IS_ERR(msg_context))
-+ return (PTR_ERR(msg_context));
-+
-+ buf->msg_context = msg_context;
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(mmal_vchi_buffer_init);
-+
-+int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf)
-+{
-+ struct mmal_msg_context *msg_context = buf->msg_context;
-+
-+ if (msg_context)
-+ release_msg_context(msg_context);
-+ buf->msg_context = NULL;
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(mmal_vchi_buffer_cleanup);
-+
-+/* Initialise a mmal component and its ports
-+ *
-+ */
-+int vchiq_mmal_component_init(struct vchiq_mmal_instance *instance,
-+ const char *name,
-+ struct vchiq_mmal_component **component_out)
-+{
-+ int ret;
-+ int idx; /* port index */
-+ struct vchiq_mmal_component *component;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ if (instance->component_idx == VCHIQ_MMAL_MAX_COMPONENTS) {
-+ ret = -EINVAL; /* todo is this correct error? */
-+ goto unlock;
-+ }
-+
-+ component = &instance->component[instance->component_idx];
-+
-+ ret = create_component(instance, component, name);
-+ if (ret < 0) {
-+ pr_err("%s: failed to create component %d (Not enough GPU mem?)\n",
-+ __func__, ret);
-+ goto unlock;
-+ }
-+
-+ /* ports info needs gathering */
-+ component->control.type = MMAL_PORT_TYPE_CONTROL;
-+ component->control.index = 0;
-+ component->control.component = component;
-+ spin_lock_init(&component->control.slock);
-+ INIT_LIST_HEAD(&component->control.buffers);
-+ ret = port_info_get(instance, &component->control);
-+ if (ret < 0)
-+ goto release_component;
-+
-+ for (idx = 0; idx < component->inputs; idx++) {
-+ component->input[idx].type = MMAL_PORT_TYPE_INPUT;
-+ component->input[idx].index = idx;
-+ component->input[idx].component = component;
-+ spin_lock_init(&component->input[idx].slock);
-+ INIT_LIST_HEAD(&component->input[idx].buffers);
-+ ret = port_info_get(instance, &component->input[idx]);
-+ if (ret < 0)
-+ goto release_component;
-+ }
-+
-+ for (idx = 0; idx < component->outputs; idx++) {
-+ component->output[idx].type = MMAL_PORT_TYPE_OUTPUT;
-+ component->output[idx].index = idx;
-+ component->output[idx].component = component;
-+ spin_lock_init(&component->output[idx].slock);
-+ INIT_LIST_HEAD(&component->output[idx].buffers);
-+ ret = port_info_get(instance, &component->output[idx]);
-+ if (ret < 0)
-+ goto release_component;
-+ }
-+
-+ for (idx = 0; idx < component->clocks; idx++) {
-+ component->clock[idx].type = MMAL_PORT_TYPE_CLOCK;
-+ component->clock[idx].index = idx;
-+ component->clock[idx].component = component;
-+ spin_lock_init(&component->clock[idx].slock);
-+ INIT_LIST_HEAD(&component->clock[idx].buffers);
-+ ret = port_info_get(instance, &component->clock[idx]);
-+ if (ret < 0)
-+ goto release_component;
-+ }
-+
-+ instance->component_idx++;
-+
-+ *component_out = component;
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return 0;
-+
-+release_component:
-+ destroy_component(instance, component);
-+unlock:
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_component_init);
-+
-+/*
-+ * cause a mmal component to be destroyed
-+ */
-+int vchiq_mmal_component_finalise(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ if (component->enabled)
-+ ret = disable_component(instance, component);
-+
-+ ret = destroy_component(instance, component);
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_component_finalise);
-+
-+/*
-+ * cause a mmal component to be enabled
-+ */
-+int vchiq_mmal_component_enable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ if (component->enabled) {
-+ mutex_unlock(&instance->vchiq_mutex);
-+ return 0;
-+ }
-+
-+ ret = enable_component(instance, component);
-+ if (ret == 0)
-+ component->enabled = true;
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_component_enable);
-+
-+/*
-+ * cause a mmal component to be enabled
-+ */
-+int vchiq_mmal_component_disable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ if (!component->enabled) {
-+ mutex_unlock(&instance->vchiq_mutex);
-+ return 0;
-+ }
-+
-+ ret = disable_component(instance, component);
-+ if (ret == 0)
-+ component->enabled = false;
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_component_disable);
-+
-+int vchiq_mmal_version(struct vchiq_mmal_instance *instance,
-+ u32 *major_out, u32 *minor_out)
-+{
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ ret = get_version(instance, major_out, minor_out);
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_version);
-+
-+int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance)
-+{
-+ int status = 0;
-+
-+ if (!instance)
-+ return -EINVAL;
-+
-+ if (mutex_lock_interruptible(&instance->vchiq_mutex))
-+ return -EINTR;
-+
-+ vchi_service_use(instance->handle);
-+
-+ status = vchi_service_close(instance->handle);
-+ if (status != 0)
-+ pr_err("mmal-vchiq: VCHIQ close failed\n");
-+
-+ mutex_unlock(&instance->vchiq_mutex);
-+
-+ flush_workqueue(instance->bulk_wq);
-+ destroy_workqueue(instance->bulk_wq);
-+
-+ vfree(instance->bulk_scratch);
-+
-+ idr_destroy(&instance->context_map);
-+
-+ kfree(instance);
-+
-+ return status;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_finalise);
-+
-+int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)
-+{
-+ int status;
-+ struct vchiq_mmal_instance *instance;
-+ static VCHI_CONNECTION_T *vchi_connection;
-+ static VCHI_INSTANCE_T vchi_instance;
-+ SERVICE_CREATION_T params = {
-+ .version = VCHI_VERSION_EX(VC_MMAL_VER, VC_MMAL_MIN_VER),
-+ .service_id = VC_MMAL_SERVER_NAME,
-+ .connection = vchi_connection,
-+ .rx_fifo_size = 0,
-+ .tx_fifo_size = 0,
-+ .callback = service_callback,
-+ .callback_param = NULL,
-+ .want_unaligned_bulk_rx = 1,
-+ .want_unaligned_bulk_tx = 1,
-+ .want_crc = 0
-+ };
-+
-+ /* compile time checks to ensure structure size as they are
-+ * directly (de)serialised from memory.
-+ */
-+
-+ /* ensure the header structure has packed to the correct size */
-+ BUILD_BUG_ON(sizeof(struct mmal_msg_header) != 24);
-+
-+ /* ensure message structure does not exceed maximum length */
-+ BUILD_BUG_ON(sizeof(struct mmal_msg) > MMAL_MSG_MAX_SIZE);
-+
-+ /* mmal port struct is correct size */
-+ BUILD_BUG_ON(sizeof(struct mmal_port) != 64);
-+
-+ /* create a vchi instance */
-+ status = vchi_initialise(&vchi_instance);
-+ if (status) {
-+ pr_err("Failed to initialise VCHI instance (status=%d)\n",
-+ status);
-+ return -EIO;
-+ }
-+
-+ status = vchi_connect(NULL, 0, vchi_instance);
-+ if (status) {
-+ pr_err("Failed to connect VCHI instance (status=%d)\n", status);
-+ return -EIO;
-+ }
-+
-+ instance = kzalloc(sizeof(*instance), GFP_KERNEL);
-+
-+ if (!instance)
-+ return -ENOMEM;
-+
-+ mutex_init(&instance->vchiq_mutex);
-+
-+ instance->bulk_scratch = vmalloc(PAGE_SIZE);
-+
-+ mutex_init(&instance->context_map_lock);
-+ idr_init_base(&instance->context_map, 1);
-+
-+ params.callback_param = instance;
-+
-+ instance->bulk_wq = alloc_ordered_workqueue("mmal-vchiq",
-+ WQ_MEM_RECLAIM);
-+ if (!instance->bulk_wq)
-+ goto err_free;
-+
-+ status = vchi_service_open(vchi_instance, &params, &instance->handle);
-+ if (status) {
-+ pr_err("Failed to open VCHI service connection (status=%d)\n",
-+ status);
-+ goto err_close_services;
-+ }
-+
-+ vchi_service_release(instance->handle);
-+
-+ *out_instance = instance;
-+
-+ return 0;
-+
-+err_close_services:
-+ vchi_service_close(instance->handle);
-+ destroy_workqueue(instance->bulk_wq);
-+err_free:
-+ vfree(instance->bulk_scratch);
-+ kfree(instance);
-+ return -ENODEV;
-+}
-+EXPORT_SYMBOL_GPL(vchiq_mmal_init);
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-common.h
-+++ /dev/null
-@@ -1,61 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- *
-- * MMAL structures
-- *
-- */
--#ifndef MMAL_COMMON_H
--#define MMAL_COMMON_H
--
--#define MMAL_FOURCC(a, b, c, d) ((a) | (b << 8) | (c << 16) | (d << 24))
--#define MMAL_MAGIC MMAL_FOURCC('m', 'm', 'a', 'l')
--
--/** Special value signalling that time is not known */
--#define MMAL_TIME_UNKNOWN BIT_ULL(63)
--
--struct mmal_msg_context;
--
--/* mapping between v4l and mmal video modes */
--struct mmal_fmt {
-- char *name;
-- u32 fourcc; /* v4l2 format id */
-- int flags; /* v4l2 flags field */
-- u32 mmal;
-- int depth;
-- u32 mmal_component; /* MMAL component index to be used to encode */
-- u32 ybbp; /* depth of first Y plane for planar formats */
-- bool remove_padding; /* Does the GPU have to remove padding,
-- * or can we do hide padding via bytesperline.
-- */
--};
--
--/* buffer for one video frame */
--struct mmal_buffer {
-- /* v4l buffer data -- must be first */
-- struct vb2_v4l2_buffer vb;
--
-- /* list of buffers available */
-- struct list_head list;
--
-- void *buffer; /* buffer pointer */
-- unsigned long buffer_size; /* size of allocated buffer */
--
-- struct mmal_msg_context *msg_context;
--};
--
--/* */
--struct mmal_colourfx {
-- s32 enable;
-- u32 u;
-- u32 v;
--};
--#endif
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-encodings.h
-+++ /dev/null
-@@ -1,124 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- */
--#ifndef MMAL_ENCODINGS_H
--#define MMAL_ENCODINGS_H
--
--#define MMAL_ENCODING_H264 MMAL_FOURCC('H', '2', '6', '4')
--#define MMAL_ENCODING_H263 MMAL_FOURCC('H', '2', '6', '3')
--#define MMAL_ENCODING_MP4V MMAL_FOURCC('M', 'P', '4', 'V')
--#define MMAL_ENCODING_MP2V MMAL_FOURCC('M', 'P', '2', 'V')
--#define MMAL_ENCODING_MP1V MMAL_FOURCC('M', 'P', '1', 'V')
--#define MMAL_ENCODING_WMV3 MMAL_FOURCC('W', 'M', 'V', '3')
--#define MMAL_ENCODING_WMV2 MMAL_FOURCC('W', 'M', 'V', '2')
--#define MMAL_ENCODING_WMV1 MMAL_FOURCC('W', 'M', 'V', '1')
--#define MMAL_ENCODING_WVC1 MMAL_FOURCC('W', 'V', 'C', '1')
--#define MMAL_ENCODING_VP8 MMAL_FOURCC('V', 'P', '8', ' ')
--#define MMAL_ENCODING_VP7 MMAL_FOURCC('V', 'P', '7', ' ')
--#define MMAL_ENCODING_VP6 MMAL_FOURCC('V', 'P', '6', ' ')
--#define MMAL_ENCODING_THEORA MMAL_FOURCC('T', 'H', 'E', 'O')
--#define MMAL_ENCODING_SPARK MMAL_FOURCC('S', 'P', 'R', 'K')
--#define MMAL_ENCODING_MJPEG MMAL_FOURCC('M', 'J', 'P', 'G')
--
--#define MMAL_ENCODING_JPEG MMAL_FOURCC('J', 'P', 'E', 'G')
--#define MMAL_ENCODING_GIF MMAL_FOURCC('G', 'I', 'F', ' ')
--#define MMAL_ENCODING_PNG MMAL_FOURCC('P', 'N', 'G', ' ')
--#define MMAL_ENCODING_PPM MMAL_FOURCC('P', 'P', 'M', ' ')
--#define MMAL_ENCODING_TGA MMAL_FOURCC('T', 'G', 'A', ' ')
--#define MMAL_ENCODING_BMP MMAL_FOURCC('B', 'M', 'P', ' ')
--
--#define MMAL_ENCODING_I420 MMAL_FOURCC('I', '4', '2', '0')
--#define MMAL_ENCODING_I420_SLICE MMAL_FOURCC('S', '4', '2', '0')
--#define MMAL_ENCODING_YV12 MMAL_FOURCC('Y', 'V', '1', '2')
--#define MMAL_ENCODING_I422 MMAL_FOURCC('I', '4', '2', '2')
--#define MMAL_ENCODING_I422_SLICE MMAL_FOURCC('S', '4', '2', '2')
--#define MMAL_ENCODING_YUYV MMAL_FOURCC('Y', 'U', 'Y', 'V')
--#define MMAL_ENCODING_YVYU MMAL_FOURCC('Y', 'V', 'Y', 'U')
--#define MMAL_ENCODING_UYVY MMAL_FOURCC('U', 'Y', 'V', 'Y')
--#define MMAL_ENCODING_VYUY MMAL_FOURCC('V', 'Y', 'U', 'Y')
--#define MMAL_ENCODING_NV12 MMAL_FOURCC('N', 'V', '1', '2')
--#define MMAL_ENCODING_NV21 MMAL_FOURCC('N', 'V', '2', '1')
--#define MMAL_ENCODING_ARGB MMAL_FOURCC('A', 'R', 'G', 'B')
--#define MMAL_ENCODING_RGBA MMAL_FOURCC('R', 'G', 'B', 'A')
--#define MMAL_ENCODING_ABGR MMAL_FOURCC('A', 'B', 'G', 'R')
--#define MMAL_ENCODING_BGRA MMAL_FOURCC('B', 'G', 'R', 'A')
--#define MMAL_ENCODING_RGB16 MMAL_FOURCC('R', 'G', 'B', '2')
--#define MMAL_ENCODING_RGB24 MMAL_FOURCC('R', 'G', 'B', '3')
--#define MMAL_ENCODING_RGB32 MMAL_FOURCC('R', 'G', 'B', '4')
--#define MMAL_ENCODING_BGR16 MMAL_FOURCC('B', 'G', 'R', '2')
--#define MMAL_ENCODING_BGR24 MMAL_FOURCC('B', 'G', 'R', '3')
--#define MMAL_ENCODING_BGR32 MMAL_FOURCC('B', 'G', 'R', '4')
--
--/** SAND Video (YUVUV128) format, native format understood by VideoCore.
-- * This format is *not* opaque - if requested you will receive full frames
-- * of YUV_UV video.
-- */
--#define MMAL_ENCODING_YUVUV128 MMAL_FOURCC('S', 'A', 'N', 'D')
--
--/** VideoCore opaque image format, image handles are returned to
-- * the host but not the actual image data.
-- */
--#define MMAL_ENCODING_OPAQUE MMAL_FOURCC('O', 'P', 'Q', 'V')
--
--/** An EGL image handle
-- */
--#define MMAL_ENCODING_EGL_IMAGE MMAL_FOURCC('E', 'G', 'L', 'I')
--
--/* }@ */
--
--/** \name Pre-defined audio encodings */
--/* @{ */
--#define MMAL_ENCODING_PCM_UNSIGNED_BE MMAL_FOURCC('P', 'C', 'M', 'U')
--#define MMAL_ENCODING_PCM_UNSIGNED_LE MMAL_FOURCC('p', 'c', 'm', 'u')
--#define MMAL_ENCODING_PCM_SIGNED_BE MMAL_FOURCC('P', 'C', 'M', 'S')
--#define MMAL_ENCODING_PCM_SIGNED_LE MMAL_FOURCC('p', 'c', 'm', 's')
--#define MMAL_ENCODING_PCM_FLOAT_BE MMAL_FOURCC('P', 'C', 'M', 'F')
--#define MMAL_ENCODING_PCM_FLOAT_LE MMAL_FOURCC('p', 'c', 'm', 'f')
--
--/* Pre-defined H264 encoding variants */
--
--/** ISO 14496-10 Annex B byte stream format */
--#define MMAL_ENCODING_VARIANT_H264_DEFAULT 0
--/** ISO 14496-15 AVC stream format */
--#define MMAL_ENCODING_VARIANT_H264_AVC1 MMAL_FOURCC('A', 'V', 'C', '1')
--/** Implicitly delineated NAL units without emulation prevention */
--#define MMAL_ENCODING_VARIANT_H264_RAW MMAL_FOURCC('R', 'A', 'W', ' ')
--
--/** \defgroup MmalColorSpace List of pre-defined video color spaces
-- * This defines a list of common color spaces. This list isn't exhaustive and
-- * is only provided as a convenience to avoid clients having to use FourCC
-- * codes directly. However components are allowed to define and use their own
-- * FourCC codes.
-- */
--/* @{ */
--
--/** Unknown color space */
--#define MMAL_COLOR_SPACE_UNKNOWN 0
--/** ITU-R BT.601-5 [SDTV] */
--#define MMAL_COLOR_SPACE_ITUR_BT601 MMAL_FOURCC('Y', '6', '0', '1')
--/** ITU-R BT.709-3 [HDTV] */
--#define MMAL_COLOR_SPACE_ITUR_BT709 MMAL_FOURCC('Y', '7', '0', '9')
--/** JPEG JFIF */
--#define MMAL_COLOR_SPACE_JPEG_JFIF MMAL_FOURCC('Y', 'J', 'F', 'I')
--/** Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) */
--#define MMAL_COLOR_SPACE_FCC MMAL_FOURCC('Y', 'F', 'C', 'C')
--/** Society of Motion Picture and Television Engineers 240M (1999) */
--#define MMAL_COLOR_SPACE_SMPTE240M MMAL_FOURCC('Y', '2', '4', '0')
--/** ITU-R BT.470-2 System M */
--#define MMAL_COLOR_SPACE_BT470_2_M MMAL_FOURCC('Y', '_', '_', 'M')
--/** ITU-R BT.470-2 System BG */
--#define MMAL_COLOR_SPACE_BT470_2_BG MMAL_FOURCC('Y', '_', 'B', 'G')
--/** JPEG JFIF, but with 16..255 luma */
--#define MMAL_COLOR_SPACE_JFIF_Y16_255 MMAL_FOURCC('Y', 'Y', '1', '6')
--/* @} MmalColorSpace List */
--
--#endif /* MMAL_ENCODINGS_H */
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-msg-common.h
-+++ /dev/null
-@@ -1,48 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- */
--
--#ifndef MMAL_MSG_COMMON_H
--#define MMAL_MSG_COMMON_H
--
--enum mmal_msg_status {
-- MMAL_MSG_STATUS_SUCCESS = 0, /**< Success */
-- MMAL_MSG_STATUS_ENOMEM, /**< Out of memory */
-- MMAL_MSG_STATUS_ENOSPC, /**< Out of resources other than memory */
-- MMAL_MSG_STATUS_EINVAL, /**< Argument is invalid */
-- MMAL_MSG_STATUS_ENOSYS, /**< Function not implemented */
-- MMAL_MSG_STATUS_ENOENT, /**< No such file or directory */
-- MMAL_MSG_STATUS_ENXIO, /**< No such device or address */
-- MMAL_MSG_STATUS_EIO, /**< I/O error */
-- MMAL_MSG_STATUS_ESPIPE, /**< Illegal seek */
-- MMAL_MSG_STATUS_ECORRUPT, /**< Data is corrupt \attention */
-- MMAL_MSG_STATUS_ENOTREADY, /**< Component is not ready */
-- MMAL_MSG_STATUS_ECONFIG, /**< Component is not configured */
-- MMAL_MSG_STATUS_EISCONN, /**< Port is already connected */
-- MMAL_MSG_STATUS_ENOTCONN, /**< Port is disconnected */
-- MMAL_MSG_STATUS_EAGAIN, /**< Resource temporarily unavailable. */
-- MMAL_MSG_STATUS_EFAULT, /**< Bad address */
--};
--
--struct mmal_rect {
-- s32 x; /**< x coordinate (from left) */
-- s32 y; /**< y coordinate (from top) */
-- s32 width; /**< width */
-- s32 height; /**< height */
--};
--
--struct mmal_rational {
-- s32 num; /**< Numerator */
-- s32 den; /**< Denominator */
--};
--
--#endif /* MMAL_MSG_COMMON_H */
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-msg-format.h
-+++ /dev/null
-@@ -1,106 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- */
--
--#ifndef MMAL_MSG_FORMAT_H
--#define MMAL_MSG_FORMAT_H
--
--#include "mmal-msg-common.h"
--
--/* MMAL_ES_FORMAT_T */
--
--struct mmal_audio_format {
-- u32 channels; /* Number of audio channels */
-- u32 sample_rate; /* Sample rate */
--
-- u32 bits_per_sample; /* Bits per sample */
-- u32 block_align; /* Size of a block of data */
--};
--
--struct mmal_video_format {
-- u32 width; /* Width of frame in pixels */
-- u32 height; /* Height of frame in rows of pixels */
-- struct mmal_rect crop; /* Visible region of the frame */
-- struct mmal_rational frame_rate; /* Frame rate */
-- struct mmal_rational par; /* Pixel aspect ratio */
--
-- /*
-- * FourCC specifying the color space of the video stream. See the
-- * MmalColorSpace "pre-defined color spaces" for some examples.
-- */
-- u32 color_space;
--};
--
--struct mmal_subpicture_format {
-- u32 x_offset;
-- u32 y_offset;
--};
--
--union mmal_es_specific_format {
-- struct mmal_audio_format audio;
-- struct mmal_video_format video;
-- struct mmal_subpicture_format subpicture;
--};
--
--/* Definition of an elementary stream format (MMAL_ES_FORMAT_T) */
--struct mmal_es_format_local {
-- u32 type; /* enum mmal_es_type */
--
-- u32 encoding; /* FourCC specifying encoding of the elementary
-- * stream.
-- */
-- u32 encoding_variant; /* FourCC specifying the specific
-- * encoding variant of the elementary
-- * stream.
-- */
--
-- union mmal_es_specific_format *es; /* Type specific
-- * information for the
-- * elementary stream
-- */
--
-- u32 bitrate; /* Bitrate in bits per second */
-- u32 flags; /* Flags describing properties of the elementary
-- * stream.
-- */
--
-- u32 extradata_size; /* Size of the codec specific data */
-- u8 *extradata; /* Codec specific data */
--};
--
--/* Remote definition of an elementary stream format (MMAL_ES_FORMAT_T) */
--struct mmal_es_format {
-- u32 type; /* enum mmal_es_type */
--
-- u32 encoding; /* FourCC specifying encoding of the elementary
-- * stream.
-- */
-- u32 encoding_variant; /* FourCC specifying the specific
-- * encoding variant of the elementary
-- * stream.
-- */
--
-- u32 es; /* Type specific
-- * information for the
-- * elementary stream
-- */
--
-- u32 bitrate; /* Bitrate in bits per second */
-- u32 flags; /* Flags describing properties of the elementary
-- * stream.
-- */
--
-- u32 extradata_size; /* Size of the codec specific data */
-- u32 extradata; /* Codec specific data */
--};
--
--#endif /* MMAL_MSG_FORMAT_H */
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-msg-port.h
-+++ /dev/null
-@@ -1,109 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- */
--
--/* MMAL_PORT_TYPE_T */
--enum mmal_port_type {
-- MMAL_PORT_TYPE_UNKNOWN = 0, /* Unknown port type */
-- MMAL_PORT_TYPE_CONTROL, /* Control port */
-- MMAL_PORT_TYPE_INPUT, /* Input port */
-- MMAL_PORT_TYPE_OUTPUT, /* Output port */
-- MMAL_PORT_TYPE_CLOCK, /* Clock port */
--};
--
--/* The port is pass-through and doesn't need buffer headers allocated */
--#define MMAL_PORT_CAPABILITY_PASSTHROUGH 0x01
--/*
-- *The port wants to allocate the buffer payloads.
-- * This signals a preference that payload allocation should be done
-- * on this port for efficiency reasons.
-- */
--#define MMAL_PORT_CAPABILITY_ALLOCATION 0x02
--/*
-- * The port supports format change events.
-- * This applies to input ports and is used to let the client know
-- * whether the port supports being reconfigured via a format
-- * change event (i.e. without having to disable the port).
-- */
--#define MMAL_PORT_CAPABILITY_SUPPORTS_EVENT_FORMAT_CHANGE 0x04
--
--/*
-- * mmal port structure (MMAL_PORT_T)
-- *
-- * most elements are informational only, the pointer values for
-- * interogation messages are generally provided as additional
-- * structures within the message. When used to set values only the
-- * buffer_num, buffer_size and userdata parameters are writable.
-- */
--struct mmal_port {
-- u32 priv; /* Private member used by the framework */
-- u32 name; /* Port name. Used for debugging purposes (RO) */
--
-- u32 type; /* Type of the port (RO) enum mmal_port_type */
-- u16 index; /* Index of the port in its type list (RO) */
-- u16 index_all; /* Index of the port in the list of all ports (RO) */
--
-- u32 is_enabled; /* Indicates whether the port is enabled or not (RO) */
-- u32 format; /* Format of the elementary stream */
--
-- u32 buffer_num_min; /* Minimum number of buffers the port
-- * requires (RO). This is set by the
-- * component.
-- */
--
-- u32 buffer_size_min; /* Minimum size of buffers the port
-- * requires (RO). This is set by the
-- * component.
-- */
--
-- u32 buffer_alignment_min;/* Minimum alignment requirement for
-- * the buffers (RO). A value of
-- * zero means no special alignment
-- * requirements. This is set by the
-- * component.
-- */
--
-- u32 buffer_num_recommended; /* Number of buffers the port
-- * recommends for optimal
-- * performance (RO). A value of
-- * zero means no special
-- * recommendation. This is set
-- * by the component.
-- */
--
-- u32 buffer_size_recommended; /* Size of buffers the port
-- * recommends for optimal
-- * performance (RO). A value of
-- * zero means no special
-- * recommendation. This is set
-- * by the component.
-- */
--
-- u32 buffer_num; /* Actual number of buffers the port will use.
-- * This is set by the client.
-- */
--
-- u32 buffer_size; /* Actual maximum size of the buffers that
-- * will be sent to the port. This is set by
-- * the client.
-- */
--
-- u32 component; /* Component this port belongs to (Read Only) */
--
-- u32 userdata; /* Field reserved for use by the client */
--
-- u32 capabilities; /* Flags describing the capabilities of a
-- * port (RO). Bitwise combination of \ref
-- * portcapabilities "Port capabilities"
-- * values.
-- */
--};
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-msg.h
-+++ /dev/null
-@@ -1,406 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- */
--
--/*
-- * all the data structures which serialise the MMAL protocol. note
-- * these are directly mapped onto the recived message data.
-- *
-- * BEWARE: They seem to *assume* pointers are u32 and that there is no
-- * structure padding!
-- *
-- * NOTE: this implementation uses kernel types to ensure sizes. Rather
-- * than assigning values to enums to force their size the
-- * implementation uses fixed size types and not the enums (though the
-- * comments have the actual enum type
-- */
--#ifndef MMAL_MSG_H
--#define MMAL_MSG_H
--
--#define VC_MMAL_VER 15
--#define VC_MMAL_MIN_VER 10
--#define VC_MMAL_SERVER_NAME MAKE_FOURCC("mmal")
--
--/* max total message size is 512 bytes */
--#define MMAL_MSG_MAX_SIZE 512
--/* with six 32bit header elements max payload is therefore 488 bytes */
--#define MMAL_MSG_MAX_PAYLOAD 488
--
--#include "mmal-msg-common.h"
--#include "mmal-msg-format.h"
--#include "mmal-msg-port.h"
--
--enum mmal_msg_type {
-- MMAL_MSG_TYPE_QUIT = 1,
-- MMAL_MSG_TYPE_SERVICE_CLOSED,
-- MMAL_MSG_TYPE_GET_VERSION,
-- MMAL_MSG_TYPE_COMPONENT_CREATE,
-- MMAL_MSG_TYPE_COMPONENT_DESTROY, /* 5 */
-- MMAL_MSG_TYPE_COMPONENT_ENABLE,
-- MMAL_MSG_TYPE_COMPONENT_DISABLE,
-- MMAL_MSG_TYPE_PORT_INFO_GET,
-- MMAL_MSG_TYPE_PORT_INFO_SET,
-- MMAL_MSG_TYPE_PORT_ACTION, /* 10 */
-- MMAL_MSG_TYPE_BUFFER_FROM_HOST,
-- MMAL_MSG_TYPE_BUFFER_TO_HOST,
-- MMAL_MSG_TYPE_GET_STATS,
-- MMAL_MSG_TYPE_PORT_PARAMETER_SET,
-- MMAL_MSG_TYPE_PORT_PARAMETER_GET, /* 15 */
-- MMAL_MSG_TYPE_EVENT_TO_HOST,
-- MMAL_MSG_TYPE_GET_CORE_STATS_FOR_PORT,
-- MMAL_MSG_TYPE_OPAQUE_ALLOCATOR,
-- MMAL_MSG_TYPE_CONSUME_MEM,
-- MMAL_MSG_TYPE_LMK, /* 20 */
-- MMAL_MSG_TYPE_OPAQUE_ALLOCATOR_DESC,
-- MMAL_MSG_TYPE_DRM_GET_LHS32,
-- MMAL_MSG_TYPE_DRM_GET_TIME,
-- MMAL_MSG_TYPE_BUFFER_FROM_HOST_ZEROLEN,
-- MMAL_MSG_TYPE_PORT_FLUSH, /* 25 */
-- MMAL_MSG_TYPE_HOST_LOG,
-- MMAL_MSG_TYPE_MSG_LAST
--};
--
--/* port action request messages differ depending on the action type */
--enum mmal_msg_port_action_type {
-- MMAL_MSG_PORT_ACTION_TYPE_UNKNOWN = 0, /* Unknown action */
-- MMAL_MSG_PORT_ACTION_TYPE_ENABLE, /* Enable a port */
-- MMAL_MSG_PORT_ACTION_TYPE_DISABLE, /* Disable a port */
-- MMAL_MSG_PORT_ACTION_TYPE_FLUSH, /* Flush a port */
-- MMAL_MSG_PORT_ACTION_TYPE_CONNECT, /* Connect ports */
-- MMAL_MSG_PORT_ACTION_TYPE_DISCONNECT, /* Disconnect ports */
-- MMAL_MSG_PORT_ACTION_TYPE_SET_REQUIREMENTS, /* Set buffer requirements*/
--};
--
--struct mmal_msg_header {
-- u32 magic;
-- u32 type; /* enum mmal_msg_type */
--
-- /* Opaque handle to the control service */
-- u32 control_service;
--
-- u32 context; /* a u32 per message context */
-- u32 status; /* The status of the vchiq operation */
-- u32 padding;
--};
--
--/* Send from VC to host to report version */
--struct mmal_msg_version {
-- u32 flags;
-- u32 major;
-- u32 minor;
-- u32 minimum;
--};
--
--/* request to VC to create component */
--struct mmal_msg_component_create {
-- u32 client_component; /* component context */
-- char name[128];
-- u32 pid; /* For debug */
--};
--
--/* reply from VC to component creation request */
--struct mmal_msg_component_create_reply {
-- u32 status; /* enum mmal_msg_status - how does this differ to
-- * the one in the header?
-- */
-- u32 component_handle; /* VideoCore handle for component */
-- u32 input_num; /* Number of input ports */
-- u32 output_num; /* Number of output ports */
-- u32 clock_num; /* Number of clock ports */
--};
--
--/* request to VC to destroy a component */
--struct mmal_msg_component_destroy {
-- u32 component_handle;
--};
--
--struct mmal_msg_component_destroy_reply {
-- u32 status; /* The component destruction status */
--};
--
--/* request and reply to VC to enable a component */
--struct mmal_msg_component_enable {
-- u32 component_handle;
--};
--
--struct mmal_msg_component_enable_reply {
-- u32 status; /* The component enable status */
--};
--
--/* request and reply to VC to disable a component */
--struct mmal_msg_component_disable {
-- u32 component_handle;
--};
--
--struct mmal_msg_component_disable_reply {
-- u32 status; /* The component disable status */
--};
--
--/* request to VC to get port information */
--struct mmal_msg_port_info_get {
-- u32 component_handle; /* component handle port is associated with */
-- u32 port_type; /* enum mmal_msg_port_type */
-- u32 index; /* port index to query */
--};
--
--/* reply from VC to get port info request */
--struct mmal_msg_port_info_get_reply {
-- u32 status; /* enum mmal_msg_status */
-- u32 component_handle; /* component handle port is associated with */
-- u32 port_type; /* enum mmal_msg_port_type */
-- u32 port_index; /* port indexed in query */
-- s32 found; /* unused */
-- u32 port_handle; /* Handle to use for this port */
-- struct mmal_port port;
-- struct mmal_es_format format; /* elementary stream format */
-- union mmal_es_specific_format es; /* es type specific data */
-- u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE]; /* es extra data */
--};
--
--/* request to VC to set port information */
--struct mmal_msg_port_info_set {
-- u32 component_handle;
-- u32 port_type; /* enum mmal_msg_port_type */
-- u32 port_index; /* port indexed in query */
-- struct mmal_port port;
-- struct mmal_es_format format;
-- union mmal_es_specific_format es;
-- u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
--};
--
--/* reply from VC to port info set request */
--struct mmal_msg_port_info_set_reply {
-- u32 status;
-- u32 component_handle; /* component handle port is associated with */
-- u32 port_type; /* enum mmal_msg_port_type */
-- u32 index; /* port indexed in query */
-- s32 found; /* unused */
-- u32 port_handle; /* Handle to use for this port */
-- struct mmal_port port;
-- struct mmal_es_format format;
-- union mmal_es_specific_format es;
-- u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
--};
--
--/* port action requests that take a mmal_port as a parameter */
--struct mmal_msg_port_action_port {
-- u32 component_handle;
-- u32 port_handle;
-- u32 action; /* enum mmal_msg_port_action_type */
-- struct mmal_port port;
--};
--
--/* port action requests that take handles as a parameter */
--struct mmal_msg_port_action_handle {
-- u32 component_handle;
-- u32 port_handle;
-- u32 action; /* enum mmal_msg_port_action_type */
-- u32 connect_component_handle;
-- u32 connect_port_handle;
--};
--
--struct mmal_msg_port_action_reply {
-- u32 status; /* The port action operation status */
--};
--
--/* MMAL buffer transfer */
--
--/* Size of space reserved in a buffer message for short messages. */
--#define MMAL_VC_SHORT_DATA 128
--
--/* Signals that the current payload is the end of the stream of data */
--#define MMAL_BUFFER_HEADER_FLAG_EOS BIT(0)
--/* Signals that the start of the current payload starts a frame */
--#define MMAL_BUFFER_HEADER_FLAG_FRAME_START BIT(1)
--/* Signals that the end of the current payload ends a frame */
--#define MMAL_BUFFER_HEADER_FLAG_FRAME_END BIT(2)
--/* Signals that the current payload contains only complete frames (>1) */
--#define MMAL_BUFFER_HEADER_FLAG_FRAME \
-- (MMAL_BUFFER_HEADER_FLAG_FRAME_START | \
-- MMAL_BUFFER_HEADER_FLAG_FRAME_END)
--/* Signals that the current payload is a keyframe (i.e. self decodable) */
--#define MMAL_BUFFER_HEADER_FLAG_KEYFRAME BIT(3)
--/*
-- * Signals a discontinuity in the stream of data (e.g. after a seek).
-- * Can be used for instance by a decoder to reset its state
-- */
--#define MMAL_BUFFER_HEADER_FLAG_DISCONTINUITY BIT(4)
--/*
-- * Signals a buffer containing some kind of config data for the component
-- * (e.g. codec config data)
-- */
--#define MMAL_BUFFER_HEADER_FLAG_CONFIG BIT(5)
--/* Signals an encrypted payload */
--#define MMAL_BUFFER_HEADER_FLAG_ENCRYPTED BIT(6)
--/* Signals a buffer containing side information */
--#define MMAL_BUFFER_HEADER_FLAG_CODECSIDEINFO BIT(7)
--/*
-- * Signals a buffer which is the snapshot/postview image from a stills
-- * capture
-- */
--#define MMAL_BUFFER_HEADER_FLAGS_SNAPSHOT BIT(8)
--/* Signals a buffer which contains data known to be corrupted */
--#define MMAL_BUFFER_HEADER_FLAG_CORRUPTED BIT(9)
--/* Signals that a buffer failed to be transmitted */
--#define MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED BIT(10)
--
--struct mmal_driver_buffer {
-- u32 magic;
-- u32 component_handle;
-- u32 port_handle;
-- u32 client_context;
--};
--
--/* buffer header */
--struct mmal_buffer_header {
-- u32 next; /* next header */
-- u32 priv; /* framework private data */
-- u32 cmd;
-- u32 data;
-- u32 alloc_size;
-- u32 length;
-- u32 offset;
-- u32 flags;
-- s64 pts;
-- s64 dts;
-- u32 type;
-- u32 user_data;
--};
--
--struct mmal_buffer_header_type_specific {
-- union {
-- struct {
-- u32 planes;
-- u32 offset[4];
-- u32 pitch[4];
-- u32 flags;
-- } video;
-- } u;
--};
--
--struct mmal_msg_buffer_from_host {
-- /*
-- *The front 32 bytes of the buffer header are copied
-- * back to us in the reply to allow for context. This
-- * area is used to store two mmal_driver_buffer structures to
-- * allow for multiple concurrent service users.
-- */
-- /* control data */
-- struct mmal_driver_buffer drvbuf;
--
-- /* referenced control data for passthrough buffer management */
-- struct mmal_driver_buffer drvbuf_ref;
-- struct mmal_buffer_header buffer_header; /* buffer header itself */
-- struct mmal_buffer_header_type_specific buffer_header_type_specific;
-- s32 is_zero_copy;
-- s32 has_reference;
--
-- /* allows short data to be xfered in control message */
-- u32 payload_in_message;
-- u8 short_data[MMAL_VC_SHORT_DATA];
--};
--
--/* port parameter setting */
--
--#define MMAL_WORKER_PORT_PARAMETER_SPACE 96
--
--struct mmal_msg_port_parameter_set {
-- u32 component_handle; /* component */
-- u32 port_handle; /* port */
-- u32 id; /* Parameter ID */
-- u32 size; /* Parameter size */
-- uint32_t value[MMAL_WORKER_PORT_PARAMETER_SPACE];
--};
--
--struct mmal_msg_port_parameter_set_reply {
-- u32 status; /* enum mmal_msg_status todo: how does this
-- * differ to the one in the header?
-- */
--};
--
--/* port parameter getting */
--
--struct mmal_msg_port_parameter_get {
-- u32 component_handle; /* component */
-- u32 port_handle; /* port */
-- u32 id; /* Parameter ID */
-- u32 size; /* Parameter size */
--};
--
--struct mmal_msg_port_parameter_get_reply {
-- u32 status; /* Status of mmal_port_parameter_get call */
-- u32 id; /* Parameter ID */
-- u32 size; /* Parameter size */
-- uint32_t value[MMAL_WORKER_PORT_PARAMETER_SPACE];
--};
--
--/* event messages */
--#define MMAL_WORKER_EVENT_SPACE 256
--
--struct mmal_msg_event_to_host {
-- u32 client_component; /* component context */
--
-- u32 port_type;
-- u32 port_num;
--
-- u32 cmd;
-- u32 length;
-- u8 data[MMAL_WORKER_EVENT_SPACE];
-- u32 delayed_buffer;
--};
--
--/* all mmal messages are serialised through this structure */
--struct mmal_msg {
-- /* header */
-- struct mmal_msg_header h;
-- /* payload */
-- union {
-- struct mmal_msg_version version;
--
-- struct mmal_msg_component_create component_create;
-- struct mmal_msg_component_create_reply component_create_reply;
--
-- struct mmal_msg_component_destroy component_destroy;
-- struct mmal_msg_component_destroy_reply component_destroy_reply;
--
-- struct mmal_msg_component_enable component_enable;
-- struct mmal_msg_component_enable_reply component_enable_reply;
--
-- struct mmal_msg_component_disable component_disable;
-- struct mmal_msg_component_disable_reply component_disable_reply;
--
-- struct mmal_msg_port_info_get port_info_get;
-- struct mmal_msg_port_info_get_reply port_info_get_reply;
--
-- struct mmal_msg_port_info_set port_info_set;
-- struct mmal_msg_port_info_set_reply port_info_set_reply;
--
-- struct mmal_msg_port_action_port port_action_port;
-- struct mmal_msg_port_action_handle port_action_handle;
-- struct mmal_msg_port_action_reply port_action_reply;
--
-- struct mmal_msg_buffer_from_host buffer_from_host;
--
-- struct mmal_msg_port_parameter_set port_parameter_set;
-- struct mmal_msg_port_parameter_set_reply
-- port_parameter_set_reply;
-- struct mmal_msg_port_parameter_get
-- port_parameter_get;
-- struct mmal_msg_port_parameter_get_reply
-- port_parameter_get_reply;
--
-- struct mmal_msg_event_to_host event_to_host;
--
-- u8 payload[MMAL_MSG_MAX_PAYLOAD];
-- } u;
--};
--#endif
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-parameters.h
-+++ /dev/null
-@@ -1,755 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- */
--
--/* common parameters */
--
--/** @name Parameter groups
-- * Parameters are divided into groups, and then allocated sequentially within
-- * a group using an enum.
-- * @{
-- */
--
--#ifndef MMAL_PARAMETERS_H
--#define MMAL_PARAMETERS_H
--
--/** Common parameter ID group, used with many types of component. */
--#define MMAL_PARAMETER_GROUP_COMMON (0 << 16)
--/** Camera-specific parameter ID group. */
--#define MMAL_PARAMETER_GROUP_CAMERA (1 << 16)
--/** Video-specific parameter ID group. */
--#define MMAL_PARAMETER_GROUP_VIDEO (2 << 16)
--/** Audio-specific parameter ID group. */
--#define MMAL_PARAMETER_GROUP_AUDIO (3 << 16)
--/** Clock-specific parameter ID group. */
--#define MMAL_PARAMETER_GROUP_CLOCK (4 << 16)
--/** Miracast-specific parameter ID group. */
--#define MMAL_PARAMETER_GROUP_MIRACAST (5 << 16)
--
--/* Common parameters */
--enum mmal_parameter_common_type {
-- /**< Never a valid parameter ID */
-- MMAL_PARAMETER_UNUSED = MMAL_PARAMETER_GROUP_COMMON,
--
-- /**< MMAL_PARAMETER_ENCODING_T */
-- MMAL_PARAMETER_SUPPORTED_ENCODINGS,
-- /**< MMAL_PARAMETER_URI_T */
-- MMAL_PARAMETER_URI,
-- /** MMAL_PARAMETER_CHANGE_EVENT_REQUEST_T */
-- MMAL_PARAMETER_CHANGE_EVENT_REQUEST,
-- /** MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_ZERO_COPY,
-- /**< MMAL_PARAMETER_BUFFER_REQUIREMENTS_T */
-- MMAL_PARAMETER_BUFFER_REQUIREMENTS,
-- /**< MMAL_PARAMETER_STATISTICS_T */
-- MMAL_PARAMETER_STATISTICS,
-- /**< MMAL_PARAMETER_CORE_STATISTICS_T */
-- MMAL_PARAMETER_CORE_STATISTICS,
-- /**< MMAL_PARAMETER_MEM_USAGE_T */
-- MMAL_PARAMETER_MEM_USAGE,
-- /**< MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_BUFFER_FLAG_FILTER,
-- /**< MMAL_PARAMETER_SEEK_T */
-- MMAL_PARAMETER_SEEK,
-- /**< MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_POWERMON_ENABLE,
-- /**< MMAL_PARAMETER_LOGGING_T */
-- MMAL_PARAMETER_LOGGING,
-- /**< MMAL_PARAMETER_UINT64_T */
-- MMAL_PARAMETER_SYSTEM_TIME,
-- /**< MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_NO_IMAGE_PADDING,
--};
--
--/* camera parameters */
--
--enum mmal_parameter_camera_type {
-- /* 0 */
-- /** @ref MMAL_PARAMETER_THUMBNAIL_CONFIG_T */
-- MMAL_PARAMETER_THUMBNAIL_CONFIGURATION =
-- MMAL_PARAMETER_GROUP_CAMERA,
-- /**< Unused? */
-- MMAL_PARAMETER_CAPTURE_QUALITY,
-- /**< @ref MMAL_PARAMETER_INT32_T */
-- MMAL_PARAMETER_ROTATION,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_EXIF_DISABLE,
-- /**< @ref MMAL_PARAMETER_EXIF_T */
-- MMAL_PARAMETER_EXIF,
-- /**< @ref MMAL_PARAM_AWBMODE_T */
-- MMAL_PARAMETER_AWB_MODE,
-- /**< @ref MMAL_PARAMETER_IMAGEFX_T */
-- MMAL_PARAMETER_IMAGE_EFFECT,
-- /**< @ref MMAL_PARAMETER_COLOURFX_T */
-- MMAL_PARAMETER_COLOUR_EFFECT,
-- /**< @ref MMAL_PARAMETER_FLICKERAVOID_T */
-- MMAL_PARAMETER_FLICKER_AVOID,
-- /**< @ref MMAL_PARAMETER_FLASH_T */
-- MMAL_PARAMETER_FLASH,
-- /**< @ref MMAL_PARAMETER_REDEYE_T */
-- MMAL_PARAMETER_REDEYE,
-- /**< @ref MMAL_PARAMETER_FOCUS_T */
-- MMAL_PARAMETER_FOCUS,
-- /**< Unused? */
-- MMAL_PARAMETER_FOCAL_LENGTHS,
-- /**< @ref MMAL_PARAMETER_INT32_T */
-- MMAL_PARAMETER_EXPOSURE_COMP,
-- /**< @ref MMAL_PARAMETER_SCALEFACTOR_T */
-- MMAL_PARAMETER_ZOOM,
-- /**< @ref MMAL_PARAMETER_MIRROR_T */
-- MMAL_PARAMETER_MIRROR,
--
-- /* 0x10 */
-- /**< @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_CAMERA_NUM,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_CAPTURE,
-- /**< @ref MMAL_PARAMETER_EXPOSUREMODE_T */
-- MMAL_PARAMETER_EXPOSURE_MODE,
-- /**< @ref MMAL_PARAMETER_EXPOSUREMETERINGMODE_T */
-- MMAL_PARAMETER_EXP_METERING_MODE,
-- /**< @ref MMAL_PARAMETER_FOCUS_STATUS_T */
-- MMAL_PARAMETER_FOCUS_STATUS,
-- /**< @ref MMAL_PARAMETER_CAMERA_CONFIG_T */
-- MMAL_PARAMETER_CAMERA_CONFIG,
-- /**< @ref MMAL_PARAMETER_CAPTURE_STATUS_T */
-- MMAL_PARAMETER_CAPTURE_STATUS,
-- /**< @ref MMAL_PARAMETER_FACE_TRACK_T */
-- MMAL_PARAMETER_FACE_TRACK,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_DRAW_BOX_FACES_AND_FOCUS,
-- /**< @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_JPEG_Q_FACTOR,
-- /**< @ref MMAL_PARAMETER_FRAME_RATE_T */
-- MMAL_PARAMETER_FRAME_RATE,
-- /**< @ref MMAL_PARAMETER_CAMERA_STC_MODE_T */
-- MMAL_PARAMETER_USE_STC,
-- /**< @ref MMAL_PARAMETER_CAMERA_INFO_T */
-- MMAL_PARAMETER_CAMERA_INFO,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_STABILISATION,
-- /**< @ref MMAL_PARAMETER_FACE_TRACK_RESULTS_T */
-- MMAL_PARAMETER_FACE_TRACK_RESULTS,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_ENABLE_RAW_CAPTURE,
--
-- /* 0x20 */
-- /**< @ref MMAL_PARAMETER_URI_T */
-- MMAL_PARAMETER_DPF_FILE,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_ENABLE_DPF_FILE,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_DPF_FAIL_IS_FATAL,
-- /**< @ref MMAL_PARAMETER_CAPTUREMODE_T */
-- MMAL_PARAMETER_CAPTURE_MODE,
-- /**< @ref MMAL_PARAMETER_FOCUS_REGIONS_T */
-- MMAL_PARAMETER_FOCUS_REGIONS,
-- /**< @ref MMAL_PARAMETER_INPUT_CROP_T */
-- MMAL_PARAMETER_INPUT_CROP,
-- /**< @ref MMAL_PARAMETER_SENSOR_INFORMATION_T */
-- MMAL_PARAMETER_SENSOR_INFORMATION,
-- /**< @ref MMAL_PARAMETER_FLASH_SELECT_T */
-- MMAL_PARAMETER_FLASH_SELECT,
-- /**< @ref MMAL_PARAMETER_FIELD_OF_VIEW_T */
-- MMAL_PARAMETER_FIELD_OF_VIEW,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_HIGH_DYNAMIC_RANGE,
-- /**< @ref MMAL_PARAMETER_DRC_T */
-- MMAL_PARAMETER_DYNAMIC_RANGE_COMPRESSION,
-- /**< @ref MMAL_PARAMETER_ALGORITHM_CONTROL_T */
-- MMAL_PARAMETER_ALGORITHM_CONTROL,
-- /**< @ref MMAL_PARAMETER_RATIONAL_T */
-- MMAL_PARAMETER_SHARPNESS,
-- /**< @ref MMAL_PARAMETER_RATIONAL_T */
-- MMAL_PARAMETER_CONTRAST,
-- /**< @ref MMAL_PARAMETER_RATIONAL_T */
-- MMAL_PARAMETER_BRIGHTNESS,
-- /**< @ref MMAL_PARAMETER_RATIONAL_T */
-- MMAL_PARAMETER_SATURATION,
--
-- /* 0x30 */
-- /**< @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_ISO,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_ANTISHAKE,
-- /** @ref MMAL_PARAMETER_IMAGEFX_PARAMETERS_T */
-- MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_CAMERA_BURST_CAPTURE,
-- /** @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_CAMERA_MIN_ISO,
-- /** @ref MMAL_PARAMETER_CAMERA_USE_CASE_T */
-- MMAL_PARAMETER_CAMERA_USE_CASE,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_CAPTURE_STATS_PASS,
-- /** @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_CAMERA_CUSTOM_SENSOR_CONFIG,
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_ENABLE_REGISTER_FILE,
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_REGISTER_FAIL_IS_FATAL,
-- /** @ref MMAL_PARAMETER_CONFIGFILE_T */
-- MMAL_PARAMETER_CONFIGFILE_REGISTERS,
-- /** @ref MMAL_PARAMETER_CONFIGFILE_CHUNK_T */
-- MMAL_PARAMETER_CONFIGFILE_CHUNK_REGISTERS,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_JPEG_ATTACH_LOG,
-- /**< @ref MMAL_PARAMETER_ZEROSHUTTERLAG_T */
-- MMAL_PARAMETER_ZERO_SHUTTER_LAG,
-- /**< @ref MMAL_PARAMETER_FPS_RANGE_T */
-- MMAL_PARAMETER_FPS_RANGE,
-- /**< @ref MMAL_PARAMETER_INT32_T */
-- MMAL_PARAMETER_CAPTURE_EXPOSURE_COMP,
--
-- /* 0x40 */
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_SW_SHARPEN_DISABLE,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_FLASH_REQUIRED,
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_SW_SATURATION_DISABLE,
-- /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_SHUTTER_SPEED,
-- /**< Takes a @ref MMAL_PARAMETER_AWB_GAINS_T */
-- MMAL_PARAMETER_CUSTOM_AWB_GAINS,
--};
--
--struct mmal_parameter_rational {
-- s32 num; /**< Numerator */
-- s32 den; /**< Denominator */
--};
--
--enum mmal_parameter_camera_config_timestamp_mode {
-- MMAL_PARAM_TIMESTAMP_MODE_ZERO = 0, /* Always timestamp frames as 0 */
-- MMAL_PARAM_TIMESTAMP_MODE_RAW_STC, /* Use the raw STC value
-- * for the frame timestamp
-- */
-- MMAL_PARAM_TIMESTAMP_MODE_RESET_STC, /* Use the STC timestamp
-- * but subtract the
-- * timestamp of the first
-- * frame sent to give a
-- * zero based timestamp.
-- */
--};
--
--struct mmal_parameter_fps_range {
-- /**< Low end of the permitted framerate range */
-- struct mmal_parameter_rational fps_low;
-- /**< High end of the permitted framerate range */
-- struct mmal_parameter_rational fps_high;
--};
--
--/* camera configuration parameter */
--struct mmal_parameter_camera_config {
-- /* Parameters for setting up the image pools */
-- u32 max_stills_w; /* Max size of stills capture */
-- u32 max_stills_h;
-- u32 stills_yuv422; /* Allow YUV422 stills capture */
-- u32 one_shot_stills; /* Continuous or one shot stills captures. */
--
-- u32 max_preview_video_w; /* Max size of the preview or video
-- * capture frames
-- */
-- u32 max_preview_video_h;
-- u32 num_preview_video_frames;
--
-- /** Sets the height of the circular buffer for stills capture. */
-- u32 stills_capture_circular_buffer_height;
--
-- /** Allows preview/encode to resume as fast as possible after the stills
-- * input frame has been received, and then processes the still frame in
-- * the background whilst preview/encode has resumed.
-- * Actual mode is controlled by MMAL_PARAMETER_CAPTURE_MODE.
-- */
-- u32 fast_preview_resume;
--
-- /** Selects algorithm for timestamping frames if
-- * there is no clock component connected.
-- * enum mmal_parameter_camera_config_timestamp_mode
-- */
-- s32 use_stc_timestamp;
--};
--
--enum mmal_parameter_exposuremode {
-- MMAL_PARAM_EXPOSUREMODE_OFF,
-- MMAL_PARAM_EXPOSUREMODE_AUTO,
-- MMAL_PARAM_EXPOSUREMODE_NIGHT,
-- MMAL_PARAM_EXPOSUREMODE_NIGHTPREVIEW,
-- MMAL_PARAM_EXPOSUREMODE_BACKLIGHT,
-- MMAL_PARAM_EXPOSUREMODE_SPOTLIGHT,
-- MMAL_PARAM_EXPOSUREMODE_SPORTS,
-- MMAL_PARAM_EXPOSUREMODE_SNOW,
-- MMAL_PARAM_EXPOSUREMODE_BEACH,
-- MMAL_PARAM_EXPOSUREMODE_VERYLONG,
-- MMAL_PARAM_EXPOSUREMODE_FIXEDFPS,
-- MMAL_PARAM_EXPOSUREMODE_ANTISHAKE,
-- MMAL_PARAM_EXPOSUREMODE_FIREWORKS,
--};
--
--enum mmal_parameter_exposuremeteringmode {
-- MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE,
-- MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT,
-- MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT,
-- MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX,
--};
--
--enum mmal_parameter_awbmode {
-- MMAL_PARAM_AWBMODE_OFF,
-- MMAL_PARAM_AWBMODE_AUTO,
-- MMAL_PARAM_AWBMODE_SUNLIGHT,
-- MMAL_PARAM_AWBMODE_CLOUDY,
-- MMAL_PARAM_AWBMODE_SHADE,
-- MMAL_PARAM_AWBMODE_TUNGSTEN,
-- MMAL_PARAM_AWBMODE_FLUORESCENT,
-- MMAL_PARAM_AWBMODE_INCANDESCENT,
-- MMAL_PARAM_AWBMODE_FLASH,
-- MMAL_PARAM_AWBMODE_HORIZON,
--};
--
--enum mmal_parameter_imagefx {
-- MMAL_PARAM_IMAGEFX_NONE,
-- MMAL_PARAM_IMAGEFX_NEGATIVE,
-- MMAL_PARAM_IMAGEFX_SOLARIZE,
-- MMAL_PARAM_IMAGEFX_POSTERIZE,
-- MMAL_PARAM_IMAGEFX_WHITEBOARD,
-- MMAL_PARAM_IMAGEFX_BLACKBOARD,
-- MMAL_PARAM_IMAGEFX_SKETCH,
-- MMAL_PARAM_IMAGEFX_DENOISE,
-- MMAL_PARAM_IMAGEFX_EMBOSS,
-- MMAL_PARAM_IMAGEFX_OILPAINT,
-- MMAL_PARAM_IMAGEFX_HATCH,
-- MMAL_PARAM_IMAGEFX_GPEN,
-- MMAL_PARAM_IMAGEFX_PASTEL,
-- MMAL_PARAM_IMAGEFX_WATERCOLOUR,
-- MMAL_PARAM_IMAGEFX_FILM,
-- MMAL_PARAM_IMAGEFX_BLUR,
-- MMAL_PARAM_IMAGEFX_SATURATION,
-- MMAL_PARAM_IMAGEFX_COLOURSWAP,
-- MMAL_PARAM_IMAGEFX_WASHEDOUT,
-- MMAL_PARAM_IMAGEFX_POSTERISE,
-- MMAL_PARAM_IMAGEFX_COLOURPOINT,
-- MMAL_PARAM_IMAGEFX_COLOURBALANCE,
-- MMAL_PARAM_IMAGEFX_CARTOON,
--};
--
--enum MMAL_PARAM_FLICKERAVOID_T {
-- MMAL_PARAM_FLICKERAVOID_OFF,
-- MMAL_PARAM_FLICKERAVOID_AUTO,
-- MMAL_PARAM_FLICKERAVOID_50HZ,
-- MMAL_PARAM_FLICKERAVOID_60HZ,
-- MMAL_PARAM_FLICKERAVOID_MAX = 0x7FFFFFFF
--};
--
--struct mmal_parameter_awbgains {
-- struct mmal_parameter_rational r_gain; /**< Red gain */
-- struct mmal_parameter_rational b_gain; /**< Blue gain */
--};
--
--/** Manner of video rate control */
--enum mmal_parameter_rate_control_mode {
-- MMAL_VIDEO_RATECONTROL_DEFAULT,
-- MMAL_VIDEO_RATECONTROL_VARIABLE,
-- MMAL_VIDEO_RATECONTROL_CONSTANT,
-- MMAL_VIDEO_RATECONTROL_VARIABLE_SKIP_FRAMES,
-- MMAL_VIDEO_RATECONTROL_CONSTANT_SKIP_FRAMES
--};
--
--enum mmal_video_profile {
-- MMAL_VIDEO_PROFILE_H263_BASELINE,
-- MMAL_VIDEO_PROFILE_H263_H320CODING,
-- MMAL_VIDEO_PROFILE_H263_BACKWARDCOMPATIBLE,
-- MMAL_VIDEO_PROFILE_H263_ISWV2,
-- MMAL_VIDEO_PROFILE_H263_ISWV3,
-- MMAL_VIDEO_PROFILE_H263_HIGHCOMPRESSION,
-- MMAL_VIDEO_PROFILE_H263_INTERNET,
-- MMAL_VIDEO_PROFILE_H263_INTERLACE,
-- MMAL_VIDEO_PROFILE_H263_HIGHLATENCY,
-- MMAL_VIDEO_PROFILE_MP4V_SIMPLE,
-- MMAL_VIDEO_PROFILE_MP4V_SIMPLESCALABLE,
-- MMAL_VIDEO_PROFILE_MP4V_CORE,
-- MMAL_VIDEO_PROFILE_MP4V_MAIN,
-- MMAL_VIDEO_PROFILE_MP4V_NBIT,
-- MMAL_VIDEO_PROFILE_MP4V_SCALABLETEXTURE,
-- MMAL_VIDEO_PROFILE_MP4V_SIMPLEFACE,
-- MMAL_VIDEO_PROFILE_MP4V_SIMPLEFBA,
-- MMAL_VIDEO_PROFILE_MP4V_BASICANIMATED,
-- MMAL_VIDEO_PROFILE_MP4V_HYBRID,
-- MMAL_VIDEO_PROFILE_MP4V_ADVANCEDREALTIME,
-- MMAL_VIDEO_PROFILE_MP4V_CORESCALABLE,
-- MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCODING,
-- MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCORE,
-- MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSCALABLE,
-- MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSIMPLE,
-- MMAL_VIDEO_PROFILE_H264_BASELINE,
-- MMAL_VIDEO_PROFILE_H264_MAIN,
-- MMAL_VIDEO_PROFILE_H264_EXTENDED,
-- MMAL_VIDEO_PROFILE_H264_HIGH,
-- MMAL_VIDEO_PROFILE_H264_HIGH10,
-- MMAL_VIDEO_PROFILE_H264_HIGH422,
-- MMAL_VIDEO_PROFILE_H264_HIGH444,
-- MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE,
-- MMAL_VIDEO_PROFILE_DUMMY = 0x7FFFFFFF
--};
--
--enum mmal_video_level {
-- MMAL_VIDEO_LEVEL_H263_10,
-- MMAL_VIDEO_LEVEL_H263_20,
-- MMAL_VIDEO_LEVEL_H263_30,
-- MMAL_VIDEO_LEVEL_H263_40,
-- MMAL_VIDEO_LEVEL_H263_45,
-- MMAL_VIDEO_LEVEL_H263_50,
-- MMAL_VIDEO_LEVEL_H263_60,
-- MMAL_VIDEO_LEVEL_H263_70,
-- MMAL_VIDEO_LEVEL_MP4V_0,
-- MMAL_VIDEO_LEVEL_MP4V_0b,
-- MMAL_VIDEO_LEVEL_MP4V_1,
-- MMAL_VIDEO_LEVEL_MP4V_2,
-- MMAL_VIDEO_LEVEL_MP4V_3,
-- MMAL_VIDEO_LEVEL_MP4V_4,
-- MMAL_VIDEO_LEVEL_MP4V_4a,
-- MMAL_VIDEO_LEVEL_MP4V_5,
-- MMAL_VIDEO_LEVEL_MP4V_6,
-- MMAL_VIDEO_LEVEL_H264_1,
-- MMAL_VIDEO_LEVEL_H264_1b,
-- MMAL_VIDEO_LEVEL_H264_11,
-- MMAL_VIDEO_LEVEL_H264_12,
-- MMAL_VIDEO_LEVEL_H264_13,
-- MMAL_VIDEO_LEVEL_H264_2,
-- MMAL_VIDEO_LEVEL_H264_21,
-- MMAL_VIDEO_LEVEL_H264_22,
-- MMAL_VIDEO_LEVEL_H264_3,
-- MMAL_VIDEO_LEVEL_H264_31,
-- MMAL_VIDEO_LEVEL_H264_32,
-- MMAL_VIDEO_LEVEL_H264_4,
-- MMAL_VIDEO_LEVEL_H264_41,
-- MMAL_VIDEO_LEVEL_H264_42,
-- MMAL_VIDEO_LEVEL_H264_5,
-- MMAL_VIDEO_LEVEL_H264_51,
-- MMAL_VIDEO_LEVEL_DUMMY = 0x7FFFFFFF
--};
--
--struct mmal_parameter_video_profile {
-- enum mmal_video_profile profile;
-- enum mmal_video_level level;
--};
--
--/* video parameters */
--
--enum mmal_parameter_video_type {
-- /** @ref MMAL_DISPLAYREGION_T */
-- MMAL_PARAMETER_DISPLAYREGION = MMAL_PARAMETER_GROUP_VIDEO,
--
-- /** @ref MMAL_PARAMETER_VIDEO_PROFILE_T */
-- MMAL_PARAMETER_SUPPORTED_PROFILES,
--
-- /** @ref MMAL_PARAMETER_VIDEO_PROFILE_T */
-- MMAL_PARAMETER_PROFILE,
--
-- /** @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_INTRAPERIOD,
--
-- /** @ref MMAL_PARAMETER_VIDEO_RATECONTROL_T */
-- MMAL_PARAMETER_RATECONTROL,
--
-- /** @ref MMAL_PARAMETER_VIDEO_NALUNITFORMAT_T */
-- MMAL_PARAMETER_NALUNITFORMAT,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_MINIMISE_FRAGMENTATION,
--
-- /** @ref MMAL_PARAMETER_UINT32_T.
-- * Setting the value to zero resets to the default (one slice per
-- * frame).
-- */
-- MMAL_PARAMETER_MB_ROWS_PER_SLICE,
--
-- /** @ref MMAL_PARAMETER_VIDEO_LEVEL_EXTENSION_T */
-- MMAL_PARAMETER_VIDEO_LEVEL_EXTENSION,
--
-- /** @ref MMAL_PARAMETER_VIDEO_EEDE_ENABLE_T */
-- MMAL_PARAMETER_VIDEO_EEDE_ENABLE,
--
-- /** @ref MMAL_PARAMETER_VIDEO_EEDE_LOSSRATE_T */
-- MMAL_PARAMETER_VIDEO_EEDE_LOSSRATE,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T. Request an I-frame. */
-- MMAL_PARAMETER_VIDEO_REQUEST_I_FRAME,
-- /** @ref MMAL_PARAMETER_VIDEO_INTRA_REFRESH_T */
-- MMAL_PARAMETER_VIDEO_INTRA_REFRESH,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-- MMAL_PARAMETER_VIDEO_IMMUTABLE_INPUT,
--
-- /** @ref MMAL_PARAMETER_UINT32_T. Run-time bit rate control */
-- MMAL_PARAMETER_VIDEO_BIT_RATE,
--
-- /** @ref MMAL_PARAMETER_FRAME_RATE_T */
-- MMAL_PARAMETER_VIDEO_FRAME_RATE,
--
-- /** @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_MIN_QUANT,
--
-- /** @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_MAX_QUANT,
--
-- /** @ref MMAL_PARAMETER_VIDEO_ENCODE_RC_MODEL_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_RC_MODEL,
--
-- MMAL_PARAMETER_EXTRA_BUFFERS, /**< @ref MMAL_PARAMETER_UINT32_T. */
-- /** @ref MMAL_PARAMETER_UINT32_T.
-- * Changing this parameter from the default can reduce frame rate
-- * because image buffers need to be re-pitched.
-- */
-- MMAL_PARAMETER_VIDEO_ALIGN_HORIZ,
--
-- /** @ref MMAL_PARAMETER_UINT32_T.
-- * Changing this parameter from the default can reduce frame rate
-- * because image buffers need to be re-pitched.
-- */
-- MMAL_PARAMETER_VIDEO_ALIGN_VERT,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-- MMAL_PARAMETER_VIDEO_DROPPABLE_PFRAMES,
--
-- /** @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_INITIAL_QUANT,
--
-- /**< @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_QP_P,
--
-- /**< @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_RC_SLICE_DQUANT,
--
-- /** @ref MMAL_PARAMETER_UINT32_T */
-- MMAL_PARAMETER_VIDEO_ENCODE_FRAME_LIMIT_BITS,
--
-- /** @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_PEAK_RATE,
--
-- /* H264 specific parameters */
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_DISABLE_CABAC,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_LATENCY,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_AU_DELIMITERS,
--
-- /** @ref MMAL_PARAMETER_UINT32_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_DEBLOCK_IDC,
--
-- /** @ref MMAL_PARAMETER_VIDEO_ENCODER_H264_MB_INTRA_MODES_T. */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_MB_INTRA_MODE,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_ENCODE_HEADER_ON_OPEN,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_ENCODE_PRECODE_FOR_QP,
--
-- /** @ref MMAL_PARAMETER_VIDEO_DRM_INIT_INFO_T. */
-- MMAL_PARAMETER_VIDEO_DRM_INIT_INFO,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_TIMESTAMP_FIFO,
--
-- /** @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_DECODE_ERROR_CONCEALMENT,
--
-- /** @ref MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER_T. */
-- MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER,
--
-- /** @ref MMAL_PARAMETER_BYTES_T */
-- MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3,
--
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_VCL_HRD_PARAMETERS,
--
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_DELAY_HRD_FLAG,
--
-- /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-- MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER
--};
--
--/** Valid mirror modes */
--enum mmal_parameter_mirror {
-- MMAL_PARAM_MIRROR_NONE,
-- MMAL_PARAM_MIRROR_VERTICAL,
-- MMAL_PARAM_MIRROR_HORIZONTAL,
-- MMAL_PARAM_MIRROR_BOTH,
--};
--
--enum mmal_parameter_displaytransform {
-- MMAL_DISPLAY_ROT0 = 0,
-- MMAL_DISPLAY_MIRROR_ROT0 = 1,
-- MMAL_DISPLAY_MIRROR_ROT180 = 2,
-- MMAL_DISPLAY_ROT180 = 3,
-- MMAL_DISPLAY_MIRROR_ROT90 = 4,
-- MMAL_DISPLAY_ROT270 = 5,
-- MMAL_DISPLAY_ROT90 = 6,
-- MMAL_DISPLAY_MIRROR_ROT270 = 7,
--};
--
--enum mmal_parameter_displaymode {
-- MMAL_DISPLAY_MODE_FILL = 0,
-- MMAL_DISPLAY_MODE_LETTERBOX = 1,
--};
--
--enum mmal_parameter_displayset {
-- MMAL_DISPLAY_SET_NONE = 0,
-- MMAL_DISPLAY_SET_NUM = 1,
-- MMAL_DISPLAY_SET_FULLSCREEN = 2,
-- MMAL_DISPLAY_SET_TRANSFORM = 4,
-- MMAL_DISPLAY_SET_DEST_RECT = 8,
-- MMAL_DISPLAY_SET_SRC_RECT = 0x10,
-- MMAL_DISPLAY_SET_MODE = 0x20,
-- MMAL_DISPLAY_SET_PIXEL = 0x40,
-- MMAL_DISPLAY_SET_NOASPECT = 0x80,
-- MMAL_DISPLAY_SET_LAYER = 0x100,
-- MMAL_DISPLAY_SET_COPYPROTECT = 0x200,
-- MMAL_DISPLAY_SET_ALPHA = 0x400,
--};
--
--/* rectangle, used lots so it gets its own struct */
--struct vchiq_mmal_rect {
-- s32 x;
-- s32 y;
-- s32 width;
-- s32 height;
--};
--
--struct mmal_parameter_displayregion {
-- /** Bitfield that indicates which fields are set and should be
-- * used. All other fields will maintain their current value.
-- * \ref MMAL_DISPLAYSET_T defines the bits that can be
-- * combined.
-- */
-- u32 set;
--
-- /** Describes the display output device, with 0 typically
-- * being a directly connected LCD display. The actual values
-- * will depend on the hardware. Code using hard-wired numbers
-- * (e.g. 2) is certain to fail.
-- */
--
-- u32 display_num;
-- /** Indicates that we are using the full device screen area,
-- * rather than a window of the display. If zero, then
-- * dest_rect is used to specify a region of the display to
-- * use.
-- */
--
-- s32 fullscreen;
-- /** Indicates any rotation or flipping used to map frames onto
-- * the natural display orientation.
-- */
-- u32 transform; /* enum mmal_parameter_displaytransform */
--
-- /** Where to display the frame within the screen, if
-- * fullscreen is zero.
-- */
-- struct vchiq_mmal_rect dest_rect;
--
-- /** Indicates which area of the frame to display. If all
-- * values are zero, the whole frame will be used.
-- */
-- struct vchiq_mmal_rect src_rect;
--
-- /** If set to non-zero, indicates that any display scaling
-- * should disregard the aspect ratio of the frame region being
-- * displayed.
-- */
-- s32 noaspect;
--
-- /** Indicates how the image should be scaled to fit the
-- * display. \code MMAL_DISPLAY_MODE_FILL \endcode indicates
-- * that the image should fill the screen by potentially
-- * cropping the frames. Setting \code mode \endcode to \code
-- * MMAL_DISPLAY_MODE_LETTERBOX \endcode indicates that all the
-- * source region should be displayed and black bars added if
-- * necessary.
-- */
-- u32 mode; /* enum mmal_parameter_displaymode */
--
-- /** If non-zero, defines the width of a source pixel relative
-- * to \code pixel_y \endcode. If zero, then pixels default to
-- * being square.
-- */
-- u32 pixel_x;
--
-- /** If non-zero, defines the height of a source pixel relative
-- * to \code pixel_x \endcode. If zero, then pixels default to
-- * being square.
-- */
-- u32 pixel_y;
--
-- /** Sets the relative depth of the images, with greater values
-- * being in front of smaller values.
-- */
-- u32 layer;
--
-- /** Set to non-zero to ensure copy protection is used on
-- * output.
-- */
-- s32 copyprotect_required;
--
-- /** Level of opacity of the layer, where zero is fully
-- * transparent and 255 is fully opaque.
-- */
-- u32 alpha;
--};
--
--#define MMAL_MAX_IMAGEFX_PARAMETERS 5
--
--struct mmal_parameter_imagefx_parameters {
-- enum mmal_parameter_imagefx effect;
-- u32 num_effect_params;
-- u32 effect_parameter[MMAL_MAX_IMAGEFX_PARAMETERS];
--};
--
--#define MMAL_PARAMETER_CAMERA_INFO_MAX_CAMERAS 4
--#define MMAL_PARAMETER_CAMERA_INFO_MAX_FLASHES 2
--#define MMAL_PARAMETER_CAMERA_INFO_MAX_STR_LEN 16
--
--struct mmal_parameter_camera_info_camera_t {
-- u32 port_id;
-- u32 max_width;
-- u32 max_height;
-- u32 lens_present;
-- u8 camera_name[MMAL_PARAMETER_CAMERA_INFO_MAX_STR_LEN];
--};
--
--enum mmal_parameter_camera_info_flash_type_t {
-- /* Make values explicit to ensure they match values in config ini */
-- MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_XENON = 0,
-- MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_LED = 1,
-- MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_OTHER = 2,
-- MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_MAX = 0x7FFFFFFF
--};
--
--struct mmal_parameter_camera_info_flash_t {
-- enum mmal_parameter_camera_info_flash_type_t flash_type;
--};
--
--struct mmal_parameter_camera_info_t {
-- u32 num_cameras;
-- u32 num_flashes;
-- struct mmal_parameter_camera_info_camera_t
-- cameras[MMAL_PARAMETER_CAMERA_INFO_MAX_CAMERAS];
-- struct mmal_parameter_camera_info_flash_t
-- flashes[MMAL_PARAMETER_CAMERA_INFO_MAX_FLASHES];
--};
--
--#endif
---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h
-+++ /dev/null
-@@ -1,166 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * Broadcom BM2835 V4L2 driver
-- *
-- * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-- *
-- * Authors: Vincent Sanders @ Collabora
-- * Dave Stevenson @ Broadcom
-- * (now dave.stevenson@raspberrypi.org)
-- * Simon Mellor @ Broadcom
-- * Luke Diamand @ Broadcom
-- *
-- * MMAL interface to VCHIQ message passing
-- */
--
--#ifndef MMAL_VCHIQ_H
--#define MMAL_VCHIQ_H
--
--#include "mmal-msg-format.h"
--
--#define MAX_PORT_COUNT 4
--
--/* Maximum size of the format extradata. */
--#define MMAL_FORMAT_EXTRADATA_MAX_SIZE 128
--
--struct vchiq_mmal_instance;
--
--enum vchiq_mmal_es_type {
-- MMAL_ES_TYPE_UNKNOWN, /**< Unknown elementary stream type */
-- MMAL_ES_TYPE_CONTROL, /**< Elementary stream of control commands */
-- MMAL_ES_TYPE_AUDIO, /**< Audio elementary stream */
-- MMAL_ES_TYPE_VIDEO, /**< Video elementary stream */
-- MMAL_ES_TYPE_SUBPICTURE /**< Sub-picture elementary stream */
--};
--
--struct vchiq_mmal_port_buffer {
-- unsigned int num; /* number of buffers */
-- u32 size; /* size of buffers */
-- u32 alignment; /* alignment of buffers */
--};
--
--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);
--
--struct vchiq_mmal_port {
-- bool enabled;
-- u32 handle;
-- u32 type; /* port type, cached to use on port info set */
-- u32 index; /* port index, cached to use on port info set */
--
-- /* component port belongs to, allows simple deref */
-- struct vchiq_mmal_component *component;
--
-- struct vchiq_mmal_port *connected; /* port conencted to */
--
-- /* buffer info */
-- struct vchiq_mmal_port_buffer minimum_buffer;
-- struct vchiq_mmal_port_buffer recommended_buffer;
-- struct vchiq_mmal_port_buffer current_buffer;
--
-- /* stream format */
-- struct mmal_es_format_local format;
-- /* elementary stream format */
-- union mmal_es_specific_format es;
--
-- /* data buffers to fill */
-- struct list_head buffers;
-- /* lock to serialise adding and removing buffers from list */
-- spinlock_t slock;
--
-- /* Count of buffers the VPU has yet to return */
-- atomic_t buffers_with_vpu;
-- /* callback on buffer completion */
-- vchiq_mmal_buffer_cb buffer_cb;
-- /* callback context */
-- void *cb_ctx;
--};
--
--struct vchiq_mmal_component {
-- bool enabled;
-- u32 handle; /* VideoCore handle for component */
-- u32 inputs; /* Number of input ports */
-- u32 outputs; /* Number of output ports */
-- u32 clocks; /* Number of clock ports */
-- struct vchiq_mmal_port control; /* control port */
-- struct vchiq_mmal_port input[MAX_PORT_COUNT]; /* input ports */
-- struct vchiq_mmal_port output[MAX_PORT_COUNT]; /* output ports */
-- struct vchiq_mmal_port clock[MAX_PORT_COUNT]; /* clock ports */
--};
--
--int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance);
--int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance);
--
--/* Initialise a mmal component and its ports
-- *
-- */
--int vchiq_mmal_component_init(
-- struct vchiq_mmal_instance *instance,
-- const char *name,
-- struct vchiq_mmal_component **component_out);
--
--int vchiq_mmal_component_finalise(
-- struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component);
--
--int vchiq_mmal_component_enable(
-- struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component);
--
--int vchiq_mmal_component_disable(
-- struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_component *component);
--
--/* enable a mmal port
-- *
-- * enables a port and if a buffer callback provided enque buffer
-- * headers as appropriate for the port.
-- */
--int vchiq_mmal_port_enable(
-- struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- vchiq_mmal_buffer_cb buffer_cb);
--
--/* disable a port
-- *
-- * disable a port will dequeue any pending buffers
-- */
--int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port);
--
--int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- u32 parameter,
-- void *value,
-- u32 value_size);
--
--int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- u32 parameter,
-- void *value,
-- u32 *value_size);
--
--int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port);
--
--int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *src,
-- struct vchiq_mmal_port *dst);
--
--int vchiq_mmal_version(struct vchiq_mmal_instance *instance,
-- u32 *major_out,
-- u32 *minor_out);
--
--int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
-- struct vchiq_mmal_port *port,
-- struct mmal_buffer *buf);
--
--int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance,
-- struct mmal_buffer *buf);
--int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf);
--#endif /* MMAL_VCHIQ_H */
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h
-@@ -0,0 +1,61 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ *
-+ * MMAL structures
-+ *
-+ */
-+#ifndef MMAL_COMMON_H
-+#define MMAL_COMMON_H
-+
-+#define MMAL_FOURCC(a, b, c, d) ((a) | (b << 8) | (c << 16) | (d << 24))
-+#define MMAL_MAGIC MMAL_FOURCC('m', 'm', 'a', 'l')
-+
-+/** Special value signalling that time is not known */
-+#define MMAL_TIME_UNKNOWN BIT_ULL(63)
-+
-+struct mmal_msg_context;
-+
-+/* mapping between v4l and mmal video modes */
-+struct mmal_fmt {
-+ char *name;
-+ u32 fourcc; /* v4l2 format id */
-+ int flags; /* v4l2 flags field */
-+ u32 mmal;
-+ int depth;
-+ u32 mmal_component; /* MMAL component index to be used to encode */
-+ u32 ybbp; /* depth of first Y plane for planar formats */
-+ bool remove_padding; /* Does the GPU have to remove padding,
-+ * or can we do hide padding via bytesperline.
-+ */
-+};
-+
-+/* buffer for one video frame */
-+struct mmal_buffer {
-+ /* v4l buffer data -- must be first */
-+ struct vb2_v4l2_buffer vb;
-+
-+ /* list of buffers available */
-+ struct list_head list;
-+
-+ void *buffer; /* buffer pointer */
-+ unsigned long buffer_size; /* size of allocated buffer */
-+
-+ struct mmal_msg_context *msg_context;
-+};
-+
-+/* */
-+struct mmal_colourfx {
-+ s32 enable;
-+ u32 u;
-+ u32 v;
-+};
-+#endif
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h
-@@ -0,0 +1,124 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ */
-+#ifndef MMAL_ENCODINGS_H
-+#define MMAL_ENCODINGS_H
-+
-+#define MMAL_ENCODING_H264 MMAL_FOURCC('H', '2', '6', '4')
-+#define MMAL_ENCODING_H263 MMAL_FOURCC('H', '2', '6', '3')
-+#define MMAL_ENCODING_MP4V MMAL_FOURCC('M', 'P', '4', 'V')
-+#define MMAL_ENCODING_MP2V MMAL_FOURCC('M', 'P', '2', 'V')
-+#define MMAL_ENCODING_MP1V MMAL_FOURCC('M', 'P', '1', 'V')
-+#define MMAL_ENCODING_WMV3 MMAL_FOURCC('W', 'M', 'V', '3')
-+#define MMAL_ENCODING_WMV2 MMAL_FOURCC('W', 'M', 'V', '2')
-+#define MMAL_ENCODING_WMV1 MMAL_FOURCC('W', 'M', 'V', '1')
-+#define MMAL_ENCODING_WVC1 MMAL_FOURCC('W', 'V', 'C', '1')
-+#define MMAL_ENCODING_VP8 MMAL_FOURCC('V', 'P', '8', ' ')
-+#define MMAL_ENCODING_VP7 MMAL_FOURCC('V', 'P', '7', ' ')
-+#define MMAL_ENCODING_VP6 MMAL_FOURCC('V', 'P', '6', ' ')
-+#define MMAL_ENCODING_THEORA MMAL_FOURCC('T', 'H', 'E', 'O')
-+#define MMAL_ENCODING_SPARK MMAL_FOURCC('S', 'P', 'R', 'K')
-+#define MMAL_ENCODING_MJPEG MMAL_FOURCC('M', 'J', 'P', 'G')
-+
-+#define MMAL_ENCODING_JPEG MMAL_FOURCC('J', 'P', 'E', 'G')
-+#define MMAL_ENCODING_GIF MMAL_FOURCC('G', 'I', 'F', ' ')
-+#define MMAL_ENCODING_PNG MMAL_FOURCC('P', 'N', 'G', ' ')
-+#define MMAL_ENCODING_PPM MMAL_FOURCC('P', 'P', 'M', ' ')
-+#define MMAL_ENCODING_TGA MMAL_FOURCC('T', 'G', 'A', ' ')
-+#define MMAL_ENCODING_BMP MMAL_FOURCC('B', 'M', 'P', ' ')
-+
-+#define MMAL_ENCODING_I420 MMAL_FOURCC('I', '4', '2', '0')
-+#define MMAL_ENCODING_I420_SLICE MMAL_FOURCC('S', '4', '2', '0')
-+#define MMAL_ENCODING_YV12 MMAL_FOURCC('Y', 'V', '1', '2')
-+#define MMAL_ENCODING_I422 MMAL_FOURCC('I', '4', '2', '2')
-+#define MMAL_ENCODING_I422_SLICE MMAL_FOURCC('S', '4', '2', '2')
-+#define MMAL_ENCODING_YUYV MMAL_FOURCC('Y', 'U', 'Y', 'V')
-+#define MMAL_ENCODING_YVYU MMAL_FOURCC('Y', 'V', 'Y', 'U')
-+#define MMAL_ENCODING_UYVY MMAL_FOURCC('U', 'Y', 'V', 'Y')
-+#define MMAL_ENCODING_VYUY MMAL_FOURCC('V', 'Y', 'U', 'Y')
-+#define MMAL_ENCODING_NV12 MMAL_FOURCC('N', 'V', '1', '2')
-+#define MMAL_ENCODING_NV21 MMAL_FOURCC('N', 'V', '2', '1')
-+#define MMAL_ENCODING_ARGB MMAL_FOURCC('A', 'R', 'G', 'B')
-+#define MMAL_ENCODING_RGBA MMAL_FOURCC('R', 'G', 'B', 'A')
-+#define MMAL_ENCODING_ABGR MMAL_FOURCC('A', 'B', 'G', 'R')
-+#define MMAL_ENCODING_BGRA MMAL_FOURCC('B', 'G', 'R', 'A')
-+#define MMAL_ENCODING_RGB16 MMAL_FOURCC('R', 'G', 'B', '2')
-+#define MMAL_ENCODING_RGB24 MMAL_FOURCC('R', 'G', 'B', '3')
-+#define MMAL_ENCODING_RGB32 MMAL_FOURCC('R', 'G', 'B', '4')
-+#define MMAL_ENCODING_BGR16 MMAL_FOURCC('B', 'G', 'R', '2')
-+#define MMAL_ENCODING_BGR24 MMAL_FOURCC('B', 'G', 'R', '3')
-+#define MMAL_ENCODING_BGR32 MMAL_FOURCC('B', 'G', 'R', '4')
-+
-+/** SAND Video (YUVUV128) format, native format understood by VideoCore.
-+ * This format is *not* opaque - if requested you will receive full frames
-+ * of YUV_UV video.
-+ */
-+#define MMAL_ENCODING_YUVUV128 MMAL_FOURCC('S', 'A', 'N', 'D')
-+
-+/** VideoCore opaque image format, image handles are returned to
-+ * the host but not the actual image data.
-+ */
-+#define MMAL_ENCODING_OPAQUE MMAL_FOURCC('O', 'P', 'Q', 'V')
-+
-+/** An EGL image handle
-+ */
-+#define MMAL_ENCODING_EGL_IMAGE MMAL_FOURCC('E', 'G', 'L', 'I')
-+
-+/* }@ */
-+
-+/** \name Pre-defined audio encodings */
-+/* @{ */
-+#define MMAL_ENCODING_PCM_UNSIGNED_BE MMAL_FOURCC('P', 'C', 'M', 'U')
-+#define MMAL_ENCODING_PCM_UNSIGNED_LE MMAL_FOURCC('p', 'c', 'm', 'u')
-+#define MMAL_ENCODING_PCM_SIGNED_BE MMAL_FOURCC('P', 'C', 'M', 'S')
-+#define MMAL_ENCODING_PCM_SIGNED_LE MMAL_FOURCC('p', 'c', 'm', 's')
-+#define MMAL_ENCODING_PCM_FLOAT_BE MMAL_FOURCC('P', 'C', 'M', 'F')
-+#define MMAL_ENCODING_PCM_FLOAT_LE MMAL_FOURCC('p', 'c', 'm', 'f')
-+
-+/* Pre-defined H264 encoding variants */
-+
-+/** ISO 14496-10 Annex B byte stream format */
-+#define MMAL_ENCODING_VARIANT_H264_DEFAULT 0
-+/** ISO 14496-15 AVC stream format */
-+#define MMAL_ENCODING_VARIANT_H264_AVC1 MMAL_FOURCC('A', 'V', 'C', '1')
-+/** Implicitly delineated NAL units without emulation prevention */
-+#define MMAL_ENCODING_VARIANT_H264_RAW MMAL_FOURCC('R', 'A', 'W', ' ')
-+
-+/** \defgroup MmalColorSpace List of pre-defined video color spaces
-+ * This defines a list of common color spaces. This list isn't exhaustive and
-+ * is only provided as a convenience to avoid clients having to use FourCC
-+ * codes directly. However components are allowed to define and use their own
-+ * FourCC codes.
-+ */
-+/* @{ */
-+
-+/** Unknown color space */
-+#define MMAL_COLOR_SPACE_UNKNOWN 0
-+/** ITU-R BT.601-5 [SDTV] */
-+#define MMAL_COLOR_SPACE_ITUR_BT601 MMAL_FOURCC('Y', '6', '0', '1')
-+/** ITU-R BT.709-3 [HDTV] */
-+#define MMAL_COLOR_SPACE_ITUR_BT709 MMAL_FOURCC('Y', '7', '0', '9')
-+/** JPEG JFIF */
-+#define MMAL_COLOR_SPACE_JPEG_JFIF MMAL_FOURCC('Y', 'J', 'F', 'I')
-+/** Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) */
-+#define MMAL_COLOR_SPACE_FCC MMAL_FOURCC('Y', 'F', 'C', 'C')
-+/** Society of Motion Picture and Television Engineers 240M (1999) */
-+#define MMAL_COLOR_SPACE_SMPTE240M MMAL_FOURCC('Y', '2', '4', '0')
-+/** ITU-R BT.470-2 System M */
-+#define MMAL_COLOR_SPACE_BT470_2_M MMAL_FOURCC('Y', '_', '_', 'M')
-+/** ITU-R BT.470-2 System BG */
-+#define MMAL_COLOR_SPACE_BT470_2_BG MMAL_FOURCC('Y', '_', 'B', 'G')
-+/** JPEG JFIF, but with 16..255 luma */
-+#define MMAL_COLOR_SPACE_JFIF_Y16_255 MMAL_FOURCC('Y', 'Y', '1', '6')
-+/* @} MmalColorSpace List */
-+
-+#endif /* MMAL_ENCODINGS_H */
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h
-@@ -0,0 +1,48 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ */
-+
-+#ifndef MMAL_MSG_COMMON_H
-+#define MMAL_MSG_COMMON_H
-+
-+enum mmal_msg_status {
-+ MMAL_MSG_STATUS_SUCCESS = 0, /**< Success */
-+ MMAL_MSG_STATUS_ENOMEM, /**< Out of memory */
-+ MMAL_MSG_STATUS_ENOSPC, /**< Out of resources other than memory */
-+ MMAL_MSG_STATUS_EINVAL, /**< Argument is invalid */
-+ MMAL_MSG_STATUS_ENOSYS, /**< Function not implemented */
-+ MMAL_MSG_STATUS_ENOENT, /**< No such file or directory */
-+ MMAL_MSG_STATUS_ENXIO, /**< No such device or address */
-+ MMAL_MSG_STATUS_EIO, /**< I/O error */
-+ MMAL_MSG_STATUS_ESPIPE, /**< Illegal seek */
-+ MMAL_MSG_STATUS_ECORRUPT, /**< Data is corrupt \attention */
-+ MMAL_MSG_STATUS_ENOTREADY, /**< Component is not ready */
-+ MMAL_MSG_STATUS_ECONFIG, /**< Component is not configured */
-+ MMAL_MSG_STATUS_EISCONN, /**< Port is already connected */
-+ MMAL_MSG_STATUS_ENOTCONN, /**< Port is disconnected */
-+ MMAL_MSG_STATUS_EAGAIN, /**< Resource temporarily unavailable. */
-+ MMAL_MSG_STATUS_EFAULT, /**< Bad address */
-+};
-+
-+struct mmal_rect {
-+ s32 x; /**< x coordinate (from left) */
-+ s32 y; /**< y coordinate (from top) */
-+ s32 width; /**< width */
-+ s32 height; /**< height */
-+};
-+
-+struct mmal_rational {
-+ s32 num; /**< Numerator */
-+ s32 den; /**< Denominator */
-+};
-+
-+#endif /* MMAL_MSG_COMMON_H */
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h
-@@ -0,0 +1,106 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ */
-+
-+#ifndef MMAL_MSG_FORMAT_H
-+#define MMAL_MSG_FORMAT_H
-+
-+#include "mmal-msg-common.h"
-+
-+/* MMAL_ES_FORMAT_T */
-+
-+struct mmal_audio_format {
-+ u32 channels; /* Number of audio channels */
-+ u32 sample_rate; /* Sample rate */
-+
-+ u32 bits_per_sample; /* Bits per sample */
-+ u32 block_align; /* Size of a block of data */
-+};
-+
-+struct mmal_video_format {
-+ u32 width; /* Width of frame in pixels */
-+ u32 height; /* Height of frame in rows of pixels */
-+ struct mmal_rect crop; /* Visible region of the frame */
-+ struct mmal_rational frame_rate; /* Frame rate */
-+ struct mmal_rational par; /* Pixel aspect ratio */
-+
-+ /*
-+ * FourCC specifying the color space of the video stream. See the
-+ * MmalColorSpace "pre-defined color spaces" for some examples.
-+ */
-+ u32 color_space;
-+};
-+
-+struct mmal_subpicture_format {
-+ u32 x_offset;
-+ u32 y_offset;
-+};
-+
-+union mmal_es_specific_format {
-+ struct mmal_audio_format audio;
-+ struct mmal_video_format video;
-+ struct mmal_subpicture_format subpicture;
-+};
-+
-+/* Definition of an elementary stream format (MMAL_ES_FORMAT_T) */
-+struct mmal_es_format_local {
-+ u32 type; /* enum mmal_es_type */
-+
-+ u32 encoding; /* FourCC specifying encoding of the elementary
-+ * stream.
-+ */
-+ u32 encoding_variant; /* FourCC specifying the specific
-+ * encoding variant of the elementary
-+ * stream.
-+ */
-+
-+ union mmal_es_specific_format *es; /* Type specific
-+ * information for the
-+ * elementary stream
-+ */
-+
-+ u32 bitrate; /* Bitrate in bits per second */
-+ u32 flags; /* Flags describing properties of the elementary
-+ * stream.
-+ */
-+
-+ u32 extradata_size; /* Size of the codec specific data */
-+ u8 *extradata; /* Codec specific data */
-+};
-+
-+/* Remote definition of an elementary stream format (MMAL_ES_FORMAT_T) */
-+struct mmal_es_format {
-+ u32 type; /* enum mmal_es_type */
-+
-+ u32 encoding; /* FourCC specifying encoding of the elementary
-+ * stream.
-+ */
-+ u32 encoding_variant; /* FourCC specifying the specific
-+ * encoding variant of the elementary
-+ * stream.
-+ */
-+
-+ u32 es; /* Type specific
-+ * information for the
-+ * elementary stream
-+ */
-+
-+ u32 bitrate; /* Bitrate in bits per second */
-+ u32 flags; /* Flags describing properties of the elementary
-+ * stream.
-+ */
-+
-+ u32 extradata_size; /* Size of the codec specific data */
-+ u32 extradata; /* Codec specific data */
-+};
-+
-+#endif /* MMAL_MSG_FORMAT_H */
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-port.h
-@@ -0,0 +1,109 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ */
-+
-+/* MMAL_PORT_TYPE_T */
-+enum mmal_port_type {
-+ MMAL_PORT_TYPE_UNKNOWN = 0, /* Unknown port type */
-+ MMAL_PORT_TYPE_CONTROL, /* Control port */
-+ MMAL_PORT_TYPE_INPUT, /* Input port */
-+ MMAL_PORT_TYPE_OUTPUT, /* Output port */
-+ MMAL_PORT_TYPE_CLOCK, /* Clock port */
-+};
-+
-+/* The port is pass-through and doesn't need buffer headers allocated */
-+#define MMAL_PORT_CAPABILITY_PASSTHROUGH 0x01
-+/*
-+ *The port wants to allocate the buffer payloads.
-+ * This signals a preference that payload allocation should be done
-+ * on this port for efficiency reasons.
-+ */
-+#define MMAL_PORT_CAPABILITY_ALLOCATION 0x02
-+/*
-+ * The port supports format change events.
-+ * This applies to input ports and is used to let the client know
-+ * whether the port supports being reconfigured via a format
-+ * change event (i.e. without having to disable the port).
-+ */
-+#define MMAL_PORT_CAPABILITY_SUPPORTS_EVENT_FORMAT_CHANGE 0x04
-+
-+/*
-+ * mmal port structure (MMAL_PORT_T)
-+ *
-+ * most elements are informational only, the pointer values for
-+ * interogation messages are generally provided as additional
-+ * structures within the message. When used to set values only the
-+ * buffer_num, buffer_size and userdata parameters are writable.
-+ */
-+struct mmal_port {
-+ u32 priv; /* Private member used by the framework */
-+ u32 name; /* Port name. Used for debugging purposes (RO) */
-+
-+ u32 type; /* Type of the port (RO) enum mmal_port_type */
-+ u16 index; /* Index of the port in its type list (RO) */
-+ u16 index_all; /* Index of the port in the list of all ports (RO) */
-+
-+ u32 is_enabled; /* Indicates whether the port is enabled or not (RO) */
-+ u32 format; /* Format of the elementary stream */
-+
-+ u32 buffer_num_min; /* Minimum number of buffers the port
-+ * requires (RO). This is set by the
-+ * component.
-+ */
-+
-+ u32 buffer_size_min; /* Minimum size of buffers the port
-+ * requires (RO). This is set by the
-+ * component.
-+ */
-+
-+ u32 buffer_alignment_min;/* Minimum alignment requirement for
-+ * the buffers (RO). A value of
-+ * zero means no special alignment
-+ * requirements. This is set by the
-+ * component.
-+ */
-+
-+ u32 buffer_num_recommended; /* Number of buffers the port
-+ * recommends for optimal
-+ * performance (RO). A value of
-+ * zero means no special
-+ * recommendation. This is set
-+ * by the component.
-+ */
-+
-+ u32 buffer_size_recommended; /* Size of buffers the port
-+ * recommends for optimal
-+ * performance (RO). A value of
-+ * zero means no special
-+ * recommendation. This is set
-+ * by the component.
-+ */
-+
-+ u32 buffer_num; /* Actual number of buffers the port will use.
-+ * This is set by the client.
-+ */
-+
-+ u32 buffer_size; /* Actual maximum size of the buffers that
-+ * will be sent to the port. This is set by
-+ * the client.
-+ */
-+
-+ u32 component; /* Component this port belongs to (Read Only) */
-+
-+ u32 userdata; /* Field reserved for use by the client */
-+
-+ u32 capabilities; /* Flags describing the capabilities of a
-+ * port (RO). Bitwise combination of \ref
-+ * portcapabilities "Port capabilities"
-+ * values.
-+ */
-+};
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg.h
-@@ -0,0 +1,406 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ */
-+
-+/*
-+ * all the data structures which serialise the MMAL protocol. note
-+ * these are directly mapped onto the recived message data.
-+ *
-+ * BEWARE: They seem to *assume* pointers are u32 and that there is no
-+ * structure padding!
-+ *
-+ * NOTE: this implementation uses kernel types to ensure sizes. Rather
-+ * than assigning values to enums to force their size the
-+ * implementation uses fixed size types and not the enums (though the
-+ * comments have the actual enum type
-+ */
-+#ifndef MMAL_MSG_H
-+#define MMAL_MSG_H
-+
-+#define VC_MMAL_VER 15
-+#define VC_MMAL_MIN_VER 10
-+#define VC_MMAL_SERVER_NAME MAKE_FOURCC("mmal")
-+
-+/* max total message size is 512 bytes */
-+#define MMAL_MSG_MAX_SIZE 512
-+/* with six 32bit header elements max payload is therefore 488 bytes */
-+#define MMAL_MSG_MAX_PAYLOAD 488
-+
-+#include "mmal-msg-common.h"
-+#include "mmal-msg-format.h"
-+#include "mmal-msg-port.h"
-+
-+enum mmal_msg_type {
-+ MMAL_MSG_TYPE_QUIT = 1,
-+ MMAL_MSG_TYPE_SERVICE_CLOSED,
-+ MMAL_MSG_TYPE_GET_VERSION,
-+ MMAL_MSG_TYPE_COMPONENT_CREATE,
-+ MMAL_MSG_TYPE_COMPONENT_DESTROY, /* 5 */
-+ MMAL_MSG_TYPE_COMPONENT_ENABLE,
-+ MMAL_MSG_TYPE_COMPONENT_DISABLE,
-+ MMAL_MSG_TYPE_PORT_INFO_GET,
-+ MMAL_MSG_TYPE_PORT_INFO_SET,
-+ MMAL_MSG_TYPE_PORT_ACTION, /* 10 */
-+ MMAL_MSG_TYPE_BUFFER_FROM_HOST,
-+ MMAL_MSG_TYPE_BUFFER_TO_HOST,
-+ MMAL_MSG_TYPE_GET_STATS,
-+ MMAL_MSG_TYPE_PORT_PARAMETER_SET,
-+ MMAL_MSG_TYPE_PORT_PARAMETER_GET, /* 15 */
-+ MMAL_MSG_TYPE_EVENT_TO_HOST,
-+ MMAL_MSG_TYPE_GET_CORE_STATS_FOR_PORT,
-+ MMAL_MSG_TYPE_OPAQUE_ALLOCATOR,
-+ MMAL_MSG_TYPE_CONSUME_MEM,
-+ MMAL_MSG_TYPE_LMK, /* 20 */
-+ MMAL_MSG_TYPE_OPAQUE_ALLOCATOR_DESC,
-+ MMAL_MSG_TYPE_DRM_GET_LHS32,
-+ MMAL_MSG_TYPE_DRM_GET_TIME,
-+ MMAL_MSG_TYPE_BUFFER_FROM_HOST_ZEROLEN,
-+ MMAL_MSG_TYPE_PORT_FLUSH, /* 25 */
-+ MMAL_MSG_TYPE_HOST_LOG,
-+ MMAL_MSG_TYPE_MSG_LAST
-+};
-+
-+/* port action request messages differ depending on the action type */
-+enum mmal_msg_port_action_type {
-+ MMAL_MSG_PORT_ACTION_TYPE_UNKNOWN = 0, /* Unknown action */
-+ MMAL_MSG_PORT_ACTION_TYPE_ENABLE, /* Enable a port */
-+ MMAL_MSG_PORT_ACTION_TYPE_DISABLE, /* Disable a port */
-+ MMAL_MSG_PORT_ACTION_TYPE_FLUSH, /* Flush a port */
-+ MMAL_MSG_PORT_ACTION_TYPE_CONNECT, /* Connect ports */
-+ MMAL_MSG_PORT_ACTION_TYPE_DISCONNECT, /* Disconnect ports */
-+ MMAL_MSG_PORT_ACTION_TYPE_SET_REQUIREMENTS, /* Set buffer requirements*/
-+};
-+
-+struct mmal_msg_header {
-+ u32 magic;
-+ u32 type; /* enum mmal_msg_type */
-+
-+ /* Opaque handle to the control service */
-+ u32 control_service;
-+
-+ u32 context; /* a u32 per message context */
-+ u32 status; /* The status of the vchiq operation */
-+ u32 padding;
-+};
-+
-+/* Send from VC to host to report version */
-+struct mmal_msg_version {
-+ u32 flags;
-+ u32 major;
-+ u32 minor;
-+ u32 minimum;
-+};
-+
-+/* request to VC to create component */
-+struct mmal_msg_component_create {
-+ u32 client_component; /* component context */
-+ char name[128];
-+ u32 pid; /* For debug */
-+};
-+
-+/* reply from VC to component creation request */
-+struct mmal_msg_component_create_reply {
-+ u32 status; /* enum mmal_msg_status - how does this differ to
-+ * the one in the header?
-+ */
-+ u32 component_handle; /* VideoCore handle for component */
-+ u32 input_num; /* Number of input ports */
-+ u32 output_num; /* Number of output ports */
-+ u32 clock_num; /* Number of clock ports */
-+};
-+
-+/* request to VC to destroy a component */
-+struct mmal_msg_component_destroy {
-+ u32 component_handle;
-+};
-+
-+struct mmal_msg_component_destroy_reply {
-+ u32 status; /* The component destruction status */
-+};
-+
-+/* request and reply to VC to enable a component */
-+struct mmal_msg_component_enable {
-+ u32 component_handle;
-+};
-+
-+struct mmal_msg_component_enable_reply {
-+ u32 status; /* The component enable status */
-+};
-+
-+/* request and reply to VC to disable a component */
-+struct mmal_msg_component_disable {
-+ u32 component_handle;
-+};
-+
-+struct mmal_msg_component_disable_reply {
-+ u32 status; /* The component disable status */
-+};
-+
-+/* request to VC to get port information */
-+struct mmal_msg_port_info_get {
-+ u32 component_handle; /* component handle port is associated with */
-+ u32 port_type; /* enum mmal_msg_port_type */
-+ u32 index; /* port index to query */
-+};
-+
-+/* reply from VC to get port info request */
-+struct mmal_msg_port_info_get_reply {
-+ u32 status; /* enum mmal_msg_status */
-+ u32 component_handle; /* component handle port is associated with */
-+ u32 port_type; /* enum mmal_msg_port_type */
-+ u32 port_index; /* port indexed in query */
-+ s32 found; /* unused */
-+ u32 port_handle; /* Handle to use for this port */
-+ struct mmal_port port;
-+ struct mmal_es_format format; /* elementary stream format */
-+ union mmal_es_specific_format es; /* es type specific data */
-+ u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE]; /* es extra data */
-+};
-+
-+/* request to VC to set port information */
-+struct mmal_msg_port_info_set {
-+ u32 component_handle;
-+ u32 port_type; /* enum mmal_msg_port_type */
-+ u32 port_index; /* port indexed in query */
-+ struct mmal_port port;
-+ struct mmal_es_format format;
-+ union mmal_es_specific_format es;
-+ u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
-+};
-+
-+/* reply from VC to port info set request */
-+struct mmal_msg_port_info_set_reply {
-+ u32 status;
-+ u32 component_handle; /* component handle port is associated with */
-+ u32 port_type; /* enum mmal_msg_port_type */
-+ u32 index; /* port indexed in query */
-+ s32 found; /* unused */
-+ u32 port_handle; /* Handle to use for this port */
-+ struct mmal_port port;
-+ struct mmal_es_format format;
-+ union mmal_es_specific_format es;
-+ u8 extradata[MMAL_FORMAT_EXTRADATA_MAX_SIZE];
-+};
-+
-+/* port action requests that take a mmal_port as a parameter */
-+struct mmal_msg_port_action_port {
-+ u32 component_handle;
-+ u32 port_handle;
-+ u32 action; /* enum mmal_msg_port_action_type */
-+ struct mmal_port port;
-+};
-+
-+/* port action requests that take handles as a parameter */
-+struct mmal_msg_port_action_handle {
-+ u32 component_handle;
-+ u32 port_handle;
-+ u32 action; /* enum mmal_msg_port_action_type */
-+ u32 connect_component_handle;
-+ u32 connect_port_handle;
-+};
-+
-+struct mmal_msg_port_action_reply {
-+ u32 status; /* The port action operation status */
-+};
-+
-+/* MMAL buffer transfer */
-+
-+/* Size of space reserved in a buffer message for short messages. */
-+#define MMAL_VC_SHORT_DATA 128
-+
-+/* Signals that the current payload is the end of the stream of data */
-+#define MMAL_BUFFER_HEADER_FLAG_EOS BIT(0)
-+/* Signals that the start of the current payload starts a frame */
-+#define MMAL_BUFFER_HEADER_FLAG_FRAME_START BIT(1)
-+/* Signals that the end of the current payload ends a frame */
-+#define MMAL_BUFFER_HEADER_FLAG_FRAME_END BIT(2)
-+/* Signals that the current payload contains only complete frames (>1) */
-+#define MMAL_BUFFER_HEADER_FLAG_FRAME \
-+ (MMAL_BUFFER_HEADER_FLAG_FRAME_START | \
-+ MMAL_BUFFER_HEADER_FLAG_FRAME_END)
-+/* Signals that the current payload is a keyframe (i.e. self decodable) */
-+#define MMAL_BUFFER_HEADER_FLAG_KEYFRAME BIT(3)
-+/*
-+ * Signals a discontinuity in the stream of data (e.g. after a seek).
-+ * Can be used for instance by a decoder to reset its state
-+ */
-+#define MMAL_BUFFER_HEADER_FLAG_DISCONTINUITY BIT(4)
-+/*
-+ * Signals a buffer containing some kind of config data for the component
-+ * (e.g. codec config data)
-+ */
-+#define MMAL_BUFFER_HEADER_FLAG_CONFIG BIT(5)
-+/* Signals an encrypted payload */
-+#define MMAL_BUFFER_HEADER_FLAG_ENCRYPTED BIT(6)
-+/* Signals a buffer containing side information */
-+#define MMAL_BUFFER_HEADER_FLAG_CODECSIDEINFO BIT(7)
-+/*
-+ * Signals a buffer which is the snapshot/postview image from a stills
-+ * capture
-+ */
-+#define MMAL_BUFFER_HEADER_FLAGS_SNAPSHOT BIT(8)
-+/* Signals a buffer which contains data known to be corrupted */
-+#define MMAL_BUFFER_HEADER_FLAG_CORRUPTED BIT(9)
-+/* Signals that a buffer failed to be transmitted */
-+#define MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED BIT(10)
-+
-+struct mmal_driver_buffer {
-+ u32 magic;
-+ u32 component_handle;
-+ u32 port_handle;
-+ u32 client_context;
-+};
-+
-+/* buffer header */
-+struct mmal_buffer_header {
-+ u32 next; /* next header */
-+ u32 priv; /* framework private data */
-+ u32 cmd;
-+ u32 data;
-+ u32 alloc_size;
-+ u32 length;
-+ u32 offset;
-+ u32 flags;
-+ s64 pts;
-+ s64 dts;
-+ u32 type;
-+ u32 user_data;
-+};
-+
-+struct mmal_buffer_header_type_specific {
-+ union {
-+ struct {
-+ u32 planes;
-+ u32 offset[4];
-+ u32 pitch[4];
-+ u32 flags;
-+ } video;
-+ } u;
-+};
-+
-+struct mmal_msg_buffer_from_host {
-+ /*
-+ *The front 32 bytes of the buffer header are copied
-+ * back to us in the reply to allow for context. This
-+ * area is used to store two mmal_driver_buffer structures to
-+ * allow for multiple concurrent service users.
-+ */
-+ /* control data */
-+ struct mmal_driver_buffer drvbuf;
-+
-+ /* referenced control data for passthrough buffer management */
-+ struct mmal_driver_buffer drvbuf_ref;
-+ struct mmal_buffer_header buffer_header; /* buffer header itself */
-+ struct mmal_buffer_header_type_specific buffer_header_type_specific;
-+ s32 is_zero_copy;
-+ s32 has_reference;
-+
-+ /* allows short data to be xfered in control message */
-+ u32 payload_in_message;
-+ u8 short_data[MMAL_VC_SHORT_DATA];
-+};
-+
-+/* port parameter setting */
-+
-+#define MMAL_WORKER_PORT_PARAMETER_SPACE 96
-+
-+struct mmal_msg_port_parameter_set {
-+ u32 component_handle; /* component */
-+ u32 port_handle; /* port */
-+ u32 id; /* Parameter ID */
-+ u32 size; /* Parameter size */
-+ uint32_t value[MMAL_WORKER_PORT_PARAMETER_SPACE];
-+};
-+
-+struct mmal_msg_port_parameter_set_reply {
-+ u32 status; /* enum mmal_msg_status todo: how does this
-+ * differ to the one in the header?
-+ */
-+};
-+
-+/* port parameter getting */
-+
-+struct mmal_msg_port_parameter_get {
-+ u32 component_handle; /* component */
-+ u32 port_handle; /* port */
-+ u32 id; /* Parameter ID */
-+ u32 size; /* Parameter size */
-+};
-+
-+struct mmal_msg_port_parameter_get_reply {
-+ u32 status; /* Status of mmal_port_parameter_get call */
-+ u32 id; /* Parameter ID */
-+ u32 size; /* Parameter size */
-+ uint32_t value[MMAL_WORKER_PORT_PARAMETER_SPACE];
-+};
-+
-+/* event messages */
-+#define MMAL_WORKER_EVENT_SPACE 256
-+
-+struct mmal_msg_event_to_host {
-+ u32 client_component; /* component context */
-+
-+ u32 port_type;
-+ u32 port_num;
-+
-+ u32 cmd;
-+ u32 length;
-+ u8 data[MMAL_WORKER_EVENT_SPACE];
-+ u32 delayed_buffer;
-+};
-+
-+/* all mmal messages are serialised through this structure */
-+struct mmal_msg {
-+ /* header */
-+ struct mmal_msg_header h;
-+ /* payload */
-+ union {
-+ struct mmal_msg_version version;
-+
-+ struct mmal_msg_component_create component_create;
-+ struct mmal_msg_component_create_reply component_create_reply;
-+
-+ struct mmal_msg_component_destroy component_destroy;
-+ struct mmal_msg_component_destroy_reply component_destroy_reply;
-+
-+ struct mmal_msg_component_enable component_enable;
-+ struct mmal_msg_component_enable_reply component_enable_reply;
-+
-+ struct mmal_msg_component_disable component_disable;
-+ struct mmal_msg_component_disable_reply component_disable_reply;
-+
-+ struct mmal_msg_port_info_get port_info_get;
-+ struct mmal_msg_port_info_get_reply port_info_get_reply;
-+
-+ struct mmal_msg_port_info_set port_info_set;
-+ struct mmal_msg_port_info_set_reply port_info_set_reply;
-+
-+ struct mmal_msg_port_action_port port_action_port;
-+ struct mmal_msg_port_action_handle port_action_handle;
-+ struct mmal_msg_port_action_reply port_action_reply;
-+
-+ struct mmal_msg_buffer_from_host buffer_from_host;
-+
-+ struct mmal_msg_port_parameter_set port_parameter_set;
-+ struct mmal_msg_port_parameter_set_reply
-+ port_parameter_set_reply;
-+ struct mmal_msg_port_parameter_get
-+ port_parameter_get;
-+ struct mmal_msg_port_parameter_get_reply
-+ port_parameter_get_reply;
-+
-+ struct mmal_msg_event_to_host event_to_host;
-+
-+ u8 payload[MMAL_MSG_MAX_PAYLOAD];
-+ } u;
-+};
-+#endif
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
-@@ -0,0 +1,755 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ */
-+
-+/* common parameters */
-+
-+/** @name Parameter groups
-+ * Parameters are divided into groups, and then allocated sequentially within
-+ * a group using an enum.
-+ * @{
-+ */
-+
-+#ifndef MMAL_PARAMETERS_H
-+#define MMAL_PARAMETERS_H
-+
-+/** Common parameter ID group, used with many types of component. */
-+#define MMAL_PARAMETER_GROUP_COMMON (0 << 16)
-+/** Camera-specific parameter ID group. */
-+#define MMAL_PARAMETER_GROUP_CAMERA (1 << 16)
-+/** Video-specific parameter ID group. */
-+#define MMAL_PARAMETER_GROUP_VIDEO (2 << 16)
-+/** Audio-specific parameter ID group. */
-+#define MMAL_PARAMETER_GROUP_AUDIO (3 << 16)
-+/** Clock-specific parameter ID group. */
-+#define MMAL_PARAMETER_GROUP_CLOCK (4 << 16)
-+/** Miracast-specific parameter ID group. */
-+#define MMAL_PARAMETER_GROUP_MIRACAST (5 << 16)
-+
-+/* Common parameters */
-+enum mmal_parameter_common_type {
-+ /**< Never a valid parameter ID */
-+ MMAL_PARAMETER_UNUSED = MMAL_PARAMETER_GROUP_COMMON,
-+
-+ /**< MMAL_PARAMETER_ENCODING_T */
-+ MMAL_PARAMETER_SUPPORTED_ENCODINGS,
-+ /**< MMAL_PARAMETER_URI_T */
-+ MMAL_PARAMETER_URI,
-+ /** MMAL_PARAMETER_CHANGE_EVENT_REQUEST_T */
-+ MMAL_PARAMETER_CHANGE_EVENT_REQUEST,
-+ /** MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_ZERO_COPY,
-+ /**< MMAL_PARAMETER_BUFFER_REQUIREMENTS_T */
-+ MMAL_PARAMETER_BUFFER_REQUIREMENTS,
-+ /**< MMAL_PARAMETER_STATISTICS_T */
-+ MMAL_PARAMETER_STATISTICS,
-+ /**< MMAL_PARAMETER_CORE_STATISTICS_T */
-+ MMAL_PARAMETER_CORE_STATISTICS,
-+ /**< MMAL_PARAMETER_MEM_USAGE_T */
-+ MMAL_PARAMETER_MEM_USAGE,
-+ /**< MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_BUFFER_FLAG_FILTER,
-+ /**< MMAL_PARAMETER_SEEK_T */
-+ MMAL_PARAMETER_SEEK,
-+ /**< MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_POWERMON_ENABLE,
-+ /**< MMAL_PARAMETER_LOGGING_T */
-+ MMAL_PARAMETER_LOGGING,
-+ /**< MMAL_PARAMETER_UINT64_T */
-+ MMAL_PARAMETER_SYSTEM_TIME,
-+ /**< MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_NO_IMAGE_PADDING,
-+};
-+
-+/* camera parameters */
-+
-+enum mmal_parameter_camera_type {
-+ /* 0 */
-+ /** @ref MMAL_PARAMETER_THUMBNAIL_CONFIG_T */
-+ MMAL_PARAMETER_THUMBNAIL_CONFIGURATION =
-+ MMAL_PARAMETER_GROUP_CAMERA,
-+ /**< Unused? */
-+ MMAL_PARAMETER_CAPTURE_QUALITY,
-+ /**< @ref MMAL_PARAMETER_INT32_T */
-+ MMAL_PARAMETER_ROTATION,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_EXIF_DISABLE,
-+ /**< @ref MMAL_PARAMETER_EXIF_T */
-+ MMAL_PARAMETER_EXIF,
-+ /**< @ref MMAL_PARAM_AWBMODE_T */
-+ MMAL_PARAMETER_AWB_MODE,
-+ /**< @ref MMAL_PARAMETER_IMAGEFX_T */
-+ MMAL_PARAMETER_IMAGE_EFFECT,
-+ /**< @ref MMAL_PARAMETER_COLOURFX_T */
-+ MMAL_PARAMETER_COLOUR_EFFECT,
-+ /**< @ref MMAL_PARAMETER_FLICKERAVOID_T */
-+ MMAL_PARAMETER_FLICKER_AVOID,
-+ /**< @ref MMAL_PARAMETER_FLASH_T */
-+ MMAL_PARAMETER_FLASH,
-+ /**< @ref MMAL_PARAMETER_REDEYE_T */
-+ MMAL_PARAMETER_REDEYE,
-+ /**< @ref MMAL_PARAMETER_FOCUS_T */
-+ MMAL_PARAMETER_FOCUS,
-+ /**< Unused? */
-+ MMAL_PARAMETER_FOCAL_LENGTHS,
-+ /**< @ref MMAL_PARAMETER_INT32_T */
-+ MMAL_PARAMETER_EXPOSURE_COMP,
-+ /**< @ref MMAL_PARAMETER_SCALEFACTOR_T */
-+ MMAL_PARAMETER_ZOOM,
-+ /**< @ref MMAL_PARAMETER_MIRROR_T */
-+ MMAL_PARAMETER_MIRROR,
-+
-+ /* 0x10 */
-+ /**< @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_CAMERA_NUM,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_CAPTURE,
-+ /**< @ref MMAL_PARAMETER_EXPOSUREMODE_T */
-+ MMAL_PARAMETER_EXPOSURE_MODE,
-+ /**< @ref MMAL_PARAMETER_EXPOSUREMETERINGMODE_T */
-+ MMAL_PARAMETER_EXP_METERING_MODE,
-+ /**< @ref MMAL_PARAMETER_FOCUS_STATUS_T */
-+ MMAL_PARAMETER_FOCUS_STATUS,
-+ /**< @ref MMAL_PARAMETER_CAMERA_CONFIG_T */
-+ MMAL_PARAMETER_CAMERA_CONFIG,
-+ /**< @ref MMAL_PARAMETER_CAPTURE_STATUS_T */
-+ MMAL_PARAMETER_CAPTURE_STATUS,
-+ /**< @ref MMAL_PARAMETER_FACE_TRACK_T */
-+ MMAL_PARAMETER_FACE_TRACK,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_DRAW_BOX_FACES_AND_FOCUS,
-+ /**< @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_JPEG_Q_FACTOR,
-+ /**< @ref MMAL_PARAMETER_FRAME_RATE_T */
-+ MMAL_PARAMETER_FRAME_RATE,
-+ /**< @ref MMAL_PARAMETER_CAMERA_STC_MODE_T */
-+ MMAL_PARAMETER_USE_STC,
-+ /**< @ref MMAL_PARAMETER_CAMERA_INFO_T */
-+ MMAL_PARAMETER_CAMERA_INFO,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_STABILISATION,
-+ /**< @ref MMAL_PARAMETER_FACE_TRACK_RESULTS_T */
-+ MMAL_PARAMETER_FACE_TRACK_RESULTS,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_ENABLE_RAW_CAPTURE,
-+
-+ /* 0x20 */
-+ /**< @ref MMAL_PARAMETER_URI_T */
-+ MMAL_PARAMETER_DPF_FILE,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_ENABLE_DPF_FILE,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_DPF_FAIL_IS_FATAL,
-+ /**< @ref MMAL_PARAMETER_CAPTUREMODE_T */
-+ MMAL_PARAMETER_CAPTURE_MODE,
-+ /**< @ref MMAL_PARAMETER_FOCUS_REGIONS_T */
-+ MMAL_PARAMETER_FOCUS_REGIONS,
-+ /**< @ref MMAL_PARAMETER_INPUT_CROP_T */
-+ MMAL_PARAMETER_INPUT_CROP,
-+ /**< @ref MMAL_PARAMETER_SENSOR_INFORMATION_T */
-+ MMAL_PARAMETER_SENSOR_INFORMATION,
-+ /**< @ref MMAL_PARAMETER_FLASH_SELECT_T */
-+ MMAL_PARAMETER_FLASH_SELECT,
-+ /**< @ref MMAL_PARAMETER_FIELD_OF_VIEW_T */
-+ MMAL_PARAMETER_FIELD_OF_VIEW,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_HIGH_DYNAMIC_RANGE,
-+ /**< @ref MMAL_PARAMETER_DRC_T */
-+ MMAL_PARAMETER_DYNAMIC_RANGE_COMPRESSION,
-+ /**< @ref MMAL_PARAMETER_ALGORITHM_CONTROL_T */
-+ MMAL_PARAMETER_ALGORITHM_CONTROL,
-+ /**< @ref MMAL_PARAMETER_RATIONAL_T */
-+ MMAL_PARAMETER_SHARPNESS,
-+ /**< @ref MMAL_PARAMETER_RATIONAL_T */
-+ MMAL_PARAMETER_CONTRAST,
-+ /**< @ref MMAL_PARAMETER_RATIONAL_T */
-+ MMAL_PARAMETER_BRIGHTNESS,
-+ /**< @ref MMAL_PARAMETER_RATIONAL_T */
-+ MMAL_PARAMETER_SATURATION,
-+
-+ /* 0x30 */
-+ /**< @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_ISO,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_ANTISHAKE,
-+ /** @ref MMAL_PARAMETER_IMAGEFX_PARAMETERS_T */
-+ MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_CAMERA_BURST_CAPTURE,
-+ /** @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_CAMERA_MIN_ISO,
-+ /** @ref MMAL_PARAMETER_CAMERA_USE_CASE_T */
-+ MMAL_PARAMETER_CAMERA_USE_CASE,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_CAPTURE_STATS_PASS,
-+ /** @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_CAMERA_CUSTOM_SENSOR_CONFIG,
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_ENABLE_REGISTER_FILE,
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_REGISTER_FAIL_IS_FATAL,
-+ /** @ref MMAL_PARAMETER_CONFIGFILE_T */
-+ MMAL_PARAMETER_CONFIGFILE_REGISTERS,
-+ /** @ref MMAL_PARAMETER_CONFIGFILE_CHUNK_T */
-+ MMAL_PARAMETER_CONFIGFILE_CHUNK_REGISTERS,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_JPEG_ATTACH_LOG,
-+ /**< @ref MMAL_PARAMETER_ZEROSHUTTERLAG_T */
-+ MMAL_PARAMETER_ZERO_SHUTTER_LAG,
-+ /**< @ref MMAL_PARAMETER_FPS_RANGE_T */
-+ MMAL_PARAMETER_FPS_RANGE,
-+ /**< @ref MMAL_PARAMETER_INT32_T */
-+ MMAL_PARAMETER_CAPTURE_EXPOSURE_COMP,
-+
-+ /* 0x40 */
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_SW_SHARPEN_DISABLE,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_FLASH_REQUIRED,
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_SW_SATURATION_DISABLE,
-+ /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_SHUTTER_SPEED,
-+ /**< Takes a @ref MMAL_PARAMETER_AWB_GAINS_T */
-+ MMAL_PARAMETER_CUSTOM_AWB_GAINS,
-+};
-+
-+struct mmal_parameter_rational {
-+ s32 num; /**< Numerator */
-+ s32 den; /**< Denominator */
-+};
-+
-+enum mmal_parameter_camera_config_timestamp_mode {
-+ MMAL_PARAM_TIMESTAMP_MODE_ZERO = 0, /* Always timestamp frames as 0 */
-+ MMAL_PARAM_TIMESTAMP_MODE_RAW_STC, /* Use the raw STC value
-+ * for the frame timestamp
-+ */
-+ MMAL_PARAM_TIMESTAMP_MODE_RESET_STC, /* Use the STC timestamp
-+ * but subtract the
-+ * timestamp of the first
-+ * frame sent to give a
-+ * zero based timestamp.
-+ */
-+};
-+
-+struct mmal_parameter_fps_range {
-+ /**< Low end of the permitted framerate range */
-+ struct mmal_parameter_rational fps_low;
-+ /**< High end of the permitted framerate range */
-+ struct mmal_parameter_rational fps_high;
-+};
-+
-+/* camera configuration parameter */
-+struct mmal_parameter_camera_config {
-+ /* Parameters for setting up the image pools */
-+ u32 max_stills_w; /* Max size of stills capture */
-+ u32 max_stills_h;
-+ u32 stills_yuv422; /* Allow YUV422 stills capture */
-+ u32 one_shot_stills; /* Continuous or one shot stills captures. */
-+
-+ u32 max_preview_video_w; /* Max size of the preview or video
-+ * capture frames
-+ */
-+ u32 max_preview_video_h;
-+ u32 num_preview_video_frames;
-+
-+ /** Sets the height of the circular buffer for stills capture. */
-+ u32 stills_capture_circular_buffer_height;
-+
-+ /** Allows preview/encode to resume as fast as possible after the stills
-+ * input frame has been received, and then processes the still frame in
-+ * the background whilst preview/encode has resumed.
-+ * Actual mode is controlled by MMAL_PARAMETER_CAPTURE_MODE.
-+ */
-+ u32 fast_preview_resume;
-+
-+ /** Selects algorithm for timestamping frames if
-+ * there is no clock component connected.
-+ * enum mmal_parameter_camera_config_timestamp_mode
-+ */
-+ s32 use_stc_timestamp;
-+};
-+
-+enum mmal_parameter_exposuremode {
-+ MMAL_PARAM_EXPOSUREMODE_OFF,
-+ MMAL_PARAM_EXPOSUREMODE_AUTO,
-+ MMAL_PARAM_EXPOSUREMODE_NIGHT,
-+ MMAL_PARAM_EXPOSUREMODE_NIGHTPREVIEW,
-+ MMAL_PARAM_EXPOSUREMODE_BACKLIGHT,
-+ MMAL_PARAM_EXPOSUREMODE_SPOTLIGHT,
-+ MMAL_PARAM_EXPOSUREMODE_SPORTS,
-+ MMAL_PARAM_EXPOSUREMODE_SNOW,
-+ MMAL_PARAM_EXPOSUREMODE_BEACH,
-+ MMAL_PARAM_EXPOSUREMODE_VERYLONG,
-+ MMAL_PARAM_EXPOSUREMODE_FIXEDFPS,
-+ MMAL_PARAM_EXPOSUREMODE_ANTISHAKE,
-+ MMAL_PARAM_EXPOSUREMODE_FIREWORKS,
-+};
-+
-+enum mmal_parameter_exposuremeteringmode {
-+ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE,
-+ MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT,
-+ MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT,
-+ MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX,
-+};
-+
-+enum mmal_parameter_awbmode {
-+ MMAL_PARAM_AWBMODE_OFF,
-+ MMAL_PARAM_AWBMODE_AUTO,
-+ MMAL_PARAM_AWBMODE_SUNLIGHT,
-+ MMAL_PARAM_AWBMODE_CLOUDY,
-+ MMAL_PARAM_AWBMODE_SHADE,
-+ MMAL_PARAM_AWBMODE_TUNGSTEN,
-+ MMAL_PARAM_AWBMODE_FLUORESCENT,
-+ MMAL_PARAM_AWBMODE_INCANDESCENT,
-+ MMAL_PARAM_AWBMODE_FLASH,
-+ MMAL_PARAM_AWBMODE_HORIZON,
-+};
-+
-+enum mmal_parameter_imagefx {
-+ MMAL_PARAM_IMAGEFX_NONE,
-+ MMAL_PARAM_IMAGEFX_NEGATIVE,
-+ MMAL_PARAM_IMAGEFX_SOLARIZE,
-+ MMAL_PARAM_IMAGEFX_POSTERIZE,
-+ MMAL_PARAM_IMAGEFX_WHITEBOARD,
-+ MMAL_PARAM_IMAGEFX_BLACKBOARD,
-+ MMAL_PARAM_IMAGEFX_SKETCH,
-+ MMAL_PARAM_IMAGEFX_DENOISE,
-+ MMAL_PARAM_IMAGEFX_EMBOSS,
-+ MMAL_PARAM_IMAGEFX_OILPAINT,
-+ MMAL_PARAM_IMAGEFX_HATCH,
-+ MMAL_PARAM_IMAGEFX_GPEN,
-+ MMAL_PARAM_IMAGEFX_PASTEL,
-+ MMAL_PARAM_IMAGEFX_WATERCOLOUR,
-+ MMAL_PARAM_IMAGEFX_FILM,
-+ MMAL_PARAM_IMAGEFX_BLUR,
-+ MMAL_PARAM_IMAGEFX_SATURATION,
-+ MMAL_PARAM_IMAGEFX_COLOURSWAP,
-+ MMAL_PARAM_IMAGEFX_WASHEDOUT,
-+ MMAL_PARAM_IMAGEFX_POSTERISE,
-+ MMAL_PARAM_IMAGEFX_COLOURPOINT,
-+ MMAL_PARAM_IMAGEFX_COLOURBALANCE,
-+ MMAL_PARAM_IMAGEFX_CARTOON,
-+};
-+
-+enum MMAL_PARAM_FLICKERAVOID_T {
-+ MMAL_PARAM_FLICKERAVOID_OFF,
-+ MMAL_PARAM_FLICKERAVOID_AUTO,
-+ MMAL_PARAM_FLICKERAVOID_50HZ,
-+ MMAL_PARAM_FLICKERAVOID_60HZ,
-+ MMAL_PARAM_FLICKERAVOID_MAX = 0x7FFFFFFF
-+};
-+
-+struct mmal_parameter_awbgains {
-+ struct mmal_parameter_rational r_gain; /**< Red gain */
-+ struct mmal_parameter_rational b_gain; /**< Blue gain */
-+};
-+
-+/** Manner of video rate control */
-+enum mmal_parameter_rate_control_mode {
-+ MMAL_VIDEO_RATECONTROL_DEFAULT,
-+ MMAL_VIDEO_RATECONTROL_VARIABLE,
-+ MMAL_VIDEO_RATECONTROL_CONSTANT,
-+ MMAL_VIDEO_RATECONTROL_VARIABLE_SKIP_FRAMES,
-+ MMAL_VIDEO_RATECONTROL_CONSTANT_SKIP_FRAMES
-+};
-+
-+enum mmal_video_profile {
-+ MMAL_VIDEO_PROFILE_H263_BASELINE,
-+ MMAL_VIDEO_PROFILE_H263_H320CODING,
-+ MMAL_VIDEO_PROFILE_H263_BACKWARDCOMPATIBLE,
-+ MMAL_VIDEO_PROFILE_H263_ISWV2,
-+ MMAL_VIDEO_PROFILE_H263_ISWV3,
-+ MMAL_VIDEO_PROFILE_H263_HIGHCOMPRESSION,
-+ MMAL_VIDEO_PROFILE_H263_INTERNET,
-+ MMAL_VIDEO_PROFILE_H263_INTERLACE,
-+ MMAL_VIDEO_PROFILE_H263_HIGHLATENCY,
-+ MMAL_VIDEO_PROFILE_MP4V_SIMPLE,
-+ MMAL_VIDEO_PROFILE_MP4V_SIMPLESCALABLE,
-+ MMAL_VIDEO_PROFILE_MP4V_CORE,
-+ MMAL_VIDEO_PROFILE_MP4V_MAIN,
-+ MMAL_VIDEO_PROFILE_MP4V_NBIT,
-+ MMAL_VIDEO_PROFILE_MP4V_SCALABLETEXTURE,
-+ MMAL_VIDEO_PROFILE_MP4V_SIMPLEFACE,
-+ MMAL_VIDEO_PROFILE_MP4V_SIMPLEFBA,
-+ MMAL_VIDEO_PROFILE_MP4V_BASICANIMATED,
-+ MMAL_VIDEO_PROFILE_MP4V_HYBRID,
-+ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDREALTIME,
-+ MMAL_VIDEO_PROFILE_MP4V_CORESCALABLE,
-+ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCODING,
-+ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCORE,
-+ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSCALABLE,
-+ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSIMPLE,
-+ MMAL_VIDEO_PROFILE_H264_BASELINE,
-+ MMAL_VIDEO_PROFILE_H264_MAIN,
-+ MMAL_VIDEO_PROFILE_H264_EXTENDED,
-+ MMAL_VIDEO_PROFILE_H264_HIGH,
-+ MMAL_VIDEO_PROFILE_H264_HIGH10,
-+ MMAL_VIDEO_PROFILE_H264_HIGH422,
-+ MMAL_VIDEO_PROFILE_H264_HIGH444,
-+ MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE,
-+ MMAL_VIDEO_PROFILE_DUMMY = 0x7FFFFFFF
-+};
-+
-+enum mmal_video_level {
-+ MMAL_VIDEO_LEVEL_H263_10,
-+ MMAL_VIDEO_LEVEL_H263_20,
-+ MMAL_VIDEO_LEVEL_H263_30,
-+ MMAL_VIDEO_LEVEL_H263_40,
-+ MMAL_VIDEO_LEVEL_H263_45,
-+ MMAL_VIDEO_LEVEL_H263_50,
-+ MMAL_VIDEO_LEVEL_H263_60,
-+ MMAL_VIDEO_LEVEL_H263_70,
-+ MMAL_VIDEO_LEVEL_MP4V_0,
-+ MMAL_VIDEO_LEVEL_MP4V_0b,
-+ MMAL_VIDEO_LEVEL_MP4V_1,
-+ MMAL_VIDEO_LEVEL_MP4V_2,
-+ MMAL_VIDEO_LEVEL_MP4V_3,
-+ MMAL_VIDEO_LEVEL_MP4V_4,
-+ MMAL_VIDEO_LEVEL_MP4V_4a,
-+ MMAL_VIDEO_LEVEL_MP4V_5,
-+ MMAL_VIDEO_LEVEL_MP4V_6,
-+ MMAL_VIDEO_LEVEL_H264_1,
-+ MMAL_VIDEO_LEVEL_H264_1b,
-+ MMAL_VIDEO_LEVEL_H264_11,
-+ MMAL_VIDEO_LEVEL_H264_12,
-+ MMAL_VIDEO_LEVEL_H264_13,
-+ MMAL_VIDEO_LEVEL_H264_2,
-+ MMAL_VIDEO_LEVEL_H264_21,
-+ MMAL_VIDEO_LEVEL_H264_22,
-+ MMAL_VIDEO_LEVEL_H264_3,
-+ MMAL_VIDEO_LEVEL_H264_31,
-+ MMAL_VIDEO_LEVEL_H264_32,
-+ MMAL_VIDEO_LEVEL_H264_4,
-+ MMAL_VIDEO_LEVEL_H264_41,
-+ MMAL_VIDEO_LEVEL_H264_42,
-+ MMAL_VIDEO_LEVEL_H264_5,
-+ MMAL_VIDEO_LEVEL_H264_51,
-+ MMAL_VIDEO_LEVEL_DUMMY = 0x7FFFFFFF
-+};
-+
-+struct mmal_parameter_video_profile {
-+ enum mmal_video_profile profile;
-+ enum mmal_video_level level;
-+};
-+
-+/* video parameters */
-+
-+enum mmal_parameter_video_type {
-+ /** @ref MMAL_DISPLAYREGION_T */
-+ MMAL_PARAMETER_DISPLAYREGION = MMAL_PARAMETER_GROUP_VIDEO,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_PROFILE_T */
-+ MMAL_PARAMETER_SUPPORTED_PROFILES,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_PROFILE_T */
-+ MMAL_PARAMETER_PROFILE,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_INTRAPERIOD,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_RATECONTROL_T */
-+ MMAL_PARAMETER_RATECONTROL,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_NALUNITFORMAT_T */
-+ MMAL_PARAMETER_NALUNITFORMAT,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_MINIMISE_FRAGMENTATION,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T.
-+ * Setting the value to zero resets to the default (one slice per
-+ * frame).
-+ */
-+ MMAL_PARAMETER_MB_ROWS_PER_SLICE,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_LEVEL_EXTENSION_T */
-+ MMAL_PARAMETER_VIDEO_LEVEL_EXTENSION,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_EEDE_ENABLE_T */
-+ MMAL_PARAMETER_VIDEO_EEDE_ENABLE,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_EEDE_LOSSRATE_T */
-+ MMAL_PARAMETER_VIDEO_EEDE_LOSSRATE,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T. Request an I-frame. */
-+ MMAL_PARAMETER_VIDEO_REQUEST_I_FRAME,
-+ /** @ref MMAL_PARAMETER_VIDEO_INTRA_REFRESH_T */
-+ MMAL_PARAMETER_VIDEO_INTRA_REFRESH,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-+ MMAL_PARAMETER_VIDEO_IMMUTABLE_INPUT,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T. Run-time bit rate control */
-+ MMAL_PARAMETER_VIDEO_BIT_RATE,
-+
-+ /** @ref MMAL_PARAMETER_FRAME_RATE_T */
-+ MMAL_PARAMETER_VIDEO_FRAME_RATE,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_MIN_QUANT,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_MAX_QUANT,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_ENCODE_RC_MODEL_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_RC_MODEL,
-+
-+ MMAL_PARAMETER_EXTRA_BUFFERS, /**< @ref MMAL_PARAMETER_UINT32_T. */
-+ /** @ref MMAL_PARAMETER_UINT32_T.
-+ * Changing this parameter from the default can reduce frame rate
-+ * because image buffers need to be re-pitched.
-+ */
-+ MMAL_PARAMETER_VIDEO_ALIGN_HORIZ,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T.
-+ * Changing this parameter from the default can reduce frame rate
-+ * because image buffers need to be re-pitched.
-+ */
-+ MMAL_PARAMETER_VIDEO_ALIGN_VERT,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-+ MMAL_PARAMETER_VIDEO_DROPPABLE_PFRAMES,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_INITIAL_QUANT,
-+
-+ /**< @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_QP_P,
-+
-+ /**< @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_RC_SLICE_DQUANT,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T */
-+ MMAL_PARAMETER_VIDEO_ENCODE_FRAME_LIMIT_BITS,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_PEAK_RATE,
-+
-+ /* H264 specific parameters */
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_DISABLE_CABAC,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_LATENCY,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_AU_DELIMITERS,
-+
-+ /** @ref MMAL_PARAMETER_UINT32_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_DEBLOCK_IDC,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_ENCODER_H264_MB_INTRA_MODES_T. */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_MB_INTRA_MODE,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_ENCODE_HEADER_ON_OPEN,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_ENCODE_PRECODE_FOR_QP,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_DRM_INIT_INFO_T. */
-+ MMAL_PARAMETER_VIDEO_DRM_INIT_INFO,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_TIMESTAMP_FIFO,
-+
-+ /** @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_DECODE_ERROR_CONCEALMENT,
-+
-+ /** @ref MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER_T. */
-+ MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER,
-+
-+ /** @ref MMAL_PARAMETER_BYTES_T */
-+ MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3,
-+
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_VCL_HRD_PARAMETERS,
-+
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_DELAY_HRD_FLAG,
-+
-+ /**< @ref MMAL_PARAMETER_BOOLEAN_T */
-+ MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER
-+};
-+
-+/** Valid mirror modes */
-+enum mmal_parameter_mirror {
-+ MMAL_PARAM_MIRROR_NONE,
-+ MMAL_PARAM_MIRROR_VERTICAL,
-+ MMAL_PARAM_MIRROR_HORIZONTAL,
-+ MMAL_PARAM_MIRROR_BOTH,
-+};
-+
-+enum mmal_parameter_displaytransform {
-+ MMAL_DISPLAY_ROT0 = 0,
-+ MMAL_DISPLAY_MIRROR_ROT0 = 1,
-+ MMAL_DISPLAY_MIRROR_ROT180 = 2,
-+ MMAL_DISPLAY_ROT180 = 3,
-+ MMAL_DISPLAY_MIRROR_ROT90 = 4,
-+ MMAL_DISPLAY_ROT270 = 5,
-+ MMAL_DISPLAY_ROT90 = 6,
-+ MMAL_DISPLAY_MIRROR_ROT270 = 7,
-+};
-+
-+enum mmal_parameter_displaymode {
-+ MMAL_DISPLAY_MODE_FILL = 0,
-+ MMAL_DISPLAY_MODE_LETTERBOX = 1,
-+};
-+
-+enum mmal_parameter_displayset {
-+ MMAL_DISPLAY_SET_NONE = 0,
-+ MMAL_DISPLAY_SET_NUM = 1,
-+ MMAL_DISPLAY_SET_FULLSCREEN = 2,
-+ MMAL_DISPLAY_SET_TRANSFORM = 4,
-+ MMAL_DISPLAY_SET_DEST_RECT = 8,
-+ MMAL_DISPLAY_SET_SRC_RECT = 0x10,
-+ MMAL_DISPLAY_SET_MODE = 0x20,
-+ MMAL_DISPLAY_SET_PIXEL = 0x40,
-+ MMAL_DISPLAY_SET_NOASPECT = 0x80,
-+ MMAL_DISPLAY_SET_LAYER = 0x100,
-+ MMAL_DISPLAY_SET_COPYPROTECT = 0x200,
-+ MMAL_DISPLAY_SET_ALPHA = 0x400,
-+};
-+
-+/* rectangle, used lots so it gets its own struct */
-+struct vchiq_mmal_rect {
-+ s32 x;
-+ s32 y;
-+ s32 width;
-+ s32 height;
-+};
-+
-+struct mmal_parameter_displayregion {
-+ /** Bitfield that indicates which fields are set and should be
-+ * used. All other fields will maintain their current value.
-+ * \ref MMAL_DISPLAYSET_T defines the bits that can be
-+ * combined.
-+ */
-+ u32 set;
-+
-+ /** Describes the display output device, with 0 typically
-+ * being a directly connected LCD display. The actual values
-+ * will depend on the hardware. Code using hard-wired numbers
-+ * (e.g. 2) is certain to fail.
-+ */
-+
-+ u32 display_num;
-+ /** Indicates that we are using the full device screen area,
-+ * rather than a window of the display. If zero, then
-+ * dest_rect is used to specify a region of the display to
-+ * use.
-+ */
-+
-+ s32 fullscreen;
-+ /** Indicates any rotation or flipping used to map frames onto
-+ * the natural display orientation.
-+ */
-+ u32 transform; /* enum mmal_parameter_displaytransform */
-+
-+ /** Where to display the frame within the screen, if
-+ * fullscreen is zero.
-+ */
-+ struct vchiq_mmal_rect dest_rect;
-+
-+ /** Indicates which area of the frame to display. If all
-+ * values are zero, the whole frame will be used.
-+ */
-+ struct vchiq_mmal_rect src_rect;
-+
-+ /** If set to non-zero, indicates that any display scaling
-+ * should disregard the aspect ratio of the frame region being
-+ * displayed.
-+ */
-+ s32 noaspect;
-+
-+ /** Indicates how the image should be scaled to fit the
-+ * display. \code MMAL_DISPLAY_MODE_FILL \endcode indicates
-+ * that the image should fill the screen by potentially
-+ * cropping the frames. Setting \code mode \endcode to \code
-+ * MMAL_DISPLAY_MODE_LETTERBOX \endcode indicates that all the
-+ * source region should be displayed and black bars added if
-+ * necessary.
-+ */
-+ u32 mode; /* enum mmal_parameter_displaymode */
-+
-+ /** If non-zero, defines the width of a source pixel relative
-+ * to \code pixel_y \endcode. If zero, then pixels default to
-+ * being square.
-+ */
-+ u32 pixel_x;
-+
-+ /** If non-zero, defines the height of a source pixel relative
-+ * to \code pixel_x \endcode. If zero, then pixels default to
-+ * being square.
-+ */
-+ u32 pixel_y;
-+
-+ /** Sets the relative depth of the images, with greater values
-+ * being in front of smaller values.
-+ */
-+ u32 layer;
-+
-+ /** Set to non-zero to ensure copy protection is used on
-+ * output.
-+ */
-+ s32 copyprotect_required;
-+
-+ /** Level of opacity of the layer, where zero is fully
-+ * transparent and 255 is fully opaque.
-+ */
-+ u32 alpha;
-+};
-+
-+#define MMAL_MAX_IMAGEFX_PARAMETERS 5
-+
-+struct mmal_parameter_imagefx_parameters {
-+ enum mmal_parameter_imagefx effect;
-+ u32 num_effect_params;
-+ u32 effect_parameter[MMAL_MAX_IMAGEFX_PARAMETERS];
-+};
-+
-+#define MMAL_PARAMETER_CAMERA_INFO_MAX_CAMERAS 4
-+#define MMAL_PARAMETER_CAMERA_INFO_MAX_FLASHES 2
-+#define MMAL_PARAMETER_CAMERA_INFO_MAX_STR_LEN 16
-+
-+struct mmal_parameter_camera_info_camera_t {
-+ u32 port_id;
-+ u32 max_width;
-+ u32 max_height;
-+ u32 lens_present;
-+ u8 camera_name[MMAL_PARAMETER_CAMERA_INFO_MAX_STR_LEN];
-+};
-+
-+enum mmal_parameter_camera_info_flash_type_t {
-+ /* Make values explicit to ensure they match values in config ini */
-+ MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_XENON = 0,
-+ MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_LED = 1,
-+ MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_OTHER = 2,
-+ MMAL_PARAMETER_CAMERA_INFO_FLASH_TYPE_MAX = 0x7FFFFFFF
-+};
-+
-+struct mmal_parameter_camera_info_flash_t {
-+ enum mmal_parameter_camera_info_flash_type_t flash_type;
-+};
-+
-+struct mmal_parameter_camera_info_t {
-+ u32 num_cameras;
-+ u32 num_flashes;
-+ struct mmal_parameter_camera_info_camera_t
-+ cameras[MMAL_PARAMETER_CAMERA_INFO_MAX_CAMERAS];
-+ struct mmal_parameter_camera_info_flash_t
-+ flashes[MMAL_PARAMETER_CAMERA_INFO_MAX_FLASHES];
-+};
-+
-+#endif
---- /dev/null
-+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
-@@ -0,0 +1,166 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Broadcom BM2835 V4L2 driver
-+ *
-+ * Copyright © 2013 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Authors: Vincent Sanders @ Collabora
-+ * Dave Stevenson @ Broadcom
-+ * (now dave.stevenson@raspberrypi.org)
-+ * Simon Mellor @ Broadcom
-+ * Luke Diamand @ Broadcom
-+ *
-+ * MMAL interface to VCHIQ message passing
-+ */
-+
-+#ifndef MMAL_VCHIQ_H
-+#define MMAL_VCHIQ_H
-+
-+#include "mmal-msg-format.h"
-+
-+#define MAX_PORT_COUNT 4
-+
-+/* Maximum size of the format extradata. */
-+#define MMAL_FORMAT_EXTRADATA_MAX_SIZE 128
-+
-+struct vchiq_mmal_instance;
-+
-+enum vchiq_mmal_es_type {
-+ MMAL_ES_TYPE_UNKNOWN, /**< Unknown elementary stream type */
-+ MMAL_ES_TYPE_CONTROL, /**< Elementary stream of control commands */
-+ MMAL_ES_TYPE_AUDIO, /**< Audio elementary stream */
-+ MMAL_ES_TYPE_VIDEO, /**< Video elementary stream */
-+ MMAL_ES_TYPE_SUBPICTURE /**< Sub-picture elementary stream */
-+};
-+
-+struct vchiq_mmal_port_buffer {
-+ unsigned int num; /* number of buffers */
-+ u32 size; /* size of buffers */
-+ u32 alignment; /* alignment of buffers */
-+};
-+
-+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);
-+
-+struct vchiq_mmal_port {
-+ bool enabled;
-+ u32 handle;
-+ u32 type; /* port type, cached to use on port info set */
-+ u32 index; /* port index, cached to use on port info set */
-+
-+ /* component port belongs to, allows simple deref */
-+ struct vchiq_mmal_component *component;
-+
-+ struct vchiq_mmal_port *connected; /* port conencted to */
-+
-+ /* buffer info */
-+ struct vchiq_mmal_port_buffer minimum_buffer;
-+ struct vchiq_mmal_port_buffer recommended_buffer;
-+ struct vchiq_mmal_port_buffer current_buffer;
-+
-+ /* stream format */
-+ struct mmal_es_format_local format;
-+ /* elementary stream format */
-+ union mmal_es_specific_format es;
-+
-+ /* data buffers to fill */
-+ struct list_head buffers;
-+ /* lock to serialise adding and removing buffers from list */
-+ spinlock_t slock;
-+
-+ /* Count of buffers the VPU has yet to return */
-+ atomic_t buffers_with_vpu;
-+ /* callback on buffer completion */
-+ vchiq_mmal_buffer_cb buffer_cb;
-+ /* callback context */
-+ void *cb_ctx;
-+};
-+
-+struct vchiq_mmal_component {
-+ bool enabled;
-+ u32 handle; /* VideoCore handle for component */
-+ u32 inputs; /* Number of input ports */
-+ u32 outputs; /* Number of output ports */
-+ u32 clocks; /* Number of clock ports */
-+ struct vchiq_mmal_port control; /* control port */
-+ struct vchiq_mmal_port input[MAX_PORT_COUNT]; /* input ports */
-+ struct vchiq_mmal_port output[MAX_PORT_COUNT]; /* output ports */
-+ struct vchiq_mmal_port clock[MAX_PORT_COUNT]; /* clock ports */
-+};
-+
-+int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance);
-+int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance);
-+
-+/* Initialise a mmal component and its ports
-+ *
-+ */
-+int vchiq_mmal_component_init(
-+ struct vchiq_mmal_instance *instance,
-+ const char *name,
-+ struct vchiq_mmal_component **component_out);
-+
-+int vchiq_mmal_component_finalise(
-+ struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component);
-+
-+int vchiq_mmal_component_enable(
-+ struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component);
-+
-+int vchiq_mmal_component_disable(
-+ struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_component *component);
-+
-+/* enable a mmal port
-+ *
-+ * enables a port and if a buffer callback provided enque buffer
-+ * headers as appropriate for the port.
-+ */
-+int vchiq_mmal_port_enable(
-+ struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ vchiq_mmal_buffer_cb buffer_cb);
-+
-+/* disable a port
-+ *
-+ * disable a port will dequeue any pending buffers
-+ */
-+int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port);
-+
-+int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ u32 parameter,
-+ void *value,
-+ u32 value_size);
-+
-+int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ u32 parameter,
-+ void *value,
-+ u32 *value_size);
-+
-+int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port);
-+
-+int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *src,
-+ struct vchiq_mmal_port *dst);
-+
-+int vchiq_mmal_version(struct vchiq_mmal_instance *instance,
-+ u32 *major_out,
-+ u32 *minor_out);
-+
-+int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
-+ struct vchiq_mmal_port *port,
-+ struct mmal_buffer *buf);
-+
-+int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance,
-+ struct mmal_buffer *buf);
-+int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf);
-+#endif /* MMAL_VCHIQ_H */