soc/intel/skl,acpi/acpigen: convert global CPPC package to local one
Move the global CPPC package \GCPC to the first logical core CP00 and adapt the reference in the other cores. This is cleaner and avoids confusion. Test: dumped SSDT on Supermicro X11SSM-F and verified decompiled version Change-Id: I40b9fd644622196da434128895eb6fb96fdf254d Signed-off-by: Michael Niewöhner <foss@mniewoehner.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/46465 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
This commit is contained in:
parent
9e20e2f158
commit
b20aac0721
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
#define ACPIGEN_MAXLEN 0xfffff
|
#define ACPIGEN_MAXLEN 0xfffff
|
||||||
|
|
||||||
|
#define CPPC_PACKAGE_NAME "GCPC"
|
||||||
|
|
||||||
#include <lib.h>
|
#include <lib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <acpi/acpigen.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 */
|
acpigen_pop_len(); /* Method _DSM */
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CPPC_PACKAGE_NAME "\\GCPC"
|
|
||||||
|
|
||||||
void acpigen_write_CPPC_package(const struct cppc_config *config)
|
void acpigen_write_CPPC_package(const struct cppc_config *config)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
|
@ -1621,9 +1621,12 @@ void acpigen_write_CPPC_package(const struct cppc_config *config)
|
||||||
|
|
||||||
void acpigen_write_CPPC_method(void)
|
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_write_method("_CPC", 0);
|
||||||
acpigen_emit_byte(RETURN_OP);
|
acpigen_emit_byte(RETURN_OP);
|
||||||
acpigen_emit_namestring(CPPC_PACKAGE_NAME);
|
acpigen_emit_namestring(pscope);
|
||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -369,6 +369,19 @@ static void generate_p_state_entries(int core, int cores_per_package)
|
||||||
acpigen_pop_len();
|
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)
|
void generate_cpu_entries(const struct device *device)
|
||||||
{
|
{
|
||||||
int core_id, cpu_id, pcontrol_blk = ACPI_BASE_ADDRESS, plen = 6;
|
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;
|
int numcpus = totalcores/cores_per_package;
|
||||||
config_t *config = config_of_soc();
|
config_t *config = config_of_soc();
|
||||||
int is_s0ix_enable = config->s0ix_enable;
|
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",
|
printk(BIOS_DEBUG, "Found %d CPU(s) with %d core(s) each.\n",
|
||||||
numcpus, cores_per_package);
|
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 (cpu_id = 0; cpu_id < numcpus; cpu_id++) {
|
||||||
for (core_id = 0; core_id < cores_per_package; core_id++) {
|
for (core_id = 0; core_id < cores_per_package; core_id++) {
|
||||||
if (core_id > 0) {
|
if (core_id > 0) {
|
||||||
|
@ -407,8 +415,8 @@ void generate_cpu_entries(const struct device *device)
|
||||||
cores_per_package);
|
cores_per_package);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpuid_eax(6) & CPUID_6_EAX_ISST)
|
if (isst_supported)
|
||||||
acpigen_write_CPPC_method();
|
generate_cppc_entries(core_id);
|
||||||
|
|
||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue