overlay: Baytrail needs a custom GPU frequency parser
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 3 Jul 2014 10:18:02 +0000 (11:18 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 11 Jul 2014 22:39:36 +0000 (23:39 +0100)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
overlay/gpu-freq.c
overlay/gpu-freq.h

index 08b1bff..a2d8f08 100644 (file)
@@ -88,26 +88,39 @@ int gpu_freq_init(struct gpu_freq *gf)
 
        buf[len] = '\0';
 
-       s = strstr(buf, "(RPN)");
-       if (s == NULL)
-               goto err;
-       sscanf(s, "(RPN) frequency: %dMHz", &gf->rpn);
-
-       s = strstr(s, "(RP1)");
-       if (s == NULL)
-               goto err;
-       sscanf(s, "(RP1) frequency: %dMHz", &gf->rp1);
-
-       s = strstr(s, "(RP0)");
-       if (s == NULL)
-               goto err;
-       sscanf(s, "(RP0) frequency: %dMHz", &gf->rp0);
-
-       s = strstr(s, "Max");
-       if (s == NULL)
-               goto err;
-       sscanf(s, "Max overclocked frequency: %dMHz", &gf->max);
-       gf->min = gf->rpn;
+       if (strstr(buf, "PUNIT_REG_GPU_FREQ_STS")) {
+               /* Baytrail is special, ofc. */
+               gf->is_byt = 1;
+               s = strstr(buf, "max");
+               if (s == NULL)
+                       goto err;
+               sscanf(s, "max GPU freq: %d MHz", &gf->max);
+               sscanf(s, "min GPU freq: %d MHz", &gf->min);
+
+               gf->rp0 = gf->rp1 = gf->max;
+               gf->rpn = gf->min;
+       } else {
+               s = strstr(buf, "(RPN)");
+               if (s == NULL)
+                       goto err;
+               sscanf(s, "(RPN) frequency: %dMHz", &gf->rpn);
+
+               s = strstr(s, "(RP1)");
+               if (s == NULL)
+                       goto err;
+               sscanf(s, "(RP1) frequency: %dMHz", &gf->rp1);
+
+               s = strstr(s, "(RP0)");
+               if (s == NULL)
+                       goto err;
+               sscanf(s, "(RP0) frequency: %dMHz", &gf->rp0);
+
+               s = strstr(s, "Max");
+               if (s == NULL)
+                       goto err;
+               sscanf(s, "Max overclocked frequency: %dMHz", &gf->max);
+               gf->min = gf->rpn;
+       }
 
        return 0;
 
@@ -140,13 +153,20 @@ int gpu_freq_update(struct gpu_freq *gf)
 
                buf[len] = '\0';
 
-               s = strstr(buf, "RPNSWREQ:");
-               if (s)
-                       sscanf(s, "RPNSWREQ: %dMHz", &gf->request);
-
-               s = strstr(buf, "CAGF:");
-               if (s)
-                       sscanf(s, "CAGF: %dMHz", &gf->current);
+               if (gf->is_byt) {
+                       s = strstr(buf, "current");
+                       if (s)
+                               sscanf(s, "current GPU freq: %d MHz", &gf->current);
+                       gf->request = gf->current;
+               } else {
+                       s = strstr(buf, "RPNSWREQ:");
+                       if (s)
+                               sscanf(s, "RPNSWREQ: %dMHz", &gf->request);
+
+                       s = strstr(buf, "CAGF:");
+                       if (s)
+                               sscanf(s, "CAGF: %dMHz", &gf->current);
+               }
        } else {
                struct gpu_freq_stat *s = &gf->stat[gf->count++&1];
                struct gpu_freq_stat *d = &gf->stat[gf->count&1];
index cdd2bb6..62b21f3 100644 (file)
@@ -34,6 +34,7 @@ struct gpu_freq {
        } stat[2];
        int fd;
        int count;
+       int is_byt;
        int min, max;
        int rpn, rp1, rp0;
        int request;