dptf: Add support for IDSP

\_SB.DPTF.IDSP adverties to the DPTF daemon which policies the
implementation supports. Added a new acpigen function to figure out
which policies are used, and fills out IDSP appropriately.

Change-Id: Idf67a23bf38de4481c02f98ffb27afb8ca2d1b7b
Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/42081
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
This commit is contained in:
Tim Wawrzynczak 2020-06-03 16:27:30 -06:00 committed by Patrick Georgi
parent e4d8ebcef7
commit 03465f4b0f
3 changed files with 58 additions and 0 deletions

View File

@ -9,6 +9,11 @@
/* Defaults */ /* Defaults */
#define DEFAULT_RAW_UNIT "ma" #define DEFAULT_RAW_UNIT "ma"
/* DPTF-specific UUIDs */
#define DPTF_PASSIVE_POLICY_1_0_UUID "42A441D6-AE6A-462B-A84B-4A8CE79027D3"
#define DPTF_CRITICAL_POLICY_UUID "97C68AE7-15FA-499c-B8C9-5DA81D606E0A"
#define DPTF_ACTIVE_POLICY_UUID "3A95C389-E4B8-4629-A526-C52C88626BAE"
enum { enum {
ART_REVISION = 0, ART_REVISION = 0,
DEFAULT_PRIORITY = 100, DEFAULT_PRIORITY = 100,
@ -432,3 +437,40 @@ void dptf_write_tsr_hysteresis(uint8_t hysteresis)
acpigen_write_name_integer("GTSH", hysteresis); acpigen_write_name_integer("GTSH", hysteresis);
} }
void dptf_write_enabled_policies(const struct dptf_active_policy *active_policies,
int active_count,
const struct dptf_passive_policy *passive_policies,
int passive_count,
const struct dptf_critical_policy *critical_policies,
int critical_count)
{
bool is_active_used;
bool is_passive_used;
bool is_critical_used;
int pkg_count;
is_active_used = (active_count && active_policies[0].target != DPTF_NONE);
is_passive_used = (passive_count && passive_policies[0].target != DPTF_NONE);
is_critical_used = (critical_count && critical_policies[0].source != DPTF_NONE);
pkg_count = is_active_used + is_passive_used + is_critical_used;
if (!pkg_count)
return;
acpigen_write_scope(TOPLEVEL_DPTF_SCOPE);
acpigen_write_name("IDSP");
acpigen_write_package(pkg_count);
if (is_active_used)
acpigen_write_uuid(DPTF_ACTIVE_POLICY_UUID);
if (is_passive_used)
acpigen_write_uuid(DPTF_PASSIVE_POLICY_1_0_UUID);
if (is_critical_used)
acpigen_write_uuid(DPTF_CRITICAL_POLICY_UUID);
acpigen_pop_len(); /* Package */
acpigen_pop_len(); /* Scope */
}

View File

@ -69,6 +69,11 @@ static void dptf_fill_ssdt(const struct device *dev)
for (p = DPTF_TEMP_SENSOR_0, i = 0; p <= DPTF_TEMP_SENSOR_3; ++p, ++i) for (p = DPTF_TEMP_SENSOR_0, i = 0; p <= DPTF_TEMP_SENSOR_3; ++p, ++i)
tsr_en[i] = is_participant_used(config, p); tsr_en[i] = is_participant_used(config, p);
/* Policies */
dptf_write_enabled_policies(config->policies.active, DPTF_MAX_ACTIVE_POLICIES,
config->policies.passive, DPTF_MAX_PASSIVE_POLICIES,
config->policies.critical, DPTF_MAX_CRITICAL_POLICIES);
dptf_write_active_policies(config->policies.active, dptf_write_active_policies(config->policies.active,
DPTF_MAX_ACTIVE_POLICIES); DPTF_MAX_ACTIVE_POLICIES);

View File

@ -126,6 +126,17 @@ struct dptf_power_limits {
struct dptf_power_limit_config pl2; struct dptf_power_limit_config pl2;
}; };
/*
* This function writes out \_SB.DPTF.IDSP, which describes the different DPTF policies that
* this implementation is using.
*/
void dptf_write_enabled_policies(const struct dptf_active_policy *active_policies,
int active_count,
const struct dptf_passive_policy *passive_policies,
int passive_count,
const struct dptf_critical_policy *critical_policies,
int critical_count);
/* /*
* This function provides tables of temperature and corresponding fan or percent. When the * This function provides tables of temperature and corresponding fan or percent. When the
* temperature thresholds are met (_AC0 - _AC9), the fan is driven to corresponding percentage * temperature thresholds are met (_AC0 - _AC9), the fan is driven to corresponding percentage