[PATCH] acpi: cstates: cater for different kernel C-state info
Colin King
colin.king at canonical.com
Tue Dec 11 12:42:48 UTC 2012
From: Colin Ian King <colin.king at canonical.com>
The kernel interface for reporting C states has changed again
for recent kernels. Make sure the we can parse the different ways
it is formatted. Sigh.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/acpi/cstates/cstates.c | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/src/acpi/cstates/cstates.c b/src/acpi/cstates/cstates.c
index 79170df..046ec8c 100644
--- a/src/acpi/cstates/cstates.c
+++ b/src/acpi/cstates/cstates.c
@@ -67,9 +67,8 @@ static void get_cstates(char *path, fwts_cstates *state)
while ((entry = readdir(dir)) != NULL) {
if (entry && strlen(entry->d_name)>3) {
- int nr = 0;
+ int nr;
int count;
- size_t len;
snprintf(filename, sizeof(filename), "%s/%s/name",
path, entry->d_name);
@@ -77,12 +76,21 @@ static void get_cstates(char *path, fwts_cstates *state)
break;
/*
- * Names can be Cx\n, or ATM-Cx\n, or SNB-Cx\n,
- * where x is the C state number
+ * Names can be "Cx\n", or "ATM-Cx\n", or "SNB-Cx\n",
+ * or newer kernels can be "Cx\n" or "Cx-SNB\n" etc
+ * where x is the C state number.
*/
- len = strlen(data);
- if ((len > 2) && (data[len-3] == 'C'))
- nr = strtoull(data+len-2, NULL, 10);
+ if ((data[0] == 'C') && isdigit(data[1]))
+ nr = strtoull(data+1, NULL, 10);
+ else if (strcmp("POLL", data) == 0)
+ nr = 0;
+ else {
+ char *ptr = strstr(data, "-C");
+ if (ptr)
+ nr = strtoull(ptr + 2, NULL, 10);
+ else
+ nr = 0;
+ }
free(data);
snprintf(filename, sizeof(filename), "%s/%s/usage",
--
1.8.0
More information about the fwts-devel
mailing list