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;
 }