From patchwork Tue Jun 10 15:00:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Korotin X-Patchwork-Id: 895559 Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2AC4239085; Tue, 10 Jun 2025 15:03:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749567795; cv=none; b=nhEggROgr+GNy3e6z8F+dehZ9i5RQTN7IiGD1xZZtYo7osl15Hx6PppmOPzKFcfhlhlaNQdiq2/MA2a9gya4RoZVRtj/WP6WIMhHdQKag33Uta/EDpPloR6OpTMwQOWkgd8RShsYsSJqi1TqoHjR3i798uFGY5N92bOUcodmSak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749567795; c=relaxed/simple; bh=fLM1J7jVqqiZf/ld7d1JFGfRWVz+teNjK6y084/tbPs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jol19xdslwFNbi0pe7miihJGHBB/3c80Kd0fqqx1AcirLTjrohoRckvyQmtjLp2df0uzu+DrCko1Fkbv9yaFZwh9XjVGC7i6VWQvgNIXgRTPnpek2a6Ki5S+v+SJx75UUFXxDa3kOb59DrxwxiOmRvvwy5/ZrwyMFHh9QEA6NiE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ddxdvx+G; arc=none smtp.client-ip=209.85.208.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ddxdvx+G" Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-60727e46168so9597590a12.0; Tue, 10 Jun 2025 08:03:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749567792; x=1750172592; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=oudxA8JPC06HRjXurKEPIdr/6i2EGFIADSPFZLQo5s0=; b=ddxdvx+GmNN00bF+E1yjB4oBe/F8/At0+fE0nib9tgiiUZGlAIRj2XOiLyxyVVLMwZ emp51Nq7MF2hTzako4tsaHdZ0sWWefVOKcKBvfiSPiiGW+ZheqPCYcyj8NwZHEfafTPB yr2bRggDv9NmjfihYt7BI/hrFInLXjxzLnjVumo3zyrslUTJoS+kHMph6naNqcXya1z5 R19EuBYobDQxxvHf3+X+QrXn7ZfMANzpTvxgR1nz7ticd3UHQT2BIzM7j7ez6HMDgiv8 IEv+RmWBxoN30smexkoZU/D/JUQpURzUI/xTDScLQsPrFz49Fm89b4VADKCbJ1tb23Wu emXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749567792; x=1750172592; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=oudxA8JPC06HRjXurKEPIdr/6i2EGFIADSPFZLQo5s0=; b=Au/vaoCGIyXbXonrwdVwX8BaV4qtzpbRN9ZUNCoBne65zGD6LxHMYht5opqHyMGO/f D6NE4CFEHYhCOb3W5rYHZt5CI6OyW3oRuHSogvHPHOoIUBPYsTXyiU1GFUZiFjQd3q15 aEbZLhxWRTKnnliJt5lUDVxv8yRgPu57PZ6pAbaXWnBz5s9IgLaKNzDG/VWPRx6FbJGY ggEbw2bk7uOlsaDUPSu7PLSMB7paJGUt7e/fUuMl23LtBLsTXPvdZcSzyIRn3KbNRgKC Bn4TELLsf+qeHDTNoSBDSTBBMG8AyrZepQDYzY8qf6/ztw2Hi/XxSFsmT51czjN6SewS e9fA== X-Forwarded-Encrypted: i=1; AJvYcCUb0msEYGc2XTFPbwegV6mxbnIQ38Kut2TwMcZfth08WFeKdiglq5AMRj48m8G+G7cz4fpcQdHnOr+rs1Ap@vger.kernel.org, AJvYcCVwsYyP0nQC4E1XHcReFoQnpE77hAm290MdLk+MzcOu1+nmmOLMMvWGsE9CuveJjM8LquEb/1ozwh8J@vger.kernel.org, AJvYcCXmCP67QSg6uXA+zKPB+h5Z0pXXsk4fDQKvvi4HUXZTyuR7EA59QjgGjADwD6S+/ADc5PBGp62886yZGrw2Tlc=@vger.kernel.org X-Gm-Message-State: AOJu0YweuDrF6TdutJ1nTEiMJ63cud80ij4OfbHH02XbPMzBarqNDVp1 EprlFva1HtnVzUbOVwZQ3lRNdRCiVrITUPkrM6RSrtRTsAM/bA+xnLnZyOoVj4SKGE4= X-Gm-Gg: ASbGncvrnuSAgCoBN95Z42s6YS9v/5VJfs9JUYLVeJx9ligtOgcWvNMLknR8h2Ut2KS 3HwcDq4jxZWvYCNwhX4RhykRR1McXYEIvVulhub0HeZmw1gUi86rJrsRuO1o/5LbtknGI3VHxLB 84/tFbAt6bj3YIbH1hlpva1tMdfkc80AX60Rl5twFW3RT37/lcrGsdaT9/HRPGO6PIwePSZ7iQ6 FwRfZs4fiAiCjaQx/tREPqS1LeOwzlConm8zYoTu9q+D+daCmbZ8if4JOlIrAYoIzikiqd6saSS 0ZMzmhED78Z3D/LiAQYx5TOTQFjH/W4sQZ4S4zrb4pxBEs2OJpn1HiiLtrkNZ5/+HuplErhuBWi rl6C4F8UUfrbNCwuHUB29ckgt+snqw1xqMF+G X-Google-Smtp-Source: AGHT+IH0+AZPTlciHmkGllD/oma4zGiZ8/jDRd0hiXsfTZ/a0TRwnby3WB2wlYT/JkgeoZpgsuc5Fw== X-Received: by 2002:a05:6000:4205:b0:3a4:c75c:efd5 with SMTP id ffacd0b85a97d-3a5319b4d6bmr15095416f8f.46.1749567781536; Tue, 10 Jun 2025 08:03:01 -0700 (PDT) Received: from igor-korotin-Precision-Tower-3620.airspan.com ([188.39.32.4]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a53244e0e3sm12721205f8f.68.2025.06.10.08.03.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jun 2025 08:03:00 -0700 (PDT) Sender: Igor Korotin From: Igor Korotin To: ojeda@kernel.org, alex.gaynor@gmail.com, rafael@kernel.org, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-acpi@vger.kernel.org Cc: boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, dakr@kernel.org, lenb@kernel.org, wedsonaf@gmail.com, viresh.kumar@linaro.org, alex.hung@amd.com, dingxiangfei2009@gmail.com Subject: [PATCH v4 1/5] rust: acpi: add `acpi::DeviceId` abstraction Date: Tue, 10 Jun 2025 16:00:51 +0100 Message-ID: <20250610150051.237201-1-igor.korotin.linux@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250610145234.235005-1-igor.korotin.linux@gmail.com> References: <20250610145234.235005-1-igor.korotin.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 `acpi::DeviceId` is an abstraction around `struct acpi_device_id`. This is used by subsequent patches, in particular the i2c driver abstractions, to create ACPI device ID tables. Signed-off-by: Igor Korotin --- MAINTAINERS | 1 + rust/kernel/acpi.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++ rust/kernel/lib.rs | 1 + 3 files changed, 63 insertions(+) create mode 100644 rust/kernel/acpi.rs diff --git a/MAINTAINERS b/MAINTAINERS index a92290fffa16..6c809ea30e6a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -302,6 +302,7 @@ F: include/linux/acpi.h F: include/linux/fwnode.h F: include/linux/fw_table.h F: lib/fw_table.c +F: rust/kernel/acpi.rs F: tools/power/acpi/ ACPI APEI diff --git a/rust/kernel/acpi.rs b/rust/kernel/acpi.rs new file mode 100644 index 000000000000..f9a98dc4eb8a --- /dev/null +++ b/rust/kernel/acpi.rs @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Advanced Configuration and Power Interface abstractions. + +use crate::{bindings, device_id::RawDeviceId, prelude::*}; + +/// IdTable type for ACPI drivers. +pub type IdTable = &'static dyn kernel::device_id::IdTable; + +/// An ACPI device id. +#[repr(transparent)] +#[derive(Clone, Copy)] +pub struct DeviceId(bindings::acpi_device_id); + +// SAFETY: +// * `DeviceId` is a `#[repr(transparent)` wrapper of `struct acpi_device_id` and does not add +// additional invariants, so it's safe to transmute to `RawType`. +// * `DRIVER_DATA_OFFSET` is the offset to the `data` field. +unsafe impl RawDeviceId for DeviceId { + type RawType = bindings::acpi_device_id; + + const DRIVER_DATA_OFFSET: usize = core::mem::offset_of!(bindings::acpi_device_id, driver_data); + + fn index(&self) -> usize { + self.0.driver_data as _ + } +} + +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() }; + let mut i = 0; + while i < src.len() { + acpi.id[i] = src[i]; + i += 1; + } + + Self(acpi) + } +} + +/// Create an ACPI `IdTable` with an "alias" for modpost. +#[macro_export] +macro_rules! acpi_device_table { + ($table_name:ident, $module_table_name:ident, $id_info_type: ty, $table_data: expr) => { + const $table_name: $crate::device_id::IdArray< + $crate::acpi::DeviceId, + $id_info_type, + { $table_data.len() }, + > = $crate::device_id::IdArray::new($table_data); + + $crate::module_device_table!("acpi", $module_table_name, $table_name); + }; +} diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 6b4774b2b1c3..5bbf3627212f 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -51,6 +51,7 @@ pub use ffi; +pub mod acpi; pub mod alloc; #[cfg(CONFIG_AUXILIARY_BUS)] pub mod auxiliary; From patchwork Tue Jun 10 15:03:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Korotin X-Patchwork-Id: 895221 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 63D2B1A38E1; Tue, 10 Jun 2025 15:05:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749567924; cv=none; b=dmUomc65Jvmf2Z9Caa2XAKAbZEtU2I5uh5jxwSlrBke1cdfbuFDbMnIMWtuXuwieCbeWwy77lrT0Q3RSRj3k+jDvATS35nIG0Id/I9oc2FOy7cE2tWewvtKSG6mwLgInylb4oIrL8GefahH+M6yO87oMzvcGLAXxfoChVJO3hoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749567924; c=relaxed/simple; bh=flqCuN1LFxKMYrK52rWr1/uWTHaSEMwBTPmhJUrxg+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O+663DZxwo2yJoi8fAT3RRX9mSDCK50OOmsSziiWEeEBXgyo0hu6020dwBga1a0E2GgBS8Rm6NvdGv/twkcPT2JFZfqKr3oz+MtWq7WcH+pDR5O+GWtcMvRCw0HKBisTQRGDHIz+mMMEyFKZ1KMSGErTVzYEv7HM1uJFPmEaEXI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cqKmKKXJ; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cqKmKKXJ" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-450cf214200so51901455e9.1; Tue, 10 Jun 2025 08:05:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749567921; x=1750172721; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=DYST0Wq5UCvFFk+G2xi/lkliKbwC7IeQBkNPHcpoKFQ=; b=cqKmKKXJm3+5paYuvHDxn7ZaFdxQDmVH5IvbTuiP0eR8jotIZNageiwovF46+gHUCM r67uTWK/zj4gALUpZ14GRc4mKMnDNpPSISX8OTBcp3C6fX4Y6xPUvvEUg8w23Rc4lUmz VucLEOK3JELYJgdvH3dC3DoHtj3WlNeBGZ0BrYsBMqKc+njsubNuJsL+GnJb0hZRtfBk pDX6x8V8Vxaj3bhE3lR6DUs2rp8TE9c4umpRu4dT4zBu64R6MkjrtxdCx9lAr9Uy3byJ XfxLr0vftHZndsD6RRigQnBHirWxqVfR6fbKu97Xckf+yecLIepu0/n20/dX2lOAYWO7 zbsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749567921; x=1750172721; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=DYST0Wq5UCvFFk+G2xi/lkliKbwC7IeQBkNPHcpoKFQ=; b=ilniaFnGORUMpIAZhBhkQTwU/5bcQMTjC6q/g9vMCdn0TMeR0Xorm2LuH2ZpVYlAeD pTXWB3vopxBn8Qg4f59LRgIgm75fgcGFyhNw+shGGjjzKRb6+etUu+77uwIPVVdi8RKu 1iO0HCTH9xwnUAOpwva0gHgf+S8FBkEkemWpaMdNo17QRouVp2zhJvaBzrgVTFULR7o3 cVTkUdxQn79Nt8ZMJXuEop6tEgpqBdq3tpBM6fjjxUz1wei+G0Mqq2kTlGC5O29bpObg 1F5khIKpWt92mX4xDx15k0tqM6jlPsX6hSo/nNJ0Pak+wiJ+xtDgsYXC2NFPYA4qc4QZ TC+w== X-Forwarded-Encrypted: i=1; AJvYcCUWef56ZOitJnBZcDPTurltS/PlWEw5+yAxqc9cLKyRLTidvXmT/UxVtqAjU3f0MX5czsT5+5Zvo5T2kVIvfE0=@vger.kernel.org, AJvYcCVVXQVsmEDSbHlqLFPvo+c9FFUoBVqL3edmm7x2bBMlo92JDPGKC0gwaK3W6idtwwnZw9Z+FEdaOFwW@vger.kernel.org, AJvYcCWfLED02hi60y9STWgfHBB5TMWSG2cWiM7c5fF03Z4yPRzWFdgvmTP8yZ3HMud3lfpwQA2X9qjp5BcykGsc@vger.kernel.org X-Gm-Message-State: AOJu0YyGTKTtwARhgYkhABFV8tgFQ0mbh88tqFhBg3dhj7ByGqrIQbwk UD/39iWZ0al2fbpRNehd9iVfaEF0P8Ew/UAyMNs9qguCzaqMwtUS98m2IP00zT6CoJ8= X-Gm-Gg: ASbGncsuNjFwH8aUuL1hEOQ6J0f5o281/1J++kwQssFPNNAR4wYKjnP8mx8CkTME2tG NJODctqvZ609d7ZQqEQtSzC+NwqL7dAjBmTiwjMlJqHj+orGUVS6thEI9QZZxA/e4TDEhOI3oSs zXIEvYuwBX8d9FZDhagGvt/SaEMBwm1l8oqpvZvnXLAgjOkaBqsVUAaFofA7yI8DFTNoQSVIXxT 7ZD0K5AnPjiBLGqbJXs3ZhDt8RbMaveXpM5Cj0G5iIx5zGhyU8Dg1hELdwr2JveY06DeD1fGuAo hLqwjCfvj20kDKP7VV+pkviYHyffRMcJPU1zApvSIr0IU110zSr9X8jXDYjVI5PB7ZfmPkWtmKv pnTZxlJTkxJUY1qVs+l2u3HWnCruZmWRdEeKR X-Google-Smtp-Source: AGHT+IFN9u2t/Wp8LhDB0gA0/W33WOWPayonuzXz/G4wLLYTAVQ6KWIGAINYjOJ1X1qxPMzreZHj1w== X-Received: by 2002:a05:6000:420f:b0:3a4:f6ed:767a with SMTP id ffacd0b85a97d-3a531abcca7mr15162775f8f.38.1749567920129; Tue, 10 Jun 2025 08:05:20 -0700 (PDT) Received: from igor-korotin-Precision-Tower-3620.airspan.com ([188.39.32.4]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a532464f20sm12559408f8f.98.2025.06.10.08.05.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jun 2025 08:05:19 -0700 (PDT) Sender: Igor Korotin From: Igor Korotin To: ojeda@kernel.org, alex.gaynor@gmail.com, rafael@kernel.org, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-acpi@vger.kernel.org Cc: boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, dakr@kernel.org, lenb@kernel.org, wedsonaf@gmail.com, viresh.kumar@linaro.org, alex.hung@amd.com, dingxiangfei2009@gmail.com Subject: [PATCH v4 2/5] rust: driver: Add ACPI id table support to Adapter trait Date: Tue, 10 Jun 2025 16:03:12 +0100 Message-ID: <20250610150312.237649-1-igor.korotin.linux@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250610145234.235005-1-igor.korotin.linux@gmail.com> References: <20250610145234.235005-1-igor.korotin.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Extend the `Adapter` trait to support ACPI device identification. This mirrors the existing Open Firmware (OF) support (`of_id_table`) and enables Rust drivers to match and retrieve ACPI-specific device data when `CONFIG_ACPI` is enabled. To avoid breaking compilation, a stub implementation of `acpi_id_table()` is added to the Platform adapter; the full implementation will be provided in a subsequent patch. Signed-off-by: Igor Korotin --- rust/bindings/bindings_helper.h | 1 + rust/kernel/driver.rs | 39 ++++++++++++++++++++++++++++++++- rust/kernel/platform.rs | 6 ++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index bc494745f67b..dfb2dd500ef6 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -28,6 +28,7 @@ */ #include +#include #include #include #include diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs index ec9166cedfa7..638f1d270af8 100644 --- a/rust/kernel/driver.rs +++ b/rust/kernel/driver.rs @@ -6,7 +6,7 @@ //! register using the [`Registration`] class. use crate::error::{Error, Result}; -use crate::{device, of, str::CStr, try_pin_init, types::Opaque, ThisModule}; +use crate::{acpi, device, of, str::CStr, try_pin_init, types::Opaque, ThisModule}; use core::pin::Pin; use pin_init::{pin_data, pinned_drop, PinInit}; @@ -141,6 +141,38 @@ pub trait Adapter { /// The type holding driver private data about each device id supported by the driver. type IdInfo: 'static; + /// The [`acpi::IdTable`] of the corresponding driver + fn acpi_id_table() -> Option>; + + /// Returns the driver's private data from the matching entry in the [`acpi::IdTable`], if any. + /// + /// If this returns `None`, it means there is no match with an entry in the [`acpi::IdTable`]. + #[cfg(CONFIG_ACPI)] + fn acpi_id_info(dev: &device::Device) -> Option<&'static Self::IdInfo> { + let table = Self::acpi_id_table()?; + + // SAFETY: + // - `table` has static lifetime, hence it's valid for read, + // - `dev` is guaranteed to be valid while it's alive, and so is `pdev.as_ref().as_raw()`. + let raw_id = unsafe { bindings::acpi_match_device(table.as_ptr(), dev.as_raw()) }; + + if raw_id.is_null() { + None + } else { + // SAFETY: `DeviceId` is a `#[repr(transparent)` wrapper of `struct of_device_id` and + // does not add additional invariants, so it's safe to transmute. + let id = unsafe { &*raw_id.cast::() }; + + Some(table.info(::index(id))) + } + } + + #[cfg(not(CONFIG_ACPI))] + #[allow(missing_docs)] + fn acpi_id_info(_dev: &device::Device) -> Option<&'static Self::IdInfo> { + None + } + /// The [`of::IdTable`] of the corresponding driver. fn of_id_table() -> Option>; @@ -178,6 +210,11 @@ fn of_id_info(_dev: &device::Device) -> Option<&'static Self::IdInfo> { /// If this returns `None`, it means that there is no match in any of the ID tables directly /// associated with a [`device::Device`]. fn id_info(dev: &device::Device) -> Option<&'static Self::IdInfo> { + let id = Self::acpi_id_info(dev); + if id.is_some() { + return id; + } + let id = Self::of_id_info(dev); if id.is_some() { return id; diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs index 5b21fa517e55..5923d29a0511 100644 --- a/rust/kernel/platform.rs +++ b/rust/kernel/platform.rs @@ -5,7 +5,7 @@ //! C header: [`include/linux/platform_device.h`](srctree/include/linux/platform_device.h) use crate::{ - bindings, container_of, device, driver, + acpi, bindings, container_of, device, driver, error::{to_result, Result}, of, prelude::*, @@ -94,6 +94,10 @@ impl driver::Adapter for Adapter { fn of_id_table() -> Option> { T::OF_ID_TABLE } + + fn acpi_id_table() -> Option> { + None + } } /// Declares a kernel module that exposes a single platform driver. From patchwork Tue Jun 10 15:05:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Korotin X-Patchwork-Id: 895558 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2640A235358; Tue, 10 Jun 2025 15:07:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749568066; cv=none; b=HtdG/vVxX7N5fVBg0p+iWSYtlYY44nlB/yaKsfX3oXnWuEMO/9CfMdtlZkeU07NXbPo/F6UGVqjpBusAL6PHRIVrj6WJlSQCtzMTMof1ZQ9BcvoARbAQWJWqeEyLNof6nDUiDot1WWgT9W2DYAw761gGhzp6KYC0Os0HCItQC7I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749568066; c=relaxed/simple; bh=1UZ55Ek45CKKfVDM95IkqYsS3tOP2/4OhvhnJ6C/s6U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IfpMM7rl5yblOmpQntH8thaszVU3U5qVX4W+9pBZj5zAqWJarcO1Q+NpcuypONky1HYgSySjPAfnoBKYhA9HpgzGh2xcNi1736vrI1VpOnR2fwTERfZ0wLkcS+/FAHUSc2gweEtYzFtHOj7dsyhsfcP1WxZE91HRq9dTIKw0dbo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NkzSHTZR; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NkzSHTZR" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-442f4a3a4d6so30256305e9.0; Tue, 10 Jun 2025 08:07:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749568062; x=1750172862; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=8LOqx5US9U5c9V8qjyLq6lu8HPn0k7QBwpGRoaY52N0=; b=NkzSHTZRWhjZf5CJuEy13B9jav7n7hW6qy8rDQfE9CUjX+KaoxK0NetmpakZ+GyjqW 4TGhDzHioZ54fjzPMWCGxXV2RDkGCrzrCeHghDBIYbMNN0olCvv+xVsDOy8dsRzMvSpw PbsUyTm5lTs2r2Wthqg732zcAg1cR1pC5zOfdWlc2AG28dFouFze68l/z0UvtjgX8X6y LnDJMhhtLhGeLmr3kjUKC3VKftO1E1/dTOiE4UQSB9eDnOUXcWeK/luUzRAv5XYG5tFD SXQb/pqMdyrPxz04e/Io5SzkNW7vpDtjUWP6NiMXAd4ua8cPMC4e+yktgXqNhd1ewJO6 copw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749568062; x=1750172862; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8LOqx5US9U5c9V8qjyLq6lu8HPn0k7QBwpGRoaY52N0=; b=HzWqq/H79f7N73f/5yaNC+D+S9AbVWJgdOKMDq8h7DxuIqSq/Sj+Lp8c7dw2AroPKl iEu0mHQfQ3ZZeUOnwFCUqhxRxzrvqtRrPwM9un0BqbqgT9+qWyhFTWqzIMeVF3T+6jtr jmXU+OGq3SS1StllqgTnwCwCJ9TwOKAlGCNy6AdFRZa4N78JwftCVcALZj+sVrOTy/3h FKDFZf7TbCHvYFK1q3xlIMcrBOucnhWuG9RN1skYuEOM7XSV/gGUVytm2+xYTi3tBkZU l/gKuVfaOKxKxPrQZ2QhImi2226aIg9cOnHkWg+WZXaOR9HjL4ot8NAh946NY7rAVDaC ORhw== X-Forwarded-Encrypted: i=1; AJvYcCUsa+EhuqTJrqMbaGtX1133TFmyyzEqN343+r0r1h4Kny7LeCXgSrrr4QUsGQsVwbeKeDrXfVbl+bPq@vger.kernel.org, AJvYcCUuogI2pEygJjss/6MCaKldvYVp7SO+spqk3yGWYfuBJFgiKoddLw+UeKh0dteTCBzEwlmMYJrsnAHKBv0u@vger.kernel.org, AJvYcCXUX+eK4RG7oI5WjPPsTVIdlQpTn5uKlmG5TkWdFzV5MnyVKZMkaKjCnTmlQIhD3oqXR0d1rIfm5p3csR6607U=@vger.kernel.org X-Gm-Message-State: AOJu0YzuPK9GnR/X+Y5GzqyUyV4O4pqEsAKt+5AQbKUG0+WNBYUcRla3 6wB+pbIgLSEja+p6ddwCtggLnLpaicIsK1Bkq+yZHXukae9Y09pVFLFD X-Gm-Gg: ASbGncuE8pQ9ag6MzTR+TGDNcLd/wumzdt1pCiAUCLtZps7uHF6wdh3OUlkD/3g4TJ5 pU9rAmTbVU3WmzXIBVplKUJmHd/EHeGyRsNmDxrKjnyyauTSkh3QlsICd6K2RS/1FGBtlHvDk6z M2Pwhi7ut9JMtxj9vRpEaVevrXgxp60c1PKQzW64dG/Hu5VnHENpFuoIVDKjlFZDqbxZCa9fw37 BFye38mnk/JNUa6r/tqeyOxuVO1Vq2gjs4B+CvjUbNGpp5PDNJM2+145djr1rpPz6UxDgHyMx+6 nEkivXq7gm1yL/tOD29mImK+RZHyqOA3RlDYbVef/UVs5jqhk3FM8s20mvLtko8ab+R89gvv8Kw m2biSjlADfYOXzHZFMSoLcj5C6mfkKMmCDIm9 X-Google-Smtp-Source: AGHT+IG88wvODRgnzvR0fqTOUToaq98Ang4Ryxq55QbU6vKi2A1qEOPZBUVkvodd8v2792RM5XHsRQ== X-Received: by 2002:a05:600c:a09:b0:43c:f3e1:a729 with SMTP id 5b1f17b1804b1-4531cfc489bmr35963205e9.12.1749568061850; Tue, 10 Jun 2025 08:07:41 -0700 (PDT) Received: from igor-korotin-Precision-Tower-3620.airspan.com ([188.39.32.4]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a53244f516sm12473356f8f.74.2025.06.10.08.07.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jun 2025 08:07:41 -0700 (PDT) Sender: Igor Korotin From: Igor Korotin To: ojeda@kernel.org, alex.gaynor@gmail.com, rafael@kernel.org, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-acpi@vger.kernel.org Cc: boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, dakr@kernel.org, lenb@kernel.org, wedsonaf@gmail.com, viresh.kumar@linaro.org, alex.hung@amd.com, dingxiangfei2009@gmail.com Subject: [PATCH v4 3/5] rust: driver: Consolidate `Adapter` methods using `#[cfg]` Date: Tue, 10 Jun 2025 16:05:38 +0100 Message-ID: <20250610150538.238007-1-igor.korotin.linux@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250610145234.235005-1-igor.korotin.linux@gmail.com> References: <20250610145234.235005-1-igor.korotin.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Refactor the `acpi_id_info` and `of_id_info` methods in the `Adapter` trait to reduce duplication. Previously, each method had two versions selected via `#[cfg(...)]` and `#[cfg(not(...))]`. This change merges them into a single method per case by using `#[cfg]` blocks within the method bodies. Suggested-by: Benno Lossin Signed-off-by: Igor Korotin --- rust/kernel/driver.rs | 76 +++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs index 638f1d270af8..805f61bd4a50 100644 --- a/rust/kernel/driver.rs +++ b/rust/kernel/driver.rs @@ -147,30 +147,30 @@ pub trait Adapter { /// Returns the driver's private data from the matching entry in the [`acpi::IdTable`], if any. /// /// If this returns `None`, it means there is no match with an entry in the [`acpi::IdTable`]. - #[cfg(CONFIG_ACPI)] fn acpi_id_info(dev: &device::Device) -> Option<&'static Self::IdInfo> { - let table = Self::acpi_id_table()?; + #[cfg(not(CONFIG_ACPI))] { + let _ = dev; + return None; + } - // SAFETY: - // - `table` has static lifetime, hence it's valid for read, - // - `dev` is guaranteed to be valid while it's alive, and so is `pdev.as_ref().as_raw()`. - let raw_id = unsafe { bindings::acpi_match_device(table.as_ptr(), dev.as_raw()) }; + #[cfg(CONFIG_ACPI)] { + let table = Self::acpi_id_table()?; - if raw_id.is_null() { - None - } else { - // SAFETY: `DeviceId` is a `#[repr(transparent)` wrapper of `struct of_device_id` and - // does not add additional invariants, so it's safe to transmute. - let id = unsafe { &*raw_id.cast::() }; + // SAFETY: + // - `table` has static lifetime, hence it's valid for read, + // - `dev` is guaranteed to be valid while it's alive, and so is `pdev.as_ref().as_raw()`. + let raw_id = unsafe { bindings::acpi_match_device(table.as_ptr(), dev.as_raw()) }; - Some(table.info(::index(id))) - } - } + if raw_id.is_null() { + None + } else { + // SAFETY: `DeviceId` is a `#[repr(transparent)` wrapper of `struct of_device_id` and + // does not add additional invariants, so it's safe to transmute. + let id = unsafe { &*raw_id.cast::() }; - #[cfg(not(CONFIG_ACPI))] - #[allow(missing_docs)] - fn acpi_id_info(_dev: &device::Device) -> Option<&'static Self::IdInfo> { - None + Some(table.info(::index(id))) + } + } } /// The [`of::IdTable`] of the corresponding driver. @@ -179,30 +179,30 @@ fn acpi_id_info(_dev: &device::Device) -> Option<&'static Self::IdInfo> { /// Returns the driver's private data from the matching entry in the [`of::IdTable`], if any. /// /// If this returns `None`, it means there is no match with an entry in the [`of::IdTable`]. - #[cfg(CONFIG_OF)] fn of_id_info(dev: &device::Device) -> Option<&'static Self::IdInfo> { - let table = Self::of_id_table()?; + #[cfg(not(CONFIG_OF))] { + let _ = dev; + return None; + } - // SAFETY: - // - `table` has static lifetime, hence it's valid for read, - // - `dev` is guaranteed to be valid while it's alive, and so is `pdev.as_ref().as_raw()`. - let raw_id = unsafe { bindings::of_match_device(table.as_ptr(), dev.as_raw()) }; + #[cfg(CONFIG_OF)] { + let table = Self::of_id_table()?; - if raw_id.is_null() { - None - } else { - // SAFETY: `DeviceId` is a `#[repr(transparent)` wrapper of `struct of_device_id` and - // does not add additional invariants, so it's safe to transmute. - let id = unsafe { &*raw_id.cast::() }; + // SAFETY: + // - `table` has static lifetime, hence it's valid for read, + // - `dev` is guaranteed to be valid while it's alive, and so is `pdev.as_ref().as_raw()`. + let raw_id = unsafe { bindings::of_match_device(table.as_ptr(), dev.as_raw()) }; - Some(table.info(::index(id))) - } - } + if raw_id.is_null() { + None + } else { + // SAFETY: `DeviceId` is a `#[repr(transparent)` wrapper of `struct of_device_id` and + // does not add additional invariants, so it's safe to transmute. + let id = unsafe { &*raw_id.cast::() }; - #[cfg(not(CONFIG_OF))] - #[allow(missing_docs)] - fn of_id_info(_dev: &device::Device) -> Option<&'static Self::IdInfo> { - None + Some(table.info(::index(id))) + } + } } /// Returns the driver's private data from the matching entry of any of the ID tables, if any. From patchwork Tue Jun 10 15:07:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Korotin X-Patchwork-Id: 895220 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E77074D8D1; Tue, 10 Jun 2025 15:09:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749568199; cv=none; b=d/OiGcZctIsz2mwJ+ShmxRYSH3Mrf+l3oMu+wXc8rUuljlIuYSugpitRWoO9VFpRstbbs/vuMXMOCK3ldSOEn5EGyqaY4cqkrrlffHYl+65VkTNi+JI3dD+kzGhEYbNDl0YXm7oaeCd4aHUQ5o4fmZck7bx5eaHqFERglyW7pXc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749568199; c=relaxed/simple; bh=7bkZleI4BH17Oy/akeL6W3YsLvC+6yz5vzfe0WCU0cE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZiDZUJpcLIlc7OYZcZnELiN0dP8t6F5yOAzXTizZbKS1Y0IYyKoIgiJhzuNf5rAARgZ3ImTZTFdC8b3iANrhvKdhLQgHuwfg6Ru3TJAmXC8KzqqeHfKU7ff1CBXB3x+VrClOQZx1a3wv3SBSR1E6YnR5EZtm96FQP2cnhYOvlBU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=g5jLLVN8; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="g5jLLVN8" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-451e2f0d9c2so43816615e9.1; Tue, 10 Jun 2025 08:09:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749568195; x=1750172995; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=ALK8x8rgzEp18DzbemRF0ze+qv0C7P5MIc0avCWsR7g=; b=g5jLLVN898VjkanqBBpRg9ar4CcVYgNTXBSD71beq9kjEtkce42L6m0MkH4BOmyB72 70zZaY0qhABgYj7xBwdcNV+m61rMMOpVoyxCjfkA/xkRhOpq0pGprEi3yp4vbICknO7e VLsJJk5xatgHR/E35OM4nfOg3CYnnCyJcWdhRjEJssTZtzpRftPrx8FX0oJ8vxuUGNFP d9HDapDIOpRSsawUApdZet//tR5H5Mu/x+KZ/tSZhrmlkT5bdo7yo1nrxIUbNHyLPNdn yvmiYW1H/m4u03FfnfmmVyfagdoy3a4Sj0CpAa9LC9ZPZA28q3VulO7mF+aU7up/An+2 8M1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749568195; x=1750172995; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ALK8x8rgzEp18DzbemRF0ze+qv0C7P5MIc0avCWsR7g=; b=tJa5byP4rcsL2ZtTvGk67ynRyDhiWI8VNLB/XS1H6ekCvt5CpUkao4TSnfSk9e8enx xQjgvjyeVxEm67I1t2Nn9BOlvJGwnHsPTQBHhyX1XFHDcRuyn7wv/OQPDotjA91JSoV+ Z34iZykNcwFR6GiGjb2edHNMI9O+hBXLOnCuDrW06iyZGWi19/WHj5FNWNwnSsGNTRve 2DolYNNLeUOPp+nrSekt2suc7Xf6TKP6pDRa9Jzawn8KvTuAfDUytaW9ii2ICjtDvCsH 73RPfY0YAzGpy9z7i/XAwUpU3DPNMOx9Joj1oG5Yg52Jcyu414axUj2+++U+6ZtZMWCV v1RA== X-Forwarded-Encrypted: i=1; AJvYcCVKuyw7jDfxQ2ZGzMj7lQpHgf2fbRv7fffICzJAT9+42Abzcxf0oNfS6uddbd6cTABLiV/c6VAgYhRaKHTsbJY=@vger.kernel.org, AJvYcCX5J5WTdzv/OXXFbXN3jAxOPJbLBKSep60FKTSSyGTuG3cnI7rZzRVSSlI+MQU6wPb5tru0OtFT2jQYbNEz@vger.kernel.org, AJvYcCXfelJIj7DgrxfJt7LMpO8740Wl3fNZ1vBltchrKjWFgTUa8hdaUxydHZkRjGKzPOqHa5bpnipswDg9@vger.kernel.org X-Gm-Message-State: AOJu0YwUS/nKtxoUpKOFSX8DNkzrXga2FveseA7je1tIhrarRogHeMHJ kH0+6OC6hYslgGr/097SbcpZFM6UcDV3vRoJt8T3Yo75BQKL1xcIgE6e X-Gm-Gg: ASbGncs9phg76KK1RLQ3dWMYa1b1SrQQv77NVoZVpw9vlL9rLr0bKw2o+5OnNEr20/6 Ml1oozQljROZHGpJftY6TekJykqPveK3MiZXFg4WOg0NEHMf4U2IT08Sn/tmV8HXB9g9fIGRPWJ PSC49/2pCTJJkSK+cXEUp+Xzji9p822kCA1uQNDkrV48k8a7LBkMdsQGryxlQsWFPugCFNmVDP+ A+GGVj0yAXrcr4BkVnaZ1AvLCtuFdkQ8k76emZ1wYWhdLJ6yvvPODEnDOn5sg+y7KzYksXPZ7Rt 05uNq6P/mRRXP4/ldKEVrQBpivDWGypVO2kNDcASgX4nIXO76dYh1lgEBFkel3hUEtzdeD/nCzH E+Rraqm947+HQjT07oadabqXmMY2iRaAabBIGKmR5jDg6PU8= X-Google-Smtp-Source: AGHT+IGitqY+8Fi4phqzF5RpNzwTKpl9TkN87YxaAxk4dfH2LxdJNCATFugI5nL1SEOnctKAqGjUeg== X-Received: by 2002:a05:600c:4f88:b0:450:d79d:3b16 with SMTP id 5b1f17b1804b1-4531cffd001mr39725185e9.14.1749568195028; Tue, 10 Jun 2025 08:09:55 -0700 (PDT) Received: from igor-korotin-Precision-Tower-3620.airspan.com ([188.39.32.4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45213726c44sm147571765e9.28.2025.06.10.08.09.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jun 2025 08:09:54 -0700 (PDT) Sender: Igor Korotin From: Igor Korotin To: ojeda@kernel.org, alex.gaynor@gmail.com, rafael@kernel.org, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-acpi@vger.kernel.org Cc: boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, dakr@kernel.org, lenb@kernel.org, wedsonaf@gmail.com, viresh.kumar@linaro.org, alex.hung@amd.com, dingxiangfei2009@gmail.com Subject: [PATCH v4 4/5] rust: platform: Add ACPI match table support to `Driver` trait Date: Tue, 10 Jun 2025 16:07:52 +0100 Message-ID: <20250610150752.238391-1-igor.korotin.linux@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250610145234.235005-1-igor.korotin.linux@gmail.com> References: <20250610145234.235005-1-igor.korotin.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Extend the `platform::Driver` trait to support ACPI device matching by adding the `ACPI_ID_TABLE` constant. This allows Rust platform drivers to define ACPI match tables alongside their existing OF match tables. These changes mirror the existing OF support and allow Rust platform drivers to match devices based on ACPI identifiers. To avoid breaking compilation, a stub ACPI match table definition is added to the Rust sample platform driver. Functional support for ACPI matching in the sample driver will be provided in a follow-up patch. Signed-off-by: Igor Korotin --- rust/kernel/platform.rs | 48 ++++++++++++++++++++++++++-- samples/rust/rust_driver_platform.rs | 3 +- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs index 5923d29a0511..893b4189a10b 100644 --- a/rust/kernel/platform.rs +++ b/rust/kernel/platform.rs @@ -37,12 +37,18 @@ unsafe fn register( None => core::ptr::null(), }; + let acpi_table = match T::ACPI_ID_TABLE { + Some(table) => table.as_ptr(), + None => core::ptr::null(), + }; + // SAFETY: It's safe to set the fields of `struct platform_driver` on initialization. unsafe { (*pdrv.get()).driver.name = name.as_char_ptr(); (*pdrv.get()).probe = Some(Self::probe_callback); (*pdrv.get()).remove = Some(Self::remove_callback); (*pdrv.get()).driver.of_match_table = of_table; + (*pdrv.get()).driver.acpi_match_table = acpi_table; } // SAFETY: `pdrv` is guaranteed to be a valid `RegType`. @@ -96,7 +102,7 @@ fn of_id_table() -> Option> { } fn acpi_id_table() -> Option> { - None + T::ACPI_ID_TABLE } } @@ -127,7 +133,7 @@ macro_rules! module_platform_driver { /// # Example /// ///``` -/// # use kernel::{bindings, c_str, device::Core, of, platform}; +/// # use kernel::{acpi, bindings, c_str, device::Core, of, platform}; /// /// struct MyDriver; /// @@ -140,9 +146,44 @@ macro_rules! module_platform_driver { /// ] /// ); /// +/// kernel::acpi_device_table!( +/// ACPI_TABLE, +/// MODULE_ACPI_TABLE, +/// ::IdInfo, +/// [ +/// (acpi::DeviceId::new(c_str!("TEST4321")), ()) +/// ] +/// ); +/// /// impl platform::Driver for MyDriver { /// type IdInfo = (); /// const OF_ID_TABLE: Option> = Some(&OF_TABLE); +/// const ACPI_ID_TABLE: Option> = Some(&ACPI_TABLE); +/// +/// fn probe( +/// _pdev: &platform::Device, +/// _id_info: Option<&Self::IdInfo>, +/// ) -> Result>> { +/// Err(ENODEV) +/// } +/// } +///``` +/// +/// The platform::Driver requires declaration of both OF_ID_TABLE and +/// ACPI_ID_TABLE, but if driver is not going to use either of them +/// it can implement one of them or both as None. +/// +/// # Example: +/// +///``` +/// # use kernel::{acpi, device::Core, of, platform}; +/// +/// struct MyDriver; +/// +/// impl platform::Driver for MyDriver { +/// type IdInfo = (); +/// const OF_ID_TABLE: Option> = None; +/// const ACPI_ID_TABLE: Option> = None; /// /// fn probe( /// _pdev: &platform::Device, @@ -164,6 +205,9 @@ pub trait Driver: Send { /// The table of OF device ids supported by the driver. const OF_ID_TABLE: Option>; + /// The table of ACPI device ids supported by the driver. + const ACPI_ID_TABLE: Option>; + /// Platform driver probe. /// /// Called when a new platform device is added or discovered. diff --git a/samples/rust/rust_driver_platform.rs b/samples/rust/rust_driver_platform.rs index 8b42b3cfb363..e3992e7a71e9 100644 --- a/samples/rust/rust_driver_platform.rs +++ b/samples/rust/rust_driver_platform.rs @@ -2,7 +2,7 @@ //! Rust Platform driver sample. -use kernel::{c_str, device::Core, of, platform, prelude::*, types::ARef}; +use kernel::{acpi, c_str, device::Core, of, platform, prelude::*, types::ARef}; struct SampleDriver { pdev: ARef, @@ -20,6 +20,7 @@ struct SampleDriver { impl platform::Driver for SampleDriver { type IdInfo = Info; const OF_ID_TABLE: Option> = Some(&OF_TABLE); + const ACPI_ID_TABLE: Option> = None; fn probe( pdev: &platform::Device, From patchwork Tue Jun 10 15:10:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Korotin X-Patchwork-Id: 895557 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29F2723505B; Tue, 10 Jun 2025 15:10:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749568208; cv=none; b=gEsVt2hZjy/R5MrManUKEdwkn+q3gKBQCKreuUNPc1Zrj7GGUeY9I5EB4JMmlb7hJudrgfIeSpff7G2zdC3XuS0lpUh7bGmrXHTd7Ypf7gygfmmerxvhkRSbtrAsTsQZC5FUBCynuf5LB2IvMh0u/r3XIBXHTVTptm+/oZlWpJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749568208; c=relaxed/simple; bh=EeIZ6B+cRl+uBMGLEJG3W+y7GnZuoGZNCjsH+pbxTUI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oDoL7RImZM/eHAOPqzDBcOR/yLxzyWNOuErQZA7c0Depq/k4cRZ1Ph0MgcZVxLysm4kIcd+9aLe3Rd4T8YdCZ1Yv7I0CnHNXsSFpOJyOlgCNoSrk1f55H9/NeqhTsdq7yqP61gMffweakorP+iWmya+fIPnjfVXFSQmWbeBshnQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LSrWe3LN; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LSrWe3LN" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-3a51d552de4so3025525f8f.0; Tue, 10 Jun 2025 08:10:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749568205; x=1750173005; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=AcfCdyEquE4b+F62tUtsvgUsQ8ZebVumYr2H061MwVw=; b=LSrWe3LN+GSbA628oDAYZ/xL4iBAYFzK68NP6A7/6OUKCLkEW681cs3MDm4dJhsOwX 1eZNzbE/alg/E5PvnCeULyU8BWvZdVwYQRs0JvVpVh4X7YEms8T0IFLF0M963pnCDQBM eQ7V8exZxAsjEiWxE3cHP32I1IO+hdEpIRaik47tfKthjhYjYDb85tJ9tEihlH7alPeq zNTNxFZKybYZWHinyr31HR4PgLQgzvg2ryqjAMicWtCHTiTb5YZbL/D3VkUXmmi3o5xQ HrjxzeND4aocn35/jSHNgBggT0R3uMV9Iu6//NLWnHNkFCp2W9+2EGI0qZih2yGtJjri e3uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749568205; x=1750173005; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=AcfCdyEquE4b+F62tUtsvgUsQ8ZebVumYr2H061MwVw=; b=vrS7b5W69hcqzZWYXT3p/mFIWlN3iRWBfF98NlkcY9cb9F72eb/QZ4CRQt1jY43wEh gEBAfXgg+7Guq0FTIxxUUrG7hKlFHkk3L3b9EJUXqaImv0TfmCPC/qYXkFHBO05Hvxze JPWoAxtltSwHyrH9lXWI49DFxNduKzrJxTbKxeMddElQgzNZcDXxoO0vB+80TXLwxpfU jPxDqben1afqNvwn+ntNZi7V84QVWPjnaJdY6jeS8gqiFSOiwhRdN7qLN3PAR0Ga8s1x ZGw70nq0tvb5jnDfxmtxELQ9jgAcbxL9ASbdlAiMpzLBxrWKX3LUEmamy8a9666eCcW+ t7mQ== X-Forwarded-Encrypted: i=1; AJvYcCVbjZWCKgrw84iWdmJxp3u6Y8IURKRn2UZ9X3iHup75NftLhYC4dO3SXOM8GYKVCG/cpbkGTHYX6b7s@vger.kernel.org, AJvYcCWjal7eINagaPYZ7jKwisRcppft6BSff+DdCshzeifmMCDPT8I1nro1Daj5eK7gk4OdsN5MpwCjG7vCs/PxS+Y=@vger.kernel.org, AJvYcCXTvrrVdeCI4Im5jaMeJ4hTIJBBIUrDyV5CDLQe5UKSleRKlWnf/yNvisHACDXPSw5ZQNL9SOAJXrpURaDm@vger.kernel.org X-Gm-Message-State: AOJu0YyFyJIzESL61/mpN//LCWEqbpnZgsVPstFxk27CZ88knaP9W0uR VgPLl7VKM+zpFfJmKVPvOtutlZ8iXzcgnEofCIcYj1an/WmV+s8MNinD X-Gm-Gg: ASbGncsB7rY1CsFuLKKO1hTbYmzHtueAqDVCX5emvBuFg5CAF/q3hSg2h7b4OFsS+Jc BSzKi3PefikrYY+ACJnWzT+39Hvi3CF1rkVpmHhP05tnLZsYkT6uMPxKN1/VY9B6pvAdu3gZyE9 NohhRlFgHZKZ1Ve9+9HJrWsa1p3kiiKxrBMxLtn/QFNUFm6B52tgrwBbN/LP+ad0Qnl7jgcpqy3 24T7kG627YzQUbzT9qO+S4cusWeqfYlL0aWbnjsMkBuXbIRmKROMMlvgEaBaQSpnDNAYKx8Iy5g tMdiWoiAc/ydJAsvsm7MXZRIyDpCgffoG31dDgjU2akHyvYNiYNYRCidt7d5iYlW14b0nfSOQUs tKnn8t7Z8RP5734mqilUFwMTeq8Ycm6/WpvnE X-Google-Smtp-Source: AGHT+IHcpiLJhodJRLVjtoeEtX8y6dCV2mx6RpniIxolzQ0szt1L1NR72zhfiiuxXn3WZ7itWaw1bg== X-Received: by 2002:a05:6000:25c5:b0:3a4:e189:b685 with SMTP id ffacd0b85a97d-3a531883887mr14033774f8f.19.1749568205408; Tue, 10 Jun 2025 08:10:05 -0700 (PDT) Received: from igor-korotin-Precision-Tower-3620.airspan.com ([188.39.32.4]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a53229de17sm12877653f8f.18.2025.06.10.08.10.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jun 2025 08:10:04 -0700 (PDT) Sender: Igor Korotin From: Igor Korotin To: ojeda@kernel.org, alex.gaynor@gmail.com, rafael@kernel.org, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-acpi@vger.kernel.org Cc: boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, dakr@kernel.org, lenb@kernel.org, wedsonaf@gmail.com, viresh.kumar@linaro.org, alex.hung@amd.com, dingxiangfei2009@gmail.com Subject: [PATCH v4 5/5] samples: rust: add ACPI match table example to platform driver Date: Tue, 10 Jun 2025 16:10:02 +0100 Message-ID: <20250610151002.238890-1-igor.korotin.linux@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250610145234.235005-1-igor.korotin.linux@gmail.com> References: <20250610145234.235005-1-igor.korotin.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Extend the Rust sample platform driver to probe using device/driver name matching, OF ID table matching, or ACPI ID table matching. Signed-off-by: Igor Korotin --- samples/rust/rust_driver_platform.rs | 70 +++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/samples/rust/rust_driver_platform.rs b/samples/rust/rust_driver_platform.rs index e3992e7a71e9..35d5067aa023 100644 --- a/samples/rust/rust_driver_platform.rs +++ b/samples/rust/rust_driver_platform.rs @@ -17,10 +17,78 @@ struct SampleDriver { [(of::DeviceId::new(c_str!("test,rust-device")), Info(42))] ); +// ACPI match table test +// +// This demonstrates how to test an ACPI-based Rust platform driver using QEMU +// with a custom SSDT. +// +// Steps: +// +// 1. **Create an SSDT source file** (`ssdt.dsl`) with the following content: +// +// ```asl +// DefinitionBlock ("", "SSDT", 2, "TEST", "VIRTACPI", 0x00000001) +// { +// Scope (\_SB) +// { +// Device (T432) +// { +// Name (_HID, "TEST4321") // ACPI hardware ID to match +// Name (_UID, 1) +// Name (_STA, 0x0F) // Device present, enabled +// Name (_CRS, ResourceTemplate () +// { +// Memory32Fixed (ReadWrite, 0xFED00000, 0x1000) +// }) +// } +// } +// } +// ``` +// +// 2. **Compile the table**: +// +// ```sh +// iasl -tc ssdt.dsl +// ``` +// +// This generates `ssdt.aml` +// +// 3. **Run QEMU** with the compiled AML file: +// +// ```sh +// qemu-system-x86_64 -m 512M \ +// -enable-kvm \ +// -kernel path/to/bzImage \ +// -append "root=/dev/sda console=ttyS0" \ +// -hda rootfs.img \ +// -serial stdio \ +// -acpitable file=ssdt.aml +// ``` +// +// Requirements: +// - The `rust_driver_platform` must be present either: +// - built directly into the kernel (`bzImage`), or +// - available as a `.ko` file and loadable from `rootfs.img` +// +// 4. **Verify it worked** by checking `dmesg`: +// +// ``` +// rust_driver_platform TEST4321:00: Probed with info: '0'. +// ``` +// +// This demonstrates ACPI table matching using a custom ID in QEMU with a minimal SSDT + +kernel::acpi_device_table!( + ACPI_TABLE, + MODULE_ACPI_TABLE, + ::IdInfo, + [(acpi::DeviceId::new(c_str!("TEST4321")), Info(0))] +); + impl platform::Driver for SampleDriver { type IdInfo = Info; const OF_ID_TABLE: Option> = Some(&OF_TABLE); - const ACPI_ID_TABLE: Option> = None; + const ACPI_ID_TABLE: Option> = Some(&ACPI_TABLE); fn probe( pdev: &platform::Device,