rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Joel Fernandes" <joelagnelf@nvidia.com>,
	<linux-kernel@vger.kernel.org>, <rust-for-linux@vger.kernel.org>,
	<dri-devel@lists.freedesktop.org>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Alexandre Courbot" <acourbot@nvidia.com>
Cc: "Alistair Popple" <apopple@nvidia.com>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>, <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"John Hubbard" <jhubbard@nvidia.com>,
	"Timur Tabi" <ttabi@nvidia.com>, <joel@joelfernandes.org>,
	"Daniel Almeida" <daniel.almeida@collabora.com>,
	<nouveau@lists.freedesktop.org>,
	"Nouveau" <nouveau-bounces@lists.freedesktop.org>
Subject: Re: [PATCH v5 13/13] gpu: nova-core: gsp: Retrieve GSP static info to gather GPU information
Date: Sat, 15 Nov 2025 21:38:17 +0900	[thread overview]
Message-ID: <DE99VWCDFB64.1CXOJAOU0JC93@nvidia.com> (raw)
In-Reply-To: <20251114195552.739371-14-joelagnelf@nvidia.com>

This one needed some rework.

On Sat Nov 15, 2025 at 4:55 AM JST, Joel Fernandes wrote:
> From: Alistair Popple <apopple@nvidia.com>
>
> After GSP initialization is complete, retrieve the static configuration
> information from GSP-RM. This information includes GPU name, capabilities,
> memory configuration, and other properties. On some GPU variants, it is
> also required to do this for initialization to complete.
>
> Signed-off-by: Alistair Popple <apopple@nvidia.com>
> Co-developed-by: Joel Fernandes <joelagnelf@nvidia.com>
> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>
> ---
>  drivers/gpu/nova-core/gsp/boot.rs             |   7 +
>  drivers/gpu/nova-core/gsp/commands.rs         |  65 +++++++
>  drivers/gpu/nova-core/gsp/fw.rs               |   5 +
>  .../gpu/nova-core/gsp/fw/r570_144/bindings.rs | 163 ++++++++++++++++++
>  drivers/gpu/nova-core/nova_core.rs            |   1 +
>  drivers/gpu/nova-core/util.rs                 |  16 ++
>  6 files changed, 257 insertions(+)
>  create mode 100644 drivers/gpu/nova-core/util.rs
>
> diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/boot.rs
> index c0afafbf35f6..42a3abb9243d 100644
> --- a/drivers/gpu/nova-core/gsp/boot.rs
> +++ b/drivers/gpu/nova-core/gsp/boot.rs
> @@ -40,6 +40,7 @@
>          GspFwWprMeta, //
>      },
>      regs,
> +    util, //
>      vbios::Vbios,
>  };
>  
> @@ -237,6 +238,12 @@ pub(crate) fn boot(
>          GspSequencer::run(&mut self.cmdq, seq_params, Delta::from_secs(10))?;
>  
>          commands::gsp_init_done(&mut self.cmdq, Delta::from_secs(10))?;
> +        let info = commands::get_gsp_info(&mut self.cmdq, bar)?;
> +        dev_info!(
> +            pdev.as_ref(),
> +            "GPU name: {}\n",
> +            util::str_from_null_terminated(&info.gpu_name)
> +        );
>  
>          Ok(())
>      }
> diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/gsp/commands.rs
> index 07abfb54f9d7..6cb32e7d3436 100644
> --- a/drivers/gpu/nova-core/gsp/commands.rs
> +++ b/drivers/gpu/nova-core/gsp/commands.rs
> @@ -17,6 +17,7 @@
>  };
>  
>  use crate::{
> +    driver::Bar0,
>      gsp::{
>          cmdq::{
>              Cmdq,
> @@ -25,12 +26,25 @@
>          },
>          fw::{
>              commands::*,
> +            GspStaticConfigInfo_t,
>              MsgFunction, //
>          },
>      },
>      sbuffer::SBufferIter,
> +    util,
>  };
>  
> +// SAFETY: Padding is explicit and will not contain uninitialized data.
> +unsafe impl AsBytes for GspStaticConfigInfo_t {}
> +
> +// SAFETY: This struct only contains integer types for which all bit patterns
> +// are valid.
> +unsafe impl FromBytes for GspStaticConfigInfo_t {}
> +
> +pub(crate) struct GspStaticConfigInfo {
> +    pub gpu_name: [u8; 40],

This is probably meant to be `0x40`, as the `gpuNameString` bindings
member this is built from is 64-bytes long. Changing it to be 64-bytes
long.

> +}
> +
>  /// Message type for GSP initialization done notification.
>  struct GspInitDone {}
>  
> @@ -62,6 +76,57 @@ pub(crate) fn gsp_init_done(cmdq: &mut Cmdq, timeout: Delta) -> Result {
>      }
>  }
>  
> +impl MessageFromGsp for GspStaticConfigInfo {
> +    const FUNCTION: MsgFunction = MsgFunction::GetGspStaticInfo;
> +    type InitError = Infallible;
> +    type Message = GspStaticConfigInfo_t;
> +
> +    fn read(
> +        msg: &Self::Message,
> +        _sbuffer: &mut SBufferIter<array::IntoIter<&[u8], 2>>,
> +    ) -> Result<Self, Self::InitError> {
> +        let gpu_name_str = util::str_from_null_terminated(&msg.gpuNameString);
> +
> +        let mut gpu_name = [0u8; 40];
> +        let bytes = gpu_name_str.as_bytes();
> +        let copy_len = core::cmp::min(bytes.len(), gpu_name.len());
> +        gpu_name[..copy_len].copy_from_slice(&bytes[..copy_len]);
> +        gpu_name[copy_len] = b'\0';

We will want to move this into an `impl` block of `fw::commands`, since
`gpuNameString` is supposed to be firmware-specific and thus private.

But actually, do we even need this? When we print the GPU name in
`boot.rs`, we call `util::str_from_null_terminated` again on the bytes
array that we copied from here, but it is guaranteed to succeed if this
call succeeded as well. So I think (and successfully tested that) we can
just expose the raw bytes array as-is here, and extract the name from a
dedicated method.

> +
> +        Ok(GspStaticConfigInfo { gpu_name })
> +    }
> +}
> +
> +// SAFETY: This struct only contains integer types and fixed-size arrays for which
> +// all bit patterns are valid.
> +unsafe impl Zeroable for GspStaticConfigInfo_t {}
> +
> +struct GetGspInfo;
> +
> +impl CommandToGsp for GetGspInfo {
> +    const FUNCTION: MsgFunction = MsgFunction::GetGspStaticInfo;
> +    type Command = GspStaticConfigInfo_t;
> +    type InitError = Infallible;
> +
> +    fn init(&self) -> impl Init<Self::Command, Self::InitError> {
> +        init!(GspStaticConfigInfo_t {
> +            ..Zeroable::init_zeroed()
> +        })
> +    }
> +}
> +
> +pub(crate) fn get_gsp_info(cmdq: &mut Cmdq, bar: &Bar0) -> Result<GspStaticConfigInfo> {
> +    cmdq.send_command(bar, GetGspInfo)?;
> +
> +    loop {
> +        match cmdq.receive_msg::<GspStaticConfigInfo>(Delta::from_secs(5)) {
> +            Ok(info) => return Ok(info),
> +            Err(ERANGE) => continue,
> +            Err(e) => return Err(e),
> +        }
> +    }
> +}
> +
>  /// The `GspSetSystemInfo` command.
>  pub(crate) struct SetSystemInfo<'a> {
>      pdev: &'a pci::Device<device::Bound>,
> diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw.rs
> index 0cce54310c35..5b6a906ff5dc 100644
> --- a/drivers/gpu/nova-core/gsp/fw.rs
> +++ b/drivers/gpu/nova-core/gsp/fw.rs
> @@ -882,6 +882,11 @@ pub(crate) fn element_count(&self) -> u32 {
>      }
>  }
>  
> +pub(crate) use r570_144::{
> +    // GSP static configuration information.
> +    GspStaticConfigInfo_t, //
> +};

I've replaced this with a dedicated wrapping type and supporting code in
`fw::commands`, as is done for the other commands.

<snip>
> diff --git a/drivers/gpu/nova-core/util.rs b/drivers/gpu/nova-core/util.rs
> new file mode 100644
> index 000000000000..f1a4dea44c10
> --- /dev/null
> +++ b/drivers/gpu/nova-core/util.rs
> @@ -0,0 +1,16 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +/// Converts a null-terminated byte array to a string slice.
> +///
> +/// Returns "invalid" if the bytes are not valid UTF-8 or not null-terminated.
> +pub(crate) fn str_from_null_terminated(bytes: &[u8]) -> &str {
> +    use kernel::str::CStr;
> +
> +    // Find the first null byte, then create a slice that includes it.
> +    bytes
> +        .iter()
> +        .position(|&b| b == 0)
> +        .and_then(|null_pos| CStr::from_bytes_with_nul(&bytes[..=null_pos]).ok())
> +        .and_then(|cstr| cstr.to_str().ok())
> +        .unwrap_or("invalid")
> +}

Let's not decide what the behavior on an invalid string is for the
caller, and let's make these cases detectable by returning an `Option`.
The caller can then `unwrap_or` it as it wants.

I'll apply these changes locally before pushing, as they are mostly
about harmonizing with the design of other existing commands and don't
change the behavior in any way.

  parent reply	other threads:[~2025-11-15 12:38 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-14 19:55 [PATCH v5 00/13] nova-core: Complete GSP boot and begin RPC communication Joel Fernandes
2025-11-14 19:55 ` [PATCH v5 01/13] gpu: nova-core: falcon: Move waiting until halted to a helper Joel Fernandes
2025-11-14 19:55 ` [PATCH v5 02/13] gpu: nova-core: falcon: Move start functionality into separate helper Joel Fernandes
2025-11-14 19:55 ` [PATCH v5 03/13] gpu: nova-core: falcon: Move mbox functionalities into helper Joel Fernandes
2025-11-15 11:27   ` Alexandre Courbot
2025-11-14 19:55 ` [PATCH v5 04/13] gpu: nova-core: falcon: Move dma_reset functionality " Joel Fernandes
2025-11-14 19:55 ` [PATCH v5 05/13] gpu: nova-core: gsp: Add support for checking if GSP reloaded Joel Fernandes
2025-11-14 19:55 ` [PATCH v5 06/13] gpu: nova-core: Add bindings required by GSP sequencer Joel Fernandes
2025-11-14 19:55 ` [PATCH v5 07/13] gpu: nova-core: Implement the " Joel Fernandes
2025-11-14 21:41   ` Lyude Paul
2025-11-14 22:04     ` Lyude Paul
2025-11-14 19:55 ` [PATCH v5 08/13] gpu: nova-core: sequencer: Add register opcodes Joel Fernandes
2025-11-14 21:55   ` Lyude Paul
2025-11-15 12:37     ` Alexandre Courbot
2025-11-14 19:55 ` [PATCH v5 09/13] gpu: nova-core: sequencer: Add delay opcode support Joel Fernandes
2025-11-14 21:56   ` Lyude Paul
2025-11-14 19:55 ` [PATCH v5 10/13] gpu: nova-core: sequencer: Implement basic core operations Joel Fernandes
2025-11-14 21:56   ` Lyude Paul
2025-11-14 19:55 ` [PATCH v5 11/13] gpu: nova-core: sequencer: Implement core resume operation Joel Fernandes
2025-11-14 21:58   ` Lyude Paul
2025-11-14 19:55 ` [PATCH v5 12/13] gpu: nova-core: gsp: Wait for gsp initialization to complete Joel Fernandes
2025-11-14 21:59   ` Lyude Paul
2025-11-14 19:55 ` [PATCH v5 13/13] gpu: nova-core: gsp: Retrieve GSP static info to gather GPU information Joel Fernandes
2025-11-14 22:06   ` Lyude Paul
2025-11-15 12:38   ` Alexandre Courbot [this message]
2025-11-15 21:03     ` John Hubbard
2025-11-15 13:31 ` [PATCH v5 00/13] nova-core: Complete GSP boot and begin RPC communication Alexandre Courbot
2025-11-16  2:32   ` John Hubbard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DE99VWCDFB64.1CXOJAOU0JC93@nvidia.com \
    --to=acourbot@nvidia.com \
    --cc=a.hindborg@kernel.org \
    --cc=airlied@gmail.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=apopple@nvidia.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gary@garyguo.net \
    --cc=jhubbard@nvidia.com \
    --cc=joel@joelfernandes.org \
    --cc=joelagnelf@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=nouveau-bounces@lists.freedesktop.org \
    --cc=nouveau@lists.freedesktop.org \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tmgross@umich.edu \
    --cc=ttabi@nvidia.com \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).