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 <[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.

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.

Reply via email to