From 386a63df422f3b2d5e6eb01bccbea3bae1f202c7 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Tue, 11 Jun 2024 19:18:30 +0200 Subject: [PATCH] pcid: Replace get_capabilities with get_vendor_capabilities While this stops returning raw MSI/MSI-X capabilities from get_capabilities, the same info can be obtained using fetch_all_features and feature_info. --- pcid/src/driver_handler.rs | 7 +++++-- pcid/src/driver_interface/mod.rs | 14 +++++++------- virtio-core/src/probe.rs | 12 +----------- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/pcid/src/driver_handler.rs b/pcid/src/driver_handler.rs index 8cf114276f..c1b08d0937 100644 --- a/pcid/src/driver_handler.rs +++ b/pcid/src/driver_handler.rs @@ -101,10 +101,13 @@ impl DriverHandler { use driver_interface::*; match request { - PcidClientRequest::RequestCapabilities => PcidClientResponse::Capabilities( + PcidClientRequest::RequestVendorCapabilities => PcidClientResponse::VendorCapabilities( self.capabilities .iter() - .map(|capability| capability.clone()) + .filter_map(|capability| match capability { + PciCapability::Vendor(capability) => Some(capability.clone()), + _ => None, + }) .collect::>(), ), PcidClientRequest::RequestConfig => PcidClientResponse::Config(args.clone()), diff --git a/pcid/src/driver_interface/mod.rs b/pcid/src/driver_interface/mod.rs index 4ba2eb789e..70bb982c33 100644 --- a/pcid/src/driver_interface/mod.rs +++ b/pcid/src/driver_interface/mod.rs @@ -8,7 +8,7 @@ use std::os::unix::io::{FromRawFd, RawFd}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use thiserror::Error; -pub use crate::pci::cap::Capability; +pub use crate::pci::cap::VendorSpecificCapability; pub use crate::pci::msi; pub use crate::pci::{FullDeviceId, PciAddress, PciBar}; @@ -192,7 +192,7 @@ pub enum SetFeatureInfo { pub enum PcidClientRequest { RequestConfig, RequestFeatures, - RequestCapabilities, + RequestVendorCapabilities, EnableFeature(PciFeature), FeatureInfo(PciFeature), SetFeatureInfo(SetFeatureInfo), @@ -210,9 +210,9 @@ pub enum PcidServerResponseError { #[derive(Debug, Serialize, Deserialize)] #[non_exhaustive] pub enum PcidClientResponse { - Capabilities(Vec), Config(SubdriverArguments), AllFeatures(Vec), + VendorCapabilities(Vec), FeatureEnabled(PciFeature), FeatureStatus(PciFeature, FeatureStatus), Error(PcidServerResponseError), @@ -247,7 +247,7 @@ pub(crate) fn recv(r: &mut R) -> Result { if length > 0x100_000 { panic!("pcid_interface: buffer too large"); } - let mut data = vec! [0u8; length as usize]; + let mut data = vec![0u8; length as usize]; r.read_exact(&mut data)?; Ok(bincode::deserialize_from(&data[..])?) @@ -277,11 +277,11 @@ impl PcidServerHandle { } } - pub fn get_capabilities(&mut self) -> Result> { - self.send(&PcidClientRequest::RequestCapabilities)?; + pub fn get_vendor_capabilities(&mut self) -> Result> { + self.send(&PcidClientRequest::RequestVendorCapabilities)?; match self.recv()? { - PcidClientResponse::Capabilities(a) => Ok(a), + PcidClientResponse::VendorCapabilities(a) => Ok(a), other => Err(PcidClientHandleError::InvalidResponse(other)), } } diff --git a/virtio-core/src/probe.rs b/virtio-core/src/probe.rs index 7650736993..3cd6d8d8fb 100644 --- a/virtio-core/src/probe.rs +++ b/virtio-core/src/probe.rs @@ -71,17 +71,7 @@ pub fn probe_device(pcid_handle: &mut PcidServerHandle) -> Result let mut notify_addr = None; let mut device_addr = None; - for raw_capability in pcid_handle - .get_capabilities()? - .iter() - .filter_map(|capability| { - if let Capability::Vendor(vendor) = capability { - Some(vendor) - } else { - None - } - }) - { + for raw_capability in pcid_handle.get_vendor_capabilities()? { // SAFETY: We have verified that the length of the data is correct. let capability = unsafe { &*(raw_capability.data.as_ptr() as *const PciCapability) };