• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7/**
8 * @fileoverview Parses exynos events in the Linux event trace format.
9 */
10base.require('tracing.importer.linux_perf.parser');
11base.exportTo('tracing.importer.linux_perf', function() {
12
13  var Parser = tracing.importer.linux_perf.Parser;
14
15  /**
16   * Parses linux exynos trace events.
17   * @constructor
18   */
19  function ExynosParser(importer) {
20    Parser.call(this, importer);
21
22    importer.registerEventHandler('exynos_flip_request',
23        ExynosParser.prototype.flipEvent.bind(this));
24    importer.registerEventHandler('exynos_flip_complete',
25        ExynosParser.prototype.flipEvent.bind(this));
26
27    importer.registerEventHandler('exynos_busfreq_target_int',
28        ExynosParser.prototype.busfreqTargetIntEvent.bind(this));
29    importer.registerEventHandler('exynos_busfreq_target_mif',
30        ExynosParser.prototype.busfreqTargetMifEvent.bind(this));
31  }
32
33  ExynosParser.prototype = {
34    __proto__: Parser.prototype,
35
36    exynosFlipOpenSlice: function(ts, pipe) {
37      // use pipe?
38      var kthread = this.importer.getOrCreatePseudoThread('exynos_flip');
39      kthread.openSliceTS = ts;
40      kthread.openSlice = 'flip:' + pipe;
41    },
42
43    exynosFlipCloseSlice: function(ts, args) {
44      var kthread = this.importer.getOrCreatePseudoThread('exynos_flip');
45      if (kthread.openSlice) {
46        var slice = new tracing.trace_model.Slice('', kthread.openSlice,
47            tracing.getStringColorId(kthread.openSlice),
48            kthread.openSliceTS,
49            args,
50            ts - kthread.openSliceTS);
51
52        kthread.thread.sliceGroup.pushSlice(slice);
53      }
54      kthread.openSlice = undefined;
55    },
56
57    /**
58     * Parses exynos events and sets up state in the importer.
59     */
60    flipEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
61      var event = /pipe=(\d+)/.exec(eventBase.details);
62      if (!event)
63        return false;
64
65      var pipe = parseInt(event[1]);
66      if (eventName == 'exynos_flip_request')
67        this.exynosFlipOpenSlice(ts, pipe);
68      else
69        this.exynosFlipCloseSlice(ts,
70            {
71              pipe: pipe
72            });
73      return true;
74    },
75
76    exynosBusfreqSample: function(name, ts, frequency) {
77      var targetCpu = this.importer.getOrCreateCpuState(0);
78      var counter = targetCpu.cpu.getOrCreateCounter('', name);
79      if (counter.numSeries === 0) {
80        counter.addSeries(new tracing.trace_model.CounterSeries('frequency',
81            tracing.getStringColorId(counter.name + '.' + 'frequency')));
82      }
83      counter.series.forEach(function(series) {
84        series.addSample(ts, frequency);
85      });
86    },
87
88    /**
89     * Parses exynos_busfreq_target_int events and sets up state.
90     */
91    busfreqTargetIntEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
92      var event = /frequency=(\d+)/.exec(eventBase.details);
93      if (!event)
94        return false;
95
96      this.exynosBusfreqSample('INT Frequency', ts, parseInt(event[1]));
97      return true;
98    },
99
100    /**
101     * Parses exynos_busfreq_target_mif events and sets up state.
102     */
103    busfreqTargetMifEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
104      var event = /frequency=(\d+)/.exec(eventBase.details);
105      if (!event)
106        return false;
107
108      this.exynosBusfreqSample('MIF Frequency', ts, parseInt(event[1]));
109      return true;
110    }
111  };
112
113  Parser.registerSubtype(ExynosParser);
114
115  return {
116    ExynosParser: ExynosParser
117  };
118});
119