Fix Intel IPU7 camera on Linux 7.2 by adopting the CVS V4L2 bridge
Linux 7.2 changed how the Intel CVS controller (ACPI INTC10E1 on Panther Lake) appears to the IPU. ipu-bridge now places it between the sensor and the IPU CSI2 receiver, like IVSC, and the new in-tree drivers/media/i2c/cvs driver provides the matching "Intel CVS" V4L2 bridge sub-device. Our out-of-tree vision-drivers intel_cvs has no sub-device and displaces the in-tree module of the same name, so on 7.2 the sensor never joins the media graph and the HAL reports "No sensors available". Both linux-ptl 7.2.3 and linux-omarchy 7.2.5 fail this way. Ship the in-tree 7.2 CVS driver verbatim as DKMS module intel-cvs for 7.2+ kernels. Arch-derived kernel configs cannot enable CONFIG_VIDEO_INTEL_CVS themselves: it sits under a menu hidden by MEDIA_HIDE_ANCILLARY_SUBDRV, so olddefconfig drops it. Keep vision-drivers for kernels before 7.2. Both dkms.conf files carry a BUILD_EXCLUSIVE_KERNEL regex that the pacman dkms hook honours. Teach the camera HAL about the bridge with upstream ipu7-camera-hal commit f167239 (MediaControl routes the sensor link through "Intel CVS" and finds the I2C bus through it) and add "Intel CVS" pad formats to the ipu75xa ov08x40 config so link validation passes. Links stay sensor to CSI2 in the config and are rewritten at runtime, so the same files work on 7.1.
This commit is contained in:
1 parent
19ef4b560f
commit
5501e168f7
6 files changed
+198
-6
No files matched your search
+77
@@ -0,0 +1,77 @@
|
||||
From f167239b3ecf242ae081767892cb0a4c54bad496 Mon Sep 17 00:00:00 2001
|
||||
From: Arun T <arun.t@intel.com>
|
||||
Date: Thu, 2 Jul 2026 06:19:35 +0530
|
||||
Subject: [PATCH] Enable ov08x40 CVS for support upstream cvs driver
|
||||
|
||||
Linux 7.2 wires the Intel CVS (Computer Vision Sensing) controller into
|
||||
the IPU media graph as a bridge entity named "Intel CVS" that sits between
|
||||
the sensor and the IPU CSI2 receiver (ipu-bridge commit c6b1b34b5090,
|
||||
in-tree driver drivers/media/i2c/cvs). Teach MediaControl to route the
|
||||
sensor -> CSI2 link through that entity when it is present, and to find
|
||||
the sensor's I2C bus through it. Kernels without the entity are unaffected.
|
||||
|
||||
Upstream: https://github.com/intel/ipu7-camera-hal/commit/f167239b3ecf242ae081767892cb0a4c54bad496
|
||||
(only the src/ part; the ipu8 config changes are not needed for ipu75xa)
|
||||
---
|
||||
src/v4l2/MediaControl.cpp | 31 +++++++++++++++++++++++++++++++
|
||||
1 file changed, 31 insertions(+)
|
||||
|
||||
diff --git a/src/v4l2/MediaControl.cpp b/src/v4l2/MediaControl.cpp
|
||||
index 0b2cc33..807d4f4 100644
|
||||
--- a/src/v4l2/MediaControl.cpp
|
||||
+++ b/src/v4l2/MediaControl.cpp
|
||||
@@ -63,6 +63,7 @@ struct MediaEntity {
|
||||
char devname[32];
|
||||
};
|
||||
|
||||
+static const string icvsName = "Intel CVS";
|
||||
MediaControl* MediaControl::sInstance = nullptr;
|
||||
Mutex MediaControl::sLock;
|
||||
|
||||
@@ -983,6 +984,33 @@ int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf* mc, int width, int h
|
||||
}
|
||||
}
|
||||
|
||||
+ MediaEntity* icvs = getEntityByName(icvsName.c_str());
|
||||
+ if (icvs) {
|
||||
+ for (uint32_t i = 0; i < icvs->numLinks; ++i) {
|
||||
+ if (icvs->links[i].sink->entity == icvs) {
|
||||
+ MediaEntity* sensor = icvs->links[i].source->entity;
|
||||
+ int sensor_entity_id = sensor->info.id;
|
||||
+ LOG1("@%s, found %s -> %s", __func__, sensor->info.name, icvsName.c_str());
|
||||
+ for (McLink& link : mc->links) {
|
||||
+ if (link.srcEntity == sensor_entity_id && link.sinkEntity != static_cast<int>(icvs->info.id)) {
|
||||
+ LOG1("@%s, skip %s, link %s -> %s", __func__, link.srcEntityName.c_str(),
|
||||
+ icvsName.c_str(), link.sinkEntityName.c_str());
|
||||
+ link.srcEntity = icvs->info.id;
|
||||
+ link.srcEntityName = icvsName;
|
||||
+ for (uint32_t j = 0; j < icvs->info.pads; ++j) {
|
||||
+ if (icvs->pads[j].flags & MEDIA_PAD_FL_SOURCE) {
|
||||
+ link.srcPad = j;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Set link in format Configuration */
|
||||
ret = setMediaMcLink(mc->links);
|
||||
CheckAndLogError(ret != OK, ret, "set MediaCtlConf McLink failed: ret = %d", ret);
|
||||
@@ -1127,6 +1155,9 @@ int MediaControl::getI2CBusAddress(const string& sensorEntityName, const string&
|
||||
for (int i = 0; i < linksCount; i++) {
|
||||
if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
|
||||
entityName = entity.info.name;
|
||||
+ if (strcmp(entityName, icvsName.c_str()) == 0) {
|
||||
+ return getI2CBusAddress(sensorEntityName, icvsName, i2cBus);
|
||||
+ }
|
||||
break;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.55.0
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
From: Spencer Bull <spencer@omarchy.org>
|
||||
Subject: [PATCH] ipu75xa: set Intel CVS pad formats for ov08x40
|
||||
|
||||
On Linux 7.2 the "Intel CVS" bridge entity sits between ov08x40 and the
|
||||
IPU7 CSI2 receiver. Its sink pad format must be set to the sensor format
|
||||
(the source pad mirrors the sink) or link validation fails at stream-on.
|
||||
|
||||
Mirrors the upstream ipu8 change in ipu7-camera-hal commit f167239b3ecf.
|
||||
Only formats are added; links stay sensor -> CSI2 in the config because
|
||||
MediaControl rewrites them through the bridge at runtime, so this config
|
||||
also keeps working on kernels without the CVS entity (a format entry for
|
||||
a missing entity is logged and skipped).
|
||||
---
|
||||
diff --git i/config/linux/ipu75xa/sensors/ov08x40-uf.json w/config/linux/ipu75xa/sensors/ov08x40-uf.json
|
||||
index ff31df5..483bf1d 100644
|
||||
--- i/config/linux/ipu75xa/sensors/ov08x40-uf.json
|
||||
+++ w/config/linux/ipu75xa/sensors/ov08x40-uf.json
|
||||
@@ -31,6 +31,14 @@
|
||||
"name": "ov08x40 $I2CBUS", "pad": 0, "width": 3856, "height": 2176,
|
||||
"format": "V4L2_MBUS_FMT_SGRBG10_1X10"
|
||||
},
|
||||
+ {
|
||||
+ "name": "Intel CVS", "pad": 0, "width": 3856, "height": 2176,
|
||||
+ "format": "V4L2_MBUS_FMT_SGRBG10_1X10"
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Intel CVS", "pad": 1, "width": 3856, "height": 2176,
|
||||
+ "format": "V4L2_MBUS_FMT_SGRBG10_1X10"
|
||||
+ },
|
||||
{
|
||||
"name": "Intel IPU7 CSI2 $CSI_PORT", "pad": 0, "width": 3856, "height": 2176,
|
||||
"format": "V4L2_MBUS_FMT_SGRBG10_1X10"
|
||||
@@ -1,8 +1,8 @@
|
||||
# Maintainer: Omarchy <packages@omarchy.org>
|
||||
|
||||
pkgname=intel-ipu7-camera
|
||||
pkgver=1.0.5
|
||||
pkgrel=2
|
||||
pkgver=1.0.6
|
||||
pkgrel=1
|
||||
pkgdesc="Intel IPU7 MIPI camera stack for Hurrican/Performance (OV08X40 + hardware ISP)"
|
||||
arch=('x86_64')
|
||||
url="https://github.com/TsaiGaggery/hurrican_omarchy_enabling"
|
||||
@@ -37,16 +37,35 @@ _ipu7_camera_bins_commit="403c67db6b279dd02752f11db6a34552f31a3ac5"
|
||||
_ipu7_camera_hal_commit="b1f6ebef12111fb5da0133b144d69dd9b001836c"
|
||||
_icamerasrc_commit="4fb31db76b618aae72184c59314b839dedb42689"
|
||||
|
||||
# Linux 7.2 moved the Intel CVS (Computer Vision Sensing) controller into the
|
||||
# IPU media graph: ipu-bridge now places it between the sensor and the IPU
|
||||
# CSI2 receiver as an "Intel CVS" V4L2 bridge sub-device, provided by the
|
||||
# in-tree drivers/media/i2c/cvs driver. The legacy vision-drivers misc driver
|
||||
# has no such sub-device, so on 7.2 the sensor never joins the graph and the
|
||||
# HAL finds no camera. We ship the in-tree driver verbatim as a DKMS module
|
||||
# for 7.2+ kernels (Arch-derived kernel configs cannot enable it: the option
|
||||
# is hidden behind MEDIA_HIDE_ANCILLARY_SUBDRV) and keep vision-drivers for
|
||||
# older kernels. Both dkms.conf files carry matching BUILD_EXCLUSIVE_KERNEL.
|
||||
_intel_cvs_kernel_tag="v7.2.5"
|
||||
_intel_cvs_url="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/plain/drivers/media/i2c/cvs"
|
||||
|
||||
source=(
|
||||
"ipu7-drivers::git+https://github.com/intel/ipu7-drivers.git#commit=${_ipu7_drivers_commit}"
|
||||
"vision-drivers::git+https://github.com/intel/vision-drivers.git#commit=${_vision_drivers_commit}"
|
||||
"ipu7-camera-bins::git+https://github.com/intel/ipu7-camera-bins.git#commit=${_ipu7_camera_bins_commit}"
|
||||
"ipu7-camera-hal::git+https://github.com/intel/ipu7-camera-hal.git#commit=${_ipu7_camera_hal_commit}"
|
||||
"icamerasrc::git+https://github.com/intel/icamerasrc.git#commit=${_icamerasrc_commit}"
|
||||
"intel-cvs-core.c::${_intel_cvs_url}/core.c?h=${_intel_cvs_kernel_tag}"
|
||||
"intel-cvs-v4l2.c::${_intel_cvs_url}/v4l2.c?h=${_intel_cvs_kernel_tag}"
|
||||
"intel-cvs-icvs.h::${_intel_cvs_url}/icvs.h?h=${_intel_cvs_kernel_tag}"
|
||||
"0004-ipu7-psys-register-device-bus.patch"
|
||||
"0003-icvs-set-rgbcamera_pwrup_host-0-for-Panther-Lake.patch"
|
||||
"0005-camhal-MediaControl-route-through-Intel-CVS-bridge.patch"
|
||||
"0006-camhal-ipu75xa-ov08x40-Intel-CVS-formats.patch"
|
||||
"dkms-ipu7-drivers.conf"
|
||||
"dkms-vision-drivers.conf"
|
||||
"dkms-intel-cvs.conf"
|
||||
"intel-cvs-Makefile"
|
||||
"camera-deps.conf"
|
||||
"v4l2loopback-modprobe.conf"
|
||||
"camera-init.service"
|
||||
@@ -62,10 +81,13 @@ source=(
|
||||
"v4l2-relayd-ipu7-override.conf"
|
||||
)
|
||||
sha256sums=(
|
||||
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
|
||||
'b4a90ad1815c02e4cadc1b5ad6c576ae0b150cb365c68d2c934cf964a995d91f'
|
||||
'e988014f54b1b5183e9ef43b602d73bbc2c991f19a8d503560a8cdba112b76c6'
|
||||
'6dcd5201fb78766a440038c8eba2cc8c3892064ba829065e2269c30dc1905983'
|
||||
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
|
||||
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
|
||||
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
|
||||
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
|
||||
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
|
||||
'SKIP' 'SKIP' 'SKIP'
|
||||
)
|
||||
|
||||
prepare() {
|
||||
@@ -79,6 +101,11 @@ prepare() {
|
||||
git am "${srcdir}/0003-icvs-set-rgbcamera_pwrup_host-0-for-Panther-Lake.patch"
|
||||
fi
|
||||
|
||||
# Route the media graph through the Linux 7.2 "Intel CVS" bridge entity
|
||||
cd "${srcdir}/ipu7-camera-hal"
|
||||
patch -Np1 -i "${srcdir}/0005-camhal-MediaControl-route-through-Intel-CVS-bridge.patch"
|
||||
patch -Np1 -i "${srcdir}/0006-camhal-ipu75xa-ov08x40-Intel-CVS-formats.patch"
|
||||
|
||||
# Stage proprietary libs/headers for build-time use
|
||||
local staging="${srcdir}/staging"
|
||||
rm -rf "${staging}"
|
||||
@@ -145,13 +172,22 @@ package() {
|
||||
install -Dm644 "${srcdir}/dkms-ipu7-drivers.conf" "${ipu7_dkms_dir}/dkms.conf"
|
||||
sed -i "s/@PKGVER@/${pkgver}/" "${ipu7_dkms_dir}/dkms.conf"
|
||||
|
||||
# DKMS: Vision drivers (CVS)
|
||||
# DKMS: legacy Vision drivers (CVS misc driver), kernels before 7.2
|
||||
local cvs_dkms_dir="${pkgdir}/usr/src/vision-drivers-${pkgver}"
|
||||
install -dm755 "${cvs_dkms_dir}"
|
||||
cp -r "${srcdir}/vision-drivers/"* "${cvs_dkms_dir}/"
|
||||
install -Dm644 "${srcdir}/dkms-vision-drivers.conf" "${cvs_dkms_dir}/dkms.conf"
|
||||
sed -i "s/@PKGVER@/${pkgver}/" "${cvs_dkms_dir}/dkms.conf"
|
||||
|
||||
# DKMS: in-tree Linux 7.2 Intel CVS V4L2 bridge driver, kernels 7.2+
|
||||
local icvs_dkms_dir="${pkgdir}/usr/src/intel-cvs-${pkgver}"
|
||||
install -Dm644 "${srcdir}/intel-cvs-core.c" "${icvs_dkms_dir}/core.c"
|
||||
install -Dm644 "${srcdir}/intel-cvs-v4l2.c" "${icvs_dkms_dir}/v4l2.c"
|
||||
install -Dm644 "${srcdir}/intel-cvs-icvs.h" "${icvs_dkms_dir}/icvs.h"
|
||||
install -Dm644 "${srcdir}/intel-cvs-Makefile" "${icvs_dkms_dir}/Makefile"
|
||||
install -Dm644 "${srcdir}/dkms-intel-cvs.conf" "${icvs_dkms_dir}/dkms.conf"
|
||||
sed -i "s/@PKGVER@/${pkgver}/" "${icvs_dkms_dir}/dkms.conf"
|
||||
|
||||
# Firmware
|
||||
install -dm755 "${pkgdir}/usr/lib/firmware/intel/ipu"
|
||||
install -Dm644 "${srcdir}/ipu7-camera-bins/lib/firmware/intel/ipu/"*.bin \
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Intel CVS (Computer Vision Sensing) CSI-2 bridge driver.
|
||||
#
|
||||
# Verbatim copy of the in-tree Linux 7.2 driver (drivers/media/i2c/cvs),
|
||||
# built out of tree so it exists on every 7.2+ kernel regardless of the
|
||||
# kernel's Kconfig. Arch-derived configs cannot enable VIDEO_INTEL_CVS at
|
||||
# all: it lives under the "Miscellaneous helper chips" menu, which is
|
||||
# hidden by MEDIA_HIDE_ANCILLARY_SUBDRV unless CONFIG_EXPERT is set.
|
||||
#
|
||||
# 7.2's ipu-bridge inserts the CVS device between the sensor and the IPU
|
||||
# CSI2 receiver, so the IPU only sees the sensor once a driver registers
|
||||
# this V4L2 bridge sub-device. Kernels before 7.2 keep using the legacy
|
||||
# misc driver from vision-drivers (see dkms-vision-drivers.conf).
|
||||
PACKAGE_NAME="intel-cvs"
|
||||
PACKAGE_VERSION="@PKGVER@"
|
||||
AUTOINSTALL="yes"
|
||||
|
||||
# 7.2 and later only (regex, so the pacman dkms hook also honours it)
|
||||
BUILD_EXCLUSIVE_KERNEL="^(7\.([2-9]|[1-9][0-9]+)\.|([8-9]|[1-9][0-9]+)\.)"
|
||||
|
||||
BUILT_MODULE_NAME[0]="intel_cvs"
|
||||
BUILT_MODULE_LOCATION[0]=""
|
||||
DEST_MODULE_LOCATION[0]="/updates"
|
||||
|
||||
MAKE[0]="make KERNEL_SRC=${kernel_source_dir}"
|
||||
CLEAN="make KERNEL_SRC=${kernel_source_dir} clean"
|
||||
@@ -1,7 +1,15 @@
|
||||
# Legacy Intel CVS misc driver (no V4L2 bridge). Only for kernels before
|
||||
# 7.2: from 7.2 on, ipu-bridge routes the sensor through a CVS V4L2 bridge
|
||||
# sub-device, which this driver does not provide, and it would displace the
|
||||
# in-tree intel_cvs module of the same name. 7.2+ kernels use intel-cvs
|
||||
# (see dkms-intel-cvs.conf) instead.
|
||||
PACKAGE_NAME="vision-drivers"
|
||||
PACKAGE_VERSION="@PKGVER@"
|
||||
AUTOINSTALL="yes"
|
||||
|
||||
# Before 7.2 only (regex, so the pacman dkms hook also honours it)
|
||||
BUILD_EXCLUSIVE_KERNEL="^([0-6]\.|7\.[01]\.)"
|
||||
|
||||
BUILT_MODULE_NAME[0]="intel_cvs"
|
||||
BUILT_MODULE_LOCATION[0]=""
|
||||
DEST_MODULE_LOCATION[0]="/updates"
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Out-of-tree build of the in-tree Linux 7.2 Intel CVS driver
|
||||
# (drivers/media/i2c/cvs). Sources are unmodified kernel files.
|
||||
KERNELRELEASE ?= $(shell uname -r)
|
||||
KERNEL_SRC ?= /lib/modules/$(KERNELRELEASE)/build
|
||||
|
||||
obj-m := intel_cvs.o
|
||||
intel_cvs-y := core.o v4l2.o
|
||||
|
||||
all:
|
||||
$(MAKE) -C $(KERNEL_SRC) M=$(CURDIR) modules
|
||||
|
||||
clean:
|
||||
$(MAKE) -C $(KERNEL_SRC) M=$(CURDIR) clean
|
||||
Reference in new issue
Block a user