acpi/madt: Add definitation for interrupt source override MADT entry
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 9 Feb 2011 14:42:33 +0000 (22:42 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 9 Feb 2011 14:42:33 +0000 (22:42 +0800)
sys/platform/pc32/i386/mp_madt.c
sys/platform/pc64/x86_64/mp_madt.c

index e24c99e..4cdb033 100644 (file)
@@ -116,6 +116,7 @@ struct acpi_madt_ent {
 
 #define MADT_ENT_LAPIC         0
 #define MADT_ENT_IOAPIC                1
+#define MADT_ENT_INTSRC_OVR    2
 #define MADT_ENT_LAPIC_ADDR    5
 
 /* MADT Processor Local APIC */
@@ -137,6 +138,28 @@ struct acpi_madt_ioapic {
        uint32_t                mio_gsi_base;
 } __packed;
 
+/* MADT Interrupt Source Override */
+struct acpi_madt_intsrc_ovr {
+       struct acpi_madt_ent    miso_hdr;
+       uint8_t                 miso_bus;
+       uint8_t                 miso_src;
+       uint32_t                miso_gsi;
+       uint16_t                miso_flags;     /* MADT_ISO_ */
+} __packed;
+
+#define MADT_ISO_POLA_MASK     0x3
+#define MADT_ISO_POLA_SHIFT    0
+#define MADT_ISO_POLA_CONFORM  0
+#define MADT_ISO_POLA_HIGH     1
+#define MADT_ISO_POLA_RSVD     2
+#define MADT_ISO_POLA_LOW      3
+#define MADT_ISO_TRIG_MASK     0xc
+#define MADT_ISO_TRIG_SHIFT    2
+#define MADT_ISO_TRIG_CONFORM  0
+#define MADT_ISO_TRIG_EDGE     1
+#define MADT_ISO_TRIG_RSVD     2
+#define MADT_ISO_TRIG_LEVEL    3
+
 /* MADT Local APIC Address Override */
 struct acpi_madt_lapic_addr {
        struct acpi_madt_ent    mla_hdr;
@@ -588,8 +611,8 @@ madt_iterate_entries(struct acpi_madt *madt, madt_iter_t func, void *arg)
                cur += ent->me_len;
 
                /*
-                * Only Local APIC and I/O APIC are defined in
-                * ACPI specification 1.0 - 3.0
+                * Only Local APIC, I/O APIC and Interrupt Source Override
+                * are defined in ACPI specification 1.0 - 4.0
                 */
                switch (ent->me_type) {
                case MADT_ENT_LAPIC:
@@ -607,6 +630,15 @@ madt_iterate_entries(struct acpi_madt *madt, madt_iter_t func, void *arg)
                                error = EINVAL;
                        }
                        break;
+
+               case MADT_ENT_INTSRC_OVR:
+                       if (ent->me_len < sizeof(struct acpi_madt_intsrc_ovr)) {
+                               kprintf("madt_iterate_entries: invalid MADT "
+                                       "intsrc_ovr entry len %d\n",
+                                       ent->me_len);
+                               error = EINVAL;
+                       }
+                       break;
                }
                if (error)
                        break;
index 73d9e86..0df9bac 100644 (file)
@@ -116,6 +116,7 @@ struct acpi_madt_ent {
 
 #define MADT_ENT_LAPIC         0
 #define MADT_ENT_IOAPIC                1
+#define MADT_ENT_INTSRC_OVR    2
 #define MADT_ENT_LAPIC_ADDR    5
 
 /* MADT Processor Local APIC */
@@ -137,6 +138,28 @@ struct acpi_madt_ioapic {
        uint32_t                mio_gsi_base;
 } __packed;
 
+/* MADT Interrupt Source Override */
+struct acpi_madt_intsrc_ovr {
+       struct acpi_madt_ent    miso_hdr;
+       uint8_t                 miso_bus;
+       uint8_t                 miso_src;
+       uint32_t                miso_gsi;
+       uint16_t                miso_flags;     /* MADT_ISO_ */
+} __packed;
+
+#define MADT_ISO_POLA_MASK     0x3
+#define MADT_ISO_POLA_SHIFT    0
+#define MADT_ISO_POLA_CONFORM  0
+#define MADT_ISO_POLA_HIGH     1
+#define MADT_ISO_POLA_RSVD     2
+#define MADT_ISO_POLA_LOW      3
+#define MADT_ISO_TRIG_MASK     0xc
+#define MADT_ISO_TRIG_SHIFT    2
+#define MADT_ISO_TRIG_CONFORM  0
+#define MADT_ISO_TRIG_EDGE     1
+#define MADT_ISO_TRIG_RSVD     2
+#define MADT_ISO_TRIG_LEVEL    3
+
 /* MADT Local APIC Address Override */
 struct acpi_madt_lapic_addr {
        struct acpi_madt_ent    mla_hdr;
@@ -588,8 +611,8 @@ madt_iterate_entries(struct acpi_madt *madt, madt_iter_t func, void *arg)
                cur += ent->me_len;
 
                /*
-                * Only Local APIC and I/O APIC are defined in
-                * ACPI specification 1.0 - 3.0
+                * Only Local APIC, I/O APIC and Interrupt Source Override
+                * are defined in ACPI specification 1.0 - 4.0
                 */
                switch (ent->me_type) {
                case MADT_ENT_LAPIC:
@@ -607,6 +630,15 @@ madt_iterate_entries(struct acpi_madt *madt, madt_iter_t func, void *arg)
                                error = EINVAL;
                        }
                        break;
+
+               case MADT_ENT_INTSRC_OVR:
+                       if (ent->me_len < sizeof(struct acpi_madt_intsrc_ovr)) {
+                               kprintf("madt_iterate_entries: invalid MADT "
+                                       "intsrc_ovr entry len %d\n",
+                                       ent->me_len);
+                               error = EINVAL;
+                       }
+                       break;
                }
                if (error)
                        break;