Skip to content

Surface Pro 6 camera not working — ipu_bridge creates no CSI-2 links #2101

Open

Description

DISCLAIMER

issue is written with claude after I tried to fix the problem with it; i'm not technologically literate enough to know what's going on.

Device: Microsoft Surface Pro 6
Kernel: 6.19.8-surface-2
OS: Linux Mint (Ubuntu 24.04 base)

Summary

The IPU3 camera pipeline does not work. The sensor drivers load and appear in the media graph, but ipu_bridge never creates links between the sensors and the CSI-2 ports, so libcamera sees an empty camera list.

What works

  • Kernel detects all 3 sensors: ipu3-cio2 0000:00:14.3: Connected 3 cameras
  • Sensor modules load: ov5693, ov8865, ov7251
  • Media devices /dev/media0 (ipu3-cio2) and /dev/media1 (ipu3-imgu) exist
  • Sensors appear in media graph as entities

What doesn't work

  • Sensors have 0 links in the media topology — not connected to any CSI-2 port
  • ipu_bridge produces no dmesg output
  • No INT3472 devices present: ls /sys/bus/platform/devices/INT3472* returns nothing
  • libcamera v0.7.1 reports: CameraMananger::cameras() is empty

Media topology (abbreviated)

- entity 37: ov7251 3-0060 (1 pad, 0 link, 0 routes)
- entity 39: ov8865 3-0010 (1 pad, 0 link, 0 routes)
- entity 41: ov5693 2-0036 (1 pad, 0 link, 0 routes)

All CSI-2 sink pads have no incoming links.

Relevant dmesg

ipu3-cio2 0000:00:14.3: Found supported sensor INT33BE:00
ipu3-cio2 0000:00:14.3: Found supported sensor INT347A:00
ipu3-cio2 0000:00:14.3: Found supported sensor INT347E:00
ipu3-cio2 0000:00:14.3: Connected 3 cameras

No ipu_bridge lines appear at all.

I2C devices present

i2c-INT33BE:00
i2c-INT347A:00
i2c-INT347A:00-VCM
i2c-INT347E:00

Hypothesis

The Surface Pro 6 ACPI tables do not include INT3472 PMIC entries, which ipu_bridge relies on to map sensors to CSI-2 ports. This may require a quirk or ACPI SSDT override specific to this device.

What I've tried

  • Built and installed libcamera v0.7.1 from source with -Dipas=ipu3 -Dpipelines=ipu3
  • Manually loaded ipu3-cio2 and ipu3-imgu modules
  • Running cam --list as root

Activity

  1. mfa-nw commented on May 4, 2026

    @mfa-nw

    The i2c device table for the ipu3 cameras was removed from the upstream kernel 6.19 so libcamera cannot link to the cameras. I have reported the regression upstream and am waiting to see if a patch to add back the i2c device table gets accepted. I think this may be the cause of the issue you are experiencing.

  2. toor11 commented on May 11, 2026

    @toor11

    This has been fixed in PR #2123.

    Root cause: The upstream patch "media: i2c: dw9719: Remove unused i2c device id table" (kernel 6.19) incorrectly removed the i2c_device_id table from the dw9719 VCM driver. On Surface devices, the dw9719 VCM is instantiated by the IPU bridge via I2C, so it depends on I2C device matching — without the table, the driver has no i2c:dw9719 alias and never binds.

    Without the VCM bound, cio2_notifier_complete() doesn't fire, so the camera sensor entities never get V4L2 subdevice nodes, and libcamera reports no cameras.

    The fix adds back the i2c_device_id table, based on the upstream fix from Sakari Ailus: https://lore.kernel.org/all/[email protected]/

  3. fbd-ss commented on May 25, 2026

    @fbd-ss

    I have the same issue with 6.19.8-surface-3 on linux mint 22.3, surface pro 6.
    It did work originally ( although only getting green output ), using the apt packages in the instructions.
    I tried building camera packages from source to no avail. The links were not being connected as described by @Mattttttttttttttttttttttttttttttt

  4. toor11 commented on May 28, 2026

    @toor11

    Confirming the same regression — and that PR #2123 is the correct fix — on a Surface Book 2 (13"), kernel 6.19.8-arch1-3-surface, libcamera v0.7.1. Independently reproduced the full chain:

    • ipu3-cio2 0000:00:14.3: Connected 3 cameras; all three sensors bind to the cio2 notifier — ov5693 (INT33BE), ov8865 (INT347A), ov7251 (INT347E) all bound (ret 0).
    • dw9719 exposes only OF aliases (of:N*T*Cdongwoon,dw9719…) and no i2c:dw9719. The IPU-bridge-created VCM is a software_node (dw9719-0) with no of_node and no ACPI companion, so i2c_device_match() (OF → ACPI → i2c_match_id) has nothing to match. Forcing the bind returns -ENODEV.
    • With module ipu3_cio2 +p / file *v4l2-async* +p, after ov8865 binds it registers a lens sub-notifier and loops: need …I2C3.CAMR, trying dw9719-0 → direct match not found. Because v4l2-async completes hierarchically, cio2_notifier_complete() never fires.

    Net effect: the missing i2c_device_id blocks the rear VCM, which stalls the entire notifier — so all three sensors end up with 0 link to their CSI-2 receivers (front OV5693 and IR OV7251 too, even though they have no VCM), and cam --list is empty.

    - entity 41: ov5693 2-0036 (1 pad, 0 link, 0 routes)  Sensor
    - entity 37: ov8865 3-0010 (1 pad, 0 link, 0 routes)  Sensor
    - entity 39: ov7251 3-0060 (1 pad, 0 link, 0 routes)  Sensor
    # sensor->csi2 link count: 0
    

    Please add Surface Book 2 13" to the affected-device list. The i2c_device_id re-add in #2123 (mirroring Sakari Ailus's upstream fix) addresses this exactly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions