€•—Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ./translations/zh_CN/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_TW/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/it_IT/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ja_JP/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ko_KR/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/pt_BR/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/sp_SP/wmi/devices/uniwill-laptop”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ)SPDX-License-Identifier: GPL-2.0-or-later”h]”hŒ)SPDX-License-Identifier: GPL-2.0-or-later”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒH/var/lib/git/docbuild/linux/Documentation/wmi/devices/uniwill-laptop.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ(Uniwill Notebook driver (uniwill-laptop)”h]”hŒ(Uniwill Notebook driver (uniwill-laptop)”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Introduction”h]”hŒ Introduction”…””}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒ paragraph”“”)”}”(hXMany notebooks manufactured by Uniwill (either directly or as ODM) provide a EC interface for controlling various platform settings like sensors and fan control. This interface is used by the ``uniwill-laptop`` driver to map those features onto standard kernel interfaces.”h]”(hŒÀMany notebooks manufactured by Uniwill (either directly or as ODM) provide a EC interface for controlling various platform settings like sensors and fan control. This interface is used by the ”…””}”(hhðh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``uniwill-laptop``”h]”hŒuniwill-laptop”…””}”(hhúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhhðubhŒ> driver to map those features onto standard kernel interfaces.”…””}”(hhðh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒEC WMI interface description”h]”hŒEC WMI interface description”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´Kubhï)”}”(hŒ–The EC WMI interface description can be decoded from the embedded binary MOF (bmof) data using the `bmfdec `_ utility:”h]”(hŒcThe EC WMI interface description can be decoded from the embedded binary MOF (bmof) data using the ”…””}”(hj+h²hh³Nh´NubhŒ reference”“”)”}”(hŒ*`bmfdec `_”h]”hŒbmfdec”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œbmfdec”Œrefuri”Œhttps://github.com/pali/bmfdec”uh1j3hj+ubhŒtarget”“”)”}”(hŒ! ”h]”h}”(h]”Œbmfdec”ah ]”h"]”Œbmfdec”ah$]”h&]”Œrefuri”jFuh1jGŒ referenced”Khj+ubhŒ utility:”…””}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khjh²hubhŒ literal_block”“”)”}”(hXÁ[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class used to operate methods on a ULong"), guid("{ABBC0F6F-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_MULong { [key, read] string InstanceName; [read] boolean Active; [WmiMethodId(1), Implemented, read, write, Description("Return the contents of a ULong")] void GetULong([out, Description("Ulong Data")] uint32 Data); [WmiMethodId(2), Implemented, read, write, Description("Set the contents of a ULong")] void SetULong([in, Description("Ulong Data")] uint32 Data); [WmiMethodId(3), Implemented, read, write, Description("Generate an event containing ULong data")] void FireULong([in, Description("WMI requires a parameter")] uint32 Hack); [WmiMethodId(4), Implemented, read, write, Description("Get and Set the contents of a ULong")] void GetSetULong([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); [WmiMethodId(5), Implemented, read, write, Description("Get and Set the contents of a ULong for Dollby button")] void GetButton([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); };”h]”hXÁ[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class used to operate methods on a ULong"), guid("{ABBC0F6F-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_MULong { [key, read] string InstanceName; [read] boolean Active; [WmiMethodId(1), Implemented, read, write, Description("Return the contents of a ULong")] void GetULong([out, Description("Ulong Data")] uint32 Data); [WmiMethodId(2), Implemented, read, write, Description("Set the contents of a ULong")] void SetULong([in, Description("Ulong Data")] uint32 Data); [WmiMethodId(3), Implemented, read, write, Description("Generate an event containing ULong data")] void FireULong([in, Description("WMI requires a parameter")] uint32 Hack); [WmiMethodId(4), Implemented, read, write, Description("Get and Set the contents of a ULong")] void GetSetULong([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); [WmiMethodId(5), Implemented, read, write, Description("Get and Set the contents of a ULong for Dollby button")] void GetButton([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); };”…””}”hjcsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jah³hÇh´Khjh²hubhï)”}”(hŒµMost of the WMI-related code was copied from the Windows driver samples, which unfortunately means that the WMI-GUID is not unique. This makes the WMI-GUID unusable for autoloading.”h]”hŒµMost of the WMI-related code was copied from the Windows driver samples, which unfortunately means that the WMI-GUID is not unique. This makes the WMI-GUID unusable for autoloading.”…””}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K1hjh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒWMI method GetULong()”h]”hŒWMI method GetULong()”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K5ubhï)”}”(hŒOThis WMI method was copied from the Windows driver samples and has no function.”h]”hŒOThis WMI method was copied from the Windows driver samples and has no function.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K7hjh²hubeh}”(h]”Œwmi-method-getulong”ah ]”h"]”Œwmi method getulong()”ah$]”h&]”uh1hÈhjh²hh³hÇh´K5ubhÉ)”}”(hhh]”(hÎ)”}”(hŒWMI method SetULong()”h]”hŒWMI method SetULong()”…””}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¦h²hh³hÇh´K:ubhï)”}”(hŒOThis WMI method was copied from the Windows driver samples and has no function.”h]”hŒOThis WMI method was copied from the Windows driver samples and has no function.”…””}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K`_ could also be helpful.”h]”(hŒThe EC behind the ”…””}”(hjph²hh³Nh´Nubhù)”}”(hŒ``GetSetULong``”h]”hŒ GetSetULong”…””}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjpubhŒÅ method is used by the OEM software supplied by the manufacturer. Reverse-engineering of this software is difficult since it uses an obfuscator, however some parts are not obfuscated. In this case ”…””}”(hjph²hh³Nh´Nubj4)”}”(hŒ)`dnSpy `_”h]”hŒdnSpy”…””}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒdnSpy”jEŒhttps://github.com/dnSpy/dnSpy”uh1j3hjpubjH)”}”(hŒ! ”h]”h}”(h]”Œdnspy”ah ]”h"]”Œdnspy”ah$]”h&]”Œrefuri”jšuh1jGjVKhjpubhŒ could also be helpful.”…””}”(hjph²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K]hjEh²hubhï)”}”(hŒRThe EC can be accessed under Windows using powershell (requires admin privileges):”h]”hŒRThe EC can be accessed under Windows using powershell (requires admin privileges):”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KahjEh²hubjb)”}”(hŒº> $obj = Get-CimInstance -Namespace root/wmi -ClassName AcpiTest_MULong | Select-Object -First 1 > Invoke-CimMethod -InputObject $obj -MethodName GetSetULong -Arguments @{Data = }”h]”hŒº> $obj = Get-CimInstance -Namespace root/wmi -ClassName AcpiTest_MULong | Select-Object -First 1 > Invoke-CimMethod -InputObject $obj -MethodName GetSetULong -Arguments @{Data = }”…””}”hjÀsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jah³hÇh´KehjEh²hubeh}”(h]”Œ(reverse-engineering-the-ec-wmi-interface”ah ]”h"]”Œ(reverse-engineering the ec wmi interface”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KXubhÉ)”}”(hhh]”(hÎ)”}”(hŒWMI event interface description”h]”hŒWMI event interface description”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÖh²hh³hÇh´Kiubhï)”}”(hŒ[The WMI interface description can also be decoded from the embedded binary MOF (bmof) data:”h]”hŒ[The WMI interface description can also be decoded from the embedded binary MOF (bmof) data:”…””}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KkhjÖh²hubjb)”}”(hXT[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class containing event generated ULong data"), guid("{ABBC0F72-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_EventULong : WmiEvent { [key, read] string InstanceName; [read] boolean Active; [WmiDataId(1), read, write, Description("ULong Data")] uint32 ULong; };”h]”hXT[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class containing event generated ULong data"), guid("{ABBC0F72-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_EventULong : WmiEvent { [key, read] string InstanceName; [read] boolean Active; [WmiDataId(1), read, write, Description("ULong Data")] uint32 ULong; };”…””}”hjõsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jah³hÇh´KphjÖh²hubhï)”}”(hŒ·Most of the WMI-related code was again copied from the Windows driver samples, causing this WMI interface to suffer from the same restrictions as the EC WMI interface described above.”h]”hŒ·Most of the WMI-related code was again copied from the Windows driver samples, causing this WMI interface to suffer from the same restrictions as the EC WMI interface described above.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KzhjÖh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒWMI event data”h]”hŒWMI event data”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K~ubhï)”}”(hŒdThe WMI event data contains a single 32-bit value which is used to indicate various platform events.”h]”hŒdThe WMI event data contains a single 32-bit value which is used to indicate various platform events.”…””}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K€hjh²hubeh}”(h]”Œwmi-event-data”ah ]”h"]”Œwmi event data”ah$]”h&]”uh1hÈhjÖh²hh³hÇh´K~ubeh}”(h]”Œwmi-event-interface-description”ah ]”h"]”Œwmi event interface description”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KiubhÉ)”}”(hhh]”(hÎ)”}”(hŒ3Reverse-Engineering the Uniwill WMI event interface”h]”hŒ3Reverse-Engineering the Uniwill WMI event interface”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj@h²hh³hÇh´Kƒubhï)”}”(hŒ‡The driver logs debug messages when receiving a WMI event. Thus enabling debug messages will be useful for finding unknown event codes.”h]”hŒ‡The driver logs debug messages when receiving a WMI event. Thus enabling debug messages will be useful for finding unknown event codes.”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K…hj@h²hubeh}”(h]”Œ3reverse-engineering-the-uniwill-wmi-event-interface”ah ]”h"]”Œ3reverse-engineering the uniwill wmi event interface”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KƒubhÉ)”}”(hhh]”(hÎ)”}”(hŒEC ACPI interface description”h]”hŒEC ACPI interface description”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjgh²hh³hÇh´K‰ubhï)”}”(hXsThe ``INOU0000`` ACPI device is a virtual device used to access various hardware registers available on notebooks manufactured by Uniwill. Reading and writing those registers happens by calling ACPI control methods. The ``uniwill-laptop`` driver uses this device to communicate with the EC because the ACPI control methods are faster than the WMI methods described above.”h]”(hŒThe ”…””}”(hjxh²hh³Nh´Nubhù)”}”(hŒ ``INOU0000``”h]”hŒINOU0000”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjxubhŒÌ ACPI device is a virtual device used to access various hardware registers available on notebooks manufactured by Uniwill. Reading and writing those registers happens by calling ACPI control methods. The ”…””}”(hjxh²hh³Nh´Nubhù)”}”(hŒ``uniwill-laptop``”h]”hŒuniwill-laptop”…””}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjxubhŒ… driver uses this device to communicate with the EC because the ACPI control methods are faster than the WMI methods described above.”…””}”(hjxh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K‹hjgh²hubhï)”}”(hXACPI control methods used for reading registers take a single ACPI integer containing the address of the register to read and return a ACPI integer containing the data inside said register. ACPI control methods used for writing registers however take two ACPI integers, with the additional ACPI integer containing the data to be written into the register. Such ACPI control methods return nothing.”h]”hXACPI control methods used for reading registers take a single ACPI integer containing the address of the register to read and return a ACPI integer containing the data inside said register. ACPI control methods used for writing registers however take two ACPI integers, with the additional ACPI integer containing the data to be written into the register. Such ACPI control methods return nothing.”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khjgh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ System memory”h]”hŒ System memory”…””}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¸h²hh³hÇh´K—ubhï)”}”(hXISystem memory can be accessed with a granularity of either a single byte (``MMRB`` for reading and ``MMWB`` for writing) or four bytes (``MMRD`` for reading and ``MMWD`` for writing). Those ACPI control methods are unused because they provide no benefit when compared to the native memory access functions provided by the kernel.”h]”(hŒJSystem memory can be accessed with a granularity of either a single byte (”…””}”(hjÉh²hh³Nh´Nubhù)”}”(hŒ``MMRB``”h]”hŒMMRB”…””}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjÉubhŒ for reading and ”…””}”(hjÉh²hh³Nh´Nubhù)”}”(hŒ``MMWB``”h]”hŒMMWB”…””}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjÉubhŒ for writing) or four bytes (”…””}”(hjÉh²hh³Nh´Nubhù)”}”(hŒ``MMRD``”h]”hŒMMRD”…””}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjÉubhŒ for reading and ”…””}”(hjÉh²hh³Nh´Nubhù)”}”(hŒ``MMWD``”h]”hŒMMWD”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjÉubhŒ  for writing). Those ACPI control methods are unused because they provide no benefit when compared to the native memory access functions provided by the kernel.”…””}”(hjÉh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K™hj¸h²hubeh}”(h]”Œ system-memory”ah ]”h"]”Œ system memory”ah$]”h&]”uh1hÈhjgh²hh³hÇh´K—ubhÉ)”}”(hhh]”(hÎ)”}”(hŒEC RAM”h]”hŒEC RAM”…””}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj'h²hh³hÇh´KŸubhï)”}”(hXVThe internal RAM of the EC can be accessed with a granularity of a single byte using the ``ECRR`` (read) and ``ECRW`` (write) ACPI control methods, with the maximum register address being ``0xFFF``. The OEM software waits 6 ms after calling one of those ACPI control methods, likely to avoid overwhelming the EC when being connected over LPC.”h]”(hŒYThe internal RAM of the EC can be accessed with a granularity of a single byte using the ”…””}”(hj8h²hh³Nh´Nubhù)”}”(hŒ``ECRR``”h]”hŒECRR”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj8ubhŒ (read) and ”…””}”(hj8h²hh³Nh´Nubhù)”}”(hŒ``ECRW``”h]”hŒECRW”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj8ubhŒG (write) ACPI control methods, with the maximum register address being ”…””}”(hj8h²hh³Nh´Nubhù)”}”(hŒ ``0xFFF``”h]”hŒ0xFFF”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj8ubhŒ‘. The OEM software waits 6 ms after calling one of those ACPI control methods, likely to avoid overwhelming the EC when being connected over LPC.”…””}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K¡hj'h²hubeh}”(h]”Œec-ram”ah ]”h"]”Œec ram”ah$]”h&]”uh1hÈhjgh²hh³hÇh´KŸubhÉ)”}”(hhh]”(hÎ)”}”(hŒPCI config space”h]”hŒPCI config space”…””}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj„h²hh³hÇh´K§ubhï)”}”(hX'The PCI config space can be accessed with a granularity of four bytes using the ``PCRD`` (read) and ``PCWD`` (write) ACPI control methods. The exact address format is unknown, and poking random PCI devices might confuse the PCI subsystem. Because of this those ACPI control methods are not used.”h]”(hŒPThe PCI config space can be accessed with a granularity of four bytes using the ”…””}”(hj•h²hh³Nh´Nubhù)”}”(hŒ``PCRD``”h]”hŒPCRD”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj•ubhŒ (read) and ”…””}”(hj•h²hh³Nh´Nubhù)”}”(hŒ``PCWD``”h]”hŒPCWD”…””}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj•ubhŒ» (write) ACPI control methods. The exact address format is unknown, and poking random PCI devices might confuse the PCI subsystem. Because of this those ACPI control methods are not used.”…””}”(hj•h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K©hj„h²hubeh}”(h]”Œpci-config-space”ah ]”h"]”Œpci config space”ah$]”h&]”uh1hÈhjgh²hh³hÇh´K§ubhÉ)”}”(hhh]”(hÎ)”}”(hŒIO ports”h]”hŒIO ports”…””}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÏh²hh³hÇh´K®ubhï)”}”(hXIO ports can be accessed with a granularity of four bytes using the ``IORD`` (read) and ``IOWD`` (write) ACPI control methods. Those ACPI control methods are unused because they provide no benefit when compared to the native IO port access functions provided by the kernel.”h]”(hŒDIO ports can be accessed with a granularity of four bytes using the ”…””}”(hjàh²hh³Nh´Nubhù)”}”(hŒ``IORD``”h]”hŒIORD”…””}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjàubhŒ (read) and ”…””}”(hjàh²hh³Nh´Nubhù)”}”(hŒ``IOWD``”h]”hŒIOWD”…””}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjàubhŒ± (write) ACPI control methods. Those ACPI control methods are unused because they provide no benefit when compared to the native IO port access functions provided by the kernel.”…””}”(hjàh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K°hjÏh²hubeh}”(h]”Œio-ports”ah ]”h"]”Œio ports”ah$]”h&]”uh1hÈhjgh²hh³hÇh´K®ubhÉ)”}”(hhh]”(hÎ)”}”(hŒCMOS RAM”h]”hŒCMOS RAM”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´Kµubhï)”}”(hXThe CMOS RAM can be accessed with a granularity of a single byte using the ``RCMS`` (read) and ``WCMS`` ACPI control methods. Using those ACPI methods might interfere with the native CMOS RAM access functions provided by the kernel due to the usage of indexed IO, so they are unused.”h]”(hŒKThe CMOS RAM can be accessed with a granularity of a single byte using the ”…””}”(hj+h²hh³Nh´Nubhù)”}”(hŒ``RCMS``”h]”hŒRCMS”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj+ubhŒ (read) and ”…””}”(hj+h²hh³Nh´Nubhù)”}”(hŒ``WCMS``”h]”hŒWCMS”…””}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj+ubhŒ´ ACPI control methods. Using those ACPI methods might interfere with the native CMOS RAM access functions provided by the kernel due to the usage of indexed IO, so they are unused.”…””}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K·hjh²hubeh}”(h]”Œcmos-ram”ah ]”h"]”Œcmos ram”ah$]”h&]”uh1hÈhjgh²hh³hÇh´KµubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Indexed IO”h]”hŒ Indexed IO”…””}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjeh²hh³hÇh´K¼ubhï)”}”(hXIndexed IO with IO ports with a granularity of a single byte can be performed using the ``RIOP`` (read) and ``WIOP`` (write) ACPI control methods. Those ACPI methods are unused because they provide no benifit when compared to the native IO port access functions provided by the kernel.”h]”(hŒXIndexed IO with IO ports with a granularity of a single byte can be performed using the ”…””}”(hjvh²hh³Nh´Nubhù)”}”(hŒ``RIOP``”h]”hŒRIOP”…””}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjvubhŒ (read) and ”…””}”(hjvh²hh³Nh´Nubhù)”}”(hŒ``WIOP``”h]”hŒWIOP”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjvubhŒ© (write) ACPI control methods. Those ACPI methods are unused because they provide no benifit when compared to the native IO port access functions provided by the kernel.”…””}”(hjvh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K¾hjeh²hubhï)”}”(hXpSpecial thanks go to github user `pobrn` which developed the `qc71_laptop `_ driver on which this driver is partly based. The same is true for Tuxedo Computers, which developed the `tuxedo-drivers `_ package which also served as a foundation for this driver.”h]”(hŒ!Special thanks go to github user ”…””}”(hj¨h²hh³Nh´NubhŒtitle_reference”“”)”}”(hŒ`pobrn`”h]”hŒpobrn”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°hj¨ubhŒ which developed the ”…””}”(hj¨h²hh³Nh´Nubj4)”}”(hŒ5`qc71_laptop `_”h]”hŒ qc71_laptop”…””}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ qc71_laptop”jEŒ$https://github.com/pobrn/qc71_laptop”uh1j3hj¨ubjH)”}”(hŒ' ”h]”h}”(h]”Œ qc71-laptop”ah ]”h"]”Œ qc71_laptop”ah$]”h&]”Œrefuri”jÔuh1jGjVKhj¨ubhŒi driver on which this driver is partly based. The same is true for Tuxedo Computers, which developed the ”…””}”(hj¨h²hh³Nh´Nubj4)”}”(hŒZ`tuxedo-drivers `_”h]”hŒtuxedo-drivers”…””}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œtuxedo-drivers”jEŒFhttps://gitlab.com/tuxedocomputers/development/packages/tuxedo-drivers”uh1j3hj¨ubjH)”}”(hŒI ”h]”h}”(h]”Œtuxedo-drivers”ah ]”h"]”Œtuxedo-drivers”ah$]”h&]”Œrefuri”jöuh1jGjVKhj¨ubhŒ; package which also served as a foundation for this driver.”…””}”(hj¨h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÂhjeh²hubeh}”(h]”Œ indexed-io”ah ]”h"]”Œ indexed io”ah$]”h&]”uh1hÈhjgh²hh³hÇh´K¼ubeh}”(h]”Œec-acpi-interface-description”ah ]”h"]”Œec acpi interface description”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K‰ubeh}”(h]”Œ&uniwill-notebook-driver-uniwill-laptop”ah ]”h"]”Œ(uniwill notebook driver (uniwill-laptop)”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jIŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j#j jjjBj?jRjOj£j jÊjÇjñjîjjj:j7jÓjÐj¤j¡j=j:j5j2jdjajjj$j!jj~jÌjÉjjjbj_jjjÞjÛjjýuŒ nametypes”}”(j#‰j‰jB‰jRˆj£‰jʉjñ‰j‰j:‰jÓ‰j¤ˆj=‰j5‰jd‰j‰j$‰j‰j̉j‰jb‰j‰jÞˆjˆuh}”(j hÊjhÝj?jjOjIj jjÇj¦jîjÍjjôj7jjÐjEj¡j›j:jÖj2jjaj@jjgj!j¸j~j'jÉj„jjÏj_jjjejÛjÕjýj÷uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.