chipset/battery/
resolver.rs1use 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
26pub struct BatteryResolver;
28
29declare_static_async_resolver! {
30 BatteryResolver,
31 (ChipsetDeviceHandleKind, BatteryDeviceHandleX64),
32 (ChipsetDeviceHandleKind, BatteryDeviceHandleAArch64),
33}
34
35#[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}