From nobody Sun Feb 8 08:47:54 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (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 7BC7C256C89; Tue, 7 Oct 2025 23:42:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880530; cv=none; b=lY42iMuxO+sYIZA3LFHY4dMNrCIZIwa48xIPHHe+KoO0OnOGPUFGMlh2FqNO5SEL1nmtWctwZjKZfRjRffwcfH6CpuW2sJTJyxwyRlqwbHLXjZTDXjZdN1HFm15zdiRZ1BUBB1CsF/gmUDdqxDkq0tjNED84xzsxZXju2H1ewIk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880530; c=relaxed/simple; bh=0cjm2D15ABjPHSqREC4lOS7Gk+i7BOiRrm/etjbkjww=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=c5Augc/9Pwv09oVxObP+h+6yZK6BZ/g6lOLizd8JlHNx6FgynMYbS7WZa3khqBu5eyKReC9OuvBTnlsbrmH9GQzcyP0IstMvBwopjqAxcWJzUaOqKQZye0zeNRIX79VPBhzNSYX8opuTMlM6JFtVlM+qbxNNNzxg8muN4YmXOMo= 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=N/q4FpjX; arc=none smtp.client-ip=212.227.15.18 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="N/q4FpjX" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1759880521; x=1760485321; i=w_armin@gmx.de; bh=G+EoSDUBugpUpUDI6rHVmIJFcQ1Dy/gJilxyTsnZntE=; 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=N/q4FpjXdIw27ZR/4ntQAX23HNSYfHRV8WaSx4bdCwzPRguL6coNlKc4JbeVAxfE 0bRb4NFQM2XVCU7qIX2pwWbfgAlucFJT8eCCCHQgfcuDWgzhtbt9huER+jE0nwP7u ho9pYo6nRRqRxm/UEJWpYevL+3y3qLWH2ofaKcZbHAuRlh401Ln9CkNfzhO8Wza3X hx2AsPYEgb1/2nYm6vl2awCI55tir/HFskM5T6v1QWMygrjJeqxRCeraA3zeMB9cX 9KgM7MQ4XcctDOVlrS+8eJB4etd7lOInsjDcgG76pGu+tX22pR65khGjyB9moRBGc +5NqNGzjz73uxMvuGQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MA7GS-1v0Cmi0MJu-00FtS8; Wed, 08 Oct 2025 01:42:01 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/6] ACPI: fan: Use ACPI handle when retrieving _FST Date: Wed, 8 Oct 2025 01:41:44 +0200 Message-Id: <20251007234149.2769-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251007234149.2769-1-W_Armin@gmx.de> References: <20251007234149.2769-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:uet48auZKPut5Gj77sq+cHzVuVOvBmioB26cNFEav0Z9bWGFtK5 yFpjrsTNr6tDn8Nq+NHb0VZNVxZsvEhbxfDtu5u8d8aea+2//GzBBpSomzTpGSkbFjVoYx3 2t5pG9Z6IU+Ik7/CYokG/UMJc5KV4hsn1ArAtXgNoONfM7SY8UCi/TeNozm/ZFZxyxKNH0L zR8EJXXhpth9drMz1SYdg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:pM6NVSlF45U=;rZdF+A0Mg1yBXXEm/7MARNuXp1u 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 4izkQ== Content-Type: text/plain; charset="utf-8" Usage of the ACPI device should be phased out in the future, as the driver itself is now using the platform bus. Replace any usage of struct acpi_device in acpi_fan_get_fst() to allow users to drop usage of struct acpi_device. Also extend the integer check to all three package elements. Signed-off-by: Armin Wolf --- drivers/acpi/fan.h | 3 ++- drivers/acpi/fan_attr.c | 2 +- drivers/acpi/fan_core.c | 34 ++++++++++++++++++++++------------ drivers/acpi/fan_hwmon.c | 3 +-- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/drivers/acpi/fan.h b/drivers/acpi/fan.h index 8a28a72a7c6a..d39bb6fd1326 100644 --- a/drivers/acpi/fan.h +++ b/drivers/acpi/fan.h @@ -49,6 +49,7 @@ struct acpi_fan_fst { }; =20 struct acpi_fan { + acpi_handle handle; bool acpi4; bool has_fst; struct acpi_fan_fif fif; @@ -59,7 +60,7 @@ struct acpi_fan { struct device_attribute fine_grain_control; }; =20 -int acpi_fan_get_fst(struct acpi_device *device, struct acpi_fan_fst *fst); +int acpi_fan_get_fst(acpi_handle handle, struct acpi_fan_fst *fst); int acpi_fan_create_attributes(struct acpi_device *device); void acpi_fan_delete_attributes(struct acpi_device *device); =20 diff --git a/drivers/acpi/fan_attr.c b/drivers/acpi/fan_attr.c index c1afb7b5ed3d..9b7fa52f3c2a 100644 --- a/drivers/acpi/fan_attr.c +++ b/drivers/acpi/fan_attr.c @@ -55,7 +55,7 @@ static ssize_t show_fan_speed(struct device *dev, struct = device_attribute *attr, struct acpi_fan_fst fst; int status; =20 - status =3D acpi_fan_get_fst(acpi_dev, &fst); + status =3D acpi_fan_get_fst(acpi_dev->handle, &fst); if (status) return status; =20 diff --git a/drivers/acpi/fan_core.c b/drivers/acpi/fan_core.c index 04ff608f2ff0..ea2c646c470c 100644 --- a/drivers/acpi/fan_core.c +++ b/drivers/acpi/fan_core.c @@ -44,25 +44,30 @@ static int fan_get_max_state(struct thermal_cooling_dev= ice *cdev, unsigned long return 0; } =20 -int acpi_fan_get_fst(struct acpi_device *device, struct acpi_fan_fst *fst) +int acpi_fan_get_fst(acpi_handle handle, struct acpi_fan_fst *fst) { struct acpi_buffer buffer =3D { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; acpi_status status; int ret =3D 0; =20 - status =3D acpi_evaluate_object(device->handle, "_FST", NULL, &buffer); - if (ACPI_FAILURE(status)) { - dev_err(&device->dev, "Get fan state failed\n"); - return -ENODEV; - } + status =3D acpi_evaluate_object(handle, "_FST", NULL, &buffer); + if (ACPI_FAILURE(status)) + return -EIO; =20 obj =3D buffer.pointer; - if (!obj || obj->type !=3D ACPI_TYPE_PACKAGE || - obj->package.count !=3D 3 || - obj->package.elements[1].type !=3D ACPI_TYPE_INTEGER) { - dev_err(&device->dev, "Invalid _FST data\n"); - ret =3D -EINVAL; + if (!obj) + return -ENODATA; + + if (obj->type !=3D ACPI_TYPE_PACKAGE || obj->package.count !=3D 3) { + ret =3D -EPROTO; + goto err; + } + + if (obj->package.elements[0].type !=3D ACPI_TYPE_INTEGER || + obj->package.elements[1].type !=3D ACPI_TYPE_INTEGER || + obj->package.elements[2].type !=3D ACPI_TYPE_INTEGER) { + ret =3D -EPROTO; goto err; } =20 @@ -81,7 +86,7 @@ static int fan_get_state_acpi4(struct acpi_device *device= , unsigned long *state) struct acpi_fan_fst fst; int status, i; =20 - status =3D acpi_fan_get_fst(device, &fst); + status =3D acpi_fan_get_fst(device->handle, &fst); if (status) return status; =20 @@ -311,11 +316,16 @@ static int acpi_fan_probe(struct platform_device *pde= v) struct acpi_device *device =3D ACPI_COMPANION(&pdev->dev); char *name; =20 + if (!device) + return -ENODEV; + fan =3D devm_kzalloc(&pdev->dev, sizeof(*fan), GFP_KERNEL); if (!fan) { dev_err(&device->dev, "No memory for fan\n"); return -ENOMEM; } + + fan->handle =3D device->handle; device->driver_data =3D fan; platform_set_drvdata(pdev, fan); =20 diff --git a/drivers/acpi/fan_hwmon.c b/drivers/acpi/fan_hwmon.c index e8d90605106e..4209a9923efc 100644 --- a/drivers/acpi/fan_hwmon.c +++ b/drivers/acpi/fan_hwmon.c @@ -93,13 +93,12 @@ static umode_t acpi_fan_hwmon_is_visible(const void *dr= vdata, enum hwmon_sensor_ static int acpi_fan_hwmon_read(struct device *dev, enum hwmon_sensor_types= type, u32 attr, int channel, long *val) { - struct acpi_device *adev =3D to_acpi_device(dev->parent); struct acpi_fan *fan =3D dev_get_drvdata(dev); struct acpi_fan_fps *fps; struct acpi_fan_fst fst; int ret; =20 - ret =3D acpi_fan_get_fst(adev, &fst); + ret =3D acpi_fan_get_fst(fan->handle, &fst); if (ret < 0) return ret; =20 --=20 2.39.5 From nobody Sun Feb 8 08:47:54 2026 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 3254E22579E; Tue, 7 Oct 2025 23:42:08 +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=1759880531; cv=none; b=QFOk8hPNDJBCWfRzGofIDE/mqISpzAltw3Qn1JdnHUpfg5CiB3DyiORQzzAgQisqdkO01wY49kGoz1l/St0Vt7ojStfM+9zhZ+IgFnhIjH4nbOPEDNiAv4KghwEtoCLU73J2jN+rb99gQsY31gb4sOYHNcc6Y/feOxtk6Va0jfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880531; c=relaxed/simple; bh=0RWOXnLR7FG9+TwshK3PGnYQaOOl5snD5H0QN+aIVXE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=los5ZCjRIDAD702j8BYw8gnQi9xzj2V07BbJBE/jm13kCbK3ZlHOmjYfRndW1FCPKRC5IvdsjEYtxAqSmVW1PFnUaqEssZEzBQZf+hwyMq1CfXTeWzpG1ouNFSMuhyrl4CyRK/AOOI1UqQEp/ERdaJXg/aZf3/QXHeB3W56n0/o= 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=SZUTfSFD; 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="SZUTfSFD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1759880523; x=1760485323; i=w_armin@gmx.de; bh=FivFU/5ysNNcOss1NqFYq2iX+hPjy6cOYfxHk161Nsw=; 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=SZUTfSFDTcDXdjWpuNbGFpkyayUHf4iY4jFN/ULLm3maP/yg5HQvhPRCeGRWvsTM pNPL5FZDuWanpkuM7MVntFABlNZdOypcQqhcl3v+pjHls49i1FBzDkFEN+pojlMi/ BawG7hUFeXy2/BSQub8DsuMV2/ZycFzwRE10YRH5CsCYykZ3qLzeeM50Q5XgvHbp8 OdCPJ7+sQWJGKrR/wnyMzMcLFGi5bnWl/yfeRcHOFJu33Pqiy2Q8xAYoYUyYoTB8g N2phgeoZVfhsfXNmkQgxf/OXTHGYWcCLTvFwBBFQMgAJX7bR+RWfC3WCDIher9u9A K42dA6tdO3XImPdifw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MuUj2-1uFxua3Kle-00vVZV; Wed, 08 Oct 2025 01:42:03 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/6] ACPI: fan: Workaround for 64-bit firmware bug Date: Wed, 8 Oct 2025 01:41:45 +0200 Message-Id: <20251007234149.2769-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251007234149.2769-1-W_Armin@gmx.de> References: <20251007234149.2769-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:GiRGmZCgqACSKsM2p/LsRA/ipv5zvp/VO60t8kCqnJ50TKM1gkB BZCbL7lJ4osDP4aIXo6D9U5UYNDUDmRVtQhA+uLsqQzjyJLJGMiTXGQAhNPYNBKFEVPwEhB m820u3UQT6oRhFanJb/AV4KRI82pkjbOH//iSFPTxqixAMPj2AD8cWUVJCo4EbWhPPnCff9 XTXOUplsHph1wMrNwnZVw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:BFdWFEgnbLc=;vFeVkWcy3a22V2TgAnEsYZlgr+p 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 D3RZpCT7crBdXsMJ8nFGREsrzU= Content-Type: text/plain; charset="utf-8" Some firmware implementations use the "Ones" ASL opcode to produce an integer with all bits set in order to indicate missing speed or power readings. This however only works when using 32-bit intgers, as the ACPI spec requires a 32-bit integer (0xFFFFFFFF) to be returned for missing speed/power readings. With 64-bit integers the "Ones" opcode produces a 64-bit integer with all bits set, violating the ACPI spec regarding the placeholder value for missing readings. Work around such buggy firmware implementation by also checking for 64-bit integers with all bits set when reading _FST. Signed-off-by: Armin Wolf --- drivers/acpi/fan.h | 33 +++++++++++++++++++++++++++++++++ drivers/acpi/fan_hwmon.c | 10 +++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/drivers/acpi/fan.h b/drivers/acpi/fan.h index d39bb6fd1326..022bc215cdbc 100644 --- a/drivers/acpi/fan.h +++ b/drivers/acpi/fan.h @@ -11,6 +11,7 @@ #define _ACPI_FAN_H_ =20 #include +#include =20 #define ACPI_FAN_DEVICE_IDS \ {"INT3404", }, /* Fan */ \ @@ -60,6 +61,38 @@ struct acpi_fan { struct device_attribute fine_grain_control; }; =20 +/** + * acpi_fan_speed_valid - Check if fan speed value is valid + * @speeed: Speed value returned by the ACPI firmware + * + * Check if the fan speed value returned by the ACPI firmware is valid. Th= is function is + * necessary as ACPI firmware implementations can return 0xFFFFFFFF to sig= nal that the + * ACPI fan does not support speed reporting. Additionally, some buggy ACP= I firmware + * implementations return a value larger than the 32-bit integer value def= ined by + * the ACPI specification when using placeholder values. Such invalid valu= es are also + * detected by this function. + * + * Returns: True if the fan speed value is valid, false otherwise. + */ +static inline bool acpi_fan_speed_valid(u64 speed) +{ + return speed < U32_MAX; +} + +/** + * acpi_fan_power_valid - Check if fan power value is valid + * @power: Power value returned by the ACPI firmware + * + * Check if the fan power value returned by the ACPI firmware is valid. + * See acpi_fan_speed_valid() for details. + * + * Returns: True if the fan power value is valid, false otherwise. + */ +static inline bool acpi_fan_power_valid(u64 power) +{ + return power < U32_MAX; +} + int acpi_fan_get_fst(acpi_handle handle, struct acpi_fan_fst *fst); int acpi_fan_create_attributes(struct acpi_device *device); void acpi_fan_delete_attributes(struct acpi_device *device); diff --git a/drivers/acpi/fan_hwmon.c b/drivers/acpi/fan_hwmon.c index 4209a9923efc..5581aa6fdfa0 100644 --- a/drivers/acpi/fan_hwmon.c +++ b/drivers/acpi/fan_hwmon.c @@ -15,10 +15,6 @@ =20 #include "fan.h" =20 -/* Returned when the ACPI fan does not support speed reporting */ -#define FAN_SPEED_UNAVAILABLE U32_MAX -#define FAN_POWER_UNAVAILABLE U32_MAX - static struct acpi_fan_fps *acpi_fan_get_current_fps(struct acpi_fan *fan,= u64 control) { unsigned int i; @@ -77,7 +73,7 @@ static umode_t acpi_fan_hwmon_is_visible(const void *drvd= ata, enum hwmon_sensor_ * when the associated attribute should not be created. */ for (i =3D 0; i < fan->fps_count; i++) { - if (fan->fps[i].power !=3D FAN_POWER_UNAVAILABLE) + if (acpi_fan_power_valid(fan->fps[i].power)) return 0444; } =20 @@ -106,7 +102,7 @@ static int acpi_fan_hwmon_read(struct device *dev, enum= hwmon_sensor_types type, case hwmon_fan: switch (attr) { case hwmon_fan_input: - if (fst.speed =3D=3D FAN_SPEED_UNAVAILABLE) + if (!acpi_fan_speed_valid(fst.speed)) return -ENODEV; =20 if (fst.speed > LONG_MAX) @@ -134,7 +130,7 @@ static int acpi_fan_hwmon_read(struct device *dev, enum= hwmon_sensor_types type, if (!fps) return -EIO; =20 - if (fps->power =3D=3D FAN_POWER_UNAVAILABLE) + if (!acpi_fan_power_valid(fps->power)) return -ENODEV; =20 if (fps->power > LONG_MAX / MICROWATT_PER_MILLIWATT) --=20 2.39.5 From nobody Sun Feb 8 08:47:55 2026 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 726B725F984; Tue, 7 Oct 2025 23:42:10 +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=1759880532; cv=none; b=JR4pUlJI1McH9uVSO+TOESLMssLpl+1nzbpt5HtIwxlxwWC8Ck0GbZsZHA3K48eakIBOi3ZDvqKSvN6lA98KPIeBHzJuCT4C/N7UxYE0Q6s0sajtkZRhgArd5sDbxqDjBscMQgYBOT+SJN3OHOGbUUK3EXP7hN7aWDJ84nnHPEg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880532; c=relaxed/simple; bh=MlHP0jd+Gi1z2ooUPOaFjRaMw+08hV/BrOOkBN8UX5w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KS6NHja++cAkXABukFpSADdkr4EM9bNeH8BPlC9WCu8Se7rx3jt+xYANH9I5o1Ux+ZetgfEjWKo1oS1L5/16bsmOu9lGgWCFoJbZKWGw54n8pe6jHw0y7NNg8ScigpgnuBNEZ0d0ITlD+o1XECns+iTR0o1w71rs6IU+9O+NtvI= 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=XxTAtHqP; 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="XxTAtHqP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1759880524; x=1760485324; i=w_armin@gmx.de; bh=bWLZsCK16J6VPDI6PSn/FWwhJiH9UOgcLVn6IdHq3lk=; 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=XxTAtHqPEiZSLDv1Fq74sm75EC4zyPESkKpYydApQSLlLlle73M361MIUi49c4/R NkZaDFBylI30oulV+Bo96owKrky4w8AJUVQZ5bME7CglhAxC4+/xnZc09TzSpQJbG rQI71J6XOrnoGrWxhZjbQQghQYc1n4rH9pge/Gicj2zbjIpas0Ge01QmnupyXMdJm TrZScvWFs3P8y0KccFV3UhtWDaIG8sW250Mlg/6LBa2oISDSd520ho+gvacr5NxHd OkU/619l4AdHvxSDn2JorY88ycgoUpjcQaOqNOGuYXBGqfnR0ZwMItzD9ISBiT2nx 9JhFzYoT5QdoDGLgfQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MjjCL-1uQaut1OHr-00og63; Wed, 08 Oct 2025 01:42:04 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/6] ACPI: fan: Use platform device for devres-related actions Date: Wed, 8 Oct 2025 01:41:46 +0200 Message-Id: <20251007234149.2769-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251007234149.2769-1-W_Armin@gmx.de> References: <20251007234149.2769-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:CwqvnkJRmHarAWAcnGW1kSunDZpCEUCSkDS5bSJrEspbdNpC+rZ XUZWxKmvhCnkT07yDzjxFtWBQBxQ72TR7bkjzcYQyrozt2T7yuWiQk/ApQMry5lW+aGOya2 du3+cgNuKUldhEBSPv+ie04PrbRZBpDft+0yoiSODYc9lqM0NNcG0eRJjj1BP5o0snPkyNm YVn1I7eaRVzKElTTmmtcg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:th76yd9AJ/U=;bYVlvmZvjrejEO/ZLKdqmqpWplO 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 Content-Type: text/plain; charset="utf-8" Device-managed resources are cleaned up when the driver unbinds from the underlying device. In our case this is the platform device as this driver is a platform driver. Registering device-managed resources on the associated ACPI device will thus result in a resource leak when this driver unbinds. Ensure that any device-managed resources are only registered on the platform device to ensure that they are cleaned up during removal. Fixes: 35c50d853adc ("ACPI: fan: Add hwmon support") Signed-off-by: Armin Wolf --- drivers/acpi/fan.h | 4 ++-- drivers/acpi/fan_core.c | 2 +- drivers/acpi/fan_hwmon.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/acpi/fan.h b/drivers/acpi/fan.h index 022bc215cdbc..0d73433c3889 100644 --- a/drivers/acpi/fan.h +++ b/drivers/acpi/fan.h @@ -98,9 +98,9 @@ int acpi_fan_create_attributes(struct acpi_device *device= ); void acpi_fan_delete_attributes(struct acpi_device *device); =20 #if IS_REACHABLE(CONFIG_HWMON) -int devm_acpi_fan_create_hwmon(struct acpi_device *device); +int devm_acpi_fan_create_hwmon(struct device *dev); #else -static inline int devm_acpi_fan_create_hwmon(struct acpi_device *device) {= return 0; }; +static inline int devm_acpi_fan_create_hwmon(struct device *dev) { return = 0; }; #endif =20 #endif diff --git a/drivers/acpi/fan_core.c b/drivers/acpi/fan_core.c index ea2c646c470c..46e7fe7a506d 100644 --- a/drivers/acpi/fan_core.c +++ b/drivers/acpi/fan_core.c @@ -347,7 +347,7 @@ static int acpi_fan_probe(struct platform_device *pdev) } =20 if (fan->has_fst) { - result =3D devm_acpi_fan_create_hwmon(device); + result =3D devm_acpi_fan_create_hwmon(&pdev->dev); if (result) return result; =20 diff --git a/drivers/acpi/fan_hwmon.c b/drivers/acpi/fan_hwmon.c index 5581aa6fdfa0..47a02ef5a606 100644 --- a/drivers/acpi/fan_hwmon.c +++ b/drivers/acpi/fan_hwmon.c @@ -162,12 +162,12 @@ static const struct hwmon_chip_info acpi_fan_hwmon_ch= ip_info =3D { .info =3D acpi_fan_hwmon_info, }; =20 -int devm_acpi_fan_create_hwmon(struct acpi_device *device) +int devm_acpi_fan_create_hwmon(struct device *dev) { - struct acpi_fan *fan =3D acpi_driver_data(device); + struct acpi_fan *fan =3D dev_get_drvdata(dev); struct device *hdev; =20 - hdev =3D devm_hwmon_device_register_with_info(&device->dev, "acpi_fan", f= an, - &acpi_fan_hwmon_chip_info, NULL); + hdev =3D devm_hwmon_device_register_with_info(dev, "acpi_fan", fan, &acpi= _fan_hwmon_chip_info, + NULL); return PTR_ERR_OR_ZERO(hdev); } --=20 2.39.5 From nobody Sun Feb 8 08:47:55 2026 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 B9120261B76; Tue, 7 Oct 2025 23:42:11 +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=1759880533; cv=none; b=aeCKpjBct2Ko3x2j5w/UN4KY9EnR7ICGNM5NflVO1qXhLfMn/vFyfx7YZOj5ue5AyIUhnI6j7veIWU5e0kc5/nYRvb9vgDM4d+ogd1fWyhUF4HP4oRWOxQ/bND/hUhxTq3aGqsGm46YSn5YX7pb2+2G7Ks92G6CML/KDRDbeAR8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880533; c=relaxed/simple; bh=8gDu5zuPLk33NAmJ3WZKbijbJ8qnTqrJoej7WwiPsqg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PZX9+gd7qH/j8jHd8IveNwiWfR6zfyvC4rSQBZ0x2VsbeKZvRGtSiQRRxHYs9QEcTLmZnprvVcQdaTR26t3XxzuiZmp5Qaan9MeC63TcPOSV5ngqk8G+mLKZsVyhW6GNSlAAU71cEjKI1edEOqMzyR/I2PzEpBiRW+7dNTvgROw= 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=OStsaVJ3; 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="OStsaVJ3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1759880526; x=1760485326; 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=OStsaVJ3jx4X89owsDy1ornkRO7FRzpKIn7r5wQwBNEnSTxP/PYJie7z6R7FLxlF hsBdmxZVr/wcqOaPrgtwJ4yhwGE+Q8Uxa36DNeqU4dbgT2TKwuImxkidxIGiGrstG vembPlkReEbo8gXn1dy2N3UZ5BlfsSQAqOi1DXZYOZYUJsC42hB34s5J4K86J5Fkf TKuFRZZ22XmZFBK4odAGl/5gusp+m4F1mXJWsLZFWy++CvAnBK2FS+SVdZ/o/WnzE vRQGTmJiF/ZAxHWQRf9gNYOR/6drzRLq+t3JWD0DNPwOPRYZh7LQwRDQFpemOzylh jyK7pBG1CGAFACmsYA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MY68d-1ul9wO3dvh-00TqZT; Wed, 08 Oct 2025 01:42:06 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 4/6] ACPI: fan: Add basic notification support Date: Wed, 8 Oct 2025 01:41:47 +0200 Message-Id: <20251007234149.2769-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251007234149.2769-1-W_Armin@gmx.de> References: <20251007234149.2769-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:GjDZly3HOaBdgNzypycznTKqVTOFUVFLkbAiKf6FxKh9/8YTJdK fcvDFeAMpT7RnQZ4Gm0vc6uXXRFX65Sga0Cc5VNco62q0b0MwZ3aQ+9IIlW32VgJESFSW9i /eHUC55oFPySnG93x3vfGZxb16g85NULM6PXU61WL9hqRmtc+yKPWHsTq3BCZp67sBuiG8z Icorq/laUHCEvnV2CDHVw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:hkI5xRsF1x0=;qLHquQXYs+TeL5eMmplf+s/3icY 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 ATa1g== 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 Sun Feb 8 08:47:55 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (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 C5BD3265623; Tue, 7 Oct 2025 23:42:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880535; cv=none; b=Yp5/XjX1JWAkP0AmWphJa3NpI5OicpGQoQq47XWXZvOAv81QbVbatqq9pKe9y2N2Ggt0qAtjilDU4hiIc2cIT3RTBnlTFIglbLhpGkVVsRISbnkpTE4vbsQi/fN1jR5eQNHIBPNCYVqGNIvLHA8PSuVA1zM7HpELfW58eNSB3+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880535; c=relaxed/simple; bh=2A1PlvROXJxuvTXphRZJjOdUQe9WUmSs/dXp8vOMRkM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=iX2IdmOLg/XxsBXrQ+Qjn66cbTismAA8LBuHTv9ey18T5NRwnBw3bwObAiot+32DmN5SXc9uWE1Vjf2UkHJ3maQByzCeu8ieMTArQ7IuTUPvT7HLtnMkeukA6DjoU6UJkbJDb98xq/fznFLNnkP2yktX5f1UOKmc8YgBo1jmJOk= 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=ePRavnfV; arc=none smtp.client-ip=212.227.15.18 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="ePRavnfV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1759880527; x=1760485327; 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=ePRavnfV4YtDLRrLIG2OJT3nRKnkJ1uTOOrkXEHL/3SSa9gq57SNWcXBVA6XkdCB EViaDbGg/YsmLSwk503u9OtckPsFKWynLsDsw7DM+GTQJh3QjlGBURqZVP2KyosKq FGXBbtTZOcFCNkd0XLPWplvqJIShRxvDHjkvoixq2IH/NdyWQ8uiXomFmUb5ZGhZL Osf9kbwQjuQLyxu1WSaroGMq5at74DcGw+oxHUdwacm9ol54o3mHYDyC0xVKdPV0w uZ/snv/93IBpr8Ml0LDDAAQ+iMY9Kooam5H9rsJT7/dPc9f08I/YFPSc2V7kCVspq RGwR03iL8FXEtHZ4jQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mn2W5-1uNHWy0q7b-00o95A; Wed, 08 Oct 2025 01:42:07 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 5/6] ACPI: fan: Add hwmon notification support Date: Wed, 8 Oct 2025 01:41:48 +0200 Message-Id: <20251007234149.2769-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251007234149.2769-1-W_Armin@gmx.de> References: <20251007234149.2769-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:gXFVSIKCLbDWOCBvq60J3bePbiDFPsmlELwWBcxNsWNg3zB6WOX jd8fr7mPf/ZRC8sNHvRwHun7dr0HllUaPx5JqKcbM+SCoMXkJyrAwpSsobF9oSzNXjBI63u HGMqqOBUCShx59xQRaiS7gwnIkb2UKkkZswXmP4D14yk9rZ5d33VEWiEl1SySK4GOiR4xpS dbszQohzag6UgGbt7QIBw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:9noA5HXASkU=;mOTAPochqo3oP1zx7hU3A0eESji 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 W4QrtbS5zQIUH0dJmSSj0IE/cA= 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 Sun Feb 8 08:47:55 2026 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 72D2525F98A; Tue, 7 Oct 2025 23:42:10 +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=1759880532; cv=none; b=WkCs2AdPSrcGrnnu1oPDUX40wD871jcMFRTAH8IKTJMvPoKbqMFaO366iRuQ1+uRrmrnHW2HrJHHaTvdIKQ90k0sEQYOsB/8nn1+6MzJPMdywSdTGh4xBmbNi3Z7x6Z1P8Ct7MKJ4vXgNsf1zZrxU3D3SN4qSaze2Orp+telvAw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759880532; c=relaxed/simple; bh=1gewzFUeozQRrp9by7G5vfkOX4mluF03Eza2u5ZlQGg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DsPhcCh1+FLO0FxQDDnGRyEaO5pKRgTR+ZS9fqmrxmSGZr1toAv/bi/rMJtaBfk4Lre7XJVdef5BNiwE55A9xF4vHvUKAHTnYZwmusmLx3lLvo7OV+/SJDmKjcgyTOhSZLPkp6zAPuImfLUtjuGtBrZowDFdWjvazEV1T08dpew= 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=s8nEu0TS; 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="s8nEu0TS" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1759880528; x=1760485328; i=w_armin@gmx.de; bh=S4K9stc6lMr6tgMnCdQOnOEui0CIPld+7r+U6B5DDKc=; 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=s8nEu0TSRQmJK95piBK1sp6uGtjq1EcmBmaIXljhR9+YmNwhZIXqNgBZrmgTaplN KHaKai4b2R5gq/aBL7NfA67p4/aqrm0bfbpsXEOsDPkr2tjnf8pYdWxSN5je8XG4o 8jmDPqr5WWLjZUzi2d9xRD0ITeHvwGd8bUguE5+/Dz+S7znkWRQrowYJ0qwYPSqvQ h7DkS7GyMT+MgqO0sd0eNnBRB30E43yKQTc23SiAvufl2gqLtH9a0MKTQ4ZKLLdaN m7Pxwh2sCQ0BjWpPCFUWKdQ0uxvTpVCJ7a2MLtNGo5ueVkLaQtwuSfM/NKI7DKshb htrd2Uyq/4VildojMg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([93.202.247.91]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N7QxL-1uBpBl1Mi5-012u8G; Wed, 08 Oct 2025 01:42:08 +0200 From: Armin Wolf To: rafael@kernel.org, lenb@kernel.org Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 6/6] ACPI: fan: Add support for Microsoft fan extensions Date: Wed, 8 Oct 2025 01:41:49 +0200 Message-Id: <20251007234149.2769-7-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251007234149.2769-1-W_Armin@gmx.de> References: <20251007234149.2769-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:rZ3nuObzQogc3HGq50lw3jpGqknp51OCxMaXV1WFQx/PgYv3y/8 TDMxoOXfrUr7k7v2d2RIXzNM9l08vQ3SU26sAbXBrQ5JSYEwZGdeQvDg2pkUyG7ap5Dkopl eacr2EL1zhnVvZoddyNuI//dkBf/vjJWAhX9lwVrniP71Wj0SL8ynXBToOo+T1KKLreIxS3 4oQiBoZ5qQ5qCbUiRPpaA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:g25Ag4wUxjA=;neuTPSj7pbWFVJYHnvCyfZ2iTho 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 HKNmU+qz1ETgPwHEc= 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. 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 | 169 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 169 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..cfef767d3459 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,20 @@ =20 #define ACPI_FAN_NOTIFY_STATE_CHANGED 0x80 =20 +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 +329,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 +467,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 +543,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 +555,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 +646,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