summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorAngel Pons <th3fanbus@gmail.com>2021-01-04 17:37:46 +0100
committerAngel Pons <th3fanbus@gmail.com>2021-02-14 21:54:39 +0000
commitd8b9e562d04d9b3c4085e31af68ec6faeeb5fe82 (patch)
tree56362fd92403edf9cda23fd98777f705f3fa9988 /src/cpu
parentea32c52a0eb9eb9f8cb9ef886e2120d1d5f35753 (diff)
downloadcoreboot-d8b9e562d04d9b3c4085e31af68ec6faeeb5fe82.tar.xz
cpu/intel/model_206ax: Replace `generate_cstate_entries`
Leverage the existing `acpigen_write_CST_package` function. Yes, bad devicetree values can trigger undefined behavior. The old code already had this issue, and will be addressed in subsequent commits. Change-Id: Icec5431987d91242930efcea0c8ea4e3df3182fd Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/49093 Reviewed-by: Nico Huber <nico.h@gmx.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/intel/model_206ax/acpi.c52
1 files changed, 15 insertions, 37 deletions
diff --git a/src/cpu/intel/model_206ax/acpi.c b/src/cpu/intel/model_206ax/acpi.c
index beb2fbc579..6c12261a2b 100644
--- a/src/cpu/intel/model_206ax/acpi.c
+++ b/src/cpu/intel/model_206ax/acpi.c
@@ -19,39 +19,6 @@ static int get_logical_cores_per_package(void)
return msr.lo & 0xffff;
}
-static void generate_cstate_entries(acpi_cstate_t *cstates,
- int c1, int c2, int c3)
-{
- int cstate_count = 0;
-
- /* Count number of active C-states */
- if (c1 > 0)
- ++cstate_count;
- if (c2 > 0)
- ++cstate_count;
- if (c3 > 0)
- ++cstate_count;
-
- acpigen_write_package(cstate_count + 1);
- acpigen_write_byte(cstate_count);
-
- /* Add an entry if the level is enabled */
- if (c1 > 0) {
- cstates[c1].ctype = 1;
- acpigen_write_CST_package_entry(&cstates[c1]);
- }
- if (c2 > 0) {
- cstates[c2].ctype = 2;
- acpigen_write_CST_package_entry(&cstates[c2]);
- }
- if (c3 > 0) {
- cstates[c3].ctype = 3;
- acpigen_write_CST_package_entry(&cstates[c3]);
- }
-
- acpigen_pop_len();
-}
-
static void generate_C_state_entries(void)
{
struct cpu_info *info;
@@ -75,10 +42,21 @@ static void generate_C_state_entries(void)
if (!cpu || !cpu->cstates)
return;
- acpigen_write_method("_CST", 0);
- acpigen_emit_byte(RETURN_OP);
- generate_cstate_entries(cpu->cstates, conf->acpi_c1, conf->acpi_c2, conf->acpi_c3);
- acpigen_pop_len();
+ const int acpi_cstates[3] = { conf->acpi_c1, conf->acpi_c2, conf->acpi_c3 };
+
+ acpi_cstate_t acpi_cstate_map[ARRAY_SIZE(acpi_cstates)] = { 0 };
+
+ /* Count number of active C-states */
+ int count = 0;
+
+ for (int i = 0; i < ARRAY_SIZE(acpi_cstates); i++) {
+ if (acpi_cstates[i] > 0) {
+ acpi_cstate_map[count] = cpu->cstates[acpi_cstates[i]];
+ acpi_cstate_map[count].ctype = i + 1;
+ count++;
+ }
+ }
+ acpigen_write_CST_package(acpi_cstate_map, count);
}
static acpi_tstate_t tss_table_fine[] = {