Luca Ceresoli | 168a526 | 2019-05-21 18:06:44 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # SPDX-License-Identifier: GPL-2.0+ |
| 3 | # Copyright (C) 2019 Luca Ceresoli <luca@lucaceresoli.net> |
| 4 | |
| 5 | import sys |
| 6 | import re |
| 7 | import struct |
| 8 | import logging |
| 9 | import argparse |
| 10 | |
| 11 | parser = argparse.ArgumentParser( |
| 12 | description='Convert a PMU configuration object from C source to a binary blob.') |
| 13 | parser.add_argument('-D', '--debug', action="store_true") |
| 14 | parser.add_argument( |
| 15 | "in_file", metavar='INPUT_FILE', |
| 16 | help='PMU configuration object (C source as produced by Xilinx XSDK)') |
| 17 | parser.add_argument( |
| 18 | "out_file", metavar='OUTPUT_FILE', |
| 19 | help='PMU configuration object binary blob') |
| 20 | args = parser.parse_args() |
| 21 | |
| 22 | logging.basicConfig(format='%(levelname)s:%(message)s', |
| 23 | level=(logging.DEBUG if args.debug else logging.WARNING)) |
| 24 | |
| 25 | pm_define = { |
| 26 | 'PM_CAP_ACCESS' : 0x1, |
| 27 | 'PM_CAP_CONTEXT' : 0x2, |
| 28 | 'PM_CAP_WAKEUP' : 0x4, |
| 29 | |
| 30 | 'NODE_UNKNOWN' : 0, |
| 31 | 'NODE_APU' : 1, |
| 32 | 'NODE_APU_0' : 2, |
| 33 | 'NODE_APU_1' : 3, |
| 34 | 'NODE_APU_2' : 4, |
| 35 | 'NODE_APU_3' : 5, |
| 36 | 'NODE_RPU' : 6, |
| 37 | 'NODE_RPU_0' : 7, |
| 38 | 'NODE_RPU_1' : 8, |
| 39 | 'NODE_PLD' : 9, |
| 40 | 'NODE_FPD' : 10, |
| 41 | 'NODE_OCM_BANK_0' : 11, |
| 42 | 'NODE_OCM_BANK_1' : 12, |
| 43 | 'NODE_OCM_BANK_2' : 13, |
| 44 | 'NODE_OCM_BANK_3' : 14, |
| 45 | 'NODE_TCM_0_A' : 15, |
| 46 | 'NODE_TCM_0_B' : 16, |
| 47 | 'NODE_TCM_1_A' : 17, |
| 48 | 'NODE_TCM_1_B' : 18, |
| 49 | 'NODE_L2' : 19, |
| 50 | 'NODE_GPU_PP_0' : 20, |
| 51 | 'NODE_GPU_PP_1' : 21, |
| 52 | 'NODE_USB_0' : 22, |
| 53 | 'NODE_USB_1' : 23, |
| 54 | 'NODE_TTC_0' : 24, |
| 55 | 'NODE_TTC_1' : 25, |
| 56 | 'NODE_TTC_2' : 26, |
| 57 | 'NODE_TTC_3' : 27, |
| 58 | 'NODE_SATA' : 28, |
| 59 | 'NODE_ETH_0' : 29, |
| 60 | 'NODE_ETH_1' : 30, |
| 61 | 'NODE_ETH_2' : 31, |
| 62 | 'NODE_ETH_3' : 32, |
| 63 | 'NODE_UART_0' : 33, |
| 64 | 'NODE_UART_1' : 34, |
| 65 | 'NODE_SPI_0' : 35, |
| 66 | 'NODE_SPI_1' : 36, |
| 67 | 'NODE_I2C_0' : 37, |
| 68 | 'NODE_I2C_1' : 38, |
| 69 | 'NODE_SD_0' : 39, |
| 70 | 'NODE_SD_1' : 40, |
| 71 | 'NODE_DP' : 41, |
| 72 | 'NODE_GDMA' : 42, |
| 73 | 'NODE_ADMA' : 43, |
| 74 | 'NODE_NAND' : 44, |
| 75 | 'NODE_QSPI' : 45, |
| 76 | 'NODE_GPIO' : 46, |
| 77 | 'NODE_CAN_0' : 47, |
| 78 | 'NODE_CAN_1' : 48, |
| 79 | 'NODE_EXTERN' : 49, |
| 80 | 'NODE_APLL' : 50, |
| 81 | 'NODE_VPLL' : 51, |
| 82 | 'NODE_DPLL' : 52, |
| 83 | 'NODE_RPLL' : 53, |
| 84 | 'NODE_IOPLL' : 54, |
| 85 | 'NODE_DDR' : 55, |
| 86 | 'NODE_IPI_APU' : 56, |
| 87 | 'NODE_IPI_RPU_0' : 57, |
| 88 | 'NODE_GPU' : 58, |
| 89 | 'NODE_PCIE' : 59, |
| 90 | 'NODE_PCAP' : 60, |
| 91 | 'NODE_RTC' : 61, |
| 92 | 'NODE_LPD' : 62, |
| 93 | 'NODE_VCU' : 63, |
| 94 | 'NODE_IPI_RPU_1' : 64, |
| 95 | 'NODE_IPI_PL_0' : 65, |
| 96 | 'NODE_IPI_PL_1' : 66, |
| 97 | 'NODE_IPI_PL_2' : 67, |
| 98 | 'NODE_IPI_PL_3' : 68, |
| 99 | 'NODE_PL' : 69, |
| 100 | 'NODE_ID_MA' : 70, |
| 101 | |
| 102 | 'XILPM_RESET_PCIE_CFG' : 1000, |
| 103 | 'XILPM_RESET_PCIE_BRIDGE' : 1001, |
| 104 | 'XILPM_RESET_PCIE_CTRL' : 1002, |
| 105 | 'XILPM_RESET_DP' : 1003, |
| 106 | 'XILPM_RESET_SWDT_CRF' : 1004, |
| 107 | 'XILPM_RESET_AFI_FM5' : 1005, |
| 108 | 'XILPM_RESET_AFI_FM4' : 1006, |
| 109 | 'XILPM_RESET_AFI_FM3' : 1007, |
| 110 | 'XILPM_RESET_AFI_FM2' : 1008, |
| 111 | 'XILPM_RESET_AFI_FM1' : 1009, |
| 112 | 'XILPM_RESET_AFI_FM0' : 1010, |
| 113 | 'XILPM_RESET_GDMA' : 1011, |
| 114 | 'XILPM_RESET_GPU_PP1' : 1012, |
| 115 | 'XILPM_RESET_GPU_PP0' : 1013, |
| 116 | 'XILPM_RESET_GPU' : 1014, |
| 117 | 'XILPM_RESET_GT' : 1015, |
| 118 | 'XILPM_RESET_SATA' : 1016, |
| 119 | 'XILPM_RESET_ACPU3_PWRON' : 1017, |
| 120 | 'XILPM_RESET_ACPU2_PWRON' : 1018, |
| 121 | 'XILPM_RESET_ACPU1_PWRON' : 1019, |
| 122 | 'XILPM_RESET_ACPU0_PWRON' : 1020, |
| 123 | 'XILPM_RESET_APU_L2' : 1021, |
| 124 | 'XILPM_RESET_ACPU3' : 1022, |
| 125 | 'XILPM_RESET_ACPU2' : 1023, |
| 126 | 'XILPM_RESET_ACPU1' : 1024, |
| 127 | 'XILPM_RESET_ACPU0' : 1025, |
| 128 | 'XILPM_RESET_DDR' : 1026, |
| 129 | 'XILPM_RESET_APM_FPD' : 1027, |
| 130 | 'XILPM_RESET_SOFT' : 1028, |
| 131 | 'XILPM_RESET_GEM0' : 1029, |
| 132 | 'XILPM_RESET_GEM1' : 1030, |
| 133 | 'XILPM_RESET_GEM2' : 1031, |
| 134 | 'XILPM_RESET_GEM3' : 1032, |
| 135 | 'XILPM_RESET_QSPI' : 1033, |
| 136 | 'XILPM_RESET_UART0' : 1034, |
| 137 | 'XILPM_RESET_UART1' : 1035, |
| 138 | 'XILPM_RESET_SPI0' : 1036, |
| 139 | 'XILPM_RESET_SPI1' : 1037, |
| 140 | 'XILPM_RESET_SDIO0' : 1038, |
| 141 | 'XILPM_RESET_SDIO1' : 1039, |
| 142 | 'XILPM_RESET_CAN0' : 1040, |
| 143 | 'XILPM_RESET_CAN1' : 1041, |
| 144 | 'XILPM_RESET_I2C0' : 1042, |
| 145 | 'XILPM_RESET_I2C1' : 1043, |
| 146 | 'XILPM_RESET_TTC0' : 1044, |
| 147 | 'XILPM_RESET_TTC1' : 1045, |
| 148 | 'XILPM_RESET_TTC2' : 1046, |
| 149 | 'XILPM_RESET_TTC3' : 1047, |
| 150 | 'XILPM_RESET_SWDT_CRL' : 1048, |
| 151 | 'XILPM_RESET_NAND' : 1049, |
| 152 | 'XILPM_RESET_ADMA' : 1050, |
| 153 | 'XILPM_RESET_GPIO' : 1051, |
| 154 | 'XILPM_RESET_IOU_CC' : 1052, |
| 155 | 'XILPM_RESET_TIMESTAMP' : 1053, |
| 156 | 'XILPM_RESET_RPU_R50' : 1054, |
| 157 | 'XILPM_RESET_RPU_R51' : 1055, |
| 158 | 'XILPM_RESET_RPU_AMBA' : 1056, |
| 159 | 'XILPM_RESET_OCM' : 1057, |
| 160 | 'XILPM_RESET_RPU_PGE' : 1058, |
| 161 | 'XILPM_RESET_USB0_CORERESET' : 1059, |
| 162 | 'XILPM_RESET_USB1_CORERESET' : 1060, |
| 163 | 'XILPM_RESET_USB0_HIBERRESET' : 1061, |
| 164 | 'XILPM_RESET_USB1_HIBERRESET' : 1062, |
| 165 | 'XILPM_RESET_USB0_APB' : 1063, |
| 166 | 'XILPM_RESET_USB1_APB' : 1064, |
| 167 | 'XILPM_RESET_IPI' : 1065, |
| 168 | 'XILPM_RESET_APM_LPD' : 1066, |
| 169 | 'XILPM_RESET_RTC' : 1067, |
| 170 | 'XILPM_RESET_SYSMON' : 1068, |
| 171 | 'XILPM_RESET_AFI_FM6' : 1069, |
| 172 | 'XILPM_RESET_LPD_SWDT' : 1070, |
| 173 | 'XILPM_RESET_FPD' : 1071, |
| 174 | 'XILPM_RESET_RPU_DBG1' : 1072, |
| 175 | 'XILPM_RESET_RPU_DBG0' : 1073, |
| 176 | 'XILPM_RESET_DBG_LPD' : 1074, |
| 177 | 'XILPM_RESET_DBG_FPD' : 1075, |
| 178 | 'XILPM_RESET_APLL' : 1076, |
| 179 | 'XILPM_RESET_DPLL' : 1077, |
| 180 | 'XILPM_RESET_VPLL' : 1078, |
| 181 | 'XILPM_RESET_IOPLL' : 1079, |
| 182 | 'XILPM_RESET_RPLL' : 1080, |
| 183 | 'XILPM_RESET_GPO3_PL_0' : 1081, |
| 184 | 'XILPM_RESET_GPO3_PL_1' : 1082, |
| 185 | 'XILPM_RESET_GPO3_PL_2' : 1083, |
| 186 | 'XILPM_RESET_GPO3_PL_3' : 1084, |
| 187 | 'XILPM_RESET_GPO3_PL_4' : 1085, |
| 188 | 'XILPM_RESET_GPO3_PL_5' : 1086, |
| 189 | 'XILPM_RESET_GPO3_PL_6' : 1087, |
| 190 | 'XILPM_RESET_GPO3_PL_7' : 1088, |
| 191 | 'XILPM_RESET_GPO3_PL_8' : 1089, |
| 192 | 'XILPM_RESET_GPO3_PL_9' : 1090, |
| 193 | 'XILPM_RESET_GPO3_PL_10' : 1091, |
| 194 | 'XILPM_RESET_GPO3_PL_11' : 1092, |
| 195 | 'XILPM_RESET_GPO3_PL_12' : 1093, |
| 196 | 'XILPM_RESET_GPO3_PL_13' : 1094, |
| 197 | 'XILPM_RESET_GPO3_PL_14' : 1095, |
| 198 | 'XILPM_RESET_GPO3_PL_15' : 1096, |
| 199 | 'XILPM_RESET_GPO3_PL_16' : 1097, |
| 200 | 'XILPM_RESET_GPO3_PL_17' : 1098, |
| 201 | 'XILPM_RESET_GPO3_PL_18' : 1099, |
| 202 | 'XILPM_RESET_GPO3_PL_19' : 1100, |
| 203 | 'XILPM_RESET_GPO3_PL_20' : 1101, |
| 204 | 'XILPM_RESET_GPO3_PL_21' : 1102, |
| 205 | 'XILPM_RESET_GPO3_PL_22' : 1103, |
| 206 | 'XILPM_RESET_GPO3_PL_23' : 1104, |
| 207 | 'XILPM_RESET_GPO3_PL_24' : 1105, |
| 208 | 'XILPM_RESET_GPO3_PL_25' : 1106, |
| 209 | 'XILPM_RESET_GPO3_PL_26' : 1107, |
| 210 | 'XILPM_RESET_GPO3_PL_27' : 1108, |
| 211 | 'XILPM_RESET_GPO3_PL_28' : 1109, |
| 212 | 'XILPM_RESET_GPO3_PL_29' : 1110, |
| 213 | 'XILPM_RESET_GPO3_PL_30' : 1111, |
| 214 | 'XILPM_RESET_GPO3_PL_31' : 1112, |
| 215 | 'XILPM_RESET_RPU_LS' : 1113, |
| 216 | 'XILPM_RESET_PS_ONLY' : 1114, |
| 217 | 'XILPM_RESET_PL' : 1115, |
| 218 | 'XILPM_RESET_GPIO5_EMIO_92' : 1116, |
| 219 | 'XILPM_RESET_GPIO5_EMIO_93' : 1117, |
| 220 | 'XILPM_RESET_GPIO5_EMIO_94' : 1118, |
| 221 | 'XILPM_RESET_GPIO5_EMIO_95' : 1119, |
| 222 | |
| 223 | 'PM_CONFIG_MASTER_SECTION_ID' : 0x101, |
| 224 | 'PM_CONFIG_SLAVE_SECTION_ID' : 0x102, |
| 225 | 'PM_CONFIG_PREALLOC_SECTION_ID' : 0x103, |
| 226 | 'PM_CONFIG_POWER_SECTION_ID' : 0x104, |
| 227 | 'PM_CONFIG_RESET_SECTION_ID' : 0x105, |
| 228 | 'PM_CONFIG_SHUTDOWN_SECTION_ID' : 0x106, |
| 229 | 'PM_CONFIG_SET_CONFIG_SECTION_ID' : 0x107, |
| 230 | 'PM_CONFIG_GPO_SECTION_ID' : 0x108, |
| 231 | |
| 232 | 'PM_SLAVE_FLAG_IS_SHAREABLE' : 0x1, |
| 233 | 'PM_MASTER_USING_SLAVE_MASK' : 0x2, |
| 234 | |
| 235 | 'PM_CONFIG_GPO1_MIO_PIN_34_MAP' : (1 << 10), |
| 236 | 'PM_CONFIG_GPO1_MIO_PIN_35_MAP' : (1 << 11), |
| 237 | 'PM_CONFIG_GPO1_MIO_PIN_36_MAP' : (1 << 12), |
| 238 | 'PM_CONFIG_GPO1_MIO_PIN_37_MAP' : (1 << 13), |
| 239 | |
| 240 | 'PM_CONFIG_GPO1_BIT_2_MASK' : (1 << 2), |
| 241 | 'PM_CONFIG_GPO1_BIT_3_MASK' : (1 << 3), |
| 242 | 'PM_CONFIG_GPO1_BIT_4_MASK' : (1 << 4), |
| 243 | 'PM_CONFIG_GPO1_BIT_5_MASK' : (1 << 5), |
| 244 | |
| 245 | 'SUSPEND_TIMEOUT' : 0xFFFFFFFF, |
| 246 | |
| 247 | 'PM_CONFIG_IPI_PSU_CORTEXA53_0_MASK' : 0x00000001, |
| 248 | 'PM_CONFIG_IPI_PSU_CORTEXR5_0_MASK' : 0x00000100, |
| 249 | 'PM_CONFIG_IPI_PSU_CORTEXR5_1_MASK' : 0x00000200, |
| 250 | } |
| 251 | |
| 252 | in_file = open(args.in_file, mode='r') |
| 253 | out_file = open(args.out_file, mode='wb') |
| 254 | |
| 255 | num_re = re.compile(r"^([0-9]+)U?$") |
| 256 | const_re = re.compile(r"^([A-Z_][A-Z0-9_]*)$") |
| 257 | |
| 258 | def process_item(item): |
| 259 | logging.debug("* ITEM " + item) |
| 260 | |
| 261 | value = 0 |
| 262 | for item in item.split('|'): |
| 263 | item = item.strip() |
| 264 | |
| 265 | num_match = num_re .match(item) |
| 266 | const_match = const_re.match(item) |
| 267 | |
| 268 | if num_match: |
| 269 | num = int(num_match.group(1)) |
| 270 | logging.debug(" - num " + str(num)) |
| 271 | value |= num |
| 272 | elif const_match: |
| 273 | name = const_match.group(1) |
| 274 | if not name in pm_define: |
| 275 | sys.stderr.write("Unknown define " + name + "!\n") |
| 276 | exit(1) |
| 277 | num = pm_define[name] |
| 278 | logging.debug(" - def " + hex(num)) |
| 279 | value |= num |
| 280 | |
| 281 | logging.debug(" = res " + hex(value)) |
| 282 | out_file.write(struct.pack('<L', value)) |
| 283 | |
| 284 | |
| 285 | # Read all code |
| 286 | code = in_file.read() |
| 287 | |
| 288 | # remove comments |
| 289 | code = re.sub('//.*?\n|/\*.*?\*/', '', code, flags=re.DOTALL) |
| 290 | |
| 291 | # remove everything outside the XPm_ConfigObject array definition |
Adrian Fiergolski | 70bd6cc | 2020-11-24 16:13:07 +0100 | [diff] [blame] | 292 | code = re.search('const u32 XPm_ConfigObject.*=.*{\n(.*)};', |
Luca Ceresoli | 168a526 | 2019-05-21 18:06:44 +0200 | [diff] [blame] | 293 | code, flags=re.DOTALL).group(1) |
| 294 | |
| 295 | # Process each comma-separated array item |
| 296 | for item in code.split(','): |
| 297 | item = item.strip() |
| 298 | if item: |
| 299 | process_item(item) |
| 300 | |
| 301 | print("Wrote %d bytes" % out_file.tell()) |