Commit 0e7d572b authored by Alistair Popple's avatar Alistair Popple Committed by Alexandre Courbot
Browse files

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: default avatarAlistair Popple <apopple@nvidia.com>
Co-developed-by: default avatarJoel Fernandes <joelagnelf@nvidia.com>
Signed-off-by: default avatarJoel Fernandes <joelagnelf@nvidia.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
[acourbot@nvidia.com: move new definitions to end of commands.rs, rename
to `wait_gsp_init_done` and remove timeout argument.]
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Message-ID: <20251114195552.739371-13-joelagnelf@nvidia.com>
parent 77410985
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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(())
    }
}
+45 −3
Original line number Diff line number Diff line
// 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<array::IntoIter<&[u8], 2>>,
    ) -> Result<Self, Self::InitError> {
        Ok(GspInitDone {})
    }
}

/// Waits for GSP initialization to complete.
pub(crate) fn wait_gsp_init_done(cmdq: &mut Cmdq) -> Result {
    loop {
        match cmdq.receive_msg::<GspInitDone>(Delta::from_secs(10)) {
            Ok(_) => break Ok(()),
            Err(ERANGE) => continue,
            Err(e) => break Err(e),
        }
    }
}