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