#!/bin/sh
# ESO Kernel adaptive tuning (only acts on a running *-eso kernel).
#   eso-kernel-tune auto          plugged in / desktop -> gaming, laptop on battery -> battery
#   eso-kernel-tune performance   ESO Performance mode / Game Mode
#   eso-kernel-tune battery
P=/sys/kernel/debug/sched/preempt
case "$(uname -r)" in *-eso) ;; *) exit 0 ;; esac
[ -e "$P" ] || mount -t debugfs none /sys/kernel/debug 2>/dev/null || true

on_battery() {
  bat=0
  for s in /sys/class/power_supply/*; do
    [ -r "$s/type" ] || continue
    case "$(cat "$s/type")" in
      Mains|USB) [ "$(cat "$s/online" 2>/dev/null)" = 1 ] && return 1 ;;
      Battery) [ "$(cat "$s/scope" 2>/dev/null)" = Device ] || bat=1 ;;
    esac
  done
  [ "$bat" = 1 ]
}
apply() {  # preempt-mode
  [ -w "$P" ] && echo "$1" > "$P" 2>/dev/null
  [ -w /proc/sys/kernel/sched_bore ] && echo 1 > /proc/sys/kernel/sched_bore
  mkdir -p /run/eso-kernel && echo "$2" > /run/eso-kernel/mode
}
mode=${1:-auto}
if [ "$mode" = auto ]; then
  [ -f /run/eso-kernel/forced ] && exit 0      # Performance mode is on: leave it
  if on_battery; then mode=battery; else mode=gaming; fi
fi
case "$mode" in
  performance) mkdir -p /run/eso-kernel && touch /run/eso-kernel/forced; apply full performance ;;
  gaming)      apply full gaming ;;
  battery)     apply lazy battery ;;
  release)     rm -f /run/eso-kernel/forced; exec "$0" auto ;;
  *) echo "usage: eso-kernel-tune auto|performance|battery|release" >&2; exit 2 ;;
esac
exit 0
