diff --git a/pkgbuilds/intel-ipu7-camera/0005-camhal-MediaControl-route-through-Intel-CVS-bridge.patch b/pkgbuilds/intel-ipu7-camera/0005-camhal-MediaControl-route-through-Intel-CVS-bridge.patch new file mode 100644 index 00000000..34389878 --- /dev/null +++ b/pkgbuilds/intel-ipu7-camera/0005-camhal-MediaControl-route-through-Intel-CVS-bridge.patch @@ -0,0 +1,77 @@ +From f167239b3ecf242ae081767892cb0a4c54bad496 Mon Sep 17 00:00:00 2001 +From: Arun T +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(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 + diff --git a/pkgbuilds/intel-ipu7-camera/0006-camhal-ipu75xa-ov08x40-Intel-CVS-formats.patch b/pkgbuilds/intel-ipu7-camera/0006-camhal-ipu75xa-ov08x40-Intel-CVS-formats.patch new file mode 100644 index 00000000..1f5705a5 --- /dev/null +++ b/pkgbuilds/intel-ipu7-camera/0006-camhal-ipu75xa-ov08x40-Intel-CVS-formats.patch @@ -0,0 +1,32 @@ +From: Spencer Bull +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" diff --git a/pkgbuilds/intel-ipu7-camera/PKGBUILD b/pkgbuilds/intel-ipu7-camera/PKGBUILD index c7f44e6a..07bbe117 100644 --- a/pkgbuilds/intel-ipu7-camera/PKGBUILD +++ b/pkgbuilds/intel-ipu7-camera/PKGBUILD @@ -1,8 +1,8 @@ # Maintainer: Omarchy 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 \ diff --git a/pkgbuilds/intel-ipu7-camera/dkms-intel-cvs.conf b/pkgbuilds/intel-ipu7-camera/dkms-intel-cvs.conf new file mode 100644 index 00000000..b185743d --- /dev/null +++ b/pkgbuilds/intel-ipu7-camera/dkms-intel-cvs.conf @@ -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" diff --git a/pkgbuilds/intel-ipu7-camera/dkms-vision-drivers.conf b/pkgbuilds/intel-ipu7-camera/dkms-vision-drivers.conf index 3582d0f2..ab475454 100644 --- a/pkgbuilds/intel-ipu7-camera/dkms-vision-drivers.conf +++ b/pkgbuilds/intel-ipu7-camera/dkms-vision-drivers.conf @@ -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" diff --git a/pkgbuilds/intel-ipu7-camera/intel-cvs-Makefile b/pkgbuilds/intel-ipu7-camera/intel-cvs-Makefile new file mode 100644 index 00000000..0cd40ebd --- /dev/null +++ b/pkgbuilds/intel-ipu7-camera/intel-cvs-Makefile @@ -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