From dca17ce146bed4fae5fe451137a8dd3d5b0ccae7 Mon Sep 17 00:00:00 2001 From: Admin Pupkin Date: Mon, 1 Jun 2026 21:58:50 +0300 Subject: [PATCH] intel: EU/subslice runtime detection via GT_SLICE_INFO and EU_DISABLE fuses --- .../source/src/drivers/intel/info.rs | 28 +++++++++++++++++++ .../redox-drm/source/src/drivers/intel/mod.rs | 12 +++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/intel/info.rs b/local/recipes/gpu/redox-drm/source/src/drivers/intel/info.rs index a0bea46731..75c57515fd 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/intel/info.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/intel/info.rs @@ -1,6 +1,13 @@ use log::warn; const GMD_ID_MMIO: usize = 0x138040; +const GEN8_EU_DISABLE0: usize = 0x1913C; +const GEN8_EU_DISABLE1: usize = 0x19140; +const GEN8_EU_DISABLE2: usize = 0x19144; +const GEN8_GT_SLICE_INFO: usize = 0x138064; +const GEN8_GT_SUBSLICE_MASK_SHIFT: u32 = 8; +const GEN8_GT_EUS_PER_SUBSLICE_SHIFT: u32 = 0; +const GEN8_GT_EUS_PER_SUBSLICE_MASK: u32 = 0xFF; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct GmdId { @@ -255,3 +262,24 @@ pub fn device_info_from_id(device_id: u16) -> IntelDeviceInfo { warn!("redox-drm: Intel device {:#06x} not in device info table — using Gen9 defaults", device_id); default_info() } + +pub fn detect_eu_config(mmio: &redox_driver_sys::memory::MmioRegion) -> (u8, u8) { + let gt_info = mmio.read32(GEN8_GT_SLICE_INFO); + let eus_per_subslice = ((gt_info >> GEN8_GT_EUS_PER_SUBSLICE_SHIFT as u32) + & GEN8_GT_EUS_PER_SUBSLICE_MASK) as u8; + let subslice_count = ((gt_info >> GEN8_GT_SUBSLICE_MASK_SHIFT as u32) & 0xFF) as u8; + + let total_eus = if eus_per_subslice > 0 && subslice_count > 0 { + eus_per_subslice.saturating_mul(subslice_count) + } else { + let disabled0 = !mmio.read32(GEN8_EU_DISABLE0); + let disabled1 = !mmio.read32(GEN8_EU_DISABLE1); + let disabled2 = !mmio.read32(GEN8_EU_DISABLE2); + let enabled = (disabled0.count_ones() + + disabled1.count_ones() + + disabled2.count_ones()) as u8; + enabled + }; + + (total_eus, subslice_count) +} 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 37f82d6993..0969ed00b4 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 @@ -71,7 +71,7 @@ use self::gt::IntelGtManager; use self::gtt::IntelGtt; use self::guc::GucFirmware; use self::hotplug::HotplugHandler; -use self::info::{GmdId, IntelDeviceInfo, IntelGeneration, device_info_from_id}; +use self::info::{GmdId, IntelDeviceInfo, IntelGeneration, detect_eu_config, device_info_from_id}; use self::lmem::{IntelLmem, is_discrete_gpu}; use self::regs::IntelRegs; use self::regs_gen9::Gen9Regs; @@ -215,6 +215,16 @@ impl IntelDriver { info!("redox-drm-intel: no GMD_ID available (stepping {}), using static device info", stepping); } + let (eu_count, subslice_count) = detect_eu_config(&mmio_arc); + if eu_count > 0 { + device_info.num_eus = eu_count; + device_info.num_subslices = subslice_count; + info!( + "redox-drm-intel: detected {} EUs across {} subslices", + eu_count, subslice_count + ); + } + let lmem = if let Some(lmem_bar) = lmem_bar_info { if lmem_bar.size > 0 && lmem_bar.is_memory() { let lmem_mmio = map_bar(&mut device, &lmem_bar, "Intel LMEM BAR")?;