| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | #! /usr/bin/bash | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:10:29 +00:00
										 |  |  | # Global vars/settings | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | command_name=$(basename $0) | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  | #rapl_path="/sys/class/powercap/intel-rapl:0" | 
					
						
							|  |  |  | rapl_path="testfolder" | 
					
						
							|  |  |  | pl1_path="${rapl_path}/constraint_0_power_limit_uw" | 
					
						
							|  |  |  | pl2_path="${rapl_path}/constraint_1_power_limit_uw" | 
					
						
							| 
									
										
										
										
											2021-05-20 10:10:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Set up help text | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | help_text="${command_name}: GDP Win 3 TDP management script | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This script checks and sets the TDP using intel_rapl | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Usage: | 
					
						
							|  |  |  |   ${command_name} COMMAND [ARGUMENTS] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Command: | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   check [ARGS]     Checks current TDP and prints it in watts | 
					
						
							| 
									
										
										
										
											2021-05-20 10:58:07 +00:00
										 |  |  |   c [ARGS]         Shortened version of check | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   set WATTS [ARGS] Sets TDP to the requested number in watts | 
					
						
							|  |  |  |   s WATTS [ARGS]   Shortened version of set | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |   help             Prints this help text | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   COMMAND --help   Prints help for specified command" | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | check_help_text="${command_name} check [ARG] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							|  |  |  |   ${command_name} check --detail | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   ${command_name} c -d | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Arguments: | 
					
						
							|  |  |  |   --detail, -d     Prints PL2 as well as PL1 | 
					
						
							|  |  |  |   --help           Prints this help text" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  | set_help_text="${command_name} set WATT [ARGUMENTS] | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   ${command_name} set 10 --detail | 
					
						
							|  |  |  |   ${command_name} s 10 -d | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Arguments: | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   --detail, -d     Prints PL2 as well as PL1 | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |   --help           Prints this help text" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | print_help () { | 
					
						
							|  |  |  |   case $1 in | 
					
						
							|  |  |  |     "check") | 
					
						
							|  |  |  |       echo "$check_help_text" | 
					
						
							|  |  |  |       ;; | 
					
						
							|  |  |  |     "set") | 
					
						
							|  |  |  |       echo "$set_help_text" | 
					
						
							|  |  |  |       ;; | 
					
						
							|  |  |  |     *) | 
					
						
							|  |  |  |       echo "$help_text" | 
					
						
							|  |  |  |       ;; | 
					
						
							|  |  |  |   esac | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | print_unknown () { | 
					
						
							|  |  |  |   echo "Unknown command or incorrect arguments. | 
					
						
							|  |  |  |   Try \"${command_name} help\" or \"${command_name} COMMAND --help\"" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | # End of help text | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:10:29 +00:00
										 |  |  | # Conversion tools | 
					
						
							|  |  |  | uw_to_w () { | 
					
						
							|  |  |  |   if ! [[ $1 =~ ^-?[0-9]+$ ]]; then | 
					
						
							|  |  |  |     exit | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     echo $(expr $1 / 1000000) | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | w_to_uw () { | 
					
						
							|  |  |  |   if ! [[ $1 =~ ^-?[0-9]+$ ]]; then | 
					
						
							|  |  |  |     exit | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     echo $(expr $1 '*' 1000000) | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  | # Common checks/tasks | 
					
						
							|  |  |  | is_detailed () { | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   if [[ "$@" == *"--detail"* ]] || [[ "$@" == *"-d"* ]]; then | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  |     exit 0 | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     exit 1 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:10:29 +00:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  | set_pl () { | 
					
						
							|  |  |  |   if [ $1 -eq 1 ] || [ $1 -eq 2 ] || [ ! -z $2 ]; then | 
					
						
							|  |  |  |     if [ $1 -eq 1 ]; then | 
					
						
							|  |  |  |       pl_path=$pl1_path | 
					
						
							|  |  |  |     elif [ $1 -eq 2 ]; then | 
					
						
							|  |  |  |       pl_path=$pl2_path | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     echo $(w_to_uw $2) > $pl_path | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | get_pl () { | 
					
						
							|  |  |  |   if [ $1 -eq 1 ]; then | 
					
						
							|  |  |  |     cat $pl1_path | 
					
						
							|  |  |  |   elif [ $1 -eq 2 ]; then | 
					
						
							|  |  |  |     cat $pl2_path | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Retrieves current TDP and prints it | 
					
						
							|  |  |  | check_tdp () { | 
					
						
							|  |  |  |   if [ -z "$1" ] || ( is_detailed $@ ); then | 
					
						
							|  |  |  |     local pl1=$(uw_to_w $(get_pl 1)) | 
					
						
							|  |  |  |     local pl2=$(uw_to_w $(get_pl 2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     echo "PL1 is ${pl1}W" # Placeholder | 
					
						
							|  |  |  |     if ( is_detailed $@ ); then | 
					
						
							|  |  |  |       echo "PL2 is ${pl2}W" # Placeholder | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   elif [ "$1" == "--help" ]; then | 
					
						
							|  |  |  |     print_help "check" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     print_unknown | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:10:29 +00:00
										 |  |  | # Sets PL1 to number provided as first argument, and PL2 2W higher | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | set_tdp () { | 
					
						
							|  |  |  |   if [ -z "$1" ]; then | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |     echo "Please specify wattage" | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |     exit | 
					
						
							|  |  |  |   elif [ "$1" == "--help" ]; then | 
					
						
							|  |  |  |     print_help "set" | 
					
						
							|  |  |  |     exit | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   elif ! [[ $1 =~ ^-?[0-9]+$ ]]; then | 
					
						
							|  |  |  |     echo "TDP is not a number or argument unknown!)" | 
					
						
							|  |  |  |     print_unknown | 
					
						
							|  |  |  |     exit | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   if [ $1 -lt 5 ] || [ $1 -gt 30 ]; then | 
					
						
							|  |  |  |     echo "TDP too high or low, should be between 5W and 30W" | 
					
						
							|  |  |  |     echo "This is a sanity limit to prevent you from throttling to a near unusable state" | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |   else | 
					
						
							|  |  |  |     #PL1 | 
					
						
							|  |  |  |     local watts=$1 | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  |     set_pl 1 $watts | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     #PL2 | 
					
						
							|  |  |  |     local watts2=$(expr $watts + 2) | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  |     set_pl 2 $watts2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     echo "PL1 is now ${watts}W (Long-term)" | 
					
						
							| 
									
										
										
										
											2021-05-20 10:40:52 +00:00
										 |  |  |     if ( is_detailed $@ ); then | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |       echo "PL2 is now ${watts2}W (Short-term)" | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Command handler | 
					
						
							|  |  |  | case $1 in | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   "check" | "c") | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |     check_tdp "${@:2}" | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 08:46:14 +00:00
										 |  |  |   "set" | "s") | 
					
						
							| 
									
										
										
										
											2021-05-20 07:42:54 +00:00
										 |  |  |     set_tdp "${@:2}" | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   "help") | 
					
						
							|  |  |  |     print_help | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   *) | 
					
						
							|  |  |  |     print_unknown | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  | esac |