1*61046927SAndroid Build Coastguard Worker# Copyright (c) 2015-2017 Intel Corporation 2*61046927SAndroid Build Coastguard Worker# 3*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a 4*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"), 5*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation 6*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense, 7*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the 8*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions: 9*61046927SAndroid Build Coastguard Worker# 10*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the next 11*61046927SAndroid Build Coastguard Worker# paragraph) shall be included in all copies or substantial portions of the 12*61046927SAndroid Build Coastguard Worker# Software. 13*61046927SAndroid Build Coastguard Worker# 14*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE. 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Workerimport argparse 23*61046927SAndroid Build Coastguard Workerimport builtins 24*61046927SAndroid Build Coastguard Workerimport collections 25*61046927SAndroid Build Coastguard Workerimport os 26*61046927SAndroid Build Coastguard Workerimport re 27*61046927SAndroid Build Coastguard Workerimport sys 28*61046927SAndroid Build Coastguard Workerimport textwrap 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Workerimport xml.etree.ElementTree as et 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Workerhashed_funcs = {} 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Workerc_file = None 35*61046927SAndroid Build Coastguard Worker_c_indent = 0 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Workerdef c(*args): 38*61046927SAndroid Build Coastguard Worker code = ' '.join(map(str,args)) 39*61046927SAndroid Build Coastguard Worker for line in code.splitlines(): 40*61046927SAndroid Build Coastguard Worker text = ''.rjust(_c_indent) + line 41*61046927SAndroid Build Coastguard Worker c_file.write(text.rstrip() + "\n") 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker# indented, but no trailing newline... 44*61046927SAndroid Build Coastguard Workerdef c_line_start(code): 45*61046927SAndroid Build Coastguard Worker c_file.write(''.rjust(_c_indent) + code) 46*61046927SAndroid Build Coastguard Workerdef c_raw(code): 47*61046927SAndroid Build Coastguard Worker c_file.write(code) 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Workerdef c_indent(n): 50*61046927SAndroid Build Coastguard Worker global _c_indent 51*61046927SAndroid Build Coastguard Worker _c_indent = _c_indent + n 52*61046927SAndroid Build Coastguard Workerdef c_outdent(n): 53*61046927SAndroid Build Coastguard Worker global _c_indent 54*61046927SAndroid Build Coastguard Worker _c_indent = _c_indent - n 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Workerheader_file = None 57*61046927SAndroid Build Coastguard Worker_h_indent = 0 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Workerdef h(*args): 60*61046927SAndroid Build Coastguard Worker code = ' '.join(map(str,args)) 61*61046927SAndroid Build Coastguard Worker for line in code.splitlines(): 62*61046927SAndroid Build Coastguard Worker text = ''.rjust(_h_indent) + line 63*61046927SAndroid Build Coastguard Worker header_file.write(text.rstrip() + "\n") 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Workerdef h_indent(n): 66*61046927SAndroid Build Coastguard Worker global _c_indent 67*61046927SAndroid Build Coastguard Worker _h_indent = _h_indent + n 68*61046927SAndroid Build Coastguard Workerdef h_outdent(n): 69*61046927SAndroid Build Coastguard Worker global _c_indent 70*61046927SAndroid Build Coastguard Worker _h_indent = _h_indent - n 71*61046927SAndroid Build Coastguard Worker 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Workerdef emit_fadd(tmp_id, args): 74*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1} + {2};".format(tmp_id, args[1], args[0])) 75*61046927SAndroid Build Coastguard Worker return tmp_id + 1 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker# Be careful to check for divide by zero... 78*61046927SAndroid Build Coastguard Workerdef emit_fdiv(tmp_id, args): 79*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1};".format(tmp_id, args[1])) 80*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1};".format(tmp_id + 1, args[0])) 81*61046927SAndroid Build Coastguard Worker c("double tmp{0} = tmp{1} ? tmp{2} / tmp{1} : 0;".format(tmp_id + 2, tmp_id + 1, tmp_id)) 82*61046927SAndroid Build Coastguard Worker return tmp_id + 3 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Workerdef emit_fmax(tmp_id, args): 85*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1};".format(tmp_id, args[1])) 86*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1};".format(tmp_id + 1, args[0])) 87*61046927SAndroid Build Coastguard Worker c("double tmp{0} = MAX(tmp{1}, tmp{2});".format(tmp_id + 2, tmp_id, tmp_id + 1)) 88*61046927SAndroid Build Coastguard Worker return tmp_id + 3 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Workerdef emit_fmul(tmp_id, args): 91*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1} * {2};".format(tmp_id, args[1], args[0])) 92*61046927SAndroid Build Coastguard Worker return tmp_id + 1 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Workerdef emit_fsub(tmp_id, args): 95*61046927SAndroid Build Coastguard Worker c("double tmp{0} = {1} - {2};".format(tmp_id, args[1], args[0])) 96*61046927SAndroid Build Coastguard Worker return tmp_id + 1 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Workerdef emit_read(tmp_id, args): 99*61046927SAndroid Build Coastguard Worker type = args[1].lower() 100*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = results->accumulator[query->{1}_offset + {2}];".format(tmp_id, type, args[0])) 101*61046927SAndroid Build Coastguard Worker return tmp_id + 1 102*61046927SAndroid Build Coastguard Worker 103*61046927SAndroid Build Coastguard Workerdef emit_uadd(tmp_id, args): 104*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} + {2};".format(tmp_id, args[1], args[0])) 105*61046927SAndroid Build Coastguard Worker return tmp_id + 1 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker# Be careful to check for divide by zero... 108*61046927SAndroid Build Coastguard Workerdef emit_udiv(tmp_id, args): 109*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1};".format(tmp_id, args[1])) 110*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1};".format(tmp_id + 1, args[0])) 111*61046927SAndroid Build Coastguard Worker if args[0].isdigit(): 112*61046927SAndroid Build Coastguard Worker assert int(args[0]) > 0 113*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = tmp{2} / tmp{1};".format(tmp_id + 2, tmp_id + 1, tmp_id)) 114*61046927SAndroid Build Coastguard Worker else: 115*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = tmp{1} ? tmp{2} / tmp{1} : 0;".format(tmp_id + 2, tmp_id + 1, tmp_id)) 116*61046927SAndroid Build Coastguard Worker return tmp_id + 3 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard Workerdef emit_umul(tmp_id, args): 119*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} * {2};".format(tmp_id, args[1], args[0])) 120*61046927SAndroid Build Coastguard Worker return tmp_id + 1 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard Workerdef emit_usub(tmp_id, args): 123*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} - {2};".format(tmp_id, args[1], args[0])) 124*61046927SAndroid Build Coastguard Worker return tmp_id + 1 125*61046927SAndroid Build Coastguard Worker 126*61046927SAndroid Build Coastguard Workerdef emit_umin(tmp_id, args): 127*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = MIN({1}, {2});".format(tmp_id, args[1], args[0])) 128*61046927SAndroid Build Coastguard Worker return tmp_id + 1 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Workerdef emit_lshft(tmp_id, args): 131*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} << {2};".format(tmp_id, args[1], args[0])) 132*61046927SAndroid Build Coastguard Worker return tmp_id + 1 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard Workerdef emit_rshft(tmp_id, args): 135*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} >> {2};".format(tmp_id, args[1], args[0])) 136*61046927SAndroid Build Coastguard Worker return tmp_id + 1 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Workerdef emit_and(tmp_id, args): 139*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} & {2};".format(tmp_id, args[1], args[0])) 140*61046927SAndroid Build Coastguard Worker return tmp_id + 1 141*61046927SAndroid Build Coastguard Worker 142*61046927SAndroid Build Coastguard Workerdef emit_ulte(tmp_id, args): 143*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} <= {2};".format(tmp_id, args[1], args[0])) 144*61046927SAndroid Build Coastguard Worker return tmp_id + 1 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Workerdef emit_ult(tmp_id, args): 147*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} < {2};".format(tmp_id, args[1], args[0])) 148*61046927SAndroid Build Coastguard Worker return tmp_id + 1 149*61046927SAndroid Build Coastguard Worker 150*61046927SAndroid Build Coastguard Workerdef emit_ugte(tmp_id, args): 151*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} >= {2};".format(tmp_id, args[1], args[0])) 152*61046927SAndroid Build Coastguard Worker return tmp_id + 1 153*61046927SAndroid Build Coastguard Worker 154*61046927SAndroid Build Coastguard Workerdef emit_ugt(tmp_id, args): 155*61046927SAndroid Build Coastguard Worker c("uint64_t tmp{0} = {1} > {2};".format(tmp_id, args[1], args[0])) 156*61046927SAndroid Build Coastguard Worker return tmp_id + 1 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Workerops = {} 159*61046927SAndroid Build Coastguard Worker# (n operands, emitter) 160*61046927SAndroid Build Coastguard Workerops["FADD"] = (2, emit_fadd) 161*61046927SAndroid Build Coastguard Workerops["FDIV"] = (2, emit_fdiv) 162*61046927SAndroid Build Coastguard Workerops["FMAX"] = (2, emit_fmax) 163*61046927SAndroid Build Coastguard Workerops["FMUL"] = (2, emit_fmul) 164*61046927SAndroid Build Coastguard Workerops["FSUB"] = (2, emit_fsub) 165*61046927SAndroid Build Coastguard Workerops["READ"] = (2, emit_read) 166*61046927SAndroid Build Coastguard Workerops["UADD"] = (2, emit_uadd) 167*61046927SAndroid Build Coastguard Workerops["UDIV"] = (2, emit_udiv) 168*61046927SAndroid Build Coastguard Workerops["UMUL"] = (2, emit_umul) 169*61046927SAndroid Build Coastguard Workerops["USUB"] = (2, emit_usub) 170*61046927SAndroid Build Coastguard Workerops["UMIN"] = (2, emit_umin) 171*61046927SAndroid Build Coastguard Workerops["<<"] = (2, emit_lshft) 172*61046927SAndroid Build Coastguard Workerops[">>"] = (2, emit_rshft) 173*61046927SAndroid Build Coastguard Workerops["AND"] = (2, emit_and) 174*61046927SAndroid Build Coastguard Workerops["UGTE"] = (2, emit_ugte) 175*61046927SAndroid Build Coastguard Workerops["UGT"] = (2, emit_ugt) 176*61046927SAndroid Build Coastguard Workerops["ULTE"] = (2, emit_ulte) 177*61046927SAndroid Build Coastguard Workerops["ULT"] = (2, emit_ult) 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Workerdef brkt(subexp): 181*61046927SAndroid Build Coastguard Worker if " " in subexp: 182*61046927SAndroid Build Coastguard Worker return "(" + subexp + ")" 183*61046927SAndroid Build Coastguard Worker else: 184*61046927SAndroid Build Coastguard Worker return subexp 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard Workerdef splice_bitwise_and(args): 187*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " & " + brkt(args[0]) 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Workerdef splice_bitwise_or(args): 190*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " | " + brkt(args[0]) 191*61046927SAndroid Build Coastguard Worker 192*61046927SAndroid Build Coastguard Workerdef splice_logical_and(args): 193*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " && " + brkt(args[0]) 194*61046927SAndroid Build Coastguard Worker 195*61046927SAndroid Build Coastguard Workerdef splice_umul(args): 196*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " * " + brkt(args[0]) 197*61046927SAndroid Build Coastguard Worker 198*61046927SAndroid Build Coastguard Workerdef splice_ult(args): 199*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " < " + brkt(args[0]) 200*61046927SAndroid Build Coastguard Worker 201*61046927SAndroid Build Coastguard Workerdef splice_ugte(args): 202*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " >= " + brkt(args[0]) 203*61046927SAndroid Build Coastguard Worker 204*61046927SAndroid Build Coastguard Workerdef splice_ulte(args): 205*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " <= " + brkt(args[0]) 206*61046927SAndroid Build Coastguard Worker 207*61046927SAndroid Build Coastguard Workerdef splice_ugt(args): 208*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " > " + brkt(args[0]) 209*61046927SAndroid Build Coastguard Worker 210*61046927SAndroid Build Coastguard Workerdef splice_lshft(args): 211*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " << " + brkt(args[0]) 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Workerdef splice_equal(args): 214*61046927SAndroid Build Coastguard Worker return brkt(args[1]) + " == " + brkt(args[0]) 215*61046927SAndroid Build Coastguard Worker 216*61046927SAndroid Build Coastguard Workerexp_ops = {} 217*61046927SAndroid Build Coastguard Worker# (n operands, splicer) 218*61046927SAndroid Build Coastguard Workerexp_ops["AND"] = (2, splice_bitwise_and) 219*61046927SAndroid Build Coastguard Workerexp_ops["OR"] = (2, splice_bitwise_or) 220*61046927SAndroid Build Coastguard Workerexp_ops["UGTE"] = (2, splice_ugte) 221*61046927SAndroid Build Coastguard Workerexp_ops["ULT"] = (2, splice_ult) 222*61046927SAndroid Build Coastguard Workerexp_ops["&&"] = (2, splice_logical_and) 223*61046927SAndroid Build Coastguard Workerexp_ops["UMUL"] = (2, splice_umul) 224*61046927SAndroid Build Coastguard Workerexp_ops["<<"] = (2, splice_lshft) 225*61046927SAndroid Build Coastguard Workerexp_ops["=="] = (2, splice_equal) 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker 228*61046927SAndroid Build Coastguard Workerhw_vars = {} 229*61046927SAndroid Build Coastguard Workerhw_vars["$EuCoresTotalCount"] = "perf->sys_vars.n_eus" 230*61046927SAndroid Build Coastguard Workerhw_vars["$VectorEngineTotalCount"] = "perf->sys_vars.n_eus" 231*61046927SAndroid Build Coastguard Workerhw_vars["$EuSlicesTotalCount"] = "perf->sys_vars.n_eu_slices" 232*61046927SAndroid Build Coastguard Workerhw_vars["$EuSubslicesTotalCount"] = "perf->sys_vars.n_eu_sub_slices" 233*61046927SAndroid Build Coastguard Workerhw_vars["$XeCoreTotalCount"] = "perf->sys_vars.n_eu_sub_slices" 234*61046927SAndroid Build Coastguard Workerhw_vars["$EuDualSubslicesTotalCount"] = "perf->sys_vars.n_eu_sub_slices" 235*61046927SAndroid Build Coastguard Workerhw_vars["$EuDualSubslicesSlice0123Count"] = "perf->sys_vars.n_eu_slice0123" 236*61046927SAndroid Build Coastguard Workerhw_vars["$EuThreadsCount"] = "perf->devinfo->num_thread_per_eu" 237*61046927SAndroid Build Coastguard Workerhw_vars["$VectorEngineThreadsCount"] = "perf->devinfo->num_thread_per_eu" 238*61046927SAndroid Build Coastguard Workerhw_vars["$SliceMask"] = "perf->sys_vars.slice_mask" 239*61046927SAndroid Build Coastguard Workerhw_vars["$SliceTotalCount"] = "perf->sys_vars.n_eu_slices" 240*61046927SAndroid Build Coastguard Worker# subslice_mask is interchangeable with subslice/dual-subslice since Gfx12+ 241*61046927SAndroid Build Coastguard Worker# only has dual subslices which can be assimilated with 16EUs subslices. 242*61046927SAndroid Build Coastguard Workerhw_vars["$SubsliceMask"] = "perf->sys_vars.subslice_mask" 243*61046927SAndroid Build Coastguard Workerhw_vars["$DualSubsliceMask"] = "perf->sys_vars.subslice_mask" 244*61046927SAndroid Build Coastguard Workerhw_vars["$XeCoreMask"] = "perf->sys_vars.subslice_mask" 245*61046927SAndroid Build Coastguard Workerhw_vars["$GpuTimestampFrequency"] = "perf->devinfo->timestamp_frequency" 246*61046927SAndroid Build Coastguard Workerhw_vars["$GpuMinFrequency"] = "perf->sys_vars.gt_min_freq" 247*61046927SAndroid Build Coastguard Workerhw_vars["$GpuMaxFrequency"] = "perf->sys_vars.gt_max_freq" 248*61046927SAndroid Build Coastguard Workerhw_vars["$SkuRevisionId"] = "perf->devinfo->revision" 249*61046927SAndroid Build Coastguard Workerhw_vars["$QueryMode"] = "perf->sys_vars.query_mode" 250*61046927SAndroid Build Coastguard Workerhw_vars["$ComputeEngineTotalCount"] = "perf->devinfo->engine_class_supported_count[INTEL_ENGINE_CLASS_COMPUTE]" 251*61046927SAndroid Build Coastguard Workerhw_vars["$CopyEngineTotalCount"] = "perf->devinfo->engine_class_supported_count[INTEL_ENGINE_CLASS_COPY]" 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Workerdef resolve_variable(name, set, allow_counters): 254*61046927SAndroid Build Coastguard Worker if name in hw_vars: 255*61046927SAndroid Build Coastguard Worker return hw_vars[name] 256*61046927SAndroid Build Coastguard Worker m = re.search(r'\$GtSlice([0-9]+)$', name) 257*61046927SAndroid Build Coastguard Worker if m: 258*61046927SAndroid Build Coastguard Worker return 'intel_device_info_slice_available(perf->devinfo, {0})'.format(m.group(1)) 259*61046927SAndroid Build Coastguard Worker m = re.search(r'\$GtSlice([0-9]+)XeCore([0-9]+)$', name) 260*61046927SAndroid Build Coastguard Worker if m: 261*61046927SAndroid Build Coastguard Worker return 'intel_device_info_subslice_available(perf->devinfo, {0}, {1})'.format(m.group(1), m.group(2)) 262*61046927SAndroid Build Coastguard Worker if allow_counters and name in set.counter_vars: 263*61046927SAndroid Build Coastguard Worker return set.read_funcs[name[1:]] + "(perf, query, results)" 264*61046927SAndroid Build Coastguard Worker return None 265*61046927SAndroid Build Coastguard Worker 266*61046927SAndroid Build Coastguard Workerdef output_rpn_equation_code(set, counter, equation): 267*61046927SAndroid Build Coastguard Worker c("/* RPN equation: " + equation + " */") 268*61046927SAndroid Build Coastguard Worker tokens = equation.split() 269*61046927SAndroid Build Coastguard Worker stack = [] 270*61046927SAndroid Build Coastguard Worker tmp_id = 0 271*61046927SAndroid Build Coastguard Worker tmp = None 272*61046927SAndroid Build Coastguard Worker 273*61046927SAndroid Build Coastguard Worker for token in tokens: 274*61046927SAndroid Build Coastguard Worker stack.append(token) 275*61046927SAndroid Build Coastguard Worker while stack and stack[-1] in ops: 276*61046927SAndroid Build Coastguard Worker op = stack.pop() 277*61046927SAndroid Build Coastguard Worker argc, callback = ops[op] 278*61046927SAndroid Build Coastguard Worker args = [] 279*61046927SAndroid Build Coastguard Worker for i in range(0, argc): 280*61046927SAndroid Build Coastguard Worker operand = stack.pop() 281*61046927SAndroid Build Coastguard Worker if operand[0] == "$": 282*61046927SAndroid Build Coastguard Worker resolved_variable = resolve_variable(operand, set, True) 283*61046927SAndroid Build Coastguard Worker if resolved_variable == None: 284*61046927SAndroid Build Coastguard Worker raise Exception("Failed to resolve variable " + operand + " in equation " + equation + " for " + set.name + " :: " + counter.get('name')); 285*61046927SAndroid Build Coastguard Worker operand = resolved_variable 286*61046927SAndroid Build Coastguard Worker args.append(operand) 287*61046927SAndroid Build Coastguard Worker 288*61046927SAndroid Build Coastguard Worker tmp_id = callback(tmp_id, args) 289*61046927SAndroid Build Coastguard Worker 290*61046927SAndroid Build Coastguard Worker tmp = "tmp{0}".format(tmp_id - 1) 291*61046927SAndroid Build Coastguard Worker stack.append(tmp) 292*61046927SAndroid Build Coastguard Worker 293*61046927SAndroid Build Coastguard Worker if len(stack) != 1: 294*61046927SAndroid Build Coastguard Worker raise Exception("Spurious empty rpn code for " + set.name + " :: " + 295*61046927SAndroid Build Coastguard Worker counter.get('name') + ".\nThis is probably due to some unhandled RPN function, in the equation \"" + 296*61046927SAndroid Build Coastguard Worker equation + "\"") 297*61046927SAndroid Build Coastguard Worker 298*61046927SAndroid Build Coastguard Worker value = stack[-1] 299*61046927SAndroid Build Coastguard Worker 300*61046927SAndroid Build Coastguard Worker if value[0] == "$": 301*61046927SAndroid Build Coastguard Worker resolved_variable = resolve_variable(value, set, True) 302*61046927SAndroid Build Coastguard Worker if resolved_variable == None: 303*61046927SAndroid Build Coastguard Worker raise Exception("Failed to resolve variable " + operand + " in equation " + equation + " for " + set.name + " :: " + counter.get('name')); 304*61046927SAndroid Build Coastguard Worker value = resolved_variable 305*61046927SAndroid Build Coastguard Worker 306*61046927SAndroid Build Coastguard Worker c("\nreturn " + value + ";") 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Workerdef splice_rpn_expression(set, counter_name, expression): 309*61046927SAndroid Build Coastguard Worker tokens = expression.split() 310*61046927SAndroid Build Coastguard Worker stack = [] 311*61046927SAndroid Build Coastguard Worker 312*61046927SAndroid Build Coastguard Worker for token in tokens: 313*61046927SAndroid Build Coastguard Worker stack.append(token) 314*61046927SAndroid Build Coastguard Worker while stack and stack[-1] in exp_ops: 315*61046927SAndroid Build Coastguard Worker op = stack.pop() 316*61046927SAndroid Build Coastguard Worker argc, callback = exp_ops[op] 317*61046927SAndroid Build Coastguard Worker args = [] 318*61046927SAndroid Build Coastguard Worker for i in range(0, argc): 319*61046927SAndroid Build Coastguard Worker operand = stack.pop() 320*61046927SAndroid Build Coastguard Worker if operand[0] == "$": 321*61046927SAndroid Build Coastguard Worker resolved_variable = resolve_variable(operand, set, False) 322*61046927SAndroid Build Coastguard Worker if resolved_variable == None: 323*61046927SAndroid Build Coastguard Worker raise Exception("Failed to resolve variable " + operand + " in expression " + expression + " for " + set.name + " :: " + counter_name) 324*61046927SAndroid Build Coastguard Worker operand = resolved_variable 325*61046927SAndroid Build Coastguard Worker args.append(operand) 326*61046927SAndroid Build Coastguard Worker 327*61046927SAndroid Build Coastguard Worker subexp = callback(args) 328*61046927SAndroid Build Coastguard Worker 329*61046927SAndroid Build Coastguard Worker stack.append(subexp) 330*61046927SAndroid Build Coastguard Worker 331*61046927SAndroid Build Coastguard Worker if len(stack) != 1: 332*61046927SAndroid Build Coastguard Worker raise Exception("Spurious empty rpn expression for " + set.name + " :: " + 333*61046927SAndroid Build Coastguard Worker counter_name + ".\nThis is probably due to some unhandled RPN operation, in the expression \"" + 334*61046927SAndroid Build Coastguard Worker expression + "\"") 335*61046927SAndroid Build Coastguard Worker 336*61046927SAndroid Build Coastguard Worker value = stack[-1] 337*61046927SAndroid Build Coastguard Worker 338*61046927SAndroid Build Coastguard Worker if value[0] == "$": 339*61046927SAndroid Build Coastguard Worker resolved_variable = resolve_variable(value, set, False) 340*61046927SAndroid Build Coastguard Worker if resolved_variable == None: 341*61046927SAndroid Build Coastguard Worker raise Exception("Failed to resolve variable " + operand + " in expression " + expression + " for " + set.name + " :: " + counter_name) 342*61046927SAndroid Build Coastguard Worker value = resolved_variable 343*61046927SAndroid Build Coastguard Worker 344*61046927SAndroid Build Coastguard Worker return value 345*61046927SAndroid Build Coastguard Worker 346*61046927SAndroid Build Coastguard Workerdef output_counter_read(gen, set, counter): 347*61046927SAndroid Build Coastguard Worker c("\n") 348*61046927SAndroid Build Coastguard Worker c("/* {0} :: {1} */".format(set.name, counter.get('name'))) 349*61046927SAndroid Build Coastguard Worker 350*61046927SAndroid Build Coastguard Worker if counter.read_hash in hashed_funcs: 351*61046927SAndroid Build Coastguard Worker c("#define %s \\" % counter.read_sym) 352*61046927SAndroid Build Coastguard Worker c_indent(3) 353*61046927SAndroid Build Coastguard Worker c("%s" % hashed_funcs[counter.read_hash]) 354*61046927SAndroid Build Coastguard Worker c_outdent(3) 355*61046927SAndroid Build Coastguard Worker else: 356*61046927SAndroid Build Coastguard Worker ret_type = counter.get('data_type') 357*61046927SAndroid Build Coastguard Worker if ret_type == "uint64": 358*61046927SAndroid Build Coastguard Worker ret_type = "uint64_t" 359*61046927SAndroid Build Coastguard Worker 360*61046927SAndroid Build Coastguard Worker read_eq = counter.get('equation') 361*61046927SAndroid Build Coastguard Worker 362*61046927SAndroid Build Coastguard Worker c("static " + ret_type) 363*61046927SAndroid Build Coastguard Worker c(counter.read_sym + "(UNUSED struct intel_perf_config *perf,\n") 364*61046927SAndroid Build Coastguard Worker c_indent(len(counter.read_sym) + 1) 365*61046927SAndroid Build Coastguard Worker c("const struct intel_perf_query_info *query,\n") 366*61046927SAndroid Build Coastguard Worker c("const struct intel_perf_query_result *results)\n") 367*61046927SAndroid Build Coastguard Worker c_outdent(len(counter.read_sym) + 1) 368*61046927SAndroid Build Coastguard Worker 369*61046927SAndroid Build Coastguard Worker c("{") 370*61046927SAndroid Build Coastguard Worker c_indent(3) 371*61046927SAndroid Build Coastguard Worker output_rpn_equation_code(set, counter, read_eq) 372*61046927SAndroid Build Coastguard Worker c_outdent(3) 373*61046927SAndroid Build Coastguard Worker c("}") 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker hashed_funcs[counter.read_hash] = counter.read_sym 376*61046927SAndroid Build Coastguard Worker 377*61046927SAndroid Build Coastguard Worker 378*61046927SAndroid Build Coastguard Workerdef output_counter_max(gen, set, counter): 379*61046927SAndroid Build Coastguard Worker max_eq = counter.get('max_equation') 380*61046927SAndroid Build Coastguard Worker 381*61046927SAndroid Build Coastguard Worker if not counter.has_custom_max_func(): 382*61046927SAndroid Build Coastguard Worker return 383*61046927SAndroid Build Coastguard Worker 384*61046927SAndroid Build Coastguard Worker c("\n") 385*61046927SAndroid Build Coastguard Worker c("/* {0} :: {1} */".format(set.name, counter.get('name'))) 386*61046927SAndroid Build Coastguard Worker 387*61046927SAndroid Build Coastguard Worker if counter.max_hash in hashed_funcs: 388*61046927SAndroid Build Coastguard Worker c("#define %s \\" % counter.max_sym) 389*61046927SAndroid Build Coastguard Worker c_indent(3) 390*61046927SAndroid Build Coastguard Worker c("%s" % hashed_funcs[counter.max_hash]) 391*61046927SAndroid Build Coastguard Worker c_outdent(3) 392*61046927SAndroid Build Coastguard Worker else: 393*61046927SAndroid Build Coastguard Worker ret_type = counter.get('data_type') 394*61046927SAndroid Build Coastguard Worker if ret_type == "uint64": 395*61046927SAndroid Build Coastguard Worker ret_type = "uint64_t" 396*61046927SAndroid Build Coastguard Worker 397*61046927SAndroid Build Coastguard Worker c("static " + ret_type) 398*61046927SAndroid Build Coastguard Worker c(counter.max_sym + "(struct intel_perf_config *perf,\n") 399*61046927SAndroid Build Coastguard Worker c_indent(len(counter.read_sym) + 1) 400*61046927SAndroid Build Coastguard Worker c("const struct intel_perf_query_info *query,\n") 401*61046927SAndroid Build Coastguard Worker c("const struct intel_perf_query_result *results)\n") 402*61046927SAndroid Build Coastguard Worker c_outdent(len(counter.read_sym) + 1) 403*61046927SAndroid Build Coastguard Worker c("{") 404*61046927SAndroid Build Coastguard Worker c_indent(3) 405*61046927SAndroid Build Coastguard Worker output_rpn_equation_code(set, counter, max_eq) 406*61046927SAndroid Build Coastguard Worker c_outdent(3) 407*61046927SAndroid Build Coastguard Worker c("}") 408*61046927SAndroid Build Coastguard Worker 409*61046927SAndroid Build Coastguard Worker hashed_funcs[counter.max_hash] = counter.max_sym 410*61046927SAndroid Build Coastguard Worker 411*61046927SAndroid Build Coastguard Worker 412*61046927SAndroid Build Coastguard Workerc_type_sizes = { "uint32_t": 4, "uint64_t": 8, "float": 4, "double": 8, "bool": 4 } 413*61046927SAndroid Build Coastguard Workerdef sizeof(c_type): 414*61046927SAndroid Build Coastguard Worker return c_type_sizes[c_type] 415*61046927SAndroid Build Coastguard Worker 416*61046927SAndroid Build Coastguard Workerdef pot_align(base, pot_alignment): 417*61046927SAndroid Build Coastguard Worker return (base + pot_alignment - 1) & ~(pot_alignment - 1); 418*61046927SAndroid Build Coastguard Worker 419*61046927SAndroid Build Coastguard Workersemantic_type_map = { 420*61046927SAndroid Build Coastguard Worker "duration": "raw", 421*61046927SAndroid Build Coastguard Worker "ratio": "event" 422*61046927SAndroid Build Coastguard Worker } 423*61046927SAndroid Build Coastguard Worker 424*61046927SAndroid Build Coastguard Workerdef output_availability(set, availability, counter_name): 425*61046927SAndroid Build Coastguard Worker expression = splice_rpn_expression(set, counter_name, availability) 426*61046927SAndroid Build Coastguard Worker lines = expression.split(' && ') 427*61046927SAndroid Build Coastguard Worker n_lines = len(lines) 428*61046927SAndroid Build Coastguard Worker if n_lines == 1: 429*61046927SAndroid Build Coastguard Worker c("if (" + lines[0] + ") {") 430*61046927SAndroid Build Coastguard Worker else: 431*61046927SAndroid Build Coastguard Worker c("if (" + lines[0] + " &&") 432*61046927SAndroid Build Coastguard Worker c_indent(4) 433*61046927SAndroid Build Coastguard Worker for i in range(1, (n_lines - 1)): 434*61046927SAndroid Build Coastguard Worker c(lines[i] + " &&") 435*61046927SAndroid Build Coastguard Worker c(lines[(n_lines - 1)] + ") {") 436*61046927SAndroid Build Coastguard Worker c_outdent(4) 437*61046927SAndroid Build Coastguard Worker 438*61046927SAndroid Build Coastguard Worker 439*61046927SAndroid Build Coastguard Workerdef output_units(unit): 440*61046927SAndroid Build Coastguard Worker return unit.replace(' ', '_').upper() 441*61046927SAndroid Build Coastguard Worker 442*61046927SAndroid Build Coastguard Worker 443*61046927SAndroid Build Coastguard Worker# should a unit be visible in description? 444*61046927SAndroid Build Coastguard Workerunits_map = { 445*61046927SAndroid Build Coastguard Worker "bytes" : True, 446*61046927SAndroid Build Coastguard Worker "cycles" : True, 447*61046927SAndroid Build Coastguard Worker "eu atomic requests to l3 cache lines" : False, 448*61046927SAndroid Build Coastguard Worker "eu bytes per l3 cache line" : False, 449*61046927SAndroid Build Coastguard Worker "eu requests to l3 cache lines" : False, 450*61046927SAndroid Build Coastguard Worker "eu sends to l3 cache lines" : False, 451*61046927SAndroid Build Coastguard Worker "events" : True, 452*61046927SAndroid Build Coastguard Worker "hz" : True, 453*61046927SAndroid Build Coastguard Worker "messages" : True, 454*61046927SAndroid Build Coastguard Worker "ns" : True, 455*61046927SAndroid Build Coastguard Worker "number" : False, 456*61046927SAndroid Build Coastguard Worker "percent" : True, 457*61046927SAndroid Build Coastguard Worker "pixels" : True, 458*61046927SAndroid Build Coastguard Worker "texels" : True, 459*61046927SAndroid Build Coastguard Worker "threads" : True, 460*61046927SAndroid Build Coastguard Worker "us" : True, 461*61046927SAndroid Build Coastguard Worker "utilization" : False, 462*61046927SAndroid Build Coastguard Worker "gbps" : True, 463*61046927SAndroid Build Coastguard Worker } 464*61046927SAndroid Build Coastguard Worker 465*61046927SAndroid Build Coastguard Worker 466*61046927SAndroid Build Coastguard Workerdef desc_units(unit): 467*61046927SAndroid Build Coastguard Worker val = units_map.get(unit) 468*61046927SAndroid Build Coastguard Worker if val is None: 469*61046927SAndroid Build Coastguard Worker raise Exception("Unknown unit: " + unit) 470*61046927SAndroid Build Coastguard Worker if val == False: 471*61046927SAndroid Build Coastguard Worker return "" 472*61046927SAndroid Build Coastguard Worker if unit == 'hz': 473*61046927SAndroid Build Coastguard Worker unit = 'Hz' 474*61046927SAndroid Build Coastguard Worker return "Unit: " + unit + "." 475*61046927SAndroid Build Coastguard Worker 476*61046927SAndroid Build Coastguard Worker 477*61046927SAndroid Build Coastguard Workercounter_key_tuple = collections.namedtuple( 478*61046927SAndroid Build Coastguard Worker 'counter_key', 479*61046927SAndroid Build Coastguard Worker [ 480*61046927SAndroid Build Coastguard Worker 'name', 481*61046927SAndroid Build Coastguard Worker 'description', 482*61046927SAndroid Build Coastguard Worker 'symbol_name', 483*61046927SAndroid Build Coastguard Worker 'mdapi_group', 484*61046927SAndroid Build Coastguard Worker 'semantic_type', 485*61046927SAndroid Build Coastguard Worker 'data_type', 486*61046927SAndroid Build Coastguard Worker 'units', 487*61046927SAndroid Build Coastguard Worker ] 488*61046927SAndroid Build Coastguard Worker) 489*61046927SAndroid Build Coastguard Worker 490*61046927SAndroid Build Coastguard Worker 491*61046927SAndroid Build Coastguard Workerdef counter_key(counter): 492*61046927SAndroid Build Coastguard Worker return counter_key_tuple._make([counter.get(field) for field in counter_key_tuple._fields]) 493*61046927SAndroid Build Coastguard Worker 494*61046927SAndroid Build Coastguard Worker 495*61046927SAndroid Build Coastguard Workerdef output_counter_struct(set, counter, idx, 496*61046927SAndroid Build Coastguard Worker name_to_idx, desc_to_idx, 497*61046927SAndroid Build Coastguard Worker symbol_name_to_idx, category_to_idx): 498*61046927SAndroid Build Coastguard Worker data_type = counter.data_type 499*61046927SAndroid Build Coastguard Worker data_type_uc = data_type.upper() 500*61046927SAndroid Build Coastguard Worker 501*61046927SAndroid Build Coastguard Worker semantic_type = counter.semantic_type 502*61046927SAndroid Build Coastguard Worker if semantic_type in semantic_type_map: 503*61046927SAndroid Build Coastguard Worker semantic_type = semantic_type_map[semantic_type] 504*61046927SAndroid Build Coastguard Worker 505*61046927SAndroid Build Coastguard Worker semantic_type_uc = semantic_type.upper() 506*61046927SAndroid Build Coastguard Worker 507*61046927SAndroid Build Coastguard Worker c("[" + str(idx) + "] = {\n") 508*61046927SAndroid Build Coastguard Worker c_indent(3) 509*61046927SAndroid Build Coastguard Worker c(".name_idx = " + str(name_to_idx[counter.name]) + ",\n") 510*61046927SAndroid Build Coastguard Worker c(".desc_idx = " + str(desc_to_idx[counter.description + " " + desc_units(counter.units)]) + ",\n") 511*61046927SAndroid Build Coastguard Worker c(".symbol_name_idx = " + str(symbol_name_to_idx[counter.symbol_name]) + ",\n") 512*61046927SAndroid Build Coastguard Worker c(".category_idx = " + str(category_to_idx[counter.mdapi_group]) + ",\n") 513*61046927SAndroid Build Coastguard Worker c(".type = INTEL_PERF_COUNTER_TYPE_" + semantic_type_uc + ",\n") 514*61046927SAndroid Build Coastguard Worker c(".data_type = INTEL_PERF_COUNTER_DATA_TYPE_" + data_type_uc + ",\n") 515*61046927SAndroid Build Coastguard Worker c(".units = INTEL_PERF_COUNTER_UNITS_" + output_units(counter.units) + ",\n") 516*61046927SAndroid Build Coastguard Worker c_outdent(3) 517*61046927SAndroid Build Coastguard Worker c("},\n") 518*61046927SAndroid Build Coastguard Worker 519*61046927SAndroid Build Coastguard Worker 520*61046927SAndroid Build Coastguard Workerdef output_counter_report(set, counter, counter_to_idx, current_offset): 521*61046927SAndroid Build Coastguard Worker data_type = counter.get('data_type') 522*61046927SAndroid Build Coastguard Worker data_type_uc = data_type.upper() 523*61046927SAndroid Build Coastguard Worker c_type = data_type 524*61046927SAndroid Build Coastguard Worker 525*61046927SAndroid Build Coastguard Worker if "uint" in c_type: 526*61046927SAndroid Build Coastguard Worker c_type = c_type + "_t" 527*61046927SAndroid Build Coastguard Worker 528*61046927SAndroid Build Coastguard Worker semantic_type = counter.get('semantic_type') 529*61046927SAndroid Build Coastguard Worker if semantic_type in semantic_type_map: 530*61046927SAndroid Build Coastguard Worker semantic_type = semantic_type_map[semantic_type] 531*61046927SAndroid Build Coastguard Worker 532*61046927SAndroid Build Coastguard Worker semantic_type_uc = semantic_type.upper() 533*61046927SAndroid Build Coastguard Worker 534*61046927SAndroid Build Coastguard Worker c("\n") 535*61046927SAndroid Build Coastguard Worker 536*61046927SAndroid Build Coastguard Worker availability = counter.get('availability') 537*61046927SAndroid Build Coastguard Worker if availability: 538*61046927SAndroid Build Coastguard Worker output_availability(set, availability, counter.get('name')) 539*61046927SAndroid Build Coastguard Worker c_indent(3) 540*61046927SAndroid Build Coastguard Worker 541*61046927SAndroid Build Coastguard Worker key = counter_key(counter) 542*61046927SAndroid Build Coastguard Worker idx = str(counter_to_idx[key]) 543*61046927SAndroid Build Coastguard Worker 544*61046927SAndroid Build Coastguard Worker current_offset = pot_align(current_offset, sizeof(c_type)) 545*61046927SAndroid Build Coastguard Worker 546*61046927SAndroid Build Coastguard Worker if data_type == 'uint64': 547*61046927SAndroid Build Coastguard Worker c("intel_perf_query_add_counter_uint64(query, " + idx + ", " + 548*61046927SAndroid Build Coastguard Worker str(current_offset) + ", " + 549*61046927SAndroid Build Coastguard Worker set.max_funcs[counter.get('symbol_name')] + "," + 550*61046927SAndroid Build Coastguard Worker set.read_funcs[counter.get('symbol_name')] + ");\n") 551*61046927SAndroid Build Coastguard Worker else: 552*61046927SAndroid Build Coastguard Worker c("intel_perf_query_add_counter_float(query, " + idx + ", " + 553*61046927SAndroid Build Coastguard Worker str(current_offset) + ", " + 554*61046927SAndroid Build Coastguard Worker set.max_funcs[counter.get('symbol_name')] + "," + 555*61046927SAndroid Build Coastguard Worker set.read_funcs[counter.get('symbol_name')] + ");\n") 556*61046927SAndroid Build Coastguard Worker 557*61046927SAndroid Build Coastguard Worker 558*61046927SAndroid Build Coastguard Worker if availability: 559*61046927SAndroid Build Coastguard Worker c_outdent(3); 560*61046927SAndroid Build Coastguard Worker c("}") 561*61046927SAndroid Build Coastguard Worker 562*61046927SAndroid Build Coastguard Worker return current_offset + sizeof(c_type) 563*61046927SAndroid Build Coastguard Worker 564*61046927SAndroid Build Coastguard Worker 565*61046927SAndroid Build Coastguard Workerdef str_to_idx_table(strs): 566*61046927SAndroid Build Coastguard Worker sorted_strs = sorted(strs) 567*61046927SAndroid Build Coastguard Worker 568*61046927SAndroid Build Coastguard Worker str_to_idx = collections.OrderedDict() 569*61046927SAndroid Build Coastguard Worker str_to_idx[sorted_strs[0]] = 0 570*61046927SAndroid Build Coastguard Worker previous = sorted_strs[0] 571*61046927SAndroid Build Coastguard Worker 572*61046927SAndroid Build Coastguard Worker for i in range(1, len(sorted_strs)): 573*61046927SAndroid Build Coastguard Worker str_to_idx[sorted_strs[i]] = str_to_idx[previous] + len(previous) + 1 574*61046927SAndroid Build Coastguard Worker previous = sorted_strs[i] 575*61046927SAndroid Build Coastguard Worker 576*61046927SAndroid Build Coastguard Worker return str_to_idx 577*61046927SAndroid Build Coastguard Worker 578*61046927SAndroid Build Coastguard Worker 579*61046927SAndroid Build Coastguard Workerdef output_str_table(name: str, str_to_idx): 580*61046927SAndroid Build Coastguard Worker c("\n") 581*61046927SAndroid Build Coastguard Worker c("static const char " + name + "[] = {\n") 582*61046927SAndroid Build Coastguard Worker c_indent(3) 583*61046927SAndroid Build Coastguard Worker c("\n".join(f"/* {idx} */ \"{val}\\0\"" for val, idx in str_to_idx.items())) 584*61046927SAndroid Build Coastguard Worker c_outdent(3) 585*61046927SAndroid Build Coastguard Worker c("};\n") 586*61046927SAndroid Build Coastguard Worker 587*61046927SAndroid Build Coastguard Worker 588*61046927SAndroid Build Coastguard Workerregister_types = { 589*61046927SAndroid Build Coastguard Worker 'FLEX': 'flex_regs', 590*61046927SAndroid Build Coastguard Worker 'NOA': 'mux_regs', 591*61046927SAndroid Build Coastguard Worker 'OA': 'b_counter_regs', 592*61046927SAndroid Build Coastguard Worker} 593*61046927SAndroid Build Coastguard Worker 594*61046927SAndroid Build Coastguard Workerdef compute_register_lengths(set): 595*61046927SAndroid Build Coastguard Worker register_lengths = {} 596*61046927SAndroid Build Coastguard Worker register_configs = set.findall('register_config') 597*61046927SAndroid Build Coastguard Worker for register_config in register_configs: 598*61046927SAndroid Build Coastguard Worker t = register_types[register_config.get('type')] 599*61046927SAndroid Build Coastguard Worker if t not in register_lengths: 600*61046927SAndroid Build Coastguard Worker register_lengths[t] = len(register_config.findall('register')) 601*61046927SAndroid Build Coastguard Worker else: 602*61046927SAndroid Build Coastguard Worker register_lengths[t] += len(register_config.findall('register')) 603*61046927SAndroid Build Coastguard Worker 604*61046927SAndroid Build Coastguard Worker return register_lengths 605*61046927SAndroid Build Coastguard Worker 606*61046927SAndroid Build Coastguard Worker 607*61046927SAndroid Build Coastguard Workerdef generate_register_configs(set): 608*61046927SAndroid Build Coastguard Worker register_configs = set.findall('register_config') 609*61046927SAndroid Build Coastguard Worker 610*61046927SAndroid Build Coastguard Worker for register_config in register_configs: 611*61046927SAndroid Build Coastguard Worker t = register_types[register_config.get('type')] 612*61046927SAndroid Build Coastguard Worker 613*61046927SAndroid Build Coastguard Worker availability = register_config.get('availability') 614*61046927SAndroid Build Coastguard Worker if availability: 615*61046927SAndroid Build Coastguard Worker output_availability(set, availability, register_config.get('type') + ' register config') 616*61046927SAndroid Build Coastguard Worker c_indent(3) 617*61046927SAndroid Build Coastguard Worker 618*61046927SAndroid Build Coastguard Worker registers = register_config.findall('register') 619*61046927SAndroid Build Coastguard Worker c("static const struct intel_perf_query_register_prog %s[] = {" % t) 620*61046927SAndroid Build Coastguard Worker c_indent(3) 621*61046927SAndroid Build Coastguard Worker for register in registers: 622*61046927SAndroid Build Coastguard Worker c("{ .reg = %s, .val = %s }," % (register.get('address'), register.get('value'))) 623*61046927SAndroid Build Coastguard Worker c_outdent(3) 624*61046927SAndroid Build Coastguard Worker c("};") 625*61046927SAndroid Build Coastguard Worker c("query->config.%s = %s;" % (t, t)) 626*61046927SAndroid Build Coastguard Worker c("query->config.n_%s = ARRAY_SIZE(%s);" % (t, t)) 627*61046927SAndroid Build Coastguard Worker 628*61046927SAndroid Build Coastguard Worker if availability: 629*61046927SAndroid Build Coastguard Worker c_outdent(3) 630*61046927SAndroid Build Coastguard Worker c("}") 631*61046927SAndroid Build Coastguard Worker c("\n") 632*61046927SAndroid Build Coastguard Worker 633*61046927SAndroid Build Coastguard Worker 634*61046927SAndroid Build Coastguard Worker# Wraps a <counter> element from the oa-*.xml files. 635*61046927SAndroid Build Coastguard Workerclass Counter: 636*61046927SAndroid Build Coastguard Worker def __init__(self, set, xml): 637*61046927SAndroid Build Coastguard Worker self.xml = xml 638*61046927SAndroid Build Coastguard Worker self.set = set 639*61046927SAndroid Build Coastguard Worker self.read_hash = None 640*61046927SAndroid Build Coastguard Worker self.max_hash = None 641*61046927SAndroid Build Coastguard Worker 642*61046927SAndroid Build Coastguard Worker self.read_sym = "{0}__{1}__{2}__read".format(self.set.gen.chipset, 643*61046927SAndroid Build Coastguard Worker self.set.underscore_name, 644*61046927SAndroid Build Coastguard Worker self.xml.get('underscore_name')) 645*61046927SAndroid Build Coastguard Worker self.max_sym = self.build_max_sym() 646*61046927SAndroid Build Coastguard Worker 647*61046927SAndroid Build Coastguard Worker def get(self, prop): 648*61046927SAndroid Build Coastguard Worker return self.xml.get(prop) 649*61046927SAndroid Build Coastguard Worker 650*61046927SAndroid Build Coastguard Worker # Compute the hash of a counter's equation by expanding (including all the 651*61046927SAndroid Build Coastguard Worker # sub-equations it depends on) 652*61046927SAndroid Build Coastguard Worker def compute_hashes(self): 653*61046927SAndroid Build Coastguard Worker if self.read_hash is not None: 654*61046927SAndroid Build Coastguard Worker return 655*61046927SAndroid Build Coastguard Worker 656*61046927SAndroid Build Coastguard Worker def replace_token(token): 657*61046927SAndroid Build Coastguard Worker if token[0] != "$": 658*61046927SAndroid Build Coastguard Worker return token 659*61046927SAndroid Build Coastguard Worker if token not in self.set.counter_vars: 660*61046927SAndroid Build Coastguard Worker return token 661*61046927SAndroid Build Coastguard Worker self.set.counter_vars[token].compute_hashes() 662*61046927SAndroid Build Coastguard Worker return self.set.counter_vars[token].read_hash 663*61046927SAndroid Build Coastguard Worker 664*61046927SAndroid Build Coastguard Worker read_eq = self.xml.get('equation') 665*61046927SAndroid Build Coastguard Worker self.read_hash = ' '.join(map(replace_token, read_eq.split())) 666*61046927SAndroid Build Coastguard Worker 667*61046927SAndroid Build Coastguard Worker max_eq = self.xml.get('max_equation') 668*61046927SAndroid Build Coastguard Worker if max_eq: 669*61046927SAndroid Build Coastguard Worker self.max_hash = ' '.join(map(replace_token, max_eq.split())) 670*61046927SAndroid Build Coastguard Worker 671*61046927SAndroid Build Coastguard Worker def has_custom_max_func(self): 672*61046927SAndroid Build Coastguard Worker max_eq = self.xml.get('max_equation') 673*61046927SAndroid Build Coastguard Worker if not max_eq: 674*61046927SAndroid Build Coastguard Worker return False 675*61046927SAndroid Build Coastguard Worker 676*61046927SAndroid Build Coastguard Worker try: 677*61046927SAndroid Build Coastguard Worker val = float(max_eq) 678*61046927SAndroid Build Coastguard Worker if val == 100: 679*61046927SAndroid Build Coastguard Worker return False 680*61046927SAndroid Build Coastguard Worker except ValueError: 681*61046927SAndroid Build Coastguard Worker pass 682*61046927SAndroid Build Coastguard Worker 683*61046927SAndroid Build Coastguard Worker for token in max_eq.split(): 684*61046927SAndroid Build Coastguard Worker if token[0] == '$' and resolve_variable(token, self.set, True) == None: 685*61046927SAndroid Build Coastguard Worker print("unresolved token " + token) 686*61046927SAndroid Build Coastguard Worker return False 687*61046927SAndroid Build Coastguard Worker return True 688*61046927SAndroid Build Coastguard Worker 689*61046927SAndroid Build Coastguard Worker def build_max_sym(self): 690*61046927SAndroid Build Coastguard Worker max_eq = self.xml.get('max_equation') 691*61046927SAndroid Build Coastguard Worker if not max_eq: 692*61046927SAndroid Build Coastguard Worker return "NULL" 693*61046927SAndroid Build Coastguard Worker 694*61046927SAndroid Build Coastguard Worker try: 695*61046927SAndroid Build Coastguard Worker val = float(max_eq) 696*61046927SAndroid Build Coastguard Worker if val == 100: 697*61046927SAndroid Build Coastguard Worker if self.xml.get('data_type') == 'uint64': 698*61046927SAndroid Build Coastguard Worker return "percentage_max_uint64" 699*61046927SAndroid Build Coastguard Worker else: 700*61046927SAndroid Build Coastguard Worker return "percentage_max_float" 701*61046927SAndroid Build Coastguard Worker except ValueError: 702*61046927SAndroid Build Coastguard Worker pass 703*61046927SAndroid Build Coastguard Worker 704*61046927SAndroid Build Coastguard Worker assert self.has_custom_max_func() 705*61046927SAndroid Build Coastguard Worker return "{0}__{1}__{2}__max".format(self.set.gen.chipset, 706*61046927SAndroid Build Coastguard Worker self.set.underscore_name, 707*61046927SAndroid Build Coastguard Worker self.xml.get('underscore_name')) 708*61046927SAndroid Build Coastguard Worker 709*61046927SAndroid Build Coastguard Worker 710*61046927SAndroid Build Coastguard Worker# Wraps a <set> element from the oa-*.xml files. 711*61046927SAndroid Build Coastguard Workerclass Set: 712*61046927SAndroid Build Coastguard Worker def __init__(self, gen, xml): 713*61046927SAndroid Build Coastguard Worker self.gen = gen 714*61046927SAndroid Build Coastguard Worker self.xml = xml 715*61046927SAndroid Build Coastguard Worker 716*61046927SAndroid Build Coastguard Worker self.counter_vars = {} 717*61046927SAndroid Build Coastguard Worker self.max_funcs = {} 718*61046927SAndroid Build Coastguard Worker self.read_funcs = {} 719*61046927SAndroid Build Coastguard Worker 720*61046927SAndroid Build Coastguard Worker xml_counters = self.xml.findall("counter") 721*61046927SAndroid Build Coastguard Worker self.counters = [] 722*61046927SAndroid Build Coastguard Worker for xml_counter in xml_counters: 723*61046927SAndroid Build Coastguard Worker counter = Counter(self, xml_counter) 724*61046927SAndroid Build Coastguard Worker self.counters.append(counter) 725*61046927SAndroid Build Coastguard Worker self.counter_vars['$' + counter.get('symbol_name')] = counter 726*61046927SAndroid Build Coastguard Worker self.read_funcs[counter.get('symbol_name')] = counter.read_sym 727*61046927SAndroid Build Coastguard Worker self.max_funcs[counter.get('symbol_name')] = counter.max_sym 728*61046927SAndroid Build Coastguard Worker 729*61046927SAndroid Build Coastguard Worker for counter in self.counters: 730*61046927SAndroid Build Coastguard Worker counter.compute_hashes() 731*61046927SAndroid Build Coastguard Worker 732*61046927SAndroid Build Coastguard Worker @property 733*61046927SAndroid Build Coastguard Worker def hw_config_guid(self): 734*61046927SAndroid Build Coastguard Worker return self.xml.get('hw_config_guid') 735*61046927SAndroid Build Coastguard Worker 736*61046927SAndroid Build Coastguard Worker @property 737*61046927SAndroid Build Coastguard Worker def name(self): 738*61046927SAndroid Build Coastguard Worker return self.xml.get('name') 739*61046927SAndroid Build Coastguard Worker 740*61046927SAndroid Build Coastguard Worker @property 741*61046927SAndroid Build Coastguard Worker def symbol_name(self): 742*61046927SAndroid Build Coastguard Worker return self.xml.get('symbol_name') 743*61046927SAndroid Build Coastguard Worker 744*61046927SAndroid Build Coastguard Worker @property 745*61046927SAndroid Build Coastguard Worker def underscore_name(self): 746*61046927SAndroid Build Coastguard Worker return self.xml.get('underscore_name') 747*61046927SAndroid Build Coastguard Worker 748*61046927SAndroid Build Coastguard Worker def findall(self, path): 749*61046927SAndroid Build Coastguard Worker return self.xml.findall(path) 750*61046927SAndroid Build Coastguard Worker 751*61046927SAndroid Build Coastguard Worker def find(self, path): 752*61046927SAndroid Build Coastguard Worker return self.xml.find(path) 753*61046927SAndroid Build Coastguard Worker 754*61046927SAndroid Build Coastguard Worker 755*61046927SAndroid Build Coastguard Worker# Wraps an entire oa-*.xml file. 756*61046927SAndroid Build Coastguard Workerclass Gen: 757*61046927SAndroid Build Coastguard Worker def __init__(self, filename): 758*61046927SAndroid Build Coastguard Worker self.filename = filename 759*61046927SAndroid Build Coastguard Worker self.xml = et.parse(self.filename) 760*61046927SAndroid Build Coastguard Worker self.chipset = self.xml.find('.//set').get('chipset').lower() 761*61046927SAndroid Build Coastguard Worker self.sets = [] 762*61046927SAndroid Build Coastguard Worker 763*61046927SAndroid Build Coastguard Worker for xml_set in self.xml.findall(".//set"): 764*61046927SAndroid Build Coastguard Worker self.sets.append(Set(self, xml_set)) 765*61046927SAndroid Build Coastguard Worker 766*61046927SAndroid Build Coastguard Worker 767*61046927SAndroid Build Coastguard Workerdef main(): 768*61046927SAndroid Build Coastguard Worker global c_file 769*61046927SAndroid Build Coastguard Worker global header_file 770*61046927SAndroid Build Coastguard Worker 771*61046927SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 772*61046927SAndroid Build Coastguard Worker parser.add_argument("--header", help="Header file to write", required=True) 773*61046927SAndroid Build Coastguard Worker parser.add_argument("--code", help="C file to write", required=True) 774*61046927SAndroid Build Coastguard Worker parser.add_argument("xml_files", nargs='+', help="List of xml metrics files to process") 775*61046927SAndroid Build Coastguard Worker 776*61046927SAndroid Build Coastguard Worker args = parser.parse_args() 777*61046927SAndroid Build Coastguard Worker 778*61046927SAndroid Build Coastguard Worker c_file = open(args.code, 'w') 779*61046927SAndroid Build Coastguard Worker header_file = open(args.header, 'w') 780*61046927SAndroid Build Coastguard Worker 781*61046927SAndroid Build Coastguard Worker gens = [] 782*61046927SAndroid Build Coastguard Worker for xml_file in args.xml_files: 783*61046927SAndroid Build Coastguard Worker gens.append(Gen(xml_file)) 784*61046927SAndroid Build Coastguard Worker 785*61046927SAndroid Build Coastguard Worker 786*61046927SAndroid Build Coastguard Worker copyright = textwrap.dedent("""\ 787*61046927SAndroid Build Coastguard Worker /* Autogenerated file, DO NOT EDIT manually! generated by {} 788*61046927SAndroid Build Coastguard Worker * 789*61046927SAndroid Build Coastguard Worker * Copyright (c) 2015 Intel Corporation 790*61046927SAndroid Build Coastguard Worker * 791*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 792*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 793*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 794*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 795*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 796*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 797*61046927SAndroid Build Coastguard Worker * 798*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 799*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 800*61046927SAndroid Build Coastguard Worker * Software. 801*61046927SAndroid Build Coastguard Worker * 802*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 803*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 804*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 805*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 806*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 807*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 808*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE. 809*61046927SAndroid Build Coastguard Worker */ 810*61046927SAndroid Build Coastguard Worker 811*61046927SAndroid Build Coastguard Worker """).format(os.path.basename(__file__)) 812*61046927SAndroid Build Coastguard Worker 813*61046927SAndroid Build Coastguard Worker h(copyright) 814*61046927SAndroid Build Coastguard Worker h(textwrap.dedent("""\ 815*61046927SAndroid Build Coastguard Worker #pragma once 816*61046927SAndroid Build Coastguard Worker 817*61046927SAndroid Build Coastguard Worker struct intel_perf_config; 818*61046927SAndroid Build Coastguard Worker 819*61046927SAndroid Build Coastguard Worker """)) 820*61046927SAndroid Build Coastguard Worker 821*61046927SAndroid Build Coastguard Worker c(copyright) 822*61046927SAndroid Build Coastguard Worker c(textwrap.dedent("""\ 823*61046927SAndroid Build Coastguard Worker #include <stdint.h> 824*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 825*61046927SAndroid Build Coastguard Worker 826*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h" 827*61046927SAndroid Build Coastguard Worker #include "util/ralloc.h" 828*61046927SAndroid Build Coastguard Worker 829*61046927SAndroid Build Coastguard Worker """)) 830*61046927SAndroid Build Coastguard Worker 831*61046927SAndroid Build Coastguard Worker c("#include \"" + os.path.basename(args.header) + "\"") 832*61046927SAndroid Build Coastguard Worker 833*61046927SAndroid Build Coastguard Worker c(textwrap.dedent("""\ 834*61046927SAndroid Build Coastguard Worker #include "perf/intel_perf.h" 835*61046927SAndroid Build Coastguard Worker #include "perf/intel_perf_setup.h" 836*61046927SAndroid Build Coastguard Worker """)) 837*61046927SAndroid Build Coastguard Worker 838*61046927SAndroid Build Coastguard Worker names = builtins.set() 839*61046927SAndroid Build Coastguard Worker descs = builtins.set() 840*61046927SAndroid Build Coastguard Worker symbol_names = builtins.set() 841*61046927SAndroid Build Coastguard Worker categories = builtins.set() 842*61046927SAndroid Build Coastguard Worker for gen in gens: 843*61046927SAndroid Build Coastguard Worker for set in gen.sets: 844*61046927SAndroid Build Coastguard Worker for counter in set.counters: 845*61046927SAndroid Build Coastguard Worker names.add(counter.get('name')) 846*61046927SAndroid Build Coastguard Worker symbol_names.add(counter.get('symbol_name')) 847*61046927SAndroid Build Coastguard Worker descs.add(counter.get('description') + " " + desc_units(counter.get('units'))) 848*61046927SAndroid Build Coastguard Worker categories.add(counter.get('mdapi_group')) 849*61046927SAndroid Build Coastguard Worker 850*61046927SAndroid Build Coastguard Worker name_to_idx = str_to_idx_table(names) 851*61046927SAndroid Build Coastguard Worker output_str_table("name", name_to_idx) 852*61046927SAndroid Build Coastguard Worker 853*61046927SAndroid Build Coastguard Worker desc_to_idx = str_to_idx_table(descs) 854*61046927SAndroid Build Coastguard Worker output_str_table("desc", desc_to_idx) 855*61046927SAndroid Build Coastguard Worker 856*61046927SAndroid Build Coastguard Worker symbol_name_to_idx = str_to_idx_table(symbol_names) 857*61046927SAndroid Build Coastguard Worker output_str_table("symbol_name", symbol_name_to_idx) 858*61046927SAndroid Build Coastguard Worker 859*61046927SAndroid Build Coastguard Worker category_to_idx = str_to_idx_table(categories) 860*61046927SAndroid Build Coastguard Worker output_str_table("category", category_to_idx) 861*61046927SAndroid Build Coastguard Worker 862*61046927SAndroid Build Coastguard Worker # Print out all equation functions. 863*61046927SAndroid Build Coastguard Worker for gen in gens: 864*61046927SAndroid Build Coastguard Worker for set in gen.sets: 865*61046927SAndroid Build Coastguard Worker for counter in set.counters: 866*61046927SAndroid Build Coastguard Worker output_counter_read(gen, set, counter) 867*61046927SAndroid Build Coastguard Worker output_counter_max(gen, set, counter) 868*61046927SAndroid Build Coastguard Worker 869*61046927SAndroid Build Coastguard Worker c("\n") 870*61046927SAndroid Build Coastguard Worker c("static const struct intel_perf_query_counter_data counters[] = {\n") 871*61046927SAndroid Build Coastguard Worker c_indent(3) 872*61046927SAndroid Build Coastguard Worker 873*61046927SAndroid Build Coastguard Worker counter_to_idx = collections.OrderedDict() 874*61046927SAndroid Build Coastguard Worker idx = 0 875*61046927SAndroid Build Coastguard Worker for gen in gens: 876*61046927SAndroid Build Coastguard Worker for set in gen.sets: 877*61046927SAndroid Build Coastguard Worker for counter in set.counters: 878*61046927SAndroid Build Coastguard Worker key = counter_key(counter) 879*61046927SAndroid Build Coastguard Worker if key not in counter_to_idx: 880*61046927SAndroid Build Coastguard Worker counter_to_idx[key] = idx 881*61046927SAndroid Build Coastguard Worker output_counter_struct(set, key, idx, 882*61046927SAndroid Build Coastguard Worker name_to_idx, 883*61046927SAndroid Build Coastguard Worker desc_to_idx, 884*61046927SAndroid Build Coastguard Worker symbol_name_to_idx, 885*61046927SAndroid Build Coastguard Worker category_to_idx) 886*61046927SAndroid Build Coastguard Worker idx += 1 887*61046927SAndroid Build Coastguard Worker 888*61046927SAndroid Build Coastguard Worker c_outdent(3) 889*61046927SAndroid Build Coastguard Worker c("};\n\n") 890*61046927SAndroid Build Coastguard Worker 891*61046927SAndroid Build Coastguard Worker c(textwrap.dedent("""\ 892*61046927SAndroid Build Coastguard Worker static void ATTRIBUTE_NOINLINE 893*61046927SAndroid Build Coastguard Worker intel_perf_query_add_counter_uint64(struct intel_perf_query_info *query, 894*61046927SAndroid Build Coastguard Worker int counter_idx, size_t offset, 895*61046927SAndroid Build Coastguard Worker intel_counter_read_uint64_t oa_counter_max, 896*61046927SAndroid Build Coastguard Worker intel_counter_read_uint64_t oa_counter_read) 897*61046927SAndroid Build Coastguard Worker { 898*61046927SAndroid Build Coastguard Worker struct intel_perf_query_counter *dest = &query->counters[query->n_counters++]; 899*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_counter_data *counter = &counters[counter_idx]; 900*61046927SAndroid Build Coastguard Worker 901*61046927SAndroid Build Coastguard Worker dest->name = &name[counter->name_idx]; 902*61046927SAndroid Build Coastguard Worker dest->desc = &desc[counter->desc_idx]; 903*61046927SAndroid Build Coastguard Worker dest->symbol_name = &symbol_name[counter->symbol_name_idx]; 904*61046927SAndroid Build Coastguard Worker dest->category = &category[counter->category_idx]; 905*61046927SAndroid Build Coastguard Worker 906*61046927SAndroid Build Coastguard Worker dest->offset = offset; 907*61046927SAndroid Build Coastguard Worker dest->type = counter->type; 908*61046927SAndroid Build Coastguard Worker dest->data_type = counter->data_type; 909*61046927SAndroid Build Coastguard Worker dest->units = counter->units; 910*61046927SAndroid Build Coastguard Worker dest->oa_counter_max_uint64 = oa_counter_max; 911*61046927SAndroid Build Coastguard Worker dest->oa_counter_read_uint64 = oa_counter_read; 912*61046927SAndroid Build Coastguard Worker } 913*61046927SAndroid Build Coastguard Worker 914*61046927SAndroid Build Coastguard Worker static void ATTRIBUTE_NOINLINE 915*61046927SAndroid Build Coastguard Worker intel_perf_query_add_counter_float(struct intel_perf_query_info *query, 916*61046927SAndroid Build Coastguard Worker int counter_idx, size_t offset, 917*61046927SAndroid Build Coastguard Worker intel_counter_read_float_t oa_counter_max, 918*61046927SAndroid Build Coastguard Worker intel_counter_read_float_t oa_counter_read) 919*61046927SAndroid Build Coastguard Worker { 920*61046927SAndroid Build Coastguard Worker struct intel_perf_query_counter *dest = &query->counters[query->n_counters++]; 921*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_counter_data *counter = &counters[counter_idx]; 922*61046927SAndroid Build Coastguard Worker 923*61046927SAndroid Build Coastguard Worker dest->name = &name[counter->name_idx]; 924*61046927SAndroid Build Coastguard Worker dest->desc = &desc[counter->desc_idx]; 925*61046927SAndroid Build Coastguard Worker dest->symbol_name = &symbol_name[counter->symbol_name_idx]; 926*61046927SAndroid Build Coastguard Worker dest->category = &category[counter->category_idx]; 927*61046927SAndroid Build Coastguard Worker 928*61046927SAndroid Build Coastguard Worker dest->offset = offset; 929*61046927SAndroid Build Coastguard Worker dest->type = counter->type; 930*61046927SAndroid Build Coastguard Worker dest->data_type = counter->data_type; 931*61046927SAndroid Build Coastguard Worker dest->units = counter->units; 932*61046927SAndroid Build Coastguard Worker dest->oa_counter_max_float = oa_counter_max; 933*61046927SAndroid Build Coastguard Worker dest->oa_counter_read_float = oa_counter_read; 934*61046927SAndroid Build Coastguard Worker } 935*61046927SAndroid Build Coastguard Worker 936*61046927SAndroid Build Coastguard Worker static float ATTRIBUTE_NOINLINE 937*61046927SAndroid Build Coastguard Worker percentage_max_float(struct intel_perf_config *perf, 938*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_info *query, 939*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_result *results) 940*61046927SAndroid Build Coastguard Worker { 941*61046927SAndroid Build Coastguard Worker return 100; 942*61046927SAndroid Build Coastguard Worker } 943*61046927SAndroid Build Coastguard Worker 944*61046927SAndroid Build Coastguard Worker static uint64_t ATTRIBUTE_NOINLINE 945*61046927SAndroid Build Coastguard Worker percentage_max_uint64(struct intel_perf_config *perf, 946*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_info *query, 947*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_result *results) 948*61046927SAndroid Build Coastguard Worker { 949*61046927SAndroid Build Coastguard Worker return 100; 950*61046927SAndroid Build Coastguard Worker } 951*61046927SAndroid Build Coastguard Worker """)) 952*61046927SAndroid Build Coastguard Worker 953*61046927SAndroid Build Coastguard Worker # Print out all metric sets registration functions for each set in each 954*61046927SAndroid Build Coastguard Worker # generation. 955*61046927SAndroid Build Coastguard Worker for gen in gens: 956*61046927SAndroid Build Coastguard Worker for set in gen.sets: 957*61046927SAndroid Build Coastguard Worker counters = set.counters 958*61046927SAndroid Build Coastguard Worker 959*61046927SAndroid Build Coastguard Worker c("\n") 960*61046927SAndroid Build Coastguard Worker c("\nstatic void\n") 961*61046927SAndroid Build Coastguard Worker c("{0}_register_{1}_counter_query(struct intel_perf_config *perf)\n".format(gen.chipset, set.underscore_name)) 962*61046927SAndroid Build Coastguard Worker c("{\n") 963*61046927SAndroid Build Coastguard Worker c_indent(3) 964*61046927SAndroid Build Coastguard Worker 965*61046927SAndroid Build Coastguard Worker c("struct intel_perf_query_info *query = intel_query_alloc(perf, %u);\n" % len(counters)) 966*61046927SAndroid Build Coastguard Worker c("\n") 967*61046927SAndroid Build Coastguard Worker c("query->name = \"" + set.name + "\";\n") 968*61046927SAndroid Build Coastguard Worker c("query->symbol_name = \"" + set.symbol_name + "\";\n") 969*61046927SAndroid Build Coastguard Worker c("query->guid = \"" + set.hw_config_guid + "\";\n") 970*61046927SAndroid Build Coastguard Worker 971*61046927SAndroid Build Coastguard Worker c("\n") 972*61046927SAndroid Build Coastguard Worker c("struct intel_perf_query_counter *counter = query->counters;\n") 973*61046927SAndroid Build Coastguard Worker 974*61046927SAndroid Build Coastguard Worker c("\n") 975*61046927SAndroid Build Coastguard Worker c("/* Note: we're assuming there can't be any variation in the definition ") 976*61046927SAndroid Build Coastguard Worker c(" * of a query between contexts so it's ok to describe a query within a ") 977*61046927SAndroid Build Coastguard Worker c(" * global variable which only needs to be initialized once... */") 978*61046927SAndroid Build Coastguard Worker c("\nif (!query->data_size) {") 979*61046927SAndroid Build Coastguard Worker c_indent(3) 980*61046927SAndroid Build Coastguard Worker 981*61046927SAndroid Build Coastguard Worker generate_register_configs(set) 982*61046927SAndroid Build Coastguard Worker 983*61046927SAndroid Build Coastguard Worker offset = 0 984*61046927SAndroid Build Coastguard Worker for counter in counters: 985*61046927SAndroid Build Coastguard Worker offset = output_counter_report(set, counter, counter_to_idx, offset) 986*61046927SAndroid Build Coastguard Worker 987*61046927SAndroid Build Coastguard Worker 988*61046927SAndroid Build Coastguard Worker c("\ncounter = &query->counters[query->n_counters - 1];\n") 989*61046927SAndroid Build Coastguard Worker c("query->data_size = counter->offset + intel_perf_query_counter_get_size(counter);\n") 990*61046927SAndroid Build Coastguard Worker 991*61046927SAndroid Build Coastguard Worker c_outdent(3) 992*61046927SAndroid Build Coastguard Worker c("}"); 993*61046927SAndroid Build Coastguard Worker 994*61046927SAndroid Build Coastguard Worker c("\n_mesa_hash_table_insert(perf->oa_metrics_table, query->guid, query);") 995*61046927SAndroid Build Coastguard Worker 996*61046927SAndroid Build Coastguard Worker c_outdent(3) 997*61046927SAndroid Build Coastguard Worker c("}\n") 998*61046927SAndroid Build Coastguard Worker 999*61046927SAndroid Build Coastguard Worker h("void intel_oa_register_queries_" + gen.chipset + "(struct intel_perf_config *perf);\n") 1000*61046927SAndroid Build Coastguard Worker 1001*61046927SAndroid Build Coastguard Worker c("\nvoid") 1002*61046927SAndroid Build Coastguard Worker c("intel_oa_register_queries_" + gen.chipset + "(struct intel_perf_config *perf)") 1003*61046927SAndroid Build Coastguard Worker c("{") 1004*61046927SAndroid Build Coastguard Worker c_indent(3) 1005*61046927SAndroid Build Coastguard Worker 1006*61046927SAndroid Build Coastguard Worker for set in gen.sets: 1007*61046927SAndroid Build Coastguard Worker c("{0}_register_{1}_counter_query(perf);".format(gen.chipset, set.underscore_name)) 1008*61046927SAndroid Build Coastguard Worker 1009*61046927SAndroid Build Coastguard Worker c_outdent(3) 1010*61046927SAndroid Build Coastguard Worker c("}") 1011*61046927SAndroid Build Coastguard Worker 1012*61046927SAndroid Build Coastguard Worker 1013*61046927SAndroid Build Coastguard Workerif __name__ == '__main__': 1014*61046927SAndroid Build Coastguard Worker main() 1015