First, remove the init.d script registration: sudo update-rc.d performance_governors.sh remove
Create a systemd service file: sudo nano /etc/systemd/system/performance_governors.service
Add this content:
[Unit]
Description=Set CPU and GPU governor to performance
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/init.d/performance_governors.sh start
ExecStop=/etc/init.d/performance_governors.sh stop
[Install]
WantedBy=multi-user.target
Reload systemd to recognize the new service:
sudo systemctl daemon-reload
Reload systemd to recognize the new service: sudo systemctl daemon-reload
Enable and start the service:
sudo systemctl enable performance_governors
sudo systemctl start performance_governors
Check the status: sudo systemctl status performance_governors
#!/bin/bash
### BEGIN INIT INFO
# Provides: performance_governors
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: CPU Performance Governors
# Description: Script to manage CPU performance governor settings for RK3588
### END INIT INFO
# Source function library
. /lib/lsb/init-functions
# Path to the log file
LOG="/var/log/performance_governors.log"
# Function to write to log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG"
}
# Function to set governor
set_governor() {
local path="$1"
if [ -f "$path" ]; then
echo performance > "$path" 2>/dev/null
if [ $? -eq 0 ]; then
log_message "Successfully set performance governor for $path"
return 0
else
log_message "Failed to set performance governor for $path"
return 1
fi
else
log_message "Path does not exist: $path"
return 1
fi
}
# Function to start the service
do_start() {
log_message "Starting performance governors"
local governors=(
"/sys/class/devfreq/fb000000.gpu/governor"
"/sys/devices/system/cpu/cpufreq/policy0/scaling_governor"
"/sys/devices/system/cpu/cpufreq/policy4/scaling_governor"
"/sys/devices/system/cpu/cpufreq/policy6/scaling_governor"
"/sys/class/devfreq/dmc/governor"
"/sys/class/devfreq/fdab0000.npu/governor"
)
local failed=0
for governor in "${governors[@]}"; do
set_governor "$governor" || failed=1
done
if [ $failed -eq 0 ]; then
log_message "All performance governors set successfully"
return 0
else
log_message "Some governors failed to set"
return 1
fi
}
# Function to stop the service (reset to default)
do_stop() {
log_message "Stopping performance governors (resetting to default)"
return 0
}
# Function to check status
do_status() {
local failed=0
for governor in /sys/devices/system/cpu/cpufreq/policy*/scaling_governor; do
if [ -f "$governor" ]; then
current=$(cat "$governor")
echo "Current governor for $governor: $current"
[ "$current" != "performance" ] && failed=1
fi
done
return $failed
}
# Main script logic
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
status)
do_status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit $?