mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 04:21:09 -04:00
gpu: nova-core: print FB sizes, along with ranges
For convenience of the reader: now you can directly see the sizes of
each range. It is surprising just how much this helps.
Sample output (using an Ampere GA104):
NovaCore 0000:e1:00.0: FbLayout {
fb: 0x0..0x3ff800000 (16376 MiB),
vga_workspace: 0x3ff700000..0x3ff800000 (1 MiB),
frts: 0x3ff600000..0x3ff700000 (1 MiB),
boot: 0x3ff5fa000..0x3ff600000 (24 KiB),
elf: 0x3fb960000..0x3ff5f9000 (60 MiB),
wpr2_heap: 0x3f3900000..0x3fb900000 (128 MiB),
wpr2: 0x3f3800000..0x3ff700000 (191 MiB),
heap: 0x3f3700000..0x3f3800000 (1 MiB),
vf_partition_count: 0x0,
}
Cc: Timur Tabi <ttabi@nvidia.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
Signed-off-by: John Hubbard <jhubbard@nvidia.com>
Link: https://patch.msgid.link/20260310021125.117855-2-jhubbard@nvidia.com
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
committed by
Alexandre Courbot
parent
0499a3826c
commit
ba6e088ac6
@@ -1,9 +1,13 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
use core::ops::Range;
|
||||
use core::ops::{
|
||||
Deref,
|
||||
Range, //
|
||||
};
|
||||
|
||||
use kernel::{
|
||||
device,
|
||||
fmt,
|
||||
prelude::*,
|
||||
ptr::{
|
||||
Alignable,
|
||||
@@ -94,26 +98,71 @@ pub(crate) fn unregister(&self, bar: &Bar0) {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct FbRange(Range<u64>);
|
||||
|
||||
impl From<Range<u64>> for FbRange {
|
||||
fn from(range: Range<u64>) -> Self {
|
||||
Self(range)
|
||||
}
|
||||
}
|
||||
|
||||
impl Deref for FbRange {
|
||||
type Target = Range<u64>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for FbRange {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
// Use alternate format ({:#?}) to include size, compact format ({:?}) for just the range.
|
||||
if f.alternate() {
|
||||
let size = self.0.end - self.0.start;
|
||||
|
||||
if size < usize_as_u64(SZ_1M) {
|
||||
let size_kib = size / usize_as_u64(SZ_1K);
|
||||
f.write_fmt(fmt!(
|
||||
"{:#x}..{:#x} ({} KiB)",
|
||||
self.0.start,
|
||||
self.0.end,
|
||||
size_kib
|
||||
))
|
||||
} else {
|
||||
let size_mib = size / usize_as_u64(SZ_1M);
|
||||
f.write_fmt(fmt!(
|
||||
"{:#x}..{:#x} ({} MiB)",
|
||||
self.0.start,
|
||||
self.0.end,
|
||||
size_mib
|
||||
))
|
||||
}
|
||||
} else {
|
||||
f.write_fmt(fmt!("{:#x}..{:#x}", self.0.start, self.0.end))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Layout of the GPU framebuffer memory.
|
||||
///
|
||||
/// Contains ranges of GPU memory reserved for a given purpose during the GSP boot process.
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct FbLayout {
|
||||
/// Range of the framebuffer. Starts at `0`.
|
||||
pub(crate) fb: Range<u64>,
|
||||
pub(crate) fb: FbRange,
|
||||
/// VGA workspace, small area of reserved memory at the end of the framebuffer.
|
||||
pub(crate) vga_workspace: Range<u64>,
|
||||
pub(crate) vga_workspace: FbRange,
|
||||
/// FRTS range.
|
||||
pub(crate) frts: Range<u64>,
|
||||
pub(crate) frts: FbRange,
|
||||
/// Memory area containing the GSP bootloader image.
|
||||
pub(crate) boot: Range<u64>,
|
||||
pub(crate) boot: FbRange,
|
||||
/// Memory area containing the GSP firmware image.
|
||||
pub(crate) elf: Range<u64>,
|
||||
pub(crate) elf: FbRange,
|
||||
/// WPR2 heap.
|
||||
pub(crate) wpr2_heap: Range<u64>,
|
||||
pub(crate) wpr2_heap: FbRange,
|
||||
/// WPR2 region range, starting with an instance of `GspFwWprMeta`.
|
||||
pub(crate) wpr2: Range<u64>,
|
||||
pub(crate) heap: Range<u64>,
|
||||
pub(crate) wpr2: FbRange,
|
||||
pub(crate) heap: FbRange,
|
||||
pub(crate) vf_partition_count: u8,
|
||||
}
|
||||
|
||||
@@ -125,7 +174,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
let fb = {
|
||||
let fb_size = hal.vidmem_size(bar);
|
||||
|
||||
0..fb_size
|
||||
FbRange(0..fb_size)
|
||||
};
|
||||
|
||||
let vga_workspace = {
|
||||
@@ -152,7 +201,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
}
|
||||
};
|
||||
|
||||
vga_base..fb.end
|
||||
FbRange(vga_base..fb.end)
|
||||
};
|
||||
|
||||
let frts = {
|
||||
@@ -160,7 +209,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
const FRTS_SIZE: u64 = usize_as_u64(SZ_1M);
|
||||
let frts_base = vga_workspace.start.align_down(FRTS_DOWN_ALIGN) - FRTS_SIZE;
|
||||
|
||||
frts_base..frts_base + FRTS_SIZE
|
||||
FbRange(frts_base..frts_base + FRTS_SIZE)
|
||||
};
|
||||
|
||||
let boot = {
|
||||
@@ -168,7 +217,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
let bootloader_size = u64::from_safe_cast(gsp_fw.bootloader.ucode.size());
|
||||
let bootloader_base = (frts.start - bootloader_size).align_down(BOOTLOADER_DOWN_ALIGN);
|
||||
|
||||
bootloader_base..bootloader_base + bootloader_size
|
||||
FbRange(bootloader_base..bootloader_base + bootloader_size)
|
||||
};
|
||||
|
||||
let elf = {
|
||||
@@ -176,7 +225,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
let elf_size = u64::from_safe_cast(gsp_fw.size);
|
||||
let elf_addr = (boot.start - elf_size).align_down(ELF_DOWN_ALIGN);
|
||||
|
||||
elf_addr..elf_addr + elf_size
|
||||
FbRange(elf_addr..elf_addr + elf_size)
|
||||
};
|
||||
|
||||
let wpr2_heap = {
|
||||
@@ -185,7 +234,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
gsp::LibosParams::from_chipset(chipset).wpr_heap_size(chipset, fb.end);
|
||||
let wpr2_heap_addr = (elf.start - wpr2_heap_size).align_down(WPR2_HEAP_DOWN_ALIGN);
|
||||
|
||||
wpr2_heap_addr..(elf.start).align_down(WPR2_HEAP_DOWN_ALIGN)
|
||||
FbRange(wpr2_heap_addr..(elf.start).align_down(WPR2_HEAP_DOWN_ALIGN))
|
||||
};
|
||||
|
||||
let wpr2 = {
|
||||
@@ -193,13 +242,13 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
|
||||
let wpr2_addr = (wpr2_heap.start - u64::from_safe_cast(size_of::<gsp::GspFwWprMeta>()))
|
||||
.align_down(WPR2_DOWN_ALIGN);
|
||||
|
||||
wpr2_addr..frts.end
|
||||
FbRange(wpr2_addr..frts.end)
|
||||
};
|
||||
|
||||
let heap = {
|
||||
const HEAP_SIZE: u64 = usize_as_u64(SZ_1M);
|
||||
|
||||
wpr2.start - HEAP_SIZE..wpr2.start
|
||||
FbRange(wpr2.start - HEAP_SIZE..wpr2.start)
|
||||
};
|
||||
|
||||
Ok(Self {
|
||||
|
||||
Reference in New Issue
Block a user