aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>2011-10-10 14:06:17 +0800
committerKevin O'Connor <kevin@koconnor.net>2011-10-30 13:45:28 -0400
commit7098638930d87e369ec62b6036a4ba15036c11fd (patch)
treec3e132f66fa3ae93751f5842f00638f865dd32c6
parent2e55b03e6314b6cf282dd2d911598973b37a9ca4 (diff)
downloadseabios-7098638930d87e369ec62b6036a4ba15036c11fd.tar.gz
seabios: Add Local APIC NMI Structure to ACPI MADT
ACPI NMI Structure describes LINT pin (LINT0 or LINT1) information to which NMI is connected, and it is needed by OS to initialize local APIC. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Reviewed-by: Lai Jiangshan <laijs@cn.fujitsu.com>
-rw-r--r--src/acpi.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/acpi.c b/src/acpi.c
index 0ff1b63..a3770ae 100644
--- a/src/acpi.c
+++ b/src/acpi.c
@@ -139,6 +139,14 @@ struct madt_intsrcovr {
u16 flags;
} PACKED;
+struct madt_local_nmi {
+ ACPI_SUB_HEADER_DEF
+ u8 processor_id; /* ACPI processor id */
+ u16 flags; /* MPS INTI flags */
+ u8 lint; /* Local APIC LINT# */
+} PACKED;
+
+
/*
* ACPI 2.0 Generic Address Space definition.
*/
@@ -300,7 +308,9 @@ build_madt(void)
int madt_size = (sizeof(struct multiple_apic_table)
+ sizeof(struct madt_processor_apic) * MaxCountCPUs
+ sizeof(struct madt_io_apic)
- + sizeof(struct madt_intsrcovr) * 16);
+ + sizeof(struct madt_intsrcovr) * 16
+ + sizeof(struct madt_local_nmi));
+
struct multiple_apic_table *madt = malloc_high(madt_size);
if (!madt) {
warn_noalloc();
@@ -352,7 +362,15 @@ build_madt(void)
intsrcovr++;
}
- build_header((void*)madt, APIC_SIGNATURE, (void*)intsrcovr - (void*)madt, 1);
+ struct madt_local_nmi *local_nmi = (void*)intsrcovr;
+ local_nmi->type = APIC_LOCAL_NMI;
+ local_nmi->length = sizeof(*local_nmi);
+ local_nmi->processor_id = 0xff; /* all processors */
+ local_nmi->flags = 0;
+ local_nmi->lint = 1; /* LINT1 */
+ local_nmi++;
+
+ build_header((void*)madt, APIC_SIGNATURE, (void*)local_nmi - (void*)madt, 1);
return madt;
}