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>
This commit is contained in:
parent
da1a58a503
commit
66b5e1b32d
|
@ -240,6 +240,24 @@ int acpi_create_madt_lx2apic_nmi(acpi_madt_lx2apic_nmi_t *lapic_nmi, u32 cpu,
|
|||
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);
|
||||
|
|
|
@ -678,7 +678,8 @@ typedef struct acpi_madt_lapic_nmi {
|
|||
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 @@ int acpi_create_madt_lapic_nmi(acpi_madt_lapic_nmi_t *lapic_nmi, u8 cpu,
|
|||
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);
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,12 +69,6 @@ static unsigned long acpi_madt_irq_overrides(unsigned long current)
|
|||
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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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);
|
||||
|
|
|
@ -352,20 +352,11 @@ static void lpc_init(struct device *dev)
|
|||
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -367,20 +367,11 @@ static void lpc_init(struct device *dev)
|
|||
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);
|
||||
|
|
|
@ -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 @@ unsigned long acpi_fill_madt(unsigned long current)
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue