dfu-boot: Fix UART boot mode selection for am64xx-evm
[glsdk/host-tools.git] / respart / RM-autogen.py
1 #!/usr/bin/python
2 #
3 # Author: Nikhil Devshatwar <nikhil.nd@ti.com>
4 # Python script to auto generate the Resource Management data
5 # Parses excel sheet and generates different files which need
6 # to be in sync for correct functionality
7 #
8 import argparse
9 import xlrd
10 import xlwt
11 import re
13 COL_COMMENT = 0
14 COL_RES_TYPE = 1
15 COL_SUB_TYPE = 2
16 COL_RES_COUNT = 3
17 COL_RES_START = 4
18 COL_HOST_START = 5
20 ROW_HOST_ID = 0
21 ROW_RES_START = 1
23 comments = {}
24 resasg = {}
25 host_list = []
27 def gen_rmcfg_data(sharing):
28         global comments
29         rmcfg = []
30         for res in range(ROW_RES_START, sheet.nrows):
32                 comment = sheet.cell_value(res, COL_COMMENT)
33                 restype = sheet.cell_value(res, COL_RES_TYPE)
34                 subtype = sheet.cell_value(res, COL_SUB_TYPE)
35                 count = sheet.cell_value(res, COL_RES_COUNT)
36                 start = sheet.cell_value(res, COL_RES_START)
37                 if (restype == '' or subtype == '' or start == '' or count == ''):
38                         continue
39                 start = int(start)
40                 count = int(count)
41                 comments[(restype, subtype)] = comment
43                 if (args.allow_all):
44                         rmcfg.append((start, count, restype, subtype, "HOST_ID_ALL"))
45                         continue
47                 for host in range(COL_HOST_START, sheet.ncols):
49                         #print ("##v(%d, %d) = '%s'" % (res, host, sheet.cell_value(res, host)))
50                         host_id = sheet.cell_value(ROW_HOST_ID, host).split('\n')[0]
51                         if (re.match("HOST_ID_.*", host_id) == None):
52                                 continue
54                         num = sheet.cell_value(res, host)
55                         if (num == '' or int(num) == 0):
56                                 continue
57                         num = int(num)
59                         if (host_id not in host_list):
60                                 host_list.append(host_id)
62                         key = (restype, subtype, host_id)
63                         value = (start, num)
64                         if (key in resasg):
65                                 print ("WARNING: Ignoring multiple entries for (%s,%s,%s)" % key)
66                                 #resasg[key].append(value)
67                         else:
68                                 resasg[key] = [value]
69                                 rmcfg.append((start, num, restype, subtype, host_id))
71                         for pair in sharing:
72                                 if (host_id != pair[0]):
73                                         continue
75                                 shared_host = pair[1]
76                                 rmcfg.append((start, num, restype, subtype, shared_host))
78                         start += int(num)
80         return rmcfg
82 def print_rmcfg(rmcfg, prefix=""):
83         comment_templ = '''
84                 /* %s */\n'''
85         kig_rmconfig_templ = '''\
86                 {
87                         .start_resource = %d,
88                         .num_resource = %d,
89                         .type = RESASG_UTYPE (%s,
90                                         %s),
91                         .host_id = %s,
92                 },\n'''
93         sciclient_rmconfig_templ = '''\
94         {
95             .start_resource = %d,
96             .num_resource = %d,
97             .type = RESASG_UTYPE (%s, %s),
98             .host_id = %s,
99         },\n'''
101         if (args.format == "boardcfg_kig"):
102                 rmconfig_templ = kig_rmconfig_templ
103         elif (args.format == "boardcfg_sciclient"):
104                 rmconfig_templ = sciclient_rmconfig_templ
105                 comment_templ = comment_templ.replace('\t', '    ')
107         output = ""
108         rmconfig_templ = rmconfig_templ.replace("RESASG_UTYPE", "%sRESASG_UTYPE" % prefix)
110         def custom_key(entry):
111                 (start, num, restype, subtype, host) = entry
112                 restype = soc.const_values[restype]
113                 subtype = soc.const_values[subtype]
114                 host = soc.const_values[host]
115                 utype = (restype << soc.RESASG_TYPE_SHIFT) | (subtype << soc.RESASG_SUBTYPE_SHIFT)
116                 val = (utype << 24) | (start << 8) | (host << 0)
117                 return val
119         sorted_rmcfg = sorted(rmcfg, key=custom_key)
121         comment = None
122         for entry in sorted_rmcfg:
123                 (start, num, restype, subtype, host) = entry
125                 if (comment != comments[(restype, subtype)]):
126                         comment = comments[(restype, subtype)]
127                         output += comment_templ % comment
129                 # Quirk to add prefix for every dev/subtype macro (SCIclient uses TISCI prefix)
130                 if (prefix):
131                         dev_prefix = "%s_DEV" % args.soc.upper()
132                         if (args.soc == "am6x" or args.soc == "am65x_sr2"):
133                                 dev_prefix = "AM6_DEV"
135                         subtype = subtype.replace("RESASG", "%sRESASG" % prefix)
136                         restype = restype.replace(dev_prefix, "%sDEV" % prefix)
137                         host = "%s%s" % (prefix, host)
139                 output += rmconfig_templ % (start, num, restype, subtype, host)
140         return output
142 def print_per_host_id(rmcfg, prefix=""):
143         print host_list
144         for h_id in  host_list:
145                 print (">>>>>> For host %s" % h_id)
146                 for entry in rmcfg:
147                         (start, num, restype, subtype, host) = entry
148                         if (host == h_id):
149                                 print ("%s: %s start = %d, count = %d " % (restype, subtype, start, num))
151 ################################################################################
152 ##                          Main program starts here                          ##
153 ################################################################################
155 parser = argparse.ArgumentParser(prog='RM-autogen.py', formatter_class=argparse.RawTextHelpFormatter,
156         description='RM-autogen.py - Auto generate the Resource Management data')
157 required    = parser.add_argument_group('required arguments')
158 optional    = parser.add_argument_group('optional arguments')
159 conditional = parser.add_argument_group('conditional arguments')
161 required.add_argument('-s', '--soc', required=True, dest='soc',
162         action='store', choices=['j721e', 'am6x', 'am65x_sr2'],
163         help='SoC name')
164 required.add_argument('-o', '--output', required=True, dest='output',
165         action='store',
166         help='output file name')
167 required.add_argument('-f', '--format', required=True, dest='format',
168         action='store', choices=['boardcfg_kig', 'boardcfg_sciclient'],
169         help='format to select the output file')
170 required.add_argument('workbook',
171         help='Input excel sheet with assigned resources')
173 optional.add_argument('--share', dest='share', default=[],
174         action='append', nargs=2, metavar=('HOST_ID_A', 'HOST_ID_B'),
175         help='Share resource with HOST_ID_A for HOST_ID_B')
176 optional.add_argument('--perhost', dest='perhost',
177         action='store_true',
178         help='Print the resource assignment per host')
179 optional.add_argument('--allow_all', dest='allow_all',
180         action='store_true',
181         help='Create the minimal boardconfig to allow all hosts to access all resources')
184 args = parser.parse_args()
185 print(args)
187 soc = __import__(args.soc)
188 workbook = xlrd.open_workbook(args.workbook)
189 sheet = workbook.sheet_by_name(args.soc)
191 #sheet.nrows = 9
192 if (args.format == 'boardcfg_kig'):
193         boardconfig = gen_rmcfg_data(args.share)
194         print ("Total entries = %d" % len(boardconfig))
195         data = print_rmcfg(boardconfig)
196 elif (args.format == 'boardcfg_sciclient'):
197         boardconfig = gen_rmcfg_data(args.share)
198         print ("Total entries = %d" % len(boardconfig))
199         data = print_rmcfg(boardconfig, prefix="TISCI_")
200 else:
201         print ("ERROR: format %s not supported" % args.format)
202         exit(1)
204 if (args.perhost):
205         print_per_host_id(boardconfig, prefix="TISCI_")
207 ofile = open(args.output, "w")
208 ofile.write(data)
209 ofile.close()
211 # END OF FILE