Advertisement
Guest User

Untitled

a guest
Aug 9th, 2017
821
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 11.62 KB | None | 0 0
  1. #!/bin/bash
  2. #Needed for (!pci*)
  3. shopt -s extglob
  4.  
  5. #Due to the summer heat, changed "status=ac" to "status=coolac"
  6.  
  7. {
  8. #Adapted from:
  9. #http://www.neowin.net/forum/topic/1106745-howto-powersaving-tweaks-with-a-udev-rule/
  10. #https://wiki.archlinux.org/index.php/Power_management
  11.  
  12. #Called by:
  13. #/etc/udev/rules.d/XPSpower.rules
  14.  
  15. #More powersaving settings are in:
  16. #/etc/modprobe.d/i915.conf
  17. #/etc/modprobe.d/audio_powersave.conf
  18. #/etc/modprobe.d/bluetooth.conf
  19. #/etc/modprobe.d/iwlwifi.conf
  20. #/etc/modprobe.d/iwldvm.conf
  21. #/etc/sysctl.d/XPSpower.conf
  22. #/boot/EFI/refind/refind.conf (kernel line)
  23.  
  24. set -e # Stop on errors
  25.  
  26. if [ "$EUID" -ne 0 ]; then
  27.   echo "ERROR: not running with root permissions."
  28.   echo "Please run as root!"
  29.   exit 1
  30. fi
  31.  
  32. #Delay... this is needed because sometimes the files do not update as fast as needed
  33. if [ "$1" != "status" ]; then
  34.   sleep 3s
  35. fi
  36.  
  37. #Automatically check ac/bat status
  38. if [ -e /sys/class/power_supply/AC/online ]; then
  39.   if [ `cat /sys/class/power_supply/AC/online` == "1" ]; then
  40.     status="coolac"
  41.   else
  42.     status="battery"
  43.   fi
  44. else
  45.   case `cat /sys/class/power_supply/BAT0/status` in
  46.     Charging)
  47.       status="coolac"
  48.     ;;
  49.     Discharging)
  50.       status="battery"
  51.     ;;
  52.     Full)
  53.       status="coolac"
  54.     ;;
  55.     *)
  56.       status=`cat /sys/class/power_supply/BAT0/status`
  57.     ;;
  58.   esac
  59. fi
  60.  
  61. newoutf() { #Function to output the status of files
  62.   case $status in
  63.     ac)
  64.       okValue=${2}
  65.       badValue=${3}
  66.     ;;
  67.     battery)
  68.       okValue=${3}
  69.       badValue=${2}
  70.     ;;
  71.     *)
  72.       okValue=-whoknows
  73.       badValue=-whoknows
  74.     ;;
  75.   esac
  76.   echo Expected "'${1}'" value: ${okValue}
  77.  
  78.   NokValues=0
  79.   NbadValues=0
  80.   NunknValues=0
  81.  
  82.   for i in ${1}; do
  83.     value=`cat ${i}`
  84.  
  85.     case "$value" in
  86.     "$okValue")
  87.       NokValues=$((NokValues+1)) #Number of OK Values
  88.       if [ ! -z ${4} ]; then
  89.         echo -e "    "${i} ":" "\e[7;32m${value}\e[0m"
  90.       fi
  91.     ;;
  92.     "$badValue")
  93.       NbadValues=$((NbadValues+1)) #Number of BAD Values
  94.       echo -e "    "${i} ":" "\e[7;31m${value}\e[0m"
  95.     ;;
  96.     *)
  97.       NunknValues=$((NunknValues+1)) #Number of UNKNOWN Values
  98.       echo -e "    "${i} ":" "\e[7;34m${value}\e[0m"
  99.     ;;
  100.     esac
  101.   done
  102.  
  103.   NtotValues=$((NokValues + NbadValues + NunknValues))
  104.  
  105.   if [ ${NokValues} == ${NtotValues} ]; then
  106.   echo -e "    ALL values OK:" "\e[7;32m${NokValues}\e[0m / ${NtotValues}"
  107.   else
  108.     if [ ${NbadValues} != 0 ]; then
  109.       echo -e "    BAD values:" "\e[7;31m${NbadValues}\e[0m / ${NtotValues}"
  110.     fi
  111.     if [ ${NunknValues} != 0 ]; then
  112.       echo -e "    UNKNOWN values:" "\e[7;34m${NunknValues}\e[0m / ${NtotValues}"
  113.     fi
  114.   fi
  115. }
  116.  
  117. if [ "$1" == "status" ]; then #Report status
  118.   echo -e "Current status: " ${status}
  119.  
  120.   echo -e "\e[7mCPU PSTATE settings\e[0m"
  121.   newoutf "/sys/devices/system/cpu/intel_pstate/min_perf_pct" 25 5
  122.   newoutf "/sys/devices/system/cpu/intel_pstate/max_perf_pct" 100 80
  123.   newoutf "/sys/devices/system/cpu/intel_pstate/no_turbo" 0 1
  124.   newoutf "/sys/devices/system/cpu/cpu?/cpufreq/energy_performance_preference" balance_performance balance_power
  125.  
  126.   echo -e "\e[7mDevice, disk and USB runtime PM\e[0m"
  127.   newoutf "/sys/bus/*/devices/*/power/control" on auto
  128.   newoutf "/sys/bus/*/devices/*/ata*/power/control" on auto
  129.   newoutf "/sys/block/*/device/power/control" on auto
  130.  
  131.   echo -e "\e[7mUSB autosuspend\e[0m"
  132.   newoutf "/sys/bus/usb/devices/*/power/level" on auto
  133.  
  134.   echo -e "\e[7mUSB autosuspend time\e[0m"
  135.   newoutf "/sys/bus/usb/devices/*/power/autosuspend" 0 1
  136.  
  137.   echo -e "\e[7mPCI-E ASPM\e[0m"
  138.   newoutf "/sys/module/pcie_aspm/parameters/policy" "default [performance] powersave powersupersave " "default performance powersave [powersupersave] "
  139.  
  140.   echo -e "\e[7mKernel VM parameters\e[0m"
  141.   newoutf "/proc/sys/vm/laptop_mode" 0  5
  142.   newoutf "/proc/sys/vm/dirty_ratio" 20 25
  143.   newoutf "/proc/sys/vm/dirty_background_ratio" 5 15
  144.   newoutf "/proc/sys/vm/dirty_writeback_centisecs" 500 3000
  145.   newoutf "/proc/sys/vm/dirty_expire_centisecs" 1000 10000
  146.  
  147.   echo -e "\e[7mSATA ALPM\e[0m"
  148.   newoutf "/sys/class/scsi_host/host*/link_power_management_policy" max_performance min_power
  149.  
  150.   echo -e "\e[7mSound card powersave\e[0m"
  151.   newoutf "/sys/module/snd_hda_intel/parameters/power_save" 0 1
  152.   newoutf "/sys/module/snd_hda_intel/parameters/power_save_controller" N Y
  153.  
  154.   case $status in
  155.     ac)
  156.       okValue="off"
  157.       badValue="on"
  158.     ;;
  159.     battery)
  160.       okValue="on"
  161.       badValue="off"
  162.     ;;
  163.     *)
  164.       okValue=-whoknows
  165.       badValue=-whoknows
  166.     ;;
  167.   esac
  168.  
  169.   echo -e "\e[7mWireless powersave\e[0m"
  170.   value=`iw dev wlp2s0 get power_save | awk '{print $3}'`
  171.   case ${value} in
  172.   ${okValue})
  173.       echo -e "wlp2s0 :" "\e[7;32m${value}\e[0m"
  174.   ;;
  175.   ${badValue})
  176.       echo -e "wlp2s0 :" "\e[7;31m${value}\e[0m"
  177.   ;;
  178.   *)
  179.       echo -e "wlp2s0 :" "\e[7;34m${value}\e[0m"
  180.   ;;
  181.   esac
  182.  
  183.   echo -e "Current status: " ${status}
  184.  
  185.   exit 0
  186. fi
  187.  
  188. if [ -t 0 ]; then #not interactive (does not work?)
  189.   echo " Output is redirected to /var/log/XPSpower"
  190. fi
  191.  
  192. exec >> /var/log/XPSpower
  193. exec 2>&1
  194.  
  195. echo `date +%d/%m/%Y_%H:%M:%S` "  Running XPSpower script"
  196.  
  197. if [ -z "$1" ]; then
  198.   echo `date +%d/%m/%Y_%H:%M:%S` "  ERROR: No arguments supplied."
  199.   echo "                      Please specify 'ac', 'battery', 'auto' or 'status'."
  200.   exit 2
  201. fi
  202.  
  203. if [ "$1" == "auto" ]; then
  204.   input="$status"
  205. else
  206.   input="$1"
  207. fi
  208. echo "                      Input: '$input'"
  209.  
  210. case "$input" in
  211.  
  212.   ac) # Return to default on AC power
  213.     echo `date +%d/%m/%Y_%H:%M:%S` "  AC mode selected"
  214.  
  215.     #Set limits for maximum and minimum frequency
  216.     echo 25  > /sys/devices/system/cpu/intel_pstate/min_perf_pct
  217.     echo 100 > /sys/devices/system/cpu/intel_pstate/max_perf_pct
  218.     echo 0   > /sys/devices/system/cpu/intel_pstate/no_turbo
  219.     for i in /sys/devices/system/cpu/cpu?/cpufreq/energy_performance_preference ; do echo balance_performance > ${i} ; done
  220.  
  221.     # Device and disk runtime-PM and USB power control (one can do that on {usb,pci,i2c} only if needed)
  222.     #The first one might conflict with nvidia devices starting, so we exclude the PCI devices
  223. #     for i in /sys/bus/*/devices/*/power/control; do echo auto > ${i} ; done
  224.     for i in /sys/bus/!(pci*)/devices/*/power/control; do echo on > ${i} ; done
  225.     for i in /sys/bus/*/devices/*/ata*/power/control; do echo on > ${i} ; done
  226.     for i in /sys/block/*/device/power/control; do echo on > ${i} ; done
  227.  
  228.     # USB autosuspend
  229.     for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 0 > $i; done
  230.     for i in /sys/bus/usb/devices/*/power/level; do echo on > $i; done
  231.  
  232.     # PCI-E ASPM
  233.     echo performance > /sys/module/pcie_aspm/parameters/policy
  234.  
  235.     # Kernel write mode
  236.     echo 0    > /proc/sys/vm/laptop_mode
  237.     echo 20   > /proc/sys/vm/dirty_ratio
  238.     echo 5    > /proc/sys/vm/dirty_background_ratio
  239.     echo 500  > /proc/sys/vm/dirty_writeback_centisecs
  240.     echo 1000 > /proc/sys/vm/dirty_expire_centisecs
  241.  
  242.     # SATA ALPM
  243.     for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo max_performance > ${i} ; done
  244.  
  245.     # Sound card powersave
  246.     echo 0 > /sys/module/snd_hda_intel/parameters/power_save
  247.     echo N > /sys/module/snd_hda_intel/parameters/power_save_controller
  248.  
  249.     # Wifi powersave
  250.     iw dev wlp2s0 set power_save off &> /dev/null
  251.  
  252.     #Intel GPU speed
  253.     sudo /usr/bin/intel_gpu_frequency -m
  254.  
  255.     echo `date +%d/%m/%Y_%H:%M:%S` "  AC mode applied"
  256.   ;;
  257.  
  258.   coolac) # Enable power saving settings on battery
  259.     echo `date +%d/%m/%Y_%H:%M:%S` "  Battery mode selected"
  260.  
  261.     #Set limits for maximum and minimum frequency
  262.     echo 25  > /sys/devices/system/cpu/intel_pstate/min_perf_pct
  263.     echo 100  > /sys/devices/system/cpu/intel_pstate/max_perf_pct
  264.     echo 0   > /sys/devices/system/cpu/intel_pstate/no_turbo
  265.     for i in /sys/devices/system/cpu/cpu?/cpufreq/energy_performance_preference ; do echo balance_performance > ${i} ; done
  266.  
  267.     # Device and disk runtime-PM and USB power control (one can do that on {usb,pci,i2c} only if needed)
  268.     #The first one might conflict with nvidia devices starting, so we exclude the PCI devices
  269. #     for i in /sys/bus/*/devices/*/power/control; do echo auto > ${i} ; done
  270.     for i in /sys/bus/!(pci*)/devices/*/power/control; do echo on > ${i} ; done
  271.     for i in /sys/bus/*/devices/*/ata*/power/control; do echo on > ${i} ; done
  272.     for i in /sys/block/*/device/power/control; do echo on > ${i} ; done
  273.  
  274.     # USB autosuspend
  275.     for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 0 > $i; done
  276.     for i in /sys/bus/usb/devices/*/power/level; do echo on > $i; done
  277.  
  278.     # PCI-E ASPM
  279.     echo powersave > /sys/module/pcie_aspm/parameters/policy
  280.  
  281.     # Kernel write mode
  282.     echo 0    > /proc/sys/vm/laptop_mode
  283.     echo 20   > /proc/sys/vm/dirty_ratio
  284.     echo 5    > /proc/sys/vm/dirty_background_ratio
  285.     echo 500  > /proc/sys/vm/dirty_writeback_centisecs
  286.     echo 1000 > /proc/sys/vm/dirty_expire_centisecs
  287.  
  288.     # SATA ALPM
  289.     for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo min_power > ${i} ; done
  290.  
  291.     # Sound card powersave
  292.     echo 0 > /sys/module/snd_hda_intel/parameters/power_save
  293.     echo N > /sys/module/snd_hda_intel/parameters/power_save_controller
  294.  
  295.     # Wifi powersave
  296.     iw dev wlp2s0 set power_save off &> /dev/null
  297.  
  298.     #Intel GPU speed
  299.     sudo /usr/bin/intel_gpu_frequency -m
  300.  
  301.     echo `date +%d/%m/%Y_%H:%M:%S` "  Battery mode applied"
  302.   ;;
  303.  
  304.   battery) # Enable power saving settings on battery
  305.     echo `date +%d/%m/%Y_%H:%M:%S` "  Battery mode selected"
  306.  
  307.     #Set limits for maximum and minimum frequency
  308.     echo 5  > /sys/devices/system/cpu/intel_pstate/min_perf_pct
  309.     echo 80  > /sys/devices/system/cpu/intel_pstate/max_perf_pct
  310.     echo 1   > /sys/devices/system/cpu/intel_pstate/no_turbo
  311.     for i in /sys/devices/system/cpu/cpu?/cpufreq/energy_performance_preference ; do echo balance_power > ${i} ; done
  312.  
  313.     # Device and disk runtime-PM and USB power control (one can do that on {usb,pci,i2c} only if needed)
  314.     #The first one might conflict with nvidia devices starting, so we exclude the PCI devices
  315. #     for i in /sys/bus/*/devices/*/power/control; do echo auto > ${i} ; done
  316.     for i in /sys/bus/!(pci*)/devices/*/power/control; do echo auto > ${i} ; done
  317.     for i in /sys/bus/*/devices/*/ata*/power/control; do echo auto > ${i} ; done
  318.     for i in /sys/block/*/device/power/control; do echo auto > ${i} ; done
  319.  
  320.     # USB autosuspend
  321.     for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
  322.     for i in /sys/bus/usb/devices/*/power/level; do echo auto > $i; done
  323.  
  324.     # PCI-E ASPM
  325.     echo powersupersave > /sys/module/pcie_aspm/parameters/policy
  326.  
  327.     # Kernel write mode
  328.     echo 5     > /proc/sys/vm/laptop_mode
  329.     echo 25    > /proc/sys/vm/dirty_ratio
  330.     echo 15    > /proc/sys/vm/dirty_background_ratio
  331.     echo 3000  > /proc/sys/vm/dirty_writeback_centisecs
  332.     echo 10000 > /proc/sys/vm/dirty_expire_centisecs
  333.  
  334.     # SATA ALPM
  335.     for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo min_power > ${i} ; done
  336.  
  337.     # Sound card powersave
  338.     echo 1 > /sys/module/snd_hda_intel/parameters/power_save
  339.     echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
  340.  
  341.     # Wifi powersave
  342.     iw dev wlp2s0 set power_save on &> /dev/null
  343.  
  344.     #Intel GPU speed
  345.     sudo /usr/bin/intel_gpu_frequency -e
  346.  
  347.     echo `date +%d/%m/%Y_%H:%M:%S` "  Battery mode applied"
  348.   ;;
  349.  
  350.   *) # Anything else
  351.     echo `date +%d/%m/%Y_%H:%M:%S` "  ERROR: Invalid script input or unknown AC/battery status"
  352.     exit 3
  353.   ;;
  354.  
  355. esac
  356.  
  357. echo `date +%d/%m/%Y_%H:%M:%S` "  Exiting XPSpower script"
  358.  
  359. exit 0
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement