diff options
| author | Rajarshi Das <drajarshi@in.ibm.com> | 2016-12-09 11:13:08 +0530 |
|---|---|---|
| committer | Santosh Sivaraj <santosiv@in.ibm.com> | 2016-12-09 11:14:39 +0530 |
| commit | 1b90228f617085ff96f8e04f95a83bd972ed0c98 (patch) | |
| tree | 51db8313c7a28c77ebafcb2887ff23c84d72d0a5 | |
| parent | 33a362c8afa5e72df379e441563bde389bb017f4 (diff) | |
| download | ima-catalog-1b90228f617085ff96f8e04f95a83bd972ed0c98.tar.gz ima-catalog-1b90228f617085ff96f8e04f95a83bd972ed0c98.zip | |
Update dts file generation
Signed-off-by: Rajarshi Das <drajarshi@in.ibm.com>
Signed-off-by: Santosh Sivaraj <santosiv@in.ibm.com>
| -rw-r--r-- | catalog/catalog.py | 31 | ||||
| -rw-r--r-- | catalog/generate_dts.py | 194 |
2 files changed, 175 insertions, 50 deletions
diff --git a/catalog/catalog.py b/catalog/catalog.py index f1bf056..8ea3255 100644 --- a/catalog/catalog.py +++ b/catalog/catalog.py @@ -62,13 +62,35 @@ def create_catalog(version, old_lid): return pad_page(header, PAGE_SIZE) + schema + events + groups + formulae if __name__ == "__main__": + unitname = '' + pvr = '' + coreimaflag = '' + threadimaflag = '' + if len(sys.argv) <= 3: - print "Usage: ./%s version old_lid out_file" % (sys.argv[0]) - print "\nThe new LID and DTS files will be named as <out_file>.lid and <out_file>.dts" + print "In order to generate a new catalog LID and new DTS file:\n" + print "Usage: ./%s version old_lid new_prefix <unitname> <pvrname> <threadima> <coreima> \n" % (sys.argv[0]) + print "e.g. ./%s 8 v8.3.lid e8100910 mcs 4D0200 yes yes \n" % (sys.argv[0]) + print "The arguments marked in <> are optional. \n" + print "The new LID and DTS files will be named as <new_prefix>.lid and <new_prefix>.dts" exit(1) + print 'Arguments specified:\n' + print 'Version: ' + str(sys.argv[1]) + ' Old LID file: ' + str(sys.argv[2]) + lid_filename = str(sys.argv[3]) + '.lid' + print 'New LID file: {}'.format(lid_filename) dts_filename = str(sys.argv[3]) + '.dts' + print 'DTS file: {}'.format(dts_filename) + + if len(sys.argv) == 5: + unitname = str(sys.argv[4]) + if len(sys.argv) == 6: + pvr = str(sys.argv[5]) + if len(sys.argv) == 7: + coreimaflag = str(sys.argv[6]) + if len(sys.argv) == 8: + threadimaflag = str(sys.argv[7]) # get the version for the new build, and older catalog file to extract the # schema data @@ -80,5 +102,6 @@ if __name__ == "__main__": f.write(c) f.close() - # Specify input filename (new lid), verbose flag, and dts output filename - gen_dts(lid_filename, False, dts_filename) + # Specify input filename (new lid), verbose flag, dts output filename , + # unit to fetch, pvr id, core ima (yes or no), thread ima (yes or no) + gen_dts(lid_filename, False, dts_filename, unitname, pvr, coreimaflag, threadimaflag) diff --git a/catalog/generate_dts.py b/catalog/generate_dts.py index ec3834b..f7d0f45 100644 --- a/catalog/generate_dts.py +++ b/catalog/generate_dts.py @@ -2,6 +2,7 @@ # # Copyright (C) 2016 Madhavan Srinivasan <maddy@linux.vnet.ibm.com>, IBM # (C) 2016 Hemant K. Shaw <hemant@linux.vnet.ibm.com> +# (C) 2016 Rajarshi Das <drajarshi@in.ibm.com> # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -12,6 +13,7 @@ import sys, getopt import string from struct import * from collections import namedtuple +import os event_domain_1 = [] #Chip IMA events event_domain_2 = [] #Core IMA event (PDBAR) @@ -36,8 +38,6 @@ nest_mcs_scale = "1.2207e-4" nest_mcs_unit = "MiB" core_ima_scale = "128" -pvr_list = ["4D0200"] - # Filter out the raw (non-ascii) byes def get_name(st): res = set(string.printable) @@ -182,19 +182,26 @@ class Groups: self.offset += self._group.len -def dt_event(tabs, name, reg, size, unit, scale, desc): +def dt_event(tabs, name, reg, size, unit, scale, desc, nodename): # Simplified node name s = "" - s += '\t' * tabs +'%s@%x {\n'% (name, reg) + s += '\t' * tabs +'%s@%x {\n'% (nodename, reg) + s += '\t' * (tabs+1) + 'event-name = "%s" ;\n' % (name) s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) if unit != '' and unit.strip() : - s += '\t' * (tabs+1) + 'unit = "%s" ;\n'%(unit) + s += '\t' * (tabs+1) + 'unit = "%s" ;\n'%(unit) if scale != '' and scale.strip() : - s += '\t' * (tabs+1) + 'scale = "%s" ;\n'%(scale) - s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) - s += '\t' * tabs + '};' + s += '\t' * (tabs+1) + 'scale = "%s" ;\n'%(scale) + s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) + s += '\t' * tabs + '};' return s def dt_unit(tabs,unit,events, compat): + xlink_cyc_event_added = False + xlink_cyc_last_sample_event_added = False + alink_cyc_event_added = False + alink_cyc_last_sample_event_added = False + event_count = 0 + s = "" tabs += 1 s += '\t' * tabs +'%s {\n'% (nest_unit_names[unit]) @@ -210,8 +217,29 @@ def dt_unit(tabs,unit,events, compat): event_unit = nest_mcs_unit for i in events: event = event_domain_1[i] + if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: + continue + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ + xlink_cyc_last_sample_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ + alink_cyc_last_sample_event_added == True: + continue + + nodename = nest_unit_names[unit] + "-" + str(event_count) s += dt_event((tabs), event[0], event[1], 8, event_unit, - event_scale, event[2]) + event_scale, event[2], nodename) + event_count = event_count + 1 + if event[0] == 'PM_XLINK_CYCLES': + xlink_cyc_event_added = True + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': + xlink_cyc_last_sample_event_added = True + if event[0] == 'PM_ALINK_CYCLES': + alink_cyc_event_added = True + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': + alink_cyc_last_sample_event_added = True s += "\n" s += '\t' * (tabs-1) + "};\n" @@ -219,15 +247,18 @@ def dt_unit(tabs,unit,events, compat): def core_ima_dt_unit(tabs, events): s = "" - tabs += 1 - s += '\t' * tabs + '%s {\n' % ("core_ima") + groupname = "core-ima" + s += '\t' * tabs + '%s {\n' % (groupname) tabs +=1 - s += '\t' * tabs + "compatble = \"%s\";\n" % "ibm,nest-counters-core-ima" + s += '\t' * tabs + "compatible = \"%s\";\n" % "ibm,ima-counters-core" s += '\t' * tabs + "ranges;\n" s += '\t' * tabs + "#address-cells = <0x1>;\n" s += '\t' * tabs + "#size-cells = <0x1>;\n\n" + event_count = 0 for i in events: - s += dt_event(tabs, i[0], i[1], 8, '', core_ima_scale, i[2]) + nodename = groupname + "-" + str(event_count) + s += dt_event(tabs, i[0], i[1], 8, '', core_ima_scale, i[2], nodename) + event_count = event_count + 1 s += "\n" s += '\t' * (tabs - 1) + "};\n" @@ -235,22 +266,40 @@ def core_ima_dt_unit(tabs, events): def thread_ima_dt_unit(tabs, events): s = "" - tabs += 1 - s += '\t' * tabs + '%s {\n' % ("thread_ima") + groupname = "thread-ima" + s += '\t' * tabs + '%s {\n' % (groupname) tabs +=1 - s += '\t' * tabs + "compatble = \"%s\";\n" % "ibm,nest-counters-thread-ima" + s += '\t' * tabs + "compatible = \"%s\";\n" % "ibm,ima-counters-thread" s += '\t' * tabs + "ranges;\n" s += '\t' * tabs + "#address-cells = <0x1>;\n" s += '\t' * tabs + "#size-cells = <0x1>;\n\n" + event_count = 0 for i in events: - s += dt_event(tabs, i[0], i[1], 8, '', '', i[2]) + nodename = groupname + "-" + str(event_count) + s += dt_event(tabs, i[0], i[1], 8, '', '', i[2], nodename) + event_count = event_count + 1 s += "\n" s += '\t' * (tabs - 1) + "};\n" return s -def gen_dts(ifname, verbose, ofname): +def gen_dtb(ofname, odtbfname): + dtb_command = "dtc -I dts -O dtb -o " + odtbfname + " ./" + ofname + + if odtbfname == '': + print 'Output DTB filename missing. Specify -d <DTB filename> and retry. Exiting.' + exit(-1) + + try: + os.system(dtb_command) + except: + print 'Error in dtb command: {}'.format(dtb_command) + + print 'Generated DTB file: {}'.format(odtbfname) + + +def gen_dts(ifname, verbose, ofname, unitname, pvrname, threadima, coreima): try: fn = open(ifname, "rb") except: @@ -263,6 +312,9 @@ def gen_dts(ifname, verbose, ofname): print 'Output filename missing. Specify -o <output file name> and retry.. Exiting.' exit(-1) + if pvrname == '': # pvr name was not specified. + pvrname = "4D0200" + # the page0 catalog is 128 bytes long page0 = Page0(fn.read(128)) Events(fn, page0.get_events_start(), page0.get_events_count()) @@ -276,9 +328,14 @@ def gen_dts(ifname, verbose, ofname): \tname = ""; \tcompatible = \"ibm,opal-in-memory-counters\"; \t#address-cells = <0x1>; -\t#size-cells = <0x1>;\n +\t#size-cells = <0x1>; +\tima-nest-offset = <0x320000>; +\tima-nest-size = <0x30000>; +\tversion-id = \"\";\n """ + pvr_list = pvrname.split(',') + for pvr in pvr_list: pvr_str = '\tpvr@' + pvr + ' {' pvr_node =\ @@ -289,40 +346,85 @@ def gen_dts(ifname, verbose, ofname): \t\tima-nest-size = <0x30000>; \t\tversion-id = \"\"; """ - s += pvr_str - s += pvr_node - s += '\t\ttarget-pvr = <0x' + pvr + '>;\n\n' - tabs = 1 - for i in range(len(nest_units)): - if i < len(nest_unit_names): - if (len(group_chip[i])): - s += dt_unit(tabs,i,group_chip[i], "ibm,nest-counters-chip-ima") - s += core_ima_dt_unit(1, event_domain_2) - s += thread_ima_dt_unit(1, event_domain_2_a) - s += "\t};\n" - s += "};\n" - - # print s + tabs = 0 + + if pvr not in '4E0100': # P9 DD1 parts. No Nest units for now. + for i in range(len(nest_units)): + if unitname != 'all' and unitname != '': # specific unit indicated. Print that unit only + if nest_unit_names[i] == unitname: + if i < len(nest_unit_names): + if (len(group_chip[i])): + s += dt_unit(tabs,i,group_chip[i], "ibm,ima-counters-nest") + break + elif unitname == 'all': # Include all NEST units + if i < len(nest_unit_names): + if (len(group_chip[i])): + s += dt_unit(tabs,i,group_chip[i], "ibm,ima-counters-nest") + else: # no unit name was explicitly specified. Assume 'mcs' if pvrname is 4D0200 + if pvrname == '4D0200': + if nest_unit_names[i] == 'mcs': + if i < len(nest_unit_names): + if (len(group_chip[i])): + s += dt_unit(tabs,i,group_chip[i], "ibm,ima-counters-nest") + break + else: # pvrname is not 4D0200. Print all NEST units + if i < len(nest_unit_names): + if (len(group_chip[i])): + s += dt_unit(tabs,i,group_chip[i], "ibm,ima-counters-nest") + else: # for P9 DD1 (4E0100) print core and thread ima by default + coreima = "yes" + threadima = "yes" + + if coreima == "yes": + s += core_ima_dt_unit(1, event_domain_2) + + if threadima == "yes": + s += thread_ima_dt_unit(1, event_domain_2_a) + + s += "};\n" of.write(s) of.close + print 'Generated DTS file: {}'.format(ofname) if __name__ == "__main__": ifname = "" # input file name ofname = "" # output file name verbose = False - - options, remainder = getopt.getopt(sys.argv[1:], 'i:vo:', ['input=', - 'verbose', - 'output', - ]) + coreima = "no" # Do not print core ima by default (if no unit was explicitly specified) + threadima = "no" # Do not print thread ima by default (if no unit was explicitly specified) + pvrname = "" + unitname = "" + odtbfname = "" # output dtb file name + + options, remainder = getopt.getopt(sys.argv[1:], 'c:d:i:p:t:u:vo:', + ['coreima=', + 'outputdtb=', + 'input=', + 'pvr=', + 'threadima=', + 'unit=', + 'verbose', + 'output=' + ]) for opt, arg in options: - if opt in ('-i', '--input'): - ifname = arg - elif opt in ('-v', '--verbose'): - verbose = True - elif opt in ('-o', '--output'): - ofname = arg - - gen_dts(ifname, verbose, ofname) + if opt in ('-c', '--core'): + coreima = arg + elif opt in ('-i', '--input'): + ifname = arg + elif opt in ('-p', '--pvr'): + pvrname = arg + elif opt in ('-t', '--thread'): + threadima = arg + elif opt in ('-u', '--unit'): + unitname = arg + elif opt in ('-v', '--verbose'): + verbose = True + elif opt in ('-o', '--output'): + ofname = arg + elif opt in ('-d', '--outputdtb'): + odtbfname = arg + + gen_dts(ifname, verbose, ofname, unitname, pvrname, coreima, threadima) + gen_dtb(ofname, odtbfname) |

