This is v2 of the vino RFC: an in-kernel Rust driver for DisplayLink DL3 docks (Dell D6000, 17e9:6006), replacing the out-of-tree EVDI module plus the DisplayLinkManager userspace daemon.
Still an RFC in the same place v1 was: the dock never engages its content-protection channel for vino, so no pixels flow yet. What's different is everything underneath it. v1's review said, in short, "work on safe KMS abstractions instead of raw C KMS + as_raw()" -- that's the bulk of this round (see the drm series cover for the detail), plus the driver picked up several months of hardware-testing fixes since v1 that had nowhere to land until now. 1/10 skeleton + USB bind + plaintext bring-up (proto, rng) 2/10 clean-room HDCP 2.2 AKE/LC/SKE (crypto, hdcp, ake, golden) 3/10 AES-CTR/AES-CMAC control-plane seal + arm (cp) 4/10 Vino framebuffer codec (video) 5/10 DRM/KMS sink, on the safe KMS mode-object layer (drm_sink) 6/10 the driver itself: USB bind, bring-up, KUnit tests (vino) 7/10 the hardware cursor plane (cursor_atomic_update -> CP) (drm_sink) 8/10 CRTC gamma, plane rotation and DDC/CI monitor controls (drm_sink, cp) 9/10 two heads, 90/270 rotation, damage clips, connector probe (drm_sink) 10/10 hrtimer-driven software vblank for refresh-rate pacing (drm_sink) What's here and works, HW-verified: USB bind + plaintext session init; HDCP 2.2 AKE (H'/L'/V'); AES-CTR + Dl3Cmac control-plane seal, byte-exact against the reference daemon's wire traffic; the stream-open arm marker that gets the dock processing our encrypted CP for the first time; a registered DRM/KMS card (CRTC + primary plane + virtual connector/ encoder, GEM-shmem dumb buffers); the Vino codec's DC plane and 8x8 transform, byte-exact against captured hardware output. What's missing / why it's still RFC: - No live pixels. Every host-observable byte we put on the wire now matches the daemon -- verified down to paired full-bus USB captures and xHCI TRB completion codes -- but the dock still won't ack the first encrypted control-plane frame. Current read is a dock-firmware gate unreachable from the host; a hardware USB analyser is the one untried next step. See docs/BLOCKER.md in the source tree for the full trail of what's been ruled out. - The codec's AC coefficient entropy grammar is reverse-engineered but not finished (EOB/scan/context still open), so the WHT colour path only covers 64x16-aligned geometry; other modes use the RLE fallback. Not fabricating the rest until it's verified against hardware. - Per-head EDID and per-head mode-set/DDC. Two heads are wired (patch 9), each scanned out to its own video endpoint with its own cursor, but the bring-up only reads head 0's EDID, and the CP mode-set has no decoded head/stream field -- so a head is conveyed on the wire only by which endpoint its frames go to. Real dual-monitor use past the CP wall needs those captured. - Two known-open items from v1's automated review, unresolved because fixing them properly needs more of the safe-KMS work above: some CP message builders (cursor/mode-set) still GFP_KERNEL-allocate from a path DRM considers atomic-commit context, and CP_ENGAGED/scanout state are still module-global statics rather than per-device (the driver is single-instance throughout, so this only matters for a theoretical multi-dock case). Depends on the safe KMS mode-object layer landing (posted alongside, "[RFC PATCH v2 00/18] rust: drm: safe KMS mode-object layer + evdi bindings") and, transitively, on the locking/DRM-registration prerequisite postings that series depends on -- see that cover letter for exactly what and why. This series won't build without them. Source, HDCP/HDMI specs referenced, and the full RE trail: https://github.com/FireBurn/vino-scripts https://github.com/FireBurn/linux/tree/vino https://gitlab.freedesktop.org/FireBurn/linux/-/tree/vino Changes since v1: - Rebuilt on the safe KMS mode-object layer instead of raw C KMS + as_raw() (Danilo, Miguel) -- see the drm series cover. - Folded in the v1 review fixes that survive independently of the KMS rework: in-tree AES-CMAC + key-prepared-once AES (Eric Biggers); Interface<Bound> threading + cancel_work_sync() of the bring-up work in disconnect() (fixes a dropped-work-handle UAF); EP08 16-bit length overflow rejected; codec SECTION_CODE mode indexing fixed; encoder shadow committed only on full-frame success; cursor_image checked arithmetic; EP84_BUF-sized cap reads; pace_cap_ack/ lockstep_reply no longer abort on short frames; Kconfig depends on USB (was USB=y); #[cfg(CONFIG_KUNIT)] (was the always-false CONFIG_KUNIT = "y"); a redundant Kconfig select dropped (Julian Braha). All from the Sashiko bot + human review on v1. - Added the byte-exact Vino colour codec (DC plane + 8x8 transform) and the real EP08 wire-record framing, from continued hardware testing since v1. - Re-added the hardware cursor plane (patch 7) and, now that the safe KMS layer exposes them, the CRTC gamma LUT, plane rotation property and DDC/CI brightness/contrast/DPMS controls (patch 8) that v1's raw-KMS driver had. - Added a second display head, 90/270 rotation, damage-clipped repaint and connector detect()/mode_valid() (patch 9), consuming the new drm-series bindings. The KMS feature set now exceeds v1's. - Added hrtimer-driven software vblank (patch 10): the CRTC now paces page-flips to the display's refresh rate instead of completing them immediately, using the safe KMS layer's VblankSupport. Mike Lothian (10): drm/vino: add DisplayLink DL3 dock skeleton and protocol framing drm/vino: add the clean-room HDCP 2.2 AKE/LC/SKE handshake drm/vino: add the AES-CTR/AES-CMAC control-plane seal and arm sequence drm/vino: add the Vino framebuffer codec drm/vino: add the DRM/KMS sink, built on the safe KMS mode-object layer drm/vino: add the DisplayLink DL3 dock driver drm/vino: wire the hardware cursor plane drm/vino: wire CRTC gamma, plane rotation and DDC/CI monitor controls drm/vino: two heads, 90/270 rotation, damage clips and connector probe drm/vino: hrtimer-driven software vblank drivers/gpu/drm/Kconfig | 1 + drivers/gpu/drm/Makefile | 1 + drivers/gpu/drm/vino/Kconfig | 20 + drivers/gpu/drm/vino/Makefile | 2 + drivers/gpu/drm/vino/ake.rs | 173 ++ drivers/gpu/drm/vino/cp.rs | 733 +++++++++ drivers/gpu/drm/vino/crypto.rs | 48 + drivers/gpu/drm/vino/drm_sink.rs | 1173 +++++++++++++ drivers/gpu/drm/vino/golden.rs | 69 + drivers/gpu/drm/vino/hdcp.rs | 167 ++ drivers/gpu/drm/vino/proto.rs | 73 + drivers/gpu/drm/vino/rng.rs | 12 + drivers/gpu/drm/vino/video.rs | 1229 ++++++++++++++ drivers/gpu/drm/vino/vino.rs | 2640 ++++++++++++++++++++++++++++++ 14 files changed, 6341 insertions(+) create mode 100644 drivers/gpu/drm/vino/Kconfig create mode 100644 drivers/gpu/drm/vino/Makefile create mode 100644 drivers/gpu/drm/vino/ake.rs create mode 100644 drivers/gpu/drm/vino/cp.rs create mode 100644 drivers/gpu/drm/vino/crypto.rs create mode 100644 drivers/gpu/drm/vino/drm_sink.rs create mode 100644 drivers/gpu/drm/vino/golden.rs create mode 100644 drivers/gpu/drm/vino/hdcp.rs create mode 100644 drivers/gpu/drm/vino/proto.rs create mode 100644 drivers/gpu/drm/vino/rng.rs create mode 100644 drivers/gpu/drm/vino/video.rs create mode 100644 drivers/gpu/drm/vino/vino.rs -- 2.55.0
