Change gpu_name() to return a Result instead of an Option. This avoids silently discarding error information when parsing the GPU name string from the GSP.
Update the callsite to log a warning with the error details on failure, rather than just displaying "invalid GPU name". Suggested-by: Danilo Krummrich <[email protected]> Signed-off-by: John Hubbard <[email protected]> --- drivers/gpu/nova-core/gsp/boot.rs | 9 ++++----- drivers/gpu/nova-core/gsp/commands.rs | 28 +++++++++++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/boot.rs index a53d80620468..4a5c49a502f7 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -238,11 +238,10 @@ pub(crate) fn boot( // Obtain and display basic GPU information. let info = commands::get_gsp_info(&mut self.cmdq, bar)?; - dev_info!( - pdev.as_ref(), - "GPU name: {}\n", - info.gpu_name().unwrap_or("invalid GPU name") - ); + match info.gpu_name() { + Ok(name) => dev_info!(pdev.as_ref(), "GPU name: {}\n", name), + Err(e) => dev_warn!(pdev.as_ref(), "GPU name unavailable: {:?}\n", e), + } Ok(()) } diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/gsp/commands.rs index a11fe6018091..c8430a076269 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -2,7 +2,9 @@ use core::{ array, - convert::Infallible, // + convert::Infallible, + ffi::FromBytesUntilNulError, + str::Utf8Error, // }; use kernel::{ @@ -204,13 +206,27 @@ fn read( } } +/// Error type for [`GetGspStaticInfoReply::gpu_name`]. +#[derive(Debug)] +pub(crate) enum GpuNameError { + /// The GPU name string does not contain a null terminator. + NoNullTerminator(FromBytesUntilNulError), + + /// The GPU name string contains invalid UTF-8. + #[expect(dead_code)] + InvalidUtf8(Utf8Error), +} + impl GetGspStaticInfoReply { - /// Returns the name of the GPU as a string, or `None` if the string given by the GSP was - /// invalid. - pub(crate) fn gpu_name(&self) -> Option<&str> { + /// Returns the name of the GPU as a string. + /// + /// Returns an error if the string given by the GSP does not contain a null terminator or + /// contains invalid UTF-8. + pub(crate) fn gpu_name(&self) -> core::result::Result<&str, GpuNameError> { CStr::from_bytes_until_nul(&self.gpu_name) - .ok() - .and_then(|cstr| cstr.to_str().ok()) + .map_err(GpuNameError::NoNullTerminator)? + .to_str() + .map_err(GpuNameError::InvalidUtf8) } } -- 2.52.0
