Skip to main content

chipset/pic/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource resolver for the PIC (Programmable Interrupt Controller) chipset device.
5
6use super::DualPic;
7use chipset_device_resources::BSP_LINT_LINE_SET;
8use chipset_device_resources::IRQ_LINE_SET;
9use chipset_device_resources::ResolveChipsetDeviceHandleParams;
10use chipset_device_resources::ResolvedChipsetDevice;
11use chipset_resources::pic::PicDeviceHandle;
12use vm_resource::ResolveResource;
13use vm_resource::declare_static_resolver;
14use vm_resource::kind::ChipsetDeviceHandleKind;
15
16/// A resolver for PIC devices.
17pub struct PicResolver;
18
19declare_static_resolver! {
20    PicResolver,
21    (ChipsetDeviceHandleKind, PicDeviceHandle),
22}
23
24impl ResolveResource<ChipsetDeviceHandleKind, PicDeviceHandle> for PicResolver {
25    type Output = ResolvedChipsetDevice;
26    type Error = std::convert::Infallible;
27
28    fn resolve(
29        &self,
30        _resource: PicDeviceHandle,
31        input: ResolveChipsetDeviceHandleParams<'_>,
32    ) -> Result<Self::Output, Self::Error> {
33        // Map IRQ2 to PIC IRQ0 (used by the PIT), since PIC IRQ2 is used to
34        // cascade the secondary PIC's output onto the primary.
35        //
36        // Don't map IRQ0 at all.
37        input.configure.add_line_target(IRQ_LINE_SET, 1..=1, 1);
38        input.configure.add_line_target(IRQ_LINE_SET, 2..=2, 0);
39        input.configure.add_line_target(IRQ_LINE_SET, 3..=15, 3);
40
41        let ready = input.configure.new_line(BSP_LINT_LINE_SET, "ready", 0);
42
43        Ok(DualPic::new(ready, input.register_pio).into())
44    }
45}