mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
gpu: nova-core: gsp: Create wpr metadata
The GSP requires some pieces of metadata to boot. These are passed in a struct which the GSP transfers via DMA. Create this struct and get a handle to it for future use when booting the GSP. Signed-off-by: Alistair Popple <apopple@nvidia.com> Co-developed-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Message-ID: <20251110-gsp_boot-v9-5-8ae4058e3c0e@nvidia.com>
This commit is contained in:
committed by
Alexandre Courbot
parent
f38b4f105c
commit
41235c40ed
@@ -98,7 +98,6 @@ impl SysmemFlush {
|
||||
///
|
||||
/// Contains ranges of GPU memory reserved for a given purpose during the GSP boot process.
|
||||
#[derive(Debug)]
|
||||
#[expect(dead_code)]
|
||||
pub(crate) struct FbLayout {
|
||||
/// Range of the framebuffer. Starts at `0`.
|
||||
pub(crate) fb: Range<u64>,
|
||||
|
||||
@@ -145,7 +145,7 @@ pub(crate) struct GspFirmware {
|
||||
/// Size in bytes of the firmware contained in [`Self::fw`].
|
||||
pub(crate) size: usize,
|
||||
/// Device-mapped GSP signatures matching the GPU's [`Chipset`].
|
||||
signatures: DmaObject,
|
||||
pub(crate) signatures: DmaObject,
|
||||
/// GSP bootloader, verifies the GSP firmware before loading and running it.
|
||||
pub(crate) bootloader: RiscvFirmware,
|
||||
}
|
||||
@@ -231,7 +231,6 @@ impl GspFirmware {
|
||||
}))
|
||||
}
|
||||
|
||||
#[expect(unused)]
|
||||
/// Returns the DMA handle of the radix3 level 0 page table.
|
||||
pub(crate) fn radix3_dma_handle(&self) -> DmaAddress {
|
||||
self.level0.dma_handle()
|
||||
|
||||
@@ -60,11 +60,11 @@ impl RmRiscvUCodeDesc {
|
||||
#[expect(unused)]
|
||||
pub(crate) struct RiscvFirmware {
|
||||
/// Offset at which the code starts in the firmware image.
|
||||
code_offset: u32,
|
||||
pub(crate) code_offset: u32,
|
||||
/// Offset at which the data starts in the firmware image.
|
||||
data_offset: u32,
|
||||
pub(crate) data_offset: u32,
|
||||
/// Offset at which the manifest starts in the firmware image.
|
||||
manifest_offset: u32,
|
||||
pub(crate) manifest_offset: u32,
|
||||
/// Application version.
|
||||
app_version: u32,
|
||||
/// Device-mapped firmware image.
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
use kernel::{
|
||||
device,
|
||||
dma::CoherentAllocation,
|
||||
dma_write,
|
||||
pci,
|
||||
prelude::*, //
|
||||
};
|
||||
@@ -27,6 +29,7 @@ use crate::{
|
||||
FIRMWARE_VERSION, //
|
||||
},
|
||||
gpu::Chipset,
|
||||
gsp::GspFwWprMeta,
|
||||
regs,
|
||||
vbios::Vbios,
|
||||
};
|
||||
@@ -146,6 +149,10 @@ impl super::Gsp {
|
||||
bar,
|
||||
)?;
|
||||
|
||||
let wpr_meta =
|
||||
CoherentAllocation::<GspFwWprMeta>::alloc_coherent(dev, 1, GFP_KERNEL | __GFP_ZERO)?;
|
||||
dma_write!(wpr_meta[0] = GspFwWprMeta::new(&gsp_fw, &fb_layout))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,10 @@ use kernel::{
|
||||
Alignable,
|
||||
Alignment, //
|
||||
},
|
||||
sizes::SZ_1M,
|
||||
sizes::{
|
||||
SZ_128K,
|
||||
SZ_1M, //
|
||||
},
|
||||
transmute::{
|
||||
AsBytes,
|
||||
FromBytes, //
|
||||
@@ -21,6 +24,8 @@ use kernel::{
|
||||
};
|
||||
|
||||
use crate::{
|
||||
fb::FbLayout,
|
||||
firmware::gsp::GspFirmware,
|
||||
gpu::Chipset,
|
||||
num::{
|
||||
self,
|
||||
@@ -122,6 +127,60 @@ impl LibosParams {
|
||||
#[repr(transparent)]
|
||||
pub(crate) struct GspFwWprMeta(bindings::GspFwWprMeta);
|
||||
|
||||
// SAFETY: Padding is explicit and does not contain uninitialized data.
|
||||
unsafe impl AsBytes for GspFwWprMeta {}
|
||||
|
||||
// SAFETY: This struct only contains integer types for which all bit patterns
|
||||
// are valid.
|
||||
unsafe impl FromBytes for GspFwWprMeta {}
|
||||
|
||||
type GspFwWprMetaBootResumeInfo = r570_144::GspFwWprMeta__bindgen_ty_1;
|
||||
type GspFwWprMetaBootInfo = r570_144::GspFwWprMeta__bindgen_ty_1__bindgen_ty_1;
|
||||
|
||||
impl GspFwWprMeta {
|
||||
/// Fill in and return a `GspFwWprMeta` suitable for booting `gsp_firmware` using the
|
||||
/// `fb_layout` layout.
|
||||
pub(crate) fn new(gsp_firmware: &GspFirmware, fb_layout: &FbLayout) -> Self {
|
||||
Self(bindings::GspFwWprMeta {
|
||||
// CAST: we want to store the bits of `GSP_FW_WPR_META_MAGIC` unmodified.
|
||||
magic: r570_144::GSP_FW_WPR_META_MAGIC as u64,
|
||||
revision: u64::from(r570_144::GSP_FW_WPR_META_REVISION),
|
||||
sysmemAddrOfRadix3Elf: gsp_firmware.radix3_dma_handle(),
|
||||
sizeOfRadix3Elf: u64::from_safe_cast(gsp_firmware.size),
|
||||
sysmemAddrOfBootloader: gsp_firmware.bootloader.ucode.dma_handle(),
|
||||
sizeOfBootloader: u64::from_safe_cast(gsp_firmware.bootloader.ucode.size()),
|
||||
bootloaderCodeOffset: u64::from(gsp_firmware.bootloader.code_offset),
|
||||
bootloaderDataOffset: u64::from(gsp_firmware.bootloader.data_offset),
|
||||
bootloaderManifestOffset: u64::from(gsp_firmware.bootloader.manifest_offset),
|
||||
__bindgen_anon_1: GspFwWprMetaBootResumeInfo {
|
||||
__bindgen_anon_1: GspFwWprMetaBootInfo {
|
||||
sysmemAddrOfSignature: gsp_firmware.signatures.dma_handle(),
|
||||
sizeOfSignature: u64::from_safe_cast(gsp_firmware.signatures.size()),
|
||||
},
|
||||
},
|
||||
gspFwRsvdStart: fb_layout.heap.start,
|
||||
nonWprHeapOffset: fb_layout.heap.start,
|
||||
nonWprHeapSize: fb_layout.heap.end - fb_layout.heap.start,
|
||||
gspFwWprStart: fb_layout.wpr2.start,
|
||||
gspFwHeapOffset: fb_layout.wpr2_heap.start,
|
||||
gspFwHeapSize: fb_layout.wpr2_heap.end - fb_layout.wpr2_heap.start,
|
||||
gspFwOffset: fb_layout.elf.start,
|
||||
bootBinOffset: fb_layout.boot.start,
|
||||
frtsOffset: fb_layout.frts.start,
|
||||
frtsSize: fb_layout.frts.end - fb_layout.frts.start,
|
||||
gspFwWprEnd: fb_layout
|
||||
.vga_workspace
|
||||
.start
|
||||
.align_down(Alignment::new::<SZ_128K>()),
|
||||
gspFwHeapVfPartitionCount: fb_layout.vf_partition_count,
|
||||
fbSize: fb_layout.fb.end - fb_layout.fb.start,
|
||||
vgaWorkspaceOffset: fb_layout.vga_workspace.start,
|
||||
vgaWorkspaceSize: fb_layout.vga_workspace.end - fb_layout.vga_workspace.start,
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Struct containing the arguments required to pass a memory buffer to the GSP
|
||||
/// for use during initialisation.
|
||||
///
|
||||
|
||||
@@ -9,6 +9,8 @@ pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_MIN_MB: u32 = 64;
|
||||
pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_MAX_MB: u32 = 256;
|
||||
pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_BAREMETAL_MIN_MB: u32 = 88;
|
||||
pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_BAREMETAL_MAX_MB: u32 = 280;
|
||||
pub const GSP_FW_WPR_META_REVISION: u32 = 1;
|
||||
pub const GSP_FW_WPR_META_MAGIC: i64 = -2577556379034558285;
|
||||
pub type __u8 = ffi::c_uchar;
|
||||
pub type __u16 = ffi::c_ushort;
|
||||
pub type __u32 = ffi::c_uint;
|
||||
|
||||
Reference in New Issue
Block a user