summaryrefslogtreecommitdiffstats
path: root/src/wakeup
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 20:00:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 20:00:20 +0000
commitfcb4cb5c3d0fec0fede160d565134d553d783fb2 (patch)
tree7be42535554ca6badc1847d83ef123f4dc3c5506 /src/wakeup
parentInitial commit. (diff)
downloadpowertop-fcb4cb5c3d0fec0fede160d565134d553d783fb2.tar.xz
powertop-fcb4cb5c3d0fec0fede160d565134d553d783fb2.zip
Adding upstream version 2.15.upstream/2.15upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/wakeup')
-rw-r--r--src/wakeup/waketab.cpp195
-rw-r--r--src/wakeup/wakeup.cpp52
-rw-r--r--src/wakeup/wakeup.h81
-rw-r--r--src/wakeup/wakeup_ethernet.cpp111
-rw-r--r--src/wakeup/wakeup_ethernet.h50
-rw-r--r--src/wakeup/wakeup_usb.cpp111
-rw-r--r--src/wakeup/wakeup_usb.h50
7 files changed, 650 insertions, 0 deletions
diff --git a/src/wakeup/waketab.cpp b/src/wakeup/waketab.cpp
new file mode 100644
index 0000000..77d7567
--- /dev/null
+++ b/src/wakeup/waketab.cpp
@@ -0,0 +1,195 @@
+#include <algorithm>
+#include <stdio.h>
+#include <string.h>
+#include <ncurses.h>
+#include "wakeup.h"
+#include <vector>
+#include "../lib.h"
+#include "../measurement/sysfs.h"
+#include "../display.h"
+#include "../report/report.h"
+#include "../report/report-maker.h"
+#include "../report/report-data-html.h"
+#include "wakeup_ethernet.h"
+#include "wakeup_usb.h"
+
+using namespace std;
+
+static bool should_clear = false;
+
+class wakeup_window *newtab_window;
+
+class wakeup_window: public tab_window {
+public:
+ virtual void repaint(void);
+ virtual void cursor_enter(void);
+ virtual void expose(void);
+ virtual void window_refresh(void);
+};
+
+static void init_wakeup(void)
+{
+ add_ethernet_wakeup();
+ add_usb_wakeup();
+}
+
+void initialize_wakeup(void)
+{
+ class wakeup_window *win;
+
+ win = new wakeup_window();
+
+ create_tab("WakeUp", _("WakeUp"), win, _(" <ESC> Exit | <Enter> Toggle wakeup | <r> Window refresh"));
+
+ init_wakeup();
+
+ win->cursor_max = wakeup_all.size() - 1;
+
+ if (newtab_window)
+ delete newtab_window;
+
+ newtab_window = win;
+}
+
+static void __wakeup_update_display(int cursor_pos)
+{
+ WINDOW *win;
+ unsigned int i;
+
+ win = get_ncurses_win("WakeUp");
+
+ if (!win)
+ return;
+
+ if (should_clear) {
+ should_clear = false;
+ wclear(win);
+ }
+
+ wmove(win, 1,0);
+
+ for (i = 0; i < wakeup_all.size(); i++) {
+ char res[128];
+ char desc[4096];
+ pt_strcpy(res, wakeup_all[i]->wakeup_string());
+ pt_strcpy(desc, wakeup_all[i]->description());
+ while (strlen(res) < 12)
+ strcat(res, " ");
+
+ while (strlen(desc) < 103)
+ strcat(desc, " ");
+
+ if ((int)i != cursor_pos) {
+ wattrset(win, A_NORMAL);
+ wprintw(win, " ");
+ } else {
+ wattrset(win, A_REVERSE);
+ wprintw(win, ">> ");
+ }
+ wprintw(win, "%s %s\n", _(res), _(desc));
+ }
+}
+
+void wakeup_update_display(void)
+{
+ class tab_window *wt;
+
+ wt = tab_windows["WakeUp"];
+ if (!wt)
+ return;
+ wt->repaint();
+}
+
+void wakeup_window::repaint(void)
+{
+ __wakeup_update_display(cursor_pos);
+}
+
+void wakeup_window::cursor_enter(void)
+{
+ class wakeup *wake;
+ const char *wakeup_toggle_script;
+ wake = wakeup_all[cursor_pos];
+ if (!wake)
+ return;
+ wakeup_toggle_script = wake->wakeup_toggle_script();
+ wake->wakeup_toggle();
+ ui_notify_user(">> %s\n", wakeup_toggle_script);
+}
+
+void report_show_wakeup(void)
+{
+ unsigned int i;
+ int idx, rows = 0, cols;
+
+ /* div attr css_class and css_id */
+ tag_attr div_attr;
+ init_div(&div_attr, "clear_block", "wakeup");
+
+ /* Set Title attributes */
+ tag_attr title_attr;
+ init_title_attr(&title_attr);
+
+ /* Set Table attributes, rows, and cols */
+ table_attributes wakeup_table_css;
+ cols=2;
+ idx = cols;
+
+ for (i = 0; i < wakeup_all.size(); i++) {
+ int tgb;
+ tgb = wakeup_all[i]->wakeup_value();
+ if (tgb == WAKEUP_DISABLE)
+ rows+=1;
+ }
+
+ /* add section */
+
+ report.add_div(&div_attr);
+ if (rows > 0){
+ rows= rows + 1;
+ init_wakeup_table_attr(&wakeup_table_css, rows, cols);
+
+ /* Set array of data in row Major order */
+ string *wakeup_data = new string[cols * rows];
+
+ wakeup_data[0]=__("Description");
+ wakeup_data[1]=__("Script");
+
+ for (i = 0; i < wakeup_all.size(); i++) {
+ int gb;
+ gb = wakeup_all[i]->wakeup_value();
+ if (gb != WAKEUP_DISABLE)
+ continue;
+ wakeup_data[idx]=string(wakeup_all[i]->description());
+ idx+=1;
+ wakeup_data[idx]=string(wakeup_all[i]->wakeup_toggle_script());
+ idx+=1;
+ }
+
+ /* Report Output */
+ report.add_title(&title_attr,__("Wake status of the devices"));
+ report.add_table(wakeup_data, &wakeup_table_css);
+ delete [] wakeup_data;
+ }
+}
+
+void wakeup_window::expose(void)
+{
+ cursor_pos = 0;
+ repaint();
+}
+
+void wakeup_window::window_refresh(void)
+{
+ clear_wakeup();
+ should_clear = true;
+ init_wakeup();
+}
+
+void clear_wakeup()
+{
+ for (size_t i = 0; i < wakeup_all.size(); i++) {
+ delete wakeup_all[i];
+ }
+ wakeup_all.clear();
+}
diff --git a/src/wakeup/wakeup.cpp b/src/wakeup/wakeup.cpp
new file mode 100644
index 0000000..9d83a9a
--- /dev/null
+++ b/src/wakeup/wakeup.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Gayatri Kammela <gayatri.kammela@intel.com>
+ */
+
+#include <string.h>
+#include <ncurses.h>
+#include "wakeup.h"
+#include <vector>
+#include "../lib.h"
+
+using namespace std;
+
+vector<class wakeup *> wakeup_all;
+
+wakeup::wakeup(const char *str, double _score, const char *enable, const char *disable)
+{
+ score = _score;
+ pt_strcpy(desc, str);
+ pt_strcpy(wakeup_enable, enable);
+ pt_strcpy(wakeup_disable, disable);
+}
+
+wakeup::wakeup(void)
+{
+ score = 0;
+ desc[0] = 0;
+ pt_strcpy(wakeup_enable, _("Enabled"));
+ pt_strcpy(wakeup_disable, _("Disabled"));
+ pt_strcpy(wakeup_idle, _("Unknown"));
+}
+
diff --git a/src/wakeup/wakeup.h b/src/wakeup/wakeup.h
new file mode 100644
index 0000000..13f99a3
--- /dev/null
+++ b/src/wakeup/wakeup.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2018, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Gayatri Kammela <gayatri.kammela@intel.com>
+ */
+#ifndef _INCLUDE_GUARD_WAKEUP_H
+#define _INCLUDE_GUARD_WAKEUP_H
+
+#include<vector>
+#include <limits.h>
+
+using namespace std;
+
+#define WAKEUP_ENABLE 1
+#define WAKEUP_DISABLE 0
+
+class wakeup {
+ char wakeup_enable[128];
+ char wakeup_disable[128];
+ char wakeup_idle[128];
+protected:
+ char toggle_enable[4096];
+ char toggle_disable[4096];
+public:
+ char desc[4096];
+ double score;
+
+ wakeup(const char *str, double _score, const char *enable = "", const char *disable = "");
+ wakeup(void);
+
+ virtual ~wakeup () {};
+
+ virtual int wakeup_value(void) { return WAKEUP_DISABLE; }
+
+ virtual char *wakeup_string(void)
+ {
+ switch (wakeup_value()) {
+ case WAKEUP_ENABLE:
+ return wakeup_enable;
+ case WAKEUP_DISABLE:
+ return wakeup_disable;
+ }
+ return wakeup_idle;
+ }
+
+
+ virtual const char *description(void) { return desc; };
+
+ virtual void wakeup_toggle(void) { };
+
+ virtual const char *wakeup_toggle_script(void) { return toggle_enable; }
+
+};
+
+extern vector<class wakeup *> wakeup_all;
+
+extern void initialize_wakeup(void);
+extern void wakeup_update_display(void);
+extern void report_show_wakeup(void);
+extern void clear_wakeup(void);
+
+#endif
diff --git a/src/wakeup/wakeup_ethernet.cpp b/src/wakeup/wakeup_ethernet.cpp
new file mode 100644
index 0000000..6ce1725
--- /dev/null
+++ b/src/wakeup/wakeup_ethernet.cpp
@@ -0,0 +1,111 @@
+;/*
+ * Copyright 2018, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Gayatri Kammela <gayatri.kammela@intel.com>
+ */
+
+#include "wakeup.h"
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utility>
+#include <iostream>
+#include <fstream>
+#include <sys/socket.h>
+#include <errno.h>
+#include <linux/types.h>
+#include <net/if.h>
+#include <linux/sockios.h>
+#include <sys/ioctl.h>
+
+#include <linux/ethtool.h>
+
+#include "../lib.h"
+#include "wakeup_ethernet.h"
+
+ethernet_wakeup::ethernet_wakeup(const char *path, const char *iface) : wakeup("", 0.5, _("Enabled"), _("Disabled"))
+{
+ memset(interf, 0, sizeof(interf));
+ pt_strcpy(interf, iface);
+ sprintf(desc, _("Wake-on-lan status for device %s"), iface);
+ snprintf(eth_path, sizeof(eth_path), "/sys/class/net/%s/device/power/wakeup", iface);
+ snprintf(toggle_enable, sizeof(toggle_enable), "echo 'enabled' > '%s';", eth_path);
+ snprintf(toggle_disable, sizeof(toggle_disable), "echo 'disabled' > '%s';", eth_path);
+}
+
+int ethernet_wakeup::wakeup_value(void)
+{
+ string content;
+
+ content = read_sysfs_string(eth_path);
+
+ if (strcmp(content.c_str(), "enabled") == 0)
+ return WAKEUP_ENABLE;
+
+ return WAKEUP_DISABLE;
+}
+
+void ethernet_wakeup::wakeup_toggle(void)
+{
+ int enable;
+ enable = wakeup_value();
+
+ if (enable == WAKEUP_ENABLE) {
+ write_sysfs(eth_path, "disabled");
+ return;
+ }
+
+ write_sysfs(eth_path, "enabled");
+}
+
+const char *ethernet_wakeup::wakeup_toggle_script(void)
+{
+ int enable;
+ enable = wakeup_value();
+
+ if (enable == WAKEUP_ENABLE) {
+ return toggle_disable;
+ }
+
+ return toggle_enable;
+}
+
+void wakeup_eth_callback(const char *d_name)
+{
+ class ethernet_wakeup *eth;
+ char filename[PATH_MAX];
+
+ snprintf(filename, sizeof(filename), "/sys/class/net/%s/device/power/wakeup", d_name);
+ if (access(filename, R_OK) != 0)
+ return;
+
+ snprintf(filename, sizeof(filename), "/sys/class/net/%s/device/power/wakeup", d_name);
+ eth = new class ethernet_wakeup(filename, d_name);
+ wakeup_all.push_back(eth);
+}
+
+void add_ethernet_wakeup(void)
+{
+ process_directory("/sys/class/net/", wakeup_eth_callback);
+}
diff --git a/src/wakeup/wakeup_ethernet.h b/src/wakeup/wakeup_ethernet.h
new file mode 100644
index 0000000..682bf95
--- /dev/null
+++ b/src/wakeup/wakeup_ethernet.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2018, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Gayatri Kammela <gayatri.kammela@intel.com>
+ */
+#ifndef _INCLUDE_GUARD_ETHERNET_WAKEUP_H
+#define _INCLUDE_GUARD_ETHERNET_WAKEUP_H
+
+#include <vector>
+
+#include "wakeup.h"
+
+using namespace std;
+
+class ethernet_wakeup : public wakeup {
+ char eth_path[PATH_MAX];
+public:
+ char interf[4096];
+ ethernet_wakeup(const char *eth_path, const char *iface);
+
+ virtual int wakeup_value(void);
+
+ virtual void wakeup_toggle(void);
+
+ virtual const char *wakeup_toggle_script(void);
+
+};
+
+extern void add_ethernet_wakeup(void);
+
+#endif
diff --git a/src/wakeup/wakeup_usb.cpp b/src/wakeup/wakeup_usb.cpp
new file mode 100644
index 0000000..e0e4567
--- /dev/null
+++ b/src/wakeup/wakeup_usb.cpp
@@ -0,0 +1,111 @@
+;/*
+ * Copyright 2018, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Gayatri Kammela <gayatri.kammela@intel.com>
+ */
+
+#include "wakeup.h"
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utility>
+#include <iostream>
+#include <fstream>
+#include <sys/socket.h>
+#include <errno.h>
+#include <linux/types.h>
+#include <net/if.h>
+#include <linux/sockios.h>
+#include <sys/ioctl.h>
+
+#include <linux/ethtool.h>
+
+#include "../lib.h"
+#include "wakeup_usb.h"
+
+usb_wakeup::usb_wakeup(const char *path, const char *iface) : wakeup("", 0.5, _("Enabled"), _("Disabled"))
+{
+ memset(interf, 0, sizeof(interf));
+ pt_strcpy(interf, iface);
+ sprintf(desc, _("Wake status for USB device %s"), iface);
+ snprintf(usb_path, sizeof(usb_path), "/sys/bus/usb/devices/%s/power/wakeup", iface);
+ snprintf(toggle_enable, sizeof(toggle_enable), "echo 'enabled' > '%s';", usb_path);
+ snprintf(toggle_disable, sizeof(toggle_disable), "echo 'disabled' > '%s';", usb_path);
+}
+
+int usb_wakeup::wakeup_value(void)
+{
+ string content;
+
+ content = read_sysfs_string(usb_path);
+
+ if (strcmp(content.c_str(), "enabled") == 0)
+ return WAKEUP_ENABLE;
+
+ return WAKEUP_DISABLE;
+}
+
+void usb_wakeup::wakeup_toggle(void)
+{
+ int enable;
+ enable = wakeup_value();
+
+ if (enable == WAKEUP_ENABLE) {
+ write_sysfs(usb_path, "disabled");
+ return;
+ }
+
+ write_sysfs(usb_path, "enabled");
+}
+
+const char *usb_wakeup::wakeup_toggle_script(void)
+{
+ int enable;
+ enable = wakeup_value();
+
+ if (enable == WAKEUP_ENABLE) {
+ return toggle_disable;
+ }
+
+ return toggle_enable;
+}
+
+void wakeup_usb_callback(const char *d_name)
+{
+ class usb_wakeup *usb;
+ char filename[PATH_MAX];
+
+ snprintf(filename, sizeof(filename), "/sys/bus/usb/devices/%s/power/wakeup", d_name);
+ if (access(filename, R_OK) != 0)
+ return;
+
+ snprintf(filename, sizeof(filename), "/sys/bus/usb/devices/%s/power/wakeup", d_name);
+ usb = new class usb_wakeup(filename, d_name);
+ wakeup_all.push_back(usb);
+}
+
+void add_usb_wakeup(void)
+{
+ process_directory("/sys/bus/usb/devices/", wakeup_usb_callback);
+}
diff --git a/src/wakeup/wakeup_usb.h b/src/wakeup/wakeup_usb.h
new file mode 100644
index 0000000..f7a1f7e
--- /dev/null
+++ b/src/wakeup/wakeup_usb.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2018, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Gayatri Kammela <gayatri.kammela@intel.com>
+ */
+#ifndef _INCLUDE_GUARD_USB_WAKEUP_H
+#define _INCLUDE_GUARD_USB_WAKEUP_H
+
+#include <vector>
+
+#include "wakeup.h"
+
+using namespace std;
+
+class usb_wakeup : public wakeup {
+ char usb_path[PATH_MAX];
+public:
+ char interf[4096];
+ usb_wakeup(const char *usb_path, const char *iface);
+
+ virtual int wakeup_value(void);
+
+ virtual void wakeup_toggle(void);
+
+ virtual const char *wakeup_toggle_script(void);
+
+};
+
+extern void add_usb_wakeup(void);
+
+#endif