Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2196893/?format=api
{ "id": 2196893, "url": "http://patchwork.ozlabs.org/api/patches/2196893/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260216131534.65008-1-dakr@kernel.org/", "project": { "id": 28, "url": "http://patchwork.ozlabs.org/api/projects/28/?format=api", "name": "Linux PCI development", "link_name": "linux-pci", "list_id": "linux-pci.vger.kernel.org", "list_email": "linux-pci@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260216131534.65008-1-dakr@kernel.org>", "list_archive_url": null, "date": "2026-02-16T13:14:33", "name": "rust: io: macro_export io_define_read!() and io_define_write!()", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "4908c2eba3082f453faeb05798d6d394de792705", "submitter": { "id": 89037, "url": "http://patchwork.ozlabs.org/api/people/89037/?format=api", "name": "Danilo Krummrich", "email": "dakr@kernel.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260216131534.65008-1-dakr@kernel.org/mbox/", "series": [ { "id": 492307, "url": "http://patchwork.ozlabs.org/api/series/492307/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-pci/list/?series=492307", "date": "2026-02-16T13:14:33", "name": "rust: io: macro_export io_define_read!() and io_define_write!()", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/492307/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2196893/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2196893/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-pci+bounces-47351-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-pci@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=QQ6DLHRN;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=linux-pci+bounces-47351-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"QQ6DLHRN\"", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201" ], "Received": [ "from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fF3F135tZz1xtN\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Feb 2026 00:16:05 +1100 (AEDT)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 2D9D83009988\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 13:16:03 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 32AE61DF963;\n\tMon, 16 Feb 2026 13:16:00 +0000 (UTC)", "from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CBA864;\n\tMon, 16 Feb 2026 13:15:59 +0000 (UTC)", "by smtp.kernel.org (Postfix) with ESMTPSA id E19D4C116C6;\n\tMon, 16 Feb 2026 13:15:55 +0000 (UTC)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771247760; cv=none;\n b=RNQGjdSk7tjRqAfQ4c/NpzSzTm+wPSafNNvJdqWW3VKKWQAyJ+j5xyl4j0ZCAzn8Qvkqppt3s88UZK2axHbWNhz/efdFJuCWOogPik0UTKNj7DA7Mn/nmekGwiJil/iDJyYm8pmZ1JH+Woemy0cPc42/zlR6rqzZ85cFfWE9yuY=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771247760; c=relaxed/simple;\n\tbh=JCuQM6fPgEFTbVeEejnR+/gwTbsc1IffniZ7P5huIms=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=qQLmDnl2CsSSchfh4aU9rnH4zYmD16CTzh6uxYGPHKQg2i6AxSDHj/DEOir2+SDK2bHlOGpiGmItegup+t2V9g3GvhtWuu6zHg3T74HuTaqJcr4wmEECQ8mgPCmisabv8SourT6omCU9SthR4iTy3ZfQ+dP818GHhDSC4pZpInw=", "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=QQ6DLHRN; arc=none smtp.client-ip=10.30.226.201", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1771247759;\n\tbh=JCuQM6fPgEFTbVeEejnR+/gwTbsc1IffniZ7P5huIms=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=QQ6DLHRNv2AYK0kwa2QiKk9vwnV3OMAj3sdSOav3Enu7+A3y+lrR28PpZQ4JoSR5n\n\t GXFUI3o4i0hUUPobdZI9fUauaq7iJS2aammrLNBsetyzCkvJk1KKYYTsM2IXvrakTt\n\t 6+daUYb7hMXPCxZBLdUCN7AgeTkgCp081Nq1TAGKw0xVjprtGdPqtLfkXkwXmUG1Wi\n\t +ahvcS6OSLR3GTnIMZOI/IJd8uBkp2RRuBueMoa57Ct+ooUk3OhtDBZ8Z+0GvzOAVl\n\t MpklDDW+nnY2uhuEtkIllR0INAhncYOGndK0yauinYRKuFsHZF4gb+kKx45jgm3IFi\n\t rLHCod1si9l4w==", "From": "Danilo Krummrich <dakr@kernel.org>", "To": "aliceryhl@google.com,\n\tdaniel.almeida@collabora.com,\n\tbhelgaas@google.com,\n\tkwilczynski@kernel.org,\n\tojeda@kernel.org,\n\tboqun.feng@gmail.com,\n\tgary@garyguo.net,\n\tbjorn3_gh@protonmail.com,\n\tlossin@kernel.org,\n\ta.hindborg@kernel.org,\n\ttmgross@umich.edu,\n\tzhiw@nvidia.com,\n\tacourbot@nvidia.com", "Cc": "driver-core@lists.linux.dev,\n\trust-for-linux@vger.kernel.org,\n\tlinux-pci@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tDanilo Krummrich <dakr@kernel.org>,\n\tMiguel Ojeda <miguel.ojeda.sandonis@gmail.com>", "Subject": "[PATCH] rust: io: macro_export io_define_read!() and\n io_define_write!()", "Date": "Mon, 16 Feb 2026 14:14:33 +0100", "Message-ID": "<20260216131534.65008-1-dakr@kernel.org>", "X-Mailer": "git-send-email 2.53.0", "Precedence": "bulk", "X-Mailing-List": "linux-pci@vger.kernel.org", "List-Id": "<linux-pci.vger.kernel.org>", "List-Subscribe": "<mailto:linux-pci+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-pci+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit" }, "content": "Currently, the define_read!() and define_write!() I/O macros are crate\npublic. The only user outside of the I/O module is PCI (for the\nconfigurations space I/O backend). Consequently, when CONFIG_PCI=n this\ncauses a compile time warning [1].\n\nIn order to fix this, rename the macros to io_define_read!() and\nio_define_write!() and use #[macro_export] to export them.\n\nThis is better than making the crate public visibility conditional, as\neventually subsystems will have their own crate.\n\nAlso, I/O backends are valid to be implemented by drivers as well. For\ninstance, there are devices (such as GPUs) that run firmware which\nallows to program other devices only accessible through the primary\ndevice through indirect I/O.\n\nSince the macros are now public, also add the corresponding\ndocumentation.\n\nFixes: 121d87b28e1d (\"rust: io: separate generic I/O helpers from MMIO implementation\")\nReported-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>\nCloses: https://lore.kernel.org/driver-core/CANiq72khOYkt6t5zwMvSiyZvWWHMZuNCMERXu=7K=_5tT-8Pgg@mail.gmail.com/ [1]\nSigned-off-by: Danilo Krummrich <dakr@kernel.org>\n---\n rust/kernel/io.rs | 129 ++++++++++++++++++++++++++++--------------\n rust/kernel/pci/io.rs | 24 ++++----\n 2 files changed, 99 insertions(+), 54 deletions(-)\n\n\nbase-commit: 0f2acd3148e0ef42bdacbd477f90e8533f96b2ac", "diff": "diff --git a/rust/kernel/io.rs b/rust/kernel/io.rs\nindex c1cca7b438c3..58f464cf5efd 100644\n--- a/rust/kernel/io.rs\n+++ b/rust/kernel/io.rs\n@@ -139,9 +139,9 @@ pub fn maxsize(&self) -> usize {\n \n /// Internal helper macros used to invoke C MMIO read functions.\n ///\n-/// This macro is intended to be used by higher-level MMIO access macros (define_read) and provides\n-/// a unified expansion for infallible vs. fallible read semantics. It emits a direct call into the\n-/// corresponding C helper and performs the required cast to the Rust return type.\n+/// This macro is intended to be used by higher-level MMIO access macros (io_define_read) and\n+/// provides a unified expansion for infallible vs. fallible read semantics. It emits a direct call\n+/// into the corresponding C helper and performs the required cast to the Rust return type.\n ///\n /// # Parameters\n ///\n@@ -166,9 +166,9 @@ macro_rules! call_mmio_read {\n \n /// Internal helper macros used to invoke C MMIO write functions.\n ///\n-/// This macro is intended to be used by higher-level MMIO access macros (define_write) and provides\n-/// a unified expansion for infallible vs. fallible write semantics. It emits a direct call into the\n-/// corresponding C helper and performs the required cast to the Rust return type.\n+/// This macro is intended to be used by higher-level MMIO access macros (io_define_write) and\n+/// provides a unified expansion for infallible vs. fallible write semantics. It emits a direct call\n+/// into the corresponding C helper and performs the required cast to the Rust return type.\n ///\n /// # Parameters\n ///\n@@ -193,7 +193,30 @@ macro_rules! call_mmio_write {\n }};\n }\n \n-macro_rules! define_read {\n+/// Generates an accessor method for reading from an I/O backend.\n+///\n+/// This macro reduces boilerplate by automatically generating either compile-time bounds-checked\n+/// (infallible) or runtime bounds-checked (fallible) read methods. It abstracts the address\n+/// calculation and bounds checking, and delegates the actual I/O read operation to a specified\n+/// helper macro, making it generic over different I/O backends.\n+///\n+/// # Parameters\n+///\n+/// * `infallible` / `fallible` - Determines the bounds-checking strategy. `infallible` relies on\n+/// `IoKnownSize` for compile-time checks and returns the value directly. `fallible` performs\n+/// runtime checks against `maxsize()` and returns a `Result<T>`.\n+/// * `$(#[$attr:meta])*` - Optional attributes to apply to the generated method (e.g.,\n+/// `#[cfg(CONFIG_64BIT)]` or inline directives).\n+/// * `$vis:vis` - The visibility of the generated method (e.g., `pub`).\n+/// * `$name:ident` / `$try_name:ident` - The name of the generated method (e.g., `read32`,\n+/// `try_read8`).\n+/// * `$call_macro:ident` - The backend-specific helper macro used to emit the actual I/O call\n+/// (e.g., `call_mmio_read`).\n+/// * `$c_fn:ident` - The backend-specific C function or identifier to be passed into the\n+/// `$call_macro`.\n+/// * `$type_name:ty` - The Rust type of the value being read (e.g., `u8`, `u32`).\n+#[macro_export]\n+macro_rules! io_define_read {\n (infallible, $(#[$attr:meta])* $vis:vis $name:ident, $call_macro:ident($c_fn:ident) ->\n $type_name:ty) => {\n /// Read IO data from a given offset known at compile time.\n@@ -226,9 +249,32 @@ macro_rules! define_read {\n }\n };\n }\n-pub(crate) use define_read;\n \n-macro_rules! define_write {\n+/// Generates an accessor method for writing to an I/O backend.\n+///\n+/// This macro reduces boilerplate by automatically generating either compile-time bounds-checked\n+/// (infallible) or runtime bounds-checked (fallible) write methods. It abstracts the address\n+/// calculation and bounds checking, and delegates the actual I/O write operation to a specified\n+/// helper macro, making it generic over different I/O backends.\n+///\n+/// # Parameters\n+///\n+/// * `infallible` / `fallible` - Determines the bounds-checking strategy. `infallible` relies on\n+/// `IoKnownSize` for compile-time checks and returns `()`. `fallible` performs runtime checks\n+/// against `maxsize()` and returns a `Result`.\n+/// * `$(#[$attr:meta])*` - Optional attributes to apply to the generated method (e.g.,\n+/// `#[cfg(CONFIG_64BIT)]` or inline directives).\n+/// * `$vis:vis` - The visibility of the generated method (e.g., `pub`).\n+/// * `$name:ident` / `$try_name:ident` - The name of the generated method (e.g., `write32`,\n+/// `try_write8`).\n+/// * `$call_macro:ident` - The backend-specific helper macro used to emit the actual I/O call\n+/// (e.g., `call_mmio_write`).\n+/// * `$c_fn:ident` - The backend-specific C function or identifier to be passed into the\n+/// `$call_macro`.\n+/// * `$type_name:ty` - The Rust type of the value being written (e.g., `u8`, `u32`). Note the use\n+/// of `<-` before the type to denote a write operation.\n+#[macro_export]\n+macro_rules! io_define_write {\n (infallible, $(#[$attr:meta])* $vis:vis $name:ident, $call_macro:ident($c_fn:ident) <-\n $type_name:ty) => {\n /// Write IO data from a given offset known at compile time.\n@@ -259,7 +305,6 @@ macro_rules! define_write {\n }\n };\n }\n-pub(crate) use define_write;\n \n /// Checks whether an access of type `U` at the given `offset`\n /// is valid within this region.\n@@ -509,40 +554,40 @@ fn maxsize(&self) -> usize {\n self.0.maxsize()\n }\n \n- define_read!(fallible, try_read8, call_mmio_read(readb) -> u8);\n- define_read!(fallible, try_read16, call_mmio_read(readw) -> u16);\n- define_read!(fallible, try_read32, call_mmio_read(readl) -> u32);\n- define_read!(\n+ io_define_read!(fallible, try_read8, call_mmio_read(readb) -> u8);\n+ io_define_read!(fallible, try_read16, call_mmio_read(readw) -> u16);\n+ io_define_read!(fallible, try_read32, call_mmio_read(readl) -> u32);\n+ io_define_read!(\n fallible,\n #[cfg(CONFIG_64BIT)]\n try_read64,\n call_mmio_read(readq) -> u64\n );\n \n- define_write!(fallible, try_write8, call_mmio_write(writeb) <- u8);\n- define_write!(fallible, try_write16, call_mmio_write(writew) <- u16);\n- define_write!(fallible, try_write32, call_mmio_write(writel) <- u32);\n- define_write!(\n+ io_define_write!(fallible, try_write8, call_mmio_write(writeb) <- u8);\n+ io_define_write!(fallible, try_write16, call_mmio_write(writew) <- u16);\n+ io_define_write!(fallible, try_write32, call_mmio_write(writel) <- u32);\n+ io_define_write!(\n fallible,\n #[cfg(CONFIG_64BIT)]\n try_write64,\n call_mmio_write(writeq) <- u64\n );\n \n- define_read!(infallible, read8, call_mmio_read(readb) -> u8);\n- define_read!(infallible, read16, call_mmio_read(readw) -> u16);\n- define_read!(infallible, read32, call_mmio_read(readl) -> u32);\n- define_read!(\n+ io_define_read!(infallible, read8, call_mmio_read(readb) -> u8);\n+ io_define_read!(infallible, read16, call_mmio_read(readw) -> u16);\n+ io_define_read!(infallible, read32, call_mmio_read(readl) -> u32);\n+ io_define_read!(\n infallible,\n #[cfg(CONFIG_64BIT)]\n read64,\n call_mmio_read(readq) -> u64\n );\n \n- define_write!(infallible, write8, call_mmio_write(writeb) <- u8);\n- define_write!(infallible, write16, call_mmio_write(writew) <- u16);\n- define_write!(infallible, write32, call_mmio_write(writel) <- u32);\n- define_write!(\n+ io_define_write!(infallible, write8, call_mmio_write(writeb) <- u8);\n+ io_define_write!(infallible, write16, call_mmio_write(writew) <- u16);\n+ io_define_write!(infallible, write32, call_mmio_write(writel) <- u32);\n+ io_define_write!(\n infallible,\n #[cfg(CONFIG_64BIT)]\n write64,\n@@ -566,40 +611,40 @@ pub unsafe fn from_raw(raw: &MmioRaw<SIZE>) -> &Self {\n unsafe { &*core::ptr::from_ref(raw).cast() }\n }\n \n- define_read!(infallible, pub read8_relaxed, call_mmio_read(readb_relaxed) -> u8);\n- define_read!(infallible, pub read16_relaxed, call_mmio_read(readw_relaxed) -> u16);\n- define_read!(infallible, pub read32_relaxed, call_mmio_read(readl_relaxed) -> u32);\n- define_read!(\n+ io_define_read!(infallible, pub read8_relaxed, call_mmio_read(readb_relaxed) -> u8);\n+ io_define_read!(infallible, pub read16_relaxed, call_mmio_read(readw_relaxed) -> u16);\n+ io_define_read!(infallible, pub read32_relaxed, call_mmio_read(readl_relaxed) -> u32);\n+ io_define_read!(\n infallible,\n #[cfg(CONFIG_64BIT)]\n pub read64_relaxed,\n call_mmio_read(readq_relaxed) -> u64\n );\n \n- define_read!(fallible, pub try_read8_relaxed, call_mmio_read(readb_relaxed) -> u8);\n- define_read!(fallible, pub try_read16_relaxed, call_mmio_read(readw_relaxed) -> u16);\n- define_read!(fallible, pub try_read32_relaxed, call_mmio_read(readl_relaxed) -> u32);\n- define_read!(\n+ io_define_read!(fallible, pub try_read8_relaxed, call_mmio_read(readb_relaxed) -> u8);\n+ io_define_read!(fallible, pub try_read16_relaxed, call_mmio_read(readw_relaxed) -> u16);\n+ io_define_read!(fallible, pub try_read32_relaxed, call_mmio_read(readl_relaxed) -> u32);\n+ io_define_read!(\n fallible,\n #[cfg(CONFIG_64BIT)]\n pub try_read64_relaxed,\n call_mmio_read(readq_relaxed) -> u64\n );\n \n- define_write!(infallible, pub write8_relaxed, call_mmio_write(writeb_relaxed) <- u8);\n- define_write!(infallible, pub write16_relaxed, call_mmio_write(writew_relaxed) <- u16);\n- define_write!(infallible, pub write32_relaxed, call_mmio_write(writel_relaxed) <- u32);\n- define_write!(\n+ io_define_write!(infallible, pub write8_relaxed, call_mmio_write(writeb_relaxed) <- u8);\n+ io_define_write!(infallible, pub write16_relaxed, call_mmio_write(writew_relaxed) <- u16);\n+ io_define_write!(infallible, pub write32_relaxed, call_mmio_write(writel_relaxed) <- u32);\n+ io_define_write!(\n infallible,\n #[cfg(CONFIG_64BIT)]\n pub write64_relaxed,\n call_mmio_write(writeq_relaxed) <- u64\n );\n \n- define_write!(fallible, pub try_write8_relaxed, call_mmio_write(writeb_relaxed) <- u8);\n- define_write!(fallible, pub try_write16_relaxed, call_mmio_write(writew_relaxed) <- u16);\n- define_write!(fallible, pub try_write32_relaxed, call_mmio_write(writel_relaxed) <- u32);\n- define_write!(\n+ io_define_write!(fallible, pub try_write8_relaxed, call_mmio_write(writeb_relaxed) <- u8);\n+ io_define_write!(fallible, pub try_write16_relaxed, call_mmio_write(writew_relaxed) <- u16);\n+ io_define_write!(fallible, pub try_write32_relaxed, call_mmio_write(writel_relaxed) <- u32);\n+ io_define_write!(\n fallible,\n #[cfg(CONFIG_64BIT)]\n pub try_write64_relaxed,\ndiff --git a/rust/kernel/pci/io.rs b/rust/kernel/pci/io.rs\nindex 6ca4cf75594c..2c8d7d00e54d 100644\n--- a/rust/kernel/pci/io.rs\n+++ b/rust/kernel/pci/io.rs\n@@ -8,14 +8,14 @@\n device,\n devres::Devres,\n io::{\n- define_read,\n- define_write,\n Io,\n IoCapable,\n IoKnownSize,\n Mmio,\n MmioRaw, //\n },\n+ io_define_read,\n+ io_define_write,\n prelude::*,\n sync::aref::ARef, //\n };\n@@ -88,7 +88,7 @@ pub struct ConfigSpace<'a, S: ConfigSpaceKind = Extended> {\n /// Internal helper macros used to invoke C PCI configuration space read functions.\n ///\n /// This macro is intended to be used by higher-level PCI configuration space access macros\n-/// (define_read) and provides a unified expansion for infallible vs. fallible read semantics. It\n+/// (io_define_read) and provides a unified expansion for infallible vs. fallible read semantics. It\n /// emits a direct call into the corresponding C helper and performs the required cast to the Rust\n /// return type.\n ///\n@@ -117,9 +117,9 @@ macro_rules! call_config_read {\n /// Internal helper macros used to invoke C PCI configuration space write functions.\n ///\n /// This macro is intended to be used by higher-level PCI configuration space access macros\n-/// (define_write) and provides a unified expansion for infallible vs. fallible read semantics. It\n-/// emits a direct call into the corresponding C helper and performs the required cast to the Rust\n-/// return type.\n+/// (io_define_write) and provides a unified expansion for infallible vs. fallible read semantics.\n+/// It emits a direct call into the corresponding C helper and performs the required cast to the\n+/// Rust return type.\n ///\n /// # Parameters\n ///\n@@ -163,13 +163,13 @@ fn maxsize(&self) -> usize {\n // PCI configuration space does not support fallible operations.\n // The default implementations from the Io trait are not used.\n \n- define_read!(infallible, read8, call_config_read(pci_read_config_byte) -> u8);\n- define_read!(infallible, read16, call_config_read(pci_read_config_word) -> u16);\n- define_read!(infallible, read32, call_config_read(pci_read_config_dword) -> u32);\n+ io_define_read!(infallible, read8, call_config_read(pci_read_config_byte) -> u8);\n+ io_define_read!(infallible, read16, call_config_read(pci_read_config_word) -> u16);\n+ io_define_read!(infallible, read32, call_config_read(pci_read_config_dword) -> u32);\n \n- define_write!(infallible, write8, call_config_write(pci_write_config_byte) <- u8);\n- define_write!(infallible, write16, call_config_write(pci_write_config_word) <- u16);\n- define_write!(infallible, write32, call_config_write(pci_write_config_dword) <- u32);\n+ io_define_write!(infallible, write8, call_config_write(pci_write_config_byte) <- u8);\n+ io_define_write!(infallible, write16, call_config_write(pci_write_config_word) <- u16);\n+ io_define_write!(infallible, write32, call_config_write(pci_write_config_dword) <- u32);\n }\n \n impl<'a, S: ConfigSpaceKind> IoKnownSize for ConfigSpace<'a, S> {\n", "prefixes": [] }