← Documents Documentation/wmi/devices/alienware-wmi.rst GitHub 원문 ↗

Linux 6.18.37 · WMI / Device Drivers

Dell AWCC WMI interface driver (alienware-wmi)

Alienware와 Dell G-Series의 AWCC WMI method, thermal profile, Game Shift, STM32 RGB controller GPIO interface를 설명합니다.

Source pathDocumentation/wmi/devices/alienware-wmi.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

alienware-wmi.rst:1-322

Alienware와 Dell G-Series의 AWCC WMI method, thermal profile, Game Shift, STM32 RGB controller GPIO interface를 설명합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0-or-later
2
3 ==============================================
4 Dell AWCC WMI interface driver (alienware-wmi)
5 ==============================================
6
7 Introduction
8 ============
9
10 The WMI device WMAX has been implemented for many Alienware and Dell's G-Series
11 models. Throughout these models, two implementations have been identified. The
12 first one, used by older systems, deals with HDMI, brightness, RGB, amplifier
13 and deep sleep control. The second one used by newer systems deals primarily
14 with thermal control and overclocking.
15
16 It is suspected that the latter is used by Alienware Command Center (AWCC) to
17 manage manufacturer predefined thermal profiles. The alienware-wmi driver
18 exposes Thermal_Information and Thermal_Control methods through the Platform
19 Profile API to mimic AWCC's behavior.
20
21 This newer interface, named AWCCMethodFunction has been reverse engineered, as
22 Dell has not provided any official documentation. We will try to describe to the
23 best of our ability its discovered inner workings.
24
25 .. note::
26 The following method description may be incomplete and some operations have
27 different implementations between devices.
28
29 WMI interface description
30 -------------------------
31
32 The WMI interface description can be decoded from the embedded binary MOF (bmof)
33 data using the `bmfdec <https://github.com/pali/bmfdec>`_ utility:
34
35 ::
36
37 [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("WMI Function"), guid("{A70591CE-A997-11DA-B012-B622A1EF5492}")]
38 class AWCCWmiMethodFunction {
39 [key, read] string InstanceName;
40 [read] boolean Active;
41
42 [WmiMethodId(13), Implemented, read, write, Description("Return Overclocking Report.")] void Return_OverclockingReport([out] uint32 argr);
43 [WmiMethodId(14), Implemented, read, write, Description("Set OCUIBIOS Control.")] void Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr);
44 [WmiMethodId(15), Implemented, read, write, Description("Clear OC FailSafe Flag.")] void Clear_OCFailSafeFlag([out] uint32 argr);
45 [WmiMethodId(19), Implemented, read, write, Description("Get Fan Sensors.")] void GetFanSensors([in] uint32 arg2, [out] uint32 argr);
46 [WmiMethodId(20), Implemented, read, write, Description("Thermal Information.")] void Thermal_Information([in] uint32 arg2, [out] uint32 argr);
47 [WmiMethodId(21), Implemented, read, write, Description("Thermal Control.")] void Thermal_Control([in] uint32 arg2, [out] uint32 argr);
48 [WmiMethodId(23), Implemented, read, write, Description("MemoryOCControl.")] void MemoryOCControl([in] uint32 arg2, [out] uint32 argr);
49 [WmiMethodId(26), Implemented, read, write, Description("System Information.")] void SystemInformation([in] uint32 arg2, [out] uint32 argr);
50 [WmiMethodId(28), Implemented, read, write, Description("Power Information.")] void PowerInformation([in] uint32 arg2, [out] uint32 argr);
51 [WmiMethodId(32), Implemented, read, write, Description("FW Update GPIO toggle.")] void FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr);
52 [WmiMethodId(33), Implemented, read, write, Description("Read Total of GPIOs.")] void ReadTotalofGPIOs([out] uint32 argr);
53 [WmiMethodId(34), Implemented, read, write, Description("Read GPIO pin Status.")] void ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr);
54 [WmiMethodId(35), Implemented, read, write, Description("Read Chassis Color.")] void ReadChassisColor([out] uint32 argr);
55 [WmiMethodId(36), Implemented, read, write, Description("Read Platform Properties.")] void ReadPlatformProperties([out] uint32 argr);
56 [WmiMethodId(37), Implemented, read, write, Description("Game Shift Status.")] void GameShiftStatus([in] uint32 arg2, [out] uint32 argr);
57 [WmiMethodId(128), Implemented, read, write, Description("Caldera SW installation.")] void CalderaSWInstallation([out] uint32 argr);
58 [WmiMethodId(129), Implemented, read, write, Description("Caldera SW is released.")] void CalderaSWReleased([out] uint32 argr);
59 [WmiMethodId(130), Implemented, read, write, Description("Caldera Connection Status.")] void CalderaConnectionStatus([in] uint32 arg2, [out] uint32 argr);
60 [WmiMethodId(131), Implemented, read, write, Description("Surprise Unplugged Flag Status.")] void SurpriseUnpluggedFlagStatus([out] uint32 argr);
61 [WmiMethodId(132), Implemented, read, write, Description("Clear Surprise Unplugged Flag.")] void ClearSurpriseUnpluggedFlag([out] uint32 argr);
62 [WmiMethodId(133), Implemented, read, write, Description("Cancel Undock Request.")] void CancelUndockRequest([out] uint32 argr);
63 [WmiMethodId(135), Implemented, read, write, Description("Devices in Caldera.")] void DevicesInCaldera([in] uint32 arg2, [out] uint32 argr);
64 [WmiMethodId(136), Implemented, read, write, Description("Notify BIOS for SW ready to disconnect Caldera.")] void NotifyBIOSForSWReadyToDisconnectCaldera([out] uint32 argr);
65 [WmiMethodId(160), Implemented, read, write, Description("Tobii SW installation.")] void TobiiSWinstallation([out] uint32 argr);
66 [WmiMethodId(161), Implemented, read, write, Description("Tobii SW Released.")] void TobiiSWReleased([out] uint32 argr);
67 [WmiMethodId(162), Implemented, read, write, Description("Tobii Camera Power Reset.")] void TobiiCameraPowerReset([out] uint32 argr);
68 [WmiMethodId(163), Implemented, read, write, Description("Tobii Camera Power On.")] void TobiiCameraPowerOn([out] uint32 argr);
69 [WmiMethodId(164), Implemented, read, write, Description("Tobii Camera Power Off.")] void TobiiCameraPowerOff([out] uint32 argr);
70 };
71
72 Methods not described in the following document have unknown behavior.
73
74 Argument Structure
75 ------------------
76
77 All input arguments have type **uint32** and their structure is very similar
78 between methods. Usually, the first byte corresponds to a specific *operation*
79 the method performs, and the subsequent bytes correspond to *arguments* passed
80 to this *operation*. For example, if an operation has code 0x01 and requires an
81 ID 0xA0, the argument you would pass to the method is 0xA001.
82
83
84 Thermal Methods
85 ===============
86
87 WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr)
88 -------------------------------------------------------------
89
90 +--------------------+------------------------------------+--------------------+
91 | Operation (Byte 0) | Description | Arguments |
92 +====================+====================================+====================+
93 | 0x01 | Get the number of temperature | - Byte 1: Fan ID |
94 | | sensors related with a fan ID | |
95 +--------------------+------------------------------------+--------------------+
96 | 0x02 | Get the temperature sensor IDs | - Byte 1: Fan ID |
97 | | related to a fan sensor ID | - Byte 2: Index |
98 +--------------------+------------------------------------+--------------------+
99
100 WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr)
101 -------------------------------------------------------------------
102
103 +--------------------+------------------------------------+--------------------+
104 | Operation (Byte 0) | Description | Arguments |
105 +====================+====================================+====================+
106 | 0x01 | Unknown. | - None |
107 +--------------------+------------------------------------+--------------------+
108 | 0x02 | Get system description number with | - None |
109 | | the following structure: | |
110 | | | |
111 | | - Byte 0: Number of fans | |
112 | | - Byte 1: Number of temperature | |
113 | | sensors | |
114 | | - Byte 2: Unknown | |
115 | | - Byte 3: Number of thermal | |
116 | | profiles | |
117 +--------------------+------------------------------------+--------------------+
118 | 0x03 | List an ID or resource at a given | - Byte 1: Index |
119 | | index. Fan IDs, temperature IDs, | |
120 | | unknown IDs and thermal profile | |
121 | | IDs are listed in that exact | |
122 | | order. | |
123 | | | |
124 | | Operation 0x02 is used to know | |
125 | | which indexes map to which | |
126 | | resources. | |
127 | | | |
128 | | **Returns:** ID at a given index | |
129 +--------------------+------------------------------------+--------------------+
130 | 0x04 | Get the current temperature for a | - Byte 1: Sensor |
131 | | given temperature sensor. | ID |
132 +--------------------+------------------------------------+--------------------+
133 | 0x05 | Get the current RPM for a given | - Byte 1: Fan ID |
134 | | fan. | |
135 +--------------------+------------------------------------+--------------------+
136 | 0x06 | Get fan speed percentage. (not | - Byte 1: Fan ID |
137 | | implemented in every model) | |
138 +--------------------+------------------------------------+--------------------+
139 | 0x07 | Unknown. | - Unknown |
140 +--------------------+------------------------------------+--------------------+
141 | 0x08 | Get minimum RPM for a given FAN | - Byte 1: Fan ID |
142 | | ID. | |
143 +--------------------+------------------------------------+--------------------+
144 | 0x09 | Get maximum RPM for a given FAN | - Byte 1: Fan ID |
145 | | ID. | |
146 +--------------------+------------------------------------+--------------------+
147 | 0x0A | Get balanced thermal profile ID. | - None |
148 +--------------------+------------------------------------+--------------------+
149 | 0x0B | Get current thermal profile ID. | - None |
150 +--------------------+------------------------------------+--------------------+
151 | 0x0C | Get current `boost` value for a | - Byte 1: Fan ID |
152 | | given fan ID. | |
153 +--------------------+------------------------------------+--------------------+
154
155 WMI method Thermal_Control([in] uint32 arg2, [out] uint32 argr)
156 ---------------------------------------------------------------
157
158 +--------------------+------------------------------------+--------------------+
159 | Operation (Byte 0) | Description | Arguments |
160 +====================+====================================+====================+
161 | 0x01 | Activate a given thermal profile. | - Byte 1: Thermal |
162 | | | profile ID |
163 +--------------------+------------------------------------+--------------------+
164 | 0x02 | Set a `boost` value for a given | - Byte 1: Fan ID |
165 | | fan ID. | - Byte 2: Boost |
166 +--------------------+------------------------------------+--------------------+
167
168 These are the known thermal profile codes:
169
170 +------------------------------+----------+------+
171 | Thermal Profile | Type | ID |
172 +==============================+==========+======+
173 | Custom | Special | 0x00 |
174 +------------------------------+----------+------+
175 | G-Mode | Special | 0xAB |
176 +------------------------------+----------+------+
177 | Quiet | Legacy | 0x96 |
178 +------------------------------+----------+------+
179 | Balanced | Legacy | 0x97 |
180 +------------------------------+----------+------+
181 | Balanced Performance | Legacy | 0x98 |
182 +------------------------------+----------+------+
183 | Performance | Legacy | 0x99 |
184 +------------------------------+----------+------+
185 | Balanced | USTT | 0xA0 |
186 +------------------------------+----------+------+
187 | Balanced Performance | USTT | 0xA1 |
188 +------------------------------+----------+------+
189 | Cool | USTT | 0xA2 |
190 +------------------------------+----------+------+
191 | Quiet | USTT | 0xA3 |
192 +------------------------------+----------+------+
193 | Performance | USTT | 0xA4 |
194 +------------------------------+----------+------+
195 | Low Power | USTT | 0xA5 |
196 +------------------------------+----------+------+
197
198 If a model supports the User Selectable Thermal Tables (USTT) profiles, it will
199 not support the Legacy profiles and vice-versa.
200
201 Every model supports the CUSTOM (0x00) thermal profile. GMODE replaces
202 PERFORMANCE in G-Series laptops.
203
204 WMI method GameShiftStatus([in] uint32 arg2, [out] uint32 argr)
205 ---------------------------------------------------------------
206
207 +--------------------+------------------------------------+--------------------+
208 | Operation (Byte 0) | Description | Arguments |
209 +====================+====================================+====================+
210 | 0x01 | Toggle *Game Shift*. | - None |
211 +--------------------+------------------------------------+--------------------+
212 | 0x02 | Get *Game Shift* status. | - None |
213 +--------------------+------------------------------------+--------------------+
214
215 Game Shift Status does not change the fan speed profile but it could be some
216 sort of CPU/GPU power profile. Benchmarks have not been done.
217
218 This method is only present on Dell's G-Series laptops and it's implementation
219 implies GMODE thermal profile is available, even if operation 0x03 of
220 Thermal_Information does not list it.
221
222 G-key on Dell's G-Series laptops also changes Game Shift status, so both are
223 directly related.
224
225 Overclocking Methods
226 ====================
227
228 WMI method MemoryOCControl([in] uint32 arg2, [out] uint32 argr)
229 ---------------------------------------------------------------
230
231 AWCC supports memory overclocking, but this method is very intricate and has
232 not been deciphered yet.
233
234 GPIO control Methods
235 ====================
236
237 Alienware and Dell G Series devices with the AWCC interface usually have an
238 embedded STM32 RGB lighting controller with USB/HID capabilities. It's vendor ID
239 is ``187c`` while it's product ID may vary from model to model.
240
241 The control of two GPIO pins of this MCU is exposed as WMI methods for debugging
242 purposes.
243
244 +--------------+--------------------------------------------------------------+
245 | Pin | Description |
246 +==============+===============================+==============================+
247 | 0 | Device Firmware Update (DFU) | **HIGH**: Enables DFU mode |
248 | | mode pin. | on next MCU boot. |
249 | | +------------------------------+
250 | | | **LOW**: Disables DFU mode |
251 | | | on next MCU boot. |
252 +--------------+-------------------------------+------------------------------+
253 | 1 | Negative Reset (NRST) pin. | **HIGH**: MCU is ON. |
254 | | | |
255 | | +------------------------------+
256 | | | **LOW**: MCU is OFF. |
257 | | | |
258 +--------------+-------------------------------+------------------------------+
259
260 See :ref:`acknowledgements` for more information on this MCU.
261
262 .. note::
263 Some GPIO control methods break the usual argument structure and take a
264 **Pin number** instead of an operation on the first byte.
265
266 WMI method FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr)
267 ------------------------------------------------------------------
268
269 +--------------------+------------------------------------+--------------------+
270 | Operation (Byte 0) | Description | Arguments |
271 +====================+====================================+====================+
272 | Pin number | Set the pin status | - Byte 1: Pin |
273 | | | status |
274 +--------------------+------------------------------------+--------------------+
275
276 WMI method ReadTotalofGPIOs([out] uint32 argr)
277 ----------------------------------------------
278
279 +--------------------+------------------------------------+--------------------+
280 | Operation (Byte 0) | Description | Arguments |
281 +====================+====================================+====================+
282 | N/A | Get the total number of GPIOs | - None |
283 +--------------------+------------------------------------+--------------------+
284
285 .. note::
286 Due to how WMI methods are implemented on the firmware level, this method
287 requires a dummy uint32 input argument when invoked.
288
289 WMI method ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr)
290 ------------------------------------------------------------------
291
292 +--------------------+------------------------------------+--------------------+
293 | Operation (Byte 0) | Description | Arguments |
294 +====================+====================================+====================+
295 | Pin number | Get the pin status | - None |
296 +--------------------+------------------------------------+--------------------+
297
298 .. note::
299 There known firmware bug in some laptops where reading the status of a pin
300 also flips it.
301
302 Other information Methods
303 =========================
304
305 WMI method ReadChassisColor([out] uint32 argr)
306 ----------------------------------------------
307
308 Returns the chassis color internal ID.
309
310 .. _acknowledgements:
311
312 Acknowledgements
313 ================
314
315 Kudos to
316
317 * `AlexIII <https://github.com/AlexIII/tcc-g15>`_
318 * `T-Troll <https://github.com/T-Troll/alienfx-tools/>`_
319 * `Gabriel Marcano <https://gabriel.marcanobrady.family/blog/2024/12/16/dell-g5-5505-se-acpi-or-figuring-out-how-to-reset-the-rgb-controller/>`_
320
321 for documenting and testing some of this device's functionality, making it
322 possible to generalize this driver.
323

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

WMAX의 두 구현과 문서 범위

1-28

WMI 장치 `WMAX`는 여러 Alienware 및 Dell G-Series 모델에 구현되어 있으며 두 종류의 구현이 확인되었습니다. 구형 구현은 HDMI, 밝기, RGB, amplifier, deep sleep 제어를 담당하고, 신형 구현은 주로 thermal 제어와 overclocking을 담당합니다.

신형 구현은 Alienware Command Center(AWCC)가 제조사가 미리 정의한 thermal profile을 관리하는 데 사용하는 것으로 추정됩니다. `alienware-wmi` 드라이버는 AWCC 동작을 모방하기 위해 `Thermal_Information`과 `Thermal_Control`을 Platform Profile API로 노출합니다.

신형 `AWCCMethodFunction` interface에는 Dell의 공식 문서가 없어 reverse engineering으로 동작을 파악했습니다. 따라서 아래 설명은 불완전할 수 있고 같은 operation도 장치마다 구현이 다를 수 있습니다.

AWCC thermal 제어 경로
AWCCMethodFunction WMI interface 탐색Thermal_Information으로 sensor·profile 정보 조회Platform Profile API에 profile 노출Thermal_Control로 선택한 profile 활성화

firmware WMI method를 Linux Platform Profile API로 연결하는 흐름입니다.

.. SPDX-License-Identifier: GPL-2.0-or-later

==============================================
Dell AWCC WMI interface driver (alienware-wmi)
==============================================

Introduction
============

The WMI device WMAX has been implemented for many Alienware and Dell's G-Series
models. Throughout these models, two implementations have been identified. The
first one, used by older systems, deals with HDMI, brightness, RGB, amplifier
and deep sleep control. The second one used by newer systems deals primarily
with thermal control and overclocking.

It is suspected that the latter is used by Alienware Command Center (AWCC) to
manage manufacturer predefined thermal profiles. The alienware-wmi driver
exposes Thermal_Information and Thermal_Control methods through the Platform
Profile API to mimic AWCC's behavior.

This newer interface, named AWCCMethodFunction has been reverse engineered, as
Dell has not provided any official documentation. We will try to describe to the
best of our ability its discovered inner workings.

.. note::
   The following method description may be incomplete and some operations have
   different implementations between devices.

embedded binary MOF의 method 선언

29-73

embedded binary MOF(bmof)는 `bmfdec` 도구로 해석할 수 있습니다. GUID `{A70591CE-A997-11DA-B012-B622A1EF5492}`의 `AWCCWmiMethodFunction` class에는 읽기 가능한 `InstanceName`, `Active` 속성과 아래 28개 WMI method가 선언되어 있습니다.

이후 문서에서 별도로 설명하지 않는 method의 동작은 알려져 있지 않습니다.

AWCCWmiMethodFunction method
IDMethod설명
13Return_OverclockingReportoverclocking 보고서 반환
14Set_OCUIBIOSControlOCUIBIOS 제어 설정
15Clear_OCFailSafeFlagOC fail-safe flag 지우기
19GetFanSensorsfan sensor 조회
20Thermal_Informationthermal 정보 조회
21Thermal_Controlthermal 제어
23MemoryOCControlmemory overclocking 제어
26SystemInformationsystem 정보 조회
28PowerInformationpower 정보 조회
32FWUpdateGPIOtogglefirmware update GPIO 전환
33ReadTotalofGPIOs전체 GPIO 수 조회
34ReadGPIOpPinStatusGPIO pin 상태 조회
35ReadChassisColorchassis 색상 조회
36ReadPlatformPropertiesplatform 속성 조회
37GameShiftStatusGame Shift 상태 제어·조회
128CalderaSWInstallationCaldera software 설치 알림
129CalderaSWReleasedCaldera software 해제 알림
130CalderaConnectionStatusCaldera 연결 상태
131SurpriseUnpluggedFlagStatus예기치 않은 분리 flag 상태
132ClearSurpriseUnpluggedFlag예기치 않은 분리 flag 지우기
133CancelUndockRequestundock 요청 취소
135DevicesInCalderaCaldera 내부 장치 조회
136NotifyBIOSForSWReadyToDisconnectCalderaCaldera 분리 준비 완료를 BIOS에 알림
160TobiiSWinstallationTobii software 설치 알림
161TobiiSWReleasedTobii software 해제 알림
162TobiiCameraPowerResetTobii camera 전원 reset
163TobiiCameraPowerOnTobii camera 전원 켜기
164TobiiCameraPowerOffTobii camera 전원 끄기

bmof에 선언된 WmiMethodId와 method의 알려진 목적입니다.

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("WMI Function"), guid("{A70591CE-A997-11DA-B012-B622A1EF5492}")]
 class AWCCWmiMethodFunction {
   [key, read] string InstanceName;
   [read] boolean Active;

   [WmiMethodId(13), Implemented, read, write, Description("Return Overclocking Report.")] void Return_OverclockingReport([out] uint32 argr);
   [WmiMethodId(14), Implemented, read, write, Description("Set OCUIBIOS Control.")] void Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(15), Implemented, read, write, Description("Clear OC FailSafe Flag.")] void Clear_OCFailSafeFlag([out] uint32 argr);
   [WmiMethodId(19), Implemented, read, write, Description("Get Fan Sensors.")] void GetFanSensors([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(20), Implemented, read, write, Description("Thermal Information.")] void Thermal_Information([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(21), Implemented, read, write, Description("Thermal Control.")] void Thermal_Control([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(23), Implemented, read, write, Description("MemoryOCControl.")] void MemoryOCControl([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(26), Implemented, read, write, Description("System Information.")] void SystemInformation([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(28), Implemented, read, write, Description("Power Information.")] void PowerInformation([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(32), Implemented, read, write, Description("FW Update GPIO toggle.")] void FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(33), Implemented, read, write, Description("Read Total of GPIOs.")] void ReadTotalofGPIOs([out] uint32 argr);
   [WmiMethodId(34), Implemented, read, write, Description("Read GPIO pin Status.")] void ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(35), Implemented, read, write, Description("Read Chassis Color.")] void ReadChassisColor([out] uint32 argr);
   [WmiMethodId(36), Implemented, read, write, Description("Read Platform Properties.")] void ReadPlatformProperties([out] uint32 argr);
   [WmiMethodId(37), Implemented, read, write, Description("Game Shift Status.")] void GameShiftStatus([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(128), Implemented, read, write, Description("Caldera SW installation.")] void CalderaSWInstallation([out] uint32 argr);
   [WmiMethodId(129), Implemented, read, write, Description("Caldera SW is released.")] void CalderaSWReleased([out] uint32 argr);
   [WmiMethodId(130), Implemented, read, write, Description("Caldera Connection Status.")] void CalderaConnectionStatus([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(131), Implemented, read, write, Description("Surprise Unplugged Flag Status.")] void SurpriseUnpluggedFlagStatus([out] uint32 argr);
   [WmiMethodId(132), Implemented, read, write, Description("Clear Surprise Unplugged Flag.")] void ClearSurpriseUnpluggedFlag([out] uint32 argr);
   [WmiMethodId(133), Implemented, read, write, Description("Cancel Undock Request.")] void CancelUndockRequest([out] uint32 argr);
   [WmiMethodId(135), Implemented, read, write, Description("Devices in Caldera.")] void DevicesInCaldera([in] uint32 arg2, [out] uint32 argr);
   [WmiMethodId(136), Implemented, read, write, Description("Notify BIOS for SW ready to disconnect Caldera.")] void NotifyBIOSForSWReadyToDisconnectCaldera([out] uint32 argr);
   [WmiMethodId(160), Implemented, read, write, Description("Tobii SW installation.")] void TobiiSWinstallation([out] uint32 argr);
   [WmiMethodId(161), Implemented, read, write, Description("Tobii SW Released.")] void TobiiSWReleased([out] uint32 argr);
   [WmiMethodId(162), Implemented, read, write, Description("Tobii Camera Power Reset.")] void TobiiCameraPowerReset([out] uint32 argr);
   [WmiMethodId(163), Implemented, read, write, Description("Tobii Camera Power On.")] void TobiiCameraPowerOn([out] uint32 argr);
   [WmiMethodId(164), Implemented, read, write, Description("Tobii Camera Power Off.")] void TobiiCameraPowerOff([out] uint32 argr);
 };

Methods not described in the following document have unknown behavior.

uint32 argument 구조

74-83

모든 입력 인수는 `uint32`이며 method 사이의 구조가 매우 비슷합니다. 일반적으로 첫 번째 byte는 method가 수행할 `operation`, 이어지는 byte들은 그 operation에 전달하는 인수입니다.

예를 들어 operation code가 `0x01`이고 ID `0xA0`이 필요하면 method에 전달할 값은 `0xA001`입니다. 즉 낮은 byte에 operation, 그 다음 byte에 ID가 배치됩니다.

Argument Structure
------------------

All input arguments have type **uint32** and their structure is very similar
between methods. Usually, the first byte corresponds to a specific *operation*
the method performs, and the subsequent bytes correspond to *arguments* passed
to this *operation*. For example, if an operation has code 0x01 and requires an
ID 0xA0, the argument you would pass to the method is 0xA001.

GetFanSensors

84-99

`GetFanSensors`의 operation `0x01`은 지정한 fan ID와 관련된 temperature sensor 수를 조회하고, `0x02`는 fan sensor ID와 index를 이용해 관련 temperature sensor ID를 조회합니다.

GetFanSensors operation
Operation설명인수
0x01fan ID와 연결된 temperature sensor 수 조회Byte 1: Fan ID
0x02fan sensor와 연결된 temperature sensor ID 조회Byte 1: Fan ID; Byte 2: Index

fan과 temperature sensor의 연결 관계를 탐색하는 연산입니다.

Thermal Methods
===============

WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr)
-------------------------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| 0x01               | Get the number of temperature      | - Byte 1: Fan ID   |
|                    | sensors related with a fan ID      |                    |
+--------------------+------------------------------------+--------------------+
| 0x02               | Get the temperature sensor IDs     | - Byte 1: Fan ID   |
|                    | related to a fan sensor ID         | - Byte 2: Index    |
+--------------------+------------------------------------+--------------------+

Thermal_Information

100-154

`Thermal_Information`은 system resource 구성, sensor 값, fan 속도와 thermal profile을 조회합니다. `0x02`의 반환값은 byte 0부터 fan 수, temperature sensor 수, 알려지지 않은 값, thermal profile 수의 순서입니다.

`0x03`은 index에 해당하는 ID 또는 resource를 반환합니다. 순서는 fan ID, temperature ID, 알려지지 않은 ID, thermal profile ID이며, `0x02`의 개수 정보를 이용해 각 index 구간을 해석합니다.

`0x06`의 fan 속도 백분율은 모든 모델에 구현되어 있지 않습니다. `0x01`과 `0x07`의 의미는 아직 알려지지 않았습니다.

Thermal_Information operation
Operation설명인수
0x01알려지지 않음없음
0x02fan·sensor·unknown·profile 수로 구성된 system description 조회없음
0x03지정 index의 ID 또는 resource 나열Byte 1: Index
0x04temperature sensor의 현재 온도 조회Byte 1: Sensor ID
0x05fan의 현재 RPM 조회Byte 1: Fan ID
0x06fan 속도 백분율 조회; 일부 모델은 미구현Byte 1: Fan ID
0x07알려지지 않음알려지지 않음
0x08fan의 최소 RPM 조회Byte 1: Fan ID
0x09fan의 최대 RPM 조회Byte 1: Fan ID
0x0Abalanced thermal profile ID 조회없음
0x0B현재 thermal profile ID 조회없음
0x0Cfan의 현재 boost 값 조회Byte 1: Fan ID

알려진 조회 operation과 인수입니다.

WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr)
-------------------------------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| 0x01               | Unknown.                           | - None             |
+--------------------+------------------------------------+--------------------+
| 0x02               | Get system description number with | - None             |
|                    | the following structure:           |                    |
|                    |                                    |                    |
|                    | - Byte 0: Number of fans           |                    |
|                    | - Byte 1: Number of temperature    |                    |
|                    |   sensors                          |                    |
|                    | - Byte 2: Unknown                  |                    |
|                    | - Byte 3: Number of thermal        |                    |
|                    |   profiles                         |                    |
+--------------------+------------------------------------+--------------------+
| 0x03               | List an ID or resource at a given  | - Byte 1: Index    |
|                    | index. Fan IDs, temperature IDs,   |                    |
|                    | unknown IDs and thermal profile    |                    |
|                    | IDs are listed in that exact       |                    |
|                    | order.                             |                    |
|                    |                                    |                    |
|                    | Operation 0x02 is used to know     |                    |
|                    | which indexes map to which         |                    |
|                    | resources.                         |                    |
|                    |                                    |                    |
|                    | **Returns:** ID at a given index   |                    |
+--------------------+------------------------------------+--------------------+
| 0x04               | Get the current temperature for a  | - Byte 1: Sensor   |
|                    | given temperature sensor.          |   ID               |
+--------------------+------------------------------------+--------------------+
| 0x05               | Get the current RPM for a given    | - Byte 1: Fan ID   |
|                    | fan.                               |                    |
+--------------------+------------------------------------+--------------------+
| 0x06               | Get fan speed percentage. (not     | - Byte 1: Fan ID   |
|                    | implemented in every model)        |                    |
+--------------------+------------------------------------+--------------------+
| 0x07               | Unknown.                           | - Unknown          |
+--------------------+------------------------------------+--------------------+
| 0x08               | Get minimum RPM for a given FAN    | - Byte 1: Fan ID   |
|                    | ID.                                |                    |
+--------------------+------------------------------------+--------------------+
| 0x09               | Get maximum RPM for a given FAN    | - Byte 1: Fan ID   |
|                    | ID.                                |                    |
+--------------------+------------------------------------+--------------------+
| 0x0A               | Get balanced thermal profile ID.   | - None             |
+--------------------+------------------------------------+--------------------+
| 0x0B               | Get current thermal profile ID.    | - None             |
+--------------------+------------------------------------+--------------------+
| 0x0C               | Get current `boost` value for a    | - Byte 1: Fan ID   |
|                    | given fan ID.                      |                    |
+--------------------+------------------------------------+--------------------+

Thermal_Control

155-167

`Thermal_Control`의 `0x01`은 thermal profile ID로 지정한 profile을 활성화합니다. `0x02`는 fan ID와 boost 값을 받아 해당 fan의 boost를 설정합니다.

Thermal_Control operation
Operation설명인수
0x01thermal profile 활성화Byte 1: Thermal profile ID
0x02fan boost 설정Byte 1: Fan ID; Byte 2: Boost

profile과 fan boost를 변경하는 연산입니다.

WMI method Thermal_Control([in] uint32 arg2, [out] uint32 argr)
---------------------------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| 0x01               | Activate a given thermal profile.  | - Byte 1: Thermal  |
|                    |                                    |   profile ID       |
+--------------------+------------------------------------+--------------------+
| 0x02               | Set a `boost` value for a given    | - Byte 1: Fan ID   |
|                    | fan ID.                            | - Byte 2: Boost    |
+--------------------+------------------------------------+--------------------+

thermal profile code

168-203

알려진 profile은 Special, Legacy, USTT(User Selectable Thermal Tables)로 나뉩니다. USTT와 Legacy 지원은 상호 배타적이어서 한 계열을 지원하는 모델은 다른 계열을 지원하지 않습니다.

모든 모델은 `CUSTOM(0x00)`을 지원합니다. Dell G-Series laptop에서는 `GMODE(0xAB)`가 `PERFORMANCE`를 대신합니다.

알려진 thermal profile
ProfileTypeID
CustomSpecial0x00
G-ModeSpecial0xAB
QuietLegacy0x96
BalancedLegacy0x97
Balanced PerformanceLegacy0x98
PerformanceLegacy0x99
BalancedUSTT0xA0
Balanced PerformanceUSTT0xA1
CoolUSTT0xA2
QuietUSTT0xA3
PerformanceUSTT0xA4
Low PowerUSTT0xA5

profile 이름, 구현 계열, firmware ID입니다.

These are the known thermal profile codes:

+------------------------------+----------+------+
| Thermal Profile              | Type     | ID   |
+==============================+==========+======+
| Custom                       | Special  | 0x00 |
+------------------------------+----------+------+
| G-Mode                       | Special  | 0xAB |
+------------------------------+----------+------+
| Quiet                        | Legacy   | 0x96 |
+------------------------------+----------+------+
| Balanced                     | Legacy   | 0x97 |
+------------------------------+----------+------+
| Balanced Performance         | Legacy   | 0x98 |
+------------------------------+----------+------+
| Performance                  | Legacy   | 0x99 |
+------------------------------+----------+------+
| Balanced                     | USTT     | 0xA0 |
+------------------------------+----------+------+
| Balanced Performance         | USTT     | 0xA1 |
+------------------------------+----------+------+
| Cool                         | USTT     | 0xA2 |
+------------------------------+----------+------+
| Quiet                        | USTT     | 0xA3 |
+------------------------------+----------+------+
| Performance                  | USTT     | 0xA4 |
+------------------------------+----------+------+
| Low Power                    | USTT     | 0xA5 |
+------------------------------+----------+------+

If a model supports the User Selectable Thermal Tables (USTT) profiles, it will
not support the Legacy profiles and vice-versa.

Every model supports the CUSTOM (0x00) thermal profile. GMODE replaces
PERFORMANCE in G-Series laptops.

GameShiftStatus

204-223

`GameShiftStatus`의 `0x01`은 Game Shift를 전환하고 `0x02`는 현재 상태를 조회합니다.

Game Shift는 fan speed profile을 바꾸지 않습니다. CPU 또는 GPU power profile의 일종일 가능성이 있으나 benchmark가 수행되지 않아 확정할 수 없습니다.

이 method는 Dell G-Series laptop에만 있으며, 구현이 존재한다는 사실은 `Thermal_Information`의 `0x03` 목록에 없더라도 GMODE thermal profile을 사용할 수 있음을 시사합니다. G-Series의 G-key도 Game Shift 상태를 바꾸므로 둘은 직접 관련되어 있습니다.

GameShiftStatus operation
Operation설명인수
0x01Game Shift 전환없음
0x02Game Shift 상태 조회없음

Game Shift 제어와 상태 조회 연산입니다.

WMI method GameShiftStatus([in] uint32 arg2, [out] uint32 argr)
---------------------------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| 0x01               | Toggle *Game Shift*.               | - None             |
+--------------------+------------------------------------+--------------------+
| 0x02               | Get *Game Shift* status.           | - None             |
+--------------------+------------------------------------+--------------------+

Game Shift Status does not change the fan speed profile but it could be some
sort of CPU/GPU power profile. Benchmarks have not been done.

This method is only present on Dell's G-Series laptops and it's implementation
implies GMODE thermal profile is available, even if operation 0x03 of
Thermal_Information does not list it.

G-key on Dell's G-Series laptops also changes Game Shift status, so both are
directly related.

MemoryOCControl

224-233

AWCC는 memory overclocking을 지원하지만 `MemoryOCControl` method는 매우 복잡하며 아직 해석되지 않았습니다.


Overclocking Methods
====================

WMI method MemoryOCControl([in] uint32 arg2, [out] uint32 argr)
---------------------------------------------------------------

AWCC supports memory overclocking, but this method is very intricate and has
not been deciphered yet.

STM32 RGB controller와 GPIO

234-265

AWCC interface가 있는 Alienware와 Dell G-Series 장치에는 보통 USB/HID 기능을 갖춘 STM32 RGB lighting controller가 내장됩니다. vendor ID는 `187c`이고 product ID는 모델마다 다를 수 있습니다.

debugging을 위해 이 MCU의 GPIO pin 두 개가 WMI method로 노출됩니다. pin 0은 Device Firmware Update(DFU) mode pin으로 HIGH이면 다음 MCU 부팅 때 DFU mode를 활성화하고 LOW이면 비활성화합니다. pin 1은 active-low reset(NRST) pin으로 HIGH이면 MCU가 켜지고 LOW이면 꺼집니다.

일부 GPIO 제어 method는 일반적인 인수 구조를 따르지 않고 첫 번째 byte에 operation 대신 pin 번호를 받습니다.

STM32 GPIO pin
Pin기능HIGHLOW
0DFU mode다음 부팅 때 DFU 활성화다음 부팅 때 DFU 비활성화
1Negative Reset (NRST)MCU ONMCU OFF

RGB controller에서 WMI로 노출된 두 pin의 의미입니다.

GPIO control Methods
====================

Alienware and Dell G Series devices with the AWCC interface usually have an
embedded STM32 RGB lighting controller with USB/HID capabilities. It's vendor ID
is ``187c`` while it's product ID may vary from model to model.

The control of two GPIO pins of this MCU is exposed as WMI methods for debugging
purposes.

+--------------+--------------------------------------------------------------+
| Pin          | Description                                                  |
+==============+===============================+==============================+
| 0            | Device Firmware Update (DFU)  | **HIGH**: Enables DFU mode   |
|              | mode pin.                     | on next MCU boot.            |
|              |                               +------------------------------+
|              |                               | **LOW**: Disables DFU mode   |
|              |                               | on next MCU boot.            |
+--------------+-------------------------------+------------------------------+
| 1            | Negative Reset (NRST) pin.    | **HIGH**: MCU is ON.         |
|              |                               |                              |
|              |                               +------------------------------+
|              |                               | **LOW**: MCU is OFF.         |
|              |                               |                              |
+--------------+-------------------------------+------------------------------+

See :ref:`acknowledgements` for more information on this MCU.

.. note::
   Some GPIO control methods break the usual argument structure and take a
   **Pin number** instead of an operation on the first byte.

FWUpdateGPIOtoggle

266-275

`FWUpdateGPIOtoggle`은 첫 번째 byte의 pin 번호와 Byte 1의 pin 상태를 받아 해당 GPIO 상태를 설정합니다.

FWUpdateGPIOtoggle 인수
Byte 0Byte 1동작
Pin numberPin status지정 pin 상태 설정

일반 operation code 대신 pin 번호를 사용하는 예외적 형식입니다.

WMI method FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr)
------------------------------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| Pin number         | Set the pin status                 | - Byte 1: Pin      |
|                    |                                    |   status           |
+--------------------+------------------------------------+--------------------+

ReadTotalofGPIOs

276-288

`ReadTotalofGPIOs`는 GPIO의 전체 개수를 반환하며 별도의 operation은 없습니다. 다만 firmware 수준의 WMI method 구현 방식 때문에 호출할 때 dummy `uint32` 입력 인수가 필요합니다.

ReadTotalofGPIOs
Operation입력반환
N/Adummy uint32전체 GPIO 수

호출 형식과 반환 내용입니다.

WMI method ReadTotalofGPIOs([out] uint32 argr)
----------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| N/A                | Get the total number of GPIOs      | - None             |
+--------------------+------------------------------------+--------------------+

.. note::
   Due to how WMI methods are implemented on the firmware level, this method
   requires a dummy uint32 input argument when invoked.

ReadGPIOpPinStatus

289-301

`ReadGPIOpPinStatus`는 첫 번째 byte에 pin 번호를 받아 상태를 조회합니다. 일부 laptop firmware에는 pin 상태를 읽는 동시에 그 상태를 뒤집는 알려진 bug가 있습니다.

ReadGPIOpPinStatus
Byte 0추가 인수동작
Pin number없음pin 상태 조회; 일부 firmware는 상태도 반전

pin 읽기 operation과 주의 사항입니다.

WMI method ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr)
------------------------------------------------------------------

+--------------------+------------------------------------+--------------------+
| Operation (Byte 0) | Description                        | Arguments          |
+====================+====================================+====================+
| Pin number         | Get the pin status                 | - None             |
+--------------------+------------------------------------+--------------------+

.. note::
   There known firmware bug in some laptops where reading the status of a pin
   also flips it.

ReadChassisColor

302-309

`ReadChassisColor`는 chassis 색상의 내부 ID를 반환합니다.

Other information Methods
=========================

WMI method ReadChassisColor([out] uint32 argr)
----------------------------------------------

Returns the chassis color internal ID.

감사의 말

310-322

AlexIII, T-Troll, Gabriel Marcano가 장치 기능의 일부를 문서화하고 시험해 이 드라이버를 일반화할 수 있게 한 공헌에 감사를 표합니다. 각 프로젝트와 분석 글의 link는 원문에 보존되어 있습니다.

.. _acknowledgements:

Acknowledgements
================

Kudos to

* `AlexIII <https://github.com/AlexIII/tcc-g15>`_
* `T-Troll <https://github.com/T-Troll/alienfx-tools/>`_
* `Gabriel Marcano <https://gabriel.marcanobrady.family/blog/2024/12/16/dell-g5-5505-se-acpi-or-figuring-out-how-to-reset-the-rgb-controller/>`_

for documenting and testing some of this device's functionality, making it
possible to generalize this driver.