From patchwork Fri Feb 14 22:13:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13975688 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3946B1FBEAF; Fri, 14 Feb 2025 22:13:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739571219; cv=none; b=t2KAg1ikTB1EgaQTjoGw0kjXOxtxOUB2Gv+jbQz2TpM9kwasmDKgLsM0o8DexA8aqlMe/TtNVXwP+ElE+oqbvVwgDY8bdfEf3OfSP8x3suDXGtJ4+dcrPDVTTSxwdfX38RUH78FBo+VVPUC/W0iw0mXsMZJzCAgz/pJp34Dh57g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739571219; c=relaxed/simple; bh=CnT4mfg1yO3umJ6k1peml/rMTgotc0aA9KDODzIxBJQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uK43C5/xfpNGebBgwHp7YPo+vSXwrBH3wTlfF6rif1aiZ4Pi2w3E4GRFxwB9yFWwVALq1T0fVvJZVnrpa+xYBlBrDzAobcotnZlJDCEF/HTpMELbmyBBHyisWz/wpG4mYVohiF9I1+wYd/UiqoLxcRLFhGvautRfKAJwz2Oq5Ck= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=a4Dzh5UZ; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="a4Dzh5UZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1739571212; x=1740176012; i=w_armin@gmx.de; bh=6zqT8VKyc97Y8Lc+lE4Qm/S1/XWuJaIAJl7c2jgNYlw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=a4Dzh5UZ9thfeE5viEVeE8QqajE9H7f+dNW2LVxu9RBnVuHrDTHK4W8MTyVc1XDv rA7+5RMUd98fnTN/TijXRndcWhDR1Zy978RiSZu7jlQAxQ/9Bo4PTSC3QA1ySofRA V8of7/Hdfv+ib9E6Wm1RoWyVVzixiGckbbWhe0t4LPpfrYCHxwmJk/aKhJdAujiLx aUjJRQJyP7DLx3AL16xZ9s5rHB8n/h2ZDfCNdG3H6C+q9M4KVxHY+0FjcXhf0r9Ln NV4HUyajGlcvtyOBc1r1ytWrmXXgESi06UQeZjC21xw9pGZvLAL3AfDOmrBre6fcT 2zjS8LZrkF0rl9lheA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MtwUw-1tNyHX46zE-00xqy3; Fri, 14 Feb 2025 23:13:32 +0100 From: Armin Wolf To: jlee@suse.com, basak.sb2006@gmail.com, rayanmargham4@gmail.com Cc: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 1/3] platform/x86: acer-wmi: Fix setting of fan behavior Date: Fri, 14 Feb 2025 23:13:20 +0100 Message-Id: <20250214221322.47298-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250214221322.47298-1-W_Armin@gmx.de> References: <20250214221322.47298-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:pHXyTx4ScP30V6BKf1dDzLsvrL01B6kLICCR7B+xGyP680qto9v untNdkHPmHLfWJ5QPi9Pj6Vlm2uMNF7k0c9EJPJU3pljLxxtwPFvDMinK0mVTl4ZEKDLP1I YjUuf+nZp7jwexWhdhbVorqYxfUiUARuOgqWGCDmnmX/RQib2aL+oMpe0uQeEdNMGGXI1eE 7qMXsveKffDNb53hAKskw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:4Yblas6MYDY=;K5tryEpg9b4QxWGJtdduyrP0IET Cdh1kn4ERUd9ishEf9a4JWNrEg67vubTXxK/Vy/5QfUigwccp8EmLXWnKkHJ2eT9WA/HNaLFh 8SrrtTL7SKDRv+HJoVC1EV5zTaqTA1moJqX2Uh2b0xVcJYGRGH2QQS/DtQ5mofFhVr2mwsjW3 EdpVUAnluTFQI3kBvDtuptb/qB1NtLYjnD8SpWgOyaVGxigDcK7IvENJ1OVA/VnO7viMJBeYw 5gf09LN8kox8wREXi+X2QafoaAONngKB8i1Dla3/5NZJUMfv6r/w2hqqB6eRsAivHXyDGupcG GE07zdQozCWY5wTYzx1MxG4fsh8Wy1FdvppANlz52SC1WVP63yFf5ZlBQ7/rJeM6fQwsapNhh j1w0xQ8vvDxWzzdUsxoqfx+QkmuHecyAXUM0BMorjyodhavnb4320Nzrf6Pp1Rc/NADNHQNTg HK54KwdvG+lgzQcsmXnAQT3Yt9TwFMHvDTbH7g9A6uLl3hClnWnQtnvIFXCinfn+za1BiH1EV 17Wagr5UJELbBIHBfjjqL6ygycmJluzvVzNgdw2yn+yA02M0uXZQ9tsmKkvnOI127Br+8RHls heJiuWeCQbU9uYU5d9Ts9gVVkno3J1gv04NZxHyvIx0YulEIh7MuZ9AXF3YS4hy3+NPguWlnV Bkk+lzWcgg16C1YCgwKcQPp8qv/fEqkZhbBtPkVr1hFgxuEyCgPAxpm9uaPXv4sfkU6nIKqSz EygaVeblp2XvuQmEQBSduZL+Vj9LEgZzAvbkUA4ckxfPjka93iQkUTxvc2dzg8dHFMmJSPKJ4 lcgMgtUH0sTxVa3N1OxZanpQ6JEcl/k22B7nUaKJ2Ipy4t/rSZZmSKoefFxEaQoqrk3jO7eGA hu/k5RFAD0TtmvbZleINKyZkrRgykifgg3y1FQRKAwt9oyAZ6HB4WCooTU51elrFT7MJ0JNRd TX9IFgNpt0A/MJzPMSagDIyjqdt6w6UX6qliyyS+NdYKEBeFIIh+5MJQVrddJeh8QVKfDspPt xh+4ESGmEyZXlyxc4u1FdKczMd74eOfb2etiSUPsaxZTXCrt/vEEANWvPIN7x+wS70+ObODrM 3053D0CNsb68aa5/P9C53qjDcDU5LYwZlkSun0GJb/PDa9uRQw7LIz+Zwjun3Mry/VKtRKmNi 5KiIezc2Kd8mBgvSiaRgqgXFuytDX0PNAJCa0Nm+7pcK5m2zvEIEFYJtmtlZGjg25gLtWekT5 2Tjrj2SUbi5BnDzYz3n0DDHDPC7uB7ixR6JZrp7N39t634Rud1ja+1X9Nf0kKvkuetvkmv+Lh 0YOBaG6Nucuwk6G2ZFQq8vG5mJDOnqdjM8Vlrhw0+2H6/i2+5Kn8Z1AVUtFTNAummGuYYzdqr VOBLbhUAgfmAbl3oakJMzXdL2kAfv81jwwbVeZuF7Vi2W/BTdsQd09jEzXIzxMdzRpuvn/rL2 XAsfSdNFCGf/TDExDClWXtUZgS8XXlTjmvpG6zIvxEUvDXg9e After studying the linuwu_sense driver (https://github.com/0x7375646F/Linuwu-Sense) i was able to understand the meaning of the SetGamingFanBehavior() WMI method: - the first 16-bit are a bitmap of all fans affected by a fan behavior change request. - the next 8 bits contain four fan mode fields (2-bit), each being associated with a bit inside the fan bitmap. There are three fan modes: auto, turbo and custom. Use this newfound knowledge to fix the turbo fan handling by setting the correct bits before calling SetGamingFanBehavior(). Also check the result of the WMI method call and return an error should the ACPI firmware signal failure. Signed-off-by: Armin Wolf --- drivers/platform/x86/acer-wmi.c | 75 +++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 23 deletions(-) -- 2.39.5 diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 69336bd778ee..f20a882e3650 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -68,10 +68,19 @@ MODULE_LICENSE("GPL"); #define ACER_WMID_SET_GAMING_LED_METHODID 2 #define ACER_WMID_GET_GAMING_LED_METHODID 4 #define ACER_WMID_GET_GAMING_SYS_INFO_METHODID 5 -#define ACER_WMID_SET_GAMING_FAN_BEHAVIOR 14 +#define ACER_WMID_SET_GAMING_FAN_BEHAVIOR_METHODID 14 #define ACER_WMID_SET_GAMING_MISC_SETTING_METHODID 22 #define ACER_WMID_GET_GAMING_MISC_SETTING_METHODID 23 +#define ACER_GAMING_FAN_BEHAVIOR_ID_MASK GENMASK_ULL(15, 0) +#define ACER_GAMING_FAN_BEHAVIOR_SET_MODE_MASK GENMASK_ULL(23, 16) + +#define ACER_GAMING_FAN_BEHAVIOR_CPU BIT(0) +#define ACER_GAMING_FAN_BEHAVIOR_GPU BIT(3) + +#define ACER_GAMING_FAN_BEHAVIOR_CPU_MODE_MASK GENMASK(1, 0) +#define ACER_GAMING_FAN_BEHAVIOR_GPU_MODE_MASK GENMASK(7, 6) + #define ACER_GAMING_MISC_SETTING_STATUS_MASK GENMASK_ULL(7, 0) #define ACER_GAMING_MISC_SETTING_INDEX_MASK GENMASK_ULL(7, 0) #define ACER_GAMING_MISC_SETTING_VALUE_MASK GENMASK_ULL(15, 8) @@ -121,6 +130,12 @@ enum acer_wmi_predator_v4_sensor_id { ACER_WMID_SENSOR_GPU_TEMPERATURE = 0x0A, }; +enum acer_wmi_gaming_fan_mode { + ACER_WMID_FAN_MODE_AUTO = 0x01, + ACER_WMID_FAN_MODE_TURBO = 0x02, + ACER_WMID_FAN_MODE_CUSTOM = 0x03, +}; + enum acer_wmi_predator_v4_oc { ACER_WMID_OC_NORMAL = 0x0000, ACER_WMID_OC_TURBO = 0x0002, @@ -1565,9 +1580,6 @@ static acpi_status WMID_gaming_set_u64(u64 value, u32 cap) case ACER_CAP_TURBO_LED: method_id = ACER_WMID_SET_GAMING_LED_METHODID; break; - case ACER_CAP_TURBO_FAN: - method_id = ACER_WMID_SET_GAMING_FAN_BEHAVIOR; - break; default: return AE_BAD_PARAMETER; } @@ -1618,25 +1630,42 @@ static int WMID_gaming_get_sys_info(u32 command, u64 *out) return 0; } +static int WMID_gaming_set_fan_behavior(u16 fan_bitmap, u8 mode_bitmap) +{ + acpi_status status; + u64 input = 0; + u64 result; + + input |= FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_ID_MASK, fan_bitmap); + input |= FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_SET_MODE_MASK, mode_bitmap); + + status = WMI_gaming_execute_u64(ACER_WMID_SET_GAMING_FAN_BEHAVIOR_METHODID, input, + &result); + if (ACPI_FAILURE(status)) + return -EIO; + + /* TODO: Proper error handling */ + pr_notice("Fan behavior return status: %llu\n", result); + + return 0; +} + static void WMID_gaming_set_fan_mode(u8 fan_mode) { - /* fan_mode = 1 is used for auto, fan_mode = 2 used for turbo*/ - u64 gpu_fan_config1 = 0, gpu_fan_config2 = 0; - int i; - - if (quirks->cpu_fans > 0) - gpu_fan_config2 |= 1; - for (i = 0; i < (quirks->cpu_fans + quirks->gpu_fans); ++i) - gpu_fan_config2 |= 1 << (i + 1); - for (i = 0; i < quirks->gpu_fans; ++i) - gpu_fan_config2 |= 1 << (i + 3); - if (quirks->cpu_fans > 0) - gpu_fan_config1 |= fan_mode; - for (i = 0; i < (quirks->cpu_fans + quirks->gpu_fans); ++i) - gpu_fan_config1 |= fan_mode << (2 * i + 2); - for (i = 0; i < quirks->gpu_fans; ++i) - gpu_fan_config1 |= fan_mode << (2 * i + 6); - WMID_gaming_set_u64(gpu_fan_config2 | gpu_fan_config1 << 16, ACER_CAP_TURBO_FAN); + u16 mode_bitmap = 0; + u16 fan_bitmap = 0; + + if (quirks->cpu_fans > 0) { + fan_bitmap |= ACER_GAMING_FAN_BEHAVIOR_CPU; + mode_bitmap |= FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_CPU_MODE_MASK, fan_mode); + } + + if (quirks->gpu_fans > 0) { + fan_bitmap |= ACER_GAMING_FAN_BEHAVIOR_GPU; + mode_bitmap |= FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_GPU_MODE_MASK, fan_mode); + } + + WMID_gaming_set_fan_behavior(fan_bitmap, mode_bitmap); } static int WMID_gaming_set_misc_setting(enum acer_wmi_gaming_misc_setting setting, u8 value) @@ -1923,7 +1952,7 @@ static int acer_toggle_turbo(void) WMID_gaming_set_u64(0x1, ACER_CAP_TURBO_LED); /* Set FAN mode to auto */ - WMID_gaming_set_fan_mode(0x1); + WMID_gaming_set_fan_mode(ACER_WMID_FAN_MODE_AUTO); /* Set OC to normal */ if (has_cap(ACER_CAP_TURBO_OC)) { @@ -1937,7 +1966,7 @@ static int acer_toggle_turbo(void) WMID_gaming_set_u64(0x10001, ACER_CAP_TURBO_LED); /* Set FAN mode to turbo */ - WMID_gaming_set_fan_mode(0x2); + WMID_gaming_set_fan_mode(ACER_WMID_FAN_MODE_TURBO); /* Set OC to turbo mode */ if (has_cap(ACER_CAP_TURBO_OC)) { From patchwork Fri Feb 14 22:13:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13975687 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED3591DAC95; Fri, 14 Feb 2025 22:13:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739571218; cv=none; b=AXNsU4jS2HiqNHklgpqYeVo/MaZBUxLxaZdWn+E2KkA0VjX7FaV64bb80gKUs5zflfm4fm11lI7i5uOE64tn7Tr21O8iNqcO9JQ7HtURCgPAqWKtTukdc0LYdlrZ9GLyq1xMcaWLiIYWMGFtrwTziWmGFAiQydZsYwK77ViowVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739571218; c=relaxed/simple; bh=WV4joV9iIg7zYXBQxWjjLedPiBapTAJv1mf0/5ZpyBk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sd6krVzfv3PTaoQmsZe28ph7XAxW68M4GbXQuS7b73koNvjahiTwOvf5LXiFcfu9LWngok55P9T7EsFIrzn1k8rRDwbu2yM+cjWTB/DvJEbnbBD3UTTPNZ81LFIL4N+JjKBv2Yx761gpY9nCbybzmJWC3EGtLlAElr6fHHpbizE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=jV9vxTmW; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="jV9vxTmW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1739571214; x=1740176014; i=w_armin@gmx.de; bh=BVcQ46ClAAgi3BH3jIONiYBhKas//7x1AXXEuG2Z4m8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=jV9vxTmWHwc+meZAnVYtVkEDvxEGYLjXw5tJrtQFKiWGOAgs7zZGGW0YzKGfOSWE ESJytMhoUzzlsBlG25ycY+Ce9im8JHHbh9rQLJvGry2w2SP5Az9i7zBh8EbhG6hvg ztgxfyT0+krGPeYva12PNchCaX0umI2bIJfvBoVnYhb98OeGn5hPcAxkQu4DKY36j +vklYG2xeg7bwTZpr8znhOkBZ2Y9pbehJ1G4NZm8N7IUt5T42bOfbx7qwkUU5DH6a ZfbynJ4va6uV9UlX2Bau+K7+AOVdFXK9BDxnkzG8KoJuecDCrLnyaGOw3yEotas8m I454nVxJdA1EpVZa8w== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MvbFs-1tPcB13svu-00yiVE; Fri, 14 Feb 2025 23:13:34 +0100 From: Armin Wolf To: jlee@suse.com, basak.sb2006@gmail.com, rayanmargham4@gmail.com Cc: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 2/3] platform/x86: acer-wmi: Add fan control support Date: Fri, 14 Feb 2025 23:13:21 +0100 Message-Id: <20250214221322.47298-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250214221322.47298-1-W_Armin@gmx.de> References: <20250214221322.47298-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:wnmS9XvtAerOZ8OLFOkdrmh3UySH97I7bI3GQ2TN0wJ3ZKq6ZGY 4+a1mW/21q+Cyp4K61RDbM3hU3E8HyuhbLpIdXc6CdHUhfOBsVJcGesAzZ4psC2S95q2bUZ BwD2HUU7Sz/V6vOuJaK5G3XfeKR/AzvI98VIEC320yz1ebQt1IdV8xQ5R/Ky8EbombGybmL fufbdFDUE1qsMT6d/LM3w== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:uLrtbSGEK5Q=;8GSs9ksD8NoUmE6KWD44cSrbDyd AcCtYAe6DqoB6rxpm+HGOTWt6YsT9EaS6/yyaFKiewI+94jaZ1gghBFVNpzi1FBHRjyJH1fmZ Wlz0lnXIjcfqD8Xf2IqxcrS1QO5ApwgoSM1t6FJuyOwH2TcUrzq93lAumtfxEYBuy+aOo3RcZ LwOJlm3vVu5lXKcTbm+ZjPz7OkrTAtNW8r405IcijVqUudu6uqtElDWzJ8l4YlPuPnycFvv6d dQyivreoBLm9k/djFHHkvwydDMiACK0VVQkHwJPQr5X6wmKdY+8Pz+KV0KCq9YjbH7TkdJ3C7 KfXTblKmeU+g10bZuyMJhGmuYOPKao5lCm2/vTTJTGCF5zrTni1YikeDLiNwxv2V+YKxGPEvJ N1yktX170Mg71HNLPA+FN61gy7gvTBKZKN/C9hk08SXJ1qqB6NuvJhT9Q+iEvlpB5UI/W9jQ9 AQNO3DwxBm5YL0tuYvDe2JXzZxGc/HcKnyDEQxmEbUBV4L9erb+x5oiLiRhZbcQjLHFoQhfQR /IjHdpCItxZqusaJjtVi7EapSj2Vz6ZdnxJP3BGft2QqFpGDHUpw+rIBAcN49eGvJyeIAxX1o v0ZCRG+GAJWgz2gliWjPIYuYInGqV2vSh0RqODVnG06KB+eFWwD+qSaATp/C13IP+60HgGzZW FyhjoNX24aDQjImNWKhT5cBM8ECPtP1hJMeInZxP+UlxfkYxxy8oyLm5GmQwRo/hLNXYklcXG P9ZubvK2Efo6NKeq0pwlYQRznDczEAu9MvJWdjiS8QRm22MA+bDLVQJYfiDwW+jqjFbX0jKBf B4JqDR6HnPN2f0oH+JkXRftufy8MeQInjrBA7xZklYTteTURl4EUCIqCooLXiKuT0iVn4IyNm UGPPGZwTLHMXkKwrvFAgurHHUNmSU6V8+iW2OJ8iDsi21H5/kbEYFrDKsJP4corjQmNLg78p2 Yn1Zhk3h7+mvmXvUucIBeTCb9urAo7n4LfZs0qzJgcrLucSmSXBWzTGRpYNx/gBrwdvFmFt6A Ci/h7e5QBkDD3vID3h4a5p9gNrchXXQLWKdLjJIDpCc8HaQ+mX6ncOT+MLRsY4jpjv0OAmys/ kzqXWSwbAg9qRVdsvVKPEhJnzcqBqVlSP52rWhDBvTAv7gu5grL9s8pypBcjsGGCbp47W3icb f/QvLWzPv0VbSb0sihUz4JBY2czP0cdx3ZlFJHdk7SVmoxzMLnJJH8KoNAmeOa5CChnM7IQA6 acS3aglDJAOpsS/9wzcXT3WtaRndMteBmsWV/9p6d2bXwzye+guJd6cGEjU3PVPJoU9H8zLpM /M9fvz9FK6XLSwI1Qf4h4p2W+Mty6mZRfGeVuoETqRmkjWKo5XLA5fArHNBnjcZxXoyYGQK8W 2zkULDnPYD2A2VIL+W7y01qa6fE+ybrCypWvpubIMZvMp5KNv2UgY273lQ Add support for controlling the fan speed using the SetGamingFanSpeed() and GetGamingFanSpeed() WMI methods. This feature is only enabled if the machine has ACER_CAP_PWM enabled and depend on ACER_CAP_HWMON for detecting the number of available fans. Signed-off-by: Armin Wolf Reviewed-by: Kurt Borja --- drivers/platform/x86/acer-wmi.c | 222 +++++++++++++++++++++++++++++++- 1 file changed, 220 insertions(+), 2 deletions(-) -- 2.39.5 diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index f20a882e3650..e24f5a323f95 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -12,10 +12,12 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include #include #include #include #include +#include #include #include #include @@ -30,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -69,11 +72,16 @@ MODULE_LICENSE("GPL"); #define ACER_WMID_GET_GAMING_LED_METHODID 4 #define ACER_WMID_GET_GAMING_SYS_INFO_METHODID 5 #define ACER_WMID_SET_GAMING_FAN_BEHAVIOR_METHODID 14 +#define ACER_WMID_GET_GAMING_FAN_BEHAVIOR_METHODID 15 +#define ACER_WMID_SET_GAMING_FAN_SPEED_METHODID 16 +#define ACER_WMID_GET_GAMING_FAN_SPEED_METHODID 17 #define ACER_WMID_SET_GAMING_MISC_SETTING_METHODID 22 #define ACER_WMID_GET_GAMING_MISC_SETTING_METHODID 23 +#define ACER_GAMING_FAN_BEHAVIOR_STATUS_MASK GENMASK_ULL(7, 0) #define ACER_GAMING_FAN_BEHAVIOR_ID_MASK GENMASK_ULL(15, 0) #define ACER_GAMING_FAN_BEHAVIOR_SET_MODE_MASK GENMASK_ULL(23, 16) +#define ACER_GAMING_FAN_BEHAVIOR_GET_MODE_MASK GENMASK_ULL(23, 8) #define ACER_GAMING_FAN_BEHAVIOR_CPU BIT(0) #define ACER_GAMING_FAN_BEHAVIOR_GPU BIT(3) @@ -81,6 +89,10 @@ MODULE_LICENSE("GPL"); #define ACER_GAMING_FAN_BEHAVIOR_CPU_MODE_MASK GENMASK(1, 0) #define ACER_GAMING_FAN_BEHAVIOR_GPU_MODE_MASK GENMASK(7, 6) +#define ACER_GAMING_FAN_SPEED_STATUS_MASK GENMASK_ULL(7, 0) +#define ACER_GAMING_FAN_SPEED_ID_MASK GENMASK_ULL(7, 0) +#define ACER_GAMING_FAN_SPEED_VALUE_MASK GENMASK_ULL(15, 8) + #define ACER_GAMING_MISC_SETTING_STATUS_MASK GENMASK_ULL(7, 0) #define ACER_GAMING_MISC_SETTING_INDEX_MASK GENMASK_ULL(7, 0) #define ACER_GAMING_MISC_SETTING_VALUE_MASK GENMASK_ULL(15, 8) @@ -130,6 +142,11 @@ enum acer_wmi_predator_v4_sensor_id { ACER_WMID_SENSOR_GPU_TEMPERATURE = 0x0A, }; +enum acer_wmi_gaming_fan_id { + ACER_WMID_CPU_FAN = 0x01, + ACER_WMID_GPU_FAN = 0x04, +}; + enum acer_wmi_gaming_fan_mode { ACER_WMID_FAN_MODE_AUTO = 0x01, ACER_WMID_FAN_MODE_TURBO = 0x02, @@ -292,6 +309,7 @@ struct hotkey_function_type_aa { #define ACER_CAP_TURBO_FAN BIT(9) #define ACER_CAP_PLATFORM_PROFILE BIT(10) #define ACER_CAP_HWMON BIT(11) +#define ACER_CAP_PWM BIT(12) /* * Interface type flags @@ -386,6 +404,7 @@ struct quirk_entry { u8 cpu_fans; u8 gpu_fans; u8 predator_v4; + u8 pwm; }; static struct quirk_entry *quirks; @@ -405,6 +424,9 @@ static void __init set_quirks(void) if (quirks->predator_v4) interface->capability |= ACER_CAP_PLATFORM_PROFILE | ACER_CAP_HWMON; + + if (quirks->pwm) + interface->capability |= ACER_CAP_PWM; } static int __init dmi_matched(const struct dmi_system_id *dmi) @@ -1650,6 +1672,27 @@ static int WMID_gaming_set_fan_behavior(u16 fan_bitmap, u8 mode_bitmap) return 0; } +static int WMID_gaming_get_fan_behavior(u16 fan_bitmap, u8 *mode_bitmap) +{ + acpi_status status; + u32 input = 0; + u64 result; + + input |= FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_ID_MASK, fan_bitmap); + status = WMI_gaming_execute_u32_u64(ACER_WMID_GET_GAMING_FAN_BEHAVIOR_METHODID, input, + &result); + if (ACPI_FAILURE(status)) + return -EIO; + + /* The return status must be zero for the operation to have succeeded */ + if (FIELD_GET(ACER_GAMING_FAN_BEHAVIOR_STATUS_MASK, result)) + return -EIO; + + *mode_bitmap = FIELD_GET(ACER_GAMING_FAN_BEHAVIOR_GET_MODE_MASK, result); + + return 0; +} + static void WMID_gaming_set_fan_mode(u8 fan_mode) { u16 mode_bitmap = 0; @@ -1668,6 +1711,55 @@ static void WMID_gaming_set_fan_mode(u8 fan_mode) WMID_gaming_set_fan_behavior(fan_bitmap, mode_bitmap); } +static int WMID_gaming_set_gaming_fan_speed(u8 fan, u8 speed) +{ + acpi_status status; + u64 input = 0; + u64 result; + + if (speed > 100) + return -EINVAL; + + input |= FIELD_PREP(ACER_GAMING_FAN_SPEED_ID_MASK, fan); + input |= FIELD_PREP(ACER_GAMING_FAN_SPEED_VALUE_MASK, speed); + + status = WMI_gaming_execute_u64(ACER_WMID_SET_GAMING_FAN_SPEED_METHODID, input, &result); + if (ACPI_FAILURE(status)) + return -EIO; + + switch (FIELD_GET(ACER_GAMING_FAN_SPEED_STATUS_MASK, result)) { + case 0x00: + return 0; + case 0x01: + return -ENODEV; + case 0x02: + return -EINVAL; + default: + return -ENXIO; + } +} + +static int WMID_gaming_get_gaming_fan_speed(u8 fan, u8 *speed) +{ + acpi_status status; + u32 input = 0; + u64 result; + + input |= FIELD_PREP(ACER_GAMING_FAN_SPEED_ID_MASK, fan); + + status = WMI_gaming_execute_u32_u64(ACER_WMID_GET_GAMING_FAN_SPEED_METHODID, input, + &result); + if (ACPI_FAILURE(status)) + return -EIO; + + if (FIELD_GET(ACER_GAMING_FAN_SPEED_STATUS_MASK, result)) + return -ENODEV; + + *speed = FIELD_GET(ACER_GAMING_FAN_SPEED_VALUE_MASK, result); + + return 0; +} + static int WMID_gaming_set_misc_setting(enum acer_wmi_gaming_misc_setting setting, u8 value) { acpi_status status; @@ -2839,6 +2931,16 @@ static const enum acer_wmi_predator_v4_sensor_id acer_wmi_fan_channel_to_sensor_ [1] = ACER_WMID_SENSOR_GPU_FAN_SPEED, }; +static const enum acer_wmi_gaming_fan_id acer_wmi_fan_channel_to_fan_id[] = { + [0] = ACER_WMID_CPU_FAN, + [1] = ACER_WMID_GPU_FAN, +}; + +static const u16 acer_wmi_fan_channel_to_fan_bitmap[] = { + [0] = ACER_GAMING_FAN_BEHAVIOR_CPU, + [1] = ACER_GAMING_FAN_BEHAVIOR_GPU, +}; + static umode_t acer_wmi_hwmon_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr, int channel) @@ -2850,6 +2952,11 @@ static umode_t acer_wmi_hwmon_is_visible(const void *data, case hwmon_temp: sensor_id = acer_wmi_temp_channel_to_sensor_id[channel]; break; + case hwmon_pwm: + if (!has_cap(ACER_CAP_PWM)) + return 0; + + fallthrough; case hwmon_fan: sensor_id = acer_wmi_fan_channel_to_sensor_id[channel]; break; @@ -2857,8 +2964,12 @@ static umode_t acer_wmi_hwmon_is_visible(const void *data, return 0; } - if (*supported_sensors & BIT(sensor_id - 1)) + if (*supported_sensors & BIT(sensor_id - 1)) { + if (type == hwmon_pwm) + return 0644; + return 0444; + } return 0; } @@ -2867,8 +2978,10 @@ static int acer_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { u64 command = ACER_WMID_CMD_GET_PREDATOR_V4_SENSOR_READING; + u8 fan, speed, mode_bitmap; + u16 fan_bitmap; + int mode, ret; u64 result; - int ret; switch (type) { case hwmon_temp: @@ -2892,6 +3005,106 @@ static int acer_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type, *val = FIELD_GET(ACER_PREDATOR_V4_SENSOR_READING_BIT_MASK, result); return 0; + case hwmon_pwm: + switch (attr) { + case hwmon_pwm_input: + fan = acer_wmi_fan_channel_to_fan_id[channel]; + ret = WMID_gaming_get_gaming_fan_speed(fan, &speed); + if (ret < 0) + return ret; + + *val = fixp_linear_interpolate(0, 0, 100, U8_MAX, speed); + return 0; + case hwmon_pwm_enable: + fan_bitmap = acer_wmi_fan_channel_to_fan_bitmap[channel]; + ret = WMID_gaming_get_fan_behavior(fan_bitmap, &mode_bitmap); + if (ret < 0) + return ret; + + switch (channel) { + case 0: + mode = FIELD_GET(ACER_GAMING_FAN_BEHAVIOR_CPU_MODE_MASK, + mode_bitmap); + break; + case 1: + mode = FIELD_GET(ACER_GAMING_FAN_BEHAVIOR_GPU_MODE_MASK, + mode_bitmap); + break; + default: + return -EINVAL; + } + + switch (mode) { + case ACER_WMID_FAN_MODE_AUTO: + *val = 2; + return 0; + case ACER_WMID_FAN_MODE_TURBO: + *val = 0; + return 0; + case ACER_WMID_FAN_MODE_CUSTOM: + *val = 1; + return 0; + default: + return -ENXIO; + } + default: + return -EOPNOTSUPP; + } + default: + return -EOPNOTSUPP; + } +} + +static int acer_wmi_hwmon_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + u8 fan, speed, mode_bitmap; + u16 fan_bitmap; + int mode; + + switch (type) { + case hwmon_pwm: + switch (attr) { + case hwmon_pwm_input: + fan = acer_wmi_fan_channel_to_fan_id[channel]; + speed = fixp_linear_interpolate(0, 0, U8_MAX, 100, + clamp_val(val, 0, U8_MAX)); + + return WMID_gaming_set_gaming_fan_speed(fan, speed); + case hwmon_pwm_mode: + fan_bitmap = acer_wmi_fan_channel_to_fan_bitmap[channel]; + + switch (val) { + case 0: + mode = ACER_WMID_FAN_MODE_TURBO; + break; + case 1: + mode = ACER_WMID_FAN_MODE_CUSTOM; + break; + case 2: + mode = ACER_WMID_FAN_MODE_AUTO; + break; + default: + return -EINVAL; + } + + switch (channel) { + case 0: + mode_bitmap = FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_CPU_MODE_MASK, + mode); + break; + case 1: + mode_bitmap = FIELD_PREP(ACER_GAMING_FAN_BEHAVIOR_GPU_MODE_MASK, + mode); + break; + default: + return -EINVAL; + } + + return WMID_gaming_set_fan_behavior(fan_bitmap, mode_bitmap); + default: + return -EOPNOTSUPP; + } default: return -EOPNOTSUPP; } @@ -2907,11 +3120,16 @@ static const struct hwmon_channel_info *const acer_wmi_hwmon_info[] = { HWMON_F_INPUT, HWMON_F_INPUT ), + HWMON_CHANNEL_INFO(pwm, + HWMON_PWM_INPUT | HWMON_PWM_ENABLE, + HWMON_PWM_INPUT | HWMON_PWM_ENABLE + ), NULL }; static const struct hwmon_ops acer_wmi_hwmon_ops = { .read = acer_wmi_hwmon_read, + .write = acer_wmi_hwmon_write, .is_visible = acer_wmi_hwmon_is_visible, }; From patchwork Fri Feb 14 22:13:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13975689 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 19CF91DDA18; Fri, 14 Feb 2025 22:13:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739571220; cv=none; b=bQKyamMbcV9mMXy2IRD4eK3T5nZKYcTzSPtLJwilxAvHjN4/SVPg2mLMcClrlPga+sHgd2aAuJ7HhxsVGN6ONbXey6chdma3FiOxuGAYiNuJGhHyoc35bGqYun8mtp+r0iYHeQodRC7iA+hEWzvg2bSFNUXg9IadzS1Fu1Ff0js= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739571220; c=relaxed/simple; bh=ba+hn+IBiz5wojCra6hymsACBfDSU5cpcyTnl70wcJM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=r4+owbehTWmAWg0P95QT3WZuVMAtyXiBDZIe02ibgj/C4M9AdPUUtyt+YND7PL4xrTqx28tEsTZAIMH1m3b5Qpvu7HXZvxILbflnApE3qXUCs9ob0dh0XSs9TMeylJhpcmvg7LUg1PfYGhqKgy+m93xW1HYqtThCy3oJdU/q404= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=exJYMU0T; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="exJYMU0T" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1739571216; x=1740176016; i=w_armin@gmx.de; bh=xB8nfcIGfWAml1wS6DRi4V1OxOYZOMijucslZC0RTIw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=exJYMU0TwtBR1SJjNOn4BYPTgJBVumYgbz7U0sDChGBSyEVUxcHDK0eTpCUto/af XrGdbxXwYtolEy1wQrhB1jX7oCKmrGmAifLTG8+XMTbXiL90K3KzR9U6RCjd8BebL MUQ9ZV0dm94HmggwZVOgAPTIqMlM4I4itU+68caOA9tkZ87HIPmIpEzn7vvKTycXq aq+4BFcrx6QeevptHZmTWBUx9/IuFy5Ni+l+l89JppQWOZPw8LEisp1rFKLhV2idR 5KTYdLMXrdyo3btz3R0xoPUrfEBZInNBpfFBCgkHv7nFu/e6JgYsTRj9uaAgeGtbD /5aIyxrmPUB0KVDXeg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N5VHM-1tKAfl44ja-00zr26; Fri, 14 Feb 2025 23:13:36 +0100 From: Armin Wolf To: jlee@suse.com, basak.sb2006@gmail.com, rayanmargham4@gmail.com Cc: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 3/3] platform/x86: acer-wmi: Enable fan control for PH16-72 and PT14-51 Date: Fri, 14 Feb 2025 23:13:22 +0100 Message-Id: <20250214221322.47298-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250214221322.47298-1-W_Armin@gmx.de> References: <20250214221322.47298-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:h7/6J+EORcteXthSIviSokhcGBTy+kDnJLN+kTO/DlegZ23urgd p7volsIYHcdfSpEqEregNVGQlfoZwvJ3x7RSh5Ke7LS25L17hGo5L5j4FnC6DzGObTF421l 2aaGeE1BUx3IoZA0lJ/Zs1a/0LplMycuereRdMrJT8wDkszkFdHf3xzzgJ7Vkcih1qsQ01Z xzimeTNr1buGHWqvWyWCQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:1XHGzZrp/z0=;9MBh75K3zSza1kS/i/94r6U0+oT g4Tb7dknFZIJm57UZnFjWdeGTGh8olQP3TWGzzE9h+XG32keaBnHUldM85zLHhMy4casp2hf5 57o0bcJY5cr/a38fROLrmBIhVl8wur6L4eidqvcMXDVUsBJYzrLBeLJBXhL8WSjQavhWmFudU hnDTo8IvJ6XPuVA2NcjjhDeSJs48rCk0yby/BX/SOJVLzaVdWHwk8bXwPF8+0p3rZsVQYH0UI mbwLbsGauWW37x0wQiEJNsDLkAK6OLsVMmFVp+8ArnpaHaIKD83p0zNerIV7AWzal3WQ+gkYZ fLkHUpEWOL3/7k6Ao3Lj/P8MOPPxVniRoEVfq8/J+7FoKxIgQug5MRSSJ52QCY2i2fiSDrRbx kteD+m2E4WE0Os3pkSAkQWyAnTaXgu120Q/6+1Fh+FWxeWtMadA4sNNxkdEqWT+0bsuSqXAAw 3lyGaf6APc1FWP87CEQModDO+2baHbFBV5vsPbAaEkvSzFArnDlDzyrrEgc/7ZvE+5tzVd83N n4w0joMXoyTzcHnobNNCtAHoRl+efSRSuWLgLuWoop2vO78BOVC6zjJEJG1KC2hG1xQKWux6W s+Qi+QnKHXpBUyeiaCD42180PdvJfQFWm0oAroSJNuNfhZiGxaM6vcvAqUJbvSABmW1selyRi cPYi+r9+G3k43v0sgsV7+MuWjlqP5weBdzvugzi6QfMoPdp7zKahG+ZrNb6e/eL6hVIqKmSps z7zCTgphGmE9SxtyeGzTBKImjjVvFhiirqvDUhOi0xqzp28A0KS5Iakod39o1x/2QaXLEaCDU LME1MKV2eP3OaanDEADu8klrpp89faUQkyMZTQfUBsnwReuz5VjzlmNosdRggydrp4adoekcl kGf1bc6s9mNqwNwRKasAEgwZapgmYDBClAJ8AtnfHn0UrKXHvZrQ22f/8mzkTm8hHJvSREC+x +ojKmjx2AmzsFDICDCS4eFHS8/DU3DSBYP2hp5tL6cqUx83oIaEV4OGstS+zLDoILVtztgs0Z qWMXz5XcJJbLB3aeZoonplHwnosuKU6NbGj8foJMyH+v7KGRudtCk5uSAb6gkBiQGKQUpBLG4 d0dkNV7TBQ1UuPbfEGvq+sLem6zrPNqAq3MmXuFg3SLRyIT9KuDF0mljZ9WZyMkQUjtp6Esl8 ypFZjs/duU0KDc9XjMTQNNEbo4oXFCJAohlFd1nOCsnPTOKwjmsCrw95yw+mUL4/7r8HsXYGz WoG8b8KzNJV6I2YarIaYeY9zjPhbc5w9FnzgyzrW+wy1ya8evIxT0/NW0oGclpPckD53DmKj3 Wif8Q4MCim0HFN5K5NKqMw6vvmxK4sZMYvV1uAW53PituegTlTle6Yd80WgTRNxR93YD05Zhy Jeb/7zJstSVISMW/AHZIMfzjIPmOnD9MfhA5rKhxfO+5wVn2y6qu82x9HH Both machines support the necessary WMI methods, so enable fan control for them. Signed-off-by: Armin Wolf --- drivers/platform/x86/acer-wmi.c | 2 ++ 1 file changed, 2 insertions(+) -- 2.39.5 diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index e24f5a323f95..05cbe8f96f21 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -466,6 +466,7 @@ static struct quirk_entry quirk_acer_predator_ph16_72 = { .cpu_fans = 1, .gpu_fans = 1, .predator_v4 = 1, + .pwm = 1, }; static struct quirk_entry quirk_acer_predator_pt14_51 = { @@ -473,6 +474,7 @@ static struct quirk_entry quirk_acer_predator_pt14_51 = { .cpu_fans = 1, .gpu_fans = 1, .predator_v4 = 1, + .pwm = 1, }; static struct quirk_entry quirk_acer_predator_v4 = {