Message ID | 20210406233203.232860-1-markpearson@lenovo.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | [v2] Add support for DYTC MMC_GET BIOS API. | expand |
Hi, On 4/7/21 1:32 AM, Mark Pearson wrote: > The BIOS team have added a new API that allows us to retrieve the > current performance profile without having to disable/enable CQL > mode. Adding the changes to use this API. > > Tested on P15 and X1C8 > > Signed-off-by: Mark Pearson <markpearson@lenovo.com> Thank you for your patch, I've applied this patch to my review-hans branch: https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans Note it will show up in my review-hans branch once I've pushed my local branch there, which might take a while. Once I've run some tests on this branch the patches there will be added to the platform-drivers-x86/for-next branch and eventually will be included in the pdx86 pull-request to Linus for the next merge-window. Regards, Hans > --- > Changes in v2: > - remove unwanted debug code > > drivers/platform/x86/thinkpad_acpi.c | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > > diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c > index 0d9e2ddbf..07de21941 100644 > --- a/drivers/platform/x86/thinkpad_acpi.c > +++ b/drivers/platform/x86/thinkpad_acpi.c > @@ -10050,6 +10050,7 @@ static struct ibm_struct proxsensor_driver_data = { > */ > > #define DYTC_CMD_SET 1 /* To enable/disable IC function mode */ > +#define DYTC_CMD_MMC_GET 8 /* To get current MMC function and mode */ > #define DYTC_CMD_RESET 0x1ff /* To reset back to default */ > > #define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */ > @@ -10066,6 +10067,10 @@ static struct ibm_struct proxsensor_driver_data = { > #define DYTC_MODE_PERFORM 2 /* High power mode aka performance */ > #define DYTC_MODE_LOWPOWER 3 /* Low power mode */ > #define DYTC_MODE_BALANCE 0xF /* Default mode aka balanced */ > +#define DYTC_MODE_MMC_BALANCE 0 /* Default mode from MMC_GET, aka balanced */ > + > +#define DYTC_ERR_MASK 0xF /* Bits 0-3 in cmd result are the error result */ > +#define DYTC_ERR_SUCCESS 1 /* CMD completed successful */ > > #define DYTC_SET_COMMAND(function, mode, on) \ > (DYTC_CMD_SET | (function) << DYTC_SET_FUNCTION_BIT | \ > @@ -10080,6 +10085,7 @@ static bool dytc_profile_available; > static enum platform_profile_option dytc_current_profile; > static atomic_t dytc_ignore_event = ATOMIC_INIT(0); > static DEFINE_MUTEX(dytc_mutex); > +static bool dytc_mmc_get_available; > > static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) > { > @@ -10088,6 +10094,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p > *profile = PLATFORM_PROFILE_LOW_POWER; > break; > case DYTC_MODE_BALANCE: > + case DYTC_MODE_MMC_BALANCE: > *profile = PLATFORM_PROFILE_BALANCED; > break; > case DYTC_MODE_PERFORM: > @@ -10165,7 +10172,6 @@ static int dytc_cql_command(int command, int *output) > if (err) > return err; > } > - > return cmd_err; > } > > @@ -10222,7 +10228,10 @@ static void dytc_profile_refresh(void) > int perfmode; > > mutex_lock(&dytc_mutex); > - err = dytc_cql_command(DYTC_CMD_GET, &output); > + if (dytc_mmc_get_available) > + err = dytc_command(DYTC_CMD_MMC_GET, &output); > + else > + err = dytc_cql_command(DYTC_CMD_GET, &output); > mutex_unlock(&dytc_mutex); > if (err) > return; > @@ -10271,6 +10280,16 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm) > if (dytc_version >= 5) { > dbg_printk(TPACPI_DBG_INIT, > "DYTC version %d: thermal mode available\n", dytc_version); > + /* > + * Check if MMC_GET functionality available > + * Version > 6 and return success from MMC_GET command > + */ > + dytc_mmc_get_available = false; > + if (dytc_version >= 6) { > + err = dytc_command(DYTC_CMD_MMC_GET, &output); > + if (!err && ((output & DYTC_ERR_MASK) == DYTC_ERR_SUCCESS)) > + dytc_mmc_get_available = true; > + } > /* Create platform_profile structure and register */ > err = platform_profile_register(&dytc_profile); > /* >
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 0d9e2ddbf..07de21941 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -10050,6 +10050,7 @@ static struct ibm_struct proxsensor_driver_data = { */ #define DYTC_CMD_SET 1 /* To enable/disable IC function mode */ +#define DYTC_CMD_MMC_GET 8 /* To get current MMC function and mode */ #define DYTC_CMD_RESET 0x1ff /* To reset back to default */ #define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */ @@ -10066,6 +10067,10 @@ static struct ibm_struct proxsensor_driver_data = { #define DYTC_MODE_PERFORM 2 /* High power mode aka performance */ #define DYTC_MODE_LOWPOWER 3 /* Low power mode */ #define DYTC_MODE_BALANCE 0xF /* Default mode aka balanced */ +#define DYTC_MODE_MMC_BALANCE 0 /* Default mode from MMC_GET, aka balanced */ + +#define DYTC_ERR_MASK 0xF /* Bits 0-3 in cmd result are the error result */ +#define DYTC_ERR_SUCCESS 1 /* CMD completed successful */ #define DYTC_SET_COMMAND(function, mode, on) \ (DYTC_CMD_SET | (function) << DYTC_SET_FUNCTION_BIT | \ @@ -10080,6 +10085,7 @@ static bool dytc_profile_available; static enum platform_profile_option dytc_current_profile; static atomic_t dytc_ignore_event = ATOMIC_INIT(0); static DEFINE_MUTEX(dytc_mutex); +static bool dytc_mmc_get_available; static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) { @@ -10088,6 +10094,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p *profile = PLATFORM_PROFILE_LOW_POWER; break; case DYTC_MODE_BALANCE: + case DYTC_MODE_MMC_BALANCE: *profile = PLATFORM_PROFILE_BALANCED; break; case DYTC_MODE_PERFORM: @@ -10165,7 +10172,6 @@ static int dytc_cql_command(int command, int *output) if (err) return err; } - return cmd_err; } @@ -10222,7 +10228,10 @@ static void dytc_profile_refresh(void) int perfmode; mutex_lock(&dytc_mutex); - err = dytc_cql_command(DYTC_CMD_GET, &output); + if (dytc_mmc_get_available) + err = dytc_command(DYTC_CMD_MMC_GET, &output); + else + err = dytc_cql_command(DYTC_CMD_GET, &output); mutex_unlock(&dytc_mutex); if (err) return; @@ -10271,6 +10280,16 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm) if (dytc_version >= 5) { dbg_printk(TPACPI_DBG_INIT, "DYTC version %d: thermal mode available\n", dytc_version); + /* + * Check if MMC_GET functionality available + * Version > 6 and return success from MMC_GET command + */ + dytc_mmc_get_available = false; + if (dytc_version >= 6) { + err = dytc_command(DYTC_CMD_MMC_GET, &output); + if (!err && ((output & DYTC_ERR_MASK) == DYTC_ERR_SUCCESS)) + dytc_mmc_get_available = true; + } /* Create platform_profile structure and register */ err = platform_profile_register(&dytc_profile); /*
The BIOS team have added a new API that allows us to retrieve the current performance profile without having to disable/enable CQL mode. Adding the changes to use this API. Tested on P15 and X1C8 Signed-off-by: Mark Pearson <markpearson@lenovo.com> --- Changes in v2: - remove unwanted debug code drivers/platform/x86/thinkpad_acpi.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)