Añadido Change_Powerv2
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env bash
|
||||
# Robust power profile applier: nunca peta y siempre intenta un fallback.
|
||||
# Uso: power_profile.sh [ac|bat] (si no pasas arg, autodetecta con AC0/online)
|
||||
|
||||
# --- Config perfiles ---
|
||||
AC_GOV="performance"
|
||||
BAT_GOV="schedutil" # fallback a powersave si no existe
|
||||
AC_EPP="performance" # si hay amd-pstate-epp; si no, ignorado
|
||||
BAT_EPP="balance_power"
|
||||
AC_BOOST="1" # si /sys/devices/system/cpu/cpufreq/boost existe
|
||||
BAT_BOOST="0"
|
||||
|
||||
MODE="${1:-}"
|
||||
|
||||
log(){ echo "[power-profile] $*"; logger -t power-profile -- "$*"; }
|
||||
|
||||
# Autodetecta modo si no se pasa arg
|
||||
if [[ -z "$MODE" ]]; then
|
||||
if [[ -r /sys/class/power_supply/AC0/online ]] && [[ "$(cat /sys/class/power_supply/AC0/online 2>/dev/null)" == "1" ]]; then
|
||||
MODE="ac"
|
||||
else
|
||||
MODE="bat"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Normaliza modo
|
||||
case "$MODE" in
|
||||
ac|AC) MODE="ac" ;;
|
||||
bat|battery|BAT) MODE="bat" ;;
|
||||
*) log "Modo inválido: '$MODE' (usa ac|bat)"; exit 0 ;;
|
||||
esac
|
||||
|
||||
read_avail_govs() {
|
||||
local f="/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"
|
||||
[[ -r "$f" ]] && cat "$f" || echo "" # puede venir vacío con algunos drivers
|
||||
}
|
||||
|
||||
try_set_governor() {
|
||||
local desired="$1"
|
||||
local alt1 alt2
|
||||
# Orden de preferencia de fallback según modo
|
||||
if [[ "$MODE" == "ac" ]]; then
|
||||
alt1="performance"; alt2="schedutil"
|
||||
else
|
||||
alt1="schedutil"; alt2="powersave"
|
||||
fi
|
||||
local applied=""
|
||||
local govs_to_try=("$desired" "$alt1" "$alt2" "powersave" "performance" "schedutil")
|
||||
# Elimina duplicados manteniendo orden
|
||||
local uniq=(); local seen=""
|
||||
for g in "${govs_to_try[@]}"; do
|
||||
[[ "$seen" =~ (^| )"$g"( |$) ]] || { uniq+=("$g"); seen+="$g "; }
|
||||
done
|
||||
# Si sabemos los disponibles, filtra
|
||||
local avail; avail="$(read_avail_govs)"
|
||||
if [[ -n "$avail" ]]; then
|
||||
local filtered=()
|
||||
for g in "${uniq[@]}"; do
|
||||
grep -qw -- "$g" <<<"$avail" && filtered+=("$g")
|
||||
done
|
||||
[[ ${#filtered[@]} -gt 0 ]] && uniq=("${filtered[@]}")
|
||||
fi
|
||||
for g in "${uniq[@]}"; do
|
||||
local ok=1
|
||||
for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
|
||||
[[ -w "$f" ]] || continue
|
||||
printf "%s" "$g" > "$f" 2>/dev/null || { ok=0; break; }
|
||||
done
|
||||
if [[ $ok -eq 1 ]]; then applied="$g"; break; fi
|
||||
done
|
||||
if [[ -n "$applied" ]]; then
|
||||
log "governor=$applied"
|
||||
else
|
||||
log "no se pudo aplicar ningún governor (driver/permisos)."
|
||||
fi
|
||||
}
|
||||
|
||||
set_epp_all() {
|
||||
local epp="$1"
|
||||
shopt -s nullglob
|
||||
local files=(/sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference)
|
||||
[[ ${#files[@]} -eq 0 ]] && return 0
|
||||
for f in "${files[@]}"; do
|
||||
printf "%s" "$epp" > "$f" 2>/dev/null || true
|
||||
done
|
||||
log "epp=$epp"
|
||||
}
|
||||
|
||||
set_boost() {
|
||||
local v="$1" f="/sys/devices/system/cpu/cpufreq/boost"
|
||||
[[ -w "$f" ]] && { printf "%s" "$v" > "$f" 2>/dev/null || true; log "boost=$v"; }
|
||||
}
|
||||
|
||||
apply_ac() {
|
||||
try_set_governor "$AC_GOV"
|
||||
set_epp_all "$AC_EPP"
|
||||
set_boost "$AC_BOOST"
|
||||
}
|
||||
apply_bat() {
|
||||
try_set_governor "$BAT_GOV"
|
||||
set_epp_all "$BAT_EPP"
|
||||
set_boost "$BAT_BOOST"
|
||||
}
|
||||
|
||||
if [[ "$MODE" == "ac" ]]; then
|
||||
apply_ac
|
||||
else
|
||||
apply_bat
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user