diff --git a/hosts/monolith/amdgpu.nix b/hosts/monolith/amdgpu.nix index 881930a..2554500 100644 --- a/hosts/monolith/amdgpu.nix +++ b/hosts/monolith/amdgpu.nix @@ -27,13 +27,6 @@ in wantedBy = [ "multi-user.target" ]; }; - hardware.amdgpu = { - overdrive = { - enable = true; - ppfeaturemask = "0xffffffff"; - }; - }; - hardware.graphics.enable32Bit = true; hardware.graphics.extraPackages = with pkgs; [ diff --git a/scripts/amd-fan-control b/scripts/amd-fan-control index e014acf..5b0d7a9 100755 --- a/scripts/amd-fan-control +++ b/scripts/amd-fan-control @@ -2,144 +2,85 @@ 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() { echo "Error: $@" >&2 echo "Exiting..." >&2 exit 1 } -map_range() { - VALUE="$1" - MIN_INPUT="$2" - MAX_INPUT="$3" - INPUT_RANGE=$(( $MAX_INPUT - $MIN_INPUT )) - MIN_OUTPUT="$4" - MAX_OUTPUT="$5" - OUTPUT_RANGE=$(( $MAX_OUTPUT - $MIN_OUTPUT )) +if ! [ -d "$HWMON" ]; then + bail "Invalid HWMON" +fi - echo $(( ($VALUE - $MIN_INPUT) * $OUTPUT_RANGE / $INPUT_RANGE + $MIN_OUTPUT )) -} +TEMP_INPUT="$HWMON/temp2_input" -clamp() { - VALUE="$1" +if ! [ -f $TEMP_INPUT ]; then + bail "Invalid TEMP_INPUT" +fi - MIN="$2" - MAX="$3" +TEMP_MIN="$2" +TEMP_MAX="$3" - VALUE=$VALUE - if [ "$VALUE" -gt $MAX ]; then - VALUE=$MAX - elif [ "$VALUE" -lt $MIN ]; then - VALUE=$MIN - fi +if [ -z "$TEMP_MIN" ];then + bail "No minimum temperature provided" +fi - echo $VALUE -} +if [ -z "$TEMP_MAX" ];then + bail "No maximum temperature provided" +fi -cleanup() { - echo "Setting controll to auto" >&2 - if test -f "$HWMON/pwm1_enable"; then - echo 2 > "$HWMON/pwm1_enable" - fi -} -trap cleanup EXIT INT +PWM_MIN_PCT="$4" +PWM_MAX_PCT="$5" -usage() { - echo "Usage: $0 " >&2 - echo "Example: $0 /sys/class/drm/card1/device 60 100 10 80" >&2 - exit 1 -} +if [ -z "$PWM_MIN_PCT" ];then + bail "No minimum fan speed % not provided" +fi -parse_cli() { - if test -n "$AMDGPU_FAN_CRONTROL_DEBUG"; then - echo parse_cli "$@" >&2 - fi +if [ -z "$PWM_MAX_PCT" ];then + bail "No maximum fan speed % not provided" +fi - DEVICE="$1" # eg: /sys/class/drm/card1/device - HWMON=$(echo "$DEVICE"/hwmon/hwmon*) - TEMP_INPUT="$HWMON/temp2_input" +PWM_MIN="$(( $PWM_MIN_PCT * 255 / 100))" +PWM_MAX="$(( $PWM_MAX_PCT * 255 / 100))" - TEMP_MIN="$2" - TEMP_MAX="$3" +echo "Running..." >&2 - PWM_MIN_PCT="$4" - PWM_MAX_PCT="$5" -} +echo "TEMP_MIN=$TEMP_MIN°C" +echo "TEMP_MAX=$TEMP_MAX°C" +echo "FAN_MIN=$PWM_MIN_PCT%" +echo "FAN_MAX=$PWM_MAX_PCT%" -validate_variables() { - if ! [ -d "$HWMON" ]; then - bail "Invalid drm-device: '$HWMON' is not a directory" - fi +echo 1 > "$HWMON/pwm1_enable" - if ! [ -f "$TEMP_INPUT" ]; then - bail "Error: Could not find hotspot temperature at '$TEMP_INPUT'" - fi +PREV=0 - if [ -z "$TEMP_MIN" -o -z "$TEMP_MAX" -o -z "$PWM_MIN_PCT" -o -z "$PWM_MAX_PCT" ];then - 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() { +while true; do 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 - TARGET_PWM=$(map_range $TEMPERATURE $TEMP_MIN $TEMP_MAX $PWM_MIN $PWM_MAX) - - # Calculate an appropriate amount to "walk" in the direction of target fan speed - 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 + if [ "$PWM" -gt $PWM_MAX ]; then + PWM=$PWM_MAX + elif [ "$PWM" -lt $PWM_MIN ]; then + PWM=$PWM_MIN fi - # Apply the new fan speed - echo "$NEXT_PWM" > "$HWMON/pwm1" + AVG="$(( ($PWM * 20 + $PREV * 80) / 100 ))" - # Wait for next iteratino - PREV_PWM="$NEXT_PWM" + echo "$AVG" + + echo "$AVG" > "$HWMON/pwm1" + PREV="$AVG" sleep .1s -} - -main() { - parse_cli "$@" - validate_variables - setup - while true; do - main_loop - done -} - -main "$@" +done diff --git a/system/gaming.nix b/system/gaming.nix index bc9d0c1..e79353e 100644 --- a/system/gaming.nix +++ b/system/gaming.nix @@ -60,6 +60,12 @@ }; }; - programs.corectrl.enable = true; + programs.corectrl = { + enable = true; + gpuOverclock = { + enable = true; + ppfeaturemask = "0xffffffff"; + }; + }; }; } diff --git a/user/home.nix b/user/home.nix index d455a28..1aaa38e 100644 --- a/user/home.nix +++ b/user/home.nix @@ -44,7 +44,7 @@ ./gnome.nix ./thunar.nix ./xdg-dirs.nix - inputs.nix-index-database.homeModules.nix-index + inputs.nix-index-database.hmModules.nix-index ../settings ./powerplay-led-idle.nix ./rm-target.nix