soc/amd: Refactor DPTC Tablet Mode
Refactor AMD DPTC tablet mode in preparation for adding low/no battery DPTC settings. 1. Refactor and simplify acpigen_write_alib_dptc() into the following functions: - acpigen_write_alib_dptc_default() - acpigen_write_alib_dptc_tablet() 2. Add device tree register value dptc_tablet_mode_enable to control whether DPTC tablet mode is enabled for a variant. 3. Add dptc.asl to perform the necessary ACPI checking before modifying the DPTC settings. BRANCH=none BUG=b:217911928 TEST=Build zork TEST=Build nipperkin TEST=Boot skyrim Change-Id: I2518fdd526868c9d5668a6018fd3570392e809c0 Signed-off-by: Tim Van Patten <timvp@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/66994 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Karthik Ramasubramanian <kramasub@google.com>
This commit is contained in:
committed by
Felix Held
parent
14bed61ba1
commit
9244358536
@ -30,7 +30,7 @@ chip soc/amd/picasso
|
|||||||
register "telemetry_vddcr_soc_offset" = "0"
|
register "telemetry_vddcr_soc_offset" = "0"
|
||||||
|
|
||||||
# Set STAPM confiuration for tablet mode
|
# Set STAPM confiuration for tablet mode
|
||||||
register "dptc_enable" = "true"
|
register "dptc_tablet_mode_enable" = "true"
|
||||||
register "slow_ppt_limit_tablet_mode_mW" = "20000"
|
register "slow_ppt_limit_tablet_mode_mW" = "20000"
|
||||||
register "fast_ppt_limit_tablet_mode_mW" = "24000"
|
register "fast_ppt_limit_tablet_mode_mW" = "24000"
|
||||||
register "sustained_power_limit_tablet_mode_mW" = "12000"
|
register "sustained_power_limit_tablet_mode_mW" = "12000"
|
||||||
|
@ -27,10 +27,12 @@ Scope(\_SB) {
|
|||||||
|
|
||||||
#include <soc/amd/common/acpi/upep.asl>
|
#include <soc/amd/common/acpi/upep.asl>
|
||||||
|
|
||||||
|
#include <soc/amd/common/acpi/dptc.asl>
|
||||||
|
|
||||||
#include "rtc_workaround.asl"
|
#include "rtc_workaround.asl"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Platform Wake Notify
|
* Platform Notify
|
||||||
*
|
*
|
||||||
* This is called by soc/amd/common/acpi/platform.asl.
|
* This is called by soc/amd/common/acpi/platform.asl.
|
||||||
*/
|
*/
|
||||||
|
@ -86,10 +86,10 @@ struct soc_amd_cezanne_config {
|
|||||||
uint32_t telemetry_vddcrsocfull_scale_current_mA;
|
uint32_t telemetry_vddcrsocfull_scale_current_mA;
|
||||||
uint32_t telemetry_vddcrsocoffset;
|
uint32_t telemetry_vddcrsocoffset;
|
||||||
|
|
||||||
/* Enable dptc for tablet mode */
|
/* Enable dptc tablet mode */
|
||||||
bool dptc_enable;
|
bool dptc_tablet_mode_enable;
|
||||||
|
|
||||||
/* STAPM Configuration for tablet mode (need enable dptc_enable first) */
|
/* STAPM Configuration for tablet mode */
|
||||||
uint32_t fast_ppt_limit_tablet_mode_mW;
|
uint32_t fast_ppt_limit_tablet_mode_mW;
|
||||||
uint32_t slow_ppt_limit_tablet_mode_mW;
|
uint32_t slow_ppt_limit_tablet_mode_mW;
|
||||||
uint32_t sustained_power_limit_tablet_mode_mW;
|
uint32_t sustained_power_limit_tablet_mode_mW;
|
||||||
|
@ -186,21 +186,24 @@ static void acipgen_dptci(void)
|
|||||||
{
|
{
|
||||||
const struct soc_amd_cezanne_config *config = config_of_soc();
|
const struct soc_amd_cezanne_config *config = config_of_soc();
|
||||||
|
|
||||||
if (!config->dptc_enable)
|
if (!config->dptc_tablet_mode_enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* DPTC is enabled. Always fill out the default DPTC values. */
|
||||||
struct dptc_input default_input = DPTC_INPUTS(config->thermctl_limit_degreeC,
|
struct dptc_input default_input = DPTC_INPUTS(config->thermctl_limit_degreeC,
|
||||||
config->sustained_power_limit_mW,
|
config->sustained_power_limit_mW,
|
||||||
config->fast_ppt_limit_mW,
|
config->fast_ppt_limit_mW,
|
||||||
config->slow_ppt_limit_mW);
|
config->slow_ppt_limit_mW);
|
||||||
|
acpigen_write_alib_dptc_default((uint8_t *)&default_input, sizeof(default_input));
|
||||||
|
|
||||||
|
/* Tablet Mode */
|
||||||
struct dptc_input tablet_mode_input = DPTC_INPUTS(
|
struct dptc_input tablet_mode_input = DPTC_INPUTS(
|
||||||
config->thermctl_limit_tablet_mode_degreeC,
|
config->thermctl_limit_tablet_mode_degreeC,
|
||||||
config->sustained_power_limit_tablet_mode_mW,
|
config->sustained_power_limit_tablet_mode_mW,
|
||||||
config->fast_ppt_limit_tablet_mode_mW,
|
config->fast_ppt_limit_tablet_mode_mW,
|
||||||
config->slow_ppt_limit_tablet_mode_mW);
|
config->slow_ppt_limit_tablet_mode_mW);
|
||||||
|
acpigen_write_alib_dptc_tablet((uint8_t *)&tablet_mode_input,
|
||||||
acpigen_write_alib_dptc((uint8_t *)&default_input, sizeof(default_input),
|
sizeof(tablet_mode_input));
|
||||||
(uint8_t *)&tablet_mode_input, sizeof(tablet_mode_input));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void root_complex_fill_ssdt(const struct device *device)
|
static void root_complex_fill_ssdt(const struct device *device)
|
||||||
|
25
src/soc/amd/common/acpi/dptc.asl
Normal file
25
src/soc/amd/common/acpi/dptc.asl
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
External(\_SB.DDEF, MethodObj)
|
||||||
|
External(\_SB.DTAB, MethodObj)
|
||||||
|
|
||||||
|
Scope (\_SB)
|
||||||
|
{
|
||||||
|
Method (DPTC, 0, Serialized)
|
||||||
|
{
|
||||||
|
/* If _SB.DDEF is not present, DPTC is not enabled so return early. */
|
||||||
|
If (!CondRefOf (\_SB.DDEF))
|
||||||
|
{
|
||||||
|
Return (Zero)
|
||||||
|
}
|
||||||
|
|
||||||
|
If (CondRefOf (\_SB.DTAB) && (\_SB.PCI0.LPCB.EC0.TBMD == One))
|
||||||
|
{
|
||||||
|
\_SB.DTAB()
|
||||||
|
Return (Zero)
|
||||||
|
}
|
||||||
|
|
||||||
|
\_SB.DDEF()
|
||||||
|
Return (Zero)
|
||||||
|
}
|
||||||
|
}
|
@ -16,28 +16,60 @@ static void acpigen_dptc_call_alib(const char *buf_name, uint8_t *buffer, size_t
|
|||||||
acpigen_emit_namestring(buf_name);
|
acpigen_emit_namestring(buf_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpigen_write_alib_dptc(uint8_t *default_param, size_t default_param_len,
|
void acpigen_write_alib_dptc_default(uint8_t *default_param, size_t default_param_len)
|
||||||
uint8_t *tablet_param, size_t tablet_param_len)
|
|
||||||
{
|
{
|
||||||
/* Scope (\_SB) */
|
/* Scope (\_SB) */
|
||||||
acpigen_write_scope("\\_SB");
|
acpigen_write_scope("\\_SB");
|
||||||
|
|
||||||
/* Method(DPTC, 0, Serialized) */
|
/* Default (Unthrottled) Mode */
|
||||||
acpigen_write_method_serialized("DPTC", 0);
|
/* Scope (\_SB)
|
||||||
|
* {
|
||||||
/* TODO: The code assumes that if DPTC gets called the following object exists */
|
* Method (DDEF, 0, Serialized)
|
||||||
/* If (LEqual ("\_SB.PCI0.LPCB.EC0.TBMD", 1)) */
|
* {
|
||||||
acpigen_write_if_lequal_namestr_int("\\_SB.PCI0.LPCB.EC0.TBMD", 1);
|
* Debug = "DPTC: Using normal SOC DPTC Settings."
|
||||||
|
* Name (DEFB, Buffer (0x25)
|
||||||
acpigen_dptc_call_alib("TABB", tablet_param, tablet_param_len);
|
* {
|
||||||
|
* ...
|
||||||
/* Else */
|
* })
|
||||||
acpigen_write_else();
|
* \_SB.ALIB
|
||||||
|
* 0x0C
|
||||||
|
* DEFB
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
acpigen_write_method_serialized("DDEF", 0);
|
||||||
|
acpigen_write_debug_string("DPTC: Using normal SOC DPTC Settings.");
|
||||||
acpigen_dptc_call_alib("DEFB", default_param, default_param_len);
|
acpigen_dptc_call_alib("DEFB", default_param, default_param_len);
|
||||||
|
acpigen_write_method_end();
|
||||||
|
|
||||||
acpigen_pop_len(); /* Else */
|
acpigen_write_scope_end();
|
||||||
|
}
|
||||||
acpigen_pop_len(); /* Method DPTC */
|
|
||||||
acpigen_pop_len(); /* Scope \_SB */
|
void acpigen_write_alib_dptc_tablet(uint8_t *tablet_param, size_t tablet_param_len)
|
||||||
|
{
|
||||||
|
/* Scope (\_SB) */
|
||||||
|
acpigen_write_scope("\\_SB");
|
||||||
|
|
||||||
|
/* Tablet Mode */
|
||||||
|
/* Scope (\_SB)
|
||||||
|
* {
|
||||||
|
* Method (DTAB, 0, Serialized)
|
||||||
|
* {
|
||||||
|
* Debug = "DPTC: Using tablet mode SOC DPTC Settings."
|
||||||
|
* Name (TABB, Buffer (0x25)
|
||||||
|
* {
|
||||||
|
* ...
|
||||||
|
* })
|
||||||
|
* \_SB.ALIB
|
||||||
|
* 0x0C
|
||||||
|
* TABB
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
acpigen_write_method_serialized("DTAB", 0);
|
||||||
|
acpigen_write_debug_string("DPTC: Using tablet mode SOC DPTC Settings.");
|
||||||
|
acpigen_dptc_call_alib("TABB", tablet_param, tablet_param_len);
|
||||||
|
acpigen_write_method_end();
|
||||||
|
|
||||||
|
acpigen_write_scope_end();
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,8 @@ struct alib_dptc_param {
|
|||||||
uint32_t value;
|
uint32_t value;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
void acpigen_write_alib_dptc(uint8_t *default_param, size_t default_param_len,
|
void acpigen_write_alib_dptc_default(uint8_t *default_param, size_t default_param_len);
|
||||||
uint8_t *tablet_param, size_t tablet_param_len);
|
void acpigen_write_alib_dptc_tablet(uint8_t *tablet_param, size_t tablet_param_len);
|
||||||
|
|
||||||
#endif /* !__ACPI__ */
|
#endif /* !__ACPI__ */
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ config SOC_SPECIFIC_OPTIONS
|
|||||||
select SOC_AMD_COMMON_BLOCK_ACP_GEN2
|
select SOC_AMD_COMMON_BLOCK_ACP_GEN2
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPIMMIO
|
select SOC_AMD_COMMON_BLOCK_ACPIMMIO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_ALIB # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI_ALIB
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_CPPC
|
select SOC_AMD_COMMON_BLOCK_ACPI_CPPC
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
select SOC_AMD_COMMON_BLOCK_ACPI_GPIO
|
||||||
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct
|
||||||
|
@ -29,10 +29,12 @@ Scope(\_SB) {
|
|||||||
|
|
||||||
#include <soc/amd/common/acpi/upep.asl>
|
#include <soc/amd/common/acpi/upep.asl>
|
||||||
|
|
||||||
|
#include <soc/amd/common/acpi/dptc.asl>
|
||||||
|
|
||||||
#include "rtc_workaround.asl"
|
#include "rtc_workaround.asl"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Platform Wake Notify
|
* Platform Notify
|
||||||
*
|
*
|
||||||
* This is called by soc/amd/common/acpi/platform.asl.
|
* This is called by soc/amd/common/acpi/platform.asl.
|
||||||
*/
|
*/
|
||||||
|
@ -82,10 +82,10 @@ struct soc_amd_mendocino_config {
|
|||||||
uint32_t telemetry_vddcrsocfull_scale_current_mA;
|
uint32_t telemetry_vddcrsocfull_scale_current_mA;
|
||||||
uint32_t telemetry_vddcrsocoffset;
|
uint32_t telemetry_vddcrsocoffset;
|
||||||
|
|
||||||
/* Enable dptc for tablet mode */
|
/* Enable dptc tablet mode */
|
||||||
bool dptc_enable;
|
bool dptc_tablet_mode_enable;
|
||||||
|
|
||||||
/* STAPM Configuration for tablet mode (need enable dptc_enable first) */
|
/* STAPM Configuration for tablet mode */
|
||||||
uint32_t fast_ppt_limit_tablet_mode_mW;
|
uint32_t fast_ppt_limit_tablet_mode_mW;
|
||||||
uint32_t slow_ppt_limit_tablet_mode_mW;
|
uint32_t slow_ppt_limit_tablet_mode_mW;
|
||||||
uint32_t sustained_power_limit_tablet_mode_mW;
|
uint32_t sustained_power_limit_tablet_mode_mW;
|
||||||
|
@ -188,21 +188,24 @@ static void acipgen_dptci(void)
|
|||||||
{
|
{
|
||||||
const struct soc_amd_mendocino_config *config = config_of_soc();
|
const struct soc_amd_mendocino_config *config = config_of_soc();
|
||||||
|
|
||||||
if (!config->dptc_enable)
|
if (!config->dptc_tablet_mode_enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* DPTC is enabled. Always fill out the default DPTC values. */
|
||||||
struct dptc_input default_input = DPTC_INPUTS(config->thermctl_limit_degreeC,
|
struct dptc_input default_input = DPTC_INPUTS(config->thermctl_limit_degreeC,
|
||||||
config->sustained_power_limit_mW,
|
config->sustained_power_limit_mW,
|
||||||
config->fast_ppt_limit_mW,
|
config->fast_ppt_limit_mW,
|
||||||
config->slow_ppt_limit_mW);
|
config->slow_ppt_limit_mW);
|
||||||
|
acpigen_write_alib_dptc_default((uint8_t *)&default_input, sizeof(default_input));
|
||||||
|
|
||||||
|
/* Tablet Mode */
|
||||||
struct dptc_input tablet_mode_input = DPTC_INPUTS(
|
struct dptc_input tablet_mode_input = DPTC_INPUTS(
|
||||||
config->thermctl_limit_tablet_mode_degreeC,
|
config->thermctl_limit_tablet_mode_degreeC,
|
||||||
config->sustained_power_limit_tablet_mode_mW,
|
config->sustained_power_limit_tablet_mode_mW,
|
||||||
config->fast_ppt_limit_tablet_mode_mW,
|
config->fast_ppt_limit_tablet_mode_mW,
|
||||||
config->slow_ppt_limit_tablet_mode_mW);
|
config->slow_ppt_limit_tablet_mode_mW);
|
||||||
|
acpigen_write_alib_dptc_tablet((uint8_t *)&tablet_mode_input,
|
||||||
acpigen_write_alib_dptc((uint8_t *)&default_input, sizeof(default_input),
|
sizeof(tablet_mode_input));
|
||||||
(uint8_t *)&tablet_mode_input, sizeof(tablet_mode_input));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void root_complex_fill_ssdt(const struct device *device)
|
static void root_complex_fill_ssdt(const struct device *device)
|
||||||
|
@ -16,3 +16,5 @@ Device(PCI0) {
|
|||||||
|
|
||||||
/* Add GPIO library */
|
/* Add GPIO library */
|
||||||
#include <soc/amd/common/acpi/gpio_bank_lib.asl>
|
#include <soc/amd/common/acpi/gpio_bank_lib.asl>
|
||||||
|
|
||||||
|
#include <soc/amd/common/acpi/dptc.asl>
|
||||||
|
@ -117,10 +117,10 @@ struct soc_amd_picasso_config {
|
|||||||
uint32_t stapm_time_constant_s;
|
uint32_t stapm_time_constant_s;
|
||||||
uint32_t sustained_power_limit_mW;
|
uint32_t sustained_power_limit_mW;
|
||||||
|
|
||||||
/* Enable dptc for tablet mode */
|
/* Enable dptc tablet mode */
|
||||||
bool dptc_enable;
|
bool dptc_tablet_mode_enable;
|
||||||
|
|
||||||
/* STAPM Configuration for tablet mode (need enable dptc_enable first) */
|
/* STAPM Configuration for tablet mode */
|
||||||
uint32_t fast_ppt_limit_tablet_mode_mW;
|
uint32_t fast_ppt_limit_tablet_mode_mW;
|
||||||
uint32_t slow_ppt_limit_tablet_mode_mW;
|
uint32_t slow_ppt_limit_tablet_mode_mW;
|
||||||
uint32_t sustained_power_limit_tablet_mode_mW;
|
uint32_t sustained_power_limit_tablet_mode_mW;
|
||||||
|
@ -184,21 +184,24 @@ static void acipgen_dptci(void)
|
|||||||
{
|
{
|
||||||
const struct soc_amd_picasso_config *config = config_of_soc();
|
const struct soc_amd_picasso_config *config = config_of_soc();
|
||||||
|
|
||||||
if (!config->dptc_enable)
|
if (!config->dptc_tablet_mode_enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* DPTC is enabled. Always fill out the default DPTC values. */
|
||||||
struct dptc_input default_input = DPTC_INPUTS(config->thermctl_limit_degreeC,
|
struct dptc_input default_input = DPTC_INPUTS(config->thermctl_limit_degreeC,
|
||||||
config->sustained_power_limit_mW,
|
config->sustained_power_limit_mW,
|
||||||
config->fast_ppt_limit_mW,
|
config->fast_ppt_limit_mW,
|
||||||
config->slow_ppt_limit_mW);
|
config->slow_ppt_limit_mW);
|
||||||
|
acpigen_write_alib_dptc_default((uint8_t *)&default_input, sizeof(default_input));
|
||||||
|
|
||||||
|
/* Tablet Mode */
|
||||||
struct dptc_input tablet_mode_input = DPTC_INPUTS(
|
struct dptc_input tablet_mode_input = DPTC_INPUTS(
|
||||||
config->thermctl_limit_tablet_mode_degreeC,
|
config->thermctl_limit_tablet_mode_degreeC,
|
||||||
config->sustained_power_limit_tablet_mode_mW,
|
config->sustained_power_limit_tablet_mode_mW,
|
||||||
config->fast_ppt_limit_tablet_mode_mW,
|
config->fast_ppt_limit_tablet_mode_mW,
|
||||||
config->slow_ppt_limit_tablet_mode_mW);
|
config->slow_ppt_limit_tablet_mode_mW);
|
||||||
|
acpigen_write_alib_dptc_tablet((uint8_t *)&tablet_mode_input,
|
||||||
acpigen_write_alib_dptc((uint8_t *)&default_input, sizeof(default_input),
|
sizeof(tablet_mode_input));
|
||||||
(uint8_t *)&tablet_mode_input, sizeof(tablet_mode_input));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void root_complex_fill_ssdt(const struct device *device)
|
static void root_complex_fill_ssdt(const struct device *device)
|
||||||
|
Reference in New Issue
Block a user