Hi Fiona, > On 13 Jan 2025, at 09:16, Fiona Behrens <me@xxxxxxxxxx> wrote: > > This patch introduces abstractions for working with I/O port resources, > including the `Resource` and `Region` types. These abstractions facilitate > interaction with `ioport_resource`, enabling safe management of resource > reservations and memory accesses. > > Additionally, helper functions such as `outb`, `outw`, and `outl` have been > provided to write values to these resources, with matching read functions > such as `inb`, `inw`, and `inl` for accessing the port memory. > > Signed-off-by: Fiona Behrens <me@xxxxxxxxxx> > --- > rust/helpers/helpers.c | 1 + > rust/helpers/ioport.c | 42 ++++++++++ > rust/kernel/ioport.rs | 169 +++++++++++++++++++++++++++++++++++++++++ > rust/kernel/lib.rs | 2 + > 4 files changed, 214 insertions(+) > create mode 100644 rust/helpers/ioport.c > create mode 100644 rust/kernel/ioport.rs > > diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c > index dcf827a61b52..b40aee82fa0f 100644 > --- a/rust/helpers/helpers.c > +++ b/rust/helpers/helpers.c > @@ -14,6 +14,7 @@ > #include "cred.c" > #include "err.c" > #include "fs.c" > +#include "ioport.c" > #include "jump_label.c" > #include "kunit.c" > #include "mutex.c" > diff --git a/rust/helpers/ioport.c b/rust/helpers/ioport.c > new file mode 100644 > index 000000000000..d9c9e2093b98 > --- /dev/null > +++ b/rust/helpers/ioport.c > @@ -0,0 +1,42 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <linux/ioport.h> > +#include <linux/io.h> > + > +struct resource *rust_helper_request_region(resource_size_t start, > + resource_size_t n, const char *name) > +{ > + return request_region(start, n, name); > +} > + > +struct resource *rust_helper_request_muxed_region(resource_size_t start, > + resource_size_t n, > + const char *name) > +{ > + return request_muxed_region(start, n, name); > +} > + > +void rust_helper_release_region(resource_size_t start, resource_size_t n) > +{ > + release_region(start, n); > +} > + > +#define define_rust_helper_out(name, type) \ > + void rust_helper_##name(type value, unsigned long addr) \ > + { \ > + (name)(value, addr); \ > + } > + > +define_rust_helper_out(outb, u8); > +define_rust_helper_out(outw, u16); > +define_rust_helper_out(outl, u32); > + > +#define define_rust_helper_in(name, type) \ > + type rust_helper_##name(unsigned long addr) \ > + { \ > + return (name)(addr); \ > + } > + > +define_rust_helper_in(inb, u8); > +define_rust_helper_in(inw, u16); > +define_rust_helper_in(inl, u32); > diff --git a/rust/kernel/ioport.rs b/rust/kernel/ioport.rs > new file mode 100644 > index 000000000000..9bc342cb4663 > --- /dev/null > +++ b/rust/kernel/ioport.rs > @@ -0,0 +1,169 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! Abstractions of routines for detecting, reserving and > +//! allocating system resources. > +//! > +//! C header: [`include/linux/ioport.h`](srctree/include/linux/ioport.h) > + > +use core::ops::Deref; > +use core::ptr; > + > +use crate::prelude::*; > +use crate::types::Opaque; > + > +/// Resource Size type. > +/// This is a type alias to `u64` > +/// depending on the config option `CONFIG_PHYS_ADDR_T_64BIT`. > +#[cfg(CONFIG_PHYS_ADDR_T_64BIT)] > +pub type ResourceSize = u64; > + > +/// Resource Size type. > +/// This is a type alias to `u32` > +/// depending on the config option `CONFIG_PHYS_ADDR_T_64BIT`. > +#[cfg(not(CONFIG_PHYS_ADDR_T_64BIT))] > +pub type ResourceSize = u32; > + > +/// Resource node. > +#[repr(transparent)] > +pub struct Resource(Opaque<bindings::resource>); This is a conflict with [0] [0]: https://lore.kernel.org/rust-for-linux/20250109133057.243751-1-daniel.almeida@xxxxxxxxxxxxx/ — Daniel