diff --git a/pcid/src/driver_interface/mod.rs b/pcid/src/driver_interface/mod.rs index cc6dad2392..e563c6d06a 100644 --- a/pcid/src/driver_interface/mod.rs +++ b/pcid/src/driver_interface/mod.rs @@ -7,8 +7,9 @@ use std::os::unix::io::{FromRawFd, RawFd}; use serde::{Serialize, Deserialize, de::DeserializeOwned}; use thiserror::Error; -pub use crate::pci::{PciBar, PciHeader}; +pub use crate::pci::cap::Capability; pub use crate::pci::msi; +pub use crate::pci::{PciBar, PciHeader}; pub mod irq_helpers; @@ -171,6 +172,7 @@ pub enum PcidClientRequest { RequestConfig, RequestHeader, RequestFeatures, + RequestCapabilities, EnableFeature(PciFeature), FeatureStatus(PciFeature), FeatureInfo(PciFeature), @@ -189,6 +191,7 @@ pub enum PcidServerResponseError { #[derive(Debug, Serialize, Deserialize)] #[non_exhaustive] pub enum PcidClientResponse { + Capabilities(Vec), Config(SubdriverArguments), Header(PciHeader), AllFeatures(Vec<(PciFeature, FeatureStatus)>), @@ -258,6 +261,16 @@ impl PcidServerHandle { other => Err(PcidClientHandleError::InvalidResponse(other)), } } + + pub fn get_capabilities(&mut self) -> Result> { + self.send(&PcidClientRequest::RequestCapabilities)?; + + match self.recv()? { + PcidClientResponse::Capabilities(a) => Ok(a), + other => Err(PcidClientHandleError::InvalidResponse(other)), + } + } + pub fn fetch_header(&mut self) -> Result { self.send(&PcidClientRequest::RequestHeader)?; match self.recv()? { diff --git a/pcid/src/main.rs b/pcid/src/main.rs index 98fe46088b..04de72a085 100644 --- a/pcid/src/main.rs +++ b/pcid/src/main.rs @@ -66,6 +66,9 @@ impl DriverHandler { use crate::pci::cap::{MsiCapability, MsixCapability}; match request { + PcidClientRequest::RequestCapabilities => { + PcidClientResponse::Capabilities(self.capabilities.iter().map(|(_, capability)| capability.clone()).collect::>()) + } PcidClientRequest::RequestConfig => { PcidClientResponse::Config(args.clone()) } diff --git a/pcid/src/pci/cap.rs b/pcid/src/pci/cap.rs index 43003fb9a5..02b3301450 100644 --- a/pcid/src/pci/cap.rs +++ b/pcid/src/pci/cap.rs @@ -80,7 +80,7 @@ pub enum MsiCapability { } -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] pub struct PcieCapability { pub pcie_caps: u32, pub dev_caps: u32, @@ -117,7 +117,7 @@ pub struct VendorSpecificCapability { pub data: Vec, } -#[derive(Clone, Debug, Eq, Hash, PartialEq)] +#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] pub enum Capability { Msi(MsiCapability), MsiX(MsixCapability),