ACPI: Use common code for MADT LAPIC NMIs
Use the broadcast ID to deliver LINT1 as NMI to all CPUs,
instead of listing individual LAPIC IDs.
Change-Id: Iaf714d8c2aabd16c59c3bcebc4a207406fc85ca9
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/69527
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index 877c47e..f6a36f8 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -240,6 +240,24 @@
return lapic_nmi->length;
}
+unsigned long acpi_create_madt_lapics_with_nmis(unsigned long current)
+{
+ const u16 flags = MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH;
+
+ current = acpi_create_madt_lapics(current);
+
+ /* 1: LINT1 connect to NMI */
+ /* create all subtables for processors */
+ current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
+ ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS, flags, 1);
+
+ if (!CONFIG(XAPIC_ONLY))
+ current += acpi_create_madt_lx2apic_nmi((acpi_madt_lx2apic_nmi_t *)current,
+ ACPI_MADT_LX2APIC_NMI_ALL_PROCESSORS, flags, 1);
+
+ return current;
+}
+
void acpi_create_madt(acpi_madt_t *madt)
{
acpi_header_t *header = &(madt->header);
diff --git a/src/include/acpi/acpi.h b/src/include/acpi/acpi.h
index fa216aa..57dbc65 100644
--- a/src/include/acpi/acpi.h
+++ b/src/include/acpi/acpi.h
@@ -678,7 +678,8 @@
u8 lint; /* Local APIC LINT# */
} __packed acpi_madt_lapic_nmi_t;
-#define ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS 0xff
+#define ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS 0xff
+#define ACPI_MADT_LX2APIC_NMI_ALL_PROCESSORS ((u32)-1)
/* MADT: I/O APIC Structure */
typedef struct acpi_madt_ioapic {
@@ -1333,6 +1334,7 @@
u16 flags, u8 lint);
void acpi_create_madt(acpi_madt_t *madt);
unsigned long acpi_create_madt_lapics(unsigned long current);
+unsigned long acpi_create_madt_lapics_with_nmis(unsigned long current);
int acpi_create_madt_lx2apic(acpi_madt_lx2apic_t *lapic, u32 cpu, u32 apic);
int acpi_create_madt_lx2apic_nmi(acpi_madt_lx2apic_nmi_t *lapic_nmi, u32 cpu,
u16 flags, u8 lint);
diff --git a/src/soc/amd/cezanne/acpi.c b/src/soc/amd/cezanne/acpi.c
index 189e84e..802476e 100644
--- a/src/soc/amd/cezanne/acpi.c
+++ b/src/soc/amd/cezanne/acpi.c
@@ -24,7 +24,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* create all subtables for processors */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -41,12 +41,6 @@
MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW);
current = acpi_fill_madt_irqoverride(current);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
- ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS,
- MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
- 1 /* 1: LINT1 connect to NMI */);
-
return current;
}
diff --git a/src/soc/amd/glinda/acpi.c b/src/soc/amd/glinda/acpi.c
index 85430b9..0c95494 100644
--- a/src/soc/amd/glinda/acpi.c
+++ b/src/soc/amd/glinda/acpi.c
@@ -27,7 +27,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* create all subtables for processors */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -44,12 +44,6 @@
MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW);
current = acpi_fill_madt_irqoverride(current);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
- ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS,
- MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
- 1 /* 1: LINT1 connect to NMI */);
-
return current;
}
diff --git a/src/soc/amd/mendocino/acpi.c b/src/soc/amd/mendocino/acpi.c
index b867930..d30fb85 100644
--- a/src/soc/amd/mendocino/acpi.c
+++ b/src/soc/amd/mendocino/acpi.c
@@ -26,7 +26,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* create all subtables for processors */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -43,12 +43,6 @@
MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW);
current = acpi_fill_madt_irqoverride(current);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
- ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS,
- MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
- 1 /* 1: LINT1 connect to NMI */);
-
return current;
}
diff --git a/src/soc/amd/morgana/acpi.c b/src/soc/amd/morgana/acpi.c
index 5eb21ff..15b64c5 100644
--- a/src/soc/amd/morgana/acpi.c
+++ b/src/soc/amd/morgana/acpi.c
@@ -27,7 +27,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* create all subtables for processors */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -44,12 +44,6 @@
MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW);
current = acpi_fill_madt_irqoverride(current);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
- ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS,
- MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
- 1 /* 1: LINT1 connect to NMI */);
-
return current;
}
diff --git a/src/soc/amd/picasso/acpi.c b/src/soc/amd/picasso/acpi.c
index 2af6459..6d46698 100644
--- a/src/soc/amd/picasso/acpi.c
+++ b/src/soc/amd/picasso/acpi.c
@@ -31,7 +31,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* create all subtables for processors */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -49,12 +49,6 @@
current = acpi_fill_madt_irqoverride(current);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
- ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS,
- MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
- 1 /* 1: LINT1 connect to NMI */);
-
return current;
}
diff --git a/src/soc/amd/stoneyridge/acpi.c b/src/soc/amd/stoneyridge/acpi.c
index 20221d2..cc0194b 100644
--- a/src/soc/amd/stoneyridge/acpi.c
+++ b/src/soc/amd/stoneyridge/acpi.c
@@ -26,7 +26,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* create all subtables for processors */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
/* Write Kern IOAPIC, only one */
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -42,12 +42,6 @@
MP_BUS_ISA, 9, 9,
MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
- ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS,
- MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
- 1 /* 1: LINT1 connect to NMI */);
-
return current;
}
diff --git a/src/soc/intel/common/block/acpi/acpi.c b/src/soc/intel/common/block/acpi/acpi.c
index c355c944..860c868 100644
--- a/src/soc/intel/common/block/acpi/acpi.c
+++ b/src/soc/intel/common/block/acpi/acpi.c
@@ -69,12 +69,6 @@
current +=
acpi_create_madt_irqoverride((void *)current, 0, sci, sci, flags);
- /* NMI */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current, 0xff, 5, 1);
-
- if (is_x2apic_mode())
- current += acpi_create_madt_lx2apic_nmi((acpi_madt_lx2apic_nmi_t *)current,
- 0xffffffff, 0x5, 1);
return current;
}
@@ -91,7 +85,7 @@
size_t ioapic_entries;
/* Local APICs */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
/* IOAPIC */
ioapic_table = soc_get_ioapic_info(&ioapic_entries);
diff --git a/src/southbridge/intel/i82801gx/lpc.c b/src/southbridge/intel/i82801gx/lpc.c
index 62ff757..f8a2dac8 100644
--- a/src/southbridge/intel/i82801gx/lpc.c
+++ b/src/southbridge/intel/i82801gx/lpc.c
@@ -352,20 +352,11 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* Local APICs */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
/* IOAPIC */
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
- /* LAPIC_NMI */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 0,
- MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 1, MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
-
/* INT_SRC_OVR */
current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 0, 2, MP_IRQ_POLARITY_HIGH | MP_IRQ_TRIGGER_EDGE);
diff --git a/src/southbridge/intel/i82801ix/madt.c b/src/southbridge/intel/i82801ix/madt.c
index 19d5d8c..009c9ea 100644
--- a/src/southbridge/intel/i82801ix/madt.c
+++ b/src/southbridge/intel/i82801ix/madt.c
@@ -7,20 +7,11 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* Local APICs */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
/* IOAPIC */
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
- /* LAPIC_NMI */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 0,
- MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 1, MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
-
/* INT_SRC_OVR */
current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 0, 2, MP_IRQ_POLARITY_HIGH | MP_IRQ_TRIGGER_EDGE);
diff --git a/src/southbridge/intel/i82801jx/lpc.c b/src/southbridge/intel/i82801jx/lpc.c
index 7dfc33f..39b662a 100644
--- a/src/southbridge/intel/i82801jx/lpc.c
+++ b/src/southbridge/intel/i82801jx/lpc.c
@@ -367,20 +367,11 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* Local APICs */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
/* IOAPIC */
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
- /* LAPIC_NMI */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 0,
- MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 1, MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
-
/* INT_SRC_OVR */
current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 0, 2, MP_IRQ_POLARITY_HIGH | MP_IRQ_TRIGGER_EDGE);
diff --git a/src/southbridge/intel/ibexpeak/madt.c b/src/southbridge/intel/ibexpeak/madt.c
index a1a28a1..26b1630 100644
--- a/src/southbridge/intel/ibexpeak/madt.c
+++ b/src/southbridge/intel/ibexpeak/madt.c
@@ -9,7 +9,7 @@
unsigned long acpi_fill_madt(unsigned long current)
{
/* Local APICs */
- current = acpi_create_madt_lapics(current);
+ current = acpi_create_madt_lapics_with_nmis(current);
/* IOAPIC */
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
@@ -24,19 +24,5 @@
MP_IRQ_POLARITY_HIGH |
MP_IRQ_TRIGGER_LEVEL);
- /* LAPIC_NMI */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 0,
- MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 1, MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 2, MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
- current, 3, MP_IRQ_POLARITY_HIGH |
- MP_IRQ_TRIGGER_EDGE, 0x01);
return current;
}