From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f178.google.com (mail-dy1-f178.google.com [74.125.82.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B673623A566 for ; Sat, 11 Apr 2026 16:50:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775926214; cv=none; b=ANCD/9gPfqlqnK7OLy4kvjgVc7bQCwmWvmt6qmCBlPJwdnKJ8jMH88jPupXjR6VbAc6mPT01ztv0e0oeE/Ij1zQdl8kvOoJ+zPIJz/WPEVy4RTfH6pin05Yk2vgO+SbGfEpVCh+cAKjCm3xSRrIQMPRouy7aq5hEDU23itLO9Y8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775926214; c=relaxed/simple; bh=SWwibQsXsCrRWeAL6U1FnXoV5VpHesHz2UbT33D5jYs=; h=Date:From:To:CC:Subject:In-Reply-To:References:Message-ID: MIME-Version:Content-Type; b=aCCzsGkN0OtlmFk1rvbaKPYEMawVPKqoQqiNJAXx4H9HU3icv8+wPOa+4phKxHUE0xINYLiyWcyXfpFChkcAfPs7u8TnH39gTkUQMz7LNuDjZ54R6SBYOdkS+my2/0b/qhFyfX2+Vf0ouLhOYbf11gIAWF+uh90fXa9Leosve6E= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mbNNoC0l; arc=none smtp.client-ip=74.125.82.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mbNNoC0l" Received: by mail-dy1-f178.google.com with SMTP id 5a478bee46e88-2ba895adfeaso2995540eec.0 for ; Sat, 11 Apr 2026 09:50:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775926212; x=1776531012; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:references :in-reply-to:user-agent:subject:cc:to:from:date:from:to:cc:subject :date:message-id:reply-to; bh=XzgL/QU71Um+y9qS+lS50DlDTn35f/5YxepgXOHJWHs=; b=mbNNoC0lVU/VOCR0eL35FTqqxJu2Hw2hm3XUdVlrloQ/TGK0rv/kGRpsLHunem1IFt FsgoATEwRsxF5aacgqtaEq3J9vygu9s6EfKlTNAb2hajeGOC271t/PQ+UE+E+f3ry4ry P1R+NstufRdyGywlDm4NVff/QQO81p+wXnPnGkUwVHEu3gtMm4QwJ+mMpjFe5dHT+V9r vB2e8ek4Vle9qab9irYmL0U2jgCrLoX40tmfeknsiFa0BR/g+fDfo7PvBV+a8r0JEb1L LhLUesPYV4jx7LFk+lprIr78fGTGbBIiei5TL9HLL6Fk9c9m2EFSM7eMyDhUsB5gI4ZR dJpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775926212; x=1776531012; h=content-transfer-encoding:mime-version:message-id:references :in-reply-to:user-agent:subject:cc:to:from:date:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XzgL/QU71Um+y9qS+lS50DlDTn35f/5YxepgXOHJWHs=; b=oEvu8e1vQYoD2x/Uqrq5zxjc9iTE+oAfz+8PqfpAPUTtYxc0bJVE8Z/UebnFEx12WF V+Vbz+rZXnLYPCF33ZKw66daLvGoaAdncpxvYPWfQ7HGmBVG+fLG+6pSabuED9DH1bDX juSHyAv9w6g1ZvyIssRP8rCYOt7J4fiztnJQ7sReB3v8EgM7D0j019TnWEwRbBiLIfka II4XIQOG9jPFQ1HUJXbmK7VWjN+sinUxvQMjl7Pxz9q9VjBqyqo7SD8h8vt32IrcR9Nz GMelQnOS1D9g/glAacx+aAAsYDsWGMQOAcCg1reHEHG02QW0xc6l2nYUaMThBVBqQ7S6 RV4A== X-Forwarded-Encrypted: i=1; AJvYcCUc5WQczU7q0aqh/y4UHmEGOiIpjmHbgEBve8pqymmID5wZJ4EnD3kwkVkSCuoQ7R2bIizlnjd1jWbwkzA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5EKy++3lUP1sYzYxbPPjeF+FSP3diqTifFPC0of/ojCSOR1BE 7MCMu0XSB230JompHjvMC0acJ5S7k3DeRtwW11a7VyX2/VKeMklwKDXF X-Gm-Gg: AeBDieumqX6FSWTjvisy6SA34nKjawOYFy1A4UpGkWsSKQXXyQ1/CHJ1COWSv6OyX6y UuqnRPfvSYrKP+1GKN1V75Ou/mj4xBKPe1c44yjGdwGn3+UfxyuSQvvLBsRfeUokWR8Quw/R4d2 R5W/7j/ZAlcQuc0GBpfi5oSO2XkjRirq4AFUA5zB0EGbfJyT0JVdRRzXNej6ksJpeCXL3SOog/X 5Zk1yfFeRRqXWbhvNqkALeeB14nTFR8kSgMeJzbrZKGzl+Nw7I34cSiMCpi8SkqcKSYG69mwlQr dGqUKQbnh6jiy/0wDrteIidkBZrEkqHqvc5XouQH9Mc4+vRvpnP/9DjAGl8Q32tfP8d2iwIVlMy Ep0P2hyjc85I8mzOrX4g8yFdVUgkyLgjHVrN9f56hbctLL34htsVznYYZB6G+DvJAQrYeqK+ZE+ /Jb3/Pk9VjhEytvrZVo9FbPb0maXAZdfsvon5FG7AbrboFc6nsM+8J+NRr8pBEEZYp6+O2NgmUQ 1rKbS1+2n+IFJnvOjnNqQ== X-Received: by 2002:a05:7300:4347:b0:2c8:717:7ec7 with SMTP id 5a478bee46e88-2d58945dd66mr4281950eec.20.1775926211662; Sat, 11 Apr 2026 09:50:11 -0700 (PDT) Received: from ehlo.thunderbird.net (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d55ff826dcsm9107587eec.13.2026.04.11.09.50.11 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 11 Apr 2026 09:50:11 -0700 (PDT) Date: Sat, 11 Apr 2026 09:50:10 -0700 From: "Derek J. Clark" To: Rong Zhang , =?ISO-8859-1?Q?Ilpo_J=E4rvinen?= , Hans de Goede CC: Mark Pearson , Armin Wolf , Jonathan Corbet , Kurt Borja , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: =?US-ASCII?Q?Re=3A_=5BPATCH_v9_12/16=5D_platform/x86=3A_leno?= =?US-ASCII?Q?vo-wmi-other=3A_Add_GPU_tunable_attributes?= User-Agent: Thunderbird for Android In-Reply-To: <8bc493ef82f143191239c43487313904a7082289.camel@rong.moe> References: <20260411162334.25682-1-derekjohn.clark@gmail.com> <20260411162334.25682-13-derekjohn.clark@gmail.com> <8bc493ef82f143191239c43487313904a7082289.camel@rong.moe> Message-ID: <77DCB409-FD0A-4A73-BAA0-1AADDF5AB25D@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On April 11, 2026 9:40:58 AM PDT, Rong Zhang wrote: >Hi Derek, > >On Sat, 2026-04-11 at 16:23 +0000, Derek J=2E Clark wrote: >> Use an enum for all GPU attribute feature ID's and add GPU attributes= =2E >>=20 >> Reviewed-by: Rong Zhang >> Reviewed-by: Mark Pearson >> Signed-off-by: Derek J=2E Clark >> --- >> v9: >> - Rename gpu_didvid -> dgpu_didvid in documentation to match actual >> attribute name=2E >> v7: >> - Fix typo in dgpu_boost_clk attribute string=2E >> v4: >> - Align CPU feature enum values=2E >> - Remove gpu_oc_stat from Documentation=2E >> v3: >> - Remove gpu_oc_stat=2E >> --- >> =2E=2E=2E/wmi/devices/lenovo-wmi-other=2Erst | 10 ++ >> drivers/platform/x86/lenovo/wmi-capdata=2Eh | 1 + >> drivers/platform/x86/lenovo/wmi-other=2Ec | 105 ++++++++++++++++= ++ >> 3 files changed, 116 insertions(+) >>=20 >> diff --git a/Documentation/wmi/devices/lenovo-wmi-other=2Erst b/Documen= tation/wmi/devices/lenovo-wmi-other=2Erst >> index 189dd4d31926=2E=2E011054d64eac 100644 >> --- a/Documentation/wmi/devices/lenovo-wmi-other=2Erst >> +++ b/Documentation/wmi/devices/lenovo-wmi-other=2Erst >> @@ -69,6 +69,16 @@ Each attribute has the following properties: >> =20 >> 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=2E However=2E=2E=2E > >> + - dgpu_enable: Dedicated GPU Enabled Status >> + - gpu_mode: GPU Mode by Power Limit >> + - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Off= set >> + - 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 Limi= t >> - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit >> diff --git a/drivers/platform/x86/lenovo/wmi-capdata=2Eh b/drivers/plat= form/x86/lenovo/wmi-capdata=2Eh >> index f2d45cd7a188=2E=2E891b12ca1db6 100644 >> --- a/drivers/platform/x86/lenovo/wmi-capdata=2Eh >> +++ b/drivers/platform/x86/lenovo/wmi-capdata=2Eh >> @@ -20,6 +20,7 @@ >> =20 >> enum lwmi_device_id { >> LWMI_DEVICE_ID_CPU =3D 0x01, >> + LWMI_DEVICE_ID_GPU =3D 0x02, >> LWMI_DEVICE_ID_FAN =3D 0x04, >> }; >> =20 >> diff --git a/drivers/platform/x86/lenovo/wmi-other=2Ec b/drivers/platfo= rm/x86/lenovo/wmi-other=2Ec >> index adf4300415f8=2E=2E8abfea8c308a 100644 >> --- a/drivers/platform/x86/lenovo/wmi-other=2Ec >> +++ b/drivers/platform/x86/lenovo/wmi-other=2Ec >> @@ -61,6 +61,19 @@ enum lwmi_feature_id_cpu { >> LWMI_FEATURE_ID_CPU_IPL =3D 0x09, >> }; >> =20 >> +enum lwmi_feature_id_gpu { >> + LWMI_FEATURE_ID_GPU_NV_PPAB =3D 0x01, >> + LWMI_FEATURE_ID_GPU_NV_CTGP =3D 0x02, >> + LWMI_FEATURE_ID_GPU_TEMP =3D 0x03, >> + LWMI_FEATURE_ID_GPU_AC_OFFSET =3D 0x04, >> + LWMI_FEATURE_ID_DGPU_BOOST_CLK =3D 0x06, >> + LWMI_FEATURE_ID_DGPU_EN =3D 0x07, >> + LWMI_FEATURE_ID_GPU_MODE =3D 0x08, >> + LWMI_FEATURE_ID_DGPU_DIDVID =3D 0x09, >> + LWMI_FEATURE_ID_GPU_NV_BPL =3D 0x0a, >> + LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, >> +}; >> + >> #define LWMI_FEATURE_ID_FAN_RPM 0x03 >> =20 >> #define LWMI_TYPE_ID_CROSSLOAD 0x01 >> @@ -624,6 +637,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl =3D { >> =2Etype_id =3D LWMI_TYPE_ID_CROSSLOAD, >> }; >> =20 >> +static struct tunable_attr_01 gpu_nv_ppab =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_NV_PPAB, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 gpu_nv_ctgp =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_NV_CTGP, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 gpu_temp =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_TEMP, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 gpu_nv_ac_offset =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_AC_OFFSET, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 dgpu_boost_clk =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_DGPU_BOOST_CLK, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 dgpu_enable =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_DGPU_EN, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 gpu_mode =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_MODE, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 dgpu_didvid =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_DGPU_DIDVID, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 gpu_nv_bpl =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_NV_BPL, >> + =2Etype_id =3D LWMI_TYPE_ID_NONE, >> +}; >> + >> +static struct tunable_attr_01 gpu_nv_cpu_boost =3D { >> + =2Edevice_id =3D LWMI_DEVICE_ID_GPU, >> + =2Efeature_id =3D LWMI_FEATURE_ID_GPU_NV_CPU_BOOST, >> + =2Etype_id =3D 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 tunab= le_attr_01 *tunable_attr) >> =2Ename =3D _fsname, =2Eattrs =3D _attrname##_attrs \ >> } >> =20 >> +/* 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_p= l4_ipl", >> LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", >> "Set the CPU cross loading instantaneous power limit"); >> =20 >> +/* 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", > >=2E=2E=2Ehere the _fsname is still mismatched=2E > -_- Damnit=20 I'll fix it in the next version, this time tomorrow if there are no other = comments=2E >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"); >> =20 >> static struct capdata01_attr_group cd01_attr_groups[] =3D { >> { &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 },