Skip to content

Commit 4655d12

Browse files
WhatAmISupposedToPutHerejannau
authored andcommitted
drm/asahi: starlight-debug
- pass exact size via "debug,*-size" properties - skip comparison if the starlight data is missing - use `dev_{err,info}!` for logging - explicitly log matching data Signed-off-by: Sasha Finkelstein <fnkl.kernel@gmail.com> Co-developed-by: Janne Grunau <j@jannau.net> Signed-off-by: Janne Grunau <j@jannau.net>
1 parent d17aabe commit 4655d12

3 files changed

Lines changed: 136 additions & 0 deletions

File tree

drivers/gpu/drm/asahi/gpu.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
1414
use core::any::Any;
1515
use core::ops::Range;
16+
use core::slice;
1617
use core::sync::atomic::{
1718
AtomicBool,
1819
AtomicU64,
@@ -23,6 +24,8 @@ use kernel::{
2324
c_str,
2425
drm::gem::shmem,
2526
error::code::*,
27+
io::mem::{Mem, MemFlags},
28+
iosys_map::IoSysMapRef,
2629
macros::versions,
2730
new_mutex,
2831
prelude::*,
@@ -773,6 +776,28 @@ impl GpuManager::ver {
773776
Ok(x)
774777
}
775778

779+
fn load_hwdata_blob(dev: &AsahiDevice, name: &CStr, size_name: &CStr) -> Result<KVVec<u8>> {
780+
let of_node = dev.as_ref().of_node().ok_or(EINVAL)?;
781+
let size: usize = dev
782+
.as_ref()
783+
.fwnode()
784+
.ok_or(ENOENT)?
785+
.property_read::<u32>(size_name)
786+
.or(0)
787+
.try_into()?;
788+
let res = of_node.reserved_mem_region_to_resource_byname(name)?;
789+
// SAFETY: No dma here, just loading init data.
790+
let mem = unsafe { Mem::try_new(res, MemFlags::WB)? };
791+
if size > mem.size() {
792+
return Err(ENOENT);
793+
}
794+
// SAFETY: trusting the bootloader to fill it out correctly
795+
let blob_sl = unsafe { slice::from_raw_parts(mem.ptr(), size) };
796+
let mut blob = KVVec::new();
797+
blob.extend_from_slice(blob_sl, GFP_KERNEL)?;
798+
Ok(blob)
799+
}
800+
776801
/// Fetch and validate the GPU dynamic configuration from the device tree and hardware.
777802
///
778803
/// Force disable inlining to avoid blowing up the stack.
@@ -880,6 +905,25 @@ impl GpuManager::ver {
880905
firmware_version: fwnode
881906
.property_read_array_vec(c_str!("apple,firmware-version"), 3)?
882907
.or(kernel::kvec![0; 3]?),
908+
909+
hw_data_a: Self::load_hwdata_blob(
910+
dev,
911+
c_str!("hw-cal-a"),
912+
c_str!("debug,hw-cal-a-size"),
913+
)
914+
.unwrap_or(KVVec::new()),
915+
hw_data_b: Self::load_hwdata_blob(
916+
dev,
917+
c_str!("hw-cal-b"),
918+
c_str!("debug,hw-cal-b-size"),
919+
)
920+
.unwrap_or(KVVec::new()),
921+
hw_globals: Self::load_hwdata_blob(
922+
dev,
923+
c_str!("globals"),
924+
c_str!("debug,globals-size"),
925+
)
926+
.unwrap_or(KVVec::new()),
883927
},
884928
GFP_KERNEL,
885929
)?)

drivers/gpu/drm/asahi/hw/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ pub(crate) struct DynConfig {
303303
/// Firmware version.
304304
#[allow(dead_code)]
305305
pub(crate) firmware_version: KVec<u32>,
306+
307+
pub(crate) hw_data_a: KVVec<u8>,
308+
pub(crate) hw_data_b: KVVec<u8>,
309+
pub(crate) hw_globals: KVVec<u8>,
306310
}
307311

308312
/// Specific GPU ID configuration fetched from SGX MMIO registers.

drivers/gpu/drm/asahi/initdata.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,35 @@ impl<'a> InitDataBuilder::ver<'a> {
483483
raw.unk_hws2[i] = if *j == 0xffff { 0 } else { j / 2 };
484484
}
485485

486+
if !dyncfg.hw_data_b.is_empty() {
487+
unsafe {
488+
let mut matches: bool = true;
489+
let sla = core::slice::from_raw_parts(
490+
raw as *const raw::HwDataA::ver as *const u8,
491+
core::mem::size_of::<raw::HwDataA::ver>(),
492+
);
493+
if sla.len() != dyncfg.hw_data_a.len() {
494+
matches = false;
495+
dev_err!(
496+
self.dev.as_ref(),
497+
"!!! Hwdata A size mismatch: {} {}",
498+
sla.len(),
499+
dyncfg.hw_data_a.len(),
500+
);
501+
}
502+
for i in 0..core::cmp::min(sla.len(), dyncfg.hw_data_a.len()) {
503+
if sla[i] != dyncfg.hw_data_a[i] {
504+
matches = false;
505+
dev_err!(self.dev.as_ref(), "!!! Hwdata A first mismatch: {i}");
506+
break;
507+
}
508+
}
509+
if matches {
510+
dev_info!(self.dev.as_ref(), "!!! Hwdata A match");
511+
}
512+
}
513+
}
514+
486515
Ok(())
487516
})
488517
})
@@ -633,6 +662,35 @@ impl<'a> InitDataBuilder::ver<'a> {
633662
raw.gpu_rev_id = hw::GpuRevisionID::B0 as u32;
634663
}
635664

665+
if !dyncfg.hw_data_b.is_empty() {
666+
unsafe {
667+
let mut matches: bool = true;
668+
let sla = core::slice::from_raw_parts(
669+
raw as *const raw::HwDataB::ver as *const u8,
670+
core::mem::size_of::<raw::HwDataB::ver>(),
671+
);
672+
if sla.len() != dyncfg.hw_data_b.len() {
673+
matches = false;
674+
dev_err!(
675+
self.dev.as_ref(),
676+
"!!! Hwdata B size mismatch: {} {}",
677+
sla.len(),
678+
dyncfg.hw_data_b.len(),
679+
);
680+
}
681+
for i in 0..core::cmp::min(sla.len(), dyncfg.hw_data_b.len()) {
682+
if sla[i] != dyncfg.hw_data_b[i] {
683+
matches = false;
684+
dev_err!(self.dev.as_ref(), "!!! Hwdata B first mismatch: {i}");
685+
break;
686+
}
687+
}
688+
if matches {
689+
dev_info!(self.dev.as_ref(), "!!! Hwdata B match");
690+
}
691+
}
692+
}
693+
636694
Ok(())
637695
})
638696
})
@@ -757,6 +815,36 @@ impl<'a> InitDataBuilder::ver<'a> {
757815
}
758816
raw.unk_118e8 = 1;
759817
}
818+
819+
if !dyncfg.hw_globals.is_empty() {
820+
unsafe {
821+
let mut matches: bool = true;
822+
let sla = core::slice::from_raw_parts(
823+
raw as *const raw::Globals::ver as *const u8,
824+
core::mem::size_of::<raw::Globals::ver>(),
825+
);
826+
if sla.len() != dyncfg.hw_globals.len() {
827+
matches = false;
828+
dev_err!(
829+
self.dev.as_ref(),
830+
"!!! Globals size mismatch: {} {}",
831+
sla.len(),
832+
dyncfg.hw_globals.len(),
833+
);
834+
}
835+
for i in 0..core::cmp::min(sla.len(), dyncfg.hw_globals.len()) {
836+
if sla[i] != dyncfg.hw_globals[i] {
837+
matches = false;
838+
dev_err!(self.dev.as_ref(), "!!! Globals first mismatch: {i}");
839+
break;
840+
}
841+
}
842+
if matches {
843+
dev_info!(self.dev.as_ref(), "!!! Globals match");
844+
}
845+
}
846+
}
847+
760848
Ok(())
761849
})
762850
})

0 commit comments

Comments
 (0)