All of lore.kernel.org
 help / color / mirror / Atom feed
From: Danilo Krummrich <dakr@kernel.org>
To: Asahi Lina <lina@asahilina.net>
Cc: gregkh@linuxfoundation.org, rafael@kernel.org,
	bhelgaas@google.com, ojeda@kernel.org, alex.gaynor@gmail.com,
	boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com,
	benno.lossin@proton.me, tmgross@umich.edu,
	a.hindborg@samsung.com, aliceryhl@google.com, airlied@gmail.com,
	fujita.tomonori@gmail.com, pstanner@redhat.com,
	ajanulgu@redhat.com, lyude@redhat.com, robh@kernel.org,
	daniel.almeida@collabora.com, saravanak@google.com,
	dirk.behme@de.bosch.com, j@jannau.net, fabien.parent@linaro.org,
	chrisi.schrefl@gmail.com, paulmck@kernel.org,
	rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-pci@vger.kernel.org, devicetree@vger.kernel.org,
	rcu@vger.kernel.org
Subject: Re: [PATCH v6 07/16] rust: add `io::{Io, IoRaw}` base types
Date: Sun, 2 Feb 2025 23:20:07 +0100	[thread overview]
Message-ID: <Z5_vlx1BZuJGOvK7@pollux> (raw)
In-Reply-To: <e8da15f0-5b97-4569-842c-891cdf886978@asahilina.net>

Hi Lina,

On Mon, Feb 03, 2025 at 06:19:57AM +0900, Asahi Lina wrote:

> 
> 
> On 12/17/24 1:20 AM, Danilo Krummrich wrote:
> > On Thu, Dec 12, 2024 at 05:33:38PM +0100, Danilo Krummrich wrote:
> >> +/// IO-mapped memory, starting at the base address @addr and spanning @maxlen bytes.
> >> +///
> >> +/// The creator (usually a subsystem / bus such as PCI) is responsible for creating the
> >> +/// mapping, performing an additional region request etc.
> >> +///
> >> +/// # Invariant
> >> +///
> >> +/// `addr` is the start and `maxsize` the length of valid I/O mapped memory region of size
> >> +/// `maxsize`.
> >> +///
> >> +/// # Examples
> >> +///
> >> +/// ```no_run
> >> +/// # use kernel::{bindings, io::{Io, IoRaw}};
> >> +/// # use core::ops::Deref;
> >> +///
> >> +/// // See also [`pci::Bar`] for a real example.
> >> +/// struct IoMem<const SIZE: usize>(IoRaw<SIZE>);
> >> +///
> >> +/// impl<const SIZE: usize> IoMem<SIZE> {
> >> +///     /// # Safety
> >> +///     ///
> >> +///     /// [`paddr`, `paddr` + `SIZE`) must be a valid MMIO region that is mappable into the CPUs
> >> +///     /// virtual address space.
> >> +///     unsafe fn new(paddr: usize) -> Result<Self>{
> >> +///         // SAFETY: By the safety requirements of this function [`paddr`, `paddr` + `SIZE`) is
> >> +///         // valid for `ioremap`.
> >> +///         let addr = unsafe { bindings::ioremap(paddr as _, SIZE.try_into().unwrap()) };
> 
> This is a problematic API. ioremap() does not work on some platforms
> like Apple Silicon. Instead, you have to use ioremap_np() for most devices.
> 
> Please add a bindings::resource abstraction and use that to construct
> IoMem. Then, you can check the flags for
> bindings::IORESOURCE_MEM_NONPOSTED and use the appropriate function,
> like this:

This is just a very simplified example of how to use `IoRaw` and `Io` base
types in the scope of an example section within a doc-comment.

There is an actual `IoMem` implementation including a struct resource
abstraction [1] from Daniel though. Maybe you want to have a look at this
instead.

[1] https://lore.kernel.org/rust-for-linux/20250130220529.665896-1-daniel.almeida@collabora.com/

> 
> https://github.com/AsahiLinux/linux/blob/fce34c83f1dca5b10cc2c866fd8832a362de7974/rust/kernel/io_mem.rs#L152
> 
> 
> >> +///         if addr.is_null() {
> >> +///             return Err(ENOMEM);
> >> +///         }
> >> +///
> >> +///         Ok(IoMem(IoRaw::new(addr as _, SIZE)?))
> >> +///     }
> >> +/// }
> >> +///
> >> +/// impl<const SIZE: usize> Drop for IoMem<SIZE> {
> >> +///     fn drop(&mut self) {
> >> +///         // SAFETY: `self.0.addr()` is guaranteed to be properly mapped by `Self::new`.
> >> +///         unsafe { bindings::iounmap(self.0.addr() as _); };
> >> +///     }
> >> +/// }
> >> +///
> >> +/// impl<const SIZE: usize> Deref for IoMem<SIZE> {
> >> +///    type Target = Io<SIZE>;
> >> +///
> >> +///    fn deref(&self) -> &Self::Target {
> >> +///         // SAFETY: The memory range stored in `self` has been properly mapped in `Self::new`.
> >> +///         unsafe { Io::from_raw(&self.0) }
> >> +///    }
> >> +/// }
> >> +///
> >> +///# fn no_run() -> Result<(), Error> {
> >> +/// // SAFETY: Invalid usage for example purposes.
> >> +/// let iomem = unsafe { IoMem::<{ core::mem::size_of::<u32>() }>::new(0xBAAAAAAD)? };
> >> +/// iomem.writel(0x42, 0x0);
> >> +/// assert!(iomem.try_writel(0x42, 0x0).is_ok());
> >> +/// assert!(iomem.try_writel(0x42, 0x4).is_err());
> >> +/// # Ok(())
> >> +/// # }
> >> +/// ```
> >> +#[repr(transparent)]
> >> +pub struct Io<const SIZE: usize = 0>(IoRaw<SIZE>);

  reply	other threads:[~2025-02-02 22:20 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-12 16:33 [PATCH v6 00/16] Device / Driver PCI / Platform Rust abstractions Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 01/16] rust: module: add trait `ModuleMetadata` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 02/16] rust: implement generic driver registration Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 03/16] rust: implement `IdArray`, `IdTable` and `RawDeviceId` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 04/16] rust: add rcu abstraction Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 05/16] rust: types: add `Opaque::pin_init` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 06/16] rust: add `Revocable` type Danilo Krummrich
2024-12-18 12:20   ` Benoît du Garreau
2024-12-18 12:38     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 07/16] rust: add `io::{Io, IoRaw}` base types Danilo Krummrich
2024-12-16 16:20   ` Danilo Krummrich
2025-02-02 21:19     ` Asahi Lina
2025-02-02 22:20       ` Danilo Krummrich [this message]
2025-02-02 22:42         ` Asahi Lina
2024-12-17 20:10   ` Fabien Parent
2024-12-18 12:55     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 08/16] rust: add devres abstraction Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 09/16] rust: pci: add basic PCI device / driver abstractions Danilo Krummrich
2024-12-15 12:23   ` Greg KH
2024-12-16 16:24     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 10/16] rust: pci: implement I/O mappable `pci::Bar` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 11/16] samples: rust: add Rust PCI sample driver Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 12/16] rust: of: add `of::DeviceId` abstraction Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 13/16] rust: driver: implement `Adapter` Danilo Krummrich
2024-12-19 10:53   ` Andreas Hindborg
2024-12-19 15:07     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 14/16] rust: platform: add basic platform device / driver abstractions Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 15/16] samples: rust: add Rust platform sample driver Danilo Krummrich
2024-12-15 12:25   ` Greg KH
2024-12-16 16:31     ` Danilo Krummrich
2024-12-16 16:43       ` Miguel Ojeda
2024-12-18 12:49         ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 16/16] MAINTAINERS: add Danilo to DRIVER CORE Danilo Krummrich
2024-12-13  7:06 ` [PATCH v6 00/16] Device / Driver PCI / Platform Rust abstractions Dirk Behme
2024-12-16 16:16   ` Danilo Krummrich
2024-12-18 23:46 ` Fabien Parent

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z5_vlx1BZuJGOvK7@pollux \
    --to=dakr@kernel.org \
    --cc=a.hindborg@samsung.com \
    --cc=airlied@gmail.com \
    --cc=ajanulgu@redhat.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bhelgaas@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=chrisi.schrefl@gmail.com \
    --cc=daniel.almeida@collabora.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dirk.behme@de.bosch.com \
    --cc=fabien.parent@linaro.org \
    --cc=fujita.tomonori@gmail.com \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=j@jannau.net \
    --cc=lina@asahilina.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lyude@redhat.com \
    --cc=ojeda@kernel.org \
    --cc=paulmck@kernel.org \
    --cc=pstanner@redhat.com \
    --cc=rafael@kernel.org \
    --cc=rcu@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=saravanak@google.com \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.