soc/apollolake/acpi: Fill in ACPI MADT table

ACPI MADT tables required to describe the multiprocessor interrupt 
routing. Apollolake SOC also have the interrupt override table like
other x86 silicons.

Change-Id: I85976e227963c950aad4476d68581b96e1090559
Signed-off-by: Lance Zhao <lijian.zhao@intel.com>
Reviewed-on: https://review.coreboot.org/13373
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Lance Zhao 2015-11-16 18:33:21 -08:00 committed by Martin Roth
parent 186b9de95d
commit 2fc82d699d
1 changed files with 28 additions and 5 deletions

View File

@ -11,6 +11,8 @@
*/ */
#include <arch/acpi.h> #include <arch/acpi.h>
#include <arch/ioapic.h>
#include <arch/smp/mpspec.h>
#include <cpu/x86/smm.h> #include <cpu/x86/smm.h>
#include <soc/acpi.h> #include <soc/acpi.h>
#include <soc/iomap.h> #include <soc/iomap.h>
@ -25,17 +27,38 @@ unsigned long acpi_fill_mcfg(unsigned long current)
return current; return current;
} }
unsigned long acpi_fill_madt(unsigned long current)
{
return current;
}
static int acpi_sci_irq(void) static int acpi_sci_irq(void)
{ {
int sci_irq = 9; int sci_irq = 9;
return sci_irq; return sci_irq;
} }
static unsigned long acpi_madt_irq_overrides(unsigned long current)
{
int sci = acpi_sci_irq();
uint16_t flags = MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW;;
/* INT_SRC_OVR */
current += acpi_create_madt_irqoverride((void *)current, 0, 0, 2, 0);
/* SCI */
current += acpi_create_madt_irqoverride((void *)current, 0, sci, sci, flags);
return current;
}
unsigned long acpi_fill_madt(unsigned long current)
{
/* Local APICs */
current = acpi_create_madt_lapics(current);
/* IOAPIC */
current += acpi_create_madt_ioapic((void *) current,
2, IO_APIC_ADDR, 0);
return acpi_madt_irq_overrides(current);
}
void soc_fill_common_fadt(acpi_fadt_t * fadt) void soc_fill_common_fadt(acpi_fadt_t * fadt)
{ {
const uint16_t pmbase = ACPI_PMIO_BASE; const uint16_t pmbase = ACPI_PMIO_BASE;