diff options
author | Miriam Zimmerman <mutexlox@google.com> | 2019-03-15 16:50:23 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-12 14:50:01 -0700 |
commit | c211a6ccc69dbf090002e58822846c2b4a69519c (patch) | |
tree | 4e516cb9853de2ada8369fc01dd577fff51fb3de /devices/src/split_irqchip_common.rs | |
parent | 65928af6c9ebf46abcd4fbd908fc76137e9843cd (diff) | |
download | crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.tar crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.tar.gz crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.tar.bz2 crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.tar.lz crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.tar.xz crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.tar.zst crosvm-c211a6ccc69dbf090002e58822846c2b4a69519c.zip |
devices: Start to implement IOAPIC.
This change implements service_irq, end_of_interrupt, and just enough to add some basic tests for those. Still TODO: Interrupt routing (and tests for that) and tests that require additional functionality. BUG=chromium:908689 TEST=Unit tests in file. Integration testing is blocked on rest of split-irqchip being implemented. Change-Id: Ia8418f9a8bec92b53d99cdafb92f05f82eafa2b1 Reviewed-on: https://chromium-review.googlesource.com/1558935 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Miriam Zimmerman <mutexlox@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: David Tolnay <dtolnay@chromium.org>
Diffstat (limited to 'devices/src/split_irqchip_common.rs')
-rw-r--r-- | devices/src/split_irqchip_common.rs | 42 |
1 files changed, 13 insertions, 29 deletions
diff --git a/devices/src/split_irqchip_common.rs b/devices/src/split_irqchip_common.rs index 6a722e2..65ba809 100644 --- a/devices/src/split_irqchip_common.rs +++ b/devices/src/split_irqchip_common.rs @@ -20,21 +20,22 @@ pub enum TriggerMode { Level = 1, } -#[derive(Clone, Copy, PartialEq)] +#[bitfield] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum DeliveryMode { - DeliveryModeFixed = 0b000, - DeliveryModeLowest = 0b001, - DeliveryModeSMI = 0b010, // System management interrupt - DeliveryModeRemoteRead = 0b011, // This is no longer supported by intel. - DeliveryModeNMI = 0b100, // Non maskable interrupt - DeliveryModeInit = 0b101, - DeliveryModeStartup = 0b110, - DeliveryModeExternal = 0b111, + Fixed = 0b000, + Lowest = 0b001, + SMI = 0b010, // System management interrupt + RemoteRead = 0b011, // This is no longer supported by intel. + NMI = 0b100, // Non maskable interrupt + Init = 0b101, + Startup = 0b110, + External = 0b111, } #[bitfield] #[derive(Clone, Copy, PartialEq)] -pub struct MsiAddressMessageNonRemappable { +pub struct MsiAddressMessage { reserved: BitField2, #[bits = 1] destination_mode: DestinationMode, @@ -47,27 +48,10 @@ pub struct MsiAddressMessageNonRemappable { #[bitfield] #[derive(Clone, Copy, PartialEq)] -pub struct MsiAddressMessageRemappable { - reserved: BitField2, - handle_hi: BitField1, // Bit 15 of handle - shv: BitField1, - interrupt_format: BitField1, - handle_low: BitField15, // Bits 0-14 of handle. - // According to Intel's implementation of MSI, these bits must always be 0xfee. - always_0xfee: BitField12, -} - -#[derive(Clone, Copy, PartialEq)] -pub enum MsiAddressMessage { - NonRemappable(MsiAddressMessageNonRemappable), - Remappable(MsiAddressMessageRemappable), -} - -#[bitfield] -#[derive(Clone, Copy, PartialEq)] struct MsiDataMessage { vector: BitField8, - delivery_mode: BitField3, + #[bits = 3] + delivery_mode: DeliveryMode, reserved: BitField3, level: BitField1, #[bits = 1] |