Skip to main content

chipset_legacy/i440bx_host_pci_bridge/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resolver for the i440BX Host-PCI Bridge device.
5
6use super::HostPciBridge;
7use async_trait::async_trait;
8use chipset_device_resources::ResolveChipsetDeviceHandleParams;
9use chipset_device_resources::ResolvedChipsetDevice;
10use chipset_resources::i440bx_host_pci_bridge::AdjustGpaRangeHandleKind;
11use chipset_resources::i440bx_host_pci_bridge::I440BxHostPciBridgeDeviceHandle;
12use chipset_resources::i440bx_host_pci_bridge::ResolvedAdjustGpaRange;
13use thiserror::Error;
14use vm_resource::AsyncResolveResource;
15use vm_resource::ResolveError;
16use vm_resource::ResourceResolver;
17use vm_resource::declare_static_async_resolver;
18use vm_resource::kind::ChipsetDeviceHandleKind;
19
20/// A resolver for the i440BX Host-PCI Bridge device.
21pub struct I440BxHostPciBridgeResolver;
22
23declare_static_async_resolver! {
24    I440BxHostPciBridgeResolver,
25    (ChipsetDeviceHandleKind, I440BxHostPciBridgeDeviceHandle),
26}
27
28/// Errors that can occur when resolving an i440BX Host-PCI Bridge device.
29#[derive(Debug, Error)]
30#[expect(missing_docs)]
31pub enum ResolveI440BxHostPciBridgeError {
32    #[error("failed to resolve adjust_gpa_range platform resource")]
33    ResolveAdjustGpaRange(#[source] ResolveError),
34}
35
36#[async_trait]
37impl AsyncResolveResource<ChipsetDeviceHandleKind, I440BxHostPciBridgeDeviceHandle>
38    for I440BxHostPciBridgeResolver
39{
40    type Output = ResolvedChipsetDevice;
41    type Error = ResolveI440BxHostPciBridgeError;
42
43    async fn resolve(
44        &self,
45        resolver: &ResourceResolver,
46        resource: I440BxHostPciBridgeDeviceHandle,
47        input: ResolveChipsetDeviceHandleParams<'_>,
48    ) -> Result<Self::Output, Self::Error> {
49        let ResolvedAdjustGpaRange(adjust_gpa_range) = resolver
50            .resolve::<AdjustGpaRangeHandleKind, _>(resource.adjust_gpa_range, ())
51            .await
52            .map_err(ResolveI440BxHostPciBridgeError::ResolveAdjustGpaRange)?;
53
54        Ok(HostPciBridge::new(adjust_gpa_range, input.is_restoring).into())
55    }
56}