Hi, I would like to report what appears to be a missing driver feature rather than a bug, and to offer my machine as a test platform if that is useful.
On a Lenovo ThinkPad T490 running OpenBSD 7.9, the CPU fan runs continuously at a high fixed speed and never steps down, even when temperatures are low. I have been unable to find any writable interface in OpenBSD to set or lower the fan level. == Summary == acpithinkpad(4) attaches and exposes ThinkPad temperature and fan-speed sensors, but provides no writable fan-level control. As a result the embedded controller's built-in fan curve runs unchecked and holds the fan at a high RPM regardless of actual thermal load. On the same physical laptop, FreeBSD's acpi_ibm(4) writes the fan level (the HFSP register in EC space) and the fan steps down normally. The hardware therefore clearly supports a write path to fan control; it simply is not implemented in acpithinkpad(4) at present. == Hardware == - Lenovo ThinkPad T490 - Intel Core i5-10210U - OpenBSD 7.9 (release), GENERIC.MP, amd64 == Symptom == - Fan sits at a fixed high speed (around 3640 RPM) and never steps down. - CPU temperature around 50 C, acpithinkpad/acpitz around 49 C. Temperatures are well within normal range and do not justify the fan speed. - Behaviour is identical on AC and on battery, so this is not the known AC-power firmware quirk. The readings below were captured on battery. == What I have tried == - obsdfreqd running with apmd disabled, confirmed via rcctl. The two daemons are not in conflict. - Capping the CPU clock with obsdfreqd -t 55 had no effect on fan speed. - acpithinkpad(4) provides fan-speed and temperature sensors but they are read-only. I could not locate any sysctl or other interface to set a fan level. - Searched sysctl hw.sensors and the acpithinkpad(4) man page for any writable fan control; none found. == Cross-OS data point == The same T490 ran quiet under both FreeBSD 14.4 and FreeBSD 15. FreeBSD's acpi_ibm(4) exposes a writable fan level and overrides the firmware curve, after which the fan steps down normally. This strongly indicates the embedded controller supports a write path that OpenBSD's acpithinkpad(4) does not currently use. == uname -a == OpenBSD emilio.my.domain 7.9 GENERIC.MP#449 amd64 == dmesg (acpithinkpad lines) == acpithinkpad0 at acpi0: version 2.0 == sysctl hw.sensors == hw.sensors.cpu0.temp0=50.00 degC hw.sensors.cpu0.frequency0=1200000000.00 Hz hw.sensors.cpu1.frequency0=2700000000.00 Hz hw.sensors.cpu2.frequency0=2200000000.00 Hz hw.sensors.cpu3.frequency0=1900000000.00 Hz hw.sensors.acpithinkpad0.temp0=49.00 degC hw.sensors.acpithinkpad0.fan0=3640 RPM hw.sensors.acpithinkpad0.indicator0=Off (port replicator), UNKNOWN hw.sensors.acpiac0.indicator0=Off (power supply) hw.sensors.acpibat0.volt0=11.52 VDC (voltage) hw.sensors.acpibat0.volt1=11.57 VDC (current voltage) hw.sensors.acpibat0.power0=16.47 W (rate) hw.sensors.acpibat0.watthour0=40.00 Wh (last full capacity) hw.sensors.acpibat0.watthour1=2.00 Wh (warning capacity) hw.sensors.acpibat0.watthour2=0.20 Wh (low capacity) hw.sensors.acpibat0.watthour3=31.11 Wh (remaining capacity), OK hw.sensors.acpibat0.watthour4=51.00 Wh (design capacity) hw.sensors.acpibat0.raw0=1 (battery discharging), OK hw.sensors.acpibat0.raw1=402 (discharge cycles) hw.sensors.acpibtn1.indicator0=On (lid open) hw.sensors.acpitz0.temp0=49.00 degC (zone temperature) hw.sensors.pchtemp0.temp0=46.00 degC hw.sensors.nvme0.temp0=34.00 degC, OK hw.sensors.nvme0.percent0=1.00% (endurance used), OK hw.sensors.nvme0.percent1=100.00% (available spare), OK hw.sensors.softraid0.drive0=online (sd1), OK == Offer == I am happy to run patches, diagnostics, or test kernels on this exact machine and report back results. If writable fan control is feasible for acpithinkpad(4), I would gladly help test an implementation against the same hardware where FreeBSD's acpi_ibm(4) is known to work. Thank you for your work on OpenBSD.
