diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/intel/display.rs b/local/recipes/gpu/redox-drm/source/src/drivers/intel/display.rs index ba42d55210..c54f3b0c2d 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/intel/display.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/intel/display.rs @@ -3,6 +3,7 @@ use std::sync::Mutex; use log::{debug, info}; use redox_driver_sys::memory::MmioRegion; +use super::gmbus::{GmbusController, GmbusPort}; use super::regs::IntelRegs; use crate::driver::{DriverError, Result}; use crate::kms::connector::synthetic_edid; @@ -26,10 +27,11 @@ pub struct IntelDisplay { mmio: MmioRegion, pipes: Mutex>, regs: &'static dyn IntelRegs, + gmbus: Option, } impl IntelDisplay { - pub fn new(mmio: MmioRegion, regs: &'static dyn IntelRegs) -> Result { + pub fn new(mmio: MmioRegion, regs: &'static dyn IntelRegs, gmbus: Option) -> Result { let pipes = Self::detect_pipes(&mmio, regs)?; info!( "redox-drm: Intel display initialized with {} pipe(s)", @@ -39,6 +41,7 @@ impl IntelDisplay { mmio, pipes: Mutex::new(pipes), regs, + gmbus, }) } @@ -145,9 +148,22 @@ impl IntelDisplay { synthetic_edid() } - fn read_edid_block(&self, _port: u8, _block: u8, _buf: &mut [u8]) -> Result<()> { + fn read_edid_block(&self, port: u8, _block: u8, buf: &mut [u8]) -> Result<()> { + if let Some(ref gmbus) = self.gmbus { + let gmbus_port = GmbusPort::from_connector_index(port); + match gmbus.read_edid(gmbus_port) { + Ok(edid) => { + let len = edid.len().min(buf.len()); + buf[..len].copy_from_slice(&edid[..len]); + return Ok(()); + } + Err(e) => { + debug!("redox-drm: Intel GMBUS EDID read failed on port {}: {}", port, e); + } + } + } Err(DriverError::Initialization( - "EDID I2C/DDC not yet implemented".into(), + "EDID I2C/DDC not available — no GMBUS controller".into(), )) } diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs b/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs index 076b015789..dbf7757aed 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs @@ -224,7 +224,8 @@ impl IntelDriver { } } - let display = IntelDisplay::new(display_mmio, regs)?; + let display_gmbus = gmbus.clone(); + let display = IntelDisplay::new(display_mmio, regs, display_gmbus)?; let mut gtt = IntelGtt::init(gtt_mmio, gtt_control_mmio)?; let mut ring = IntelRing::create(ring_mmio, RingType::Render)?; ring.bind_gtt(&mut gtt)?;