From f10be280d541fe9aae591a9e1001f62453df2183 Mon Sep 17 00:00:00 2001
From: Akash Kothari <akashk4@tyler.cs.illinois.edu>
Date: Mon, 8 Feb 2021 11:59:35 -0600
Subject: [PATCH] Add jetson_clocks script for TX2

---
 .../hpvm-c/scripts/jetson_clocks.sh           | 400 ++++++++++++++++++
 1 file changed, 400 insertions(+)
 create mode 100755 hpvm/test/dnn_benchmarks/hpvm-c/scripts/jetson_clocks.sh

diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/scripts/jetson_clocks.sh b/hpvm/test/dnn_benchmarks/hpvm-c/scripts/jetson_clocks.sh
new file mode 100755
index 0000000000..a15af4ba73
--- /dev/null
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/scripts/jetson_clocks.sh
@@ -0,0 +1,400 @@
+#!/bin/bash
+# Copyright (c) 2015-2017, NVIDIA CORPORATION. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#  * Neither the name of NVIDIA CORPORATION nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+CONF_FILE=${HOME}/l4t_dfs.conf
+RED='\e[0;31m'
+GREEN='\e[0;32m'
+BLUE='\e[0;34m'
+BRED='\e[1;31m'
+BGREEN='\e[1;32m'
+BBLUE='\e[1;34m'
+NC='\e[0m' # No Color
+
+usage()
+{
+	if [ "$1" != "" ]; then
+		echo -e ${RED}"$1"${NC}
+	fi
+
+		cat >& 2 <<EOF
+Maximize jetson performance by setting static max frequency to CPU, GPU and EMC clocks.
+Usage:
+jetson_clocks.sh [options]
+  options,
+  --show             display current settings
+  --store [file]     store current settings to a file (default: \${HOME}/l4t_dfs.conf)
+  --restore [file]   restore saved settings from a file (default: \${HOME}/l4t_dfs.conf)
+  run jetson_clocks.sh without any option to set static max frequency to CPU, GPU and EMC clocks.
+EOF
+
+	exit 0
+}
+
+restore()
+{
+	for conf in `cat "${CONF_FILE}"`; do
+		file=`echo $conf | cut -f1 -d :`
+		data=`echo $conf | cut -f2 -d :`
+		case "${file}" in
+			/sys/devices/system/cpu/cpu*/online |\
+			/sys/kernel/debug/clk/override*/state)
+				if [ `cat $file` -ne $data ]; then
+					echo "${data}" > "${file}"
+				fi
+				;;
+			/sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq |\
+			/sys/kernel/debug/tegra_cpufreq/*_CLUSTER/cc3/enable)
+				echo "${data}" > "${file}" 2>/dev/null
+				;;
+			*)
+				echo "${data}" > "${file}"
+				ret=$?
+				if [ ${ret} -ne 0 ]; then
+					echo "Error: Failed to restore $file"
+				fi
+				;;
+		esac
+	done
+}
+
+store()
+{
+	for file in $@; do
+		if [ -e "${file}" ]; then
+			echo "${file}:`cat ${file}`" >> "${CONF_FILE}"
+		fi
+	done
+}
+
+do_fan()
+{
+	# Jetson-TK1 CPU fan is always ON.
+	if [ "${machine}" = "jetson-tk1" ] ; then
+			return
+	fi
+
+	if [ ! -w /sys/kernel/debug/tegra_fan/target_pwm ]; then
+		echo "Can't access Fan!"
+		return
+	fi
+
+	case "${ACTION}" in
+		show)
+			echo "Fan: speed=`cat /sys/kernel/debug/tegra_fan/target_pwm`"
+			;;
+		store)
+			store "/sys/kernel/debug/tegra_fan/target_pwm"
+			;;
+		*)
+			FAN_SPEED=255
+			echo "${FAN_SPEED}" > /sys/kernel/debug/tegra_fan/target_pwm
+			;;
+	esac
+}
+
+do_clusterswitch()
+{
+	case "${ACTION}" in
+		show)
+			if [ -d "/sys/kernel/cluster" ]; then
+				ACTIVE_CLUSTER=`cat /sys/kernel/cluster/active`
+				echo "CPU Cluster Switching: Active Cluster ${ACTIVE_CLUSTER}"
+			else
+				echo "CPU Cluster Switching: Disabled"
+			fi
+			;;
+		store)
+			if [ -d "/sys/kernel/cluster" ]; then
+				store "/sys/kernel/cluster/immediate"
+				store "/sys/kernel/cluster/force"
+				store "/sys/kernel/cluster/active"
+			fi
+			;;
+		*)
+			if [ -d "/sys/kernel/cluster" ]; then
+				echo 1 > /sys/kernel/cluster/immediate
+				echo 0 > /sys/kernel/cluster/force
+				echo G > /sys/kernel/cluster/active
+			fi
+			;;
+	esac
+}
+
+do_hotplug()
+{
+	case "${ACTION}" in
+		show)
+			echo "Online CPUs: `cat /sys/devices/system/cpu/online`"
+			;;
+		store)
+			for file in /sys/devices/system/cpu/cpu[0-9]/online; do
+				store "${file}"
+			done
+			;;
+		*)
+			if [ "${SOCFAMILY}" != "tegra186" ]; then
+				for file in /sys/devices/system/cpu/cpu*/online; do
+					if [ `cat $file` -eq 0 ]; then
+						echo 1 > "${file}"
+					fi
+				done
+			fi
+	esac
+}
+
+do_cpu()
+{
+	FREQ_GOVERNOR="cpufreq/scaling_governor"
+	CPU_MIN_FREQ="cpufreq/scaling_min_freq"
+	CPU_MAX_FREQ="cpufreq/scaling_max_freq"
+	CPU_CUR_FREQ="cpufreq/scaling_cur_freq"
+	CPU_SET_SPEED="cpufreq/scaling_setspeed"
+	INTERACTIVE_SETTINGS="/sys/devices/system/cpu/cpufreq/interactive"
+	SCHEDUTIL_SETTINGS="/sys/devices/system/cpu/cpufreq/schedutil"
+
+	case "${ACTION}" in
+		show)
+			for folder in /sys/devices/system/cpu/cpu[0-9]; do
+				CPU=`basename ${folder}`
+				if [ -e "${folder}/${FREQ_GOVERNOR}" ]; then
+					echo "$CPU: Gonvernor=`cat ${folder}/${FREQ_GOVERNOR}`" \
+						"MinFreq=`cat ${folder}/${CPU_MIN_FREQ}`" \
+						"MaxFreq=`cat ${folder}/${CPU_MAX_FREQ}`" \
+						"CurrentFreq=`cat ${folder}/${CPU_CUR_FREQ}`"
+				fi
+			done
+			;;
+		store)
+			store "/sys/module/qos/parameters/enable"
+
+			for file in \
+				/sys/devices/system/cpu/cpu[0-9]/cpufreq/scaling_min_freq; do
+				store "${file}"
+			done
+
+			if [ "${SOCFAMILY}" = "tegra186" ]; then
+				store "/sys/kernel/debug/tegra_cpufreq/M_CLUSTER/cc3/enable"
+				store "/sys/kernel/debug/tegra_cpufreq/B_CLUSTER/cc3/enable"
+			fi
+			;;
+		*)
+			echo 0 > /sys/module/qos/parameters/enable
+
+			if [ "${SOCFAMILY}" = "tegra186" ]; then
+				echo 0 > /sys/kernel/debug/tegra_cpufreq/M_CLUSTER/cc3/enable 2>/dev/null
+				echo 0 > /sys/kernel/debug/tegra_cpufreq/B_CLUSTER/cc3/enable 2>/dev/null
+			fi
+
+			for folder in /sys/devices/system/cpu/cpu[0-9]; do
+				cat "${folder}/${CPU_MAX_FREQ}" > "${folder}/${CPU_MIN_FREQ}" 2>/dev/null
+			done
+			;;
+	esac
+}
+
+do_gpu()
+{
+	case "${SOCFAMILY}" in
+		tegra186)
+			GPU_MIN_FREQ="/sys/devices/17000000.gp10b/devfreq/17000000.gp10b/min_freq"
+			GPU_MAX_FREQ="/sys/devices/17000000.gp10b/devfreq/17000000.gp10b/max_freq"
+			GPU_CUR_FREQ="/sys/devices/17000000.gp10b/devfreq/17000000.gp10b/cur_freq"
+			GPU_RAIL_GATE="/sys/devices/17000000.gp10b/railgate_enable"
+			;;
+		tegra210)
+			GPU_MIN_FREQ="/sys/devices/57000000.gpu/devfreq/57000000.gpu/min_freq"
+			GPU_MAX_FREQ="/sys/devices/57000000.gpu/devfreq/57000000.gpu/max_freq"
+			GPU_CUR_FREQ="/sys/devices/57000000.gpu/devfreq/57000000.gpu/cur_freq"
+			GPU_RAIL_GATE="/sys/devices/57000000.gpu/railgate_enable"
+			;;
+		*)
+			echo "Error! unsupported SOC ${SOCFAMILY}"
+			exit 1;
+			;;
+	esac
+
+	case "${ACTION}" in
+		show)
+			echo "GPU MinFreq=`cat ${GPU_MIN_FREQ}`" \
+				"MaxFreq=`cat ${GPU_MAX_FREQ}`" \
+				"CurrentFreq=`cat ${GPU_CUR_FREQ}`"
+			;;
+		store)
+			store "${GPU_MIN_FREQ}"
+			store "${GPU_RAIL_GATE}"
+			;;
+		*)
+			echo 0 > "${GPU_RAIL_GATE}"
+			cat "${GPU_MAX_FREQ}" > "${GPU_MIN_FREQ}"
+			ret=$?
+			if [ ${ret} -ne 0 ]; then
+				echo "Error: Failed to max GPU frequency!"
+			fi
+			;;
+	esac
+}
+
+do_emc()
+{
+	case "${SOCFAMILY}" in
+		tegra186)
+			EMC_ISO_CAP="/sys/kernel/nvpmodel_emc_cap/emc_iso_cap"
+			EMC_MIN_FREQ="/sys/kernel/debug/bpmp/debug/clk/emc/min_rate"
+			EMC_MAX_FREQ="/sys/kernel/debug/bpmp/debug/clk/emc/max_rate"
+			EMC_CUR_FREQ="/sys/kernel/debug/clk/emc/clk_rate"
+			EMC_UPDATE_FREQ="/sys/kernel/debug/bpmp/debug/clk/emc/rate"
+			EMC_FREQ_OVERRIDE="/sys/kernel/debug/bpmp/debug/clk/emc/mrq_rate_locked"
+			;;
+		tegra210)
+			EMC_MIN_FREQ="/sys/kernel/debug/tegra_bwmgr/emc_min_rate"
+			EMC_MAX_FREQ="/sys/kernel/debug/tegra_bwmgr/emc_max_rate"
+			EMC_CUR_FREQ="/sys/kernel/debug/clk/override.emc/clk_rate"
+			EMC_UPDATE_FREQ="/sys/kernel/debug/clk/override.emc/clk_update_rate"
+			EMC_FREQ_OVERRIDE="/sys/kernel/debug/clk/override.emc/clk_state"
+			;;
+		*)
+			echo "Error! unsupported SOC ${SOCFAMILY}"
+			exit 1;
+			;;
+
+	esac
+
+	if [ "${SOCFAMILY}" = "tegra186" ]; then
+		emc_cap=`cat "${EMC_ISO_CAP}"`
+		emc_fmax=`cat "${EMC_MAX_FREQ}"`
+		if [ "$emc_cap" -gt 0 ] && [ "$emc_cap" -lt  "$emc_fmax" ]; then
+			EMC_MAX_FREQ="${EMC_ISO_CAP}"
+		fi
+	fi
+
+	case "${ACTION}" in
+		show)
+			echo "EMC MinFreq=`cat ${EMC_MIN_FREQ}`" \
+				"MaxFreq=`cat ${EMC_MAX_FREQ}`" \
+				"CurrentFreq=`cat ${EMC_CUR_FREQ}`" \
+				"FreqOverride=`cat ${EMC_FREQ_OVERRIDE}`"
+			;;
+		store)
+			store "${EMC_FREQ_OVERRIDE}"
+			;;
+		*)
+			cat "${EMC_MAX_FREQ}" > "${EMC_UPDATE_FREQ}"
+			echo 1 > "${EMC_FREQ_OVERRIDE}"
+			;;
+	esac
+}
+
+main ()
+{
+	while [ -n "$1" ]; do
+		case "$1" in
+			--show)
+				echo "SOC family:${SOCFAMILY}  Machine:${machine}"
+				ACTION=show
+				;;
+			--store)
+				[ -n "$2" ] && CONF_FILE=$2
+				ACTION=store
+				shift 1
+				;;
+			--restore)
+				[ -n "$2" ] && CONF_FILE=$2
+				ACTION=restore
+				shift 1
+				;;
+			-h|--help)
+				usage
+				exit 0
+				;;
+			*)
+				usage "Unknown option: $1"
+				exit 1
+				;;
+		esac
+		shift 1
+	done
+
+	[ `whoami` != root ] && \
+		echo Error: Run this script\($0\) as a root user && exit 1
+
+	case $ACTION in
+		store)
+			if [ -e "${CONF_FILE}" ]; then
+				echo "File $CONF_FILE already exists. Can I overwrite it? Y/N:"
+				read answer
+				case $answer in
+					y|Y)
+						rm -f $CONF_FILE
+						;;
+					*)
+						echo "Error: file $CONF_FILE already exists!"
+						exit 1
+						;;
+				esac
+			fi
+			;;
+		restore)
+			if [ ! -e "${CONF_FILE}" ]; then
+				echo "Error: $CONF_FILE file not found !"
+				exit 1
+			fi
+			restore
+			exit 0
+			;;
+	esac
+
+	do_hotplug
+	do_clusterswitch
+	do_cpu
+	do_gpu
+	do_emc
+	do_fan
+}
+
+if [ -e "/sys/devices/soc0/family" ]; then
+	SOCFAMILY="`cat /sys/devices/soc0/family`"
+	if [ -e "/sys/devices/soc0/machine" ]; then
+		machine=`cat /sys/devices/soc0/machine`
+	fi
+elif [ -e "/proc/device-tree/compatible" ]; then
+	grep "nvidia,tegra210" /proc/device-tree/compatible &>/dev/null
+	if [ $? -eq 0 ]; then
+		SOCFAMILY="tegra210"
+	else
+		grep "nvidia,tegra186" /proc/device-tree/compatible &>/dev/null
+		if [ $? -eq 0 ]; then
+			SOCFAMILY="tegra186"
+		fi
+	fi
+
+	if [ -e "/proc/device-tree/model" ]; then
+		machine="`cat /proc/device-tree/model`"
+	fi
+fi
+
+main $@
+exit 0
-- 
GitLab