From: Alexandre Courbot <acourbot@nvidia.com>
To: "Danilo Krummrich" <dakr@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Benno Lossin" <lossin@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>
Cc: John Hubbard <jhubbard@nvidia.com>,
Alistair Popple <apopple@nvidia.com>,
Joel Fernandes <joelagnelf@nvidia.com>,
Timur Tabi <ttabi@nvidia.com>, Edwin Peer <epeer@nvidia.com>,
nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org,
Alexandre Courbot <acourbot@nvidia.com>
Subject: [PATCH v7 03/14] gpu: nova-core: num: add functions to safely convert a const value to a smaller type
Date: Wed, 29 Oct 2025 17:16:30 +0900 [thread overview]
Message-ID: <20251029-gsp_boot-v7-3-34227afad347@nvidia.com> (raw)
In-Reply-To: <20251029-gsp_boot-v7-0-34227afad347@nvidia.com>
There are times where we need to store a constant value defined as a
larger type (e.g. through a binding) into a smaller type, knowing
that the value will fit. Rust, unfortunately, only provides us with the
`as` operator for that effect, that we want to eschew.
Extend the `num` module with functions allowing to perform the
conversion infallibly, at compile time.
Example:
const FOO_VALUE: u32 = 1;
// `FOO_VALUE` fits into a `u8`, so the conversion is valid.
let foo = num::u32_to_u8::<{ FOO_VALUE }>();
We are going to use this feature extensively in Nova.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
drivers/gpu/nova-core/num.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/drivers/gpu/nova-core/num.rs b/drivers/gpu/nova-core/num.rs
index b08139ec667c..25fe2e61729e 100644
--- a/drivers/gpu/nova-core/num.rs
+++ b/drivers/gpu/nova-core/num.rs
@@ -161,3 +161,52 @@ fn into_safe_cast(self) -> T {
T::from_safe_cast(self)
}
}
+
+macro_rules! impl_const_into {
+ ($from:ty => { $($into:ty),* }) => {
+ $(
+ paste! {
+ #[doc = ::core::concat!(
+ "Performs a build-time safe conversion of a [`",
+ ::core::stringify!($from),
+ "`] constant value into a [`",
+ ::core::stringify!($into),
+ "`].")]
+ ///
+ /// This checks at compile-time that the conversion is lossless, and triggers a build
+ /// error if it isn't.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use kernel::num;
+ ///
+ /// // Succeeds because the value of the source fits into the destination's type.
+ #[doc = ::core::concat!(
+ "assert_eq!(num::",
+ ::core::stringify!($from),
+ "_into_",
+ ::core::stringify!($into),
+ "(1",
+ ::core::stringify!($from),
+ "), 1",
+ ::core::stringify!($into),
+ ");")]
+ /// ```
+ #[allow(unused)]
+ pub(crate) const fn [<$from _into_ $into>]<const N: $from>() -> $into {
+ if N > $into::MAX as $from {
+ build_error!("Value overflow.");
+ } else {
+ N as $into
+ }
+ }
+ }
+ )*
+ };
+}
+
+impl_const_into!(usize => { u8, u16, u32 });
+impl_const_into!(u64 => { u8, u16, u32 });
+impl_const_into!(u32 => { u8, u16 });
+impl_const_into!(u16 => { u8 });
--
2.51.0
next prev parent reply other threads:[~2025-10-29 8:17 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-29 8:16 [PATCH v7 00/14] gpu: nova-core: Boot GSP to RISC-V active Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 01/14] gpu: nova-core: compute layout of more framebuffer regions required for GSP Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 02/14] gpu: nova-core: Set correct DMA mask Alexandre Courbot
2025-10-29 8:16 ` Alexandre Courbot [this message]
2025-10-29 8:16 ` [PATCH v7 04/14] gpu: nova-core: Create initial Gsp Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 05/14] gpu: nova-core: gsp: Create wpr metadata Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 06/14] gpu: nova-core: Add a slice-buffer (sbuffer) datastructure Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 07/14] gpu: nova-core: Add zeroable trait to bindings Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 08/14] rust: enable slice_flatten feature and abstract it through an extension trait Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 09/14] gpu: nova-core: gsp: Add GSP command queue bindings and handling Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 10/14] gpu: nova-core: gsp: Create rmargs Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 11/14] gpu: nova-core: gsp: Add RM registry and sysinfo bindings and commands Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 12/14] nova-core: falcon: Add support to check if RISC-V is active Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 13/14] nova-core: falcon: Add support to write firmware version Alexandre Courbot
2025-10-29 8:16 ` [PATCH v7 14/14] nova-core: gsp: Boot GSP Alexandre Courbot
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=20251029-gsp_boot-v7-3-34227afad347@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=dri-devel@lists.freedesktop.org \
--cc=epeer@nvidia.com \
--cc=gary@garyguo.net \
--cc=jhubbard@nvidia.com \
--cc=joelagnelf@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.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 \
/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).