RM-autogen-data.py: Use sysfw documentation to generate the data
[glsdk/host-tools.git] / respart / RM-autogen.py
index 54705616dac20666ad81600d141b563d2be88732..d8d55e5c01070787502e687f0f7c1ec417d39747 100755 (executable)
@@ -13,35 +13,34 @@ import re
 COL_COMMENT = 0
 COL_RES_TYPE = 1
 COL_SUB_TYPE = 2
-COL_RES_FIELD = 3
-COL_RES_START = 6
-COL_HOST_START = 7
+COL_RES_COUNT = 3
+COL_RES_START = 4
+COL_HOST_START = 5
 
 ROW_HOST_ID = 0
-ROW_RES_START = 2
+ROW_RES_START = 1
 
-def gen_rmcfg_data(sharing):
-
-       rmcfg = ''
-       num_entries = 0
-       rmconfig_comment = '''
-               /* %s */\n'''
-       rmconfig_templ = '''\
-               {
-                       .start_resource = %d,
-                       .num_resource = %d,
-                       .type = RESASG_UTYPE (%s,
-                                       %s),
-                       .host_id = %s,
-               },\n'''
+comments = {}
+resasg = {}
 
+def gen_rmcfg_data(sharing):
+       global comments
+       rmcfg = []
        for res in range(ROW_RES_START, sheet.nrows):
 
                comment = sheet.cell_value(res, COL_COMMENT)
                restype = sheet.cell_value(res, COL_RES_TYPE)
                subtype = sheet.cell_value(res, COL_SUB_TYPE)
+               count = sheet.cell_value(res, COL_RES_COUNT)
                start = sheet.cell_value(res, COL_RES_START)
-               if (restype == '' or subtype == '' or start == ''):
+               if (restype == '' or subtype == '' or start == '' or count == ''):
+                       continue
+               start = int(start)
+               count = int(count)
+               comments[(restype, subtype)] = comment
+
+               if (args.allow_all):
+                       rmcfg.append((start, count, restype, subtype, "HOST_ID_ALL"))
                        continue
 
                for host in range(COL_HOST_START, sheet.ncols):
@@ -54,25 +53,61 @@ def gen_rmcfg_data(sharing):
                        num = sheet.cell_value(res, host)
                        if (num == '' or int(num) == 0):
                                continue
+                       num = int(num)
 
-                       if (comment != None):
-                               rmcfg += rmconfig_comment % comment
-                               comment = None
-
-                       rmcfg += (rmconfig_templ % (start, num, restype, subtype, host_id))
-                       num_entries += 1
+                       key = (restype, subtype, host_id)
+                       value = (start, num)
+                       if (key not in resasg):
+                               resasg[key] = [value]
+                       else:
+                               print ("WARNING: Ignoring multiple entries for (%s,%s,%s)" % key)
+                               #resasg[key].append(value)
+                       rmcfg.append((start, num, restype, subtype, host_id))
 
                        for pair in sharing:
                                if (host_id != pair[0]):
                                        continue
 
                                shared_host = pair[1]
-                               rmcfg += (rmconfig_templ % (start, num, restype, subtype, shared_host))
-                               num_entries += 1
+                               rmcfg.append((start, num, restype, subtype, shared_host))
 
                        start += int(num)
-       return (rmcfg, num_entries)
 
+       return rmcfg
+
+def print_rmcfg(rmcfg):
+       comment_templ = '''
+               /* %s */\n'''
+       rmconfig_templ = '''\
+               {
+                       .start_resource = %d,
+                       .num_resource = %d,
+                       .type = RESASG_UTYPE (%s,
+                                       %s),
+                       .host_id = %s,
+               },\n'''
+       output = ""
+
+       def custom_key(entry):
+               (start, num, restype, subtype, host) = entry
+               restype = soc.const_values[restype]
+               subtype = soc.const_values[subtype]
+               host = soc.const_values[host]
+               utype = (restype << soc.RESASG_TYPE_SHIFT) | (subtype << soc.RESASG_SUBTYPE_SHIFT)
+               val = (utype << 24) | (start << 8) | (host << 0)
+               return val
+
+       sorted_rmcfg = sorted(rmcfg, key=custom_key)
+
+       comment = None
+       for entry in sorted_rmcfg:
+               (start, num, restype, subtype, host) = entry
+
+               if (comment != comments[(restype, subtype)]):
+                       comment = comments[(restype, subtype)]
+                       output += comment_templ % comment
+               output += rmconfig_templ % (start, num, restype, subtype, host)
+       return output
 
 ################################################################################
 ##                          Main program starts here                          ##
@@ -81,45 +116,47 @@ def gen_rmcfg_data(sharing):
 parser = argparse.ArgumentParser(prog='RM-autogen.py', formatter_class=argparse.RawTextHelpFormatter,
        description='RM-autogen.py - Auto generate the Resource Management data')
 
-parser.add_argument('-f', '--format', required=True, dest='format',
-       action='store', choices=["boardconfig", "rtos_rmcfg", "jailhouse_cell_config"],
-       help='format to select the output file')
+parser.add_argument('-s', '--soc', required=True, dest='soc',
+       action='store', choices=['j721e', 'am65x'],
+       help='SoC name')
 
-parser.add_argument('-o', '--output', dest='output',
+parser.add_argument('-o', '--output', required=True, dest='output',
        action='store',
        help='output file name')
 
-parser.add_argument('-s', '--share', dest='share', default=[],
+parser.add_argument('-f', '--format', required=True, dest='format',
+       action='store', choices=['boardconfig', 'jailhouse_cell_config'],
+       help='format to select the output file')
+
+parser.add_argument('--share', dest='share', default=[],
        action='append', nargs=2, metavar=('HOST_ID_A', 'HOST_ID_B'),
        help='Share resource with HOST_ID_A for HOST_ID_B')
 
+parser.add_argument('--allow_all', dest='allow_all',
+       action='store_true',
+       help='Create the minimal boardconfig to allow all hosts to access all resources')
+
 parser.add_argument('workbook', help='Input excel sheet with assigned resources')
 
 args = parser.parse_args()
 print(args)
 
+soc = __import__(args.soc)
 workbook = xlrd.open_workbook(args.workbook)
-sheet = workbook.sheet_by_index(0)
+sheet = workbook.sheet_by_name(args.soc)
 
 #sheet.nrows = 9
 if (args.format == 'boardconfig'):
-       (rmcfg, num_entries) = gen_rmcfg_data(args.share)
-       print ("Total entries = %d" % num_entries)
-       msg = "Generated rm-cfg.c"
-       data = rmcfg
-elif (args.format == 'rtos_rmcfg'):
-       (rtos_rmcfg, num_entries) = gen_rtos_rmcfg_data()
-       msg = "Generated udma_rm-cfg.c"
-       data = rtos_rmcfg
+       boardconfig = gen_rmcfg_data(args.share)
+       print ("Total entries = %d" % len(boardconfig))
+       data = print_rmcfg(boardconfig)
 else:
        print ("ERROR: format %s not supported")
+       exit(1)
 
 
-if (args.output):
-       ofile = open(args.output, "w")
-       ofile.write(data)
-       ofile.close()
-else:
-       print ("%s\n%s" % (msg, data))
+ofile = open(args.output, "w")
+ofile.write(data)
+ofile.close()
 
 # END OF FILE