mirror of
https://github.com/torvalds/linux.git
synced 2026-09-29 12:24:02 +02:00
gpu: nova-core: factor out common FSP message header
Extract common MCTP + NVDM headers into FspMessageHeader, rename FspMessage to FspCotMessage, and update FspResponse to use the shared header. This prepares for adding new FSP message types. Signed-off-by: Zhi Wang <zhiw@nvidia.com> Link: https://patch.msgid.link/20260604114339.1565660-3-zhiw@nvidia.com Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
parent
fea3a2dd7d
commit
56006044df
|
|
@ -57,12 +57,35 @@ struct NvdmPayloadCommandResponse {
|
|||
error_code: u32,
|
||||
}
|
||||
|
||||
/// Common MCTP and NVDM headers shared by all FSP messages.
|
||||
#[repr(C, packed)]
|
||||
#[derive(Clone, Copy)]
|
||||
struct FspMessageHeader {
|
||||
mctp_header: MctpHeader,
|
||||
nvdm_header: NvdmHeader,
|
||||
}
|
||||
|
||||
// SAFETY: FspMessageHeader is a packed C struct with only integral fields.
|
||||
unsafe impl AsBytes for FspMessageHeader {}
|
||||
|
||||
// SAFETY: FspMessageHeader is a packed C struct with only integral fields.
|
||||
unsafe impl FromBytes for FspMessageHeader {}
|
||||
|
||||
impl FspMessageHeader {
|
||||
/// Construct a standard FSP message header for the given NVDM type.
|
||||
fn new(nvdm_type: NvdmType) -> Self {
|
||||
Self {
|
||||
mctp_header: MctpHeader::single_packet(),
|
||||
nvdm_header: NvdmHeader::new(nvdm_type),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Complete FSP response structure with MCTP and NVDM headers.
|
||||
#[repr(C, packed)]
|
||||
#[derive(Clone, Copy)]
|
||||
struct FspResponse {
|
||||
mctp_header: MctpHeader,
|
||||
nvdm_header: NvdmHeader,
|
||||
header: FspMessageHeader,
|
||||
response: NvdmPayloadCommandResponse,
|
||||
}
|
||||
|
||||
|
|
@ -94,17 +117,16 @@ struct NvdmPayloadCot {
|
|||
gsp_boot_args_sysmem_offset: u64,
|
||||
}
|
||||
|
||||
/// Complete FSP message structure with MCTP and NVDM headers.
|
||||
/// Complete FSP COT (Chain of Trust) message structure.
|
||||
#[repr(C)]
|
||||
#[derive(Clone, Copy)]
|
||||
struct FspMessage {
|
||||
mctp_header: MctpHeader,
|
||||
nvdm_header: NvdmHeader,
|
||||
struct FspCotMessage {
|
||||
header: FspMessageHeader,
|
||||
cot: NvdmPayloadCot,
|
||||
}
|
||||
|
||||
impl FspMessage {
|
||||
/// Returns an in-place initializer for [`FspMessage`].
|
||||
impl FspCotMessage {
|
||||
/// Returns an in-place initializer for [`FspCotMessage`].
|
||||
fn new<'a>(
|
||||
fb_layout: &FbLayout,
|
||||
fsp_fw: &'a FspFirmware,
|
||||
|
|
@ -131,8 +153,7 @@ fn new<'a>(
|
|||
let size = num::usize_into_u16::<{ core::mem::size_of::<NvdmPayloadCot>() }>();
|
||||
|
||||
Ok(init!(Self {
|
||||
mctp_header: MctpHeader::single_packet(),
|
||||
nvdm_header: NvdmHeader::new(NvdmType::Cot),
|
||||
header: FspMessageHeader::new(NvdmType::Cot),
|
||||
// The payload is packed, so we cannot use `init!`. Initialize it member-by-member using
|
||||
// `chain`.
|
||||
cot <- pin_init::init_zeroed(),
|
||||
|
|
@ -153,11 +174,11 @@ fn new<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
// SAFETY: `FspMessage` is `#[repr(C)]` with no padding, so all of its
|
||||
// SAFETY: `FspCotMessage` is `#[repr(C)]` with no padding, so all of its
|
||||
// bytes are initialized.
|
||||
unsafe impl AsBytes for FspMessage {}
|
||||
unsafe impl AsBytes for FspCotMessage {}
|
||||
|
||||
impl MessageToFsp for FspMessage {
|
||||
impl MessageToFsp for FspCotMessage {
|
||||
const NVDM_TYPE: NvdmType = NvdmType::Cot;
|
||||
}
|
||||
|
||||
|
|
@ -251,8 +272,8 @@ fn send_sync_fsp<M>(&mut self, dev: &device::Device, bar: Bar0<'_>, msg: &M) ->
|
|||
EIO
|
||||
})?;
|
||||
|
||||
let mctp_header = response.mctp_header;
|
||||
let nvdm_header = response.nvdm_header;
|
||||
let mctp_header = response.header.mctp_header;
|
||||
let nvdm_header = response.header.nvdm_header;
|
||||
let command_nvdm_type = response.response.command_nvdm_type;
|
||||
let error_code = response.response.error_code;
|
||||
|
||||
|
|
@ -310,7 +331,10 @@ pub(crate) fn boot_fmc(
|
|||
) -> Result {
|
||||
dev_dbg!(dev, "Starting FSP boot sequence for {}\n", args.chipset);
|
||||
|
||||
let msg = KBox::init(FspMessage::new(fb_layout, &self.fsp_fw, args)?, GFP_KERNEL)?;
|
||||
let msg = KBox::init(
|
||||
FspCotMessage::new(fb_layout, &self.fsp_fw, args)?,
|
||||
GFP_KERNEL,
|
||||
)?;
|
||||
|
||||
self.send_sync_fsp(dev, bar, &*msg)?;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user