rust: device: support `dev_printk` on all devices
Subsystems (12)
PATCH v2 1/8 rust: device: support `dev_printk` on all devices
From: Gary Guo <[email protected]>
Currently, dev_* only works on the core Device, but not on any other bus or class device objects. This causes a pattern of dev_info!(pdev.as_ref()) which is not ideal.
This adds support of using these devices directly with dev_* macros, by adding AsRef call inside the macro. To make sure we can still use just kernel::device::Device, as AsRef implementation is added for it; this is typical for types that is designed to use with AsRef anyway, for example, str implements AsRef<str> and Path implements AsRef<Path>.
---
Notes:
v1 -> v2:
- split change to samples/rust to subsystems
- converted more cases where as_ref() is only for dev_printk
- Link to v1: https://lore.kernel.org/rust-for-linux/[email protected]/
rust/kernel/device.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
rust/kernel/device.rs +8 -1
@@ -601,6 +601,13 @@ impl DeviceContext for Core {}impl DeviceContext for CoreInternal {}impl DeviceContext for Normal {} +impl <Ctx :DeviceContext >AsRef <Device <Ctx >>for Device <Ctx > { +#[inline] +fn as_ref (&self) -> &Device <Ctx > { + self + } +} +/// Convert device references to bus device references. /// /// Bus devices can implement this trait to allow abstractions to provide the bus device in
@@ -720,7 +727,7 @@ macro_rules! impl_device_context_into_aref {macro_rules! dev_printk { ($method:ident, $dev:expr, $($f:tt)*) => { { - ($dev).$method($crate::prelude::fmt!($($f)*)); + $crate::device::Device ::$method($dev.as_ref (), $crate::prelude::fmt!($($f)*)) } } }
base-commit: a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d
Signature · 1 line
2.51.2
PATCH v2 2/8 rust: pci: remove redundant `.as_ref()` for `dev_*` print
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- rust/kernel/pci.rs | 2 +- rust/kernel/pci/id.rs | 2 +- samples/rust/rust_driver_pci.rs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-)
rust/kernel/pci.rs +1 -1
@@ -351,7 +351,7 @@ impl Device {/// // Get an instance of `Vendor`. /// let vendor = pdev.vendor_id(); /// dev_info!( -/// pdev.as_ref(), +/// pdev, /// "Device: Vendor={}, Device=0x{:x}\n", /// vendor, /// pdev.device_id()
rust/kernel/pci/id.rs +1 -1
@@ -22,7 +22,7 @@/// fn probe_device(pdev: &pci::Device<Core>) -> Result { /// let pci_class = pdev.pci_class(); /// dev_info!( -/// pdev.as_ref(), +/// pdev, /// "Detected PCI class: {}\n", /// pci_class /// );
samples/rust/rust_driver_pci.rs +3 -3
@@ -75,7 +75,7 @@ fn probe(pdev: &pci::Device<Core>, info: &Self::IdInfo) -> impl PinInit<Self, Er pin_init::pin_init_scope(move || { let vendor = pdev.vendor_id(); dev_dbg!( - pdev.as_ref(), + pdev, "Probe Rust PCI driver sample (PCI ID: {}, 0x{:x}).\n", vendor, pdev.device_id()
@@ -91,7 +91,7 @@ fn probe(pdev: &pci::Device<Core>, info: &Self::IdInfo) -> impl PinInit<Self, Erlet bar = bar.access (pdev.as_ref ())?;dev_info! ( - pdev.as_ref (), + pdev,"pci-testdev data-match count: {}\n" ,Self ::testdev (info, bar)? );
@@ -112,7 +112,7 @@ fn unbind(pdev: &pci::Device<Core>, this: Pin<&Self>) {#[pinned_drop] impl PinnedDrop for SampleDriver {fn drop (self:Pin <&mut Self >) { -dev_dbg! (self.pdev.as_ref (),"Remove Rust PCI driver sample.\n" ); +dev_dbg! (self.pdev,"Remove Rust PCI driver sample.\n" ); } }
Signature · 1 line
2.51.2
Danilo Krummrich
maintainerRe: [PATCH v2 2/8] rust: pci: remove redundant `.as_ref()` for `dev_*` print
Quoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>
Applied to driver-core-testing, thanks!
PATCH v2 3/8 rust: samples: driver-core: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoFrom: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- samples/rust/rust_driver_auxiliary.rs | 2 +- samples/rust/rust_driver_faux.rs | 2 +- samples/rust/rust_driver_platform.rs | 2 +- samples/rust/rust_soc.rs | 4 +--- 4 files changed, 4 insertions(+), 6 deletions(-)
samples/rust/rust_driver_auxiliary.rs +1 -1
@@ -39,7 +39,7 @@ impl auxiliary::Driver for AuxiliaryDriver {fn probe (adev: &auxiliary::Device <Core >, _info: &Self ::IdInfo ) ->impl PinInit <Self ,Error > {dev_info! ( - adev.as_ref (), + adev,"Probing auxiliary driver for auxiliary device with id={}\n" , adev.id () );
samples/rust/rust_driver_faux.rs +1 -1
@@ -26,7 +26,7 @@ fn init(_module: &'static ThisModule) -> Result<Self> {let reg = faux::Registration ::new (c"rust-faux-sample-device" ,None )?; -dev_info! (reg.as_ref (),"Hello from faux device!\n" ); +dev_info! (reg,"Hello from faux device!\n" );Ok (Self { _reg: reg }) }
samples/rust/rust_driver_platform.rs +1 -1
@@ -180,7 +180,7 @@ fn properties_parse(dev: &device::Device) -> Result {impl Drop for SampleDriver {fn drop (&mut self) { -dev_dbg! (self.pdev.as_ref (),"Remove Rust Platform driver sample.\n" ); +dev_dbg! (self.pdev,"Remove Rust Platform driver sample.\n" ); } }
samples/rust/rust_soc.rs +1 -3
@@ -44,9 +44,7 @@ fn probe( pdev: &platform::Device<Core>, _info: Option<&Self::IdInfo>, ) -> impl PinInit<Self, Error> { -let dev = pdev.as_ref (); - -dev_dbg! (dev,"Probe Rust SoC driver sample.\n" ); +dev_dbg! (pdev,"Probe Rust SoC driver sample.\n" );let pdev = pdev.into ();pin_init_scope (move || {
Signature · 1 line
2.51.2
Danilo Krummrich
maintainerRe: [PATCH v2 3/8] rust: samples: driver-core: remove redundant `.as_ref()` for `dev_*` print
Quoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>
Applied to driver-core-testing, thanks!
PATCH v2 4/8 rust: samples: dma: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoFrom: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- samples/rust/rust_dma.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
samples/rust/rust_dma.rs +3 -5
@@ -57,7 +57,7 @@ impl pci::Driver for DmaSampleDriver {fn probe (pdev: &pci::Device <Core >, _info: &Self ::IdInfo ) ->impl PinInit <Self ,Error > { pin_init::pin_init_scope (move || { -dev_info! (pdev.as_ref (),"Probe DMA test driver.\n" ); +dev_info! (pdev,"Probe DMA test driver.\n" );let mask =DmaMask ::new ::<64 >();
@@ -88,9 +88,7 @@ fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, E#[pinned_drop] impl PinnedDrop for DmaSampleDriver {fn drop (self:Pin <&mut Self >) { -let dev = self.pdev.as_ref (); - -dev_info! (dev,"Unload DMA test driver.\n" ); +dev_info! (self.pdev,"Unload DMA test driver.\n" );for (i, value)in TEST_VALUES .into_iter ().enumerate () {let val0 = kernel::dma_read!(self.ca[i].h);
@@ -107,7 +105,7 @@ fn drop(self: Pin<&mut Self>) { }for (i, entry)in self.sgt.iter ().enumerate () { -dev_info! (dev,"Entry[{}]: DMA address: {:#x}" , i, entry.dma_address ()); +dev_info! (self.pdev,"Entry[{}]: DMA address: {:#x}" , i, entry.dma_address ()); } } }
Signature · 1 line
2.51.2
Danilo Krummrich
maintainerRe: [PATCH v2 4/8] rust: samples: dma: remove redundant `.as_ref()` for `dev_*` print
Quoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>
Applied to driver-core-testing, thanks!
PATCH v2 5/8 rust: samples: i2c: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoFrom: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- samples/rust/rust_driver_i2c.rs | 10 ++++------ samples/rust/rust_i2c_client.rs | 10 ++-------- 2 files changed, 6 insertions(+), 14 deletions(-)
samples/rust/rust_driver_i2c.rs +4 -6
@@ -44,23 +44,21 @@ fn probe( idev: &i2c::I2cClient<Core>, info: Option<&Self::IdInfo>, ) -> impl PinInit<Self, Error> { -let dev = idev.as_ref (); - -dev_info! (dev,"Probe Rust I2C driver sample.\n" ); +dev_info! (idev,"Probe Rust I2C driver sample.\n" );if let Some (info) = info { -dev_info! (dev,"Probed with info: '{}'.\n" , info); +dev_info! (idev,"Probed with info: '{}'.\n" , info); }Ok (Self ) } fn shutdown(idev: &i2c::I2cClient<Core>, _this: Pin<&Self>) { -dev_info! (idev.as_ref (),"Shutdown Rust I2C driver sample.\n" ); +dev_info! (idev,"Shutdown Rust I2C driver sample.\n" ); }fn unbind (idev: &i2c::I2cClient <Core >, _this:Pin <&Self >) { -dev_info! (idev.as_ref (),"Unbind Rust I2C driver sample.\n" ); +dev_info! (idev,"Unbind Rust I2C driver sample.\n" ); } }
samples/rust/rust_i2c_client.rs +2 -8
@@ -113,10 +113,7 @@ fn probe( pdev: &platform::Device<device::Core>, _info: Option<&Self::IdInfo>, ) -> impl PinInit<Self, Error> { -dev_info! ( - pdev.as_ref (), -"Probe Rust I2C Client registration sample.\n" - ); +dev_info! (pdev,"Probe Rust I2C Client registration sample.\n" ); kernel::try_pin_init!(Self { parent_dev: pdev.into (),
@@ -130,10 +127,7 @@ fn probe( }fn unbind (pdev: &platform::Device <device::Core >, _this:Pin <&Self >) { -dev_info! ( - pdev.as_ref (), -"Unbind Rust I2C Client registration sample.\n" - ); +dev_info! (pdev,"Unbind Rust I2C Client registration sample.\n" ); } }
Signature · 1 line
2.51.2
Re: [PATCH v2 5/8] rust: samples: i2c: remove redundant `.as_ref()` for `dev_*` print
Hi
Quoted 60 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>--- samples/rust/rust_driver_i2c.rs | 10 ++++------ samples/rust/rust_i2c_client.rs | 10 ++-------- 2 files changed, 6 insertions(+), 14 deletions(-)samples/rust/rust_driver_i2c.rs +4
-6@@ -44,23 +44,21 @@ fn probe( idev: &i2c::I2cClient<Core>, info: Option<&Self::IdInfo>, ) -> impl PinInit<Self, Error> { -let dev = idev.as_ref (); - -dev_info! (dev,"Probe Rust I2C driver sample.\n" ); +dev_info! (idev,"Probe Rust I2C driver sample.\n" );if let Some (info) = info { -dev_info! (dev,"Probed with info: '{}'.\n" , info); +dev_info! (idev,"Probed with info: '{}'.\n" , info); }Ok (Self ) } fn shutdown(idev: &i2c::I2cClient<Core>, _this: Pin<&Self>) { -dev_info! (idev.as_ref (),"Shutdown Rust I2C driver sample.\n" ); +dev_info! (idev,"Shutdown Rust I2C driver sample.\n" ); }fn unbind (idev: &i2c::I2cClient <Core >, _this:Pin <&Self >) { -dev_info! (idev.as_ref (),"Unbind Rust I2C driver sample.\n" ); +dev_info! (idev,"Unbind Rust I2C driver sample.\n" ); } }samples/rust/rust_i2c_client.rs +1
-4@@ -113,10 +113,7 @@ fn probe( pdev: &platform::Device<device::Core>, _info: Option<&Self::IdInfo>, ) -> impl PinInit<Self, Error> { -dev_info! ( - pdev.as_ref (), -"Probe Rust I2C Client registration sample.\n" - ); +dev_info! (pdev,"Probe Rust I2C Client registration sample.\n" ); kernel::try_pin_init!(Self { parent_dev: pdev.into (),@@ -130,10 +127,7 @@ fn probe( }
samples/rust/rust_i2c_client.rs fn probe( · line 133
Quoted 10 lines
samples/rust/rust_i2c_client.rs +1
-4fn unbind (pdev: &platform::Device <device::Core >, _this:Pin <&Self >) { -dev_info! ( - pdev.as_ref (), -"Unbind Rust I2C Client registration sample.\n" - ); +dev_info! (pdev,"Unbind Rust I2C Client registration sample.\n" ); } }
Thanks
Igor
PATCH v2 6/8 rust: samples: usb: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoFrom: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- samples/rust/rust_driver_usb.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
samples/rust/rust_driver_usb.rs +2 -4
@@ -33,15 +33,13 @@ fn probe( _id: &usb::DeviceId, _info: &Self::IdInfo, ) -> impl PinInit<Self, Error> { -let dev: &device::Device <Core > = intf.as_ref (); -dev_info! (dev,"Rust USB driver sample probed\n" ); +dev_info! (intf,"Rust USB driver sample probed\n" ); Ok(Self { _intf: intf.into() }) }fn disconnect (intf: &usb::Interface <Core >, _data:Pin <&Self >) { -let dev: &device::Device <Core > = intf.as_ref (); -dev_info! (dev,"Rust USB driver sample disconnected\n" ); +dev_info! (intf,"Rust USB driver sample disconnected\n" ); } }
Signature · 1 line
2.51.2
kernel test robot
build botRe: [PATCH v2 6/8] rust: samples: usb: remove redundant `.as_ref()` for `dev_*` print
kernel test robot noticed the following build warnings:
Hi Gary,
kernel test robot noticed the following build warnings:
[auto build test WARNING on a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d]
url: https://github.com/intel-lab-lkp/linux/commits/Gary-Guo/rust-pci-remove-redundant-as_ref-for-dev_-print/20260124-020452 base: a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d patch link: https://lore.kernel.org/r/20260123175854.176735-6-gary%40kernel.org patch subject: [PATCH v2 6/8] rust: samples: usb: remove redundant `.as_ref()` for `dev_*` print config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20260124/[email protected]/config) compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261) rustc: rustc 1.88.0 (6b00bc388 2025-06-23) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260124/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> warning: unused import: `self`
--> samples/rust/rust_driver_usb.rs:8:9 |
8 | self,
| ^^^^
|
= note: #[warn(unused_imports)] on by default
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
PATCH v2 7/8 gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoFrom: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- drivers/gpu/nova-core/driver.rs | 2 +- drivers/gpu/nova-core/gpu.rs | 4 ++-- drivers/gpu/nova-core/gsp/boot.rs | 32 +++++++------------------------ 3 files changed, 10 insertions(+), 28 deletions(-)
drivers/gpu/nova-core/driver.rs +1 -1
@@ -70,7 +70,7 @@ impl pci::Driver for NovaCore {fn probe (pdev: &pci::Device <Core >, _info: &Self ::IdInfo ) ->impl PinInit <Self ,Error > { pin_init::pin_init_scope (move || { -dev_dbg! (pdev.as_ref (),"Probe Nova Core GPU driver.\n" ); +dev_dbg! (pdev,"Probe Nova Core GPU driver.\n" ); pdev.enable_device_mem ()?; pdev.set_master ();
drivers/gpu/nova-core/gpu.rs +2 -2
@@ -262,13 +262,13 @@ pub(crate) fn new<'a>( ) -> impl PinInit<Self, Error> + 'a {try_pin_init! (Self { spec:Spec ::new (pdev.as_ref (), bar).inspect (|spec| { -dev_info! (pdev.as_ref (),"NVIDIA ({})\n" , spec); +dev_info! (pdev,"NVIDIA ({})\n" , spec); })?,// We must wait for GFW_BOOT completion before doing any significant setup on the GPU. _: { gfw::wait_gfw_boot_completion (bar) - .inspect_err (|_|dev_err! (pdev.as_ref (),"GFW boot did not complete\n" ))?; + .inspect_err (|_|dev_err! (pdev,"GFW boot did not complete\n" ))?; }, sysmem_flush:SysmemFlush ::register (pdev.as_ref (), bar, spec.chipset)?,
drivers/gpu/nova-core/gsp/boot.rs +7 -25
@@ -170,15 +170,10 @@ pub(crate) fn boot( Some(libos_handle as u32), Some((libos_handle >> 32) as u32), )?; -dev_dbg! ( - pdev.as_ref (), -"GSP MBOX0: {:#x}, MBOX1: {:#x}\n" , - mbox0, - mbox1 - ); +dev_dbg! (pdev,"GSP MBOX0: {:#x}, MBOX1: {:#x}\n" , mbox0, mbox1);dev_dbg! ( - pdev.as_ref (), + pdev,"Using SEC2 to load and run the booter_load firmware...\n" );
@@ -190,19 +185,10 @@ pub(crate) fn boot( Some(wpr_handle as u32), Some((wpr_handle >> 32) as u32), )?; -dev_dbg! ( - pdev.as_ref (), -"SEC2 MBOX0: {:#x}, MBOX1{:#x}\n" , - mbox0, - mbox1 - ); +dev_dbg! (pdev,"SEC2 MBOX0: {:#x}, MBOX1{:#x}\n" , mbox0, mbox1);if mbox0 !=0 { -dev_err! ( - pdev.as_ref (), -"Booter-load failed with error {:#x}\n" , - mbox0 - ); +dev_err! (pdev,"Booter-load failed with error {:#x}\n" , mbox0);return Err (ENODEV ); }
@@ -216,11 +202,7 @@ pub(crate) fn boot( Delta::from_secs(5), )?; -dev_dbg! ( - pdev.as_ref (), -"RISC-V active? {}\n" , - gsp_falcon.is_riscv_active (bar), - ); +dev_dbg! (pdev,"RISC-V active? {}\n" , gsp_falcon.is_riscv_active (bar),);// Create and run the GSP sequencer. let seq_params =GspSequencerParams {
@@ -239,8 +221,8 @@ pub(crate) fn boot(// Obtain and display basic GPU information. let info = commands::get_gsp_info (&mut self.cmdq, bar)?;match info.gpu_name () { -Ok (name) =>dev_info! (pdev.as_ref (),"GPU name: {}\n" , name), -Err (e) =>dev_warn! (pdev.as_ref (),"GPU name unavailable: {:?}\n" , e), +Ok (name) =>dev_info! (pdev,"GPU name: {}\n" , name), +Err (e) =>dev_warn! (pdev,"GPU name unavailable: {:?}\n" , e), }Ok (())
Signature · 1 line
2.51.2
Re: [PATCH v2 7/8] gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
Quoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>
Danilo Krummrich
maintainerRe: [PATCH v2 7/8] gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
Quoted 8 lines · Alexandre Courbot
Quoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>
We should take this through drm-rust in the next cycle to avoid conflicts.
Alexandre Courbot
maintainerRe: [PATCH v2 7/8] gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
Quoted 11 lines · Danilo Krummrich
Quoted 8 lines · Alexandre Courbot
Quoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>We should take this through drm-rust in the next cycle to avoid conflicts.
Took into my queue for merging into drm-rust-next as soon as it repoens.
Re: [PATCH v2 7/8] gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoQuoted 5 lines · Gary Guo
From: Gary Guo <[email protected]>
This is now handled by the macro itself.
Signed-off-by Gary Guo <[email protected]>
Applied to drm-rust-next, thanks!
Re: [PATCH v2 7/8] gpu: nova-core: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoQuoted 1 line · Gary Guo
+ dev_dbg!(pdev, "SEC2 MBOX0: {:#x}, MBOX1{:#x}\n", mbox0, mbox1);
Nit: Missing colon after MBOX1, should it be MBOX1: {:#x}.
Thanks!
PATCH v2 8/8 gpu: tyr: remove redundant `.as_ref()` for `dev_*` print
In reply to Gary GuoFrom: Gary Guo <[email protected]>
This is now handled by the macro itself.
--- drivers/gpu/drm/tyr/driver.rs | 2 +- drivers/gpu/drm/tyr/gpu.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/tyr/driver.rs +1 -1
@@ -140,7 +140,7 @@ fn probe(// We need this to be dev_info!() because dev_dbg!() does not work at // all in Rust for now, and we need to see whether probe succeeded. -dev_info! (pdev.as_ref (),"Tyr initialized correctly.\n" ); +dev_info! (pdev,"Tyr initialized correctly.\n" );Ok (driver) } }
drivers/gpu/drm/tyr/gpu.rs +3 -3
@@ -98,7 +98,7 @@ pub(crate) fn log(&self, pdev: &platform::Device) { };dev_info! ( - pdev.as_ref (), + pdev,"mali-{} id 0x{:x} major 0x{:x} minor 0x{:x} status 0x{:x}" , model_name, self.gpu_id >>16 ,
@@ -108,7 +108,7 @@ pub(crate) fn log(&self, pdev: &platform::Device) { );dev_info! ( - pdev.as_ref (), + pdev,"Features: L2:{:#x} Tiler:{:#x} Mem:{:#x} MMU:{:#x} AS:{:#x}" , self.l2_features, self.tiler_features,
@@ -118,7 +118,7 @@ pub(crate) fn log(&self, pdev: &platform::Device) { );dev_info! ( - pdev.as_ref (), + pdev,"shader_present=0x{:016x} l2_present=0x{:016x} tiler_present=0x{:016x}" , self.shader_present, self.l2_present,
Signature · 1 line
2.51.2
Danilo Krummrich
maintainerQuoted 6 lines · Gary Guo
From: Gary Guo <[email protected]>
Currently,
dev_*only works on the coreDevice, but not on any other bus or class device objects. This causes a pattern ofdev_info!(pdev.as_ref())which is not ideal.
Quoted 7 lines
This adds support of using these devices directly with
dev_*macros, by addingAsRefcall inside the macro. To make sure we can still use justkernel::device::Device, asAsRefimplementation is added for it; this is typical for types that is designed to use withAsRefanyway, for example,strimplementsAsRef<str>andPathimplementsAsRef<Path>.Signed-off-by Gary Guo <[email protected]>
Applied to driver-core-testing, thanks!
Quoted 12 lines · Gary Guo
From: Gary Guo <[email protected]>
Currently,
dev_*only works on the coreDevice, but not on any other bus or class device objects. This causes a pattern ofdev_info!(pdev.as_ref())which is not ideal.This adds support of using these devices directly with
dev_*macros, by addingAsRefcall inside the macro. To make sure we can still use justkernel::device::Device, asAsRefimplementation is added for it; this is typical for types that is designed to use withAsRefanyway, for example,strimplementsAsRef<str>andPathimplementsAsRef<Path>.
Quoted 7 lines
Signed-off-by Gary Guo <[email protected]>---
Notes:
v1 -> v2:
- split change tosamples/rustto subsystems
- converted more cases whereas_ref()is only fordev_printk
Many thanks for adding the additional cases!
With the discussion in [1], I think the rule of thumb is now:
* If &Device is only needed specifically for printing, then no .as_ref() and no helper variable are needed any more (as done in this patch series).
* If you already need to obtain &Device not only for printing, but also for other use cases, then a helper variable like let dev = pdev.as_ref(); is fine. An example is probe() in samples/rust/rust_driver_platform.rs [2].
I think we have a trivial warning from the kernel test robot on the USB one, now. But with that fixed (if its not too late already):
Thanks,
Dirk
[1]
https://lore.kernel.org/rust-for-linux/[email protected]/
Quoted 34 lines
- Link to v1: https://lore.kernel.org/rust-for-linux/[email protected]/
rust/kernel/device.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)rust/kernel/device.rs +8
-1@@ -601,6 +601,13 @@ impl DeviceContext for Core {}impl DeviceContext for CoreInternal {}impl DeviceContext for Normal {} +impl <Ctx :DeviceContext >AsRef <Device <Ctx >>for Device <Ctx > { +#[inline] +fn as_ref (&self) -> &Device <Ctx > { + self + } +} +/// Convert device references to bus device references. /// /// Bus devices can implement this trait to allow abstractions to provide the bus device in @@ -720,7 +727,7 @@ macro_rules! impl_device_context_into_aref {macro_rules! dev_printk { ($method:ident, $dev:expr, $($f:tt)*) => { { - ($dev).$method($crate::prelude::fmt!($($f)*)); + $crate::device::Device ::$method($dev.as_ref (), $crate::prelude::fmt!($($f)*)) } } }base-commit:
a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d