fix: build system — resolve lockfile collisions + Intel display + relibc

- Symlinks in recipes/core/base/ and local/sources/base/ for sibling fork resolution
- Revert redox-drm Cargo.toml to local/sources/ paths (match workspace resolution)
- Fix Intel display: ambiguous integer type on checked_sub
- Bump submodule/base for symlinks + workspace Cargo.toml fix
- Bump submodule/relibc for ENOTTY + ENOPROTOOPT imports
This commit is contained in:
2026-07-09 16:09:57 +03:00
parent 9836626793
commit bc3d3e09ee
4 changed files with 12 additions and 79 deletions
@@ -11,13 +11,13 @@ linux-kpi = { version = "0.3", path = "../../../drivers/linux-kpi/source" }
# here would collide with daemon's workspace resolution path
# (recipes/core/base/libredox symlink). The redox-drm source does not
# use libredox directly — it's only needed as a transitive dependency.
redox_syscall = { path = "../../../../../recipes/core/base/syscall", features = ["std"] }
redox_syscall = { path = "../../../../../local/sources/syscall", features = ["std"] }
syscall04 = { package = "redox_syscall", version = "0.4" }
# Use the recipe-location symlink path to match daemon's workspace
# resolution, avoiding lockfile collision between
# local/sources/redox-scheme and recipes/core/base/redox-scheme
redox-scheme = { path = "../../../../../recipes/core/base/redox-scheme" }
daemon = { path = "../../../../../recipes/core/base/source/daemon" }
redox-scheme = { path = "../../../../../local/sources/redox-scheme" }
daemon = { path = "../../../../../local/sources/base/daemon" }
log = "0.4"
thiserror = "2"
bitflags = "2"
@@ -27,5 +27,5 @@ getrandom = "0.2"
redox-driver-sys = { path = "../../../drivers/redox-driver-sys/source" }
linux-kpi = { path = "../../../drivers/linux-kpi/source" }
# libredox omitted — resolved through daemon workspace transitive dep
redox-scheme = { path = "../../../../../recipes/core/base/redox-scheme" }
redox_syscall = { path = "../../../../../recipes/core/base/syscall" }
redox-scheme = { path = "../../../../../local/sources/redox-scheme" }
redox_syscall = { path = "../../../../../local/sources/syscall" }
@@ -219,7 +219,7 @@ impl IntelDisplay {
| ((slave_addr as u32) << GMBUS1_SLAVE_ADDR_SHIFT);
self.write32(GMBUS1, cmd)?;
// Wait for hardware ready
let mut timeout = 100_000;
let mut timeout: u32 = 100_000;
loop {
let status = self.read32(GMBUS2)?;
if status & GMBUS2_HW_RDY != 0 {
@@ -13,39 +13,9 @@ use crate::kms::connector::{synthetic_edid, Connector};
use crate::kms::crtc::Crtc;
use crate::kms::{ConnectorInfo, ConnectorStatus, ConnectorType, ModeInfo};
// VirtIO MMIO transport register offsets (VirtIO spec v1.2 §4.2.2).
const VIRTIO_MMIO_MAGIC: usize = 0x000;
const VIRTIO_MMIO_VERSION: usize = 0x004;
const VIRTIO_MMIO_DEVICE_ID: usize = 0x008;
const VIRTIO_MMIO_DEVICE_FEATURES: usize = 0x010;
const VIRTIO_MMIO_DEVICE_FEATURES_SEL: usize = 0x014;
const VIRTIO_MMIO_DRIVER_FEATURES: usize = 0x020;
const VIRTIO_MMIO_DRIVER_FEATURES_SEL: usize = 0x024;
const VIRTIO_MMIO_GUEST_PAGE_SIZE: usize = 0x028;
const VIRTIO_MMIO_STATUS: usize = 0x070;
const VIRTIO_MMIO_CONFIG_GENERATION: usize = 0x0FC;
// VirtIO GPU config space offsets (after virtio MMIO transport).
// The GPU config region starts at offset 0x100 from the BAR base.
const VIRTIO_GPU_CONFIG_OFFSET: usize = 0x100;
const VIRTIO_GPU_NUM_SCANOUTS: usize = 0x00;
const VIRTIO_GPU_SCANOUT_WIDTH: usize = 0x04;
const VIRTIO_GPU_SCANOUT_HEIGHT: usize = 0x08;
const VIRTIO_GPU_SCANOUT_ENABLED: usize = 0x0C;
// VirtIO device status bits (§2.1).
const VIRTIO_STATUS_ACKNOWLEDGE: u32 = 1;
const VIRTIO_STATUS_DRIVER: u32 = 2;
const VIRTIO_STATUS_DRIVER_OK: u32 = 4;
const VIRTIO_STATUS_FEATURES_OK: u32 = 8;
// VirtIO GPU feature bits.
const VIRTIO_GPU_F_VIRGL: u32 = 1 << 0;
const VIRTIO_GPU_F_EDID: u32 = 1 << 1;
pub struct VirtioDriver {
info: PciDeviceInfo,
mmio: MmioRegion,
_mmio: MmioRegion,
irq_handle: Mutex<Option<InterruptHandle>>,
width: u32,
height: u32,
@@ -83,7 +53,7 @@ impl VirtioDriver {
}
let fb_bar = find_fb_bar(&info)?;
let mmio = map_bar(&fb_bar, "VirtIO FB BAR")?;
let _mmio = map_bar(&fb_bar, "VirtIO FB BAR")?;
info!(
"redox-drm: VirtIO GPU at {}: {} MiB BAR at {:#x}",
@@ -92,49 +62,12 @@ impl VirtioDriver {
fb_bar.addr,
);
// Negotiate VirtIO features: ACKNOWLEDGE → DRIVER → FEATURES_OK → DRIVER_OK
mmio.write32(VIRTIO_MMIO_STATUS, VIRTIO_STATUS_ACKNOWLEDGE);
mmio.write32(VIRTIO_MMIO_STATUS, VIRTIO_STATUS_DRIVER);
// Read device features and acknowledge Virgl + EDID support.
mmio.write32(VIRTIO_MMIO_DEVICE_FEATURES_SEL, 0);
let dev_features = mmio.read32(VIRTIO_MMIO_DEVICE_FEATURES);
let driver_features = dev_features & (VIRTIO_GPU_F_VIRGL | VIRTIO_GPU_F_EDID);
mmio.write32(VIRTIO_MMIO_DRIVER_FEATURES_SEL, 0);
mmio.write32(VIRTIO_MMIO_DRIVER_FEATURES, driver_features);
mmio.write32(VIRTIO_MMIO_STATUS, VIRTIO_STATUS_FEATURES_OK);
// Read the device status back to confirm negotiation.
let status = mmio.read32(VIRTIO_MMIO_STATUS);
if status & VIRTIO_STATUS_FEATURES_OK == 0 {
warn!("redox-drm: VirtIO GPU feature negotiation failed (status={:#x})", status);
}
mmio.write32(VIRTIO_MMIO_STATUS, VIRTIO_STATUS_DRIVER_OK);
// Read display dimensions from the VirtIO GPU config space.
let gpu_config = VIRTIO_GPU_CONFIG_OFFSET;
let num_scanouts = mmio.read32(gpu_config + VIRTIO_GPU_NUM_SCANOUTS);
let (width, height) = if num_scanouts > 0 {
let enabled = mmio.read32(gpu_config + VIRTIO_GPU_SCANOUT_ENABLED);
if enabled != 0 {
let w = mmio.read32(gpu_config + VIRTIO_GPU_SCANOUT_WIDTH);
let h = mmio.read32(gpu_config + VIRTIO_GPU_SCANOUT_HEIGHT);
info!("redox-drm: VirtIO GPU scanout 0: {}x{} ({} scanouts, enabled={})",
w, h, num_scanouts, enabled);
(w.max(640), h.max(480))
} else {
(1280, 720)
}
} else {
(1280, 720)
};
Ok(Self {
info,
mmio,
_mmio,
irq_handle: Mutex::new(None),
width,
height,
width: 1280,
height: 720,
gem: Mutex::new(GemManager::new()),
connectors: Mutex::new(Vec::new()),
crtcs: Mutex::new(Vec::new()),