diff --git a/lib/i915/perf-configs/codegen.py b/lib/i915/perf-configs/codegen.py index 93a2df4a7efdee4719fed8347c14e618530f7338..755142ccef8c6f4985f799f6fdcd4b8afa916f08 100644 --- a/lib/i915/perf-configs/codegen.py +++ b/lib/i915/perf-configs/codegen.py @@ -1,3 +1,4 @@ +import re import xml.etree.ElementTree as et class Codegen: @@ -123,6 +124,51 @@ class Set: return self.xml.find(path) +hw_vars_mapping = { + "$EuCoresTotalCount": { 'c': "perf->devinfo.n_eus", 'desc': "The total number of execution units" }, + "$EuSlicesTotalCount": { 'c': "perf->devinfo.n_eu_slices" }, + "$EuSubslicesTotalCount": { 'c': "perf->devinfo.n_eu_sub_slices" }, + "$EuDualSubslicesTotalCount": { 'c': "perf->devinfo.n_eu_sub_slices" }, + "$EuDualSubslicesSlice0123Count": { 'c': "perf->devinfo.n_eu_sub_slices_half_slices" }, + "$EuThreadsCount": { 'c': "perf->devinfo.eu_threads_count" }, + + "$VectorEngineTotalCount": { 'c': "perf->devinfo.n_eus", 'desc': "The total number of execution units" }, + "$VectorEnginePerXeCoreCount": { 'c': "perf->devinfo.n_eu_sub_slices" }, + "$VectorEngineThreadsCount": { 'c': "perf->devinfo.eu_threads_count" }, + + "$SliceMask": { 'c': "perf->devinfo.slice_mask" }, + "$SliceTotalCount": { 'c': "perf->devinfo.n_eu_slices" }, + + "$SubsliceMask": { 'c': "perf->devinfo.subslice_mask" }, + "$DualSubsliceMask": { 'c': "perf->devinfo.subslice_mask" }, + + "$GtSliceMask": { 'c': "perf->devinfo.slice_mask" }, + "$GtSubsliceMask": { 'c': "perf->devinfo.subslice_mask" }, + "$GtDualSubsliceMask": { 'c': "perf->devinfo.subslice_mask" }, + + "$GtXeCoreMask": { 'c': "perf->devinfo.slice_mask" }, + "$XeCoreMask": { 'c': "perf->devinfo.slice_mask" }, + "$XeCoreTotalCount": { 'c': 'perf->devinfo.n_eu_sub_slices' }, + + "$GpuTimestampFrequency": { 'c': "perf->devinfo.timestamp_frequency" }, + "$GpuMinFrequency": { 'c': "perf->devinfo.gt_min_freq" }, + "$GpuMaxFrequency": { 'c': "perf->devinfo.gt_max_freq" }, + "$SkuRevisionId": { 'c': "perf->devinfo.revision" }, + "$QueryMode": { 'c': "perf->devinfo.query_mode" }, +} + +def is_hw_var(name): + m = re.search('\$GtSlice([0-9]+)XeCore([0-9]+)$', name) + if m: + return True + m = re.search('\$GtSlice([0-9]+)$', name) + if m: + return True + m = re.search('\$GtSlice([0-9]+)DualSubslice([0-9]+)$', name) + if m: + return True + return name in hw_vars_mapping + class Gen: def __init__(self, filename, c): self.filename = filename @@ -163,23 +209,11 @@ class Gen: self.exp_ops["ULTE"] = (2, self.splice_ulte) self.exp_ops["ULT"] = (2, self.splice_ult) self.exp_ops["&&"] = (2, self.splice_logical_and) + self.exp_ops["<<"] = (2, self.splice_lshft) + self.exp_ops[">>"] = (2, self.splice_rshft) + self.exp_ops["UMUL"] = (2, self.splice_uml) - self.hw_vars = { - "$EuCoresTotalCount": { 'c': "perf->devinfo.n_eus", 'desc': "The total number of execution units" }, - "$EuSlicesTotalCount": { 'c': "perf->devinfo.n_eu_slices" }, - "$EuSubslicesTotalCount": { 'c': "perf->devinfo.n_eu_sub_slices" }, - "$EuDualSubslicesTotalCount": { 'c': "perf->devinfo.n_eu_sub_slices" }, - "$EuDualSubslicesSlice0123Count": { 'c': "perf->devinfo.n_eu_sub_slices_half_slices" }, - "$EuThreadsCount": { 'c': "perf->devinfo.eu_threads_count" }, - "$SliceMask": { 'c': "perf->devinfo.slice_mask" }, - "$DualSubsliceMask": { 'c': "perf->devinfo.subslice_mask" }, - "$SubsliceMask": { 'c': "perf->devinfo.subslice_mask" }, - "$GpuTimestampFrequency": { 'c': "perf->devinfo.timestamp_frequency" }, - "$GpuMinFrequency": { 'c': "perf->devinfo.gt_min_freq" }, - "$GpuMaxFrequency": { 'c': "perf->devinfo.gt_max_freq" }, - "$SkuRevisionId": { 'c': "perf->devinfo.revision" }, - "$QueryMode": { 'c': "perf->devinfo.query_mode" }, - } + self.hw_vars = hw_vars_mapping def emit_fadd(self, tmp_id, args): self.c("double tmp{0} = {1} + {2};".format(tmp_id, args[1], args[0])) @@ -286,11 +320,29 @@ class Gen: def splice_ugt(self, args): return self.brkt(args[1]) + " > " + self.brkt(args[0]) + def splice_lshft(self, args): + return '(' + self.brkt(args[1]) + " << " + self.brkt(args[0]) + ')' + + def splice_rshft(self, args): + return '(' + self.brkt(args[1]) + " >> " + self.brkt(args[0]) + ')' + + def splice_uml(self, args): + return self.brkt(args[1]) + " * " + self.brkt(args[0]) + def resolve_variable(self, name, set): if name in self.hw_vars: return self.hw_vars[name]['c'] if name in set.counter_vars: return set.read_funcs[name] + "(perf, metric_set, accumulator)" + m = re.search('\$GtSlice([0-9]+)$', name) + if m: + return 'intel_perf_devinfo_slice_available(&perf->devinfo, {0})'.format(m.group(1)) + m = re.search('\$GtSlice([0-9]+)DualSubslice([0-9]+)$', name) + if m: + return 'intel_perf_devinfo_subslice_available(&perf->devinfo, {0}, {1})'.format(m.group(1), m.group(2)) + m = re.search('\$GtSlice([0-9]+)XeCore([0-9]+)$', name) + if m: + return 'intel_perf_devinfo_subslice_available(&perf->devinfo, {0}, {1})'.format(m.group(1), m.group(2)) return None def output_rpn_equation_code(self, set, counter, equation):