summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRajarshi Das <drajarshi@in.ibm.com>2016-12-09 11:13:08 +0530
committerSantosh Sivaraj <santosiv@in.ibm.com>2016-12-09 11:14:39 +0530
commit1b90228f617085ff96f8e04f95a83bd972ed0c98 (patch)
tree51db8313c7a28c77ebafcb2887ff23c84d72d0a5
parent33a362c8afa5e72df379e441563bde389bb017f4 (diff)
downloadima-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.py31
-rw-r--r--catalog/generate_dts.py194
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)
OpenPOWER on IntegriCloud