Alexandre Courbot
2025-Sep-29 06:16 UTC
[PATCH v4 1/6] nova-core: bitfield: Move bitfield-specific code from register! into new macro
On Sun Sep 21, 2025 at 3:22 AM JST, Joel Fernandes wrote:> The bitfield-specific into new macro. This will be used to define > structs with bitfields, similar to C language. > > Reviewed-by: Elle Rhumsaa <elle at weathered-steel.dev> > Signed-off-by: Joel Fernandes <joelagnelf at nvidia.com>Very clean. One nit remains below, in any case: Reviewed-by: Alexandre Courbot <acourbot at nvidia.com>> --- > drivers/gpu/nova-core/bitfield.rs | 314 +++++++++++++++++++++++++++ > drivers/gpu/nova-core/nova_core.rs | 3 + > drivers/gpu/nova-core/regs/macros.rs | 259 +--------------------- > 3 files changed, 327 insertions(+), 249 deletions(-) > create mode 100644 drivers/gpu/nova-core/bitfield.rs > > diff --git a/drivers/gpu/nova-core/bitfield.rs b/drivers/gpu/nova-core/bitfield.rs > new file mode 100644 > index 000000000000..ba6b7caa05d9 > --- /dev/null > +++ b/drivers/gpu/nova-core/bitfield.rs > @@ -0,0 +1,314 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! Bitfield library for Rust structures > +//! > +//! Support for defining bitfields in Rust structures. Also used by the [`register!`] macro. > +//! > +//! # Syntax > +//! > +//! ```rust > +//! #[derive(Debug, Clone, Copy)] > +//! enum Mode { > +//! Low = 0, > +//! High = 1, > +//! Auto = 2, > +//! } > +//! > +//! impl TryFrom<u8> for Mode { > +//! type Error = u8; > +//! fn try_from(value: u8) -> Result<Self, Self::Error> { > +//! match value { > +//! 0 => Ok(Mode::Low), > +//! 1 => Ok(Mode::High), > +//! 2 => Ok(Mode::Auto), > +//! _ => Err(value), > +//! } > +//! } > +//! } > +//! > +//! impl From<Mode> for u32 { > +//! fn from(mode: Mode) -> u32 { > +//! mode as u32 > +//! } > +//! }Jesung's `TryFrom` and `Into` derive macros [1] would be greatly useful here, I hope we can merge them soon. [1] https://lore.kernel.org/all/cover.1755235180.git.y.j3ms.n at gmail.com/> +//! > +//! #[derive(Debug, Clone, Copy)] > +//! enum State { > +//! Inactive = 0, > +//! Active = 1, > +//! } > +//! > +//! impl From<bool> for State { > +//! fn from(value: bool) -> Self { > +//! if value { State::Active } else { State::Inactive } > +//! } > +//! } > +//! > +//! impl From<State> for u32 { > +//! fn from(state: State) -> u32 { > +//! state as u32 > +//! } > +//! } > +//! > +//! bitfield! { > +//! struct ControlReg { > +//! 3:0 mode as u8 ?=> Mode; > +//! 7 state as bool => State; > +//! } > +//! } > +//! ``` > +//! > +//! This generates a struct with: > +//! - Field accessors: `mode()`, `state()`, etc. > +//! - Field setters: `set_mode()`, `set_state()`, etc. (supports chaining with builder pattern). > +//! - Debug and Default implementations > +//! > +//! The field setters can be used with the builder pattern, example: > +//! ControlReg::default().set_mode(mode).set_state(state);Missing code block for the example?