summary refs log tree commit diff
path: root/x86_64/src/split_irqchip_common.rs
diff options
context:
space:
mode:
Diffstat (limited to 'x86_64/src/split_irqchip_common.rs')
-rw-r--r--x86_64/src/split_irqchip_common.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/x86_64/src/split_irqchip_common.rs b/x86_64/src/split_irqchip_common.rs
new file mode 100644
index 0000000..f43ab69
--- /dev/null
+++ b/x86_64/src/split_irqchip_common.rs
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Common constants and types used for Split IRQ chip devices (e.g. PIC, PIT, IOAPIC).
+
+use bit_field::*;
+
+#[derive(Clone, Copy, PartialEq)]
+pub enum DestinationMode {
+    Physical = 0,
+    Logical = 1,
+}
+
+#[derive(Clone, Copy, PartialEq)]
+pub enum TriggerMode {
+    Edge = 0,
+    Level = 1,
+}
+
+#[derive(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,
+}
+
+#[bitfield]
+#[derive(Clone, Copy, PartialEq)]
+pub struct MsiAddressMessageNonRemappable {
+    reserved: BitField2,
+    destination_mode: BitField1,
+    redirection_hint: BitField1,
+    reserved_2: BitField8,
+    destination_id: BitField8,
+    // According to Intel's implementation of MSI, these bits must always be 0xfee.
+    always_0xfee: BitField12,
+}
+
+#[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,
+    reserved: BitField3,
+    level: BitField1,
+    trigger: BitField1,
+    reserved2: BitField16,
+}