cpu,soc/intel: Separate single SSDT CPU entry
Change-Id: Ic75e8907de9730c6fdb06dbe799a7644fa90f904 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/74399 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Sridhar Siricilla <sridhar.siricilla@intel.com>
This commit is contained in:
@@ -325,6 +325,23 @@ static void generate_P_state_entries(int core, int cores_per_package)
|
|||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generate_cpu_entry(const struct device *device, int cpu, int core, int cores_per_package)
|
||||||
|
{
|
||||||
|
/* Generate Scope(\_SB) { Device(CPUx */
|
||||||
|
acpigen_write_processor_device(cpu * cores_per_package + core);
|
||||||
|
|
||||||
|
/* Generate P-state tables */
|
||||||
|
generate_P_state_entries(core, cores_per_package);
|
||||||
|
|
||||||
|
/* Generate C-state tables */
|
||||||
|
generate_C_state_entries(device);
|
||||||
|
|
||||||
|
/* Generate T-state tables */
|
||||||
|
generate_T_state_entries(cpu, cores_per_package);
|
||||||
|
|
||||||
|
acpigen_write_processor_device_end();
|
||||||
|
}
|
||||||
|
|
||||||
void generate_cpu_entries(const struct device *device)
|
void generate_cpu_entries(const struct device *device)
|
||||||
{
|
{
|
||||||
int totalcores = dev_count_cpu();
|
int totalcores = dev_count_cpu();
|
||||||
@@ -334,23 +351,9 @@ void generate_cpu_entries(const struct device *device)
|
|||||||
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);
|
||||||
|
|
||||||
for (int cpu_id = 0; cpu_id < numcpus; cpu_id++) {
|
for (int cpu_id = 0; cpu_id < numcpus; cpu_id++)
|
||||||
for (int core_id = 0; core_id < cores_per_package; core_id++) {
|
for (int core_id = 0; core_id < cores_per_package; core_id++)
|
||||||
/* Generate Scope(\_SB) { Device(CPUx */
|
generate_cpu_entry(device, cpu_id, core_id, cores_per_package);
|
||||||
acpigen_write_processor_device(cpu_id * cores_per_package + core_id);
|
|
||||||
|
|
||||||
/* Generate P-state tables */
|
|
||||||
generate_P_state_entries(core_id, cores_per_package);
|
|
||||||
|
|
||||||
/* Generate C-state tables */
|
|
||||||
generate_C_state_entries(device);
|
|
||||||
|
|
||||||
/* Generate T-state tables */
|
|
||||||
generate_T_state_entries(cpu_id, cores_per_package);
|
|
||||||
|
|
||||||
acpigen_write_processor_device_end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PPKG is usually used for thermal management
|
/* PPKG is usually used for thermal management
|
||||||
of the first and only package. */
|
of the first and only package. */
|
||||||
|
@@ -203,6 +203,23 @@ static void generate_P_state_entries(int core, int cores_per_package)
|
|||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generate_cpu_entry(int cpu, int core, int cores_per_package)
|
||||||
|
{
|
||||||
|
/* Generate Scope(\_SB) { Device(CPUx */
|
||||||
|
acpigen_write_processor_device(cpu * cores_per_package + core);
|
||||||
|
|
||||||
|
/* Generate P-state tables */
|
||||||
|
generate_P_state_entries(cpu, cores_per_package);
|
||||||
|
|
||||||
|
/* Generate C-state tables */
|
||||||
|
generate_C_state_entries();
|
||||||
|
|
||||||
|
/* Generate T-state tables */
|
||||||
|
generate_T_state_entries(cpu, cores_per_package);
|
||||||
|
|
||||||
|
acpigen_write_processor_device_end();
|
||||||
|
}
|
||||||
|
|
||||||
void generate_cpu_entries(const struct device *device)
|
void generate_cpu_entries(const struct device *device)
|
||||||
{
|
{
|
||||||
int totalcores = dev_count_cpu();
|
int totalcores = dev_count_cpu();
|
||||||
@@ -212,23 +229,9 @@ void generate_cpu_entries(const struct device *device)
|
|||||||
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);
|
||||||
|
|
||||||
for (int cpu_id = 0; cpu_id < numcpus; cpu_id++) {
|
for (int cpu_id = 0; cpu_id < numcpus; cpu_id++)
|
||||||
for (int core_id = 0; core_id < cores_per_package; core_id++) {
|
for (int core_id = 0; core_id < cores_per_package; core_id++)
|
||||||
/* Generate Scope(\_SB) { Device(CPUx */
|
generate_cpu_entry(cpu_id, core_id, cores_per_package);
|
||||||
acpigen_write_processor_device(cpu_id * cores_per_package + core_id);
|
|
||||||
|
|
||||||
/* Generate P-state tables */
|
|
||||||
generate_P_state_entries(cpu_id, cores_per_package);
|
|
||||||
|
|
||||||
/* Generate C-state tables */
|
|
||||||
generate_C_state_entries();
|
|
||||||
|
|
||||||
/* Generate T-state tables */
|
|
||||||
generate_T_state_entries(cpu_id, cores_per_package);
|
|
||||||
|
|
||||||
acpigen_write_processor_device_end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PPKG is usually used for thermal management
|
/* PPKG is usually used for thermal management
|
||||||
of the first and only package. */
|
of the first and only package. */
|
||||||
|
@@ -294,6 +294,23 @@ static void generate_P_state_entries(int core, int cores_per_package)
|
|||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generate_cpu_entry(const struct device *device, int cpu, int core, int cores_per_package)
|
||||||
|
{
|
||||||
|
/* Generate Scope(\_SB) { Device(CPUx */
|
||||||
|
acpigen_write_processor_device(cpu * cores_per_package + core);
|
||||||
|
|
||||||
|
/* Generate P-state tables */
|
||||||
|
generate_P_state_entries(cpu, cores_per_package);
|
||||||
|
|
||||||
|
/* Generate C-state tables */
|
||||||
|
generate_C_state_entries(device);
|
||||||
|
|
||||||
|
/* Generate T-state tables */
|
||||||
|
generate_T_state_entries(cpu, cores_per_package);
|
||||||
|
|
||||||
|
acpigen_write_processor_device_end();
|
||||||
|
}
|
||||||
|
|
||||||
void generate_cpu_entries(const struct device *device)
|
void generate_cpu_entries(const struct device *device)
|
||||||
{
|
{
|
||||||
int totalcores = dev_count_cpu();
|
int totalcores = dev_count_cpu();
|
||||||
@@ -303,23 +320,9 @@ void generate_cpu_entries(const struct device *device)
|
|||||||
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);
|
||||||
|
|
||||||
for (int cpu_id = 0; cpu_id < numcpus; cpu_id++) {
|
for (int cpu_id = 0; cpu_id < numcpus; cpu_id++)
|
||||||
for (int core_id = 0; core_id < cores_per_package; core_id++) {
|
for (int core_id = 0; core_id < cores_per_package; core_id++)
|
||||||
/* Generate Scope(\_SB) { Device(CPUx */
|
generate_cpu_entry(device, cpu_id, core_id, cores_per_package);
|
||||||
acpigen_write_processor_device(cpu_id * cores_per_package + core_id);
|
|
||||||
|
|
||||||
/* Generate P-state tables */
|
|
||||||
generate_P_state_entries(cpu_id, cores_per_package);
|
|
||||||
|
|
||||||
/* Generate C-state tables */
|
|
||||||
generate_C_state_entries(device);
|
|
||||||
|
|
||||||
/* Generate T-state tables */
|
|
||||||
generate_T_state_entries(cpu_id, cores_per_package);
|
|
||||||
|
|
||||||
acpigen_write_processor_device_end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PPKG is usually used for thermal management
|
/* PPKG is usually used for thermal management
|
||||||
of the first and only package. */
|
of the first and only package. */
|
||||||
|
@@ -132,7 +132,7 @@ static int calculate_power(int tdp, int p1_ratio, int ratio)
|
|||||||
return (int)power;
|
return (int)power;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void generate_p_state_entries(int core, int cores_per_package)
|
static void generate_p_state_entries(int core)
|
||||||
{
|
{
|
||||||
int ratio_min, ratio_max, ratio_turbo, ratio_step, ratio_range_2;
|
int ratio_min, ratio_max, ratio_turbo, ratio_step, ratio_range_2;
|
||||||
int coord_type, power_max, power_unit, num_entries;
|
int coord_type, power_max, power_unit, num_entries;
|
||||||
@@ -247,27 +247,31 @@ static void generate_p_state_entries(int core, int cores_per_package)
|
|||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
void generate_cpu_entries(const struct device *device)
|
static void generate_cpu_entry(int core, int cores_per_package)
|
||||||
{
|
{
|
||||||
int core;
|
|
||||||
const struct pattrs *pattrs = pattrs_get();
|
|
||||||
|
|
||||||
for (core = 0; core < pattrs->num_cpus; core++) {
|
|
||||||
/* Generate Scope(\_SB) { Device(CPUx */
|
/* Generate Scope(\_SB) { Device(CPUx */
|
||||||
acpigen_write_processor_device(core);
|
acpigen_write_processor_device(core);
|
||||||
|
|
||||||
/* Generate P-state tables */
|
/* Generate P-state tables */
|
||||||
generate_p_state_entries(core, pattrs->num_cpus);
|
generate_p_state_entries(core);
|
||||||
|
|
||||||
/* Generate C-state tables */
|
/* Generate C-state tables */
|
||||||
acpigen_write_CST_package(cstate_map, ARRAY_SIZE(cstate_map));
|
acpigen_write_CST_package(cstate_map, ARRAY_SIZE(cstate_map));
|
||||||
|
|
||||||
/* Generate T-state tables */
|
/* Generate T-state tables */
|
||||||
generate_t_state_entries(core, pattrs->num_cpus);
|
generate_t_state_entries(core, cores_per_package);
|
||||||
|
|
||||||
acpigen_write_processor_device_end();
|
acpigen_write_processor_device_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generate_cpu_entries(const struct device *device)
|
||||||
|
{
|
||||||
|
int core;
|
||||||
|
const struct pattrs *pattrs = pattrs_get();
|
||||||
|
|
||||||
|
for (core = 0; core < pattrs->num_cpus; core++)
|
||||||
|
generate_cpu_entry(core, pattrs->num_cpus);
|
||||||
|
|
||||||
/* PPKG is usually used for thermal management
|
/* PPKG is usually used for thermal management
|
||||||
of the first and only package. */
|
of the first and only package. */
|
||||||
acpigen_write_processor_package("PPKG", 0, pattrs->num_cpus);
|
acpigen_write_processor_package("PPKG", 0, pattrs->num_cpus);
|
||||||
|
@@ -161,7 +161,7 @@ static int calculate_power(int tdp, int p1_ratio, int ratio)
|
|||||||
return (int)power;
|
return (int)power;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void generate_p_state_entries(int core, int cores_per_package)
|
static void generate_p_state_entries(int core)
|
||||||
{
|
{
|
||||||
int ratio_min, ratio_max, ratio_turbo, ratio_step, ratio_range_2;
|
int ratio_min, ratio_max, ratio_turbo, ratio_step, ratio_range_2;
|
||||||
int coord_type, power_max, power_unit, num_entries;
|
int coord_type, power_max, power_unit, num_entries;
|
||||||
@@ -276,27 +276,31 @@ static void generate_p_state_entries(int core, int cores_per_package)
|
|||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
void generate_cpu_entries(const struct device *device)
|
static void generate_cpu_entry(int core, int cores_per_package)
|
||||||
{
|
{
|
||||||
int core;
|
|
||||||
const struct pattrs *pattrs = pattrs_get();
|
|
||||||
|
|
||||||
for (core = 0; core < pattrs->num_cpus; core++) {
|
|
||||||
/* Generate Scope(\_SB) { Device(CPUx */
|
/* Generate Scope(\_SB) { Device(CPUx */
|
||||||
acpigen_write_processor_device(core);
|
acpigen_write_processor_device(core);
|
||||||
|
|
||||||
/* Generate P-state tables */
|
/* Generate P-state tables */
|
||||||
generate_p_state_entries(core, pattrs->num_cpus);
|
generate_p_state_entries(core);
|
||||||
|
|
||||||
/* Generate C-state tables */
|
/* Generate C-state tables */
|
||||||
acpigen_write_CST_package(cstate_map, ARRAY_SIZE(cstate_map));
|
acpigen_write_CST_package(cstate_map, ARRAY_SIZE(cstate_map));
|
||||||
|
|
||||||
/* Generate T-state tables */
|
/* Generate T-state tables */
|
||||||
generate_t_state_entries(core, pattrs->num_cpus);
|
generate_t_state_entries(core, cores_per_package);
|
||||||
|
|
||||||
acpigen_write_processor_device_end();
|
acpigen_write_processor_device_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generate_cpu_entries(const struct device *device)
|
||||||
|
{
|
||||||
|
int core;
|
||||||
|
const struct pattrs *pattrs = pattrs_get();
|
||||||
|
|
||||||
|
for (core = 0; core < pattrs->num_cpus; core++)
|
||||||
|
generate_cpu_entry(core, pattrs->num_cpus);
|
||||||
|
|
||||||
/* PPKG is usually used for thermal management
|
/* PPKG is usually used for thermal management
|
||||||
of the first and only package. */
|
of the first and only package. */
|
||||||
acpigen_write_processor_package("PPKG", 0, pattrs->num_cpus);
|
acpigen_write_processor_package("PPKG", 0, pattrs->num_cpus);
|
||||||
|
@@ -384,6 +384,22 @@ __weak void soc_power_states_generation(int core_id,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generate_cpu_entry(int cpu, int core, int cores_per_package)
|
||||||
|
{
|
||||||
|
/* Generate processor \_SB.CPUx */
|
||||||
|
acpigen_write_processor_device(cpu * cores_per_package + core);
|
||||||
|
|
||||||
|
/* Generate C-state tables */
|
||||||
|
generate_c_state_entries();
|
||||||
|
|
||||||
|
generate_cppc_entries(core);
|
||||||
|
|
||||||
|
/* Soc specific power states generation */
|
||||||
|
soc_power_states_generation(core, cores_per_package);
|
||||||
|
|
||||||
|
acpigen_write_processor_device_end();
|
||||||
|
}
|
||||||
|
|
||||||
void generate_cpu_entries(const struct device *device)
|
void generate_cpu_entries(const struct device *device)
|
||||||
{
|
{
|
||||||
int core_id, cpu_id;
|
int core_id, cpu_id;
|
||||||
@@ -398,22 +414,10 @@ void generate_cpu_entries(const struct device *device)
|
|||||||
printk(BIOS_DEBUG, "Found %d CPU(s) with %d/%d physical/logical core(s) each.\n",
|
printk(BIOS_DEBUG, "Found %d CPU(s) with %d/%d physical/logical core(s) each.\n",
|
||||||
numcpus, num_phys, num_virt);
|
numcpus, num_phys, num_virt);
|
||||||
|
|
||||||
for (cpu_id = 0; cpu_id < numcpus; cpu_id++) {
|
for (cpu_id = 0; cpu_id < numcpus; cpu_id++)
|
||||||
for (core_id = 0; core_id < num_virt; core_id++) {
|
for (core_id = 0; core_id < num_virt; core_id++)
|
||||||
/* Generate processor \_SB.CPUx */
|
generate_cpu_entry(cpu_id, core_id, num_virt);
|
||||||
acpigen_write_processor_device(cpu_id * num_virt + core_id);
|
|
||||||
|
|
||||||
/* Generate C-state tables */
|
|
||||||
generate_c_state_entries();
|
|
||||||
|
|
||||||
generate_cppc_entries(core_id);
|
|
||||||
|
|
||||||
/* Soc specific power states generation */
|
|
||||||
soc_power_states_generation(core_id, num_virt);
|
|
||||||
|
|
||||||
acpigen_write_processor_device_end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* PPKG is usually used for thermal management
|
/* PPKG is usually used for thermal management
|
||||||
of the first and only package. */
|
of the first and only package. */
|
||||||
acpigen_write_processor_package("PPKG", 0, num_virt);
|
acpigen_write_processor_package("PPKG", 0, num_virt);
|
||||||
|
Reference in New Issue
Block a user