#!/usr/bin/env bash
# Disable deep CPU C-states so Vcore stays at a higher baseline and the VRM
# doesn't have to slam from C6/C7 idle back to full current on every workload
# transient. Reduces transient-demand magnitude; does NOT fix root-cause PSU
# or VRM degradation, but often reduces crash frequency on aging boards.
#
# Leaves C0 + C1 enabled (basic halt). Disables C2+ (package C-states).
#
# Reversible: run with `--restore` to re-enable everything.

set -o pipefail

log() { printf '[%s] apricot-cstate-tune: %s\n' "$(date --iso-8601=s)" "$*"; }

mode="${1:-apply}"

case "$mode" in
    apply)
        n_cpus=$(ls -d /sys/devices/system/cpu/cpu[0-9]* 2>/dev/null | wc -l)
        disabled=0
        for s in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
            [ -w "$s" ] || continue
            idx="${s%/disable}"; idx="${idx##*state}"
            # Keep states 0 (POLL/C0) and 1 (C1/halt); disable 2+.
            if (( idx >= 2 )); then
                echo 1 > "$s" 2>/dev/null && disabled=$(( disabled + 1 ))
            fi
        done
        log "disabled $disabled idle-state entries across $n_cpus CPUs (kept C0+C1)"
        ;;
    restore)
        enabled=0
        for s in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
            [ -w "$s" ] || continue
            echo 0 > "$s" 2>/dev/null && enabled=$(( enabled + 1 ))
        done
        log "re-enabled $enabled idle-state entries"
        ;;
    status)
        printf 'cpu0 idle states:\n'
        for d in /sys/devices/system/cpu/cpu0/cpuidle/state*; do
            [ -d "$d" ] || continue
            name=$(cat "$d/name" 2>/dev/null)
            dis=$(cat "$d/disable" 2>/dev/null)
            printf '  %s  disable=%s  name=%s\n' "$(basename "$d")" "$dis" "$name"
        done
        ;;
    *)
        echo "usage: $0 {apply|restore|status}" >&2
        exit 2
        ;;
esac
