summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/acpi/acpigen.c9
-rw-r--r--src/soc/intel/skylake/acpi.c24
2 files changed, 22 insertions, 11 deletions
diff --git a/src/acpi/acpigen.c b/src/acpi/acpigen.c
index 7b7258469f..4a7dfc9325 100644
--- a/src/acpi/acpigen.c
+++ b/src/acpi/acpigen.c
@@ -10,6 +10,8 @@
#define ACPIGEN_MAXLEN 0xfffff
+#define CPPC_PACKAGE_NAME "GCPC"
+
#include <lib.h>
#include <string.h>
#include <acpi/acpigen.h>
@@ -1578,8 +1580,6 @@ void acpigen_write_dsm_uuid_arr(struct dsm_uuid *ids, size_t count)
acpigen_pop_len(); /* Method _DSM */
}
-#define CPPC_PACKAGE_NAME "\\GCPC"
-
void acpigen_write_CPPC_package(const struct cppc_config *config)
{
u32 i;
@@ -1621,9 +1621,12 @@ void acpigen_write_CPPC_package(const struct cppc_config *config)
void acpigen_write_CPPC_method(void)
{
+ char pscope[16];
+ snprintf(pscope, sizeof(pscope), CONFIG_ACPI_CPU_STRING "." CPPC_PACKAGE_NAME, 0);
+
acpigen_write_method("_CPC", 0);
acpigen_emit_byte(RETURN_OP);
- acpigen_emit_namestring(CPPC_PACKAGE_NAME);
+ acpigen_emit_namestring(pscope);
acpigen_pop_len();
}
diff --git a/src/soc/intel/skylake/acpi.c b/src/soc/intel/skylake/acpi.c
index 637092be97..743b33f9ae 100644
--- a/src/soc/intel/skylake/acpi.c
+++ b/src/soc/intel/skylake/acpi.c
@@ -369,6 +369,19 @@ static void generate_p_state_entries(int core, int cores_per_package)
acpigen_pop_len();
}
+static void generate_cppc_entries(int core_id)
+{
+ /* Generate GCPC table in first logical core */
+ if (core_id == 0) {
+ struct cppc_config cppc_config;
+ cpu_init_cppc_config(&cppc_config, CPPC_VERSION_2);
+ acpigen_write_CPPC_package(&cppc_config);
+ }
+
+ /* Write _CST entry for each logical core */
+ acpigen_write_CPPC_method();
+}
+
void generate_cpu_entries(const struct device *device)
{
int core_id, cpu_id, pcontrol_blk = ACPI_BASE_ADDRESS, plen = 6;
@@ -377,16 +390,11 @@ void generate_cpu_entries(const struct device *device)
int numcpus = totalcores/cores_per_package;
config_t *config = config_of_soc();
int is_s0ix_enable = config->s0ix_enable;
+ const bool isst_supported = cpuid_eax(6) & CPUID_6_EAX_ISST;
printk(BIOS_DEBUG, "Found %d CPU(s) with %d core(s) each.\n",
numcpus, cores_per_package);
- if (cpuid_eax(6) & CPUID_6_EAX_ISST) {
- struct cppc_config cppc_config;
- cpu_init_cppc_config(&cppc_config, 2 /* version 2 */);
- acpigen_write_CPPC_package(&cppc_config);
- }
-
for (cpu_id = 0; cpu_id < numcpus; cpu_id++) {
for (core_id = 0; core_id < cores_per_package; core_id++) {
if (core_id > 0) {
@@ -407,8 +415,8 @@ void generate_cpu_entries(const struct device *device)
cores_per_package);
}
- if (cpuid_eax(6) & CPUID_6_EAX_ISST)
- acpigen_write_CPPC_method();
+ if (isst_supported)
+ generate_cppc_entries(core_id);
acpigen_pop_len();
}