soc/amd/common/acpi: factor out common MADT code
The acpi_fill_madt implementation from the Genoa PoC also works for the other AMD SoCs that select SOC_AMD_COMMON_BLOCK_DATA_FABRIC_DOMAIN, so factor out this function to the common AMD ACPI code and change those other SoCs to use the new common functionality instead of having their own implementations. The old code on the single-domain SoCs used the GNB_IO_APIC_ADDR base address to create the MADT entry for the additional IOAPIC in the root complex. The new code iterates over all domains and looks for a resource with the IOMMU_IOAPIC_IDX index in each domain and if it finds it, it creates an MADT entry for that IOAPIC. This resource is created earlier in the boot process when the non-PCI resources are read from the IOHC registers and reported to the allocator. TEST=The resulting MADT doesn't change on Mandolin Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I4cc0d3f30b4e6ba29542dcfde84ccac90820d258 Reviewed-on: https://review.coreboot.org/c/coreboot/+/79861 Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
a2b2ac0ed2
commit
aab8a22d9d
|
@ -35,6 +35,7 @@ config SOC_AMD_CEZANNE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
||||||
|
select SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
select SOC_AMD_COMMON_BLOCK_AOAC
|
select SOC_AMD_COMMON_BLOCK_AOAC
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB
|
select SOC_AMD_COMMON_BLOCK_APOB
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB_HASH
|
select SOC_AMD_COMMON_BLOCK_APOB_HASH
|
||||||
|
|
|
@ -18,15 +18,6 @@
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
unsigned long acpi_fill_madt(unsigned long current)
|
|
||||||
{
|
|
||||||
|
|
||||||
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
|
||||||
GNB_IO_APIC_ADDR);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
||||||
* in the ACPI 3.0b specification.
|
* in the ACPI 3.0b specification.
|
||||||
|
|
|
@ -30,6 +30,12 @@ config SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
||||||
config SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
config SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Select this to add the common AMD acpi_fill_madt implementation to
|
||||||
|
the build which adds the MADT entries for all non-FCH IOAPICs.
|
||||||
|
|
||||||
config ACPI_SSDT_PSD_INDEPENDENT
|
config ACPI_SSDT_PSD_INDEPENDENT
|
||||||
bool "Allow core p-state independent transitions"
|
bool "Allow core p-state independent transitions"
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -12,6 +12,7 @@ ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_CPPC) += cppc.c
|
||||||
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE) += cpu_power_state.c
|
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE) += cpu_power_state.c
|
||||||
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_GPIO) += gpio.c
|
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_GPIO) += gpio.c
|
||||||
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_IVRS) += ivrs.c
|
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_IVRS) += ivrs.c
|
||||||
|
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_MADT) += madt.c
|
||||||
|
|
||||||
romstage-y += elog.c
|
romstage-y += elog.c
|
||||||
ramstage-y += elog.c
|
ramstage-y += elog.c
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#include <acpi/acpi.h>
|
||||||
|
#include <amdblocks/data_fabric.h>
|
||||||
|
#include <device/device.h>
|
||||||
|
|
||||||
|
unsigned long acpi_fill_madt(unsigned long current)
|
||||||
|
{
|
||||||
|
struct device *dev = NULL;
|
||||||
|
while ((dev = dev_find_path(dev, DEVICE_PATH_DOMAIN)) != NULL) {
|
||||||
|
struct resource *res = probe_resource(dev, IOMMU_IOAPIC_IDX);
|
||||||
|
if (!res)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
||||||
|
res->base);
|
||||||
|
}
|
||||||
|
|
||||||
|
return current;
|
||||||
|
}
|
|
@ -17,6 +17,7 @@ config SOC_SPECIFIC_OPTIONS
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPIMMIO
|
select SOC_AMD_COMMON_BLOCK_ACPIMMIO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
||||||
|
select SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
select SOC_AMD_COMMON_BLOCK_AOAC
|
select SOC_AMD_COMMON_BLOCK_AOAC
|
||||||
select SOC_AMD_COMMON_BLOCK_BANKED_GPIOS
|
select SOC_AMD_COMMON_BLOCK_BANKED_GPIOS
|
||||||
select SOC_AMD_COMMON_BLOCK_CPUFREQ_FAM17H_19H
|
select SOC_AMD_COMMON_BLOCK_CPUFREQ_FAM17H_19H
|
||||||
|
|
|
@ -6,29 +6,12 @@
|
||||||
#include <amdblocks/acpi.h>
|
#include <amdblocks/acpi.h>
|
||||||
#include <amdblocks/acpimmio.h>
|
#include <amdblocks/acpimmio.h>
|
||||||
#include <amdblocks/cpu.h>
|
#include <amdblocks/cpu.h>
|
||||||
#include <amdblocks/data_fabric.h>
|
|
||||||
#include <arch/ioapic.h>
|
#include <arch/ioapic.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <soc/acpi.h>
|
#include <soc/acpi.h>
|
||||||
#include <vendorcode/amd/opensil/genoa_poc/opensil.h>
|
#include <vendorcode/amd/opensil/genoa_poc/opensil.h>
|
||||||
|
|
||||||
/* TODO: this can go in a common place */
|
|
||||||
unsigned long acpi_fill_madt(unsigned long current)
|
|
||||||
{
|
|
||||||
struct device *dev = NULL;
|
|
||||||
while ((dev = dev_find_path(dev, DEVICE_PATH_DOMAIN)) != NULL) {
|
|
||||||
struct resource *res = probe_resource(dev, IOMMU_IOAPIC_IDX);
|
|
||||||
if (!res)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
|
||||||
res->base);
|
|
||||||
}
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
void acpi_fill_fadt(acpi_fadt_t *fadt)
|
void acpi_fill_fadt(acpi_fadt_t *fadt)
|
||||||
{
|
{
|
||||||
/* Fill in pm1_evt, pm1_cnt, pm_tmr, gpe0_blk from openSIL input structure */
|
/* Fill in pm1_evt, pm1_cnt, pm_tmr, gpe0_blk from openSIL input structure */
|
||||||
|
|
|
@ -36,6 +36,7 @@ config SOC_AMD_GLINDA
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct
|
||||||
|
select SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
select SOC_AMD_COMMON_BLOCK_AOAC # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_AOAC # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_APOB # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB_HASH # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_APOB_HASH # TODO: Check if this is still correct
|
||||||
|
|
|
@ -21,14 +21,6 @@
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
unsigned long acpi_fill_madt(unsigned long current)
|
|
||||||
{
|
|
||||||
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
|
||||||
GNB_IO_APIC_ADDR);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
||||||
* in the ACPI 3.0b specification.
|
* in the ACPI 3.0b specification.
|
||||||
|
|
|
@ -38,6 +38,7 @@ config SOC_AMD_REMBRANDT_BASE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
||||||
|
select SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
select SOC_AMD_COMMON_BLOCK_AOAC
|
select SOC_AMD_COMMON_BLOCK_AOAC
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB
|
select SOC_AMD_COMMON_BLOCK_APOB
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB_HASH
|
select SOC_AMD_COMMON_BLOCK_APOB_HASH
|
||||||
|
|
|
@ -20,14 +20,6 @@
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
unsigned long acpi_fill_madt(unsigned long current)
|
|
||||||
{
|
|
||||||
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
|
||||||
GNB_IO_APIC_ADDR);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
||||||
* in the ACPI 3.0b specification.
|
* in the ACPI 3.0b specification.
|
||||||
|
|
|
@ -38,6 +38,7 @@ config SOC_AMD_PHOENIX
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct
|
||||||
|
select SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
select SOC_AMD_COMMON_BLOCK_AOAC
|
select SOC_AMD_COMMON_BLOCK_AOAC
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB
|
select SOC_AMD_COMMON_BLOCK_APOB
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB_HASH
|
select SOC_AMD_COMMON_BLOCK_APOB_HASH
|
||||||
|
|
|
@ -21,14 +21,6 @@
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
unsigned long acpi_fill_madt(unsigned long current)
|
|
||||||
{
|
|
||||||
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
|
||||||
GNB_IO_APIC_ADDR);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
||||||
* in the ACPI 3.0b specification.
|
* in the ACPI 3.0b specification.
|
||||||
|
|
|
@ -30,6 +30,7 @@ config SOC_AMD_PICASSO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS
|
||||||
|
select SOC_AMD_COMMON_BLOCK_ACPI_MADT
|
||||||
select SOC_AMD_COMMON_BLOCK_AOAC
|
select SOC_AMD_COMMON_BLOCK_AOAC
|
||||||
select SOC_AMD_COMMON_BLOCK_APOB
|
select SOC_AMD_COMMON_BLOCK_APOB
|
||||||
select SOC_AMD_COMMON_BLOCK_BANKED_GPIOS
|
select SOC_AMD_COMMON_BLOCK_BANKED_GPIOS
|
||||||
|
|
|
@ -24,14 +24,6 @@
|
||||||
#include <soc/southbridge.h>
|
#include <soc/southbridge.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
unsigned long acpi_fill_madt(unsigned long current)
|
|
||||||
{
|
|
||||||
current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current,
|
|
||||||
GNB_IO_APIC_ADDR);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
* Reference section 5.2.9 Fixed ACPI Description Table (FADT)
|
||||||
* in the ACPI 3.0b specification.
|
* in the ACPI 3.0b specification.
|
||||||
|
|
Loading…
Reference in New Issue