redox-drm = "ignore" was left from earlier GPU-suppression tests.
Restored to active so the DRM/KMS display driver is included in
the full ISO image. Without it, no GPU output or SDDM compositor.
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
Extract protocol-agnostic FenceTimeline from Intel to shared
src/drivers/fence.rs — atomic-based fence tracking suitable
for Intel, VIRGL, and AMD drivers.
Extract protocol-agnostic SyncobjManager from Intel to shared
src/drivers/syncobj.rs — syncobj create/destroy/signal/reset/
wait/query and sync_file fd export/import.
Wire both into VirtioDriver:
- Add FenceTimeline + SyncobjManager fields
- Implement all 5 GpuDriver syncobj trait methods
(create, destroy, wait, export_fd, import_fd)
- Track fence seqnos in virgl_submit_3d (allocate
before submit, signal after completion)
Intel fence.rs and syncobj.rs converted to thin re-export
modules pointing at shared sources — no behavioral change
for Intel driver.
This gives Mesa VIRGL userspace the standard DRM syncobj
API for GPU/compositor synchronization.
Version 2.0 — reflects current state after ~100 commits:
66 compiled modules, 125 total .rs files, ~20,000 lines
19 dead modules wired, EOI fix, all 8 phases complete
GEM 81% Linux coverage, all 7 PHY types, DP 2.1 + HDMI 2.1
Integration gaps documented with mitigation status
The WIP recipes/wip/files/mc had an empty recipe.toml (0 bytes),
causing the cookbook to report 'successful' without producing any
output. Replaced with a symlink to the real recipe at
local/recipes/tui/mc which has the full build configuration.
Also fixed the recipe: removed broken cookbook_configure call
(which was cached from a previous failed attempt), replaced with
explicit configure+make+make install. Added gl_cv_list_mounted_fs=yes
since Redox has no /etc/mtab or /proc/mounts.
- Create recipes/tui/mc symlink to local/recipes/tui/mc
- Remove conflicting WIP recipes/wip/files/mc shadow
- Add sed fix for mountlist.m4 AC_MSG_ERROR -> AC_MSG_WARN
because Redox has no /etc/mtab or /proc/mounts
- mc still needs more work: configure succeeds but make
regeneration of configure from m4 files undoes the fix
mod.rs: added pub mod declarations for all previously-dead modules
PHY: mg_pll, dkl_phy, cx0_phy, snps_phy, edp_pll
Power: rps_rc6, dmc_power, psr_full, guc_submission, alpm
Display: dp_fec, dp_audio, hdmi_frl, hdmi_scrambler, dp_uhbr,
dp_phy, vrr, dsc, display_irq, bandwidth, panel_fitter
Platform: lspcon, tc_port
GT: workarounds, gpu_reset
Support: audio_eld, cdclk_tables, color_lmem, color_pipeline
handle_irq: fixed MSI-X EOI gap
InterruptHandle::eoi() now called after process_irq()
Lock held across IRQ processing to prevent early drop
Prevents MSI-X vectors from firing only once
30 modules were never compiled — now all 65 source files participate
in compilation. Legacy issues in previously-uncompiled modules remain
and will be addressed separately.
Passes the current Unix timestamp as BUILD_TIMESTAMP env var
to cargo, so rtcd can use it as a fallback when the hardware
RTC is unavailable or returns invalid data.
bison: fix __fseterr stub injection using LIBS variable instead
of ar rcs to avoid static archive member ordering issues.
Document all DP link training constants with specification references:
DPCD register addresses (DP 1.4 §3.5.1 Link Configuration)
Link rates: HBR/RBR/HBR2/HBR3/UHBR10/UHBR13.5/UHBR20
Encoding types: 8b/10b (HBR↓) vs 128b/132b (UHBR)
Lane status flags: CR_DONE, CHANNEL_EQ_DONE, SYMBOL_LOCKED
Training patterns: TPS1 (clock recovery), TPS2 (equalization)
DDI port width: x1/x2/x4 lane configuration
Replaced flat module list with fully categorized documentation.
Categories: Core, Lifecycle, GPU, Memory, Sync, Misc.
All 25 modules + 60 public types now organized for discoverability.
GEM subdirectory: 25 files, 2,280 lines, 0 errors — complete port at 81%
29_activate_console: changed from oneshot back to oneshot_async.
The oneshot type calls child.wait() which blocks the entire init
scheduler. If inputd doesn't drain its control channel promptly,
ControlHandle::write() hangs forever, freezing boot.
30_console: added 'sleep 0.2' before 'exec getty 2' to give
inputd time to process the VT activation before getty opens
/scheme/fbcon/2. Eliminates the race condition without
blocking the init scheduler.