chipset/battery/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resolver for battery devices.
5
6use super::BATTERY_MMIO_REGION_BASE_ADDRESS_ARM;
7use super::BATTERY_MMIO_REGION_BASE_ADDRESS_X64;
8use super::BATTERY_STATUS_GPE0_LINE;
9use super::BATTERY_STATUS_IRQ_NO;
10use super::BatteryDevice;
11use super::BatteryRuntimeDeps;
12use async_trait::async_trait;
13use chipset_device_resources::GPE0_LINE_SET;
14use chipset_device_resources::IRQ_LINE_SET;
15use chipset_device_resources::ResolveChipsetDeviceHandleParams;
16use chipset_device_resources::ResolvedChipsetDevice;
17use chipset_resources::battery::BatteryDeviceHandleAArch64;
18use chipset_resources::battery::BatteryDeviceHandleX64;
19use thiserror::Error;
20use vm_resource::AsyncResolveResource;
21use vm_resource::ResolveError;
22use vm_resource::ResourceResolver;
23use vm_resource::declare_static_async_resolver;
24use vm_resource::kind::ChipsetDeviceHandleKind;
25
26/// A resolver for battery devices.
27pub struct BatteryResolver;
28
29declare_static_async_resolver! {
30    BatteryResolver,
31    (ChipsetDeviceHandleKind, BatteryDeviceHandleX64),
32    (ChipsetDeviceHandleKind, BatteryDeviceHandleAArch64),
33}
34
35/// Errors that can occur when resolving a battery device.
36#[derive(Debug, Error)]
37pub enum ResolveBatteryError {
38    #[error("failed to resolve battery")]
39    ResolveBattery(#[source] ResolveError),
40}
41
42#[async_trait]
43impl AsyncResolveResource<ChipsetDeviceHandleKind, BatteryDeviceHandleAArch64> for BatteryResolver {
44    type Output = ResolvedChipsetDevice;
45    type Error = ResolveBatteryError;
46
47    async fn resolve(
48        &self,
49        _resolver: &ResourceResolver,
50        resource: BatteryDeviceHandleAArch64,
51        input: ResolveChipsetDeviceHandleParams<'_>,
52    ) -> Result<Self::Output, Self::Error> {
53        Ok(BatteryDevice::new(
54            BatteryRuntimeDeps {
55                battery_status_recv: resource.battery_status_recv,
56                notify_interrupt: input.configure.new_line(
57                    IRQ_LINE_SET,
58                    "battery_status",
59                    BATTERY_STATUS_IRQ_NO,
60                ),
61            },
62            BATTERY_MMIO_REGION_BASE_ADDRESS_ARM,
63        )
64        .into())
65    }
66}
67
68#[async_trait]
69impl AsyncResolveResource<ChipsetDeviceHandleKind, BatteryDeviceHandleX64> for BatteryResolver {
70    type Output = ResolvedChipsetDevice;
71    type Error = ResolveBatteryError;
72
73    async fn resolve(
74        &self,
75        _resolver: &ResourceResolver,
76        resource: BatteryDeviceHandleX64,
77        input: ResolveChipsetDeviceHandleParams<'_>,
78    ) -> Result<Self::Output, Self::Error> {
79        Ok(BatteryDevice::new(
80            BatteryRuntimeDeps {
81                battery_status_recv: resource.battery_status_recv,
82                notify_interrupt: input.configure.new_line(
83                    GPE0_LINE_SET,
84                    "battery_status",
85                    BATTERY_STATUS_GPE0_LINE,
86                ),
87            },
88            BATTERY_MMIO_REGION_BASE_ADDRESS_X64,
89        )
90        .into())
91    }
92}