From: Hans Verkuil <hverkuil@xs4all.nl>
To: Naushir Patuck <naush@raspberrypi.com>
Cc: "Laurent Pinchart" <laurent.pinchart@ideasonboard.com>,
linux-media@vger.kernel.org,
"Kieran Bingham" <kieran.bingham@ideasonboard.com>,
"Jacopo Mondi" <jacopo@jmondi.org>,
"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
"Dave Stevenson" <dave.stevenson@raspberrypi.com>
Subject: Re: [PATCH v2 33/34] staging: bcm2835-isp: Add support for BC2835 ISP
Date: Wed, 24 Jun 2020 13:28:33 +0200 [thread overview]
Message-ID: <88e0e7f1-5ddd-5525-ddad-cfdb42608bc3@xs4all.nl> (raw)
In-Reply-To: <CAEmqJPo-ST8msiQVedLmH48vsMBz2WeaK6WXyN5fiP5z1b+wAA@mail.gmail.com>
On 19/05/2020 14:47, Naushir Patuck wrote:
> Hi Hans,
>
> Thank you for the review and comments. Just a follow up and
> overlapping Dave's comments:
>
> On Mon, 18 May 2020 at 13:02, Hans Verkuil <hverkuil@xs4all.nl> wrote:
>>
>> On 04/05/2020 11:26, Laurent Pinchart wrote:
>>> From: Naushir Patuck <naush@raspberrypi.com>
>>>
>>> Port the V4L2 compatible driver for the ISP unit found on Broadcom BCM2835
>>> chips.
>>>
>>> The driver interfaces though the VideoCore unit using the VCHIQ MMAL
>>> interface.
>>>
>>> ISP driver upported from from RaspberryPi BSP at revision:
>>> 6c3505be6c3e ("staging: vc04_services: isp: Make all references to bcm2835_isp_fmt const")
>>>
>>> Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
>>> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
>>> [Adapt to staging by moving all modifications that in the BSP are scattered
>>> in core components inside this directory]
>>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
>>> ---
>>> .../v4l/pixfmt-meta-bcm2835-isp-stats.rst | 41 +
>>> drivers/staging/vc04_services/Kconfig | 2 +
>>> drivers/staging/vc04_services/Makefile | 1 +
>>> .../staging/vc04_services/bcm2835-isp/Kconfig | 14 +
>>> .../vc04_services/bcm2835-isp/Makefile | 10 +
>>> .../bcm2835-isp/bcm2835-v4l2-isp.c | 1632 +++++++++++++++++
>>> .../bcm2835-isp/bcm2835_isp_ctrls.h | 67 +
>>> .../bcm2835-isp/bcm2835_isp_fmts.h | 301 +++
>>> .../include/uapi/linux/bcm2835-isp.h | 333 ++++
>>> .../staging/vc04_services/vchiq-mmal/Kconfig | 3 +-
>>> .../vc04_services/vchiq-mmal/mmal-encodings.h | 4 +
>>> .../vchiq-mmal/mmal-parameters.h | 153 +-
>>> 12 files changed, 2559 insertions(+), 2 deletions(-)
>>> create mode 100644 drivers/staging/vc04_services/Documentation/userspace-api/media/v4l/pixfmt-meta-bcm2835-isp-stats.rst
>>> create mode 100644 drivers/staging/vc04_services/bcm2835-isp/Kconfig
>>> create mode 100644 drivers/staging/vc04_services/bcm2835-isp/Makefile
>>> create mode 100644 drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
>>> create mode 100644 drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_ctrls.h
>>> create mode 100644 drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_fmts.h
>>> create mode 100644 drivers/staging/vc04_services/include/uapi/linux/bcm2835-isp.h
>>>
>>
>> <snip>
>>
>>> diff --git a/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c b/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
>>> new file mode 100644
>>> index 000000000000..a32faab4b8dc
>>> --- /dev/null
>>> +++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
>>> @@ -0,0 +1,1632 @@
>>
<snip>
>>
>>> + break;
>>> + }
>>> +
>>> + /* We use the selection API instead of the old crop API. */
>>> + v4l2_disable_ioctl(vfd, VIDIOC_CROPCAP);
>>> + v4l2_disable_ioctl(vfd, VIDIOC_G_CROP);
>>> + v4l2_disable_ioctl(vfd, VIDIOC_S_CROP);
>>
>> No need for this: the core handles this and will disable these ioctls
>> automatically.
>
> Without these explicitally disabled, we fail v4l2-compliance on the
> video capture nodes with the following error:
> Format ioctls:
> test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
> test VIDIOC_G/S_PARM: OK (Not Supported)
> test VIDIOC_G_FBUF: OK (Not Supported)
> test VIDIOC_G_FMT: OK
> test VIDIOC_TRY_FMT: OK
> test VIDIOC_S_FMT: OK
> test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
> fail: v4l2-test-formats.cpp(1510): doioctl(node, VIDIOC_G_SELECTION, &sel)
I believe that's because G_SELECTION doesn't support the V4L2_SEL_TGT_CROP_DEFAULT
target. Once that is supported, this test should pass.
Regards,
Hans
> fail: v4l2-test-formats.cpp(1550): testLegacyCrop(node)
> test Cropping: FAIL
> test Composing: OK (Not Supported)
> test Scaling: OK (Not Supported)
>
>>
>>> +
>>> + ret = bcm2835_isp_get_supported_fmts(node);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + /* Initialise the the video node. */
>>> + vfd->vfl_type = VFL_TYPE_VIDEO;
>>> + vfd->fops = &bcm2835_isp_fops,
>>> + vfd->ioctl_ops = &bcm2835_isp_node_ioctl_ops,
>>> + vfd->minor = -1,
>>> + vfd->release = video_device_release_empty,
>>> + vfd->queue = &node->queue;
>>> + vfd->lock = &node->lock;
>>> + vfd->v4l2_dev = &dev->v4l2_dev;
>>> + vfd->vfl_dir = node->vfl_dir;
>>> +
>>> + node->q_data.fmt = get_default_format(node);
>>> + node->q_data.width = DEFAULT_DIM;
>>> + node->q_data.height = DEFAULT_DIM;
>>> + node->q_data.bytesperline =
>>> + get_bytesperline(DEFAULT_DIM, node->q_data.fmt);
>>> + node->q_data.sizeimage = node_is_stats(node) ?
>>> + get_port_data(node)->recommended_buffer.size :
>>> + get_sizeimage(node->q_data.bytesperline,
>>> + node->q_data.width,
>>> + node->q_data.height,
>>> + node->q_data.fmt);
>>> +
>>> + queue->io_modes = VB2_MMAP | VB2_DMABUF;
>>> + queue->drv_priv = node;
>>> + queue->ops = &bcm2835_isp_node_queue_ops;
>>> + queue->mem_ops = &vb2_dma_contig_memops;
>>> + queue->buf_struct_size = sizeof(struct bcm2835_isp_buffer);
>>> + queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
>>> + queue->dev = dev->dev;
>>> + queue->lock = &node->queue_lock;
>>> +
>>> + ret = vb2_queue_init(queue);
>>> + if (ret < 0) {
>>> + v4l2_info(&dev->v4l2_dev, "vb2_queue_init failed\n");
>>> + return ret;
>>> + }
>>> + node->queue_init = true;
>>> +
>>> + /* Define the device names */
>>> + snprintf(vfd->name, sizeof(node->vfd.name), "%s-%s%d", BCM2835_ISP_NAME,
>>> + node->name, node->id);
>>> +
>>> + ret = video_register_device(vfd, VFL_TYPE_VIDEO, video_nr + index);
>>> + if (ret) {
>>> + v4l2_err(&dev->v4l2_dev,
>>> + "Failed to register video %s[%d] device node\n",
>>> + node->name, node->id);
>>> + return ret;
>>> + }
>>
>> Move registering the video device to the end of this function.
>> Otherwise the output video device would be created (and available for
>> userspace) before the controls are added.
>>
>
> Ack
>
>>> +
>>> + node->registered = true;
>>> + video_set_drvdata(vfd, node);
>>> +
>>> + /* Set some controls and defaults, but only on the VIDEO_OUTPUT node. */
>>> + if (node_is_output(node)) {
>>> + unsigned int i;
>>> +
>>> + /* Use this ctrl template to assign all out ISP custom ctrls. */
>>> + struct v4l2_ctrl_config ctrl_template = {
>>> + .ops = &bcm2835_isp_ctrl_ops,
>>> + .type = V4L2_CTRL_TYPE_U8,
>>> + .def = 0,
>>> + .min = 0x00,
>>> + .max = 0xff,
>>> + .step = 1,
>>> + };
>>> +
>>> + v4l2_ctrl_handler_init(&dev->ctrl_handler, 4);
>>> +
>>> + dev->r_gain = 1000;
>>> + dev->b_gain = 1000;
>>> +
>>> + v4l2_ctrl_new_std(&dev->ctrl_handler, &bcm2835_isp_ctrl_ops,
>>> + V4L2_CID_RED_BALANCE, 1, 0xffff, 1,
>>> + dev->r_gain);
>>> +
>>> + v4l2_ctrl_new_std(&dev->ctrl_handler, &bcm2835_isp_ctrl_ops,
>>> + V4L2_CID_BLUE_BALANCE, 1, 0xffff, 1,
>>> + dev->b_gain);
>>> +
>>> + v4l2_ctrl_new_std(&dev->ctrl_handler, &bcm2835_isp_ctrl_ops,
>>> + V4L2_CID_DIGITAL_GAIN, 1, 0xffff, 1, 1000);
>>> +
>>> + for (i = 0; i < ARRAY_SIZE(custom_ctrls); i++) {
>>> + ctrl_template.name = custom_ctrls[i].name;
>>> + ctrl_template.id = custom_ctrls[i].id;
>>> + ctrl_template.dims[0] = custom_ctrls[i].size;
>>> + ctrl_template.flags = custom_ctrls[i].flags;
>>> + v4l2_ctrl_new_custom(&dev->ctrl_handler,
>>> + &ctrl_template, NULL);
>>> + }
>>> +
>>> + node->vfd.ctrl_handler = &dev->ctrl_handler;
>>
>> Missing error check.
>
> Ack
>
>>
>>> + }
>>> +
>>> + v4l2_info(&dev->v4l2_dev,
>>> + "Device node %s[%d] registered as /dev/video%d\n",
>>> + node->name, node->id, vfd->num);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +/* Unregister one of the /dev/video<N> nodes associated with the ISP. */
>>> +static void unregister_node(struct bcm2835_isp_node *node)
>>> +{
>>> + struct bcm2835_isp_dev *dev = node_get_dev(node);
>>> +
>>> + v4l2_info(&dev->v4l2_dev,
>>> + "Unregistering node %s[%d] device node /dev/video%d\n",
>>> + node->name, node->id, node->vfd.num);
>>> +
>>> + if (node->queue_init)
>>> + vb2_queue_release(&node->queue);
>>> +
>>> + if (node->registered) {
>>> + video_unregister_device(&node->vfd);
>>> + if (node_is_output(node))
>>> + v4l2_ctrl_handler_free(&dev->ctrl_handler);
>>> + }
>>> +
>>> + /*
>>> + * node->supported_fmts.list is free'd automatically
>>> + * as a managed resource.
>>> + */
>>> + node->supported_fmts.list = NULL;
>>> + node->supported_fmts.num_entries = 0;
>>> + node->vfd.ctrl_handler = NULL;
>>> + node->registered = false;
>>> + node->queue_init = false;
>>> +}
>>> +
>>> +static void media_controller_unregister(struct bcm2835_isp_dev *dev)
>>> +{
>>> + unsigned int i;
>>> +
>>> + v4l2_info(&dev->v4l2_dev, "Unregister from media controller\n");
>>> +
>>> + if (dev->media_device_registered) {
>>> + media_device_unregister(&dev->mdev);
>>> + media_device_cleanup(&dev->mdev);
>>> + dev->media_device_registered = false;
>>> + }
>>> +
>>> + kfree(dev->entity.name);
>>> + dev->entity.name = NULL;
>>> +
>>> + if (dev->media_entity_registered) {
>>> + media_device_unregister_entity(&dev->entity);
>>> + dev->media_entity_registered = false;
>>> + }
>>> +
>>> + for (i = 0; i < BCM2835_ISP_NUM_NODES; i++) {
>>> + struct bcm2835_isp_node *node = &dev->node[i];
>>> +
>>> + if (node->media_node_registered) {
>>> + media_remove_intf_links(node->intf_link->intf);
>>> + media_entity_remove_links(&dev->node[i].vfd.entity);
>>> + media_devnode_remove(node->intf_devnode);
>>> + media_device_unregister_entity(&node->vfd.entity);
>>> + kfree(node->vfd.entity.name);
>>> + }
>>> + node->media_node_registered = false;
>>> + }
>>> +
>>> + dev->v4l2_dev.mdev = NULL;
>>> +}
>>> +
>>> +static int media_controller_register_node(struct bcm2835_isp_dev *dev, int num)
>>> +{
>>> + struct bcm2835_isp_node *node = &dev->node[num];
>>> + struct media_entity *entity = &node->vfd.entity;
>>> + int output = node_is_output(node);
>>> + char *name;
>>> + int ret;
>>> +
>>> + v4l2_info(&dev->v4l2_dev,
>>> + "Register %s node %d with media controller\n",
>>> + output ? "output" : "capture", num);
>>> + entity->obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE;
>>> + entity->function = MEDIA_ENT_F_IO_V4L;
>>> + entity->info.dev.major = VIDEO_MAJOR;
>>> + entity->info.dev.minor = node->vfd.minor;
>>> + name = kmalloc(BCM2835_ISP_ENTITY_NAME_LEN, GFP_KERNEL);
>>> + if (!name) {
>>> + ret = -ENOMEM;
>>> + goto error_no_mem;
>>> + }
>>> + snprintf(name, BCM2835_ISP_ENTITY_NAME_LEN, "%s0-%s%d",
>>> + BCM2835_ISP_NAME, output ? "output" : "capture", num);
>>> + entity->name = name;
>>> + node->pad.flags = output ? MEDIA_PAD_FL_SOURCE : MEDIA_PAD_FL_SINK;
>>> + ret = media_entity_pads_init(entity, 1, &node->pad);
>>> + if (ret)
>>> + goto error_pads_init;
>>> + ret = media_device_register_entity(&dev->mdev, entity);
>>> + if (ret)
>>> + goto error_register_entity;
>>> +
>>> + node->intf_devnode = media_devnode_create(&dev->mdev,
>>> + MEDIA_INTF_T_V4L_VIDEO, 0,
>>> + VIDEO_MAJOR, node->vfd.minor);
>>> + if (!node->intf_devnode) {
>>> + ret = -ENOMEM;
>>> + goto error_devnode_create;
>>> + }
>>> +
>>> + node->intf_link = media_create_intf_link(entity,
>>> + &node->intf_devnode->intf,
>>> + MEDIA_LNK_FL_IMMUTABLE |
>>> + MEDIA_LNK_FL_ENABLED);
>>> + if (!node->intf_link) {
>>> + ret = -ENOMEM;
>>> + goto error_create_intf_link;
>>> + }
>>> +
>>> + if (output)
>>> + ret = media_create_pad_link(entity, 0, &dev->entity, num,
>>> + MEDIA_LNK_FL_IMMUTABLE |
>>> + MEDIA_LNK_FL_ENABLED);
>>> + else
>>> + ret = media_create_pad_link(&dev->entity, num, entity, 0,
>>> + MEDIA_LNK_FL_IMMUTABLE |
>>> + MEDIA_LNK_FL_ENABLED);
>>> + if (ret)
>>> + goto error_create_pad_link;
>>> +
>>> + dev->node[num].media_node_registered = true;
>>> + return 0;
>>> +
>>> +error_create_pad_link:
>>> + media_remove_intf_links(&node->intf_devnode->intf);
>>> +error_create_intf_link:
>>> + media_devnode_remove(node->intf_devnode);
>>> +error_devnode_create:
>>> + media_device_unregister_entity(&node->vfd.entity);
>>> +error_register_entity:
>>> +error_pads_init:
>>> + kfree(entity->name);
>>> + entity->name = NULL;
>>> +error_no_mem:
>>> + if (ret)
>>> + v4l2_info(&dev->v4l2_dev, "Error registering node\n");
>>> +
>>> + return ret;
>>> +}
>>> +
>>> +static int media_controller_register(struct bcm2835_isp_dev *dev)
>>> +{
>>> + char *name;
>>> + unsigned int i;
>>> + int ret;
>>> +
>>> + v4l2_dbg(2, debug, &dev->v4l2_dev, "Registering with media controller\n");
>>> + dev->mdev.dev = dev->dev;
>>> + strscpy(dev->mdev.model, "bcm2835-isp",
>>> + sizeof(dev->mdev.model));
>>> + strscpy(dev->mdev.bus_info, "platform:bcm2835-isp",
>>> + sizeof(dev->mdev.bus_info));
>>> + media_device_init(&dev->mdev);
>>> + dev->v4l2_dev.mdev = &dev->mdev;
>>> +
>>> + v4l2_dbg(2, debug, &dev->v4l2_dev, "Register entity for nodes\n");
>>> +
>>> + name = kmalloc(BCM2835_ISP_ENTITY_NAME_LEN, GFP_KERNEL);
>>> + if (!name) {
>>> + ret = -ENOMEM;
>>> + goto done;
>>> + }
>>> + snprintf(name, BCM2835_ISP_ENTITY_NAME_LEN, "bcm2835_isp0");
>>> + dev->entity.name = name;
>>> + dev->entity.obj_type = MEDIA_ENTITY_TYPE_BASE;
>>> + dev->entity.function = MEDIA_ENT_F_PROC_VIDEO_SCALER;
>>> +
>>> + for (i = 0; i < BCM2835_ISP_NUM_NODES; i++) {
>>> + dev->pad[i].flags = node_is_output(&dev->node[i]) ?
>>> + MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
>>> + }
>>> +
>>> + ret = media_entity_pads_init(&dev->entity, BCM2835_ISP_NUM_NODES,
>>> + dev->pad);
>>> + if (ret)
>>> + goto done;
>>> +
>>> + ret = media_device_register_entity(&dev->mdev, &dev->entity);
>>> + if (ret)
>>> + goto done;
>>> +
>>> + dev->media_entity_registered = true;
>>> + for (i = 0; i < BCM2835_ISP_NUM_NODES; i++) {
>>> + ret = media_controller_register_node(dev, i);
>>> + if (ret)
>>> + goto done;
>>> + }
>>> +
>>> + ret = media_device_register(&dev->mdev);
>>> + if (!ret)
>>> + dev->media_device_registered = true;
>>> +done:
>>> + return ret;
>>> +}
>>> +
>>> +static int bcm2835_isp_remove(struct platform_device *pdev)
>>> +{
>>> + struct bcm2835_isp_dev *dev = platform_get_drvdata(pdev);
>>> + unsigned int i;
>>> +
>>> + media_controller_unregister(dev);
>>> +
>>> + for (i = 0; i < BCM2835_ISP_NUM_NODES; i++)
>>> + unregister_node(&dev->node[i]);
>>> +
>>> + v4l2_device_unregister(&dev->v4l2_dev);
>>> +
>>> + if (dev->component)
>>> + vchiq_mmal_component_finalise(dev->mmal_instance,
>>> + dev->component);
>>> +
>>> + vchiq_mmal_finalise(dev->mmal_instance);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int bcm2835_isp_probe(struct platform_device *pdev)
>>> +{
>>> + struct bcm2835_isp_dev *dev;
>>> + unsigned int i;
>>> + int ret;
>>> +
>>> + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
>>> + if (!dev)
>>> + return -ENOMEM;
>>> +
>>> + dev->dev = &pdev->dev;
>>> +
>>> + ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + ret = vchiq_mmal_init(&dev->mmal_instance);
>>> + if (ret) {
>>> + v4l2_device_unregister(&dev->v4l2_dev);
>>> + return ret;
>>> + }
>>> +
>>> + ret = vchiq_mmal_component_init(dev->mmal_instance, "ril.isp",
>>> + &dev->component);
>>> + if (ret) {
>>> + v4l2_err(&dev->v4l2_dev,
>>> + "%s: failed to create ril.isp component\n", __func__);
>>> + goto error;
>>> + }
>>> +
>>> + if ((dev->component->inputs != BCM2835_ISP_NUM_OUTPUTS) ||
>>> + (dev->component->outputs != BCM2835_ISP_NUM_CAPTURES +
>>> + BCM2835_ISP_NUM_METADATA)) {
>>> + v4l2_err(&dev->v4l2_dev,
>>> + "%s: ril.isp returned %d i/p (%d expected), %d o/p (%d expected) ports\n",
>>> + __func__, dev->component->inputs,
>>> + BCM2835_ISP_NUM_OUTPUTS,
>>> + dev->component->outputs,
>>> + BCM2835_ISP_NUM_CAPTURES + BCM2835_ISP_NUM_METADATA);
>>> + goto error;
>>> + }
>>> +
>>> + atomic_set(&dev->num_streaming, 0);
>>> +
>>> + for (i = 0; i < BCM2835_ISP_NUM_NODES; i++) {
>>> + struct bcm2835_isp_node *node = &dev->node[i];
>>> +
>>> + ret = register_node(dev, node, i);
>>> + if (ret)
>>> + goto error;
>>> + }
>>> +
>>> + ret = media_controller_register(dev);
>>> + if (ret)
>>> + goto error;
>>> +
>>> + platform_set_drvdata(pdev, dev);
>>> + v4l2_info(&dev->v4l2_dev, "Loaded V4L2 %s\n", BCM2835_ISP_NAME);
>>> + return 0;
>>> +
>>> +error:
>>> + bcm2835_isp_remove(pdev);
>>> +
>>> + return ret;
>>> +}
>>> +
>>> +static struct platform_driver bcm2835_isp_pdrv = {
>>> + .probe = bcm2835_isp_probe,
>>> + .remove = bcm2835_isp_remove,
>>> + .driver = {
>>> + .name = BCM2835_ISP_NAME,
>>> + },
>>> +};
>>> +
>>> +module_platform_driver(bcm2835_isp_pdrv);
>>> +
>>> +MODULE_DESCRIPTION("BCM2835 ISP driver");
>>> +MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>");
>>> +MODULE_LICENSE("GPL");
>>> +MODULE_VERSION("1.0");
>>> +MODULE_ALIAS("platform:bcm2835-isp");
>>> diff --git a/drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_ctrls.h b/drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_ctrls.h
>>> new file mode 100644
>>> index 000000000000..cfbb1063aad1
>>> --- /dev/null
>>> +++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_ctrls.h
>>> @@ -0,0 +1,67 @@
>>> +/* SPDX-License-Identifier: GPL-2.0 */
>>> +/*
>>> + * Broadcom BCM2835 ISP driver
>>> + *
>>> + * Copyright © 2019-2020 Raspberry Pi (Trading) Ltd.
>>> + *
>>> + * Author: Naushir Patuck (naush@raspberrypi.com)
>>> + *
>>> + */
>>> +
>>> +#ifndef BCM2835_ISP_CTRLS
>>> +#define BCM2835_ISP_CTRLS
>>> +
>>> +#include <linux/bcm2835-isp.h>
>>> +
>>> +struct bcm2835_isp_custom_ctrl {
>>> + const char *name;
>>> + u32 id;
>>> + u32 size;
>>> + u32 flags;
>>> +};
>>> +
>>> +static const struct bcm2835_isp_custom_ctrl custom_ctrls[] = {
>>> + {
>>> + .name = "Colour Correction Matrix",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_CC_MATRIX,
>>> + .size = sizeof(struct bcm2835_isp_custom_ccm),
>>> + .flags = 0
>>> + }, {
>>> + .name = "Lens Shading",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_LENS_SHADING,
>>> + .size = sizeof(struct bcm2835_isp_lens_shading),
>>> + .flags = V4L2_CTRL_FLAG_EXECUTE_ON_WRITE
>>> + }, {
>>> + .name = "Black Level",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL,
>>> + .size = sizeof(struct bcm2835_isp_black_level),
>>> + .flags = 0
>>> + }, {
>>> + .name = "Green Equalisation",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_GEQ,
>>> + .size = sizeof(struct bcm2835_isp_geq),
>>> + .flags = 0
>>> + }, {
>>> + .name = "Gamma",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_GAMMA,
>>> + .size = sizeof(struct bcm2835_isp_gamma),
>>> + .flags = 0
>>> + }, {
>>> + .name = "Sharpen",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_SHARPEN,
>>> + .size = sizeof(struct bcm2835_isp_sharpen),
>>> + .flags = 0
>>> + }, {
>>> + .name = "Denoise",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_DENOISE,
>>> + .size = sizeof(struct bcm2835_isp_denoise),
>>> + .flags = 0
>>> + }, {
>>> + .name = "Defective Pixel Correction",
>>> + .id = V4L2_CID_USER_BCM2835_ISP_DPC,
>>> + .size = sizeof(struct bcm2835_isp_dpc),
>>> + .flags = 0
>>> + }
>>> +};
>>> +
>>> +#endif
>>> diff --git a/drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_fmts.h b/drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_fmts.h
>>> new file mode 100644
>>> index 000000000000..af3bde152bb2
>>> --- /dev/null
>>> +++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835_isp_fmts.h
>>> @@ -0,0 +1,301 @@
>>> +/* SPDX-License-Identifier: GPL-2.0 */
>>> +/*
>>> + * Broadcom BCM2835 ISP driver
>>> + *
>>> + * Copyright © 2019-2020 Raspberry Pi (Trading) Ltd.
>>> + *
>>> + * Author: Naushir Patuck (naush@raspberrypi.com)
>>> + *
>>> + */
>>> +
>>> +#ifndef BCM2835_ISP_FMTS
>>> +#define BCM2835_ISP_FMTS
>>> +
>>> +#include <linux/videodev2.h>
>>> +#include "vchiq-mmal/mmal-encodings.h"
>>> +
>>> +struct bcm2835_isp_fmt {
>>> + u32 fourcc;
>>> + int depth;
>>> + int bytesperline_align;
>>> + u32 flags;
>>> + u32 mmal_fmt;
>>> + int size_multiplier_x2;
>>> + enum v4l2_colorspace colorspace;
>>> + unsigned int step_size;
>>> +};
>>> +
>>> +struct bcm2835_isp_fmt_list {
>>> + struct bcm2835_isp_fmt const **list;
>>> + unsigned int num_entries;
>>> +};
>>> +
>>> +static const struct bcm2835_isp_fmt supported_formats[] = {
>>> + {
>>> + /* YUV formats */
>>> + .fourcc = V4L2_PIX_FMT_YUV420,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_I420,
>>> + .size_multiplier_x2 = 3,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_YVU420,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_YV12,
>>> + .size_multiplier_x2 = 3,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_NV12,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_NV12,
>>> + .size_multiplier_x2 = 3,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_NV21,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_NV21,
>>> + .size_multiplier_x2 = 3,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_YUYV,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_YUYV,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_UYVY,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_UYVY,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_YVYU,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_YVYU,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_VYUY,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_VYUY,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SMPTE170M,
>>> + .step_size = 2,
>>> + }, {
>>> + /* RGB formats */
>>> + .fourcc = V4L2_PIX_FMT_RGB24,
>>> + .depth = 24,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_RGB24,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SRGB,
>>> + .step_size = 1,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_RGB565,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_RGB16,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SRGB,
>>> + .step_size = 1,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_BGR24,
>>> + .depth = 24,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BGR24,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SRGB,
>>> + .step_size = 1,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_ABGR32,
>>> + .depth = 32,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BGRA,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_SRGB,
>>> + .step_size = 1,
>>> + }, {
>>> + /* Bayer formats */
>>> + /* 8 bit */
>>> + .fourcc = V4L2_PIX_FMT_SRGGB8,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SRGGB8,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SBGGR8,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SBGGR8,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGRBG8,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGRBG8,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGBRG8,
>>> + .depth = 8,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGBRG8,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + /* 10 bit */
>>> + .fourcc = V4L2_PIX_FMT_SRGGB10P,
>>> + .depth = 10,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SRGGB10P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SBGGR10P,
>>> + .depth = 10,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SBGGR10P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGRBG10P,
>>> + .depth = 10,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGRBG10P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGBRG10P,
>>> + .depth = 10,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGBRG10P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + /* 12 bit */
>>> + .fourcc = V4L2_PIX_FMT_SRGGB12P,
>>> + .depth = 12,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SRGGB12P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SBGGR12P,
>>> + .depth = 12,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SBGGR12P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGRBG12P,
>>> + .depth = 12,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGRBG12P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGBRG12P,
>>> + .depth = 12,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGBRG12P,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + /* 16 bit */
>>> + .fourcc = V4L2_PIX_FMT_SRGGB16,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SRGGB16,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SBGGR16,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SBGGR16,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGRBG16,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGRBG16,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + .fourcc = V4L2_PIX_FMT_SGBRG16,
>>> + .depth = 16,
>>> + .bytesperline_align = 32,
>>> + .flags = 0,
>>> + .mmal_fmt = MMAL_ENCODING_BAYER_SGBRG16,
>>> + .size_multiplier_x2 = 2,
>>> + .colorspace = V4L2_COLORSPACE_RAW,
>>> + .step_size = 2,
>>> + }, {
>>> + /* ISP statistics format */
>>> + .fourcc = V4L2_META_FMT_BCM2835_ISP_STATS,
>>> + .mmal_fmt = MMAL_ENCODING_BRCM_STATS,
>>> + /* The rest are not valid fields for stats. */
>>> + }
>>> +};
>>> +
>>> +#endif
>>> diff --git a/drivers/staging/vc04_services/include/uapi/linux/bcm2835-isp.h b/drivers/staging/vc04_services/include/uapi/linux/bcm2835-isp.h
>>> new file mode 100644
>>> index 000000000000..edc452fa8318
>>> --- /dev/null
>>> +++ b/drivers/staging/vc04_services/include/uapi/linux/bcm2835-isp.h
>>> @@ -0,0 +1,333 @@
>>> +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */
>>> +/*
>>> + * bcm2835-isp.h
>>> + *
>>> + * BCM2835 ISP driver - user space header file.
>>> + *
>>> + * Copyright © 2019-2020 Raspberry Pi (Trading) Ltd.
>>> + *
>>> + * Author: Naushir Patuck (naush@raspberrypi.com)
>>> + *
>>> + */
>>> +
>>> +#ifndef __BCM2835_ISP_H_
>>> +#define __BCM2835_ISP_H_
>>> +
>>> +#include <linux/v4l2-controls.h>
>>> +
>>> +/* TODO: move the control IDs definitions to v4l2-controls.h */
>>> +#define V4L2_CID_USER_BCM2835_ISP_BASE (V4L2_CID_USER_BASE + 0x10c0)
>>
>> As the TODO says: move this to v4l2-controls.h. Currently the 0x10c0 offset
>> clashes with V4L2_CID_USER_ATMEL_ISC_BASE, so that certainly should be fixed.
>>
>
> Unfortunately, there seems to be a mixup here. Laurent, we have
> accidentally mailed a WIP revision of this patch. The final version
> does have V4L2_CID_USER_BCM2835_ISP_BASE with a unique id in
> v4l2-controls.h. I will talk with Laurent separately to get the
> correct revison included in the next patch-set.
>
>>> +
>>> +/* TODO: move the formats definitions to videodev2.h */
>>> +/* 12 Y/CbCr 4:2:0 128 pixel wide column */
>>> +#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2')
>>> +/* Y/CbCr 4:2:0 10bpc, 3x10 packed as 4 bytes in a 128 bytes / 96 pixel wide column */
>>> +#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0')
>>> +/* Sensor Ancillary metadata */
>>> +#define V4L2_META_FMT_SENSOR_DATA v4l2_fourcc('S', 'E', 'N', 'S')
>>> +/* BCM2835 ISP image statistics output */
>>> +#define V4L2_META_FMT_BCM2835_ISP_STATS v4l2_fourcc('B', 'S', 'T', 'A')
>>> +
>
> Similarly, these have also been moved to the right header files.
>
>>> +#define V4L2_CID_USER_BCM2835_ISP_CC_MATRIX \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0001)
>>> +#define V4L2_CID_USER_BCM2835_ISP_LENS_SHADING \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0002)
>>> +#define V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0003)
>>> +#define V4L2_CID_USER_BCM2835_ISP_GEQ \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0004)
>>> +#define V4L2_CID_USER_BCM2835_ISP_GAMMA \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0005)
>>> +#define V4L2_CID_USER_BCM2835_ISP_DENOISE \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0006)
>>> +#define V4L2_CID_USER_BCM2835_ISP_SHARPEN \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0007)
>>> +#define V4L2_CID_USER_BCM2835_ISP_DPC \
>>> + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0008)
>>
>> There is no documentation for these controls. Specifically, it doesn't
>> tell you which struct should be used.
>
> As above, the documentaiton is available in the newer patch.
>
>>
>>> +
>>> +/*
>>> + * All structs below are directly mapped onto the equivalent structs in
>>> + * drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
>>> + * for convenience.
>>> + */
>>> +
>>> +/**
>>> + * struct bcm2835_isp_rational - Rational value type.
>>> + *
>>> + * @num: Numerator.
>>> + * @den: Denominator.
>>> + */
>>> +struct bcm2835_isp_rational {
>>> + __s32 num;
>>> + __s32 den;
>>
>> Wouldn't it make more sense if den is a __u32?
>
> Ack
>
>>
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_ccm - Colour correction matrix.
>>> + *
>>> + * @ccm: 3x3 correction matrix coefficients.
>>> + * @offsets: 1x3 correction offsets.
>>> + */
>>> +struct bcm2835_isp_ccm {
>>> + struct bcm2835_isp_rational ccm[3][3];
>>> + __s32 offsets[3];
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_custom_ccm - Custom CCM applied with the
>>> + * V4L2_CID_USER_BCM2835_ISP_CC_MATRIX ctrl.
>>> + *
>>> + * @enabled: Enable custom CCM.
>>> + * @ccm: Custom CCM coefficients and offsets.
>>> + */
>>> +struct bcm2835_isp_custom_ccm {
>>> + __u32 enabled;
>>> + struct bcm2835_isp_ccm ccm;
>>> +};
>>> +
>>> +/**
>>> + * enum bcm2835_isp_gain_format - format of the gains in the lens shading
>>> + * tables used with the
>>> + * V4L2_CID_USER_BCM2835_ISP_LENS_SHADING ctrl.
>>> + *
>>> + * @GAIN_FORMAT_U0P8_1: Gains are u0.8 format, starting at 1.0
>>> + * @GAIN_FORMAT_U1P7_0: Gains are u1.7 format, starting at 0.0
>>> + * @GAIN_FORMAT_U1P7_1: Gains are u1.7 format, starting at 1.0
>>> + * @GAIN_FORMAT_U2P6_0: Gains are u2.6 format, starting at 0.0
>>> + * @GAIN_FORMAT_U2P6_1: Gains are u2.6 format, starting at 1.0
>>> + * @GAIN_FORMAT_U3P5_0: Gains are u3.5 format, starting at 0.0
>>> + * @GAIN_FORMAT_U3P5_1: Gains are u3.5 format, starting at 1.0
>>> + * @GAIN_FORMAT_U4P10: Gains are u4.10 format, starting at 0.0
>>> + */
>>> +enum bcm2835_isp_gain_format {
>>> + GAIN_FORMAT_U0P8_1 = 0,
>>> + GAIN_FORMAT_U1P7_0 = 1,
>>> + GAIN_FORMAT_U1P7_1 = 2,
>>> + GAIN_FORMAT_U2P6_0 = 3,
>>> + GAIN_FORMAT_U2P6_1 = 4,
>>> + GAIN_FORMAT_U3P5_0 = 5,
>>> + GAIN_FORMAT_U3P5_1 = 6,
>>> + GAIN_FORMAT_U4P10 = 7,
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_lens_shading - Lens shading tables supplied with the
>>> + * V4L2_CID_USER_BCM2835_ISP_LENS_SHADING
>>> + * ctrl.
>>> + *
>>> + * @enabled: Enable lens shading.
>>> + * @grid_cell_size: Size of grid cells in samples (16, 32, 64, 128 or 256).
>>> + * @grid_width: Width of lens shading tables in grid cells.
>>> + * @grid_stride: Row to row distance (in grid cells) between grid cells
>>> + * in the same horizontal location.
>>> + * @grid_height: Height of lens shading tables in grid cells.
>>> + * @mem_handle_table: Memory handle to the tables.
>>
>> What sort of handle is this? I.e. where does it come from?
>
> I believe there was a separte discusion about this. This is a vcsm
> handle that is used to store the table coefficients in memory that is
> accessible from Videocore. There is work in progress to update this
> to use dmabuf handles.
>
>>
>>> + * @ref_transform: Reference transform - unsupported, please pass zero.
>>> + * @corner_sampled: Whether the gains are sampled at the corner points
>>> + * of the grid cells or in the cell centres.
>>> + * @gain_format: Format of the gains (see enum &bcm2835_isp_gain_format).
>>> + */
>>> +struct bcm2835_isp_lens_shading {
>>> + __u32 enabled;
>>> + __u32 grid_cell_size;
>>> + __u32 grid_width;
>>> + __u32 grid_stride;
>>> + __u32 grid_height;
>>> + __u32 mem_handle_table;
>>> + __u32 ref_transform;
>>> + __u32 corner_sampled;
>>> + __u32 gain_format;
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_black_level - Sensor black level set with the
>>> + * V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL ctrl.
>>> + *
>>> + * @enabled: Enable black level.
>>> + * @black_level_r: Black level for red channel.
>>> + * @black_level_g: Black level for green channels.
>>> + * @black_level_b: Black level for blue channel.
>>> + */
>>> +struct bcm2835_isp_black_level {
>>> + __u32 enabled;
>>> + __u16 black_level_r;
>>> + __u16 black_level_g;
>>> + __u16 black_level_b;
>>> + __u8 pad_[2]; /* Unused */
>>
>> I prefer 'padding' over 'pad_'.
>
> Ack
>
>>
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_geq - Green equalisation parameters set with the
>>> + * V4L2_CID_USER_BCM2835_ISP_GEQ ctrl.
>>> + *
>>> + * @enabled: Enable green equalisation.
>>> + * @offset: Fixed offset of the green equalisation threshold.
>>> + * @slope: Slope of the green equalisation threshold.
>>> + */
>>> +struct bcm2835_isp_geq {
>>> + __u32 enabled;
>>> + __u32 offset;
>>> + struct bcm2835_isp_rational slope;
>>> +};
>>> +
>>> +#define BCM2835_NUM_GAMMA_PTS 33
>>> +
>>> +/**
>>> + * struct bcm2835_isp_gamma - Gamma parameters set with the
>>> + * V4L2_CID_USER_BCM2835_ISP_GAMMA ctrl.
>>> + *
>>> + * @enabled: Enable gamma adjustment.
>>> + * @X: X values of the points defining the gamma curve.
>>> + * Values should be scaled to 16 bits.
>>> + * @Y: Y values of the points defining the gamma curve.
>>> + * Values should be scaled to 16 bits.
>>
>> I assume 0 == black and 0xffff == white (or max luminance)?
>>
>> And so typically x[0] == y[0] == 0 and x[32] == y[32] == 0xffff?
>>
>
> Typically yes, but it is not strictily true. We could have parameters
> that clip the signal above min (0) and below max (0xffff).
>
>>> + */
>>> +struct bcm2835_isp_gamma {
>>> + __u32 enabled;
>>> + __u16 x[BCM2835_NUM_GAMMA_PTS];
>>> + __u16 y[BCM2835_NUM_GAMMA_PTS];
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_denoise - Denoise parameters set with the
>>> + * V4L2_CID_USER_BCM2835_ISP_DENOISE ctrl.
>>> + *
>>> + * @enabled: Enable denoise.
>>> + * @constant: Fixed offset of the noise threshold.
>>> + * @slope: Slope of the noise threshold.
>>> + * @strength: Denoise strength between 0.0 (off) and 1.0 (maximum).
>>> + */
>>> +struct bcm2835_isp_denoise {
>>> + __u32 enabled;
>>> + __u32 constant;
>>> + struct bcm2835_isp_rational slope;
>>> + struct bcm2835_isp_rational strength;
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_sharpen - Sharpen parameters set with the
>>> + * V4L2_CID_USER_BCM2835_ISP_SHARPEN ctrl.
>>> + *
>>> + * @enabled: Enable sharpening.
>>> + * @threshold: Threshold at which to start sharpening pixels.
>>> + * @strength: Strength with which pixel sharpening increases.
>>> + * @limit: Limit to the amount of sharpening applied.
>>> + */
>>> +struct bcm2835_isp_sharpen {
>>> + __u32 enabled;
>>> + struct bcm2835_isp_rational threshold;
>>> + struct bcm2835_isp_rational strength;
>>> + struct bcm2835_isp_rational limit;
>>> +};
>>> +
>>> +/**
>>> + * enum bcm2835_isp_dpc_mode - defective pixel correction (DPC) strength.
>>> + *
>>> + * @DPC_MODE_OFF: No DPC.
>>> + * @DPC_MODE_NORMAL: Normal DPC.
>>> + * @DPC_MODE_STRONG: Strong DPC.
>>> + */
>>> +enum bcm2835_isp_dpc_mode {
>>> + DPC_MODE_OFF = 0,
>>> + DPC_MODE_NORMAL = 1,
>>> + DPC_MODE_STRONG = 2,
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_dpc - Defective pixel correction (DPC) parameters set
>>> + * with the V4L2_CID_USER_BCM2835_ISP_DPC ctrl.
>>> + *
>>> + * @enabled: Enable DPC.
>>> + * @strength: DPC strength (see enum &bcm2835_isp_dpc_mode).
>>
>> Isn't DPC_MODE_OFF equal to just setting 'enabled' to false? If so,
>> wouldn't the 'strength' field be sufficient?
>
> This is a bit of a quirk of the hardware pipeline. DPC_MODE_OFF still
> keeps the block enabled, but running (mostly) as a passthrough. The
> enabled field physically switches off the block.
>
>>
>>> + */
>>> +struct bcm2835_isp_dpc {
>>> + __u32 enabled;
>>> + __u32 strength;
>>> +};
>>> +
>>> +/*
>>> + * ISP statistics structures.
>>> + *
>>> + * The bcm2835_isp_stats structure is generated at the output of the
>>> + * statistics node. Note that this does not directly map onto the statistics
>>> + * output of the ISP HW. Instead, the MMAL firmware code maps the HW statistics
>>> + * to the bcm2835_isp_stats structure.
>>> + */
>>> +#define DEFAULT_AWB_REGIONS_X 16
>>> +#define DEFAULT_AWB_REGIONS_Y 12
>>> +
>>> +#define NUM_HISTOGRAMS 2
>>> +#define NUM_HISTOGRAM_BINS 128
>>> +#define AWB_REGIONS (DEFAULT_AWB_REGIONS_X * DEFAULT_AWB_REGIONS_Y)
>>> +#define FLOATING_REGIONS 16
>>> +#define AGC_REGIONS 16
>>> +#define FOCUS_REGIONS 12
>>> +
>>> +/**
>>> + * struct bcm2835_isp_stats_hist - Histogram statistics
>>> + *
>>> + * @r_hist: Red channel histogram.
>>> + * @g_hist: Combined green channel histogram.
>>> + * @b_hist: Blue channel histogram.
>>> + */
>>> +struct bcm2835_isp_stats_hist {
>>> + __u32 r_hist[NUM_HISTOGRAM_BINS];
>>> + __u32 g_hist[NUM_HISTOGRAM_BINS];
>>> + __u32 b_hist[NUM_HISTOGRAM_BINS];
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_stats_region - Region sums.
>>> + *
>>> + * @counted: The number of 2x2 bayer tiles accumulated.
>>> + * @notcounted: The number of 2x2 bayer tiles not accumulated.
>>> + * @r_sum: Total sum of counted pixels in the red channel for a region.
>>> + * @g_sum: Total sum of counted pixels in the green channel for a region.
>>> + * @b_sum: Total sum of counted pixels in the blue channel for a region.
>>> + */
>>> +struct bcm2835_isp_stats_region {
>>> + __u32 counted;
>>> + __u32 notcounted;
>>> + __u64 r_sum;
>>> + __u64 g_sum;
>>> + __u64 b_sum;
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_stats_focus - Focus statistics.
>>> + *
>>> + * @contrast_val: Focus measure - accumulated output of the focus filter.
>>> + * In the first dimension, index [0] counts pixels below a
>>> + * preset threshold, and index [1] counts pixels above the
>>> + * threshold. In the second dimension, index [0] uses the
>>> + * first predefined filter, and index [1] uses the second
>>> + * predefined filter.
>>> + * @contrast_val_num: The number of counted pixels in the above accumulation.
>>> + */
>>> +struct bcm2835_isp_stats_focus {
>>> + __u64 contrast_val[2][2];
>>> + __u32 contrast_val_num[2][2];
>>> +};
>>> +
>>> +/**
>>> + * struct bcm2835_isp_stats - ISP statistics.
>>> + *
>>> + * @version: Version of the bcm2835_isp_stats structure.
>>> + * @size: Size of the bcm2835_isp_stats structure.
>>> + * @hist: Histogram statistics for the entire image.
>>> + * @awb_stats: Statistics for the regions defined for AWB calculations.
>>> + * @floating_stats: Statistics for arbitrarily placed (floating) regions.
>>> + * @agc_stats: Statistics for the regions defined for AGC calculations.
>>> + * @focus_stats: Focus filter statistics for the focus regions.
>>> + */
>>> +struct bcm2835_isp_stats {
>>> + __u32 version;
>>> + __u32 size;
>>> + struct bcm2835_isp_stats_hist hist[NUM_HISTOGRAMS];
>>> + struct bcm2835_isp_stats_region awb_stats[AWB_REGIONS];
>>> + struct bcm2835_isp_stats_region floating_stats[FLOATING_REGIONS];
>>> + struct bcm2835_isp_stats_region agc_stats[AGC_REGIONS];
>>> + struct bcm2835_isp_stats_focus focus_stats[FOCUS_REGIONS];
>>> +};
>>> +
>>> +#endif /* __BCM2835_ISP_H_ */
>>> diff --git a/drivers/staging/vc04_services/vchiq-mmal/Kconfig b/drivers/staging/vc04_services/vchiq-mmal/Kconfig
>>> index 106f71e709df..072f3c755a68 100644
>>> --- a/drivers/staging/vc04_services/vchiq-mmal/Kconfig
>>> +++ b/drivers/staging/vc04_services/vchiq-mmal/Kconfig
>>> @@ -5,4 +5,5 @@ config BCM2835_VCHIQ_MMAL
>>> help
>>> Enables the MMAL API over VCHIQ interface as used for the
>>> majority of the multimedia services on VideoCore.
>>> - Defaults to Y when the Broadcomd BCM2835 camera host is selected.
>>> + Defaults to Y when the Broadcomd BCM2835 camera host or ISP are
>>> + selected.
>>> diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h b/drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h
>>> index 44ba91aa6d47..8d904fcce388 100644
>>> --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h
>>> +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h
>>> @@ -100,6 +100,10 @@
>>> */
>>> #define MMAL_ENCODING_EGL_IMAGE MMAL_FOURCC('E', 'G', 'L', 'I')
>>>
>>> +/** ISP image statistics format
>>> + */
>>> +#define MMAL_ENCODING_BRCM_STATS MMAL_FOURCC('S', 'T', 'A', 'T')
>>> +
>>> /* }@ */
>>>
>>> /** \name Pre-defined audio encodings */
>>> diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h b/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
>>> index 1793103b18fd..b3552af5cf8f 100644
>>> --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
>>> +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
>>> @@ -221,6 +221,62 @@ enum mmal_parameter_camera_type {
>>> MMAL_PARAMETER_SHUTTER_SPEED,
>>> /**< Takes a @ref MMAL_PARAMETER_AWB_GAINS_T */
>>> MMAL_PARAMETER_CUSTOM_AWB_GAINS,
>>> + /**< Takes a @ref MMAL_PARAMETER_CAMERA_SETTINGS_T */
>>> + MMAL_PARAMETER_CAMERA_SETTINGS,
>>> + /**< Takes a @ref MMAL_PARAMETER_PRIVACY_INDICATOR_T */
>>> + MMAL_PARAMETER_PRIVACY_INDICATOR,
>>> + /**< Takes a @ref MMAL_PARAMETER_BOOLEAN_T */
>>> + MMAL_PARAMETER_VIDEO_DENOISE,
>>> + /**< Takes a @ref MMAL_PARAMETER_BOOLEAN_T */
>>> + MMAL_PARAMETER_STILLS_DENOISE,
>>> + /**< Takes a @ref MMAL_PARAMETER_CAMERA_ANNOTATE_T */
>>> + MMAL_PARAMETER_ANNOTATE,
>>> + /**< Takes a @ref MMAL_PARAMETER_STEREOSCOPIC_MODE_T */
>>> + MMAL_PARAMETER_STEREOSCOPIC_MODE,
>>> + /**< Takes a @ref MMAL_PARAMETER_CAMERA_INTERFACE_T */
>>> + MMAL_PARAMETER_CAMERA_INTERFACE,
>>> + /**< Takes a @ref MMAL_PARAMETER_CAMERA_CLOCKING_MODE_T */
>>> + MMAL_PARAMETER_CAMERA_CLOCKING_MODE,
>>> + /**< Takes a @ref MMAL_PARAMETER_CAMERA_RX_CONFIG_T */
>>> + MMAL_PARAMETER_CAMERA_RX_CONFIG,
>>> + /**< Takes a @ref MMAL_PARAMETER_CAMERA_RX_TIMING_T */
>>> + MMAL_PARAMETER_CAMERA_RX_TIMING,
>>> + /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
>>> + MMAL_PARAMETER_DPF_CONFIG,
>>> +
>>> + /* 0x50 */
>>> + /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
>>> + MMAL_PARAMETER_JPEG_RESTART_INTERVAL,
>>> + /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
>>> + MMAL_PARAMETER_CAMERA_ISP_BLOCK_OVERRIDE,
>>> + /**< Takes a @ref MMAL_PARAMETER_LENS_SHADING_T */
>>> + MMAL_PARAMETER_LENS_SHADING_OVERRIDE,
>>> + /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
>>> + MMAL_PARAMETER_BLACK_LEVEL,
>>> + /**< Takes a @ref MMAL_PARAMETER_RESIZE_T */
>>> + MMAL_PARAMETER_RESIZE_PARAMS,
>>> + /**< Takes a @ref MMAL_PARAMETER_CROP_T */
>>> + MMAL_PARAMETER_CROP,
>>> + /**< Takes a @ref MMAL_PARAMETER_INT32_T */
>>> + MMAL_PARAMETER_OUTPUT_SHIFT,
>>> + /**< Takes a @ref MMAL_PARAMETER_INT32_T */
>>> + MMAL_PARAMETER_CCM_SHIFT,
>>> + /**< Takes a @ref MMAL_PARAMETER_CUSTOM_CCM_T */
>>> + MMAL_PARAMETER_CUSTOM_CCM,
>>> + /**< Takes a @ref MMAL_PARAMETER_RATIONAL_T */
>>> + MMAL_PARAMETER_ANALOG_GAIN,
>>> + /**< Takes a @ref MMAL_PARAMETER_RATIONAL_T */
>>> + MMAL_PARAMETER_DIGITAL_GAIN,
>>> + /**< Takes a @ref MMAL_PARAMETER_DENOISE_T */
>>> + MMAL_PARAMETER_DENOISE,
>>> + /**< Takes a @ref MMAL_PARAMETER_SHARPEN_T */
>>> + MMAL_PARAMETER_SHARPEN,
>>> + /**< Takes a @ref MMAL_PARAMETER_GEQ_T */
>>> + MMAL_PARAMETER_GEQ,
>>> + /**< Tales a @ref MMAP_PARAMETER_DPC_T */
>>> + MMAL_PARAMETER_DPC,
>>> + /**< Tales a @ref MMAP_PARAMETER_GAMMA_T */
>>> + MMAL_PARAMETER_GAMMA,
>>> };
>>>
>>> struct mmal_parameter_rational {
>>> @@ -779,7 +835,102 @@ struct mmal_parameter_camera_info {
>>> struct mmal_parameter_camera_info_camera
>>> cameras[MMAL_PARAMETER_CAMERA_INFO_MAX_CAMERAS];
>>> struct mmal_parameter_camera_info_flash
>>> - flashes[MMAL_PARAMETER_CAMERA_INFO_MAX_FLASHES];
>>> + flashes[MMAL_PARAMETER_CAMERA_INFO_MAX_FLASHES];
>>> +};
>>> +
>>> +struct mmal_parameter_ccm {
>>> + struct mmal_parameter_rational ccm[3][3];
>>> + s32 offsets[3];
>>> +};
>>> +
>>> +struct mmal_parameter_custom_ccm {
>>> + u32 enabled; /**< Enable the custom CCM. */
>>> + struct mmal_parameter_ccm ccm; /**< CCM to be used. */
>>> +};
>>> +
>>> +struct mmal_parameter_lens_shading {
>>> + u32 enabled;
>>> + u32 grid_cell_size;
>>> + u32 grid_width;
>>> + u32 grid_stride;
>>> + u32 grid_height;
>>> + u32 mem_handle_table;
>>> + u32 ref_transform;
>>> +};
>>> +
>>> +enum mmal_parameter_ls_gain_format_type {
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U0P8_1 = 0,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U1P7_0 = 1,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U1P7_1 = 2,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U2P6_0 = 3,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U2P6_1 = 4,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U3P5_0 = 5,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U3P5_1 = 6,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_U4P10 = 7,
>>> + MMAL_PARAMETER_LS_GAIN_FORMAT_TYPE_DUMMY = 0x7FFFFFFF
>>> +};
>>> +
>>> +struct mmal_parameter_lens_shading_v2 {
>>> + u32 enabled;
>>> + u32 grid_cell_size;
>>> + u32 grid_width;
>>> + u32 grid_stride;
>>> + u32 grid_height;
>>> + u32 mem_handle_table;
>>> + u32 ref_transform;
>>> + u32 corner_sampled;
>>> + enum mmal_parameter_ls_gain_format_type gain_format;
>>> +};
>>> +
>>> +struct mmal_parameter_black_level {
>>> + u32 enabled;
>>> + u16 black_level_r;
>>> + u16 black_level_g;
>>> + u16 black_level_b;
>>> + u8 pad_[2]; /* Unused */
>>> +};
>>> +
>>> +struct mmal_parameter_geq {
>>> + u32 enabled;
>>> + u32 offset;
>>> + struct mmal_parameter_rational slope;
>>> +};
>>> +
>>> +#define MMAL_NUM_GAMMA_PTS 33
>>> +struct mmal_parameter_gamma {
>>> + u32 enabled;
>>> + u16 x[MMAL_NUM_GAMMA_PTS];
>>> + u16 y[MMAL_NUM_GAMMA_PTS];
>>> +};
>>> +
>>> +struct mmal_parameter_denoise {
>>> + u32 enabled;
>>> + u32 constant;
>>> + struct mmal_parameter_rational slope;
>>> + struct mmal_parameter_rational strength;
>>> +};
>>> +
>>> +struct mmal_parameter_sharpen {
>>> + u32 enabled;
>>> + struct mmal_parameter_rational threshold;
>>> + struct mmal_parameter_rational strength;
>>> + struct mmal_parameter_rational limit;
>>> +};
>>> +
>>> +enum mmal_dpc_mode {
>>> + MMAL_DPC_MODE_OFF = 0,
>>> + MMAL_DPC_MODE_NORMAL = 1,
>>> + MMAL_DPC_MODE_STRONG = 2,
>>> + MMAL_DPC_MODE_MAX = 0x7FFFFFFF,
>>> +};
>>> +
>>> +struct mmal_parameter_dpc {
>>> + u32 enabled;
>>> + u32 strength;
>>> +};
>>> +
>>> +struct mmal_parameter_crop {
>>> + struct vchiq_mmal_rect rect;
>>> };
>>>
>>> #endif
>>>
>>
>> Regards,
>>
>> Hans
>
> Regards,
> Naush
>
next prev parent reply other threads:[~2020-06-24 11:28 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-04 9:25 [PATCH v2 00/34] Drivers for the BCM283x CSI-2/CCP2 receiver and ISP Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 01/34] media: uapi: v4l2-core: Add sensor ancillary data V4L2 fourcc type Laurent Pinchart
2020-05-04 13:48 ` Hans Verkuil
2020-05-04 14:39 ` Dave Stevenson
2020-05-04 15:32 ` Hans Verkuil
2020-05-04 16:08 ` Laurent Pinchart
2020-05-05 11:20 ` Dave Stevenson
2020-05-04 9:25 ` [PATCH v2 02/34] media: uapi: Add MEDIA_BUS_FMT_SENSOR_DATA media bus format Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 03/34] dt-bindings: media: Document BCM283x CSI2/CCP2 receiver Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 04/34] media: bcm2835-unicam: Driver for CCP2/CSI2 camera interface Laurent Pinchart
2020-05-04 15:21 ` Hans Verkuil
2020-05-05 1:26 ` kbuild test robot
2020-05-06 18:01 ` Nicolas Saenz Julienne
2020-08-29 11:20 ` Jacopo Mondi
2020-08-29 18:32 ` Laurent Pinchart
2020-08-31 7:38 ` Jacopo Mondi
2020-08-31 14:17 ` Laurent Pinchart
2020-08-31 14:46 ` Jacopo Mondi
2020-08-31 14:56 ` Laurent Pinchart
2020-09-01 8:41 ` Dave Stevenson
2020-09-01 10:22 ` Jacopo Mondi
2020-09-01 16:37 ` Dave Stevenson
2020-09-01 17:11 ` Laurent Pinchart
2020-09-15 7:03 ` Sakari Ailus
2020-09-15 9:32 ` Laurent Pinchart
2020-09-15 13:28 ` Dave Stevenson
2020-10-30 17:53 ` Jacopo Mondi
2020-09-15 17:30 ` Dave Stevenson
2020-05-04 9:25 ` [PATCH v2 05/34] ARM: dts: bcm2711: Add Unicam DT nodes Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 06/34] staging: vc04_services: Add new vc-sm-cma driver Laurent Pinchart
2020-05-05 2:38 ` kbuild test robot
2020-05-05 12:17 ` kbuild test robot
2020-05-06 3:05 ` kbuild test robot
2020-05-06 18:04 ` Nicolas Saenz Julienne
2020-05-06 19:24 ` Dave Stevenson
2020-05-08 0:11 ` Laurent Pinchart
2020-05-18 12:06 ` Hans Verkuil
2020-08-24 16:39 ` Jacopo Mondi
2020-08-25 17:52 ` Dave Stevenson
2020-08-27 10:38 ` Jacopo Mondi
2020-08-27 12:51 ` Dave Stevenson
2020-08-27 16:46 ` Jacopo Mondi
2020-08-27 17:19 ` Dave Stevenson
2020-05-11 18:42 ` Nicolas Saenz Julienne
2020-05-18 15:48 ` Dave Stevenson
2020-05-20 14:41 ` Nicolas Saenz Julienne
2020-05-21 11:01 ` Dave Stevenson
2020-05-04 9:25 ` [PATCH v2 07/34] staging: bcm2835: Break MMAL support out from camera Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 08/34] staging: mmal-vchiq: Allocate and free components as required Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 09/34] staging: mmal-vchiq: Avoid use of bool in structures Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 10/34] staging: mmal-vchiq: Make timeout a defined parameter Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 11/34] staging: mmal-vchiq: Make a mmal_buf struct for passing parameters Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 12/34] staging: mmal-vchiq: Add support for event callbacks Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 13/34] staging: mmal-vchiq: Support sending data to MMAL ports Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 14/34] staging: mmal-vchiq: Fixup vchiq-mmal include ordering Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 15/34] staging: mmal-vchiq: Use vc-sm-cma to support zero copy Laurent Pinchart
2020-05-04 16:30 ` Nicolas Saenz Julienne
2020-05-05 16:07 ` kbuild test robot
2020-05-11 19:15 ` Nicolas Saenz Julienne
2020-05-04 9:25 ` [PATCH v2 16/34] staging: mmal-vchiq: Fix client_component for 64 bit kernel Laurent Pinchart
2020-05-18 10:19 ` Hans Verkuil
2020-05-04 9:25 ` [PATCH v2 17/34] staging: mmal_vchiq: Add in the Bayer encoding formats Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 18/34] staging: mmal-vchiq: Always return the param size from param_get Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 19/34] staging: mmal-vchiq: If the VPU returns an error, don't negate it Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 20/34] staging: mmal-vchiq: Fix handling of VB2_MEMORY_DMABUF buffers Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 21/34] staging: mmal-vchiq: Update mmal_parameters.h with recently defined params Laurent Pinchart
2020-05-04 9:25 ` [PATCH v2 22/34] staging: mmal-vchiq: Free the event context for control ports Laurent Pinchart
2020-05-04 9:26 ` [PATCH v2 23/34] staging: mmal-vchiq: Fix memory leak in error path Laurent Pinchart
2020-05-04 9:26 ` [PATCH v2 24/34] staging: mmal-vchiq: Fix formatting errors in mmal_parameters.h Laurent Pinchart
2020-05-04 9:26 ` [PATCH v2 25/34] staging: vchiq_arm: Register vcsm-cma as a platform driver Laurent Pinchart
2020-05-04 9:26 ` [PATCH v2 26/34] staging: vchiq_arm: Set up dma ranges on child devices Laurent Pinchart
2020-05-04 16:54 ` Nicolas Saenz Julienne
2020-08-25 16:57 ` Jacopo Mondi
2020-05-04 9:26 ` [PATCH v2 27/34] staging: vchiq: Use the old dma controller for OF config on platform devices Laurent Pinchart
2020-05-04 15:44 ` Nicolas Saenz Julienne
2020-05-04 9:26 ` [PATCH v2 28/34] staging: vchiq_2835_arm: Implement a DMA pool for small bulk transfers Laurent Pinchart
2020-05-04 9:26 ` [PATCH v2 29/34] staging: vchiq: Add 36-bit address support Laurent Pinchart
2020-05-04 17:40 ` Nicolas Saenz Julienne
2020-05-04 20:46 ` Phil Elwell
2020-05-05 10:13 ` Nicolas Saenz Julienne
2020-05-05 10:57 ` Phil Elwell
2020-05-05 13:22 ` kbuild test robot
2020-05-04 9:26 ` [PATCH v2 30/34] staging: vchiq_arm: Give vchiq children DT nodes Laurent Pinchart
2020-05-04 17:12 ` Nicolas Saenz Julienne
2020-05-04 19:42 ` Phil Elwell
2020-05-05 10:37 ` Nicolas Saenz Julienne
2020-05-05 10:50 ` Phil Elwell
2020-05-04 9:26 ` [PATCH v2 31/34] staging: vchiq_arm: Add a matching unregister call Laurent Pinchart
2020-05-04 9:26 ` [PATCH v2 32/34] media: videobuf2: Allow exporting of a struct dmabuf Laurent Pinchart
2020-05-04 13:36 ` Hans Verkuil
2020-05-04 9:26 ` [PATCH v2 33/34] staging: bcm2835-isp: Add support for BC2835 ISP Laurent Pinchart
2020-05-11 19:19 ` Nicolas Saenz Julienne
2020-05-18 13:38 ` Dave Stevenson
2020-05-20 13:46 ` Nicolas Saenz Julienne
2020-05-18 12:02 ` Hans Verkuil
2020-05-18 14:36 ` Dave Stevenson
2020-05-18 15:07 ` Hans Verkuil
2020-05-19 12:47 ` Naushir Patuck
2020-05-19 13:03 ` Jacopo Mondi
2020-06-24 11:28 ` Hans Verkuil [this message]
2020-05-04 9:26 ` [PATCH v2 34/34] staging: vchiq: Load bcm2835_isp driver from vchiq Laurent Pinchart
2020-05-04 15:15 ` [PATCH v2 00/34] Drivers for the BCM283x CSI-2/CCP2 receiver and ISP Nicolas Saenz Julienne
2020-05-04 15:38 ` Laurent Pinchart
2020-05-04 16:15 ` Nicolas Saenz Julienne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=88e0e7f1-5ddd-5525-ddad-cfdb42608bc3@xs4all.nl \
--to=hverkuil@xs4all.nl \
--cc=dave.stevenson@raspberrypi.com \
--cc=jacopo@jmondi.org \
--cc=kieran.bingham@ideasonboard.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=naush@raspberrypi.com \
--cc=niklas.soderlund@ragnatech.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).