]>
Commit | Line | Data |
---|---|---|
4f4b5620 LC |
1 | #!/usr/bin/env python3 |
2 | # SPDX-License-Identifier: GPL-2.0+ | |
3 | # Copyright (C) 2019 Luca Ceresoli <[email protected]> | |
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 | |
292 | code = re.search('const u32 XPm_ConfigObject.*= {\n(.*)};', | |
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()) |