Your message dated Thu, 17 Mar 2011 13:58:45 +0100
with message-id <[email protected]>
and subject line powertop is finally available on powerpc
has caused the Debian Bug report #463034,
regarding powertop: PowerPC support
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
463034: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=463034
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: powertop
Version: 1.9-2
Severity: wishlist
Tags: patch

Hi,

please, include the attatched patches to support PowerPC power managment.

Bye, Jörg.

-- System Information:
Debian Release: unstable/experimental
  APT prefers unstable
  APT policy: (900, 'unstable'), (700, 'experimental')
Architecture: powerpc (ppc)

Kernel: Linux 2.6.24-rc6
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages powertop depends on:
ii  libc6                     2.7-6          GNU C Library: Shared libraries
ii  libncursesw5              5.6+20080105-1 Shared libraries for terminal hand

powertop recommends no packages.

-- no debconf information
From 2d89bd652413ecbfdf577d5e2bdaa1a5c38b84ad Mon Sep 17 00:00:00 2001
From: =?utf-8?q?J=C3=B6rg=20Sommer?= <[email protected]>
Date: Sun, 27 Jan 2008 00:58:46 +0100
Subject: [PATCH] Ignore ACPI on PowerPC

The PowerPC architecture doesn't provide support for ACPI. It's
meaningless to suggest the user to enable ACPI or check for /proc/acpi.
It will never exist.
---
 Makefile   |    3 +++
 display.c  |    8 ++++++++
 powertop.c |    6 ++++++
 3 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile
index 62f133e..c3bb650 100644
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,9 @@ WARNFLAGS=-Wall  -W -Wshadow
 CFLAGS?=-Os -g ${WARNFLAGS}
 CC?=gcc
 
+ifeq (, $(findstring $(shell uname -m),ppc ppc64))
+    CFLAGS += -DWITH_ACPI
+endif
 
 # 
 # The w in -lncursesw is not a typo; it is the wide-character version
diff --git a/display.c b/display.c
index 6271da9..a753eae 100644
--- a/display.c
+++ b/display.c
@@ -38,7 +38,9 @@
 static WINDOW *title_bar_window;
 static WINDOW *cstate_window;
 static WINDOW *wakeup_window;
+#ifdef WITH_ACPI
 static WINDOW *acpi_power_window;
+#endif
 static WINDOW *timerstat_window;
 static WINDOW *suggestion_window;
 static WINDOW *status_bar_window;
@@ -65,10 +67,12 @@ static void zap_windows(void)
 		delwin(wakeup_window);
 		wakeup_window = NULL;
 	}
+#ifdef WITH_ACPI
 	if (acpi_power_window) {
 		delwin(acpi_power_window);
 		acpi_power_window = NULL;
 	}
+#endif
 	if (timerstat_window) {
 		delwin(timerstat_window);
 		timerstat_window = NULL;
@@ -98,7 +102,9 @@ void setup_windows(void)
 	title_bar_window = subwin(stdscr, 1, maxx, 0, 0);
 	cstate_window = subwin(stdscr, 7, maxx, 2, 0);
 	wakeup_window = subwin(stdscr, 1, maxx, 9, 0);
+#ifdef WITH_ACPI
 	acpi_power_window = subwin(stdscr, 2, maxx, 10, 0);
+#endif
 	timerstat_window = subwin(stdscr, maxy-16, maxx, 12, 0);
 	maxtimerstats = maxy-16  -2;
 	maxwidth = maxx - 18;
@@ -186,6 +192,7 @@ void show_cstates(void)
 }
 
 
+#ifdef WITH_ACPI
 void show_acpi_power_line(double rate, double cap, double capdelta, time_t ti)
 {
 	char buffer[1024];
@@ -207,6 +214,7 @@ void show_acpi_power_line(double rate, double cap, double capdelta, time_t ti)
 	print(acpi_power_window, 0, 0, "%s\n", buffer);	
 	wrefresh(acpi_power_window);
 }
+#endif
 
 void show_wakeups(double d, double interval, double C0time)
 {
diff --git a/powertop.c b/powertop.c
index abf32cd..54b709f 100644
--- a/powertop.c
+++ b/powertop.c
@@ -238,6 +238,7 @@ static void do_proc_irq(void)
 
 static void read_data(uint64_t * usage, uint64_t * duration)
 {
+#ifdef WITH_ACPI
 	DIR *dir;
 	struct dirent *entry;
 	FILE *file = NULL;
@@ -284,6 +285,7 @@ static void read_data(uint64_t * usage, uint64_t * duration)
 		fclose(file);
 	}
 	closedir(dir);
+#endif
 }
 
 void stop_timerstats(void)
@@ -322,6 +324,7 @@ void sort_lines(void)
 
 void print_battery(void)
 {
+#ifdef WITH_ACPI
 	DIR *dir;
 	struct dirent *dirent;
 	FILE *file;
@@ -404,6 +407,7 @@ void print_battery(void)
 	}
 
 	show_acpi_power_line(rate, cap, prev_bat_cap - cap, time(NULL) - prev_bat_time);
+#endif
 }
 
 char cstate_lines[6][200];
@@ -693,8 +697,10 @@ int main(int argc, char **argv)
 				    _("Suggestion: Enable the CONFIG_CPU_FREQ_GOV_ONDEMAND kernel configuration option.\n"
 				      "The 'ondemand' CPU speed governor will minimize the CPU power usage while\n" "giving you performance when it is needed."), 5);
 		suggest_kernel_config("CONFIG_NO_HZ", 1, _("Suggestion: Enable the CONFIG_NO_HZ kernel configuration option.\nThis option is required to get any kind of longer sleep times in the CPU."), 50);
+#ifdef WITH_ACPI
 		suggest_kernel_config("CONFIG_ACPI_BATTERY", 1, _("Suggestion: Enable the CONFIG_ACPI_BATTERY kernel configuration option.\n "
 				      "This option is required to get power estimages from PowerTOP"), 5);
+#endif
 		suggest_kernel_config("CONFIG_HPET_TIMER", 1,
 				    _("Suggestion: Enable the CONFIG_HPET_TIMER kernel configuration option.\n"
 				      "Without HPET support the kernel needs to wake up every 20 milliseconds for \n" "some housekeeping tasks."), 10);
-- 
1.5.4.rc4

From 38e4746f26e5e4374f88be12166fd3cf5e6ee6a6 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?J=C3=B6rg=20Sommer?= <[email protected]>
Date: Sun, 27 Jan 2008 02:18:41 +0100
Subject: [PATCH] Rename acpi_power_window to power_window

For other types of power managment systems a more common name is better.
---
 display.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/display.c b/display.c
index a753eae..0e92bbc 100644
--- a/display.c
+++ b/display.c
@@ -39,7 +39,7 @@ static WINDOW *title_bar_window;
 static WINDOW *cstate_window;
 static WINDOW *wakeup_window;
 #ifdef WITH_ACPI
-static WINDOW *acpi_power_window;
+static WINDOW *power_window;
 #endif
 static WINDOW *timerstat_window;
 static WINDOW *suggestion_window;
@@ -68,9 +68,9 @@ static void zap_windows(void)
 		wakeup_window = NULL;
 	}
 #ifdef WITH_ACPI
-	if (acpi_power_window) {
-		delwin(acpi_power_window);
-		acpi_power_window = NULL;
+	if (power_window) {
+		delwin(power_window);
+		power_window = NULL;
 	}
 #endif
 	if (timerstat_window) {
@@ -103,7 +103,7 @@ void setup_windows(void)
 	cstate_window = subwin(stdscr, 7, maxx, 2, 0);
 	wakeup_window = subwin(stdscr, 1, maxx, 9, 0);
 #ifdef WITH_ACPI
-	acpi_power_window = subwin(stdscr, 2, maxx, 10, 0);
+	power_window = subwin(stdscr, 2, maxx, 10, 0);
 #endif
 	timerstat_window = subwin(stdscr, maxy-16, maxx, 12, 0);
 	maxtimerstats = maxy-16  -2;
@@ -199,7 +199,7 @@ void show_acpi_power_line(double rate, double cap, double capdelta, time_t ti)
 
 	sprintf(buffer,  _("no ACPI power usage estimate available") );
 
-	werase(acpi_power_window);
+	werase(power_window);
 	if (rate > 0.001) {
 		char *c;
 		sprintf(buffer, _("Power usage (ACPI estimate): %3.1fW (%3.1f hours)"), rate, cap/rate);
@@ -211,8 +211,8 @@ void show_acpi_power_line(double rate, double cap, double capdelta, time_t ti)
 	else if (ti>120 && capdelta > 0.001)
 		sprintf(buffer, _("Power usage (5 minute ACPI estimate) : %5.1f W (%3.1f hours left)"), 3600*capdelta / ti, cap / (3600*capdelta/ti+0.01));
 
-	print(acpi_power_window, 0, 0, "%s\n", buffer);	
-	wrefresh(acpi_power_window);
+	print(power_window, 0, 0, "%s\n", buffer);
+	wrefresh(power_window);
 }
 #endif
 
-- 
1.5.4.rc4

From c3e3a92373bb0e8c44a58c53112b6f5d567ed1db Mon Sep 17 00:00:00 2001
From: =?utf-8?q?J=C3=B6rg=20Sommer?= <[email protected]>
Date: Sun, 27 Jan 2008 02:39:10 +0100
Subject: [PATCH] Support for PMU

The PowerPC architecture uses the Power Managment Unit instead of ACPI to
access the power state.
---
 Makefile   |    3 ++
 display.c  |   45 ++++++++++++++++++++++++++++++++++++--
 powertop.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 114 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index c3bb650..e0c6e61 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,9 @@ CC?=gcc
 ifeq (, $(findstring $(shell uname -m),ppc ppc64))
     CFLAGS += -DWITH_ACPI
 endif
+ifneq (, $(findstring $(shell uname -m),ppc ppc64))
+    CFLAGS += -DWITH_PMU
+endif
 
 # 
 # The w in -lncursesw is not a typo; it is the wide-character version
diff --git a/display.c b/display.c
index 0e92bbc..3783a42 100644
--- a/display.c
+++ b/display.c
@@ -38,7 +38,7 @@
 static WINDOW *title_bar_window;
 static WINDOW *cstate_window;
 static WINDOW *wakeup_window;
-#ifdef WITH_ACPI
+#if defined(WITH_ACPI) || defined(WITH_PMU)
 static WINDOW *power_window;
 #endif
 static WINDOW *timerstat_window;
@@ -67,7 +67,7 @@ static void zap_windows(void)
 		delwin(wakeup_window);
 		wakeup_window = NULL;
 	}
-#ifdef WITH_ACPI
+#if defined(WITH_ACPI) || defined(WITH_PMU)
 	if (power_window) {
 		delwin(power_window);
 		power_window = NULL;
@@ -102,7 +102,7 @@ void setup_windows(void)
 	title_bar_window = subwin(stdscr, 1, maxx, 0, 0);
 	cstate_window = subwin(stdscr, 7, maxx, 2, 0);
 	wakeup_window = subwin(stdscr, 1, maxx, 9, 0);
-#ifdef WITH_ACPI
+#if defined(WITH_ACPI) || defined(WITH_PMU)
 	power_window = subwin(stdscr, 2, maxx, 10, 0);
 #endif
 	timerstat_window = subwin(stdscr, maxy-16, maxx, 12, 0);
@@ -216,6 +216,45 @@ void show_acpi_power_line(double rate, double cap, double capdelta, time_t ti)
 }
 #endif
 
+#ifdef WITH_PMU
+void show_pmu_power_line(unsigned num_batteries, unsigned sum_voltage_mV,
+                         unsigned sum_charge_mAh, unsigned sum_max_charge_mAh,
+                         int sum_discharge_mA)
+{
+	char buffer[1024];
+
+	if (sum_discharge_mA != 0)
+	{
+		unsigned remaining_charge_mAh;
+
+		if (sum_discharge_mA < 0)
+		{
+			/* we are currently discharging */
+			sum_discharge_mA = -sum_discharge_mA;
+			remaining_charge_mAh = sum_charge_mAh;
+		}
+		else
+		{
+			/* we are currently charging */
+			remaining_charge_mAh = (sum_max_charge_mAh
+                                                - sum_charge_mAh);
+		}
+
+		snprintf(buffer, sizeof(buffer),
+                         _("Power usage: %3.1fW (%3.1f hours)"),
+			 sum_voltage_mV * sum_discharge_mA / 1e6,
+			 (double)remaining_charge_mAh / sum_discharge_mA);
+	}
+	else
+		snprintf(buffer, sizeof(buffer),
+                         _("no power usage estimate available") );
+
+	werase(power_window);
+	print(power_window, 0, 0, "%s\n", buffer);
+	wrefresh(power_window);
+}
+#endif
+
 void show_wakeups(double d, double interval, double C0time)
 {
 	werase(wakeup_window);
diff --git a/powertop.c b/powertop.c
index 54b709f..f7c2897 100644
--- a/powertop.c
+++ b/powertop.c
@@ -407,6 +407,75 @@ void print_battery(void)
 	}
 
 	show_acpi_power_line(rate, cap, prev_bat_cap - cap, time(NULL) - prev_bat_time);
+#elif WITH_PMU
+    char line[80];
+    int i;
+    int power_present = 0;
+    int num_batteries = 0;
+    /* unsigned rem_time_sec = 0; */
+    unsigned charge_mAh = 0, max_charge_mAh = 0, voltage_mV = 0;
+    int discharge_mA = 0;
+    FILE *fd;
+
+    fd = fopen("/proc/pmu/info", "r");
+    if (fd == NULL)
+      return;
+
+    while ( fgets(line, sizeof(line), fd) != NULL )
+    {
+        if (strncmp("AC Power", line, strlen("AC Power")) == 0)
+          sscanf(strchr(line, ':')+2, "%d", &power_present);
+        else if (strncmp("Battery count", line, strlen("Battery count")) == 0)
+          sscanf(strchr(line, ':')+2, "%d", &num_batteries);
+    }
+    fclose(fd);
+
+    for (i = 0; i < num_batteries; ++i)
+    {
+        char file_name[20];
+        int flags = 0;
+        /* int battery_charging, battery_full; */
+        /* unsigned this_rem_time_sec = 0; */
+        unsigned this_charge_mAh = 0, this_max_charge_mAh = 0;
+        unsigned this_voltage_mV = 0, this_discharge_mA = 0;
+
+        snprintf(file_name, sizeof(file_name), "/proc/pmu/battery_%d", i);
+        fd = fopen(file_name, "r");
+        if (fd == NULL)
+          continue;
+
+        while (fgets(line, sizeof(line), fd) != NULL)
+        {
+            if (strncmp("flags", line, strlen("flags")) == 0)
+              sscanf(strchr(line, ':')+2, "%x", &flags);
+            else if (strncmp("charge", line, strlen("charge")) == 0)
+              sscanf(strchr(line, ':')+2, "%d", &this_charge_mAh);
+            else if (strncmp("max_charge", line, strlen("max_charge")) == 0)
+              sscanf(strchr(line, ':')+2, "%d", &this_max_charge_mAh);
+            else if (strncmp("voltage", line, strlen("voltage")) == 0)
+              sscanf(strchr(line, ':')+2, "%d", &this_voltage_mV);
+            else if (strncmp("current", line, strlen("current")) == 0)
+              sscanf(strchr(line, ':')+2, "%d", &this_discharge_mA);
+            /* else if (strncmp("time rem.", line, strlen("time rem.")) == 0) */
+            /*   sscanf(strchr(line, ':')+2, "%d", &this_rem_time_sec); */
+        }
+        fclose(fd);
+
+        if ( !(flags & 0x1) )
+          /* battery isn't present */
+          continue;
+
+        /* battery_charging = flags & 0x2; */
+        /* battery_full = !battery_charging && power_present; */
+
+        charge_mAh += this_charge_mAh;
+        max_charge_mAh += this_max_charge_mAh;
+        voltage_mV += this_voltage_mV;
+        discharge_mA += this_discharge_mA;
+        /* rem_time_sec += this_rem_time_sec; */
+    }
+    show_pmu_power_line(num_batteries, voltage_mV, charge_mAh, max_charge_mAh,
+                        discharge_mA);
 #endif
 }
 
-- 
1.5.4.rc4

Attachment: signature.asc
Description: Digital signature


--- End Message ---
--- Begin Message ---
Version: 1.97-1

Hey,
powertop is finally available on powerpc, see:
http://packages.debian.org/sid/powertop

Greetings
Winnie

Attachment: signature.asc
Description: This is a digitally signed message part.


--- End Message ---

Reply via email to