On Fri Jan 16, 2026 at 9:26 PM JST, Daniel Almeida wrote:
> +cc Alex,
>
>
>>>> +    31:0    l2_pwractive_hi as u32, "Bitmap of L2 caches active (higher 
>>>> 32 bits)";
>>>> +});
>>>> +
>>>>  pub(crate) const MCU_CONTROL_ENABLE: u32 = 1;
>>>>  pub(crate) const MCU_CONTROL_AUTO: u32 = 2;
>>>>  pub(crate) const MCU_CONTROL_DISABLE: u32 = 0;
>>>>  -pub(crate) const MCU_STATUS: Register<0x704> = Register;
>>>> +register!(McuControl @ 0x700, "Controls the execution state of the MCU 
>>>> subsystem" {
>>>> +    1:0     req as u32, "Request state change";
>>>> +});
>>> Any reason why req is a u32 and not a u8? Same for some other places.
>>> And would it be an option to move the const MCU_CONTROL* to an ìmpl
>>> McuControl Same for STATUS below.
>> 
>> Just fyi something like [1] builds for me.
>> 
>> This is inspired by
>> 
>> https://lore.kernel.org/rust-for-linux/[email protected]/
>> 
>> Best regards
>> 
>> Dirk
>> 
>> [1]
>> 
>> #[repr(u32)]
>> #[derive(Debug, Default, Clone, Copy, PartialEq)]
>> enum McuControl {
>>    #[default]
>>    Disable = 0,
>>    Enable = 1,
>>    Auto = 2,
>> }
>> 
>> impl From<McuControl> for u8 {
>>    fn from(ctrl: McuControl) -> Self {
>>        ctrl as u8
>>    }
>> }
>> 
>> impl From<u8> for McuControl {
>>    fn from(req: u8) -> Self {
>>        match req & 0x3 {
>>            0 => McuControl::Disable,
>>            1 => McuControl::Enable,
>>            2 => McuControl::Auto,
>>            _ => McuControl::Disable,
>>        }
>>    }
>> }
>> 
>> register!(MCUCONTROL @ 0x700, "Controls the execution state of the MCU 
>> subsystem" {
>>    1:0     req as u8 => McuControl, "Request state change";
>> });
>
> Alex, looking at the above, I wonder if a “as Foo” would be a good
> addition to the macro? That would then invoke a TryFrom implementation, i.e.:
>
>
> register!(MCUCONTROL @ 0x700, "Controls the execution state of the MCU 
> subsystem" {
>    1:0     req as McuControl => McuControl, "Request state change";
> });

So the register macro that I will submit for the kernel crate will be
significantly different from the one in Nova. Expect something closer to
[1].

This means that fields won't need to have an explicit integer type
anymore (they will automatically use the corresponding `BoundedInt`
instead).

IIUC this will them behave as you expect.

[1] 
https://lore.kernel.org/rust-for-linux/[email protected]/

Reply via email to