Add `CeGetFaultMethodBufferSizeParams` which wraps the bindings. Add `get_ce_fault_method_buffer_size` which sends the RM control RPC and returns the buffer size. This is needed for channel allocation.
Signed-off-by: Eliot Courtney <[email protected]> --- drivers/gpu/nova-core/gsp/fw/rm.rs | 17 +++++++++++++++ drivers/gpu/nova-core/gsp/rm/commands.rs | 36 +++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/fw/rm.rs b/drivers/gpu/nova-core/gsp/fw/rm.rs index 8bb7b11736b9..9f1e3546d39d 100644 --- a/drivers/gpu/nova-core/gsp/fw/rm.rs +++ b/drivers/gpu/nova-core/gsp/fw/rm.rs @@ -80,3 +80,20 @@ unsafe impl FromBytes for GspRmControl {} // SAFETY: This struct contains no padding. unsafe impl AsBytes for GspRmControl {} + +/// Wrapper for [`bindings::NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS`]. +#[derive(Zeroable)] +#[repr(transparent)] +pub(crate) struct CeGetFaultMethodBufferSizeParams( + bindings::NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS, +); + +impl CeGetFaultMethodBufferSizeParams { + /// Returns the CE fault method buffer size in bytes. + pub(crate) fn size(&self) -> u32 { + self.0.size + } +} + +// SAFETY: This struct only contains integer types for which all bit patterns are valid. +unsafe impl FromBytes for CeGetFaultMethodBufferSizeParams {} diff --git a/drivers/gpu/nova-core/gsp/rm/commands.rs b/drivers/gpu/nova-core/gsp/rm/commands.rs index 16bcf88644db..1d045e6f1afb 100644 --- a/drivers/gpu/nova-core/gsp/rm/commands.rs +++ b/drivers/gpu/nova-core/gsp/rm/commands.rs @@ -2,10 +2,14 @@ use core::{ array, - convert::Infallible, // + convert::Infallible, + mem::size_of, // }; -use kernel::prelude::*; +use kernel::{ + prelude::*, + transmute::FromBytes, // +}; use crate::{ driver::Bar0, @@ -94,7 +98,6 @@ fn read( } /// Sends an RM control command, checks the reply status, and returns the raw parameter bytes. -#[expect(dead_code)] fn send_rm_control( cmdq: &Cmdq, bar: &Bar0, @@ -109,3 +112,30 @@ fn send_rm_control( Ok(reply.params) } + +/// Sends the `CeGetFaultMethodBufferSize` RM control command and waits for its reply. +/// +/// Returns the CE fault method buffer size in bytes. +#[expect(dead_code)] +pub(crate) fn get_ce_fault_method_buffer_size( + cmdq: &Cmdq, + bar: &Bar0, + h_client: u32, + h_subdevice: u32, +) -> Result<u32> { + // Stack-allocate the request; CeGetFaultMethodBufferSizeParams is small (4 bytes). + let req = [0u8; size_of::<CeGetFaultMethodBufferSizeParams>()]; + + let reply = send_rm_control( + cmdq, + bar, + h_client, + h_subdevice, + RmControlMsgFunction::CeGetFaultMethodBufferSize, + &req, + )?; + + let params = CeGetFaultMethodBufferSizeParams::from_bytes(&reply).ok_or(EINVAL)?; + + Ok(params.size()) +} -- 2.53.0
