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);