[PATCH v5 00/10] media: Add support for Broadcom/RPi BCM2835 ISP
From: Jai Luthra
Date: Thu Sep 17 2026 - 04:26:09 EST
Hi,
This series adds initial support for Broadcom/Raspberry Pi BCM2835 ISP
present on older Raspberry Pi boards.
The underlying hardware for the ISP is accessed through the VideoCore
VPU, via the VCHIQ/MMAL interface that was recently destaged under
platform/raspberrypi. The ISP driver, and thus this series, depends on
VCSM CMA driver for shared memory support (for lens shading buffers):
https://lore.kernel.org/all/20260916-b4-vc-sm-cma-v4-0-476d1142b5df@xxxxxxxxxxxxxxxx
The baseline driver was taken from the one present in the downstream
raspberrypi 6.12 tree (which was posted as v1 with minor cleanups).
Since then the driver has been significantly modified, switching away
from custom V4L2 controls to parameter buffers for ISP configuration,
and many other fixes.
This series along with dependencies is available for ease of testing in
this linux branch:
https://github.com/jailuthra/linux/tree/b4/rpi-isp
You can test this series with libcamera, using the following libcamera
branch:
https://github.com/jailuthra/libcamera/tree/pi4-upstream
This series (v4 onwards) depends on the latest raspberry pi firmware
that is in process of being published. I'll reply with a link to this
cover letter when it's available.
Thanks,
Jai
Signed-off-by: Jai Luthra <jai.luthra@xxxxxxxxxxxxxxxx>
---
Changes in v5:
- Add missing note in cover letter about dependency on latest firmware
- Update documentation of return type of vb2_core_expbuf_dmabuf() to only
ERR_PTR and not NULL
- Fix warnings reported by media-ci (coccinelle, smatch etc.)
- Use struct_group() around the fields we want to memcpy from UAPI param
struct to the anonymous structs inside mmal_parameter_isp_parameters
- Don't use complicated pointer arithmetic and instead write
mmal_param->_mmal_substruct.update = 1 explicitly
- Only check for IS_ERR and not IS_ERR_OR_NULL for output of
vb2_core_expbuf_dmabuf()
- Check node->id against array bounds
- Link to v4: https://lore.kernel.org/r/20260916-b4-vchiq-isp-v4-0-f668c2017b74@xxxxxxxxxxxxxxxx
Changes in v4:
- Rebase on v7.3-rc1
- Set ISP_NUM_INSTANCES to 1 until we have proper support for
multiplexing ISP instances (Laurent)
- Add a new struct mmal_parameter_isp_parameters {} in mmal-parameters.h
to send combined updates the firmware (Dave)
- Rework bcm2835-isp-params.c to use the above and save expensive
messages over IPC boundary (Dave)
- Test if the firmware supports the single struct, and fail with an
error message asking the user to update their firmware if not (Dave)
- Check for retval of isp_set_param() and print error messages if it
fails
- Various cleanups and suggestions (Paul)
- Add "media: videobuf2-core: Move type check out of vb2_core_expbuf()"
on Laurent's suggestion
- Drop comment about FourCC values being copied from V4L2
- Drop old paragraph in Kconfig that got copied from previous revision
- Link to v3: https://lore.kernel.org/r/20260717-b4-vchiq-isp-v3-0-fb8235e15c68@xxxxxxxxxxxxxxxx
Changes in v3:
- Rebase on v7.2-rc1
- Split PATCH 1 to add missing incles before moving the headers
- Update commit messages with Laurent's suggestions
- Drop redundant buffer list and locks for params as we send them
immediately to the firmware in .buf_queue
- Drop the now empty .stop_streaming() for params node
- Minor cleanups
- Link to v2: https://lore.kernel.org/r/20260210-b4-vchiq-isp-v2-0-4403944152fe@xxxxxxxxxxxxxxxx
Changes in v2:
- Replace custom V4L2 controls (V4L2_CID_USER_BCM2835_ISP_*) with the
V4L2 extensible parameters framework via a dedicated metadata output
node (bcm2835-isp-params). Split params handling into new file
bcm2835-isp-params.c.
- Add AWB gains and digital gain as extensible parameter block types
instead of standard V4L2 integer controls.
- Use MEDIA_ENT_F_PROC_VIDEO_ISP instead of MEDIA_ENT_F_PROC_VIDEO_SCALER
for the media entity function.
- Rework media controller registration: let video device nodes handle
their own entity registration, removing the manual entity/interface
creation in media_controller_register_node().
- Propagate colorspace, ycbcr_enc, xfer_func, and quantization properly
through g_fmt/s_fmt.
- Fold the stats/params FourCC additions (previously a separate commit)
into this patch.
- Drop the custom CID base commit (no longer needed).
- Update documentation.
- Link to v1: https://lore.kernel.org/r/20260113-b4-vchiq-isp-v1-0-ea0b300bffc8@xxxxxxxxxxxxxxxx
---
Dave Stevenson (1):
media: videobuf2: Allow exporting of a struct dmabuf
Jai Luthra (7):
media: videobuf2-core: Move type check out of vb2_core_expbuf()
platform/raspberrypi: vchiq-mmal: Include missing headers
platform/raspberrypi: vchiq-mmal: Move headers to include/linux
platform/raspberrypi: vchiq-mmal: Support ISP parameters and stats
platform/raspberrypi: vchiq-mmal: Support bayer and gray formats
platform/raspberrypi: vchiq: Add helpers for vchiq driver data
media: platform: broadcom: Move unicam driver to subdir
Naushir Patuck (2):
media: platform: broadcom: Add bcm2835-isp driver
platform/raspberrypi: vchiq: Load bcm2835_isp driver from vchiq
Documentation/admin-guide/media/bcm2835-isp.dot | 14 +
Documentation/admin-guide/media/bcm2835-isp.rst | 78 +
Documentation/admin-guide/media/v4l-drivers.rst | 1 +
.../userspace-api/media/v4l/meta-formats.rst | 1 +
.../media/v4l/metafmt-bcm2835-isp.rst | 101 ++
MAINTAINERS | 12 +-
drivers/media/common/videobuf2/videobuf2-core.c | 50 +-
drivers/media/common/videobuf2/videobuf2-v4l2.c | 8 +-
drivers/media/dvb-core/dvb_vb2.c | 3 +-
drivers/media/platform/broadcom/Kconfig | 18 +-
drivers/media/platform/broadcom/Makefile | 3 +-
.../media/platform/broadcom/bcm2835-isp/Kconfig | 15 +
.../media/platform/broadcom/bcm2835-isp/Makefile | 4 +
.../broadcom/bcm2835-isp/bcm2835-isp-common.h | 50 +
.../broadcom/bcm2835-isp/bcm2835-isp-fmts.h | 558 +++++++
.../broadcom/bcm2835-isp/bcm2835-isp-params.c | 510 +++++++
.../broadcom/bcm2835-isp/bcm2835-v4l2-isp.c | 1516 ++++++++++++++++++++
.../media/platform/broadcom/bcm2835-unicam/Kconfig | 18 +
.../platform/broadcom/bcm2835-unicam/Makefile | 3 +
.../{ => bcm2835-unicam}/bcm2835-unicam-regs.h | 0
.../broadcom/{ => bcm2835-unicam}/bcm2835-unicam.c | 0
drivers/media/v4l2-core/v4l2-ioctl.c | 2 +
.../raspberrypi/vchiq-interface/vchiq_arm.c | 2 +
.../platform/raspberrypi/vchiq-mmal/mmal-vchiq.c | 9 +-
.../linux/raspberrypi}/mmal-common.h | 4 +
.../linux/raspberrypi}/mmal-encodings.h | 67 +
.../linux/raspberrypi}/mmal-msg-common.h | 0
.../linux/raspberrypi}/mmal-msg-format.h | 0
.../linux/raspberrypi}/mmal-msg-port.h | 0
.../linux/raspberrypi}/mmal-msg.h | 0
.../linux/raspberrypi}/mmal-parameters.h | 217 +++
.../linux/raspberrypi}/mmal-vchiq.h | 0
include/linux/raspberrypi/vchiq_arm.h | 1 +
include/linux/raspberrypi/vchiq_bus.h | 10 +
include/media/videobuf2-core.h | 21 +-
include/uapi/linux/bcm2835-isp.h | 530 +++++++
include/uapi/linux/videodev2.h | 2 +
37 files changed, 3778 insertions(+), 50 deletions(-)
---
base-commit: e5e04726cdd043e309677071ab1b65a4b18f422b
change-id: 20250923-b4-vchiq-isp-7e8c22c2860c
prerequisite-change-id: 20251030-b4-vc-sm-cma-f6727c39cd25:v4
prerequisite-patch-id: 4fc8cb49edcbe9c8e699b4ab9f6863ac040a070b
prerequisite-patch-id: 0a5fdf8fe23298fac2c6d188e1686dd292901efc
prerequisite-patch-id: d6d9ee5b60f97112dcf1aea01212c724d9151505
prerequisite-patch-id: 3855700b608f20e2a6857a9702838d1e54fc31cb
prerequisite-patch-id: e2b1e84a1e94e7095b964da693129d36dda78bb0
prerequisite-patch-id: 07e50207cc947f44e1d626b31d0ace7e12a8f3a1
prerequisite-patch-id: 3d82a2605799686668729fdc2677c3f6b7c2aa0d
prerequisite-patch-id: 7795536d875736f74fb4b2e77ca106b127bedbc0
prerequisite-patch-id: ad833b78f90ce3081e470caf70e601fc573bb52d
prerequisite-patch-id: 1898d91213e9bd75be3109180527fb0caf6d7174
prerequisite-patch-id: d0cfc49c673c8c4a4c13d44a547104c24f57cb49
Best regards,
--
Jai Luthra <jai.luthra@xxxxxxxxxxxxxxxx>