lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20240915171953.163220-2-peter@piie.net>
Date: Sun, 15 Sep 2024 19:19:53 +0200
From: Peter Kaestle <peter@...e.net>
To: linux-pm@...r.kernel.org
Cc: rjw@...ysocki.net,
	daniel.lezcano@...aro.org,
	linux-kernel@...r.kernel.org,
	rui.zhang@...el.com,
	lukasz.luba@....com,
	Peter Kaestle <peter@...e.net>
Subject: [PATCH 1/1] acerhdf: clean-up and remove interval parameter

refactoring and cleaning up:
 * calling acerhdf_check_param() inside acerhdf_register_thermal()
   to ensure the trip points are setup according the values given
   for fanon/fanoff parameters when doing modprobe.
 * remove dynamical kernelmode handling, as users anyhow enable
   kernelmode already at insmod / modprobe and it simplifies the
   code and testing a lot.
 * beautify return code handling in acerhdf_register_thermal().
 * removal of interval parameter as the thermal layer is handling
   it differently now and the original intention of lowering the
   temperature polling frequency does not work the same anymore.

Signed-off-by: Peter Kästle <peter@...e.net>
---
 drivers/platform/x86/acerhdf.c | 95 +++++-----------------------------
 1 file changed, 12 insertions(+), 83 deletions(-)

diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index 018c48429616..e3e9c2cb73a7 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -4,7 +4,7 @@
  *           of the aspire one netbook, turns on/off the fan
  *           as soon as the upper/lower threshold is reached.
  *
- * (C) 2009 - Peter Kaestle     peter (a) piie.net
+ * (C) 2024 - Peter Kaestle     peter (a) piie.net
  *                              https://piie.net
  *     2009 Borislav Petkov	bp (a) alien8.de
  *
@@ -37,7 +37,7 @@
  */
 #undef START_IN_KERNEL_MODE
 
-#define DRV_VER "0.7.0"
+#define DRV_VER "1.0.0"
 
 /*
  * According to the Atom N270 datasheet,
@@ -51,6 +51,7 @@
 #define ACERHDF_TEMP_CRIT 89000
 #define ACERHDF_FAN_OFF 0
 #define ACERHDF_FAN_AUTO 1
+#define ACERHDF_INTERVAL 1000
 
 /*
  * No matter what value the user puts into the fanon variable, turn on the fan
@@ -58,20 +59,12 @@
  */
 #define ACERHDF_MAX_FANON 80000
 
-/*
- * Maximum interval between two temperature checks is 15 seconds, as the die
- * can get hot really fast under heavy load (plus we shouldn't forget about
- * possible impact of _external_ aggressive sources such as heaters, sun etc.)
- */
-#define ACERHDF_MAX_INTERVAL 15
-
 #ifdef START_IN_KERNEL_MODE
 static int kernelmode = 1;
 #else
 static int kernelmode;
 #endif
 
-static unsigned int interval = 10;
 static unsigned int fanon = ACERHDF_DEFAULT_TEMP_FANON;
 static unsigned int fanoff = ACERHDF_DEFAULT_TEMP_FANOFF;
 static unsigned int verbose;
@@ -328,7 +321,7 @@ static void acerhdf_change_fanstate(int state)
 	}
 }
 
-static void acerhdf_check_param(struct thermal_zone_device *thermal)
+static void acerhdf_check_param(void)
 {
 	if (fanon > ACERHDF_MAX_FANON) {
 		pr_err("fanon temperature too high, set to %d\n",
@@ -344,24 +337,10 @@ static void acerhdf_check_param(struct thermal_zone_device *thermal)
 
 	trips[0].temperature = fanon;
 	trips[0].hysteresis  = fanon - fanoff;
-
-	if (kernelmode) {
-		if (interval > ACERHDF_MAX_INTERVAL) {
-			pr_err("interval too high, set to %d\n",
-			       ACERHDF_MAX_INTERVAL);
-			interval = ACERHDF_MAX_INTERVAL;
-		}
-
-		if (verbose)
-			pr_notice("interval changed to: %d\n", interval);
-	}
 }
 
 /*
- * This is the thermal zone callback which does the delayed polling of the fan
- * state. We do check /sysfs-originating settings here in acerhdf_check_param()
- * as late as the polling interval is since we can't do that in the respective
- * accessors of the module parameters.
+ * Thermal zone callback used to poll the temperature
  */
 static int acerhdf_get_ec_temp(struct thermal_zone_device *thermal, int *t)
 {
@@ -410,33 +389,9 @@ static int acerhdf_unbind(struct thermal_zone_device *thermal,
 static inline void acerhdf_revert_to_bios_mode(void)
 {
 	acerhdf_change_fanstate(ACERHDF_FAN_AUTO);
-	kernelmode = 0;
 
 	pr_notice("kernel mode fan control OFF\n");
 }
-static inline void acerhdf_enable_kernelmode(void)
-{
-	kernelmode = 1;
-
-	pr_notice("kernel mode fan control ON\n");
-}
-
-/*
- * set operation mode;
- * enabled: the thermal layer of the kernel takes care about
- *          the temperature and the fan.
- * disabled: the BIOS takes control of the fan.
- */
-static int acerhdf_change_mode(struct thermal_zone_device *thermal,
-			       enum thermal_device_mode mode)
-{
-	if (mode == THERMAL_DEVICE_DISABLED && kernelmode)
-		acerhdf_revert_to_bios_mode();
-	else if (mode == THERMAL_DEVICE_ENABLED && !kernelmode)
-		acerhdf_enable_kernelmode();
-
-	return 0;
-}
 
 static int acerhdf_get_crit_temp(struct thermal_zone_device *thermal,
 				 int *temperature)
@@ -450,7 +405,6 @@ static struct thermal_zone_device_ops acerhdf_dev_ops = {
 	.bind = acerhdf_bind,
 	.unbind = acerhdf_unbind,
 	.get_temp = acerhdf_get_ec_temp,
-	.change_mode = acerhdf_change_mode,
 	.get_crit_temp = acerhdf_get_crit_temp,
 };
 
@@ -584,13 +538,11 @@ static int __init acerhdf_check_hardware(void)
 	if (force_bios[0]) {
 		version = force_bios;
 		pr_info("forcing BIOS version: %s\n", version);
-		kernelmode = 0;
 	}
 
 	if (force_product[0]) {
 		product = force_product;
 		pr_info("forcing BIOS product: %s\n", product);
-		kernelmode = 0;
 	}
 
 	if (verbose)
@@ -627,10 +579,8 @@ static int __init acerhdf_check_hardware(void)
 	 * if started with kernel mode off, prevent the kernel from switching
 	 * off the fan
 	 */
-	if (!kernelmode) {
-		pr_notice("Fan control off, to enable do:\n");
-		pr_notice("echo -n \"enabled\" > /sys/class/thermal/thermal_zoneN/mode # N=0,1,2...\n");
-	}
+	if (!kernelmode)
+		pr_notice("Fan control off, to enable insmod/modprobe with 'kernelmode=1'\n");
 
 	return 0;
 }
@@ -669,7 +619,7 @@ static void acerhdf_unregister_platform(void)
 
 static int __init acerhdf_register_thermal(void)
 {
-	int ret;
+	int ret = 0;
 
 	cl_dev = thermal_cooling_device_register("acerhdf-fan", NULL,
 						 &acerhdf_cooling_ops);
@@ -677,10 +627,12 @@ static int __init acerhdf_register_thermal(void)
 	if (IS_ERR(cl_dev))
 		return -EINVAL;
 
+	acerhdf_check_param();
+
 	thz_dev = thermal_zone_device_register_with_trips("acerhdf", trips, ARRAY_SIZE(trips),
 							  NULL, &acerhdf_dev_ops,
 							  &acerhdf_zone_params, 0,
-							  (kernelmode) ? interval*1000 : 0);
+							  ACERHDF_INTERVAL);
 	if (IS_ERR(thz_dev))
 		return -EINVAL;
 
@@ -688,10 +640,8 @@ static int __init acerhdf_register_thermal(void)
 		ret = thermal_zone_device_enable(thz_dev);
 	else
 		ret = thermal_zone_device_disable(thz_dev);
-	if (ret)
-		return ret;
 
-	return 0;
+	return ret;
 }
 
 static void acerhdf_unregister_thermal(void)
@@ -769,24 +719,3 @@ MODULE_ALIAS("dmi:*:*Acer*:pnExtensa*5420*:");
 
 module_init(acerhdf_init);
 module_exit(acerhdf_exit);
-
-static int interval_set_uint(const char *val, const struct kernel_param *kp)
-{
-	int ret;
-
-	ret = param_set_uint(val, kp);
-	if (ret)
-		return ret;
-
-	acerhdf_check_param(thz_dev);
-
-	return 0;
-}
-
-static const struct kernel_param_ops interval_ops = {
-	.set = interval_set_uint,
-	.get = param_get_uint,
-};
-
-module_param_cb(interval, &interval_ops, &interval, 0000);
-MODULE_PARM_DESC(interval, "Polling interval of temperature check");
-- 
2.46.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ