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

Reply via email to