Compare commits

..

No commits in common. "1c28932e84191c7bd9a6d80914e8920c9e796bee" and "2057831d3695f9ae27023224590bd51059c51002" have entirely different histories.

4 changed files with 64 additions and 124 deletions

View file

@ -27,13 +27,6 @@ in
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
}; };
hardware.amdgpu = {
overdrive = {
enable = true;
ppfeaturemask = "0xffffffff";
};
};
hardware.graphics.enable32Bit = true; hardware.graphics.enable32Bit = true;
hardware.graphics.extraPackages = with pkgs; [ hardware.graphics.extraPackages = with pkgs; [

View file

@ -2,144 +2,85 @@
set -e set -e
DEVICE="$1" # eg: /sys/class/drm/card1/device
HWMON=$(echo "$DEVICE"/hwmon/hwmon*)
exit() {
echo "Setting controll to auto" >&2
echo 2 > "$HWMON/pwm1_enable"
}
trap exit EXIT INT
bail() { bail() {
echo "Error: $@" >&2 echo "Error: $@" >&2
echo "Exiting..." >&2 echo "Exiting..." >&2
exit 1 exit 1
} }
map_range() { if ! [ -d "$HWMON" ]; then
VALUE="$1" bail "Invalid HWMON"
MIN_INPUT="$2" fi
MAX_INPUT="$3"
INPUT_RANGE=$(( $MAX_INPUT - $MIN_INPUT ))
MIN_OUTPUT="$4"
MAX_OUTPUT="$5"
OUTPUT_RANGE=$(( $MAX_OUTPUT - $MIN_OUTPUT ))
echo $(( ($VALUE - $MIN_INPUT) * $OUTPUT_RANGE / $INPUT_RANGE + $MIN_OUTPUT )) TEMP_INPUT="$HWMON/temp2_input"
}
clamp() { if ! [ -f $TEMP_INPUT ]; then
VALUE="$1" bail "Invalid TEMP_INPUT"
fi
MIN="$2" TEMP_MIN="$2"
MAX="$3" TEMP_MAX="$3"
VALUE=$VALUE if [ -z "$TEMP_MIN" ];then
if [ "$VALUE" -gt $MAX ]; then bail "No minimum temperature provided"
VALUE=$MAX fi
elif [ "$VALUE" -lt $MIN ]; then
VALUE=$MIN
fi
echo $VALUE if [ -z "$TEMP_MAX" ];then
} bail "No maximum temperature provided"
fi
cleanup() { PWM_MIN_PCT="$4"
echo "Setting controll to auto" >&2 PWM_MAX_PCT="$5"
if test -f "$HWMON/pwm1_enable"; then
echo 2 > "$HWMON/pwm1_enable"
fi
}
trap cleanup EXIT INT
usage() { if [ -z "$PWM_MIN_PCT" ];then
echo "Usage: $0 <device> <min-temp> <max-temp> <min-fan> <max-fan>" >&2 bail "No minimum fan speed % not provided"
echo "Example: $0 /sys/class/drm/card1/device 60 100 10 80" >&2 fi
exit 1
}
parse_cli() { if [ -z "$PWM_MAX_PCT" ];then
if test -n "$AMDGPU_FAN_CRONTROL_DEBUG"; then bail "No maximum fan speed % not provided"
echo parse_cli "$@" >&2 fi
fi
DEVICE="$1" # eg: /sys/class/drm/card1/device PWM_MIN="$(( $PWM_MIN_PCT * 255 / 100))"
HWMON=$(echo "$DEVICE"/hwmon/hwmon*) PWM_MAX="$(( $PWM_MAX_PCT * 255 / 100))"
TEMP_INPUT="$HWMON/temp2_input"
TEMP_MIN="$2" echo "Running..." >&2
TEMP_MAX="$3"
PWM_MIN_PCT="$4" echo "TEMP_MIN=$TEMP_MIN°C"
PWM_MAX_PCT="$5" echo "TEMP_MAX=$TEMP_MAX°C"
} echo "FAN_MIN=$PWM_MIN_PCT%"
echo "FAN_MAX=$PWM_MAX_PCT%"
validate_variables() { echo 1 > "$HWMON/pwm1_enable"
if ! [ -d "$HWMON" ]; then
bail "Invalid drm-device: '$HWMON' is not a directory"
fi
if ! [ -f "$TEMP_INPUT" ]; then PREV=0
bail "Error: Could not find hotspot temperature at '$TEMP_INPUT'"
fi
if [ -z "$TEMP_MIN" -o -z "$TEMP_MAX" -o -z "$PWM_MIN_PCT" -o -z "$PWM_MAX_PCT" ];then while true; do
usage
fi
}
setup() {
PWM_MIN=$(map_range $PWM_MIN_PCT 0 100 0 255)
PWM_MAX=$(map_range $PWM_MAX_PCT 0 100 0 255)
echo "Running..." >&2
if test -n "$AMDGPU_FAN_CRONTROL_DEBUG"; then
echo "TEMP_MIN=$TEMP_MIN°C" >&2
echo "TEMP_MAX=$TEMP_MAX°C" >&2
echo "FAN_MIN=$PWM_MIN_PCT% (PWM=$PWM_MIN)" >&2
echo "FAN_MAX=$PWM_MAX_PCT% (PWM=$PWM_MAX)" >&2
fi
# Set fan control mode to manual, this will be reverted in the cleanup trap
echo 1 > "$HWMON/pwm1_enable"
PREV_PWM=0
}
main_loop() {
TEMPERATURE_RAW=$(cat "$TEMP_INPUT") TEMPERATURE_RAW=$(cat "$TEMP_INPUT")
TEMPERATURE="$(( $TEMPERATURE_RAW / 1000 ))" # 60_000 = 60°C TEMPERATURE="$(( $TEMPERATURE_RAW / 1000 ))"
# Remap from a number between 60_000..90_000 to 0..255
PWM=$(( ($TEMPERATURE - $TEMP_MIN) * $PWM_MAX / ($TEMP_MAX - $TEMP_MIN) ))
# Calculate the fan speed we would want to reach given infinite time if [ "$PWM" -gt $PWM_MAX ]; then
TARGET_PWM=$(map_range $TEMPERATURE $TEMP_MIN $TEMP_MAX $PWM_MIN $PWM_MAX) PWM=$PWM_MAX
elif [ "$PWM" -lt $PWM_MIN ]; then
# Calculate an appropriate amount to "walk" in the direction of target fan speed PWM=$PWM_MIN
DIFFERENCE=$(( $TARGET_PWM - $PREV_PWM ))
ADJUSTMENT=$(( $DIFFERENCE * 20 / 100 ))
NEXT_PWM=$(( $PREV_PWM + $ADJUSTMENT ))
NEXT_PWM=$(clamp $NEXT_PWM $PWM_MIN $PWM_MAX)
NEXT_PWM_PCT=$(map_range $NEXT_PWM 0 255 0 100 )
if test -n "$AMDGPU_FAN_CRONTROL_DEBUG"; then
for var in \
"Temperature=$TEMPERATURE°C" \
"Fan speed=$NEXT_PWM_PCT%" \
; do
echo -en "$var\t"
done
echo
fi fi
# Apply the new fan speed AVG="$(( ($PWM * 20 + $PREV * 80) / 100 ))"
echo "$NEXT_PWM" > "$HWMON/pwm1"
# Wait for next iteratino echo "$AVG"
PREV_PWM="$NEXT_PWM"
echo "$AVG" > "$HWMON/pwm1"
PREV="$AVG"
sleep .1s sleep .1s
} done
main() {
parse_cli "$@"
validate_variables
setup
while true; do
main_loop
done
}
main "$@"

View file

@ -60,6 +60,12 @@
}; };
}; };
programs.corectrl.enable = true; programs.corectrl = {
enable = true;
gpuOverclock = {
enable = true;
ppfeaturemask = "0xffffffff";
};
};
}; };
} }

View file

@ -44,7 +44,7 @@
./gnome.nix ./gnome.nix
./thunar.nix ./thunar.nix
./xdg-dirs.nix ./xdg-dirs.nix
inputs.nix-index-database.homeModules.nix-index inputs.nix-index-database.hmModules.nix-index
../settings ../settings
./powerplay-led-idle.nix ./powerplay-led-idle.nix
./rm-target.nix ./rm-target.nix