188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown// Copyright (c) 2012 The Chromium Authors. All rights reserved.
288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown// Use of this source code is governed by a BSD-style license that can be
388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown// found in the LICENSE file.
488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown/**
888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @fileoverview Parses cpufreq events in the Linux event trace format.
988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.importer.linux_perf.parser');
1188448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.exportTo('tracing.importer.linux_perf', function() {
1288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
1388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  var Parser = tracing.importer.linux_perf.Parser;
1488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
1588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  /**
1688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown   * Parses linux cpufreq trace events.
1788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown   * @constructor
1888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown   */
1988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  function CpufreqParser(importer) {
2088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    Parser.call(this, importer);
2188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
2288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_up',
2388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqUpDownEvent.bind(this));
2488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_down',
2588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqUpDownEvent.bind(this));
2688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_already',
2788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqTargetEvent.bind(this));
2888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_notyet',
2988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqTargetEvent.bind(this));
3088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_setspeed',
3188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqTargetEvent.bind(this));
3288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_target',
3388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqTargetEvent.bind(this));
3488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_boost',
3588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this));
3688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    importer.registerEventHandler('cpufreq_interactive_unboost',
3788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this));
3888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  }
3988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
4088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  function splitData(input) {
4188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    // TODO(sleffler) split by cpu
4288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    var data = {};
4388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    var args = input.split(/\s+/);
4488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    var len = args.length;
4588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    for (var i = 0; i < len; i++) {
4688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var item = args[i].split('=');
4788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      data[item[0]] = parseInt(item[1]);
4888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    }
4988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    return data;
5088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  }
5188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
5288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  CpufreqParser.prototype = {
5388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    __proto__: Parser.prototype,
5488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
5588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    cpufreqSlice: function(ts, eventName, cpu, args) {
5688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      // TODO(sleffler) should be per-cpu
5788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var kthread = this.importer.getOrCreatePseudoThread('cpufreq');
5888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      kthread.openSlice = eventName;
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var slice = new tracing.trace_model.Slice('', kthread.openSlice,
6088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown          tracing.getStringColorId(kthread.openSlice), ts, args, 0);
6188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      kthread.thread.sliceGroup.pushSlice(slice);
6388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    },
6488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
6588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    cpufreqBoostSlice: function(ts, eventName, args) {
6688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var kthread = this.importer.getOrCreatePseudoThread('cpufreq_boost');
6788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      kthread.openSlice = eventName;
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var slice = new tracing.trace_model.Slice('', kthread.openSlice,
6988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown          tracing.getStringColorId(kthread.openSlice), ts, args, 0);
7088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      kthread.thread.sliceGroup.pushSlice(slice);
7288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    },
7388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
7488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    /**
7588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown     * Parses cpufreq events and sets up state in the importer.
7688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown     */
7788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    cpufreqUpDownEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
7888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var data = splitData(eventBase.details);
7988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      this.cpufreqSlice(ts, eventName, data.cpu, data);
8088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      return true;
8188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    },
8288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
8388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    cpufreqTargetEvent: function(eventName, cpuNumber, pid, ts,
8488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown                                 eventBase) {
8588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var data = splitData(eventBase.details);
8688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      this.cpufreqSlice(ts, eventName, data.cpu, data);
8788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      return true;
8888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    },
8988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
9088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    cpufreqBoostUnboostEvent: function(eventName, cpuNumber, pid, ts,
9188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown                                       eventBase) {
9288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      this.cpufreqBoostSlice(ts, eventName,
9388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown          {
9488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown            type: eventBase.details
9588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown          });
9688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      return true;
9788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    }
9888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  };
9988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
10088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  Parser.registerSubtype(CpufreqParser);
10188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown
10288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  return {
10388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    CpufreqParser: CpufreqParser
10488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  };
10588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown});
106