This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

xerxes: use dynamic hwmon discovery for fan control

+75 -17
+75 -17
machines/xerxes/gpd-fan.nix
··· 1 + { pkgs, ... }: 2 + let 3 + # Find hwmon device by name and return path to specific file 4 + # Usage: findHwmon "k10temp" "temp1_input" -> /sys/class/hwmon/hwmonX/temp1_input 5 + gpd-fan-control = pkgs.writeShellScript "gpd-fan-control" '' 6 + set -euo pipefail 7 + 8 + # Configuration 9 + INTERVAL=2 10 + MINTEMP=55000 # millidegrees - fan off below this 11 + MAXTEMP=90000 # millidegrees - fan full above this 12 + MINPWM=0 13 + MAXPWM=255 14 + 15 + # Find hwmon paths by name 16 + find_hwmon() { 17 + local name=$1 18 + for hwmon in /sys/class/hwmon/hwmon*; do 19 + if [[ -f "$hwmon/name" ]] && [[ "$(cat "$hwmon/name")" == "$name" ]]; then 20 + echo "$hwmon" 21 + return 0 22 + fi 23 + done 24 + echo "ERROR: hwmon device '$name' not found" >&2 25 + return 1 26 + } 27 + 28 + FAN_HWMON=$(find_hwmon "gpdfan") 29 + TEMP_HWMON=$(find_hwmon "k10temp") 30 + 31 + PWM_FILE="$FAN_HWMON/pwm1" 32 + PWM_ENABLE="$FAN_HWMON/pwm1_enable" 33 + TEMP_FILE="$TEMP_HWMON/temp1_input" 34 + 35 + echo "Fan control: $PWM_FILE" 36 + echo "Temperature: $TEMP_FILE" 37 + 38 + # Enable manual PWM control 39 + echo 1 > "$PWM_ENABLE" 40 + 41 + cleanup() { 42 + echo "Restoring automatic fan control..." 43 + echo 0 > "$PWM_ENABLE" 2>/dev/null || true 44 + } 45 + trap cleanup EXIT 46 + 47 + while true; do 48 + TEMP=$(cat "$TEMP_FILE") 49 + 50 + if (( TEMP <= MINTEMP )); then 51 + PWM=$MINPWM 52 + elif (( TEMP >= MAXTEMP )); then 53 + PWM=$MAXPWM 54 + else 55 + # Linear interpolation 56 + PWM=$(( (TEMP - MINTEMP) * (MAXPWM - MINPWM) / (MAXTEMP - MINTEMP) + MINPWM )) 57 + fi 58 + 59 + echo "$PWM" > "$PWM_FILE" 60 + sleep "$INTERVAL" 61 + done 62 + ''; 63 + in 1 64 { 2 - # Load modules in explicit order for stable hwmon numbering 3 - # gpd_fan -> hwmon2, k10temp -> hwmon3 (loaded before ACPI devices) 4 65 boot.kernelModules = [ 5 66 "gpd_fan" 6 67 "k10temp" 7 68 ]; 8 69 9 - hardware.fancontrol = { 10 - enable = true; 11 - config = '' 12 - INTERVAL=2 13 - DEVPATH=hwmon2=devices/platform/gpd_fan hwmon3=devices/pci0000:00/0000:00:18.3 14 - DEVNAME=hwmon2=gpdfan hwmon3=k10temp 15 - FCTEMPS=hwmon2/pwm1=hwmon3/temp1_input 16 - FCFANS=hwmon2/pwm1=hwmon2/fan1_input 17 - MINTEMP=hwmon2/pwm1=45 18 - MAXTEMP=hwmon2/pwm1=85 19 - MINSTART=hwmon2/pwm1=40 20 - MINSTOP=hwmon2/pwm1=30 21 - MINPWM=hwmon2/pwm1=0 22 - MAXPWM=hwmon2/pwm1=255 23 - ''; 70 + # Disable the built-in fancontrol (it uses brittle hwmon numbers) 71 + hardware.fancontrol.enable = false; 72 + 73 + systemd.services.gpd-fan-control = { 74 + description = "GPD Fan Control (dynamic hwmon discovery)"; 75 + wantedBy = [ "multi-user.target" ]; 76 + after = [ "systemd-modules-load.service" ]; 77 + serviceConfig = { 78 + ExecStart = gpd-fan-control; 79 + Restart = "always"; 80 + RestartSec = 5; 81 + }; 24 82 }; 25 83 }