192 lines
4.6 KiB
Bash
192 lines
4.6 KiB
Bash
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)
|
|
|
|
get_gpu_power_profile() {
|
|
cat /sys/class/drm/card0/device/power_dpm_state 2>/dev/null
|
|
}
|
|
|
|
gpu_power_profile() {
|
|
for card in /sys/class/drm/card*/device/power_dpm_state
|
|
do
|
|
if [ -e "${card}" ]
|
|
then
|
|
echo ${1} >${card} 2>/dev/null
|
|
fi
|
|
done
|
|
}
|
|
|
|
get_gpu_performance_level() {
|
|
case ${HW_ARCH} in
|
|
x86_64)
|
|
cat /sys/class/drm/card0/device/power_dpm_force_performance_level 2>/dev/null
|
|
;;
|
|
aarch64)
|
|
get_setting system.gpuperf
|
|
;;
|
|
esac
|
|
}
|
|
|
|
gpu_performance_level() {
|
|
case ${HW_ARCH} in
|
|
x86_64)
|
|
for card in /sys/class/drm/card*/device/power_dpm_force_performance_level
|
|
do
|
|
if [ -e "${card}" ]
|
|
then
|
|
echo ${1} >${card} 2>/dev/null
|
|
fi
|
|
done
|
|
;;
|
|
aarch64)
|
|
case ${1} in
|
|
profile_peak)
|
|
set_gpu_gov performance
|
|
;;
|
|
auto|profile_standard)
|
|
set_gpu_gov ondemand
|
|
;;
|
|
low)
|
|
set_gpu_gov powersave
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
pcie_aspm_policy() {
|
|
PCIEPOWERSAVE=$(get_setting system.power.pcie)
|
|
POWERSAVEENABLED=$(get_setting system.powersave)
|
|
if [ "${PCIEPOWERSAVE}" = "1" ] &&
|
|
[ "${POWERSAVEENABLED}" = "1" ]
|
|
then
|
|
if [ -e "/sys/module/pcie_aspm/parameters/policy" ]
|
|
then
|
|
echo ${1} >/sys/module/pcie_aspm/parameters/policy 2>/dev/null
|
|
fi
|
|
fi
|
|
}
|
|
|
|
cpu_perftune() {
|
|
if [ -n "${1}" ]
|
|
then
|
|
DESIRED_EPP=${1}
|
|
fi
|
|
CPUPOWERSAVE=$(get_setting system.power.cpu)
|
|
POWERSAVEENABLED=$(get_setting system.powersave)
|
|
CPU="$(awk '/vendor_id/ {print $3;exit}' /proc/cpuinfo)"
|
|
|
|
if [ "${CPUPOWERSAVE}" = "1" ] && \
|
|
[ "${POWERSAVEENABLED}" = "1" ]
|
|
then
|
|
case ${CPU} in
|
|
AuthenticAMD)
|
|
if [ "${1}" = "battery" ]
|
|
then
|
|
ryzenadj --power-saving >/dev/null 2>&1
|
|
else
|
|
ryzenadj --max-performance >/dev/null 2>&1
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
case ${CPU} in
|
|
AuthenticAMD)
|
|
PSTATE="amd_pstate"
|
|
STATUS="active"
|
|
WARM="passive"
|
|
;;
|
|
GenuineIntel)
|
|
PSTATE="intel_pstate"
|
|
STATUS="passive"
|
|
WARM="active"
|
|
;;
|
|
esac
|
|
|
|
if [ -f "/sys/devices/system/cpu/${PSTATE}/status" ]
|
|
then
|
|
if [ -n "${WARM}" ]
|
|
then
|
|
# Some devices need to switch before the handles are writeable (AYANEO).
|
|
echo ${WARM} >/sys/devices/system/cpu/${PSTATE}/status
|
|
fi
|
|
echo ${STATUS} >/sys/devices/system/cpu/${PSTATE}/status
|
|
while [ ! -f /sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference ]
|
|
do
|
|
sleep .25
|
|
done
|
|
for policy in $(find /sys/devices/system/cpu/cpufreq/policy*/ -name energy_performance_preference)
|
|
do
|
|
EPP=$(get_setting system.power.epp)
|
|
if [ -z "${EPP}" ]
|
|
then
|
|
EPP="balance_performance"
|
|
set_setting system.power.epp ${EPP}
|
|
fi
|
|
if [ -n "${DESIRED_EPP}" ]
|
|
then
|
|
EPP="${DESIRED_EPP}"
|
|
fi
|
|
echo ${EPP} >${policy} 2>/dev/null
|
|
done
|
|
fi
|
|
}
|
|
|
|
audio_powersave() {
|
|
POWERSAVEENABLED=$(get_setting system.powersave)
|
|
AUDIOPOWERSAVE=$(get_setting system.power.audio)
|
|
if [ "${AUDIOPOWERSAVE}" = "1" ] &&
|
|
[ "${POWERSAVEENABLED}" = "1" ]
|
|
then
|
|
for MODULE in snd_hda_intel snd_ac97_codec
|
|
do
|
|
if [ -e "/sys/module/${MODULE}/parameters/power_save" ]
|
|
then
|
|
echo ${1} >/sys/module/${MODULE}/parameters/power_save 2>/dev/null
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
runtime_power_management() {
|
|
POWERSAVEENABLED=$(get_setting system.powersave)
|
|
RTPM=$(get_setting system.power.rtpm)
|
|
if [ "${RTPM}" = "1" ] &&
|
|
[ "${POWERSAVEENABLED}" = "1" ]
|
|
then
|
|
find /sys/devices/{platform,pci*} -type f -name control -print0 2>/dev/null | \
|
|
while read -r -d '' DEVICE
|
|
do
|
|
echo ${1} >"${DEVICE}" 2>/dev/null
|
|
echo ${2} >"${DEVICE/control/autosuspend_delay_ms}" 2>/dev/null
|
|
done
|
|
fi
|
|
}
|
|
|
|
scsi_link_power_management() {
|
|
POWERSAVEENABLED=$(get_setting system.powersave)
|
|
RTPM=$(get_setting system.power.rtpm)
|
|
if [ "${RTPM}" = "1" ] &&
|
|
[ "${POWERSAVEENABLED}" = "1" ]
|
|
then
|
|
find /sys/class/scsi_host/host*/ -type f -name link_power_management_policy -print0 2>/dev/null | \
|
|
while read -r -d '' DEVICE
|
|
do
|
|
echo "${1}" >"${DEVICE}" 2>/dev/null
|
|
done
|
|
fi
|
|
}
|
|
|
|
wake_events() {
|
|
POWERSAVEENABLED=$(get_setting system.powersave)
|
|
WAKEEVENTS=$(get_setting system.power.wakeevents)
|
|
if [ "${WAKEEVENTS}" = "1" ] && \
|
|
[ "${POWERSAVEENABLED}" = "1" ]
|
|
then
|
|
for device in $(find /sys/devices/{platform,pci*} -type f -name wakeup 2>/dev/null)
|
|
do
|
|
echo ${1} >${device} 2>/dev/null
|
|
done
|
|
fi
|
|
}
|