zynqmp_pm_cfg_obj_convert.py 10 KB

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