12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Use of this source code is governed by a BSD-style license that can be
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// found in the LICENSE file.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis/**
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * @fileoverview Parses exynos events in the Linux event trace format.
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis */
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.importer.linux_perf.parser');
1188448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.exportTo('tracing.importer.linux_perf', function() {
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  var Parser = tracing.importer.linux_perf.Parser;
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  /**
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * Parses linux exynos trace events.
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * @constructor
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   */
1988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  function ExynosParser(importer) {
2088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    Parser.call(this, importer);
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    importer.registerEventHandler('exynos_flip_request',
2388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        ExynosParser.prototype.flipEvent.bind(this));
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    importer.registerEventHandler('exynos_flip_complete',
2588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        ExynosParser.prototype.flipEvent.bind(this));
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    importer.registerEventHandler('exynos_busfreq_target_int',
2888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        ExynosParser.prototype.busfreqTargetIntEvent.bind(this));
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    importer.registerEventHandler('exynos_busfreq_target_mif',
3088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        ExynosParser.prototype.busfreqTargetMifEvent.bind(this));
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  }
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  ExynosParser.prototype = {
3488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    __proto__: Parser.prototype,
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    exynosFlipOpenSlice: function(ts, pipe) {
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      // use pipe?
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var kthread = this.importer.getOrCreatePseudoThread('exynos_flip');
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      kthread.openSliceTS = ts;
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      kthread.openSlice = 'flip:' + pipe;
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    exynosFlipCloseSlice: function(ts, args) {
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var kthread = this.importer.getOrCreatePseudoThread('exynos_flip');
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (kthread.openSlice) {
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var slice = new tracing.trace_model.Slice('', kthread.openSlice,
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            tracing.getStringColorId(kthread.openSlice),
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            kthread.openSliceTS,
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            args,
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            ts - kthread.openSliceTS);
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        kthread.thread.sliceGroup.pushSlice(slice);
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      }
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      kthread.openSlice = undefined;
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    /**
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis     * Parses exynos events and sets up state in the importer.
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis     */
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    flipEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
6188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var event = /pipe=(\d+)/.exec(eventBase.details);
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (!event)
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        return false;
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var pipe = parseInt(event[1]);
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (eventName == 'exynos_flip_request')
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        this.exynosFlipOpenSlice(ts, pipe);
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      else
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        this.exynosFlipCloseSlice(ts,
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            {
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis              pipe: pipe
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            });
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      return true;
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    exynosBusfreqSample: function(name, ts, frequency) {
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var targetCpu = this.importer.getOrCreateCpuState(0);
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var counter = targetCpu.cpu.getOrCreateCounter('', name);
796833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      if (counter.numSeries === 0) {
806833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        counter.addSeries(new tracing.trace_model.CounterSeries('frequency',
816833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis            tracing.getStringColorId(counter.name + '.' + 'frequency')));
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      }
836833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      counter.series.forEach(function(series) {
846833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        series.addSample(ts, frequency);
856833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      });
862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    /**
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis     * Parses exynos_busfreq_target_int events and sets up state.
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis     */
912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    busfreqTargetIntEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
9288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var event = /frequency=(\d+)/.exec(eventBase.details);
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (!event)
942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        return false;
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.exynosBusfreqSample('INT Frequency', ts, parseInt(event[1]));
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      return true;
982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    /**
1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis     * Parses exynos_busfreq_target_mif events and sets up state.
1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis     */
1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    busfreqTargetMifEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
10488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      var event = /frequency=(\d+)/.exec(eventBase.details);
1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (!event)
1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        return false;
1072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.exynosBusfreqSample('MIF Frequency', ts, parseInt(event[1]));
1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      return true;
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
1112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
1122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
11388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  Parser.registerSubtype(ExynosParser);
1142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  return {
11688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    ExynosParser: ExynosParser
1172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
1182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis});
119