intel / intel/ipu7-drivers

psys: r78 writes to struct ipu7_bus_device fields absent from the in-kernel intel_ipu7 (ABI break for DKMS builds)

Open
#93 0 comments 1 reaction 0 assignees View on GitHub
Dominant language
C
Stars
15
Forks
34
Avg merge
21h 11m
Merged PRs (30d)
1

Description

Since the 2026-06-29 drop (`0e8c71a`, released as r76/r78), the out-of-tree psys driver is ABI-incompatible with an in-kernel `intel_ipu7`, and the failure is silent: `/dev/ipu7-psys0` never appears and the RGB camera is gone.

## The change

`0e8c71a` appends two fields to `struct ipu7_bus_device` in `drivers/media/pci/intel/ipu7/ipu7-bus.h`:

```c
struct mutex acquire_fw_task_buffer_lock;
unsigned int (*get_running_fw_task_count)(struct ipu7_bus_device *adev);
```

`ipu7_psys_probe()` writes to the second:

```c
adev->get_running_fw_task_count = ipu7_psys_get_running_fw_task_count;
```

and `ipu_psys_task_request()` takes the new mutex.

## Why that breaks

`struct ipu7_bus_device` is allocated by `intel_ipu7`. On any distro shipping the **staging** `intel_ipu7` with the kernel while psys comes from **DKMS**, the two disagree about the struct:

```
intel_ipu7 kernel/drivers/staging/media/ipu7/intel-ipu7.ko.zst
intel_ipu7_psys updates/dkms/intel-ipu7-psys.ko.zst
```

The kernel allocated the shorter struct; the DKMS psys was compiled against the longer one. So the probe-time assignment writes past the end of the allocation, and the mutex lock operates on memory that is not a mutex.

Verified against the running kernel module: `intel-ipu7.ko` contains `ipu7_bus_ready_to_probe` — a field of the same struct — and zero occurrences of either new field.

## Reproduced

Two machines, independently:

* Dell XPS 16 DA16260, Panther Lake, CachyOS 7.2.0-rc4 — pinned at r74 (`24d8923`), works. r76 previously produced a runtime `psys_ioctl` GPF here.
* Dell (reporter), CachyOS 7.1.4 — r78, `/dev/ipu7-psys0` MISSING after a clean rebuild and reboot, `intel_ipu7_psys` loaded, no RGB camera. Details in #26.

This affects every Arch/CachyOS user on a recent kernel, since the staging `intel_ipu7` landed in-tree while psys did not.

## Related, same root cause

`ipu7_psys_probe()` also begins:

```c
if (!adev->isp->ipu7_bus_ready_to_probe)
return -EPROBE_DEFER;
```

That is a *read* of a field on the same kernel-owned struct, and it fails the same way when the layouts disagree — psys defers forever while isys binds normally, because isys ships alongside `intel_ipu7`. That asymmetry makes the failure look selective and sends people debugging the wrong component entirely.

## Suggestions

The out-of-tree psys reaching into a struct owned by a module it does not build alongside is fragile by construction. Options that would help:

1. **Version the interface.** A version field or a size check on `struct ipu7_bus_device`, so a mismatched psys refuses to probe with a clear message instead of corrupting memory.
2. **Keep new state in psys.** `get_running_fw_task_count` and the FW-task mutex are psys concerns; storing them on the shared bus device is what creates the coupling.
3. **Document the constraint.** If the vendor tree is only supported when `intel_ipu7` is *also* built from it, saying so in the README would save people a lot of time — the current failure gives no hint.

Happy to test patches; I have the hardware and a reproducer on two machines.

Contributor guide

Open the contributing guide

Research direction

Start by reading drivers/media/pci/intel/ipu7/ipu7-bus.h, ipu7_psys_probe(), and ipu_psys_task_request(), then compare the struct layout used by intel_ipu7 and the DKMS psys module. Reproduce the missing /dev/ipu7-psys0 device on the reported kernel versions. Done means the modules handle an interface mismatch safely and psys either probes correctly or reports a clear failure.

Written by the indexing model from the issue text.

Assessment

Tech stack
c
Domain
operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.