From nobody Wed Dec 17 19:22:27 2025 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (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 1AE0F309EFF; Fri, 24 Oct 2025 18:38:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761331120; cv=none; b=NQ0sfZg2Yo2gEqpPBJ5GQF/xqLAmd/KeoeRJh5ff8fksVM0d/jRdVWo4LLM7U3XWvGMUa1og1vCb0/1Kw9AoUiTuyvY3Mc3fJHz60wfTV6FG5Z1Q/pZtVvHWO7Op5gPzvYhCPd5IBlv9r8iV+o7vpynuLeSoY14sJzI270ygUtw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761331120; c=relaxed/simple; bh=8gDu5zuPLk33NAmJ3WZKbijbJ8qnTqrJoej7WwiPsqg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oDtINrl/+5Vq9y1Nw5S4GT4wHL3y5I/RDx7Z+SDAw0j5BuxuvixMUcDr3oR1WsqvO6oHsQel0G0XhCC2okKv/4BLA1FRvIGhpjZUYwOtg5CK2lasgbT0mhRZnRW8sDeuMA0Bc6BRAaXpSm/ByP+M8hZ1oc5tXhdSlb8p3P2V2MI= 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=Stl8IX9m; arc=none smtp.client-ip=212.227.17.22 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="Stl8IX9m" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1761331116; x=1761935916; i=w_armin@gmx.de; bh=yaJ2vhZGJYLCCzCma1kImL1OBNIVEEsDW59LF7HCr40=; 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=Stl8IX9mMvtMNN0X86W5G29zT7M/3Glhjs/7Er/vP+5NpMGEXN8Vh/L5cFmrNDDK 8fyjtEfooqd8sTRNDPd66urIRQ1Fbvz6S56CcGVP6vpgZ1Clf4XHF3dOu6EgAckhM e1AiF5WH1Cs6J3fC9KBqwgkYWUfWZS7RQk37UTs7wFcdtQLiPZTfuo119bJQI2nJe y5MdDeOQMR465x5v8pbgj5571QWOBkUke0AGu/TX0YKYYeqf/zwISXjugVtPkytuX tWf2SViZa3fz6ve7lhz5fvmalgHBbBshYazt282z+yMGoool76hFSRygOQBES3gDs +XRdq9hn1Ten4yVDcg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MJVDM-1usVRj3oEq-00Wvza; Fri, 24 Oct 2025 20:38:36 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/3] ACPI: fan: Add basic notification support Date: Fri, 24 Oct 2025 20:38:22 +0200 Message-Id: <20251024183824.5656-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251024183824.5656-1-W_Armin@gmx.de> References: <20251024183824.5656-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:sAx+YDn3Kngldh7pYaKdnsuCXB1Tah0peK2LDXrPY+0mCuIs/6E IGBTuO6JZJutP9NMpEU+svXgByKWrwngYRkddCI+j/p2YgouWqNAhNtbkhlfT3/gvRaQsud hHAw9OKTlCaBQ0qPpRxOft4IvKevOzzrvlf5Hj7tan/DkHcU2xY7p9Oul5MU8YtqvwCohr7 BCc/DfqNUKCoQCOv2HYsw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:kWWG2Izpzbc=;q2sjXVM5KVQiOjzZ38QzExt35BY 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 39pSA== Content-Type: text/plain; charset="utf-8" The ACPI specification states that the platform firmware can notify the ACPI fan device that the fan speed has changed an that the _FST control method should be reevaluated. Add support for this mechanism to prepare for future changes. Signed-off-by: Armin Wolf --- drivers/acpi/fan_core.c | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/drivers/acpi/fan_core.c b/drivers/acpi/fan_core.c index 46e7fe7a506d..9ee4ef2d6dbc 100644 --- a/drivers/acpi/fan_core.c +++ b/drivers/acpi/fan_core.c @@ -19,6 +19,8 @@ =20 #include "fan.h" =20 +#define ACPI_FAN_NOTIFY_STATE_CHANGED 0x80 + static const struct acpi_device_id fan_device_ids[] =3D { ACPI_FAN_DEVICE_IDS, {"", 0}, @@ -308,6 +310,50 @@ static int acpi_fan_get_fps(struct acpi_device *device) return status; } =20 +static void acpi_fan_notify_handler(acpi_handle handle, u32 event, void *c= ontext) +{ + struct device *dev =3D context; + struct acpi_fan_fst fst; + int ret; + + switch (event) { + case ACPI_FAN_NOTIFY_STATE_CHANGED: + /* + * The ACPI specification says that we must evaluate _FST when we + * receive an ACPI event indicating that the fan state has changed. + */ + ret =3D acpi_fan_get_fst(handle, &fst); + if (ret < 0) + dev_err(dev, "Error retrieving current fan status: %d\n", ret); + + acpi_bus_generate_netlink_event("fan", dev_name(dev), event, 0); + break; + default: + dev_dbg(dev, "Unsupported ACPI notification 0x%x\n", event); + break; + } +} + +static void acpi_fan_notify_remove(void *data) +{ + struct acpi_fan *fan =3D data; + + acpi_remove_notify_handler(fan->handle, ACPI_DEVICE_NOTIFY, acpi_fan_noti= fy_handler); +} + +static int devm_acpi_fan_notify_init(struct device *dev) +{ + struct acpi_fan *fan =3D dev_get_drvdata(dev); + acpi_status status; + + status =3D acpi_install_notify_handler(fan->handle, ACPI_DEVICE_NOTIFY, + acpi_fan_notify_handler, dev); + if (ACPI_FAILURE(status)) + return -EIO; + + return devm_add_action_or_reset(dev, acpi_fan_notify_remove, fan); +} + static int acpi_fan_probe(struct platform_device *pdev) { int result =3D 0; @@ -351,6 +397,10 @@ static int acpi_fan_probe(struct platform_device *pdev) if (result) return result; =20 + result =3D devm_acpi_fan_notify_init(&pdev->dev); + if (result) + return result; + result =3D acpi_fan_create_attributes(device); if (result) return result; --=20 2.39.5 From nobody Wed Dec 17 19:22:27 2025 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (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 7F99334A776; Fri, 24 Oct 2025 18:38:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761331121; cv=none; b=b6Pcl2kHtrZ9oNenHaagZBD1Xur9Xcu6d5nrCF16LIVDI6/Q9KN8y+EHMGdtOTMotFnlsC51pvEjMjnrOhTg8NoUlcAexcXkdku8+VG17Pj5qyQuoX7o5UhdmXcm9uprZwsip9tL193NqU3KXONNxiE9c6f958WEfT8gdPIVagY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761331121; c=relaxed/simple; bh=2A1PlvROXJxuvTXphRZJjOdUQe9WUmSs/dXp8vOMRkM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jybjh8ufsLX2jlSE98nlfjIVdcaW79BeRDYrNwKVaRfAh2UD/ZIaqSOCPjidK2JkCz+v9gQRs791BfIZZ37tklF+79Ed2WnzTYLajt4pavB641pVbQxEU+NA8pY4aZgwJPXlpt0yfquEzANYb68S9KmKg4cH1gAFl0Gi7aznvOE= 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=gChnC6gE; arc=none smtp.client-ip=212.227.17.20 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="gChnC6gE" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1761331117; x=1761935917; i=w_armin@gmx.de; bh=pj2YF+0Jdh5zYiCsFKazbgJOjW41CP8/TLCkIbqm/P8=; 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=gChnC6gEk+EXfh2Pda2baZjGKfE1164irrdfgKvRVfkjPIA5V5jDdCe3N6PgF6+A pYEQQWrBg+VPsUHnoIaHHsN6XskZeeeCy7PcvxGBfSeLBA7RfK3oMtiAsKoI7FNaE rPfovZUrsUENxp0l/SWk2QAj+CH5R8V+1YZckDLm2y0CUuT5Ijr+aofdY+OCas0iP IM28eJ9GJGV0lZpurSGwc6YWL50WAe4lG6GiI11mWzpNFzeYNC5ud6kBwBoKbeXra QPqgqyRlSFLlC8/Du4AOFxGIJwpMjXiFe8DoJLLT7DgcK8cMdQAM8i62yFUguBlun vVg8Sgm0C6u808Nt/A== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MD9XF-1v3K7o1Qyv-008R7j; Fri, 24 Oct 2025 20:38:37 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/3] ACPI: fan: Add hwmon notification support Date: Fri, 24 Oct 2025 20:38:23 +0200 Message-Id: <20251024183824.5656-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251024183824.5656-1-W_Armin@gmx.de> References: <20251024183824.5656-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:LX3qo8teiYnycuk2TB4i728TIKcCCB6V3rttHfGrYBIDOkRl9p6 JKS57ao++w88yh/ad8Yo3b9j7gqRMJu9wwE+6UtC2FJz+wdMpaJXjDDfBIupEDVhvE3jt3y KvqQs5i3cIOhRD4UScIS3uFP5DOIChEqGXGzyhE+hCQ/zz01c9eYluWbdZFwinEknQonzfQ FhSnNo+LszHDn1f9dYrEA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:OeZZF2jAvew=;WCZRf5ZBC1LjwPfk0Kch57+yKkl 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 +S+hg== Content-Type: text/plain; charset="utf-8" The platform firmware can notify the ACPI fan device that the fan speed has changed. Relay this notification to the hwmon device if present so that userspace applications can react to it. Signed-off-by: Armin Wolf --- drivers/acpi/fan.h | 5 +++++ drivers/acpi/fan_core.c | 1 + drivers/acpi/fan_hwmon.c | 15 +++++++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/acpi/fan.h b/drivers/acpi/fan.h index 0d73433c3889..dcc1ad3118ff 100644 --- a/drivers/acpi/fan.h +++ b/drivers/acpi/fan.h @@ -56,6 +56,9 @@ struct acpi_fan { struct acpi_fan_fif fif; struct acpi_fan_fps *fps; int fps_count; +#if IS_REACHABLE(CONFIG_HWMON) + struct device *hdev; +#endif struct thermal_cooling_device *cdev; struct device_attribute fst_speed; struct device_attribute fine_grain_control; @@ -99,8 +102,10 @@ void acpi_fan_delete_attributes(struct acpi_device *dev= ice); =20 #if IS_REACHABLE(CONFIG_HWMON) int devm_acpi_fan_create_hwmon(struct device *dev); +void acpi_fan_notify_hwmon(struct device *dev); #else static inline int devm_acpi_fan_create_hwmon(struct device *dev) { return = 0; }; +static inline void acpi_fan_notify_hwmon(struct device *dev) { }; #endif =20 #endif diff --git a/drivers/acpi/fan_core.c b/drivers/acpi/fan_core.c index 9ee4ef2d6dbc..7be22c52670c 100644 --- a/drivers/acpi/fan_core.c +++ b/drivers/acpi/fan_core.c @@ -326,6 +326,7 @@ static void acpi_fan_notify_handler(acpi_handle handle,= u32 event, void *context if (ret < 0) dev_err(dev, "Error retrieving current fan status: %d\n", ret); =20 + acpi_fan_notify_hwmon(dev); acpi_bus_generate_netlink_event("fan", dev_name(dev), event, 0); break; default: diff --git a/drivers/acpi/fan_hwmon.c b/drivers/acpi/fan_hwmon.c index 47a02ef5a606..d3374f8f524b 100644 --- a/drivers/acpi/fan_hwmon.c +++ b/drivers/acpi/fan_hwmon.c @@ -162,12 +162,19 @@ static const struct hwmon_chip_info acpi_fan_hwmon_ch= ip_info =3D { .info =3D acpi_fan_hwmon_info, }; =20 +void acpi_fan_notify_hwmon(struct device *dev) +{ + struct acpi_fan *fan =3D dev_get_drvdata(dev); + + hwmon_notify_event(fan->hdev, hwmon_fan, hwmon_fan_input, 0); +} + int devm_acpi_fan_create_hwmon(struct device *dev) { struct acpi_fan *fan =3D dev_get_drvdata(dev); - struct device *hdev; =20 - hdev =3D devm_hwmon_device_register_with_info(dev, "acpi_fan", fan, &acpi= _fan_hwmon_chip_info, - NULL); - return PTR_ERR_OR_ZERO(hdev); + fan->hdev =3D devm_hwmon_device_register_with_info(dev, "acpi_fan", fan, + &acpi_fan_hwmon_chip_info, NULL); + + return PTR_ERR_OR_ZERO(fan->hdev); } --=20 2.39.5 From nobody Wed Dec 17 19:22:27 2025 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (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 8CB9834C821; Fri, 24 Oct 2025 18:38:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761331127; cv=none; b=IUaoX/VJyKhNumtddGJzhWVPaicSVpfCdY2Qz3WJC8Dr/5kxBWFd+4cCvTK8gMSYYEcZSL35iIlQ6EA8xDqRd2aYY9SgT77gCe8i2haGgIO0aKBrOD0xHS3GxZfGMoTZtddS+B7bG/cwWLWOVYMcML++uGPzgUdFBanZNENGV9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761331127; c=relaxed/simple; bh=VfuyrzGYcEicD1d9RUTdm+6Wif3rnUDFmF3gcDaE1f8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=MawyFo6HPD43kJVHfs+HLKJAsrVRLZsSozJR1zeyefPiuCgnNoNScw4H8d0V0mSjPl/X+T23sJgD1/1Hj/Ibtu6lxKy+1odFfJY+pLtR9Y0ejWiN5nFPjhS9/rXDBVrRi66Up5fUUOipAF8x1/prNdkxXAGxhoaQsujQrHMjTx0= 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=hUwCGu2g; arc=none smtp.client-ip=212.227.17.22 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="hUwCGu2g" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1761331119; x=1761935919; i=w_armin@gmx.de; bh=kI8zofgUNUgpbjLJnL4Sr/DLZs0GcHA0ckLMQDs0AsU=; 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=hUwCGu2gaNK9yJjrE3uTjwseXD4jYSCvaAGBlhlzEhCI6pimJKiPQxFFDQCgsUt7 N0QYf1oJXQ+6IJ6g3WCiAI4FHPBIUtv544jhAwAX2AdexvCYYuv/laVoPjuupigOW NDNdk4h3TQafe4HE0wtQxskqrejQheVtSqruNgxBhns8s0NUK5DJ+Z4F9kSmpET4A OREZCXes5mOq+n7rZKLqeUig4yWzjW3sjY/g7i8q/PRpUHi8cPGEQgaev+nQBy/jq MJMdr7OqNqinu60vIzq51Dh4GtC8xNAp93FzU1hYNNdhES/P48AaEdXYx1GctpkSv ypk4E9aD+6/rNJQAHQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MqaxU-1uPsi647FI-00dOAF; Fri, 24 Oct 2025 20:38:39 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 3/3] ACPI: fan: Add support for Microsoft fan extensions Date: Fri, 24 Oct 2025 20:38:24 +0200 Message-Id: <20251024183824.5656-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251024183824.5656-1-W_Armin@gmx.de> References: <20251024183824.5656-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:cCUJa7O/fGLsQFcHfVnAILquOJ/RKBf2PTPl8SKA9NpZLrgWsuV zyuyNssMt4ylbGwlhQUTU89z445A8hbmXBTkvhlglwRPNhDuK0TaQIr3yzSGS1Wh3YFSJNg eRBBF/5cYukahFHX7JFnTTLkNaGP/i51N7zYNEkaaCjnRsJ+xnDXV2cH93eTFuj7GUq8ppV Vrgp8FSQTlPv2J3jPhVrA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:2MK3trNCnIQ=;QzupsnEl5cH2mG1sih8VIECn8gc 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 ohWQP9UXeLFT3XxxU= Content-Type: text/plain; charset="utf-8" Microsoft has designed a set of extensions for the ACPI fan device allowing the OS to specify a set of fan speed trip points. The platform firmware will then notify the ACPI fan device when one of the trip points is triggered. Unfortunatly, some device manufacturers (like HP) blindly assume that the OS will use said extensions and thus only update the values returned by the _FST control method when receiving such a notification. As a result the ACPI fan driver is currently unusable on such machines, always reporting a constant value. Fix this by adding support for the Microsoft extensions. During probe and when resuming from suspend the driver will attempt to trigger an initial notification that will update the values returned by _FST. Said trip points will be updated each time a notification is received from the platform firmware to ensure that the values returned by the _FST control method are updated. Link: https://learn.microsoft.com/en-us/windows-hardware/design/device-expe= riences/design-guide Closes: https://github.com/lm-sensors/lm-sensors/issues/506 Signed-off-by: Armin Wolf --- drivers/acpi/fan.h | 2 + drivers/acpi/fan_core.c | 173 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 173 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/fan.h b/drivers/acpi/fan.h index dcc1ad3118ff..f85f9a0fbfcd 100644 --- a/drivers/acpi/fan.h +++ b/drivers/acpi/fan.h @@ -56,6 +56,8 @@ struct acpi_fan { struct acpi_fan_fif fif; struct acpi_fan_fps *fps; int fps_count; + /* A value of 0 means that trippoint-related functions are not supported = */ + u32 fan_trip_granularity; #if IS_REACHABLE(CONFIG_HWMON) struct device *hdev; #endif diff --git a/drivers/acpi/fan_core.c b/drivers/acpi/fan_core.c index 7be22c52670c..1ec213afcdfd 100644 --- a/drivers/acpi/fan_core.c +++ b/drivers/acpi/fan_core.c @@ -7,11 +7,16 @@ * Copyright (C) 2022 Intel Corporation. All rights reserved. */ =20 +#include #include +#include +#include +#include #include #include #include #include +#include #include #include #include @@ -21,6 +26,24 @@ =20 #define ACPI_FAN_NOTIFY_STATE_CHANGED 0x80 =20 +/* + * Defined inside the "Fan Noise Signal" section at + * https://learn.microsoft.com/en-us/windows-hardware/design/device-experi= ences/design-guide. + */ +static const guid_t acpi_fan_microsoft_guid =3D GUID_INIT(0xA7611840, 0x99= FE, 0x41AE, 0xA4, 0x88, + 0x35, 0xC7, 0x59, 0x26, 0xC8, 0xEB); +#define ACPI_FAN_DSM_GET_TRIP_POINT_GRANULARITY 1 +#define ACPI_FAN_DSM_SET_TRIP_POINTS 2 +#define ACPI_FAN_DSM_GET_OPERATING_RANGES 3 + +/* + * Ensures that fans with a very low trip point granularity + * do not send too many notifications. + */ +static uint min_trip_distance =3D 100; +module_param(min_trip_distance, uint, 0); +MODULE_PARM_DESC(min_trip_distance, "Minimum distance between fan speed tr= ip points in RPM"); + static const struct acpi_device_id fan_device_ids[] =3D { ACPI_FAN_DEVICE_IDS, {"", 0}, @@ -310,6 +333,131 @@ static int acpi_fan_get_fps(struct acpi_device *devic= e) return status; } =20 +static int acpi_fan_dsm_init(struct device *dev) +{ + union acpi_object dummy =3D { + .package =3D { + .type =3D ACPI_TYPE_PACKAGE, + .count =3D 0, + .elements =3D NULL, + }, + }; + struct acpi_fan *fan =3D dev_get_drvdata(dev); + union acpi_object *obj; + int ret =3D 0; + + if (!acpi_check_dsm(fan->handle, &acpi_fan_microsoft_guid, 0, + BIT(ACPI_FAN_DSM_GET_TRIP_POINT_GRANULARITY) | + BIT(ACPI_FAN_DSM_SET_TRIP_POINTS))) + return 0; + + dev_info(dev, "Using Microsoft fan extensions\n"); + + obj =3D acpi_evaluate_dsm_typed(fan->handle, &acpi_fan_microsoft_guid, 0, + ACPI_FAN_DSM_GET_TRIP_POINT_GRANULARITY, &dummy, + ACPI_TYPE_INTEGER); + if (!obj) + return -EIO; + + if (obj->integer.value > U32_MAX) + ret =3D -EOVERFLOW; + else + fan->fan_trip_granularity =3D obj->integer.value; + + kfree(obj); + + return ret; +} + +static int acpi_fan_dsm_set_trip_points(struct device *dev, u64 upper, u64= lower) +{ + union acpi_object args[2] =3D { + { + .integer =3D { + .type =3D ACPI_TYPE_INTEGER, + .value =3D lower, + }, + }, + { + .integer =3D { + .type =3D ACPI_TYPE_INTEGER, + .value =3D upper, + }, + }, + }; + struct acpi_fan *fan =3D dev_get_drvdata(dev); + union acpi_object in =3D { + .package =3D { + .type =3D ACPI_TYPE_PACKAGE, + .count =3D ARRAY_SIZE(args), + .elements =3D args, + }, + }; + union acpi_object *obj; + + obj =3D acpi_evaluate_dsm(fan->handle, &acpi_fan_microsoft_guid, 0, + ACPI_FAN_DSM_SET_TRIP_POINTS, &in); + kfree(obj); + + return 0; +} + +static int acpi_fan_dsm_start(struct device *dev) +{ + struct acpi_fan *fan =3D dev_get_drvdata(dev); + int ret; + + if (!fan->fan_trip_granularity) + return 0; + + /* + * Some firmware implementations only update the values returned by the + * _FST control method when a notification is received. This usually works + * with Microsoft Windows as setting up trip points will keep triggering + * said notifications, but will cause issues when using _FST without the + * Microsoft-specific trip point extension. + * + * Because of this we have to ensure that an initial notification is trig= gered + * to start the cycle of trip points updates. We achive this by setting t= he trip + * points sequencially to two separate ranges. As by the Microsoft specif= ication + * the firmware should trigger a notification immediately if the fan spee= d is outside + * of the trip point range. This _should_ result in at least one notifica= tion as both + * ranges do not overlap, meaning that the current fan speed needs to be = outside of + * at least one range. + */ + ret =3D acpi_fan_dsm_set_trip_points(dev, fan->fan_trip_granularity, 0); + if (ret < 0) + return ret; + + return acpi_fan_dsm_set_trip_points(dev, fan->fan_trip_granularity * 3, + fan->fan_trip_granularity * 2); +} + +static int acpi_fan_dsm_update_trips_points(struct device *dev, struct acp= i_fan_fst *fst) +{ + struct acpi_fan *fan =3D dev_get_drvdata(dev); + u64 upper, lower; + + if (!fan->fan_trip_granularity) + return 0; + + if (!acpi_fan_speed_valid(fst->speed)) + return -EINVAL; + + upper =3D roundup_u64(fst->speed + min_trip_distance, fan->fan_trip_granu= larity); + if (fst->speed <=3D min_trip_distance) { + lower =3D 0; + } else { + /* + * Valid fan speed values cannot be larger than 32 bit, so + * we can safely assume that no overflow will happen here. + */ + lower =3D rounddown((u32)fst->speed - min_trip_distance, fan->fan_trip_g= ranularity); + } + + return acpi_fan_dsm_set_trip_points(dev, upper, lower); +} + static void acpi_fan_notify_handler(acpi_handle handle, u32 event, void *c= ontext) { struct device *dev =3D context; @@ -323,8 +471,13 @@ static void acpi_fan_notify_handler(acpi_handle handle= , u32 event, void *context * receive an ACPI event indicating that the fan state has changed. */ ret =3D acpi_fan_get_fst(handle, &fst); - if (ret < 0) + if (ret < 0) { dev_err(dev, "Error retrieving current fan status: %d\n", ret); + } else { + ret =3D acpi_fan_dsm_update_trips_points(dev, &fst); + if (ret < 0) + dev_err(dev, "Failed to update trip points: %d\n", ret); + } =20 acpi_fan_notify_hwmon(dev); acpi_bus_generate_netlink_event("fan", dev_name(dev), event, 0); @@ -394,6 +547,10 @@ static int acpi_fan_probe(struct platform_device *pdev) } =20 if (fan->has_fst) { + result =3D acpi_fan_dsm_init(&pdev->dev); + if (result) + return result; + result =3D devm_acpi_fan_create_hwmon(&pdev->dev); if (result) return result; @@ -402,6 +559,12 @@ static int acpi_fan_probe(struct platform_device *pdev) if (result) return result; =20 + result =3D acpi_fan_dsm_start(&pdev->dev); + if (result) { + dev_err(&pdev->dev, "Failed to start Microsoft fan extensions\n"); + return result; + } + result =3D acpi_fan_create_attributes(device); if (result) return result; @@ -487,8 +650,14 @@ static int acpi_fan_suspend(struct device *dev) =20 static int acpi_fan_resume(struct device *dev) { - int result; struct acpi_fan *fan =3D dev_get_drvdata(dev); + int result; + + if (fan->has_fst) { + result =3D acpi_fan_dsm_start(dev); + if (result) + dev_err(dev, "Failed to start Microsoft fan extensions: %d\n", result); + } =20 if (fan->acpi4) return 0; --=20 2.39.5