intel: EU/subslice runtime detection via GT_SLICE_INFO and EU_DISABLE fuses
This commit is contained in:
@@ -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")?;
|
||||
|
||||
Reference in New Issue
Block a user