intel: EU/subslice runtime detection via GT_SLICE_INFO and EU_DISABLE fuses

This commit is contained in:
2026-06-01 21:58:50 +03:00
parent 25b9bd60c6
commit dca17ce146
2 changed files with 39 additions and 1 deletions
@@ -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)
}
@@ -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")?;