aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/soc/intel/common/block/acpi/acpi.c6
-rw-r--r--src/soc/intel/common/block/acpi/cpu_hybrid.c34
-rw-r--r--src/soc/intel/common/block/include/intelblocks/acpi.h2
3 files changed, 41 insertions, 1 deletions
diff --git a/src/soc/intel/common/block/acpi/acpi.c b/src/soc/intel/common/block/acpi/acpi.c
index 1c3747d76a..4b790b77f0 100644
--- a/src/soc/intel/common/block/acpi/acpi.c
+++ b/src/soc/intel/common/block/acpi/acpi.c
@@ -87,7 +87,11 @@ unsigned long acpi_fill_madt(unsigned long current)
size_t ioapic_entries;
/* Local APICs */
- current = acpi_create_madt_lapics_with_nmis(current);
+
+ if (CONFIG(SOC_INTEL_COMMON_BLOCK_ACPI_CPU_HYBRID))
+ current = acpi_create_madt_lapics_with_nmis_hybrid(current);
+ else
+ current = acpi_create_madt_lapics_with_nmis(current);
/* IOAPIC */
ioapic_entries = soc_get_ioapic_info(&ioapic_table);
diff --git a/src/soc/intel/common/block/acpi/cpu_hybrid.c b/src/soc/intel/common/block/acpi/cpu_hybrid.c
index a6f9103380..7725e3fa0a 100644
--- a/src/soc/intel/common/block/acpi/cpu_hybrid.c
+++ b/src/soc/intel/common/block/acpi/cpu_hybrid.c
@@ -77,6 +77,40 @@ static void acpi_set_hybrid_cpu_apicid_order(void *unused)
cpu_apic_info.perf_cpu_cnt = perf_core_cnt;
}
+static unsigned long acpi_create_madt_lapics_hybrid(unsigned long current)
+{
+ size_t index;
+
+ for (index = 0; index < cpu_apic_info.total_cpu_cnt; index++) {
+ if (cpu_apic_info.apic_ids[index] < 0xff)
+ current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current,
+ index, cpu_apic_info.apic_ids[index]);
+ else
+ current += acpi_create_madt_lx2apic((acpi_madt_lx2apic_t *)current,
+ index, cpu_apic_info.apic_ids[index]);
+ }
+
+ return current;
+}
+
+unsigned long acpi_create_madt_lapics_with_nmis_hybrid(unsigned long current)
+{
+ const u16 flags = MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH;
+
+ current = acpi_create_madt_lapics_hybrid(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;
+}
+
static enum cpu_perf_eff_type get_core_type(void)
{
return (get_soc_cpu_type() == CPUID_CORE_TYPE_INTEL_CORE) ?
diff --git a/src/soc/intel/common/block/include/intelblocks/acpi.h b/src/soc/intel/common/block/include/intelblocks/acpi.h
index 0f7a16579b..fa32092568 100644
--- a/src/soc/intel/common/block/include/intelblocks/acpi.h
+++ b/src/soc/intel/common/block/include/intelblocks/acpi.h
@@ -18,6 +18,8 @@ enum core_type {
CPUID_UNKNOWN = 0xff,
};
+unsigned long acpi_create_madt_lapics_with_nmis_hybrid(unsigned long current);
+
/* Generates ACPI code to define _CPC control method */
void acpigen_write_CPPC_hybrid_method(int core_id);