Skip to content

feat: Dell XPS 14 DA14260 - #1912

Open
cooparo wants to merge 1 commit into
NixOS:masterfrom
cooparo:dell-xps-14-da14260
Open

feat: Dell XPS 14 DA14260#1912
cooparo wants to merge 1 commit into
NixOS:masterfrom
cooparo:dell-xps-14-da14260

Conversation

@cooparo

@cooparo cooparo commented Jun 13, 2026

Copy link
Copy Markdown

Description of changes

This PR introduces the NixOS hardware profile for the Dell XPS 14 DA14260, providing out-of-the-box support and specific hardware quirk workarounds for this model.

Note: This PR is dependent on #1891, because of the Panther Lake CPU profile.

Key Additions

  • Base Profile: Adds the core configuration profile for the Dell XPS 14 DA14260.
  • Firmware Management: Enables the fwupd service for native firmware updates.
  • Camera works. Integrated webcam doesn't work out of the box.
  • Speakers work. Speakers don't work out of the box.

Microphone requirement

The mic seems to work only with Linux 7.0+.

Webcam Enablement & Workarounds

A major focus of this PR is enabling the front-facing RGB camera, which requires a custom stack to function correctly on Linux:

  • Kernel Fix: Packages the intel_cvs kernel module (for the Synaptics SVP7500 camera bridge) with an IRQF_ONESHOT fix. This allows the IPU7 stack to successfully enumerate the OV08F4 sensor.
  • Power Management: Disables USB autosuspend on the SVP7500 bridge (06CB:0701) to prevent the device from wedging.
  • V4L2 Bridging: Bridges libcamera to a v4l2loopback device using a hand-rolled v4l2-relayd service. A custom service is used over the stock module to ensure the loopback has enough buffers and a GStreamer queue, avoiding severe framerate drops.
  • Orientation Correction: Flips and mirrors the image stream natively, as the image was upside-down.
  • Current Status: Achieves ~23 fps at 1280x720. The camera is usable by standard V4L2 applications (e.g., browsers, Cheese, video conferencing apps).

Known Issue:

  • The RGB camera is not stable, and doesn't achieve its max resolution, it should be able to reach 3840x2160 (official specs says: 8MP/4K HDR webcam); the saturation/color are very weird (but idk yet how to address this)
  • The IR camera intended for Windows Hello remains disabled. I'm not going to address this.

Things done

  • Tested the changes in your own NixOS Configuration
  • Tested the changes end-to-end by using your fork of nixos-hardware and
    importing it via <nixos-hardware> or Flake input

Related issues/fixes

@cooparo
cooparo marked this pull request as ready for review June 15, 2026 20:54
@cooparo
cooparo force-pushed the dell-xps-14-da14260 branch from 6da8f55 to 2fbda81 Compare June 15, 2026 21:25
@cooparo cooparo changed the title Dell xps 14 da14260 Dell XPS 14 DA14260 Jun 15, 2026
@cooparo
cooparo force-pushed the dell-xps-14-da14260 branch 2 times, most recently from d70413d to b169068 Compare June 16, 2026 09:48
Adds a NixOS hardware module for the Dell XPS 14 DA14260 (Intel Panther
Lake), including full working RGB webcam support and common laptop config.

New shared modules:
- common/cpu/intel/panther-lake: Panther Lake CPU module (wraps generic
  intel cpu-only and pulls in the GPU module)
- common/gpu/intel/panther-lake: enables the xe GPU driver on kernel ≥ 6.17
  and uses intel-media-driver for VA-API

Profile features (dell/xps/14-da14260):
- Imports panther-lake CPU, laptop, and SSD common modules
- Enforces kernel ≥ 7.0 (linuxPackages_latest) as a default so the
  microphone works (requires kernel 7.0+)
- Packages and loads intel_cvs (Synaptics SVP7500 camera bridge driver)
  from intel/vision-drivers with the IRQF_ONESHOT bug fixed — without this
  module the IPU7 camera stack never enumerates
- Loads v4l2loopback (no auto-device at module load) so the relay service
  can create a properly configured device at runtime
- Disables USB autosuspend for the SVP7500 bridge (06CB:0701) to prevent
  wedging on power-state transitions
- Hand-rolled ipu7-camera-relay systemd service: runs v4l2-relayd with a
  libcamerasrc GStreamer pipeline feeding a v4l2loopback device ("Intel
  IPU7 Camera"), giving any V4L2 app (browsers, cheese, conferencing) a
  standard /dev/video node at ~23 fps, 1280×720, with saturation boost
  and vertical-flip for the upright selfie orientation
- Enables thermald and fwupd

Registration:
- flake.nix: dell-xps-14-da14260 module entry
- README.md: table row in alphabetical order
@cooparo
cooparo force-pushed the dell-xps-14-da14260 branch from b169068 to 7243316 Compare June 16, 2026 10:37
@cooparo cooparo changed the title Dell XPS 14 DA14260 feat: Dell XPS 14 DA14260 Jun 16, 2026
@noisesfromspace

noisesfromspace commented Jun 18, 2026

Copy link
Copy Markdown

I've been on the 14250 since last year and appalled by the Linux support. Will test run this fork because it should have similar enough quirks.

edit: the 50 is Arrow Lake though not Panther Lake. But looking at the https://github.com/takumiando/nixos-hardware/blob/3887211270897deef92d36c4660a3fe7f63ba29a/common/gpu/intel/panther-lake/default.nix it shouldn't be too much of an issue. Just FYI for someone reading this with the same laptop

@aoli-al

aoli-al commented Jul 10, 2026

Copy link
Copy Markdown
Member

Tested on DA14260. Both camera and mic are working.

@cooparo

cooparo commented Jul 12, 2026

Copy link
Copy Markdown
Author

How is the camera for you? There are some issues: the camera sometimes is laggy, sometimes is not, and the colors are not correct. Have you experienced these?

@aoli-al

aoli-al commented Jul 12, 2026

Copy link
Copy Markdown
Member

Camera was laggy while using zoom. I don't use camera much so it was okay for me. There is another patch that does not require v4l2loopback: https://github.com/jibsta210/ipu7-camera-linux. Will this provide better performance?

@cooparo

cooparo commented Jul 13, 2026

Copy link
Copy Markdown
Author

And what about colors?

@aoli-al

aoli-al commented Jul 14, 2026

Copy link
Copy Markdown
Member

color was fine for me

@aoli-al

aoli-al commented Jul 15, 2026

Copy link
Copy Markdown
Member

I got hardware ISP working with this PR: NixOS/nixpkgs#542085

To use hardware ISP you may apply the following patch:

diff --git a/dell/xps/14-da14260/default.nix b/dell/xps/14-da14260/default.nix
index 2fdb42d7f1..76d06a9655 100644
--- a/dell/xps/14-da14260/default.nix
+++ b/dell/xps/14-da14260/default.nix
@@ -16,6 +16,13 @@
     lib.mkDefault pkgs.linuxPackages_latest
   );
 
+  hardware.ipu7 = {
+    enable = true;
+    platform = "ipu75xa";
+  };
+
+  services.v4l2-relayd.instances.ipu7.enable = false;
+
   # Intel CVS driver for Synaptics SVP7500 camera bridge (06CB:0701).
   # Without this the IPU7 camera stack does not enumerate even though the
   # kernel-side intel_ipu7 driver detects the sensor (OVTI08F4 / OV08F4).
@@ -60,8 +67,8 @@
           gst-plugins-base
           gst-plugins-good
           gst-plugins-bad
+          icamerasrc-ipu75xa
         ])
-        ++ [ pkgs.libcamera ]
       );
       v4l2loopback-ctl = "${config.boot.kernelPackages.v4l2loopback.bin}/bin/v4l2loopback-ctl";
       deviceFile = "/run/ipu7-camera-relay/device";
@@ -80,7 +87,7 @@
       # so the input pipeline fails to build and only the black splash is shown.
       # v4l2-relayd applies the caps (copied from the output appsrc below) to its
       # internal appsink instead.
-      input = "libcamerasrc ! videoconvert ! videoscale ! videobalance saturation=1.8 ! videoflip method=vertical-flip";
+      input = "icamerasrc ! videoconvert ! videoscale ! videoflip method=vertical-flip";
 
       # A leaky queue (drops old frames) + sync=false keep latency low so the
       # viewer sees the latest frame instead of a backlog; the -b 4 buffers in
@@ -90,7 +97,7 @@
         + " ! queue leaky=downstream max-size-buffers=3 ! videoconvert ! v4l2sink name=v4l2sink device=$(cat ${deviceFile}) sync=false";
     in
     {
-      description = "Intel IPU7 camera to v4l2loopback relay (libcamera bridge)";
+      description = "Intel IPU7 camera to v4l2loopback relay (hardware ISP via camera HAL)";
       after = [ "modprobe@v4l2loopback.service" ];
       wantedBy = [ "multi-user.target" ];
       environment = {
diff --git a/xnwqqxqr.patch b/xnwqqxqr.patch
new file mode 100644
index 0000000000..e69de29bb2

@phucisstupid

Copy link
Copy Markdown

any update?

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants