pcics

Crates.iopcics
lib.rspcics
version0.3.2
sourcesrc
created_at2022-01-11 12:53:24.161819
updated_at2024-05-07 07:57:03.927502
descriptionPCI configuration space access library
homepagehttps://github.com/pepyaka/pcics
repositoryhttps://github.com/pepyaka/pcics
max_upload_size
id512219
size734,838
Mikhail Bratchikov (pepyaka)

documentation

https://docs.rs/pcics

README

PCI configuration space

PCI configuration space is the underlying way that the Conventional PCI, PCI-X and PCI Express perform auto configuration of the cards inserted into their bus.

This library implements decoding PCI configuration space and PCI Express extended configuration space.

Design

The main purpose of this library is to represent configuration space data as a hierarchical structures. Therefore, CPU and memory usage may not be optimal.

The library is divided into three parts:

Usage

# use pcics::{
#     DDR_OFFSET, ECS_OFFSET,
#     capabilities::{
#         bridge_subsystem_vendor_id::BridgeSubsystemVendorId, Capability, CapabilityKind,
#     },
#     extended_capabilities::{
#         vendor_specific_extended_capability::VendorSpecificExtendedCapability,
#         ExtendedCapability, ExtendedCapabilityKind,
#     },
#     Capabilities, ExtendedCapabilities, Header,
# };
let conf_space_data = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/tests/data/device/8086_2030/config"
));

let header = Header::try_from(&conf_space_data[..DDR_OFFSET]).unwrap();
assert_eq!((0x8086, 0x2030), (header.vendor_id, header.device_id));

let mut caps = Capabilities::new(&conf_space_data[DDR_OFFSET..ECS_OFFSET], &header);
let BridgeSubsystemVendorId {
    subsystem_vendor_id,
    ..
} = caps
    .find_map(|cap| {
        if let Ok(Capability {
            kind: CapabilityKind::BridgeSubsystemVendorId(ssvid),
            ..
        }) = cap
        {
            Some(ssvid)
        } else {
            None
        }
    })
    .unwrap();
assert_eq!(0x8086, subsystem_vendor_id);

let mut ecaps = ExtendedCapabilities::new(&conf_space_data[ECS_OFFSET..]);
let VendorSpecificExtendedCapability { header, .. } = ecaps
    .find_map(|ecap| {
        if let Ok(ExtendedCapability {
            kind: ExtendedCapabilityKind::VendorSpecificExtendedCapability(vsec),
            ..
        }) = ecap
        {
            Some(vsec)
        } else {
            None
        }
    })
    .unwrap();
assert_eq!(0x0c, header.vsec_length);

More detailed usage in modules descriptions

Commit count: 78

cargo fmt