Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-5099GitHub issuePublicReceived

intel-ipu7-camera: no scheduler profile for the IMX471 graph (100005), so the camera cannot stream — ThinkPad X9-15p Gen 1

Reported by jash8506 · filed Sep 17, 2026Closed upstream on 2026-09-18 by its own reporter jash8506. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.

Received and recorded verbatim. Nothing has been checked yet.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
Not yet mapped to any requirement or component.
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

intel-ipu7-camera: no scheduler profile for the IMX471 graph (100005), so the camera cannot stream — ThinkPad X9-15p Gen 1revision 1 · captured 2026-10-04 12:10 UTC via poll

System details

Lenovo ThinkPad X9-15p Gen 1 (21VVCTO1WW), BIOS N4QET31W 1.10 (03/12/2026) — Intel Core Ultra X7 358H (Panther Lake), Arc B390 (xe, Mesa 26.2.2); IPU7 8086:b05d; Omarchy 4.0.3-1; kernel 7.2.3-arch1-3; intel-ipu7-camera 1.0.5-1; v4l2-relayd 0.2.0-2.2; libcamera 0.7.2-4; imx471-dkms-git r28.a56bd1b-1 (AUR).

The fitted sensor is a Sony IMX471 (ACPI TBE20A0), not an OV08X40.

What's wrong?

install/hardware/intel/ipu7-camera.sh installs the package when ACPI HID OVTI08F4 is present:

if grep -q "OVTI08F4" /sys/bus/acpi/devices/*/hid 2>/dev/null; then
  omarchy-pkg-add intel-ipu7-camera
fi

This board's ACPI lists four camera HIDs while only one sensor is fitted — OVTI08F4, OVTI01AF, TBE20A0, TBE20A1 — so the check passes even though the sensor that actually binds is the IMX471 behind TBE20A0.

The package then cannot drive it: /etc/camera/ipu75xa/pipe_scheduler_profiles.json defines graphIds 100000, 100002 and 100200, but the IMX471 pipeline requests 100005.

This is separate from the jsoncpp breakage in #10837 — that has to be worked around first to reach this failure at all — and separate from #12178, where the needed plugin isn't built. Here ipu75xa is the right plugin and it loads fine.

Evidence

The kernel side is healthy; the sensor binds:

intel-ipu7 0000:00:05.0: firmware cpd file: intel/ipu/ipu7ptl_fw.bin
intel-ipu7 0000:00:05.0: Found supported sensor TBE20A0:00
intel-ipu7 0000:00:05.0: Connected 1 cameras
intel_ipu7_isys.isys intel_ipu7.isys.40: bind imx471 0-001a nlanes is 4 port is 0
intel_ipu7_isys.isys intel_ipu7.isys.40: All sensor registration completed.

With #10837 worked around so the HAL loads, icamerasrc advertises exactly one camera, correctly the IMX471:

$ gst-inspect-1.0 icamerasrc | grep -A2 device-name
   (0): imx471-uf

The stock /etc/v4l2-relayd.d/ipu7.conf asks for device-name=ov08x40-uf, which is not in that enum, and the relay logs only:

gst_element_set_state: assertion 'GST_IS_ELEMENT (element)' failed

Setting device-name=imx471-uf clears that. The HAL then loads the correct IMX471 data:

CamHAL[INF] CameraParserInvoker: parseSensors: I will Load config file: sensors/imx471-uf.json
CamHAL[INF] CameraSensorsParser: resolveCsiPortAndI2CBus: I2CBus:0-001a <=> CSI Port:0
CamHAL[INF] AiqInitData: aiqb file name IMX471_BBG803N3_PTL.aiqb

and then fails on the missing profile:

CamHAL[ERR] SchedPolicy: setConfig: no config for graphId 100005
CamHAL[ERR] Scheduler: configurate 100005 error
CamHAL[ERR] CameraDevice: @configure Failed to configure H-Scheduler
CamHAL[ERR] CameraHal: failed to config streams.
streaming task paused, reason not-negotiated (-4)

I tried adding a 100005 profile using both executor groupings that already appear in that file (video_lb=[lbff] with video_bb=[bbps,post_1,post_2], and video_lb=[lbff,bbps] with video_bb=[post_1,post_2]). Both clear the scheduler error and then fail on graph topology:

CamHAL[ERR] GraphConfig: getPSysContextId: Can't find node, stream 60001, outerNode ctxId 3
CamHAL[ERR] PipeManager: Failed to bind output ports
CamHAL[ERR] ProcessingUnit: @configure configure psys dag failed:-22

The package does ship the rest of the IMX471 support — IMX471_BBG803N3_PTL.aiqb, gcss/IMX471_BBG803N3.IPU75XA.bin, sensors/imx471-uf.json, and imx471-uf-0 in libcamhal_configs.json — so the missing scheduler profile looks like an oversight.

Steps to reproduce

  1. Install Omarchy on a ThinkPad X9-15p Gen 1, or any board whose ACPI lists OVTI08F4 but which fits an IMX471 (TBE20A0).
  2. Open anything that uses the camera. /dev/video50 exists but only ever yields a flat black frame.

Ask

Either ship the IMX471 scheduler profile, or gate installation on the sensor that actually binds rather than on ACPI HID presence.

Related

  • #10837, #11358 — jsoncpp .26→.27 soname break; has to be worked around before reaching this.
  • #12178, #7697 — same class: the package is installed by detection onto hardware it cannot serve.

Workaround

Drive the sensor with libcamera's simple pipeline handler and software ISP instead of the package's userspace pipeline. Everything required:

  1. Sensor driver: install imx471-dkms-git (AUR). The IMX471 is not in the mainline kernel and intel-ipu7-camera only ships ov08x40. This package also installs the libcamera tuning file /usr/share/libcamera/ipa/simple/imx471.yaml, without which the simple IPA falls back to uncalibrated.yaml.
  2. Userspace: install libcamera and pipewire-libcamera (plus libcamera-tools if you want cam -l for diagnostics).
  3. Keep `intel-ipu7-camera` installed. It owns the ipu7-drivers DKMS source providing intel_ipu7, intel_ipu7_isys, intel_ipu7_psys, ipu_bridge and ipu_acpi. Kernel 7.2.3-arch1-3 has in-tree IPU6 but no IPU7, so removing it leaves no IPU7 driver at all.
  4. Stop its userspace pipeline: mask intel-ipu7-camera.service (it is WantedBy=graphical.target and starts the rest) and [email protected].
  5. Drop v4l2loopback: override /usr/lib/modules-load.d/v4l2-relayd.conf with an empty /etc/modules-load.d/v4l2-relayd.conf, and unload the module, so the unused /dev/video50 stops appearing as a camera.
  6. Enable the libcamera monitor. intel-ipu7-camera ships /usr/share/wireplumber/wireplumber.conf.d/disable-libcamera.conf setting monitor.libcamera = disabled; override it with monitor.libcamera = required in ~/.config/wireplumber/wireplumber.conf.d/.
  7. Keep WirePlumber's V4L2 monitor disabled (monitor.v4l2 = disabled). It stalls enumerating the 32 raw Intel IPU7 ISYS Capture nodes, which leaves the audio nodes without ports and kills the microphone.
  8. Grant the session access to the ISYS nodes. 71-ipu7-hide-isys.rules from the package sets MODE="0600" GROUP="root" on them, which blocks libcamera running as a normal user. A later rule has to restore access — on this machine /etc/udev/rules.d/99-imx471-camera.rules does it with SUBSYSTEM=="video4linux", KERNEL=="video*", GROUP="video", MODE="0660", and the user is in the video group. Its TAG+="uaccess" has no effect at that point, since 73-seat-late.rules has already run, so the nodes get no ACL and stay out of application camera pickers.
  9. Fix the colour matrix in /usr/share/libcamera/ipa/simple/imx471.yaml. Its rows sum to 1.15 / 0.50 / 1.30, and the deficient green row gives a strong magenta cast; renormalise each row to 1.0.
  10. For browsers, Chromium needs the PipeWireCamera feature flag. Omarchy already sets it in its default chrome-flags.conf.

Result: 1920x1088 at ~57 fps through pipewire-libcamera, with the debayer running on the iGPU via EGL.

View raw text
### System details

Lenovo ThinkPad X9-15p Gen 1 (21VVCTO1WW), BIOS N4QET31W 1.10 (03/12/2026) — Intel Core Ultra X7 358H (Panther Lake), Arc B390 (`xe`, Mesa 26.2.2); IPU7 `8086:b05d`; Omarchy 4.0.3-1; kernel `7.2.3-arch1-3`; `intel-ipu7-camera 1.0.5-1`; `v4l2-relayd 0.2.0-2.2`; `libcamera 0.7.2-4`; `imx471-dkms-git r28.a56bd1b-1` (AUR).

The fitted sensor is a **Sony IMX471** (ACPI `TBE20A0`), not an OV08X40.

### What's wrong?

`install/hardware/intel/ipu7-camera.sh` installs the package when ACPI HID `OVTI08F4` is present:

```bash
if grep -q "OVTI08F4" /sys/bus/acpi/devices/*/hid 2>/dev/null; then
  omarchy-pkg-add intel-ipu7-camera
fi
```

This board's ACPI lists four camera HIDs while only one sensor is fitted — `OVTI08F4`, `OVTI01AF`, `TBE20A0`, `TBE20A1` — so the check passes even though the sensor that actually binds is the IMX471 behind `TBE20A0`.

The package then cannot drive it: `/etc/camera/ipu75xa/pipe_scheduler_profiles.json` defines graphIds **100000, 100002 and 100200**, but the IMX471 pipeline requests **100005**.

This is separate from the jsoncpp breakage in #10837 — that has to be worked around first to reach this failure at all — and separate from #12178, where the needed plugin isn't built. Here `ipu75xa` is the right plugin and it loads fine.

### Evidence

The kernel side is healthy; the sensor binds:

```
intel-ipu7 0000:00:05.0: firmware cpd file: intel/ipu/ipu7ptl_fw.bin
intel-ipu7 0000:00:05.0: Found supported sensor TBE20A0:00
intel-ipu7 0000:00:05.0: Connected 1 cameras
intel_ipu7_isys.isys intel_ipu7.isys.40: bind imx471 0-001a nlanes is 4 port is 0
intel_ipu7_isys.isys intel_ipu7.isys.40: All sensor registration completed.
```

With #10837 worked around so the HAL loads, `icamerasrc` advertises exactly one camera, correctly the IMX471:

```
$ gst-inspect-1.0 icamerasrc | grep -A2 device-name
   (0): imx471-uf
```

The stock `/etc/v4l2-relayd.d/ipu7.conf` asks for `device-name=ov08x40-uf`, which is not in that enum, and the relay logs only:

```
gst_element_set_state: assertion 'GST_IS_ELEMENT (element)' failed
```

Setting `device-name=imx471-uf` clears that. The HAL then loads the correct IMX471 data:

```
CamHAL[INF] CameraParserInvoker: parseSensors: I will Load config file: sensors/imx471-uf.json
CamHAL[INF] CameraSensorsParser: resolveCsiPortAndI2CBus: I2CBus:0-001a <=> CSI Port:0
CamHAL[INF] AiqInitData: aiqb file name IMX471_BBG803N3_PTL.aiqb
```

and then fails on the missing profile:

```
CamHAL[ERR] SchedPolicy: setConfig: no config for graphId 100005
CamHAL[ERR] Scheduler: configurate 100005 error
CamHAL[ERR] CameraDevice: @configure Failed to configure H-Scheduler
CamHAL[ERR] CameraHal: failed to config streams.
streaming task paused, reason not-negotiated (-4)
```

I tried adding a 100005 profile using both executor groupings that already appear in that file (`video_lb=[lbff]` with `video_bb=[bbps,post_1,post_2]`, and `video_lb=[lbff,bbps]` with `video_bb=[post_1,post_2]`). Both clear the scheduler error and then fail on graph topology:

```
CamHAL[ERR] GraphConfig: getPSysContextId: Can't find node, stream 60001, outerNode ctxId 3
CamHAL[ERR] PipeManager: Failed to bind output ports
CamHAL[ERR] ProcessingUnit: @configure configure psys dag failed:-22
```

The package does ship the rest of the IMX471 support — `IMX471_BBG803N3_PTL.aiqb`, `gcss/IMX471_BBG803N3.IPU75XA.bin`, `sensors/imx471-uf.json`, and `imx471-uf-0` in `libcamhal_configs.json` — so the missing scheduler profile looks like an oversight.

### Steps to reproduce

1. Install Omarchy on a ThinkPad X9-15p Gen 1, or any board whose ACPI lists `OVTI08F4` but which fits an IMX471 (`TBE20A0`).
2. Open anything that uses the camera. `/dev/video50` exists but only ever yields a flat black frame.

### Ask

Either ship the IMX471 scheduler profile, or gate installation on the sensor that actually binds rather than on ACPI HID presence.

### Related

- #10837, #11358 — jsoncpp `.26`→`.27` soname break; has to be worked around before reaching this.
- #12178, #7697 — same class: the package is installed by detection onto hardware it cannot serve.

### Workaround

Drive the sensor with libcamera's `simple` pipeline handler and software ISP instead of the package's userspace pipeline. Everything required:

1. **Sensor driver:** install `imx471-dkms-git` (AUR). The IMX471 is not in the mainline kernel and `intel-ipu7-camera` only ships ov08x40. This package also installs the libcamera tuning file `/usr/share/libcamera/ipa/simple/imx471.yaml`, without which the simple IPA falls back to `uncalibrated.yaml`.
2. **Userspace:** install `libcamera` and `pipewire-libcamera` (plus `libcamera-tools` if you want `cam -l` for diagnostics).
3. **Keep `intel-ipu7-camera` installed.** It owns the `ipu7-drivers` DKMS source providing `intel_ipu7`, `intel_ipu7_isys`, `intel_ipu7_psys`, `ipu_bridge` and `ipu_acpi`. Kernel `7.2.3-arch1-3` has in-tree IPU6 but no IPU7, so removing it leaves no IPU7 driver at all.
4. **Stop its userspace pipeline:** mask `intel-ipu7-camera.service` (it is `WantedBy=graphical.target` and starts the rest) and `[email protected]`.
5. **Drop v4l2loopback:** override `/usr/lib/modules-load.d/v4l2-relayd.conf` with an empty `/etc/modules-load.d/v4l2-relayd.conf`, and unload the module, so the unused `/dev/video50` stops appearing as a camera.
6. **Enable the libcamera monitor.** `intel-ipu7-camera` ships `/usr/share/wireplumber/wireplumber.conf.d/disable-libcamera.conf` setting `monitor.libcamera = disabled`; override it with `monitor.libcamera = required` in `~/.config/wireplumber/wireplumber.conf.d/`.
7. **Keep WirePlumber's V4L2 monitor disabled** (`monitor.v4l2 = disabled`). It stalls enumerating the 32 raw `Intel IPU7 ISYS Capture` nodes, which leaves the audio nodes without ports and kills the microphone.
8. **Grant the session access to the ISYS nodes.** `71-ipu7-hide-isys.rules` from the package sets `MODE="0600" GROUP="root"` on them, which blocks libcamera running as a normal user. A later rule has to restore access — on this machine `/etc/udev/rules.d/99-imx471-camera.rules` does it with `SUBSYSTEM=="video4linux", KERNEL=="video*", GROUP="video", MODE="0660"`, and the user is in the `video` group. Its `TAG+="uaccess"` has no effect at that point, since `73-seat-late.rules` has already run, so the nodes get no ACL and stay out of application camera pickers.
9. **Fix the colour matrix** in `/usr/share/libcamera/ipa/simple/imx471.yaml`. Its rows sum to 1.15 / 0.50 / 1.30, and the deficient green row gives a strong magenta cast; renormalise each row to 1.0.
10. **For browsers**, Chromium needs the `PipeWireCamera` feature flag. Omarchy already sets it in its default `chrome-flags.conf`.

Result: 1920x1088 at ~57 fps through `pipewire-libcamera`, with the debayer running on the iGPU via EGL.

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

No decision has been recorded yet.