On Thu Aug 27, 2026 at 7:53 AM BST, Alexandre Courbot wrote:
> On Wed Aug 19, 2026 at 8:09 PM JST, Gary Guo wrote:
>> For types that are layout-compatible with an I/O capable type, we would
>> want the ability to use them directly for I/O operations. E.g.
>>
>>     bitfield! {
>>         pub struct Foo(u32) {
>>             ...
>>         }
>>     }
>>
>>     #[repr(C)]
>>     struct Bar {
>>         foo: Foo,
>>     }
>>
>>     let mmio: Mmio<'_, Bar> = ...;
>>     io_read!(mmio, .foo)
>>
>> Currently this feature is available from `register!()` macro but not
>> otherwise available with `io_read!`, `io_write!`. Support this by
>> performing conversions to I/O primitives via the `AsRepr`/`AsReprMut`
>> trait.
>>
>> This makes the `IoLoc::IoType` and `Register::Storage` redundant; thus
>> remove them; also convert register methods to use the `read_val` and
>> `write_val` instead.
>
> Nice, the redundancy was bothering me a bit so this is clearly a better
> design.
>
> Reviewed-by: Alexandre Courbot <[email protected]>
>
>>
>> Signed-off-by: Gary Guo <[email protected]>
>> ---
>>  rust/kernel/bitfield.rs    |  10 ++++
>>  rust/kernel/io.rs          | 135 
>> +++++++++++++++++++++++++--------------------
>>  rust/kernel/io/register.rs |  15 -----
>>  rust/macros/io/register.rs |   2 -
>>  4 files changed, 86 insertions(+), 76 deletions(-)
>>
>> diff --git a/rust/kernel/bitfield.rs b/rust/kernel/bitfield.rs
>> index a0d089423f21..619c5e2189d1 100644
>> --- a/rust/kernel/bitfield.rs
>> +++ b/rust/kernel/bitfield.rs
>> @@ -308,6 +308,7 @@ macro_rules! bitfield {
>>          $(#[$attr])*
>>          #[repr(transparent)]
>>          #[derive(Clone, Copy, PartialEq, Eq)]
>> +        #[derive($crate::prelude::FromBytes, $crate::prelude::IntoBytes)]
>
> Do we need `FromBytes`/`IntoBytes` for every single bitfield type? I
> mean that probably doesn't hurt, but if we need them for registers then
> we can derive them from the register macro.

These are not needed now (as `AsRepr` provides sufficient guarantee so
read_val/write_val use unsafe with them instead); but I kept them as I think
it's useful derive regardless. I suppose these are not needed for `register!` so
direct user of `bitfield` can derive them manually instead.

Best,
Gary

Reply via email to