diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/acpi/acpigen_dptf.c | 41 | ||||
-rw-r--r-- | src/drivers/intel/dptf/chip.h | 4 | ||||
-rw-r--r-- | src/drivers/intel/dptf/dptf.c | 3 | ||||
-rw-r--r-- | src/include/acpi/acpigen_dptf.h | 17 |
4 files changed, 65 insertions, 0 deletions
diff --git a/src/acpi/acpigen_dptf.c b/src/acpi/acpigen_dptf.c index 88cf386bc8..c18caf673e 100644 --- a/src/acpi/acpigen_dptf.c +++ b/src/acpi/acpigen_dptf.c @@ -7,6 +7,8 @@ #define TOPLEVEL_DPTF_SCOPE "\\_SB.DPTF" /* Defaults */ +#define DEFAULT_RAW_UNIT "ma" + enum { ART_REVISION = 0, DEFAULT_PRIORITY = 100, @@ -280,3 +282,42 @@ void dptf_write_critical_policies(const struct dptf_critical_policy *policies, i acpigen_pop_len(); /* Scope */ } } + +void dptf_write_charger_perf(const struct dptf_charger_perf *states, int max_count) +{ + char *pkg_count; + int i; + + if (!max_count || !states[0].control) + return; + + dptf_write_scope(DPTF_CHARGER); + + /* PPSS - Participant Performance Supported States */ + acpigen_write_method("PPSS", 0); + acpigen_emit_byte(RETURN_OP); + + pkg_count = acpigen_write_package(0); + for (i = 0; i < max_count; ++i) { + if (!states[i].control) + break; + + (*pkg_count)++; + + /* + * 0, 0, 0, 0, # Reserved + * Control, Raw Performance, Raw Unit, 0 # Reserved + */ + acpigen_write_package(8); + write_zeros(4); + acpigen_write_integer(states[i].control); + acpigen_write_integer(states[i].raw_perf); + acpigen_write_string(DEFAULT_RAW_UNIT); + acpigen_write_integer(0); + acpigen_pop_len(); /* inner Package */ + } + + acpigen_pop_len(); /* outer Package */ + acpigen_pop_len(); /* Method PPSS */ + acpigen_pop_len(); /* Scope */ +} diff --git a/src/drivers/intel/dptf/chip.h b/src/drivers/intel/dptf/chip.h index 8d77603f9e..528ba8354e 100644 --- a/src/drivers/intel/dptf/chip.h +++ b/src/drivers/intel/dptf/chip.h @@ -11,6 +11,10 @@ struct drivers_intel_dptf_config { struct dptf_critical_policy critical[DPTF_MAX_CRITICAL_POLICIES]; struct dptf_passive_policy passive[DPTF_MAX_PASSIVE_POLICIES]; } policies; + + struct { + struct dptf_charger_perf charger_perf[DPTF_MAX_CHARGER_PERF_STATES]; + } controls; }; #endif /* _DRIVERS_INTEL_DPTF_CHIP_H_ */ diff --git a/src/drivers/intel/dptf/dptf.c b/src/drivers/intel/dptf/dptf.c index 5cad07dade..a20087fff3 100644 --- a/src/drivers/intel/dptf/dptf.c +++ b/src/drivers/intel/dptf/dptf.c @@ -72,6 +72,9 @@ static void dptf_fill_ssdt(const struct device *dev) dptf_write_critical_policies(config->policies.critical, DPTF_MAX_CRITICAL_POLICIES); + /* Controls */ + dptf_write_charger_perf(config->controls.charger_perf, DPTF_MAX_CHARGER_PERF_STATES); + printk(BIOS_INFO, "\\_SB.DPTF: %s at %s\n", dev->chip_ops->name, dev_path(dev)); } diff --git a/src/include/acpi/acpigen_dptf.h b/src/include/acpi/acpigen_dptf.h index 45fbe8f29f..7588752aac 100644 --- a/src/include/acpi/acpigen_dptf.h +++ b/src/include/acpi/acpigen_dptf.h @@ -29,6 +29,9 @@ enum { DPTF_MAX_ACTIVE_POLICIES = (DPTF_PARTICIPANT_COUNT-1), DPTF_MAX_PASSIVE_POLICIES = (DPTF_PARTICIPANT_COUNT-1), DPTF_MAX_CRITICAL_POLICIES = (DPTF_PARTICIPANT_COUNT-1), + + /* Maximum found by automatic inspection (awk) */ + DPTF_MAX_CHARGER_PERF_STATES = 10, }; /* Active Policy */ @@ -76,6 +79,14 @@ struct dptf_critical_policy { uint8_t temp; }; +/* Different levels of charging capability, chosen by passive policies */ +struct dptf_charger_perf { + /* Control value */ + uint8_t control; + /* Charging performance, in mA */ + uint16_t raw_perf; +}; + /* * 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 @@ -98,6 +109,12 @@ void dptf_write_passive_policies(const struct dptf_passive_policy *policies, int */ void dptf_write_critical_policies(const struct dptf_critical_policy *policies, int max_count); +/* + * These are various performance levels for battery charging. They can be used in conjunction + * with passive policies to lower the charging rate when the _PSV threshold is met. + */ +void dptf_write_charger_perf(const struct dptf_charger_perf *perf, int max_count); + /* Helper method to open the scope for a given participant. */ void dptf_write_scope(enum dptf_participant participant); |