acpi: Bump MADT to revision 3

Add structs and methods for revision 3.

Change-Id: Ida75f530551ad2b8b20ce7fdeffb3befc51296bc
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/39806
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: HAOUAS Elyes <ehaouas@noos.fr>
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
This commit is contained in:
Patrick Rudolph 2020-03-24 17:29:49 +01:00 committed by Matt DeVillier
parent c02bda0f06
commit 56a3ef2e74
2 changed files with 57 additions and 4 deletions

View File

@ -127,6 +127,18 @@ int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic)
return lapic->length; return lapic->length;
} }
int acpi_create_madt_lx2apic(acpi_madt_lx2apic_t *lapic, u32 cpu, u32 apic)
{
lapic->type = LOCAL_X2APIC; /* Local APIC structure */
lapic->reserved = 0;
lapic->length = sizeof(acpi_madt_lx2apic_t);
lapic->flags = (1 << 0); /* Processor/LAPIC enabled */
lapic->processor_id = cpu;
lapic->x2apic_id = apic;
return lapic->length;
}
unsigned long acpi_create_madt_lapics(unsigned long current) unsigned long acpi_create_madt_lapics(unsigned long current)
{ {
struct device *cpu; struct device *cpu;
@ -146,8 +158,12 @@ unsigned long acpi_create_madt_lapics(unsigned long current)
if (num_cpus > 1) if (num_cpus > 1)
bubblesort(apic_ids, num_cpus, NUM_ASCENDING); bubblesort(apic_ids, num_cpus, NUM_ASCENDING);
for (index = 0; index < num_cpus; index++) { for (index = 0; index < num_cpus; index++) {
current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, if (apic_ids[index] < 0xff)
index, apic_ids[index]); current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current,
index, apic_ids[index]);
else
current += acpi_create_madt_lx2apic((acpi_madt_lx2apic_t *)current,
index, apic_ids[index]);
} }
return current; return current;
@ -191,6 +207,21 @@ int acpi_create_madt_lapic_nmi(acpi_madt_lapic_nmi_t *lapic_nmi, u8 cpu,
return lapic_nmi->length; return lapic_nmi->length;
} }
int acpi_create_madt_lx2apic_nmi(acpi_madt_lx2apic_nmi_t *lapic_nmi, u32 cpu,
u16 flags, u8 lint)
{
lapic_nmi->type = LOCAL_X2APIC_NMI; /* Local APIC NMI structure */
lapic_nmi->length = sizeof(acpi_madt_lx2apic_nmi_t);
lapic_nmi->flags = flags;
lapic_nmi->processor_id = cpu;
lapic_nmi->lint = lint;
lapic_nmi->reserved[0] = 0;
lapic_nmi->reserved[1] = 0;
lapic_nmi->reserved[2] = 0;
return lapic_nmi->length;
}
void acpi_create_madt(acpi_madt_t *madt) void acpi_create_madt(acpi_madt_t *madt)
{ {
acpi_header_t *header = &(madt->header); acpi_header_t *header = &(madt->header);
@ -1556,7 +1587,7 @@ int get_acpi_table_revision(enum acpi_tables table)
case FADT: case FADT:
return ACPI_FADT_REV_ACPI_6_0; return ACPI_FADT_REV_ACPI_6_0;
case MADT: /* ACPI 3.0: 2, ACPI 4.0/5.0: 3, ACPI 6.2b/6.3: 5 */ case MADT: /* ACPI 3.0: 2, ACPI 4.0/5.0: 3, ACPI 6.2b/6.3: 5 */
return 2; return 3;
case MCFG: case MCFG:
return 1; return 1;
case TCPA: case TCPA:

View File

@ -466,6 +466,26 @@ typedef struct acpi_madt_irqoverride {
u16 flags; /* MPS INTI flags */ u16 flags; /* MPS INTI flags */
} __packed acpi_madt_irqoverride_t; } __packed acpi_madt_irqoverride_t;
/* MADT: Processor Local x2APIC Structure */
typedef struct acpi_madt_lx2apic {
u8 type; /* Type (9) */
u8 length; /* Length in bytes (16) */
u16 reserved;
u32 x2apic_id; /* Local x2APIC ID */
u32 flags; /* Same as Local APIC flags */
u32 processor_id; /* ACPI processor ID */
} __packed acpi_madt_lx2apic_t;
/* MADT: Processor Local x2APIC NMI Structure */
typedef struct acpi_madt_lx2apic_nmi {
u8 type; /* Type (10) */
u8 length; /* Length in bytes (12) */
u16 flags; /* Same as MPS INTI flags */
u32 processor_id; /* ACPI processor ID */
u8 lint; /* Local APIC LINT# */
u8 reserved[3];
} __packed acpi_madt_lx2apic_nmi_t;
#define ACPI_DBG2_PORT_SERIAL 0x8000 #define ACPI_DBG2_PORT_SERIAL 0x8000
#define ACPI_DBG2_PORT_SERIAL_16550 0x0000 #define ACPI_DBG2_PORT_SERIAL_16550 0x0000
#define ACPI_DBG2_PORT_SERIAL_16550_DBGP 0x0001 #define ACPI_DBG2_PORT_SERIAL_16550_DBGP 0x0001
@ -871,7 +891,9 @@ void acpi_create_madt(acpi_madt_t *madt);
unsigned long acpi_create_madt_lapics(unsigned long current); unsigned long acpi_create_madt_lapics(unsigned long current);
unsigned long acpi_create_madt_lapic_nmis(unsigned long current, u16 flags, unsigned long acpi_create_madt_lapic_nmis(unsigned long current, u16 flags,
u8 lint); u8 lint);
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);
int acpi_create_srat_lapic(acpi_srat_lapic_t *lapic, u8 node, u8 apic); int acpi_create_srat_lapic(acpi_srat_lapic_t *lapic, u8 node, u8 apic);
int acpi_create_srat_mem(acpi_srat_mem_t *mem, u8 node, u32 basek, u32 sizek, int acpi_create_srat_mem(acpi_srat_mem_t *mem, u8 node, u32 basek, u32 sizek,
u32 flags); u32 flags);