Re: [PATCH v3 04/16] rust: io: perform conversions using `AsRepr`
From: Alexandre Courbot
Date: Thu Aug 27 2026 - 10:45:22 EST
On Thu Aug 27, 2026 at 11:21 PM JST, Gary Guo wrote:
> 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 <acourbot@xxxxxxxxxx>
>>
>>>
>>> Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
>>> ---
>>> 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.
Yeah, I don't think it's a big deal to have these, but since it is
easier to add in the future than to remove once people start relying on
them, I'd rather add them when a concrete need manifests itself.