From 0dee6ec9da040c263d05688ff093ea014541be18 Mon Sep 17 00:00:00 2001 From: Admin Pupkin Date: Sat, 30 May 2026 10:00:36 +0300 Subject: [PATCH] =?UTF-8?q?intel:=20fix=20read=5Fedid=5Fblock=20stub=20?= =?UTF-8?q?=E2=80=94=20wire=20to=20GMBUS=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the hard stub in display.rs::read_edid_block() with a real GMBUS I2C EDID read. Fixes the #1 plan gap identified in the code quality audit. - display.rs: add gmbus: Option to IntelDisplay struct and new() constructor. read_edid_block() now calls gmbus.read_edid() via GymbusPort::from_connector_index(). Falls back to DriverError if no GMBUS controller available. - mod.rs: pass gmbus controller (cloned) to IntelDisplay::new() This completes the EDID path for Gen9 platforms (Gen8-9 have GMBUS, Xe2 uses DP AUX). The synthetic 1080p fallback remains as the final safety net. --- .../source/src/drivers/intel/display.rs | 22 ++++++++++++++++--- .../redox-drm/source/src/drivers/intel/mod.rs | 3 ++- 2 files changed, 21 insertions(+), 4 deletions(-) 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)?;