Add i915 GPU frequency statistics.

This change enables GPU frequency stats for i915 GPU via GPUFreqStats
class.

BUG=chromium:286088
TEST=run test.

1. power_Idle on Lumpy 3.8 kernel and see:
  $ grep gpu results/keyval
     percent_gpufreq_1000_time{perf}=0.0
     percent_gpufreq_350_time{perf}=100.0
     percent_gpufreq_400_time{perf}=0.0
     percent_gpufreq_450_time{perf}=0.0
     percent_gpufreq_500_time{perf}=0.0
     percent_gpufreq_550_time{perf}=0.0
     percent_gpufreq_600_time{perf}=0.0
     percent_gpufreq_650_time{perf}=0.0
     percent_gpufreq_700_time{perf}=0.0
     percent_gpufreq_750_time{perf}=0.0
     percent_gpufreq_800_time{perf}=0.0
     percent_gpufreq_850_time{perf}=0.0
     percent_gpufreq_900_time{perf}=0.0
     percent_gpufreq_950_time{perf}=0.0

  100% is expected as the 'idle' test should not stimulate the GPU.

2. power_Idle on Lumpy 3.4 kernel and test still passes w/o stats for GPU

Change-Id: I4bfcd6316f1c82edc8c96f2979c50a5d31be8a5a
Reviewed-on: https://chromium-review.googlesource.com/168777
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Reviewed-by: Sameer Nanda <snanda@chromium.org>
Commit-Queue: Todd Broch <tbroch@chromium.org>
Tested-by: Todd Broch <tbroch@chromium.org>
diff --git a/client/cros/kernel_trace.py b/client/cros/kernel_trace.py
index 3726f03..5087653 100644
--- a/client/cros/kernel_trace.py
+++ b/client/cros/kernel_trace.py
@@ -17,6 +17,9 @@
     Public methods:
         on          : Enables tracing
         off         : Disables tracing
+        is_tracing  : Returns Boolean of tracing status.
+        event_on    : Turns event on.  Returns boolean of success
+        event_off   : Turns event off.  Returns boolean of success
         flush       : Flushes trace buffer
         read        : Reads trace buffer returns list of
                       - tuples if regexp provided
@@ -41,13 +44,14 @@
         """Constructor for KernelTrace class"""
         self._buffer = []
         self._buffer_ptr = 0
-        self._events = events
+        self._events = []
         self._on = on
 
         if flush:
             self.flush()
         for event in events:
-            self.event_on(event)
+            if self.event_on(event):
+                self._events.append(event)
         if on:
             self.on()
 
@@ -68,7 +72,7 @@
 
         Raises:
             error.TestFail: If unable to enable/disable tracing
-           boolean of tracing on/off status
+              boolean of tracing on/off status
         """
         utils.write_one_line(self._TRACE_EN_PATH, val)
         fname = os.path.join(self._TRACE_ROOT, 'tracing_on')
@@ -88,6 +92,19 @@
         self._onoff(0)
 
 
+    def is_tracing(self):
+        """Is tracing on?
+
+        Returns:
+            True if tracing enabled and at least one event is enabled.
+        """
+        fname = os.path.join(self._TRACE_ROOT, 'tracing_on')
+        result = int(utils.read_one_line(fname).strip())
+        if result == 1 and len(self._events) > 0:
+            return True
+        return False
+
+
     def _event_onoff(self, event, val):
         """Enable/Disable tracing event.
 
@@ -100,15 +117,16 @@
                    See kernel(Documentation/trace/events.txt) for formatting.
             val: integer, 1 for on, 0 for off
 
-        Raises:
-            error.TestFail: If unable to enable/disable event
+         Returns:
+            True if success, false otherwise
         """
         logging.debug("event_onoff: event:%s val:%d", event, val)
         event_path = event.replace(':', '/')
         fname = os.path.join(self._TRACE_ROOT, 'events', event_path, 'enable')
 
         if not os.path.exists(fname):
-            raise error.TestFail("Unable to locate tracing event %s" % fname)
+            logging.warn("Unable to locate tracing event %s", fname)
+            return False
         utils.write_one_line(fname, val)
 
         fname = os.path.join(self._TRACE_ROOT, "set_event")
@@ -121,17 +139,22 @@
                     break
 
         if val == 1 and not found:
-            raise error.TestFail("Event %s not enabled" % event)
+            logging.warn("Event %s not enabled", event)
+            return False
+
         if val == 0 and found:
-            raise error.TestFail("Event %s not disabled" % event)
+            logging.warn("Event %s not disabled", event)
+            return False
+
+        return True
 
 
     def event_on(self, event):
-        self._event_onoff(event, 1)
+        return self._event_onoff(event, 1)
 
 
     def event_off(self, event):
-        self._event_onoff(event, 0)
+        return self._event_onoff(event, 0)
 
 
     def flush(self):
@@ -140,7 +163,6 @@
         Raises:
             error.TestFail: If unable to flush
         """
-
         self.off()
         fname = os.path.join(self._TRACE_ROOT, 'free_buffer')
         utils.write_one_line(fname, 1)