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