gpu: nova-core: add Chipset::name() method
There are a few cases where we need the lowercase name of a given chipset, notably to resolve firmware files paths for dynamic loading or to build the module information. So far, we relied on a static `NAMES` array for the latter, and some CString hackery for the former. Replace both with a new `name` const method that returns the lowercase name of a chipset instance. We can generate it using the `paste!` macro. Using this method removes the need to create a `CString` when loading firmware, and lets us remove a couple of utility functions that now have no user. Acked-by: Danilo Krummrich <dakr@kernel.org> Link: https://lore.kernel.org/r/20250913-nova_firmware-v6-3-9007079548b0@nvidia.com Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
@@ -30,9 +30,7 @@ pub(crate) struct Firmware {
|
||||
|
||||
impl Firmware {
|
||||
pub(crate) fn new(dev: &device::Device, chipset: Chipset, ver: &str) -> Result<Firmware> {
|
||||
let mut chip_name = CString::try_from_fmt(fmt!("{chipset}"))?;
|
||||
chip_name.make_ascii_lowercase();
|
||||
let chip_name = &*chip_name;
|
||||
let chip_name = chipset.name();
|
||||
|
||||
let request = |name_| {
|
||||
CString::try_from_fmt(fmt!("nvidia/{chip_name}/gsp/{name_}-{ver}.bin"))
|
||||
@@ -180,8 +178,8 @@ impl<const N: usize> ModInfoBuilder<N> {
|
||||
let mut this = Self(firmware::ModInfoBuilder::new(module_name));
|
||||
let mut i = 0;
|
||||
|
||||
while i < gpu::Chipset::NAMES.len() {
|
||||
this = this.make_entry_chipset(gpu::Chipset::NAMES[i]);
|
||||
while i < gpu::Chipset::ALL.len() {
|
||||
this = this.make_entry_chipset(gpu::Chipset::ALL[i].name());
|
||||
i += 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ use crate::firmware::{Firmware, FIRMWARE_VERSION};
|
||||
use crate::gfw;
|
||||
use crate::gsp::Gsp;
|
||||
use crate::regs;
|
||||
use crate::util;
|
||||
use core::fmt;
|
||||
|
||||
macro_rules! define_chipset {
|
||||
@@ -26,13 +25,23 @@ macro_rules! define_chipset {
|
||||
$( Chipset::$variant, )*
|
||||
];
|
||||
|
||||
pub(crate) const NAMES: [&'static str; Self::ALL.len()] = [
|
||||
$( util::const_bytes_to_str(
|
||||
util::to_lowercase_bytes::<{ stringify!($variant).len() }>(
|
||||
stringify!($variant)
|
||||
).as_slice()
|
||||
), )*
|
||||
];
|
||||
::kernel::macros::paste!(
|
||||
/// Returns the name of this chipset, in lowercase.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let chipset = Chipset::GA102;
|
||||
/// assert_eq!(chipset.name(), "ga102");
|
||||
/// ```
|
||||
pub(crate) const fn name(&self) -> &'static str {
|
||||
match *self {
|
||||
$(
|
||||
Chipset::$variant => stringify!([<$variant:lower>]),
|
||||
)*
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// TODO[FPRI]: replace with something like derive(FromPrimitive)
|
||||
|
||||
@@ -3,26 +3,6 @@
|
||||
use kernel::prelude::*;
|
||||
use kernel::time::{Delta, Instant, Monotonic};
|
||||
|
||||
pub(crate) const fn to_lowercase_bytes<const N: usize>(s: &str) -> [u8; N] {
|
||||
let src = s.as_bytes();
|
||||
let mut dst = [0; N];
|
||||
let mut i = 0;
|
||||
|
||||
while i < src.len() && i < N {
|
||||
dst[i] = (src[i] as char).to_ascii_lowercase() as u8;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
dst
|
||||
}
|
||||
|
||||
pub(crate) const fn const_bytes_to_str(bytes: &[u8]) -> &str {
|
||||
match core::str::from_utf8(bytes) {
|
||||
Ok(string) => string,
|
||||
Err(_) => kernel::build_error!("Bytes are not valid UTF-8."),
|
||||
}
|
||||
}
|
||||
|
||||
/// Wait until `cond` is true or `timeout` elapsed.
|
||||
///
|
||||
/// When `cond` evaluates to `Some`, its return value is returned.
|
||||
|
||||
Reference in New Issue
Block a user