[PATCH 0/3] rust: introduce cv! macro for safe const conversions of integer-like types

From: Eliot Courtney

Date: Fri Aug 28 2026 - 05:20:46 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 Alex's series moving the safe casting code to
kernel::num as a prerequisite [5].

[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/
[5] https://lore.kernel.org/all/20260828-nova_num-v1-0-e21f17ba4127@xxxxxxxxxx/

Signed-off-by: Eliot Courtney <ecourtney@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 | 7 +-
drivers/gpu/nova-core/fb/hal/gb100.rs | 8 +-
drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 7 +-
drivers/gpu/nova-core/fsp.rs | 7 +-
drivers/gpu/nova-core/gsp/cmdq.rs | 11 +-
drivers/gpu/nova-core/gsp/fw.rs | 39 +++---
drivers/gpu/nova-core/gsp/fw/commands.rs | 2 +-
rust/kernel/num.rs | 131 +++++++++++++++++++++
rust/kernel/num/bounded.rs | 20 +++-
rust/kernel/prelude.rs | 1 +
rust/kernel/ptr.rs | 12 ++
11 files changed, 191 insertions(+), 54 deletions(-)
---
base-commit: 1b78070aaef63512688aebfbc82365ef9d6660f1
change-id: 20260828-cv-8d4e952fc14c
prerequisite-change-id: 20260828-nova_num-64e1b2e84f77:1
prerequisite-patch-id: bdc5c281f930f98d9a94ffc093388100d4871969
prerequisite-patch-id: 2be8b479662642016bb697332ea61d58ca54cc08

Best regards,
--
Eliot Courtney <ecourtney@xxxxxxxxxx>