Mirrors Linux 7.1 drivers/hid/hid-quirks.c. Adds:
- HidQuirkFlags bitflags (24 bits matching include/linux/hid.h, with
bit gaps at 0/8/9/15/24-27 for removed/renamed upstream flags)
- HidQuirkEntry struct (vendor:u16, product:u16, flags:HidQuirkFlags)
- hid_table.rs with 191 compiled-in entries (hid_quirks[] array, lines
27-223 of Linux 7.1 source). 2 of the 191 are HID_BLUETOOTH_DEVICE
and kept for forward compatibility with the Bluetooth HID transport
- 5 F_NN const helpers for the unique multi-flag OR combinations
(NOGET|MULTI_INPUT, NO_INIT_REPORTS|ALWAYS_POLL, etc.)
- HID_QUIRK_FLAG_NAMES const (24 names) for TOML parsing
- load_hid_quirks(), read_toml_hid_entries(), parse_hid_toml() — the
[[hid_quirk]] TOML section mirrors [[usb_quirk]] structure
- lookup_hid_quirks(vendor, product) public API mirrors lookup_usb_quirks
Test count: 106 -> 114 (+8 R10 tests).
Clippy: 30 warnings (was 29; +1 from new load_hid_quirks Result<_, ()>).
Note: the upstream 24-flag count is exact (matches include/linux/hid.h),
but only 9 of the 24 are actually populated in hid_quirks[]. The other
15 are reserved for future hardware and runtime TOML overrides.
Consumer wiring (lookup_hid_quirks call site in usbhidd/evdevd) is
out of scope for this commit and tracked in
local/docs/IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md.
Phase R7 (xHCI closure, multi-session R7-R10 first commit):
* R7-A xHCI TOML layer: brings xHCI to 3-layer parity with PCI
(compiled-in + TOML + DMI). Adds XHCI_CONTROLLER_FLAG_NAMES (28
entries: 19 pre-R6 + 5 R6 + 3 R7-C with chronological markers),
read_toml_xhci_entries(), parse_xhci_toml(),
load_xhci_controller_quirks_toml(), updated
lookup_xhci_controller_quirks() to OR TOML flags, new
lookup_xhci_controller_quirks_full() as 3-layer entry point.
New quirks.d/25-xhci.toml with 8 example entries sourced from
Linux 7.1 xhci-pci.c.
* R7-B DMI xHCI bridge: mirrors the PCI DMI bridge. Linux itself
has no DMI-based xHCI quirks so DMI_XHCI_QUIRK_RULES is empty;
the wiring exists so future DMI rules can be added without
re-architecting. Adds DmiXhciQuirkRule struct,
apply_dmi_xhci_quirk_rules() OR-accumulator, DMI_XHCI_QUIRK_RULES
constant, load_dmi_xhci_quirks() public function,
read_toml_dmi_xhci_toml()/parse_dmi_xhci_toml() in toml_loader
for the new [[dmi_xhci_system_quirk]] section.
* R7-C 3 high-priority xHCI flags (already in 0.2.3 branch from
R7-C stand-alone commit): DEFAULT_PM_RUNTIME_ALLOW (bit 33),
SNPS_BROKEN_SUSPEND (bit 35), RESET_TO_DEFAULT (bit 44). Bit
positions match Linux 7.1 xhci.h:1586-1660 exactly. Six new
PCI entries: AMD 0x43f7, 0x15e0, 0x15e1, Intel 0x9a13/0x51e0/0x54ee.
Seven new R7-C tests.
Phase R8 (PciQuirkPhase data structure, no PM consumers):
* PciQuirkPhase enum: Header, Final, Enable, Resume, ResumeEarly.
Mirrors Linux DECLARE_PCI_FIXUP_* macro family.
* phase: PciQuirkPhase field on PciQuirkEntry. All 31 existing
compiled-in entries default to Final via ..WILDCARD.
* phase_visible(phase, pm_available) helper. Boot-time phases
always visible; Resume/ResumeEarly gated by pm_available.
* lookup_pci_quirks_full_with_pm() public function gates all
three layers. load_pci_quirks() defaults to pm_available=false
for safe existing-caller behavior.
* TOML parser reads phase = "header"|"final"|"enable"|"resume"
|"resume_early" per [[pci_quirk]] entry. Unknown/omitted
defaults to Final (graceful degradation).
* Seven R8 tests: header/resume/resume_early parse, omitted default,
unknown default, boot-phase visibility, resume-phase gating.
Phase R9 (USB storage gap closure, data-only):
* Resynced 30-storage.toml header to reference Linux 7.1 (was 7.0).
* Fixed one entry: VIA Labs VL817 SATA Bridge (0x2109:0x0715)
revision was "9999-9999" — corrected to wildcard "0000-9999"
to match Linux UNUSUAL_DEV(0x2109, 0x0715, 0x0000, 0x9999, ...).
* Verification: python3 local/scripts/extract-linux-quirks.py
local/reference/linux-7.1/drivers/usb/storage/unusual_devs.h
produces 214 entries. diff against 30-storage.toml = 0 lines.
The R1-R6 review's "108 missing" estimate was stale; the file
is in full sync with Linux 7.1.
Test count: 90 (R7-C) + 9 (R7-A, R7-B) + 7 (R8) = 106/106 passing.
No new clippy warnings beyond two Result<_, ()> stylistic lints
that follow the existing convention (7+ functions use this pattern).
Consumer wiring status: BROKEN_MSI consumer in xhcid main.rs:69,
ZERO_64B_REGS consumer in xhci/mod.rs:524,542. R7-C and R7-A new
flags are observability-only via log_unenforced_xhci_quirks()
(R6) until xhcid's suspend/resume path lands.
Deferred to next session: R10 HID infrastructure (24 flags +
500 entries) and any R7/R8 PM execution work when PM lands.
Multi-session plan: this is the first of 4 atomic commits for
R7-R10. R10 HID lands in a separate session.
Phase R6 (2026-06-07) extends the xHCI controller quirk layer with five
new XHCI_* bit positions from Linux 7.1's drivers/usb/host/xhci.h, three
new PCI table entries from xhci-pci.c, and an xhcid-side observability
hook for the unenforced flags. Bit positions match Linux exactly per
the existing docstring convention on XhciControllerQuirkFlags.
Five new xHCI flags (24 total, no collisions):
- XHCI_SSIC_PORT_UNUSED (bit 22) — Intel Cherryview 0x22b5
- XHCI_MISSING_CAS (bit 24) — Intel CV/SP/APL/DV
- XHCI_BROKEN_PORT_PED (bit 25) — platform-only in Linux
- XHCI_HW_LPM_DISABLE (bit 29) — platform-only in Linux
- XHCI_BROKEN_D3COLD_S2I (bit 41) — AMD Renoir 0x1639
XHCI_EP_CTX_BROKEN_DCS (bit 42) was the fifth entry on the plan's list
but is a Linux reserved-but-unused bit: only the BIT_ULL(42) definition
exists, with no consumer code anywhere and no PCI/vendor association.
Adding it would have been a stub. XHCI_SSIC_PORT_UNUSED is added in its
place — it has both a PCI association and a consumer site.
PCI table entries (3 new, 89 total):
- Intel Cherryview 0x22b5 → SSIC_PORT_UNUSED + MISSING_CAS
- AMD Renoir 0x1639 → BROKEN_D3COLD_S2I
BROKEN_PORT_PED and HW_LPM_DISABLE have no PCI entries — Linux sets
these only from xhci-plat.c / xhci-mtk.c / xhci-histb.c (non-PCI host
adapters). They are defined for forward-compatibility with future
platform xHCI support.
xhcid consumer wiring (in local/sources/base submodule):
- log_unenforced_xhci_quirks() called from Xhci::init() emits a
warn! line for each set-but-unenforced R6 flag, citing the Linux
consumer site and the missing Red Bear code path. Observability,
not fake enforcement.
- Real enforcement for consumer sites that require suspend, LPM,
port-disable, or CAS code paths in xhcid is deferred to Phase R8
(PM infrastructure) and follow-up work.
Tests: 8 new (75 → 83 total passing).
Clippy: 26 warnings, all pre-existing R0–R5 baseline. No new warnings.
TOML validator: 244 entries, 0 undefined (no TOML changes for R6 —
xHCI controller flags are compiled-in only).
Source of truth: Linux 7.1 drivers/usb/host/{xhci.h, xhci-pci.c,
xhci.c, xhci-hub.c, xhci-plat.c, xhci-mtk.c, xhci-histb.c}.
Replace stub ioctl handlers with real per-fd magic token assignment
and master tracking. First card opener auto-becomes master. Master
state is tracked and cleared on fd close.
When pcid-spawner launches redox-drm for a GPU device, the init
service (10_redox-drm.service) may also start a second instance.
The guard check in the service file (head -c 1 /scheme/drm/card0)
has a race condition with pcid-spawner's scheme registration.
Move the scheme:drm existence check into the binary itself. If
scheme:drm is already registered when run() starts, log and exit
gracefully with daemon.ready() instead of crashing with a fatal
"no GPU found" error.
Critical fixes from Linux kernel cross-reference:
- execlists.rs flush_pending(): write upper 32 bits FIRST, then lower.
BSpec requires upper-first on legacy ELSP; GPU latches on lower write.
Previously wrote lower then upper — stale upper dword used by GPU.
- execlists.rs init(): write only INHIBIT_SYN_CTX_SWITCH to RING_CONTEXT_CONTROL.
Linux init_common_regs() disables ENGINE_CTX_RESTORE_INHIBIT and
RS_CTX_ENABLE for normal operation. Our old code set restore inhibit,
preventing context save/restore on context switch — GPU would hang.
- context.rs: LRC image offsets were MMIO register offsets (0x30, 0x34, 0x38).
LRC state layout is different — CTX_CONTEXT_CONTROL is dword index 3 (byte 12).
Fixed to match Linux intel_lrc_reg.h dword layout:
LRC_CTX_CTRL_OFFSET = 12 (was 0x02)
LRC_HEAD_OFFSET = 20 (was 0x30)
LRC_TAIL_OFFSET = 28 (was 0x34)
LRC_RING_START_OFFSET = 36 (was 0x38)
Added LRC_RING_CTL_OFFSET = 40
- context.rs: corrected CTX_CTRL_INHIBIT_SYN_CTX_SWITCH from bit 2 to bit 3
to match Linux RING_CONTEXT_CONTROL bit layout at 0x244.
- ring.rs: added gpu_address() method to expose ring GGTT address for
LRC descriptor construction.
- mod.rs: wire execlist submission path after ring batch submit in
hw_submit_to_ring(), creating LRC descriptor and submitting via ExeclistPort.
- display.rs: program HDMI infoframes (AVI, audio, VSIF) on port enable.
On Redox there is no udev-based DRM device enumeration. KWin's DRM
backend relies on m_udev->listGPUs() which returns nothing without udev.
Add a fallback: when no KWIN_DRM_DEVICES is set and the session is
kde-wayland, inject KWIN_DRM_DEVICES=/scheme/drm/card0 so KWin knows
which device to open. This fixes the 'No suitable DRM devices' error
that prevented KWin from starting on Redox.
Added test: build_environment_sets_kwin_drm_devices_default_for_kde_wayland
to verify the fallback is applied correctly.
- gem_lmem: Replace bump allocator with best-fit free-list (BTreeMap) that
tracks individual allocations and coalesces freed blocks on both sides
- mocs: Add init_pat() - programs PAT index 0-7 with WB/WC/WT/UC for Gen9+,
and WB-only for Gen12+; called after init_mocs() in IntelDriver init
- regs_gt: Add PAT register constants (GEN8_PRIVATE_PAT_*, GEN12_PAT_INDEX,
GEN8_PPAT_* cache attributes) and TBIMR_FAST_CLIP
- PAT programming: Gen9 uses 0x40E0 base with LLC/LLCELLC attributes,
Gen12 uses 0x4800 base with simple WB/WC/WT/UC (no LLC on Xe2)
- All changes compile clean (0 errors)
- Changed make all -> make live to produce .iso files
- Skipped verify-overlay-integrity.sh (corrupts recipe symlinks)
- Added ac_cv_namespace_ok=yes to ICU recipe (toolchain libstdc++ stale)
- Fixed variable reference
- Mini ISO builds successfully via the script
- Changed make all -> make live to produce .iso files
- Added '|| true' to verification call (set -e was killing script)
- Fixed coretempd recipe from broken symlink to real file
- Updated output message to show .iso path
- Removed stale REDBEAR_RELEASE override code
- Fixed NO_CACHE initialization (was unbound CLEAN variable)
- Added --no-cache argument parsing and usage docs
- Auto-unset REDBEAR_RELEASE from .config during dev builds
- Stale-build detection now uses NO_CACHE variable correctly
- Updated help text with environment variable docs
Automatically detects when source repos (relibc, kernel, base,
bootloader, installer) have commits newer than their built pkgars.
If stale, forces a clean rebuild to prevent shipping old binaries.
Also: consolidated clean-rebuild logic into a single conditional.
Per AGENTS.md policy: local recipes ALWAYS supersede WIP packages.
Any WIP directory that shadows a local/recipes/ package is replaced
with a symlink to the local version.
Fixed shadows: bison, flex, m4, meson, ninja-build, libxcvt,
qt6-sensors, libepoxy, mc — all now symlinked to local/recipes/.
Added WIP-local enforcement to build-redbear.sh: auto-detects and
fixes WIP shadows at build time.
Fix pre-existing compilation errors in modules that were present as
source files but not declared in mod.rs:
- audio_eld: cast u16 copy_len to usize for slice indexing
- dp_fec, dp_uhbr, edp_pll, gpu_reset, hdmi_frl, lspcon:
DriverError::Initialization now takes String, add .to_string()
- dsc: add missing import
- guc_submission: DriverError::Buffer now takes String
- vrr: cast VRR_MAX/MIN_FRAME_TIME constants to usize
- rps_rc6: change freq_table() return to &'static to avoid
borrow checker conflict with self mutation
All 12 modules now compile with zero errors.
Replace busy-wait spin_loop() in FenceTimeline::wait() with
Condvar::wait_timeout(). signal() now calls notify_all() to
wake blocked threads. This turns syncobj_wait from CPU-burning
poll to proper blocking sleep/wake.
Add two new tests:
- test_wait_wakes_on_signal: spawns a thread that signals
after 10ms, verifies the blocked wait wakes within 1s
- test_wait_timeout_expires: verifies 1ms timeout on an
unsignaled fence returns an error
VIRTGPU_GETPARAM: expand from 1 to 8 sub-parameters for Mesa
compatibility. Mesa virgl driver probes CAPSET_QUERY_FIX,
RESOURCE_BLOB, CONTEXT_INIT, SUPPORTED_CAPSET_IDS, and
EXPLICIT_DEBUG_NAME during initialization.
set_property: add doc comment explaining that virtio-gpu has
no per-object property tables — all mode/fb/active changes
flow through atomic commit, not set_property.
cursor_move: replace x.max(0) as u32 / y.max(0) as u32 with
explicit if-else for clarity. Negative coordinates now clamp
to zero at screen edges (same behavior, more readable code).
BUG 1: virgl_resource_create_blob held device lock while calling
self.gem_create() which internally tries to lock device again.
Rust std::sync::Mutex is not reentrant — guaranteed deadlock.
Fix: release device lock before calling gem_create, using a
scoped block for the has_resource_blob feature check.
BUG 2: Box::leak in atomic_commit error paths converted
dynamically-formatted strings to &'static str at the cost of
a memory leak per error. Replaced with static &str literals.
VirtioDriver:
- Override poll_hotplug() — refresh connectors and detect
display changes by comparing cached vs current topology
- Override set_property() — validate obj_id is a known CRTC
or connector; compositors need property acknowledgement
even if individual properties are no-ops for virtio-gpu
scheme.rs:
- Fix fsync() — was EOPNOTSUPP, now returns Ok(())
Virtio-gpu commands complete synchronously, so there
are no pending GPU operations to flush
Implement VIRTGPU_RESOURCE_CREATE_BLOB:
- Define VirtioGpuResourceCreateBlob wire struct (commands.rs)
- Add VIRTIO_GPU_BLOB_MEM_*/FLAG_* constants
- Negotiate VIRTIO_GPU_F_RESOURCE_BLOB feature flag
- Add virgl_resource_create_blob() to GpuDriver trait
- Implement in VirtioDriver with virtio command dispatch
- Wire ioctl handler in scheme.rs (was EOPNOTSUPP stub)
- Add find_by_handle() to ResourceManager
Implement hardware cursor:
- Add VIRTIO_GPU_CMD_UPDATE_CURSOR/MOVE_CURSOR opcodes
- Define VirtioGpuCmdUpdateCursor/MoveCursor/CursorPos structs
- Add update_cursor()/move_cursor() to VirtioGpuDevice
- Override cursor_set/cursor_move on VirtioDriver
- CRTC-to-connector lookup for scanout index mapping
Implement atomic modeset:
- Override atomic_commit on VirtioDriver with full state
validation via atomic_check(), then delegate to
set_crtc + page_flip for each active CRTC
- Support TEST_ONLY flag (returns NoChange)
Mesa recipe: add iris,crocus to gallium-drivers
Config: enable mesa = {} in redbear-full.toml