=== modified file 'indicator_cpufreq/indicator.py' --- indicator_cpufreq/indicator.py 2013-02-20 03:47:48 +0000 +++ indicator_cpufreq/indicator.py 2017-04-04 16:49:04 +0000 @@ -23,12 +23,15 @@ import locale import dbus -from indicator_cpufreq import cpufreq - import gettext from gettext import gettext as _ #gettext.textdomain('indicator-cpufreq') +import glob + +def readable_throttle(t): + return t + def readable_frequency(f): # temp hack for properly displaying intel turbo mode (actual freq + 1000kHz) label = _("%s GHz") % locale.format(_("%.2f"), f / 1.0e6) @@ -37,9 +40,9 @@ return label governor_names = { + 'schedutil': _("Scheduler"), 'conservative': _("Conservative"), 'ondemand': _("Ondemand"), - #'userspace': _("Userspace"), 'powersave': _("Powersave"), 'performance': _("Performance"), } @@ -50,6 +53,15 @@ else: return g +def readable_psturbo(t): + return t + +def readable_hyperthreads(h): + return h + +def readable_gputhrottles(gt): + return gt + class MyIndicator(object): def __init__(self, show_frequency=False): self.show_frequency = show_frequency @@ -66,33 +78,81 @@ self.select_items = {} group = [] - maxcpu = 0 - while cpufreq.cpu_exists(maxcpu) == 0: - maxcpu += 1 - self.cpus = range(maxcpu) - - # frequency menu items - #freqs = cpufreq.get_available_frequencies(self.cpus[0]) - freqs = reversed(sorted(set(cpufreq.get_available_frequencies(self.cpus[0])))) - for freq in freqs: - menu_item = Gtk.RadioMenuItem.new_with_label(group, readable_frequency(freq)) + # throttle menu items + throttles = ['full', 'cut'] + throtmenu = Gtk.Menu() + throtm = Gtk.MenuItem("System Throttle") + throtm.set_submenu(throtmenu) + for toggle in throttles: + menu_item = Gtk.RadioMenuItem.new_with_label(group, readable_throttle(toggle)) group = menu_item.get_group() - menu.append(menu_item) - menu_item.connect("activate", self.select_activated, 'frequency', freq) - self.select_items[freq] = menu_item + throtmenu.append(menu_item) + menu_item.connect('activate', self.select_activated, 'throttle', toggle) + self.select_items[toggle] = menu_item + menu.append(throtm) menu.append(Gtk.SeparatorMenuItem()) # governor menu items - governors = cpufreq.get_available_governors(self.cpus[0]) - for governor in governors: - if governor == 'userspace': - continue + govFile = open("/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors") + governors = govFile.readline().strip("\n") + govList = governors.split(" ") + govmenu = Gtk.Menu() + govm = Gtk.MenuItem("CPU Governor") + govm.set_submenu(govmenu) + for governor in govList: + if governor == 'performance': + toggle = 'full' + else: + toggle = 'cut' menu_item = Gtk.RadioMenuItem.new_with_label(group, readable_governor(governor)) group = menu_item.get_group() - menu.append(menu_item) - menu_item.connect('activate', self.select_activated, 'governor', governor) + govmenu.append(menu_item) + menu_item.connect('activate', self.select_activated, 'governor', toggle) self.select_items[governor] = menu_item + menu.append(govm) + govFile.close + + # p-state turbo menu items + psturbo = ['on', 'off'] + pstmenu = Gtk.Menu() + pstm = Gtk.MenuItem("P-State Turbo") + pstm.set_submenu(pstmenu) + for toggle in psturbo: + menu_item = Gtk.RadioMenuItem.new_with_label(group, readable_psturbo(toggle)) + group = menu_item.get_group() + pstmenu.append(menu_item) + menu_item.connect('activate', self.select_activated, 'psturbo', toggle) + self.select_items[toggle] = menu_item + menu.append(pstm) + + # hyperthreading menu items + hyperthreads = ['on', 'off'] + htmenu = Gtk.Menu() + htm = Gtk.MenuItem("Hyperthreads") + htm.set_submenu(htmenu) + for toggle in hyperthreads: + menu_item = Gtk.RadioMenuItem.new_with_label(group, readable_hyperthreads(toggle)) + group = menu_item.get_group() + htmenu.append(menu_item) + menu_item.connect('activate', self.select_activated, 'hyperthreads', toggle) + self.select_items[toggle] = menu_item + menu.append(htm) + + menu.append(Gtk.SeparatorMenuItem()) + + # gpu runtime pm menu items + gputhrottles = ['full', 'cut'] + gpumenu = Gtk.Menu() + gpum = Gtk.MenuItem("GPU Throttle") + gpum.set_submenu(gpumenu) + for toggle in gputhrottles: + menu_item = Gtk.RadioMenuItem.new_with_label(group, readable_gputhrottles(toggle)) + group = menu_item.get_group() + gpumenu.append(menu_item) + menu_item.connect('activate', self.select_activated, 'gputhrottle', toggle) + self.select_items[toggle] = menu_item + menu.append(gpum) menu.show_all() self.ind.set_menu(menu) @@ -107,13 +167,29 @@ for i in self.select_items.values(): i.handler_block_by_func(self.select_activated) - fmin, fmax, governor = cpufreq.get_policy(self.cpus[0]) + govFile = open("/sys/devices/system/cpu/cpufreq/policy0/scaling_governor", 'r') + governor = govFile.readline().strip("\n") + fmnFile = open("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq", 'r') + fmin = int(fmnFile.readline().strip("\n")) + fmxFile = open("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq", 'r') + fmax = int(fmxFile.readline().strip("\n")) # use the highest freq among cores for display - freq = max([cpufreq.get_freq_kernel(cpu) for cpu in self.cpus]) + freq_list = glob.glob('/sys/devices/system/cpu/cpufreq/policy*/scaling_cur_freq') + freqs = [] + for cur_freq in freq_list: + f = open(cur_freq, 'r') + freqs.append(int(f.readline().strip("\n"))) + f.close + + freq = max(freqs) ratio = min([25, 50, 75, 100], key=lambda x: abs((fmax - fmin) * x / 100.0 - (freq - fmin))) if freq < fmax and ratio == 100: ratio = 75 + + govFile.close + fmnFile.close + fmxFile.close #self.set_icon(get_data_file('media', 'indicator-cpufreq-%d.png' % ratio)) self.ind.set_icon('indicator-cpufreq-%d' % ratio) @@ -133,12 +209,21 @@ if menuitem.get_active(): bus = dbus.SystemBus() proxy = bus.get_object("com.ubuntu.IndicatorCpufreqSelector", "/Selector", introspect=False) - cpus = [dbus.UInt32(cpu) for cpu in self.cpus] - if select == 'frequency': - proxy.SetFrequency(cpus, dbus.UInt32(value), + #cpus = [dbus.UInt32(cpu) for cpu in self.cpus] + if select == 'throttle': + proxy.SetThrottle(value, + dbus_interface='com.ubuntu.IndicatorCpufreqSelector') + elif select == 'psturbo': + proxy.SetPSTurbo("turbo-" + value, + dbus_interface='com.ubuntu.IndicatorCpufreqSelector') + elif select == 'hyperthreads': + proxy.SetHyperthreads("ht-" + value, + dbus_interface='com.ubuntu.IndicatorCpufreqSelector') + elif select == 'gputhrottle': + proxy.SetGPUThrottle("gpu-" + value, dbus_interface='com.ubuntu.IndicatorCpufreqSelector') else: - proxy.SetGovernor(cpus, value, + proxy.SetGovernor("gov-" + value, dbus_interface='com.ubuntu.IndicatorCpufreqSelector') def can_set(self):