Re: [PATCH] Add support for DYTC MMC_GET BIOS API.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 4/6/21 4:22 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@xxxxxxxxxx>
> ---
>  drivers/platform/x86/thinkpad_acpi.c | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
> index 0d9e2ddbf..4eb1ad443 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,17 @@ 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;
> +		}
> +		err = dytc_command(DYTC_CMD_QUERY, &output);

It seems this last:

		err = dytc_command(DYTC_CMD_QUERY, &output);

Line snuck in as a copy and paste error? Or is this intentional ?

If this is intentional, may I ask why this is done / needed ?

Regards,

Hans


>  		/* Create platform_profile structure and register */
>  		err = platform_profile_register(&dytc_profile);
>  		/*
> 




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux