lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAFqHKTkjF8A1yWWvgpH9Wj661PRk60cWR2be+SNk0m3WN6QQgw@mail.gmail.com>
Date: Wed, 26 Feb 2025 16:21:40 -0800
From: Derek John Clark <derekjohn.clark@...il.com>
To: Mario Limonciello <superm1@...nel.org>
Cc: Hans de Goede <hdegoede@...hat.com>, Ilpo Järvinen <ilpo.jarvinen@...ux.intel.com>, 
	Armin Wolf <W_Armin@....de>, Jonathan Corbet <corbet@....net>, Luke Jones <luke@...nes.dev>, 
	Xino Ni <nijs1@...ovo.com>, Zhixin Zhang <zhangzx36@...ovo.com>, Mia Shao <shaohz1@...ovo.com>, 
	Mark Pearson <mpearson-lenovo@...ebb.ca>, 
	"Pierre-Loup A . Griffais" <pgriffais@...vesoftware.com>, "Cody T . -H . Chiu" <codyit@...il.com>, 
	John Martens <johnfanv2@...il.com>, platform-driver-x86@...r.kernel.org, 
	linux-doc@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3 1/4] platform/x86: Add lenovo-wmi drivers Documentation

On Tue, Feb 25, 2025 at 10:36 PM Mario Limonciello <superm1@...nel.org> wrote:
>
> On 2/25/2025 13:59, Derek J. Clark wrote:
> > Adds documentation for all new lenovo-wmi drivers.
> >
> > v3:
> > - Split documentation into multiple files, one for each parent
> >    driver for the Gamezone and Other Mode WMI interfaces.
> > - Add MOF data for all parent and child interfaces.
> > - Remove lenovo-wmi-camera.c driver from v2 documentation.
> > v2:
> > - Update description of Custom Profile to include the need to manually
> >    set it.
> > - Remove all references to Legion hardware.
> > - Add section for lenovo-wmi-camera.c driver as it follows the same
> >    naming convention.
>
> Generally speaking the changelog from each version should be below the
> cutlist (---).  Otherwise you're going to end up with this text in the
> commit meesage that is committed to trees.
>
> So it should be something like this:
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> foo: bar
>
> Foo the bar
>
> Signed-off-by: Foo bar <Foo@....com>
> ---
> v1->v2:
>   * Foo the bar harder
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> This comment goes for all the patches.
>
> Other comments inline as well.
>

My mistake, thanks.

> >
> > Signed-off-by: Derek J. Clark <derekjohn.clark@...il.com>
> > ---
> >   .../wmi/devices/lenovo-wmi-gamezone.rst       | 355 ++++++++++++++++++
> >   .../wmi/devices/lenovo-wmi-other-method.rst   | 142 +++++++
> >   MAINTAINERS                                   |   7 +
> >   3 files changed, 504 insertions(+)
> >   create mode 100644 Documentation/wmi/devices/lenovo-wmi-gamezone.rst
> >   create mode 100644 Documentation/wmi/devices/lenovo-wmi-other-method.rst
> >
> > diff --git a/Documentation/wmi/devices/lenovo-wmi-gamezone.rst b/Documentation/wmi/devices/lenovo-wmi-gamezone.rst
> > new file mode 100644
> > index 000000000000..1dc281fdd99d
> > --- /dev/null
> > +++ b/Documentation/wmi/devices/lenovo-wmi-gamezone.rst
> > @@ -0,0 +1,355 @@
> > +.. SPDX-License-Identifier: GPL-2.0-or-later
> > +==========================================================
> > +Lenovo WMI Interface Gamezone Driver (lenovo-wmi-gamezone)
> > +==========================================================
> > +
> > +Introduction
> > +============
> > +The Lenovo WMI gamezone interface is broken up into multiple GUIDs,
> > +The priamry "Gamezone" GUID provides advanced features such as fan
> > +profiles and overclocking. It is paired with multiple event GUIDs
> > +and data block GUIDs that provide context for the various methods.
> > +
> > +Gamezone Data
> > +-------------
> > +WMI GUID "887B54E3-DDDC-4B2C-8B88-68A26A8835D0"
> > +
> > +The Gamezone Data WMI interface provides platform-profile and fan curve
> > +settings for devices that fall under the "Gaming Series" of Lenovo devices.
> > +It uses a notifier chain to inform other Lenovo WMI interface drivers of the
> > +current platform profile when it changes.
> > +
> > +The following platform profiles are supported:
> > + - low-power
> > + - balanced
> > + - balanced-performance
> > + - performance
> > + - custom
> > +
> > +Balanced-Perfornance and Performance Profiles
> > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > +Some newer Lenovo "Gaming Series" laptops have an "Extreme Mode" profile
> > +enabled in their BIOS. For these devices, the performance platform profile
> > +will correspond to the BIOS Extreme Mode, while the balanced-performance
> > +platform profile will correspond to the BIOS Performance mode. For legacy
> > +devices, the performance platform prfile will correspond with the BIOS
>
> profile
>
> But this also invites a confusion on my part.  Does that mean that
> balanced-performance "isn't" offered on the legacy devices without
> extreme mode?  Or is it not functional?  Or it means the same as balanced?

It is only enabled if the following conditions are met:
- The IsSupportSmartFan WMI method returns v6+.
- There is no entry in the quirk table for the modern devices with an
incomplete extreme mode entry.

For some reason on their handhelds, Lenovo report v6 but extreme is
essentially blank. I did some testing to see what happens on these
devices if extreme is allowed to be set and it does a few things:
- The Legion +Y macro breaks and is unable to cycle through the profiles.
- Performance is tanked, presumably because the max TDP hits some
logical low point.
- The light ring on the power button goes out.
- WMI calls stop working to change the profile and a BIOS reset is needed.

In any case, I can add that balanced-performance isn't available in
the docs for those devices. What would be a good syntax for noting
there are caveats for some profiles?

The following platform profiles are supported:
 - low-power
 - balanced
 - balanced-performance*
 - performance*
 - custom

> > +Performance mode.
> > +
> > +Custom Profile
> > +~~~~~~~~~~~~~~
> > +The custom profile represents a hardware mode on Lenovo devices that enables
> > +user modifications to Package Power Tracking (PPT) and fan curve settings.
> > +When an attribute exposed by the Other Mode WMI interface is to be modified,
> > +the Gamezone driver must first be switched to the "custom" profile manually,
> > +or the setting will have no effect. If another profile is set from the list
> > +of supported profiles, the BIOS will override any user PPT settings when
> > +switching to that profile.
> > +
> > +Gamezone Thermal Mode Event
> > +---------------------------
> > +WMI GUID "D320289E-8FEA-41E0-86F9-911D83151B5F"
> > +
> > +The Gamezone Thermal Mode Event interface notifies the system when the platform
> > +profile has changed, either through the hardware event (Fn+Q for laptops or
> > +Legion + Y for Go Series), or through the Gamezone WMI interface.
> > +
> > +
> > +WMI interface description
> > +=========================
> > +
> > +The WMI interface description can be decoded from the embedded binary MOF (bmof)
> > +data using the `bmfdec <https://github.com/pali/bmfdec>`_ utility:
> > +
> > +::
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("LENOVO_GAMEZONE_DATA class"),
> > +   guid("{887B54E3-DDDC-4B2C-8B88-68A26A8835D0}")]
> > +  class LENOVO_GAMEZONE_DATA {
> > +     [key, read] string InstanceName;
> > +     [read] boolean Active;
> > +
> > +     [WmiMethodId(4), Implemented, Description("Is SupportGpu OverClock")]
> > +    void IsSupportGpuOC([out, Description("Is SupportGpu OverClock")] uint32 Data);
> > +
> > +     [WmiMethodId(11), Implemented, Description("Get AslCode Version")]
> > +    void GetVersion ([out, Description("AslCode version")] UINT32 Data);
> > +
> > +     [WmiMethodId(12), Implemented, Description("Fan cooling capability")]
> > +    void IsSupportFanCooling([out, Description("Fan cooling capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(13), Implemented, Description("Set Fan cooling on/off")]
> > +    void SetFanCooling ([in, Description("Set Fan cooling on/off")] UINT32 Data);
> > +
> > +     [WmiMethodId(14), Implemented, Description("cpu oc capability")]
> > +    void IsSupportCpuOC ([out, Description("cpu oc capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(15), Implemented, Description("bios has overclock capability")]
> > +    void IsBIOSSupportOC ([out, Description("bios has overclock capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(16), Implemented, Description("enable or disable overclock in bios")]
> > +    void SetBIOSOC ([in, Description("enable or disable overclock in bios")] UINT32 Data);
> > +
> > +     [WmiMethodId(18), Implemented, Description("Get CPU temperature")]
> > +    void GetCPUTemp ([out, Description("Get CPU temperature")] UINT32 Data);
> > +
> > +     [WmiMethodId(19), Implemented, Description("Get GPU temperature")]
> > +    void GetGPUTemp ([out, Description("Get GPU temperature")] UINT32 Data);
> > +
> > +     [WmiMethodId(20), Implemented, Description("Get Fan cooling on/off status")]
> > +    void GetFanCoolingStatus ([out, Description("Get Fan cooling on/off status")] UINT32 Data);
> > +
> > +     [WmiMethodId(21), Implemented, Description("EC support disable windows key capability")]
> > +    void IsSupportDisableWinKey ([out, Description("EC support disable windows key capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(22), Implemented, Description("Set windows key disable/enable")]
> > +    void SetWinKeyStatus ([in, Description("Set windows key disable/enable")] UINT32 Data);
> > +
> > +     [WmiMethodId(23), Implemented, Description("Get windows key disable/enable status")]
> > +    void GetWinKeyStatus ([out, Description("Get windows key disable/enable status")] UINT32 Data);
> > +
> > +     [WmiMethodId(24), Implemented, Description("EC support disable touchpad capability")]
> > +    void IsSupportDisableTP ([out, Description("EC support disable touchpad capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(25), Implemented, Description("Set touchpad disable/enable")]
> > +    void SetTPStatus ([in, Description("Set touchpad disable/enable")] UINT32 Data);
> > +
> > +     [WmiMethodId(26), Implemented, Description("Get touchpad disable/enable status")]
> > +    void GetTPStatus ([out, Description("Get touchpad disable/enable status")] UINT32 Data);
> > +
> > +     [WmiMethodId(30), emented,      Description("Get Keyboard feature list")]
>
> Did you find/replace at some point and lose the "Impl" on some of these?
>   Or is this a bug with bmfdec?

Lenovo provided the bmof data, but the formatting was poor. My VIM
macro to clean them up probably messed up here. I'll fix it, thanks
for noticing this mistake.

> > +    void GetKeyboardfeaturelist ([out, Description("Get Keyboard feature list")] UINT32 Data);
> > +
> > +     [WmiMethodId(31), emented,      Description("Get Memory OC Information")]
> > +    void GetMemoryOCInfo ([out, Description("Get Memory OC Information")] UINT32 Data);
> > +
> > +     [WmiMethodId(32), emented,      Description("Water Cooling feature capability")]
> > +    void IsSupportWaterCooling ([out, Description("Water Cooling feature capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(33), emented,      Description("Set Water Cooling status")]
> > +    void SetWaterCoolingStatus ([in, Description("Set Water Cooling status")] UINT32 Data);
> > +
> > +     [WmiMethodId(34), emented,      Description("Get Water Cooling status")]
> > +    void GetWaterCoolingStatus ([out, Description("Get Water Cooling status")] UINT32 Data);
> > +
> > +     [WmiMethodId(35), emented,      Description("Lighting feature capability")]
> > +    void IsSupportLightingFeature ([out, Description("Lighting feature capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(36), emented,      Description("Set keyboard light off or on to max")]
> > +    void SetKeyboardLight ([in, Description("keyboard light off or on switch")] UINT32 Data);
> > +
> > +     [WmiMethodId(37), emented,      Description("Get keyboard light on/off status")]
> > +    void GetKeyboardLight ([out, Description("Get keyboard light on/off status")] UINT32 Data);
> > +
> > +     [WmiMethodId(38), emented,      Description("Get Macrokey scan code")]
> > +    void GetMacrokeyScancode ([in, Description("Macrokey index")] UINT32 idx, [out, Description("Scan code")] UINT32 scancode);
> > +
> > +     [WmiMethodId(39), emented,      Description("Get Macrokey count")]
> > +    void GetMacrokeyCount ([out, Description("Macrokey count")] UINT32 Data);
> > +
> > +     [WmiMethodId(40), emented,      Description("Support G-Sync feature")]
> > +    void IsSupportGSync ([out, Description("Support G-Sync feature")] UINT32 Data);
> > +
> > +     [WmiMethodId(41), emented,      Description("Get G-Sync Statust")]
> > +    void GetGSyncStatus ([out, Description("Get G-Sync Statust")] UINT32 Data);
> > +
> > +     [WmiMethodId(42), emented,      Description("Set G-Sync Statust")]
> > +    void SetGSyncStatus ([in, Description("Set G-Sync Statust")] UINT32 Data);
> > +
> > +     [WmiMethodId(43), emented,      Description("Support Smart Fan feature")]
> > +    void IsSupportSmartFan ([out, Description("Support Smart Fan feature")] UINT32 Data);
> > +
> > +     [WmiMethodId(44), emented,      Description("Set Smart Fan Mode")]
> > +    void SetSmartFanMode ([in, Description("Set Smart Fan Mode")] UINT32 Data);
> > +
> > +     [WmiMethodId(45), emented,      Description("Get Smart Fan Mode")]
> > +    void GetSmartFanMode ([out, Description("Get Smart Fan Mode")] UINT32 Data);
> > +
> > +     [WmiMethodId(46), emented,      Description("Get Smart Fan Setting Mode")]
> > +    void GetSmartFanSetting ([out, Description("Get Smart Setting Mode")] UINT32 Data);
> > +
> > +     [WmiMethodId(47), emented,      Description("Get Power Charge Mode")]
> > +    void GetPowerChargeMode ([out, Description("Get Power Charge Mode")] UINT32 Data);
> > +
> > +     [WmiMethodId(48), emented, Description("Get Gaming Product Info")]
> > +    void GetProductInfo ([out, Description("Get Gaming Product Info")] UINT32 Data);
> > +
> > +     [WmiMethodId(49), emented, Description("Over Drive feature capability")]
> > +    void IsSupportOD ([out, Description("Over Drive feature capability")] UINT32 Data);
> > +
> > +     [WmiMethodId(50), emented, Description("Get Over Drive status")]
> > +    void GetODStatus ([out, Description("Get Over Drive status")] UINT32 Data);
> > +
> > +     [WmiMethodId(51), emented, Description("Set Over Drive status")]
> > +    void SetODStatus ([in, Description("Set Over Drive status")] UINT32 Data);
> > +
> > +     [WmiMethodId(52), emented, Description("Set Light Control Owner")]
> > +    void SetLightControlOwner ([in, Description("Set Light Control Owner")] UINT32 Data);
> > +
> > +     [WmiMethodId(53), emented, Description("Set DDS Control Owner")]
> > +    void SetDDSControlOwner ([in, Description("Set DDS Control Owner")] UINT32 Data);
> > +
> > +     [WmiMethodId(54), emented, Description("Get the flag of restore OC value")]
> > +    void IsRestoreOCValue ([in, Description("Clean this flag")] UINT32 idx, [out, Description("Restore oc value flag")] UINT32 Data);
> > +
> > +     [WmiMethodId(55), emented,      Description("Get Real Thremal Mode")]
> > +    void GetThermalMode ([out, Description("Real Thremal Mode")] UINT32 Data);
> > +
> > +     [WmiMethodId(56), emented,      Description("Get the OC switch status in BIOS")]
> > +    void GetBIOSOCMode ([out, Description("OC Mode")] UINT32 Data);
> > +
> > +     [WmiMethodId(59), emented,      Description("Get hardware info support version")]
> > +    void GetHardwareInfoSupportVersion ([out, Description("version")] UINT32 Data);
> > +
> > +     [WmiMethodId(60), emented,      Description("Get Cpu core 0 max frequency")]
> > +    void GetCpuFrequency ([out, Description("frequency")] UINT32 Data);
> > +
> > +     [WmiMethodId(62), emented,      Description("Check the Adapter type fit for OC")]
> > +    void IsACFitForOC ([out, Description("AC check result")] UINT32 Data);
> > +
> > +     [WmiMethodId(63), emented,      Description("Is support IGPU mode")]
> > +    void IsSupportIGPUMode ([out, Description("IGPU modes")] UINT32 Data);
> > +
> > +     [WmiMethodId(64), emented,      Description("Get IGPU Mode Status")]
> > +    void GetIGPUModeStatus([out, Description("IGPU Mode Status")] UINT32 Data);
> > +
> > +     [WmiMethodId(65), emented,      Description("Set IGPU Mode")]
> > +    void SetIGPUModeStatus([in, Description("IGPU Mode")] UINT32 mode, [out, Description("return code")] UINT32 Data);
> > +
> > +     [WmiMethodId(66), emented, Description("Notify DGPU Status")]
> > +    void NotifyDGPUStatus([in, Description("DGPU status")] UINT32 status, [out, Description("return code")] UINT32 Data);
> > +
> > +     [WmiMethodId(67), emented,      Description("Is changed Y log")]
> > +    void IsChangedYLog([out, Description("Is changed Y Log")] UINT32 Data);
> > +
> > +     [WmiMethodId(68), emented, Description("Get DGPU Hardwawre ID")]
> > +    void GetDGPUHWId([out, Description("Get DGPU Hardware ID")] string Data);
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("Definition of CPU OC parameter list"),
> > +   guid("{B7F3CA0A-ACDC-42D2-9217-77C6C628FBD2}")]
> > +  class LENOVO_GAMEZONE_CPU_OC_DATA {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("OC tune id.")]
> > +      uint32 Tuneid;
> > +
> > +      [WmiDataId(2), read, Description("Default value.")]
> > +      uint32 DefaultValue;
> > +
> > +      [WmiDataId(3), read, Description("OC Value.")]
> > +      uint32 OCValue;
> > +
> > +      [WmiDataId(4), read, Description("Min Value.")]
> > +      uint32 MinValue;
> > +
> > +      [WmiDataId(5), read, Description("Max Value.")]
> > +      uint32 MaxValue;
> > +
> > +      [WmiDataId(6), read, Description("Scale Value.")]
> > +      uint32 ScaleValue;
> > +
> > +      [WmiDataId(7), read, Description("OC Order id.")]
> > +      uint32 OCOrderid;
> > +
> > +      [WmiDataId(8), read, Description("NON-OC Order id.")]
> > +      uint32 NOCOrderid;
> > +
> > +      [WmiDataId(9), read, Description("Delay time in ms.")]
> > +      uint32 Interval;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("Definition of GPU OC parameter list"),
> > +   guid("{887B54E2-DDDC-4B2C-8B88-68A26A8835D0}")]
> > +  class LENOVO_GAMEZONE_GPU_OC_DATA {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("P-State ID.")]
> > +      uint32 PStateID;
> > +
> > +      [WmiDataId(2), read, Description("CLOCK ID.")]
> > +      uint32 ClockID;
> > +
> > +      [WmiDataId(3), read, Description("Default value.")]
> > +      uint32 defaultvalue;
> > +
> > +      [WmiDataId(4), read, Description("OC Offset freqency.")]
> > +      uint32 OCOffsetFreq;
> > +
> > +      [WmiDataId(5), read, Description("OC Min offset value.")]
> > +      uint32 OCMinOffset;
> > +
> > +      [WmiDataId(6), read, Description("OC Max offset value.")]
> > +      uint32 OCMaxOffset;
> > +
> > +      [WmiDataId(7), read, Description("OC Offset Scale.")]
> > +      uint32 OCOffsetScale;
> > +
> > +      [WmiDataId(8), read, Description("OC Order id.")]
> > +      uint32 OCOrderid;
> > +
> > +      [WmiDataId(9), read, Description("NON-OC Order id.")]
> > +      uint32 NOCOrderid;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("Fancooling finish event"),
> > +   guid("{BC72A435-E8C1-4275-B3E2-D8B8074ABA59}")]
> > +  class LENOVO_GAMEZONE_FAN_COOLING_EVENT: WMIEvent {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("Fancooling clean finish event")]
> > +      uint32 EventId;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("Smart Fan mode change event"),
> > +   guid("{D320289E-8FEA-41E0-86F9-611D83151B5F}")]
> > +  class LENOVO_GAMEZONE_SMART_FAN_MODE_EVENT: WMIEvent {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("Smart Fan Mode change event")]
> > +      uint32 mode;
> > +
> > +       [WmiDataId(2), read, Description("version of FN+Q")]
> > +      uint32 version;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("Smart Fan setting mode change event"),
> > +   guid("{D320289E-8FEA-41E1-86F9-611D83151B5F}")]
> > +  class LENOVO_GAMEZONE_SMART_FAN_SETTING_EVENT: WMIEvent {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("Smart Fan Setting mode change event")]
> > +      uint32 mode;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("POWER CHARGE MODE Change EVENT"),
> > +   guid("{D320289E-8FEA-41E0-86F9-711D83151B5F}")]
> > +  class LENOVO_GAMEZONE_POWER_CHARGE_MODE_EVENT: WMIEvent {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("POWER CHARGE MODE Change EVENT")]
> > +      uint32 mode;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("Thermal Mode Real Mode change event"),
> > +   guid("{D320289E-8FEA-41E0-86F9-911D83151B5F}")]
> > +  class LENOVO_GAMEZONE_THERMAL_MODE_EVENT: WMIEvent {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description("Thermal Mode Real Mode")]
> > +      uint32 mode;
> > +  };
> > diff --git a/Documentation/wmi/devices/lenovo-wmi-other-method.rst b/Documentation/wmi/devices/lenovo-wmi-other-method.rst
> > new file mode 100644
> > index 000000000000..d555f1ed9588
> > --- /dev/null
> > +++ b/Documentation/wmi/devices/lenovo-wmi-other-method.rst
> > @@ -0,0 +1,142 @@
> > +.. SPDX-License-Identifier: GPL-2.0-or-later
> > +===========================================================
> > +Lenovo WMI Interface Other Mode Driver (lenovo-wmi-other)
> > +===========================================================
> > +
> > +Introduction
> > +============
> > +Lenovo WMI Other Mode interface is broken up into multiple GUIDs,
> > +The primary Other Mode interface provides advanced power tuning features
> > +such as Package Power Tracking (PPT). It is paired with multiple data block
> > +GUIDs that provide context for the various methods.
> > +
> > +
> > +Other Mode
> > +------------
> > +WMI GUID "DC2A8805-3A8C-41BA-A6F7-092E0089CD3B"
> > +
> > +The Other Mode WMI interface uses the fw_attributes class to expose
> > +various WMI attributes provided by the interface in the sysfs. This enables
> > +CPU and GPU power limit tuning as well as various other attributes for
> > +devices that fall under the "Gaming Series" of Lenovo devices. Each
> > +attribute exposed by the Other Mode interface has corresponding
> > +capability data blocks which allow the driver to probe details about the
> > +attribute. Each attibute has multiple pages, one for each of the platform
> > +profiles managed by the Gamezone interface. Attributes are exposed in sysfs
> > +under the following path:
> > +

Note for self here, attribute [attibute]

- Derek
> > +::
> > +/sys/class/firmware-attributes/lenovo-wmi-other/attributes/<attribute>/
> > +
> > +LENOVO_CAPABILITY_DATA_01
> > +~~~~~~~~~~~~~~~~~~~~~~~~~
> > +WMI GUID "7A8F5407-CB67-4D6E-B547-39B3BE018154"
> > +
> > +The LENOVO_CAPABILITY_DATA_01 interface provides information on various
> > +power limits of integrated CPU and GPU components.
> > +
> > +The following attributes are supported:
> > + - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit
> > + - ppt_pl2_sppt: Platform Profile Tracking Slow Package Power Tracking
> > + - ppt_pl3_fppt: Platform Profile Tracking Fast Package Power Tracking
> > +
> > +Each attribute has the following properties:
> > + - current_value
> > + - default_value
> > + - display_name
> > + - max_value
> > + - min_value
> > + - scalar_increment
> > + - type
> > +
> > +
> > +WMI interface description
> > +=========================
> > +
> > +The WMI interface description can be decoded from the embedded binary MOF (bmof)
> > +data using the `bmfdec <https://github.com/pali/bmfdec>`_ utility:
> > +
> > +::
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("LENOVO_OTHER_METHOD class"),
> > +   guid("{dc2a8805-3a8c-41ba-a6f7-092e0089cd3b}")]
> > +  class LENOVO_OTHER_METHOD {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiMethodId(17), Implemented, Description("Get Feature Value ")]
> > +      void GetFeatureValue([in] uint32 IDs, [out] uint32 value);
> > +
> > +      [WmiMethodId(18), Implemented, Description("Set Feature Value ")]
> > +      void SetFeatureValue([in] uint32 IDs, [in] uint32 value);
> > +
> > +      [WmiMethodId(19), Implemented, Description("Get Data By Command ")]
> > +      void GetDataByCommand([in] uint32 IDs, [in] uint32 Command, [out] uint32 DataSize, [out, WmiSizeIs("DataSize")] uint32 Data[]);
> > +
> > +      [WmiMethodId(99), Implemented, Description("Get Data By Package for TAC")]
> > +      void GetDataByPackage([in, Max(40)] uint8 Input[], [out] uint32 DataSize, [out, WmiSizeIs("DataSize")] uint8 Data[]);
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("LENOVO CAPABILITY DATA 00"),
> > +   guid("{362a3afe-3d96-4665-8530-96dad5bb300e}")]
> > +  class LENOVO_CAPABILITY_DATA_00 {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description(" IDs.")]
> > +      uint32 IDs;
> > +
> > +      [WmiDataId(2), read, Description("Capability.")]
> > +      uint32 Capability;
> > +
> > +      [WmiDataId(3), read, Description("Capability Default Value.")]
> > +      uint32 DefaultValue;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("LENOVO CAPABILITY DATA 01"),
> > +   guid("{7a8f5407-cb67-4d6e-b547-39b3be018154}")]
> > +  class LENOVO_CAPABILITY_DATA_01 {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description(" IDs.")]
> > +      uint32 IDs;
> > +
> > +      [WmiDataId(2), read, Description("Capability.")]
> > +      uint32 Capability;
> > +
> > +      [WmiDataId(3), read, Description("Default Value.")]
> > +      uint32 DefaultValue;
> > +
> > +      [WmiDataId(4), read, Description("Step.")]
> > +      uint32 Step;
> > +
> > +      [WmiDataId(5), read, Description("Minimum Value.")]
> > +      uint32 MinValue;
> > +
> > +      [WmiDataId(6), read, Description("Maximum Value.")]
> > +      uint32 MaxValue;
> > +  };
> > +
> > +  [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"),
> > +   Description("LENOVO CAPABILITY DATA 02"),
> > +   guid("{bbf1f790-6c2f-422b-bc8c-4e7369c7f6ab}")]
> > +  class LENOVO_CAPABILITY_DATA_02 {
> > +      [key, read] string InstanceName;
> > +      [read] boolean Active;
> > +
> > +      [WmiDataId(1), read, Description(" IDs.")]
> > +      uint32 IDs;
> > +
> > +      [WmiDataId(2), read, Description("Capability.")]
> > +      uint32 Capability;
> > +
> > +      [WmiDataId(3), read, Description("Data Size.")]
> > +      uint32 DataSize;
> > +
> > +      [WmiDataId(4), read, Description("Default Value"), WmiSizeIs("DataSize")]
> > +      uint8 DefaultValue[];
> > +  };
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 6f78d6bcbc7b..e20c32b3c480 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -13151,6 +13151,13 @@ S:   Maintained
> >   W:  http://legousb.sourceforge.net/
> >   F:  drivers/usb/misc/legousbtower.c
> >
> > +LENOVO WMI drivers
> > +M:   Derek J. Clark <derekjohn.clark@...il.com>
> > +L:   platform-driver-x86@...r.kernel.org
> > +S:   Maintained
> > +F:   Documentation/wmi/devices/lenovo-wmi-gamezone.rst
> > +F:   Documentation/wmi/devices/lenovo-wmi-other.rst
> > +
> >   LETSKETCH HID TABLET DRIVER
> >   M:  Hans de Goede <hdegoede@...hat.com>
> >   L:  linux-input@...r.kernel.org
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ