[PATCH v3 0/3] rust: introduce cv! macro for safe const conversions of integer-like types
From: Eliot Courtney
Date: Wed Sep 02 2026 - 05:28:41 EST
This series introduces the cv! ("const value") macro for safe compile
time conversions of integer-like types. The syntax is `cv!(literal or
expression)`, or `cv!(literal or expression => type)` when it needs some
help with type inference. The result is that many expressions can be
rewritten into a compile time safe (no `as`) and less visually busy
style, for example:
```
- const DMA_LEN: u32 = casts::usize_into_u32::<{ MEM_BLOCK_ALIGNMENT }>();
+ const DMA_LEN: u32 = cv!(MEM_BLOCK_ALIGNMENT);
- .with_const_msg_type::<{ casts::u8_as_u32(MSG_TYPE_VENDOR_PCI) }>()
+ .with_const_msg_type(cv!(MSG_TYPE_VENDOR_PCI))
- data: [[u8; GSP_PAGE_SIZE]; casts::u32_as_usize(MSGQ_NUM_PAGES)],
+ data: [[u8; GSP_PAGE_SIZE]; cv!(MSGQ_NUM_PAGES)],
-pub const NSEC_PER_SEC: i64 = bindings::NSEC_PER_SEC as i64;
+pub const NSEC_PER_SEC: i64 = cv!(bindings::NSEC_PER_SEC);
-//! let b = Bounded::<u16, 5>::new::<0x18>();
+//! let b: Bounded<u16, 5> = cv!(0x18);
```
This works by defining a trait `FromConst<const V: i128>` with an
associated constant `VALUE`. Then each implementor sets `VALUE` to a
constant expression. This works around not having const traits. An
alternative idea from Gary defined a FromLiteral::from_literal<V>
function [1]. This version essentially moves the implementation of that
function to the const block of the associated constant (since it has to
be executable at compile time anyway).
This is based on ideas from Gary Guo [1], Alice Ryhl [2], and Alexandre
Courbot [3].
One (potential) limitation is that const generic types or values can't
be used with cv!, because it requires the const generic expressions
feature. The const_as! [3] macro did not have this limitation. This is
worked around by special casing conversions to language integral types
in the cv! macro (essentially subsuming const_as!). This special casing
can be removed when const generic expressions can be used.
Some code is taken with permission from Alex's const_as! series.
The structure of this series is as follows:
1. cv! macro
2. updates to nova-core to use cv!
For a follow up series (I've already written this, but to avoid spamming
a ton while we iterate on cv!, I'd send this after):
3. updates to various other code to use cv!
4. misc updates to other code to remove usages of `as`
We have multiple ways of converting - T::from(),
FromSafeCast/IntoSafeCast, cv!, *_as_*. This series uses them in that
order of priority, based on Alex's suggestion [4].
This is based on rust-next.
[1] https://lore.kernel.org/all/DKT6WNPI2OA5.3RCBNYHHAFAD9@xxxxxxxxxxx/
[2] https://lore.kernel.org/all/CAH5fLgiGcOn+HQLj4w9yDc31V54PbqNUQv8cUFRoEuFzQrAAZA@xxxxxxxxxxxxxx/
[3] https://lore.kernel.org/all/20260825-const_as-v1-0-1ce712225fe2@xxxxxxxxxx/
[4] https://lore.kernel.org/all/DKYTZNAX6ON6.1K1372FFAQOF7@xxxxxxxxxx/
Signed-off-by: Eliot Courtney <ecourtney@xxxxxxxxxx>
---
Changes in v3:
- Add comment about not using FromConst trait directly (Gary)
- Lower case on const assert/panics (Gary)
- match instead of unwrap() for NonZero + message (Gary)
- Add reviewed-by tags (thanks Gary!)
- Link to v2: https://patch.msgid.link/20260901-cv-v2-0-446bc69d2ade@xxxxxxxxxx
Changes in v2:
- Improve error messages (Gary)
- Remove pre-req for Alex's nova-core num->kernel series.
- Link to v1: https://patch.msgid.link/20260828-cv-v1-0-48a180dfc4c8@xxxxxxxxxx
---
Eliot Courtney (3):
rust: num: add cv! macro to create values from constant expressions
rust: prelude: add `num::cv`
gpu: nova-core: use cv! for constant casts
drivers/gpu/nova-core/falcon.rs | 9 +-
drivers/gpu/nova-core/fb/hal/gb100.rs | 4 +-
drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 7 +-
drivers/gpu/nova-core/fsp.rs | 3 +-
drivers/gpu/nova-core/gsp/cmdq.rs | 6 +-
drivers/gpu/nova-core/gsp/fw.rs | 38 +++---
drivers/gpu/nova-core/gsp/fw/commands.rs | 2 +-
drivers/gpu/nova-core/num.rs | 55 +--------
rust/kernel/num.rs | 137 +++++++++++++++++++++
rust/kernel/num/bounded.rs | 19 +++
rust/kernel/prelude.rs | 1 +
rust/kernel/ptr.rs | 14 +++
12 files changed, 199 insertions(+), 96 deletions(-)
---
base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
change-id: 20260828-cv-8d4e952fc14c
Best regards,
--
Eliot Courtney <ecourtney@xxxxxxxxxx>