From nobody Mon Feb 9 14:00:26 2026 Received: from mail-108-mta33.mxroute.com (mail-108-mta33.mxroute.com [136.175.108.33]) (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 1D74634EF00 for ; Fri, 30 Jan 2026 17:15:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=136.175.108.33 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769793351; cv=none; b=HcEhV4r9Qny0rLfD0IUxVSbnrGD5nSj3a92CpWS8L0JA7K9yaFApHFuQe3Ox2fwziLSC/tC1sM+rsj2da7m8VIFhVHUDZ5X+j6rN+0qCaaxTUhhcfD8ojQ1JW/X7AhRzC4o8Z6yEU1c8ApuuezDkoavG/Pc/0DHXq6XgsU1kmS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769793351; c=relaxed/simple; bh=erJ4foesZy3rGLEllSgEIoSAAm6jSk7BMyovx/PLLMY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GryXryMLqJcRVCB7tpvSdbqW5yoK1293lpSgkxB2r73qyX5YSmkwk3WNSz5ckyYGHKnCxCqfhEtzC51KRkOTiEJo+CC42fwb0AoAgmcuZOhsV9a0aWTkpiAVEc4jWCfmRGGtskHCZCpYLh6TzgqPz4dkRm/ueGm1ECD1OA2DhI0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ry.rs; spf=pass smtp.mailfrom=ry.rs; dkim=pass (2048-bit key) header.d=ry.rs header.i=@ry.rs header.b=HZHmyhtl; arc=none smtp.client-ip=136.175.108.33 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ry.rs Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ry.rs Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ry.rs header.i=@ry.rs header.b="HZHmyhtl" Received: from filter006.mxroute.com ([136.175.111.3] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta33.mxroute.com (ZoneMTA) with ESMTPSA id 19c0fe2ac4b0009140.00e for (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Fri, 30 Jan 2026 17:10:39 +0000 X-Zone-Loop: a158d1c142ae9ce3e2b8cdce87f0ff2e440d1fdfcbfb DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ry.rs; s=x; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Date:Subject: Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=3Jz+Vpo2Q4DISj7qHEiqVsrTc8aX2z3c0jZHf+s+Wqc=; b=HZHmyhtlc0xRQUJhh/Ln+OwdWY o/AGbHzNGr3GhaG6yfXkUXMOzx9D/HO0THwYanNHuPXNVki5QZTrRXyX94cfpQ9BbdbShtM6VyUVF jIwDd5yKMsjVHuZME7ytn3x1WFoYpmCO6bdlzi6lsioTreAh1/8Gpx9TDfq12fyxuQdTmGt8vKdrO faVkSvq+FF60WCiY5+8ffUrYRCm76KGT7Bu4NEKOO283O8U/qV+8RpoKztzOFzJQi542OEnsN9HvA +YzY8sA24681CPvA0K1ujT/xEpO4aXfwplCUD0KV9oA3za6oBBrns3FCoPj1sbg1BtgSHaYmxH5W3 vEDNvvUw==; From: Zijing Zhang To: dakr@kernel.org, ojeda@kernel.org Cc: bhelgaas@google.com, kwilczynski@kernel.org, boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, lossin@kernel.org, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, linux-pci@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, lianux.mm@gmail.com, zijing.kernel@gmail.com Subject: [RFC PATCH 1/2] rust: pci: add config space accessors Date: Fri, 30 Jan 2026 17:10:25 +0000 Message-ID: <20260130171026.1138617-2-zijing.zhang@ry.rs> In-Reply-To: <20260130171026.1138617-1-zijing.zhang@ry.rs> References: <20260130171026.1138617-1-zijing.zhang@ry.rs> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authenticated-Id: zijing.zhang@ry.rs Content-Type: text/plain; charset="utf-8" Add basic PCI config space accessors to kernel::pci::Device. The underlying C helpers may return positive PCIBIOS status codes; map them to standard -errno values for Rust callers. Signed-off-by: Zijing Zhang Tested-by: Charalampos Mitrodimas --- rust/kernel/pci.rs | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index bea76ca9c3da..229290ffde47 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -47,6 +47,26 @@ IrqVector, // }; =20 +// Mirrors `pcibios_err_to_errno()` in `include/linux/pci.h`. +// +// That helper is a C `static inline` and thus not directly callable from = Rust. +// We keep the mapping local to this module so the `Device` API stays focu= sed. +fn pcibios_err_to_errno(err: c_int) -> c_int { + if err <=3D 0 { + return err; + } + + match err as u32 { + bindings::PCIBIOS_FUNC_NOT_SUPPORTED =3D> -(bindings::ENOENT as c_= int), + bindings::PCIBIOS_BAD_VENDOR_ID =3D> -(bindings::ENOTTY as c_int), + bindings::PCIBIOS_DEVICE_NOT_FOUND =3D> -(bindings::ENODEV as c_in= t), + bindings::PCIBIOS_BAD_REGISTER_NUMBER =3D> -(bindings::EFAULT as c= _int), + bindings::PCIBIOS_SET_FAILED =3D> -(bindings::EIO as c_int), + bindings::PCIBIOS_BUFFER_TOO_SMALL =3D> -(bindings::ENOSPC as c_in= t), + _ =3D> -(bindings::ERANGE as c_int), + } +} + /// An adapter for the registration of PCI drivers. pub struct Adapter(T); =20 @@ -436,6 +456,72 @@ pub fn pci_class(&self) -> Class { // SAFETY: `self.as_raw` is a valid pointer to a `struct pci_dev`. Class::from_raw(unsafe { (*self.as_raw()).class }) } + + /// Reads a byte from PCI config space. + /// + /// `offset` is the config-space offset. For PCIe devices this may cov= er the extended config + /// space. + pub fn read_config_u8(&self, offset: u16) -> Result { + let offset =3D c_int::from(offset); + let mut val =3D 0u8; + + // SAFETY: `self.as_raw()` points to a valid `struct pci_dev` and = `val` is a valid out + // pointer. + let err =3D unsafe { bindings::pci_read_config_byte(self.as_raw(),= offset, &mut val) }; + to_result(pcibios_err_to_errno(err))?; + Ok(val) + } + + /// Reads a 16-bit word from PCI config space. + pub fn read_config_u16(&self, offset: u16) -> Result { + let offset =3D c_int::from(offset); + let mut val =3D 0u16; + + // SAFETY: `self.as_raw()` points to a valid `struct pci_dev` and = `val` is a valid out + // pointer. + let err =3D unsafe { bindings::pci_read_config_word(self.as_raw(),= offset, &mut val) }; + to_result(pcibios_err_to_errno(err))?; + Ok(val) + } + + /// Reads a 32-bit dword from PCI config space. + pub fn read_config_u32(&self, offset: u16) -> Result { + let offset =3D c_int::from(offset); + let mut val =3D 0u32; + + // SAFETY: `self.as_raw()` points to a valid `struct pci_dev` and = `val` is a valid out + // pointer. + let err =3D unsafe { bindings::pci_read_config_dword(self.as_raw()= , offset, &mut val) }; + to_result(pcibios_err_to_errno(err))?; + Ok(val) + } + + /// Writes a byte to PCI config space. + pub fn write_config_u8(&self, offset: u16, val: u8) -> Result { + let offset =3D c_int::from(offset); + + // SAFETY: `self.as_raw()` points to a valid `struct pci_dev`. + let err =3D unsafe { bindings::pci_write_config_byte(self.as_raw()= , offset, val) }; + to_result(pcibios_err_to_errno(err)) + } + + /// Writes a 16-bit word to PCI config space. + pub fn write_config_u16(&self, offset: u16, val: u16) -> Result { + let offset =3D c_int::from(offset); + + // SAFETY: `self.as_raw()` points to a valid `struct pci_dev`. + let err =3D unsafe { bindings::pci_write_config_word(self.as_raw()= , offset, val) }; + to_result(pcibios_err_to_errno(err)) + } + + /// Writes a 32-bit dword to PCI config space. + pub fn write_config_u32(&self, offset: u16, val: u32) -> Result { + let offset =3D c_int::from(offset); + + // SAFETY: `self.as_raw()` points to a valid `struct pci_dev`. + let err =3D unsafe { bindings::pci_write_config_dword(self.as_raw(= ), offset, val) }; + to_result(pcibios_err_to_errno(err)) + } } =20 impl Device { --=20 2.52.0 From nobody Mon Feb 9 14:00:26 2026 Received: from mail-108-mta205.mxroute.com (mail-108-mta205.mxroute.com [136.175.108.205]) (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 71ABD34EF00 for ; Fri, 30 Jan 2026 17:15:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=136.175.108.205 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769793356; cv=none; b=SiRR7TNs4vcHQsx5jByHKua3itG5aqsfrGOjiekWYelxBB5LRyBGNoC5iWjVQUZzi1EgGS3B6dDyVOzV9fB/rZJZVnmucFoSOSHTcdvu84m+f30o+fSJ98xdMHvY8uIjKVQGtqkxSwLoKQPNAXXheKp1piNQR5M5EPluOy7HSeQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769793356; c=relaxed/simple; bh=cYyMP1D1VmWpyZq1VPLJ8ysSlkPNqBL0DtEmhjw9gs8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fn53RezYecMSMjYlYdcsOyQfWf8Ic6/oRW4Tdb6RdhsUztMfWJgVHVpk8E4HJWf9doiQo8Du8kws411BlCdHD6E8aq7LvStLxws1rxZIzTmAr4XQtw/h0wJ2y5X2hNvSqcIKn753GTWU2XmReM4e5wRY9ddeXVjnik7EUAKQAHE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ry.rs; spf=pass smtp.mailfrom=ry.rs; dkim=pass (2048-bit key) header.d=ry.rs header.i=@ry.rs header.b=dkS/yjIx; arc=none smtp.client-ip=136.175.108.205 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ry.rs Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ry.rs Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ry.rs header.i=@ry.rs header.b="dkS/yjIx" Received: from filter006.mxroute.com ([136.175.111.3] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta205.mxroute.com (ZoneMTA) with ESMTPSA id 19c0fe2bd700009140.00e for (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Fri, 30 Jan 2026 17:10:43 +0000 X-Zone-Loop: 10a92ce64935869b6d8d02a2af9b24a71dd5ea6aa65f DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ry.rs; s=x; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Date:Subject: Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=kH57leTTdfpWogTRi3zgCMej4drAoFHmuSePcQxRPRo=; b=dkS/yjIxSnd9/eOtuTvWnFChAc gkqjlywPR3F9Lay+zJIcKqoS0EQIKAf7QY7GmjaUmGivyIH09jb84Afl1yt9qW6l1u7fSoj7X1c+3 c4VTsbBZHkAdd9J1pieKxe+2kzvRbUo7VVE+qt6Wo3stsap7t2gab4yo4CfjBeRueFOfqoPHIxH9g QdSB70OkBTx6AaScuFZOiTLg9BQZPwu9YfSRZxYn5Ef6G81whdzNbRhGraFptkDCCRqDR4n9PFQgz isqavMpd6D4g0sX1w9JB6W91glfW38H8wEJ3ouZbjZafyJKCrWsPvYb6PoF+XOpM1HK1ameREU6GO 8zAO4QZQ==; From: Zijing Zhang To: dakr@kernel.org, ojeda@kernel.org Cc: bhelgaas@google.com, kwilczynski@kernel.org, boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, lossin@kernel.org, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, linux-pci@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, lianux.mm@gmail.com, zijing.kernel@gmail.com Subject: [RFC PATCH 2/2] samples: rust: pci: exercise config space accessors Date: Fri, 30 Jan 2026 17:10:26 +0000 Message-ID: <20260130171026.1138617-3-zijing.zhang@ry.rs> In-Reply-To: <20260130171026.1138617-1-zijing.zhang@ry.rs> References: <20260130171026.1138617-1-zijing.zhang@ry.rs> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authenticated-Id: zijing.zhang@ry.rs Content-Type: text/plain; charset="utf-8" Use the new PCI config space accessors from the Rust PCI sample driver. Signed-off-by: Zijing Zhang Tested-by: Charalampos Mitrodimas --- samples/rust/rust_driver_pci.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/samples/rust/rust_driver_pci.rs b/samples/rust/rust_driver_pci= .rs index fa677991a5c4..1089352626fc 100644 --- a/samples/rust/rust_driver_pci.rs +++ b/samples/rust/rust_driver_pci.rs @@ -68,11 +68,15 @@ impl pci::Driver for SampleDriver { fn probe(pdev: &pci::Device, info: &Self::IdInfo) -> impl PinIni= t { pin_init::pin_init_scope(move || { let vendor =3D pdev.vendor_id(); + let vendor_cfg =3D pdev.read_config_u16(0x00)?; + let device_cfg =3D pdev.read_config_u16(0x02)?; dev_dbg!( pdev.as_ref(), - "Probe Rust PCI driver sample (PCI ID: {}, 0x{:x}).\n", + "Probe Rust PCI driver sample (PCI ID: {}, 0x{:x}; cfg: 0x= {:04x}:0x{:04x}).\n", vendor, - pdev.device_id() + pdev.device_id(), + vendor_cfg, + device_cfg, ); =20 pdev.enable_device_mem()?; --=20 2.52.0