[PATCH v9 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes

Derek J. Clark posted 16 patches 23 hours ago
[PATCH v9 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes
Posted by Derek J. Clark 23 hours ago
Use an enum for all GPU attribute feature ID's and add GPU attributes.

Reviewed-by: Rong Zhang <i@rong.moe>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
---
v9:
  - Rename gpu_didvid -> dgpu_didvid in documentation to match actual
    attribute name.
v7:
  - Fix typo in dgpu_boost_clk attribute string.
v4:
  - Align CPU feature enum values.
  - Remove gpu_oc_stat from Documentation.
v3:
  - Remove gpu_oc_stat.
---
 .../wmi/devices/lenovo-wmi-other.rst          |  10 ++
 drivers/platform/x86/lenovo/wmi-capdata.h     |   1 +
 drivers/platform/x86/lenovo/wmi-other.c       | 105 ++++++++++++++++++
 3 files changed, 116 insertions(+)

diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation/wmi/devices/lenovo-wmi-other.rst
index 189dd4d31926..011054d64eac 100644
--- a/Documentation/wmi/devices/lenovo-wmi-other.rst
+++ b/Documentation/wmi/devices/lenovo-wmi-other.rst
@@ -69,6 +69,16 @@ Each attribute has the following properties:
 
 The following firmware-attributes are implemented:
  - cpu_temp: CPU Thermal Load Limit
+ - dgpu_boost_clk: Dedicated GPU Boost Clock
+ - dgpu_didvid: Dedicated GPU Device Identifier and Vendor Identifier
+ - dgpu_enable: Dedicated GPU Enabled Status
+ - gpu_mode: GPU Mode by Power Limit
+ - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Offset
+ - gpu_nv_bpl: Nvidia GPU Base Power Limit
+ - gpu_nv_cpu_boost: Nvidia GPU to CPU Dynamic Boost Limit
+ - gpu_nv_ctgp: Nvidia GPU Configurable Total Graphics Power
+ - gpu_nv_ppab: Nvidia GPU Power Performance Aware Boost Limit
+ - gpu_temp: GPU Thermal Load Limit
  - ppt_cpu_cl: CPU Cross Loading Power Limit
  - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit
  - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit
diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x86/lenovo/wmi-capdata.h
index f2d45cd7a188..891b12ca1db6 100644
--- a/drivers/platform/x86/lenovo/wmi-capdata.h
+++ b/drivers/platform/x86/lenovo/wmi-capdata.h
@@ -20,6 +20,7 @@
 
 enum lwmi_device_id {
 	LWMI_DEVICE_ID_CPU = 0x01,
+	LWMI_DEVICE_ID_GPU = 0x02,
 	LWMI_DEVICE_ID_FAN = 0x04,
 };
 
diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86/lenovo/wmi-other.c
index adf4300415f8..8abfea8c308a 100644
--- a/drivers/platform/x86/lenovo/wmi-other.c
+++ b/drivers/platform/x86/lenovo/wmi-other.c
@@ -61,6 +61,19 @@ enum lwmi_feature_id_cpu {
 	LWMI_FEATURE_ID_CPU_IPL =	0x09,
 };
 
+enum lwmi_feature_id_gpu {
+	LWMI_FEATURE_ID_GPU_NV_PPAB =		0x01,
+	LWMI_FEATURE_ID_GPU_NV_CTGP =		0x02,
+	LWMI_FEATURE_ID_GPU_TEMP =		0x03,
+	LWMI_FEATURE_ID_GPU_AC_OFFSET =		0x04,
+	LWMI_FEATURE_ID_DGPU_BOOST_CLK =	0x06,
+	LWMI_FEATURE_ID_DGPU_EN =		0x07,
+	LWMI_FEATURE_ID_GPU_MODE =		0x08,
+	LWMI_FEATURE_ID_DGPU_DIDVID =		0x09,
+	LWMI_FEATURE_ID_GPU_NV_BPL =		0x0a,
+	LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =	0x0b,
+};
+
 #define LWMI_FEATURE_ID_FAN_RPM 0x03
 
 #define LWMI_TYPE_ID_CROSSLOAD	0x01
@@ -624,6 +637,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl = {
 	.type_id = LWMI_TYPE_ID_CROSSLOAD,
 };
 
+static struct tunable_attr_01 gpu_nv_ppab = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_NV_PPAB,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 gpu_nv_ctgp = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_NV_CTGP,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 gpu_temp = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_TEMP,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 gpu_nv_ac_offset = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_AC_OFFSET,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 dgpu_boost_clk = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_DGPU_BOOST_CLK,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 dgpu_enable = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_DGPU_EN,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 gpu_mode = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_MODE,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 dgpu_didvid = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_DGPU_DIDVID,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 gpu_nv_bpl = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_NV_BPL,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
+static struct tunable_attr_01 gpu_nv_cpu_boost = {
+	.device_id = LWMI_DEVICE_ID_GPU,
+	.feature_id = LWMI_FEATURE_ID_GPU_NV_CPU_BOOST,
+	.type_id = LWMI_TYPE_ID_NONE,
+};
+
 struct capdata01_attr_group {
 	const struct attribute_group *attr_group;
 	struct tunable_attr_01 *tunable_attr;
@@ -959,6 +1032,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr)
 		.name = _fsname, .attrs = _attrname##_attrs               \
 	}
 
+/* CPU tunable attributes */
 LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp",
 			      "Set the CPU thermal load limit");
 LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl",
@@ -984,9 +1058,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_ipl",
 LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl",
 			      "Set the CPU cross loading instantaneous power limit");
 
+/* GPU tunable attributes */
+LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "dgpu_boost_clk",
+			      "Set the dedicated GPU boost clock");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "gpu_didvid",
+			      "Get the GPU device identifier and vendor identifier");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable",
+			      "Set the dedicated Nvidia GPU enabled status");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode",
+			      "Set the GPU mode by power limit");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset",
+			      "Set the Nvidia GPU AC total processing power baseline offset");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl",
+			      "Set the Nvidia GPU base power limit");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost",
+			      "Set the Nvidia GPU to CPU dynamic boost limit");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp",
+			      "Set the GPU configurable total graphics power");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab",
+			      "Set the Nvidia GPU power performance aware boost limit");
+LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp",
+			      "Set the GPU thermal load limit");
 
 static struct capdata01_attr_group cd01_attr_groups[] = {
 	{ &cpu_temp_attr_group, &cpu_temp },
+	{ &dgpu_boost_clk_attr_group, &dgpu_boost_clk },
+	{ &dgpu_didvid_attr_group, &dgpu_didvid },
+	{ &dgpu_enable_attr_group, &dgpu_enable },
+	{ &gpu_mode_attr_group, &gpu_mode },
+	{ &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset },
+	{ &gpu_nv_bpl_attr_group, &gpu_nv_bpl },
+	{ &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost },
+	{ &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp },
+	{ &gpu_nv_ppab_attr_group, &gpu_nv_ppab },
+	{ &gpu_temp_attr_group, &gpu_temp },
 	{ &ppt_cpu_cl_attr_group, &ppt_cpu_cl },
 	{ &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl },
 	{ &ppt_pl1_spl_attr_group, &ppt_pl1_spl },
-- 
2.53.0
Re: [PATCH v9 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes
Posted by Rong Zhang 23 hours ago
Hi Derek,

On Sat, 2026-04-11 at 16:23 +0000, Derek J. Clark wrote:
> Use an enum for all GPU attribute feature ID's and add GPU attributes.
> 
> Reviewed-by: Rong Zhang <i@rong.moe>
> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
> Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
> ---
> v9:
>   - Rename gpu_didvid -> dgpu_didvid in documentation to match actual
>     attribute name.
> v7:
>   - Fix typo in dgpu_boost_clk attribute string.
> v4:
>   - Align CPU feature enum values.
>   - Remove gpu_oc_stat from Documentation.
> v3:
>   - Remove gpu_oc_stat.
> ---
>  .../wmi/devices/lenovo-wmi-other.rst          |  10 ++
>  drivers/platform/x86/lenovo/wmi-capdata.h     |   1 +
>  drivers/platform/x86/lenovo/wmi-other.c       | 105 ++++++++++++++++++
>  3 files changed, 116 insertions(+)
> 
> diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation/wmi/devices/lenovo-wmi-other.rst
> index 189dd4d31926..011054d64eac 100644
> --- a/Documentation/wmi/devices/lenovo-wmi-other.rst
> +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst
> @@ -69,6 +69,16 @@ Each attribute has the following properties:
>  
>  The following firmware-attributes are implemented:
>   - cpu_temp: CPU Thermal Load Limit
> + - dgpu_boost_clk: Dedicated GPU Boost Clock
> + - dgpu_didvid: Dedicated GPU Device Identifier and Vendor Identifier

Thanks for correcting the typo in the documentation. However...

> + - dgpu_enable: Dedicated GPU Enabled Status
> + - gpu_mode: GPU Mode by Power Limit
> + - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Offset
> + - gpu_nv_bpl: Nvidia GPU Base Power Limit
> + - gpu_nv_cpu_boost: Nvidia GPU to CPU Dynamic Boost Limit
> + - gpu_nv_ctgp: Nvidia GPU Configurable Total Graphics Power
> + - gpu_nv_ppab: Nvidia GPU Power Performance Aware Boost Limit
> + - gpu_temp: GPU Thermal Load Limit
>   - ppt_cpu_cl: CPU Cross Loading Power Limit
>   - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit
>   - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit
> diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x86/lenovo/wmi-capdata.h
> index f2d45cd7a188..891b12ca1db6 100644
> --- a/drivers/platform/x86/lenovo/wmi-capdata.h
> +++ b/drivers/platform/x86/lenovo/wmi-capdata.h
> @@ -20,6 +20,7 @@
>  
>  enum lwmi_device_id {
>  	LWMI_DEVICE_ID_CPU = 0x01,
> +	LWMI_DEVICE_ID_GPU = 0x02,
>  	LWMI_DEVICE_ID_FAN = 0x04,
>  };
>  
> diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86/lenovo/wmi-other.c
> index adf4300415f8..8abfea8c308a 100644
> --- a/drivers/platform/x86/lenovo/wmi-other.c
> +++ b/drivers/platform/x86/lenovo/wmi-other.c
> @@ -61,6 +61,19 @@ enum lwmi_feature_id_cpu {
>  	LWMI_FEATURE_ID_CPU_IPL =	0x09,
>  };
>  
> +enum lwmi_feature_id_gpu {
> +	LWMI_FEATURE_ID_GPU_NV_PPAB =		0x01,
> +	LWMI_FEATURE_ID_GPU_NV_CTGP =		0x02,
> +	LWMI_FEATURE_ID_GPU_TEMP =		0x03,
> +	LWMI_FEATURE_ID_GPU_AC_OFFSET =		0x04,
> +	LWMI_FEATURE_ID_DGPU_BOOST_CLK =	0x06,
> +	LWMI_FEATURE_ID_DGPU_EN =		0x07,
> +	LWMI_FEATURE_ID_GPU_MODE =		0x08,
> +	LWMI_FEATURE_ID_DGPU_DIDVID =		0x09,
> +	LWMI_FEATURE_ID_GPU_NV_BPL =		0x0a,
> +	LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =	0x0b,
> +};
> +
>  #define LWMI_FEATURE_ID_FAN_RPM 0x03
>  
>  #define LWMI_TYPE_ID_CROSSLOAD	0x01
> @@ -624,6 +637,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl = {
>  	.type_id = LWMI_TYPE_ID_CROSSLOAD,
>  };
>  
> +static struct tunable_attr_01 gpu_nv_ppab = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_PPAB,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 gpu_nv_ctgp = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_CTGP,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 gpu_temp = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_TEMP,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 gpu_nv_ac_offset = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_AC_OFFSET,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 dgpu_boost_clk = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_DGPU_BOOST_CLK,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 dgpu_enable = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_DGPU_EN,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 gpu_mode = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_MODE,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 dgpu_didvid = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_DGPU_DIDVID,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 gpu_nv_bpl = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_BPL,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
> +static struct tunable_attr_01 gpu_nv_cpu_boost = {
> +	.device_id = LWMI_DEVICE_ID_GPU,
> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_CPU_BOOST,
> +	.type_id = LWMI_TYPE_ID_NONE,
> +};
> +
>  struct capdata01_attr_group {
>  	const struct attribute_group *attr_group;
>  	struct tunable_attr_01 *tunable_attr;
> @@ -959,6 +1032,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr)
>  		.name = _fsname, .attrs = _attrname##_attrs               \
>  	}
>  
> +/* CPU tunable attributes */
>  LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp",
>  			      "Set the CPU thermal load limit");
>  LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl",
> @@ -984,9 +1058,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_ipl",
>  LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl",
>  			      "Set the CPU cross loading instantaneous power limit");
>  
> +/* GPU tunable attributes */
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "dgpu_boost_clk",
> +			      "Set the dedicated GPU boost clock");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "gpu_didvid",

...here the _fsname is still mismatched.

Thanks,
Rong

> +			      "Get the GPU device identifier and vendor identifier");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable",
> +			      "Set the dedicated Nvidia GPU enabled status");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode",
> +			      "Set the GPU mode by power limit");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset",
> +			      "Set the Nvidia GPU AC total processing power baseline offset");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl",
> +			      "Set the Nvidia GPU base power limit");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost",
> +			      "Set the Nvidia GPU to CPU dynamic boost limit");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp",
> +			      "Set the GPU configurable total graphics power");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab",
> +			      "Set the Nvidia GPU power performance aware boost limit");
> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp",
> +			      "Set the GPU thermal load limit");
>  
>  static struct capdata01_attr_group cd01_attr_groups[] = {
>  	{ &cpu_temp_attr_group, &cpu_temp },
> +	{ &dgpu_boost_clk_attr_group, &dgpu_boost_clk },
> +	{ &dgpu_didvid_attr_group, &dgpu_didvid },
> +	{ &dgpu_enable_attr_group, &dgpu_enable },
> +	{ &gpu_mode_attr_group, &gpu_mode },
> +	{ &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset },
> +	{ &gpu_nv_bpl_attr_group, &gpu_nv_bpl },
> +	{ &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost },
> +	{ &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp },
> +	{ &gpu_nv_ppab_attr_group, &gpu_nv_ppab },
> +	{ &gpu_temp_attr_group, &gpu_temp },
>  	{ &ppt_cpu_cl_attr_group, &ppt_cpu_cl },
>  	{ &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl },
>  	{ &ppt_pl1_spl_attr_group, &ppt_pl1_spl },
Re: [PATCH v9 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes
Posted by Derek J. Clark 22 hours ago
On April 11, 2026 9:40:58 AM PDT, Rong Zhang <i@rong.moe> wrote:
>Hi Derek,
>
>On Sat, 2026-04-11 at 16:23 +0000, Derek J. Clark wrote:
>> Use an enum for all GPU attribute feature ID's and add GPU attributes.
>> 
>> Reviewed-by: Rong Zhang <i@rong.moe>
>> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
>> Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
>> ---
>> v9:
>>   - Rename gpu_didvid -> dgpu_didvid in documentation to match actual
>>     attribute name.
>> v7:
>>   - Fix typo in dgpu_boost_clk attribute string.
>> v4:
>>   - Align CPU feature enum values.
>>   - Remove gpu_oc_stat from Documentation.
>> v3:
>>   - Remove gpu_oc_stat.
>> ---
>>  .../wmi/devices/lenovo-wmi-other.rst          |  10 ++
>>  drivers/platform/x86/lenovo/wmi-capdata.h     |   1 +
>>  drivers/platform/x86/lenovo/wmi-other.c       | 105 ++++++++++++++++++
>>  3 files changed, 116 insertions(+)
>> 
>> diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation/wmi/devices/lenovo-wmi-other.rst
>> index 189dd4d31926..011054d64eac 100644
>> --- a/Documentation/wmi/devices/lenovo-wmi-other.rst
>> +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst
>> @@ -69,6 +69,16 @@ Each attribute has the following properties:
>>  
>>  The following firmware-attributes are implemented:
>>   - cpu_temp: CPU Thermal Load Limit
>> + - dgpu_boost_clk: Dedicated GPU Boost Clock
>> + - dgpu_didvid: Dedicated GPU Device Identifier and Vendor Identifier
>
>Thanks for correcting the typo in the documentation. However...
>
>> + - dgpu_enable: Dedicated GPU Enabled Status
>> + - gpu_mode: GPU Mode by Power Limit
>> + - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Offset
>> + - gpu_nv_bpl: Nvidia GPU Base Power Limit
>> + - gpu_nv_cpu_boost: Nvidia GPU to CPU Dynamic Boost Limit
>> + - gpu_nv_ctgp: Nvidia GPU Configurable Total Graphics Power
>> + - gpu_nv_ppab: Nvidia GPU Power Performance Aware Boost Limit
>> + - gpu_temp: GPU Thermal Load Limit
>>   - ppt_cpu_cl: CPU Cross Loading Power Limit
>>   - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit
>>   - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit
>> diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x86/lenovo/wmi-capdata.h
>> index f2d45cd7a188..891b12ca1db6 100644
>> --- a/drivers/platform/x86/lenovo/wmi-capdata.h
>> +++ b/drivers/platform/x86/lenovo/wmi-capdata.h
>> @@ -20,6 +20,7 @@
>>  
>>  enum lwmi_device_id {
>>  	LWMI_DEVICE_ID_CPU = 0x01,
>> +	LWMI_DEVICE_ID_GPU = 0x02,
>>  	LWMI_DEVICE_ID_FAN = 0x04,
>>  };
>>  
>> diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86/lenovo/wmi-other.c
>> index adf4300415f8..8abfea8c308a 100644
>> --- a/drivers/platform/x86/lenovo/wmi-other.c
>> +++ b/drivers/platform/x86/lenovo/wmi-other.c
>> @@ -61,6 +61,19 @@ enum lwmi_feature_id_cpu {
>>  	LWMI_FEATURE_ID_CPU_IPL =	0x09,
>>  };
>>  
>> +enum lwmi_feature_id_gpu {
>> +	LWMI_FEATURE_ID_GPU_NV_PPAB =		0x01,
>> +	LWMI_FEATURE_ID_GPU_NV_CTGP =		0x02,
>> +	LWMI_FEATURE_ID_GPU_TEMP =		0x03,
>> +	LWMI_FEATURE_ID_GPU_AC_OFFSET =		0x04,
>> +	LWMI_FEATURE_ID_DGPU_BOOST_CLK =	0x06,
>> +	LWMI_FEATURE_ID_DGPU_EN =		0x07,
>> +	LWMI_FEATURE_ID_GPU_MODE =		0x08,
>> +	LWMI_FEATURE_ID_DGPU_DIDVID =		0x09,
>> +	LWMI_FEATURE_ID_GPU_NV_BPL =		0x0a,
>> +	LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =	0x0b,
>> +};
>> +
>>  #define LWMI_FEATURE_ID_FAN_RPM 0x03
>>  
>>  #define LWMI_TYPE_ID_CROSSLOAD	0x01
>> @@ -624,6 +637,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl = {
>>  	.type_id = LWMI_TYPE_ID_CROSSLOAD,
>>  };
>>  
>> +static struct tunable_attr_01 gpu_nv_ppab = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_PPAB,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 gpu_nv_ctgp = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_CTGP,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 gpu_temp = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_TEMP,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 gpu_nv_ac_offset = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_AC_OFFSET,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 dgpu_boost_clk = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_DGPU_BOOST_CLK,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 dgpu_enable = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_DGPU_EN,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 gpu_mode = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_MODE,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 dgpu_didvid = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_DGPU_DIDVID,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 gpu_nv_bpl = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_BPL,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>> +static struct tunable_attr_01 gpu_nv_cpu_boost = {
>> +	.device_id = LWMI_DEVICE_ID_GPU,
>> +	.feature_id = LWMI_FEATURE_ID_GPU_NV_CPU_BOOST,
>> +	.type_id = LWMI_TYPE_ID_NONE,
>> +};
>> +
>>  struct capdata01_attr_group {
>>  	const struct attribute_group *attr_group;
>>  	struct tunable_attr_01 *tunable_attr;
>> @@ -959,6 +1032,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr)
>>  		.name = _fsname, .attrs = _attrname##_attrs               \
>>  	}
>>  
>> +/* CPU tunable attributes */
>>  LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp",
>>  			      "Set the CPU thermal load limit");
>>  LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl",
>> @@ -984,9 +1058,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_ipl",
>>  LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl",
>>  			      "Set the CPU cross loading instantaneous power limit");
>>  
>> +/* GPU tunable attributes */
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "dgpu_boost_clk",
>> +			      "Set the dedicated GPU boost clock");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "gpu_didvid",
>
>...here the _fsname is still mismatched.
>

-_-
Damnit 
I'll fix it in the next version, this time tomorrow if there are no other comments.


>Thanks,
>Rong
>
>> +			      "Get the GPU device identifier and vendor identifier");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable",
>> +			      "Set the dedicated Nvidia GPU enabled status");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode",
>> +			      "Set the GPU mode by power limit");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset",
>> +			      "Set the Nvidia GPU AC total processing power baseline offset");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl",
>> +			      "Set the Nvidia GPU base power limit");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost",
>> +			      "Set the Nvidia GPU to CPU dynamic boost limit");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp",
>> +			      "Set the GPU configurable total graphics power");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab",
>> +			      "Set the Nvidia GPU power performance aware boost limit");
>> +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp",
>> +			      "Set the GPU thermal load limit");
>>  
>>  static struct capdata01_attr_group cd01_attr_groups[] = {
>>  	{ &cpu_temp_attr_group, &cpu_temp },
>> +	{ &dgpu_boost_clk_attr_group, &dgpu_boost_clk },
>> +	{ &dgpu_didvid_attr_group, &dgpu_didvid },
>> +	{ &dgpu_enable_attr_group, &dgpu_enable },
>> +	{ &gpu_mode_attr_group, &gpu_mode },
>> +	{ &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset },
>> +	{ &gpu_nv_bpl_attr_group, &gpu_nv_bpl },
>> +	{ &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost },
>> +	{ &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp },
>> +	{ &gpu_nv_ppab_attr_group, &gpu_nv_ppab },
>> +	{ &gpu_temp_attr_group, &gpu_temp },
>>  	{ &ppt_cpu_cl_attr_group, &ppt_cpu_cl },
>>  	{ &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl },
>>  	{ &ppt_pl1_spl_attr_group, &ppt_pl1_spl },