From: Alistair Popple Date: Fri, 14 Nov 2025 19:55:51 +0000 (-0500) Subject: gpu: nova-core: gsp: Wait for gsp initialization to complete X-Git-Url: https://gentwo.org/gitweb/?a=commitdiff_plain;h=0e7d572b4baa64c582dafc4af36cfc8a4c3c1252;p=linux%2F.git gpu: nova-core: gsp: Wait for gsp initialization to complete This adds the GSP init done command to wait for GSP initialization to complete. Once this command has been received the GSP is fully operational and will respond properly to normal RPC commands. Signed-off-by: Alistair Popple Co-developed-by: Joel Fernandes Signed-off-by: Joel Fernandes Reviewed-by: Lyude Paul [acourbot@nvidia.com: move new definitions to end of commands.rs, rename to `wait_gsp_init_done` and remove timeout argument.] Signed-off-by: Alexandre Courbot Message-ID: <20251114195552.739371-13-joelagnelf@nvidia.com> --- diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/boot.rs index d62bab07e861..0845d0906ca1 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -236,6 +236,9 @@ pub(crate) fn boot( }; GspSequencer::run(&mut self.cmdq, seq_params)?; + // Wait until GSP is fully initialized. + commands::wait_gsp_init_done(&mut self.cmdq)?; + Ok(()) } } diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/gsp/commands.rs index d5be3bf10684..b544603703d3 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -1,17 +1,28 @@ // SPDX-License-Identifier: GPL-2.0 -use core::convert::Infallible; +use core::{ + array, + convert::Infallible, // +}; use kernel::{ device, pci, prelude::*, - transmute::AsBytes, // + time::Delta, + transmute::{ + AsBytes, + FromBytes, // + }, // }; use crate::{ gsp::{ - cmdq::CommandToGsp, + cmdq::{ + Cmdq, + CommandToGsp, + MessageFromGsp, // + }, fw::{ commands::*, MsgFunction, // @@ -127,3 +138,34 @@ fn init_variable_payload( dst.write_all(string_data.as_slice()) } } + +/// Message type for GSP initialization done notification. +struct GspInitDone {} + +// SAFETY: `GspInitDone` is a zero-sized type with no bytes, therefore it +// trivially has no uninitialized bytes. +unsafe impl FromBytes for GspInitDone {} + +impl MessageFromGsp for GspInitDone { + const FUNCTION: MsgFunction = MsgFunction::GspInitDone; + type InitError = Infallible; + type Message = GspInitDone; + + fn read( + _msg: &Self::Message, + _sbuffer: &mut SBufferIter>, + ) -> Result { + Ok(GspInitDone {}) + } +} + +/// Waits for GSP initialization to complete. +pub(crate) fn wait_gsp_init_done(cmdq: &mut Cmdq) -> Result { + loop { + match cmdq.receive_msg::(Delta::from_secs(10)) { + Ok(_) => break Ok(()), + Err(ERANGE) => continue, + Err(e) => break Err(e), + } + } +}