mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
Pull driver core updates from Danilo Krummrich:
"Auxiliary:
- Drop call to dev_pm_domain_detach() in auxiliary_bus_probe()
- Optimize logic of auxiliary_match_id()
Rust:
- Auxiliary:
- Use primitive C types from prelude
- DebugFs:
- Add debugfs support for simple read/write files and custom
callbacks through a File-type-based and directory-scope-based
API
- Sample driver code for the File-type-based API
- Sample module code for the directory-scope-based API
- I/O:
- Add io::poll module and implement Rust specific
read_poll_timeout() helper
- IRQ:
- Implement support for threaded and non-threaded device IRQs
based on (&Device<Bound>, IRQ number) tuples (IrqRequest)
- Provide &Device<Bound> cookie in IRQ handlers
- PCI:
- Support IRQ requests from IRQ vectors for a specific
pci::Device<Bound>
- Implement accessors for subsystem IDs, revision, devid and
resource start
- Provide dedicated pci::Vendor and pci::Class types for vendor
and class ID numbers
- Implement Display to print actual vendor and class names; Debug
to print the raw ID numbers
- Add pci::DeviceId::from_class_and_vendor() helper
- Use primitive C types from prelude
- Various minor inline and (safety) comment improvements
- Platform:
- Support IRQ requests from IRQ vectors for a specific
platform::Device<Bound>
- Nova:
- Use pci::DeviceId::from_class_and_vendor() to avoid probing
non-display/compute PCI functions
- Misc:
- Add helper for cpu_relax()
- Update ARef import from sync::aref
sysfs:
- Remove bin_attrs_new field from struct attribute_group
- Remove read_new() and write_new() from struct bin_attribute
Misc:
- Document potential race condition in get_dev_from_fwnode()
- Constify node_group argument in software node registration
functions
- Fix order of kernel-doc parameters in various functions
- Set power.no_pm flag for faux devices
- Set power.no_callbacks flag along with the power.no_pm flag
- Constify the pmu_bus bus type
- Minor spelling fixes"
* tag 'driver-core-6.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core: (43 commits)
rust: pci: display symbolic PCI vendor names
rust: pci: display symbolic PCI class names
rust: pci: fix incorrect platform reference in PCI driver probe doc comment
rust: pci: fix incorrect platform reference in PCI driver unbind doc comment
perf: make pmu_bus const
samples: rust: Add scoped debugfs sample driver
rust: debugfs: Add support for scoped directories
samples: rust: Add debugfs sample driver
rust: debugfs: Add support for callback-based files
rust: debugfs: Add support for writable files
rust: debugfs: Add support for read-only files
rust: debugfs: Add initial support for directories
driver core: auxiliary bus: Optimize logic of auxiliary_match_id()
driver core: auxiliary bus: Drop dev_pm_domain_detach() call
driver core: Fix order of the kernel-doc parameters
driver core: get_dev_from_fwnode(): document potential race
drivers: base: fix "publically"->"publicly"
driver core/PM: Set power.no_callbacks along with power.no_pm
driver core: faux: Set power.no_pm for faux devices
rust: pci: inline several tiny functions
...
108 lines
2.7 KiB
Rust
108 lines
2.7 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Rust DMA api test (based on QEMU's `pci-testdev`).
|
|
//!
|
|
//! To make this driver probe, QEMU must be run with `-device pci-testdev`.
|
|
|
|
use kernel::{
|
|
device::Core,
|
|
dma::{CoherentAllocation, Device, DmaMask},
|
|
pci,
|
|
prelude::*,
|
|
sync::aref::ARef,
|
|
};
|
|
|
|
struct DmaSampleDriver {
|
|
pdev: ARef<pci::Device>,
|
|
ca: CoherentAllocation<MyStruct>,
|
|
}
|
|
|
|
const TEST_VALUES: [(u32, u32); 5] = [
|
|
(0xa, 0xb),
|
|
(0xc, 0xd),
|
|
(0xe, 0xf),
|
|
(0xab, 0xba),
|
|
(0xcd, 0xef),
|
|
];
|
|
|
|
struct MyStruct {
|
|
h: u32,
|
|
b: u32,
|
|
}
|
|
|
|
impl MyStruct {
|
|
fn new(h: u32, b: u32) -> Self {
|
|
Self { h, b }
|
|
}
|
|
}
|
|
// SAFETY: All bit patterns are acceptable values for `MyStruct`.
|
|
unsafe impl kernel::transmute::AsBytes for MyStruct {}
|
|
// SAFETY: Instances of `MyStruct` have no uninitialized portions.
|
|
unsafe impl kernel::transmute::FromBytes for MyStruct {}
|
|
|
|
kernel::pci_device_table!(
|
|
PCI_TABLE,
|
|
MODULE_PCI_TABLE,
|
|
<DmaSampleDriver as pci::Driver>::IdInfo,
|
|
[(pci::DeviceId::from_id(pci::Vendor::REDHAT, 0x5), ())]
|
|
);
|
|
|
|
impl pci::Driver for DmaSampleDriver {
|
|
type IdInfo = ();
|
|
const ID_TABLE: pci::IdTable<Self::IdInfo> = &PCI_TABLE;
|
|
|
|
fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> Result<Pin<KBox<Self>>> {
|
|
dev_info!(pdev.as_ref(), "Probe DMA test driver.\n");
|
|
|
|
let mask = DmaMask::new::<64>();
|
|
|
|
// SAFETY: There are no concurrent calls to DMA allocation and mapping primitives.
|
|
unsafe { pdev.dma_set_mask_and_coherent(mask)? };
|
|
|
|
let ca: CoherentAllocation<MyStruct> =
|
|
CoherentAllocation::alloc_coherent(pdev.as_ref(), TEST_VALUES.len(), GFP_KERNEL)?;
|
|
|
|
for (i, value) in TEST_VALUES.into_iter().enumerate() {
|
|
kernel::dma_write!(ca[i] = MyStruct::new(value.0, value.1))?;
|
|
}
|
|
|
|
let drvdata = KBox::new(
|
|
Self {
|
|
pdev: pdev.into(),
|
|
ca,
|
|
},
|
|
GFP_KERNEL,
|
|
)?;
|
|
|
|
Ok(drvdata.into())
|
|
}
|
|
}
|
|
|
|
impl Drop for DmaSampleDriver {
|
|
fn drop(&mut self) {
|
|
dev_info!(self.pdev.as_ref(), "Unload DMA test driver.\n");
|
|
|
|
for (i, value) in TEST_VALUES.into_iter().enumerate() {
|
|
let val0 = kernel::dma_read!(self.ca[i].h);
|
|
let val1 = kernel::dma_read!(self.ca[i].b);
|
|
assert!(val0.is_ok());
|
|
assert!(val1.is_ok());
|
|
|
|
if let Ok(val0) = val0 {
|
|
assert_eq!(val0, value.0);
|
|
}
|
|
if let Ok(val1) = val1 {
|
|
assert_eq!(val1, value.1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
kernel::module_pci_driver! {
|
|
type: DmaSampleDriver,
|
|
name: "rust_dma",
|
|
authors: ["Abdiel Janulgue"],
|
|
description: "Rust DMA test",
|
|
license: "GPL v2",
|
|
}
|