mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 23:34:05 +08:00
platform/x86: thinkpad-acpi: Add support for automatic mode transitions
Some AMD Thinkpads support automatic mode transitions. The actual transition logic doesn't live in the `thinkpad_acpi` driver. The events to activate this logic come from this driver though. Populate these events when switching PSC power modes. Co-developed-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Mark Pearson <markpearson@lenovo.com> Link: https://lore.kernel.org/r/20220603170212.164963-2-markpearson@lenovo.com Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
6fe391dd5d
commit
46dcbc61b7
@ -10266,6 +10266,7 @@ static struct ibm_struct proxsensor_driver_data = {
|
||||
#define DYTC_CMD_FUNC_CAP 3 /* To get DYTC capabilities */
|
||||
#define DYTC_FC_MMC 27 /* MMC Mode supported */
|
||||
#define DYTC_FC_PSC 29 /* PSC Mode supported */
|
||||
#define DYTC_FC_AMT 31 /* AMT mode supported */
|
||||
|
||||
#define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */
|
||||
#define DYTC_GET_MODE_BIT 12 /* Bits 12-15 - mode setting */
|
||||
@ -10278,6 +10279,10 @@ static struct ibm_struct proxsensor_driver_data = {
|
||||
#define DYTC_FUNCTION_CQL 1 /* Function = 1, lap mode */
|
||||
#define DYTC_FUNCTION_MMC 11 /* Function = 11, MMC mode */
|
||||
#define DYTC_FUNCTION_PSC 13 /* Function = 13, PSC mode */
|
||||
#define DYTC_FUNCTION_AMT 15 /* Function = 15, AMT mode */
|
||||
|
||||
#define DYTC_MODE_AMT_ENABLE 0x1 /* Enable AMT (in balanced mode) */
|
||||
#define DYTC_MODE_AMT_DISABLE 0xF /* Disable AMT (in other modes) */
|
||||
|
||||
#define DYTC_MODE_MMC_PERFORM 2 /* High power mode aka performance */
|
||||
#define DYTC_MODE_MMC_LOWPOWER 3 /* Low power mode */
|
||||
@ -10298,6 +10303,8 @@ static struct ibm_struct proxsensor_driver_data = {
|
||||
|
||||
#define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 0)
|
||||
#define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 1)
|
||||
static int dytc_control_amt(bool enable);
|
||||
static bool dytc_amt_active;
|
||||
|
||||
static enum platform_profile_option dytc_current_profile;
|
||||
static atomic_t dytc_ignore_event = ATOMIC_INIT(0);
|
||||
@ -10380,6 +10387,30 @@ static int dytc_profile_get(struct platform_profile_handler *pprof,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dytc_control_amt(bool enable)
|
||||
{
|
||||
int dummy;
|
||||
int err;
|
||||
int cmd;
|
||||
|
||||
if (!(dytc_capabilities & BIT(DYTC_FC_AMT))) {
|
||||
pr_warn("Attempting to toggle AMT on a system that doesn't advertise support\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (enable)
|
||||
cmd = DYTC_SET_COMMAND(DYTC_FUNCTION_AMT, DYTC_MODE_AMT_ENABLE, enable);
|
||||
else
|
||||
cmd = DYTC_SET_COMMAND(DYTC_FUNCTION_AMT, DYTC_MODE_AMT_DISABLE, enable);
|
||||
|
||||
pr_debug("%sabling AMT (cmd 0x%x)", enable ? "en":"dis", cmd);
|
||||
err = dytc_command(cmd, &dummy);
|
||||
if (err)
|
||||
return err;
|
||||
dytc_amt_active = enable;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function - check if we are in CQL mode and if we are
|
||||
* - disable CQL,
|
||||
@ -10462,6 +10493,9 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
|
||||
err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output);
|
||||
if (err)
|
||||
goto unlock;
|
||||
/* system supports AMT, activate it when on balanced */
|
||||
if (dytc_capabilities & BIT(DYTC_FC_AMT))
|
||||
dytc_control_amt(profile == PLATFORM_PROFILE_BALANCED);
|
||||
}
|
||||
/* Success - update current profile */
|
||||
dytc_current_profile = profile;
|
||||
|
Loading…
Reference in New Issue
Block a user