Re: [PATCH v3 04/16] rust: io: perform conversions using `AsRepr`

"Gary Guo" <[email protected]>
Newsgroups dev.linux.lists.nova-gpu,dev.linux.lists.driver-core,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.