mbox series

[v3,0/4] rust: Add ACPI match table support for Rust drivers

Message ID 20250606170341.3880941-1-igor.korotin.linux@gmail.com
Headers show
Series rust: Add ACPI match table support for Rust drivers | expand

Message

Igor Korotin June 6, 2025, 5:03 p.m. UTC
This patch series introduces support for ACPI match tables in Rust 
drivers.

Currently, Rust abstractions support only Open Firmware (OF) device 
matching. This series extends the driver model to support ACPI-based 
matching, enabling Rust drivers to bind to ACPI-described devices.

Changes include:
  - A new `acpi::DeviceId` abstraction for working with 
   `struct acpi_device_id`.
  - Updates to the core `Adapter` trait and `platform::Driver` to support
    optional ACPI ID tables.
  - A sample implementation in the Rust platform driver, demonstrating 
    multi-bus matching.

This is especially useful for writing drivers that work across platforms 
using both OF and ACPI.

Tested using QEMU with a custom SSDT that creates an ACPI device matching
the sample Rust platform driver.

Igor Korotin (4):
  rust: acpi: add `acpi::DeviceId` abstraction
  rust: driver: Add ACPI id table support to Adapter trait
  rust: platform: Add ACPI match table support to `Driver` trait
  samples: rust: add ACPI match table example to platform driver

Changelog
---------
v3:
 - Removed fwnode type check in `Adapter::id_info` per Greg's and Danilo's
   comments
 - Removed `is_of_node` rust helper, due to unnecessity. 
 - Fixed example code in `rust_driver_platform.rs` per Danilo's comment
 - Added an instruction of testing ACPI using QEMU with a custom SSDT
 - Fixed minor code formatting issues.
 - Link to v2: https://lore.kernel.org/rust-for-linux/20250605161956.3658374-1-igor.korotin.linux@gmail.com/
v2:
 - Removed misleading comment in `acpi::DeviceID` implementation. 
 - Removed unnecessary casting in `acpi::DeviceID::new`.
 - Moved `pub mod acpi` to correct alphabetical position in `rust/kernel/lib.rs`.
 - Link to v1: https://lore.kernel.org/rust-for-linux/20250530123815.1766726-1-igor.korotin.linux@gmail.com/

 MAINTAINERS                          |  1 +
 rust/bindings/bindings_helper.h      |  1 +
 rust/kernel/acpi.rs                  | 61 +++++++++++++++++
 rust/kernel/driver.rs                | 39 ++++++++++-
 rust/kernel/lib.rs                   |  1 +
 rust/kernel/platform.rs              | 18 +++++-
 samples/rust/rust_driver_platform.rs | 97 +++++++++++++++++++++++++++-
 7 files changed, 214 insertions(+), 4 deletions(-)
 create mode 100644 rust/kernel/acpi.rs


base-commit: 9857af0fcff385c75433f2162c30c62eb912ef6d

Comments

Benno Lossin June 8, 2025, 7:48 a.m. UTC | #1
On Fri Jun 6, 2025 at 7:06 PM CEST, Igor Korotin wrote:
> +impl DeviceId {
> +    const ACPI_ID_LEN: usize = 16;
> +
> +    /// Create a new device id from an ACPI 'id' string.
> +    pub const fn new(id: &'static CStr) -> Self {
> +        assert!(id.len() <= Self::ACPI_ID_LEN, "ID exceeds 16 bytes");
> +        let src = id.as_bytes_with_nul();
> +        // Replace with `bindings::acpi_device_id::default()` once stabilized for `const`.
> +        // SAFETY: FFI type is valid to be zero-initialized.
> +        let mut acpi: bindings::acpi_device_id = unsafe { core::mem::zeroed() };

This can be made safe using this series:

    https://lore.kernel.org/all/20250523145125.523275-1-lossin@kernel.org

---
Cheers,
Benno

> +        let mut i = 0;
> +        while i < src.len() {
> +            acpi.id[i] = src[i];
> +            i += 1;
> +        }
> +
> +        Self(acpi)
> +    }
> +}
Danilo Krummrich June 8, 2025, 10:42 a.m. UTC | #2
On Sun, Jun 08, 2025 at 09:48:00AM +0200, Benno Lossin wrote:
> On Fri Jun 6, 2025 at 7:06 PM CEST, Igor Korotin wrote:
> > +impl DeviceId {
> > +    const ACPI_ID_LEN: usize = 16;
> > +
> > +    /// Create a new device id from an ACPI 'id' string.
> > +    pub const fn new(id: &'static CStr) -> Self {
> > +        assert!(id.len() <= Self::ACPI_ID_LEN, "ID exceeds 16 bytes");
> > +        let src = id.as_bytes_with_nul();
> > +        // Replace with `bindings::acpi_device_id::default()` once stabilized for `const`.
> > +        // SAFETY: FFI type is valid to be zero-initialized.
> > +        let mut acpi: bindings::acpi_device_id = unsafe { core::mem::zeroed() };
> 
> This can be made safe using this series:
> 
>     https://lore.kernel.org/all/20250523145125.523275-1-lossin@kernel.org

Indeed, I did not mention this though since I think this series should not
depend on the one above. They'll land through different trees and the
improvement can still be made later on.
Danilo Krummrich June 8, 2025, 10:58 a.m. UTC | #3
On Fri, Jun 06, 2025 at 06:09:05PM +0100, Igor Korotin wrote:
> @@ -144,6 +150,7 @@ macro_rules! module_platform_driver {
>  /// impl platform::Driver for MyDriver {
>  ///     type IdInfo = ();
>  ///     const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
> +///     const ACPI_ID_TABLE: Option<acpi::IdTable<Self::IdInfo>> = Some(&ACPI_TABLE);

This breaks the doctest. You need to define ACPI_TABLE above, just like OF_TABLE
is defined above.

If you enable CONFIG_RUST_KERNEL_DOCTESTS=y it will compile the doctests and run
them as kunit test.