ConfigurationManagerObjectParser.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. /** @file
  2. Configuration Manager Object parser.
  3. Copyright (c) 2021 - 2022, ARM Limited. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <Library/BaseLib.h>
  7. #include <Library/DebugLib.h>
  8. #include <ConfigurationManagerObject.h>
  9. #include "ConfigurationManagerObjectParser.h"
  10. STATIC
  11. VOID
  12. EFIAPI
  13. PrintOemId (
  14. CONST CHAR8 *Format,
  15. UINT8 *Ptr
  16. );
  17. STATIC
  18. VOID
  19. EFIAPI
  20. PrintString (
  21. CONST CHAR8 *Format,
  22. UINT8 *Ptr
  23. );
  24. /** A parser for EArmObjBootArchInfo.
  25. */
  26. STATIC CONST CM_OBJ_PARSER CmArmBootArchInfoParser[] = {
  27. { "BootArchFlags", 2, "0x%x", NULL }
  28. };
  29. /** A parser for EArmObjPowerManagementProfileInfo.
  30. */
  31. STATIC CONST CM_OBJ_PARSER CmArmPowerManagementProfileInfoParser[] = {
  32. { "PowerManagementProfile", 1, "0x%x", NULL }
  33. };
  34. /** A parser for EArmObjGicCInfo.
  35. */
  36. STATIC CONST CM_OBJ_PARSER CmArmGicCInfoParser[] = {
  37. { "CPUInterfaceNumber", 4, "0x%x", NULL },
  38. { "AcpiProcessorUid", 4, "0x%x", NULL },
  39. { "Flags", 4, "0x%x", NULL },
  40. { "ParkingProtocolVersion", 4, "0x%x", NULL },
  41. { "PerformanceInterruptGsiv", 4, "0x%x", NULL },
  42. { "ParkedAddress", 8, "0x%llx", NULL },
  43. { "PhysicalBaseAddress", 8, "0x%llx", NULL },
  44. { "GICV", 8, "0x%llx", NULL },
  45. { "GICH", 8, "0x%llx", NULL },
  46. { "VGICMaintenanceInterrupt", 4, "0x%x", NULL },
  47. { "GICRBaseAddress", 8, "0x%llx", NULL },
  48. { "MPIDR", 8, "0x%llx", NULL },
  49. { "ProcessorPowerEfficiencyClass", 1, "0x%x", NULL },
  50. { "SpeOverflowInterrupt", 2, "0x%x", NULL },
  51. { "ProximityDomain", 4, "0x%x", NULL },
  52. { "ClockDomain", 4, "0x%x", NULL },
  53. { "AffinityFlags", 4, "0x%x", NULL },
  54. { "CpcToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
  55. };
  56. /** A parser for EArmObjGicDInfo.
  57. */
  58. STATIC CONST CM_OBJ_PARSER CmArmGicDInfoParser[] = {
  59. { "PhysicalBaseAddress", 8, "0x%llx", NULL },
  60. { "SystemVectorBase", 4, "0x%x", NULL },
  61. { "GicVersion", 1, "0x%x", NULL },
  62. };
  63. /** A parser for EArmObjGicMsiFrameInfo.
  64. */
  65. STATIC CONST CM_OBJ_PARSER CmArmGicMsiFrameInfoParser[] = {
  66. { "GicMsiFrameId", 4, "0x%x", NULL },
  67. { "PhysicalBaseAddress", 8, "0x%llx", NULL },
  68. { "Flags", 4, "0x%x", NULL },
  69. { "SPICount", 2, "0x%x", NULL },
  70. { "SPIBase", 2, "0x%x", NULL }
  71. };
  72. /** A parser for EArmObjGicRedistributorInfo.
  73. */
  74. STATIC CONST CM_OBJ_PARSER CmArmGicRedistInfoParser[] = {
  75. { "DiscoveryRangeBaseAddress", 8, "0x%llx", NULL },
  76. { "DiscoveryRangeLength", 4, "0x%x", NULL }
  77. };
  78. /** A parser for EArmObjGicItsInfo.
  79. */
  80. STATIC CONST CM_OBJ_PARSER CmArmGicItsInfoParser[] = {
  81. { "GicItsId", 4, "0x%x", NULL },
  82. { "PhysicalBaseAddress", 8, "0x%llx", NULL },
  83. { "ProximityDomain", 4, "0x%x", NULL }
  84. };
  85. /** A parser for EArmObjSerialConsolePortInfo,
  86. EArmObjSerialDebugPortInfo and EArmObjSerialPortInfo.
  87. */
  88. STATIC CONST CM_OBJ_PARSER CmArmSerialPortInfoParser[] = {
  89. { "BaseAddress", 8, "0x%llx", NULL },
  90. { "Interrupt", 4, "0x%x", NULL },
  91. { "BaudRate", 8, "0x%llx", NULL },
  92. { "Clock", 4, "0x%x", NULL },
  93. { "PortSubtype", 2, "0x%x", NULL },
  94. { "BaseAddressLength", 8, "0x%llx", NULL },
  95. { "AccessSize", 1, "0x%d", NULL }
  96. };
  97. /** A parser for EArmObjGenericTimerInfo.
  98. */
  99. STATIC CONST CM_OBJ_PARSER CmArmGenericTimerInfoParser[] = {
  100. { "CounterControlBaseAddress", 8, "0x%llx", NULL },
  101. { "CounterReadBaseAddress", 8, "0x%llx", NULL },
  102. { "SecurePL1TimerGSIV", 4, "0x%x", NULL },
  103. { "SecurePL1TimerFlags", 4, "0x%x", NULL },
  104. { "NonSecurePL1TimerGSIV", 4, "0x%x", NULL },
  105. { "NonSecurePL1TimerFlags", 4, "0x%x", NULL },
  106. { "VirtualTimerGSIV", 4, "0x%x", NULL },
  107. { "VirtualTimerFlags", 4, "0x%x", NULL },
  108. { "NonSecurePL2TimerGSIV", 4, "0x%x", NULL },
  109. { "NonSecurePL2TimerFlags", 4, "0x%x", NULL },
  110. { "VirtualPL2TimerGSIV", 4, "0x%x", NULL },
  111. { "VirtualPL2TimerFlags", 4, "0x%x", NULL }
  112. };
  113. /** A parser for EArmObjPlatformGTBlockInfo.
  114. */
  115. STATIC CONST CM_OBJ_PARSER CmArmGTBlockInfoParser[] = {
  116. { "GTBlockPhysicalAddress", 8, "0x%llx", NULL },
  117. { "GTBlockTimerFrameCount", 4, "0x%x", NULL },
  118. { "GTBlockTimerFrameToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
  119. };
  120. /** A parser for EArmObjGTBlockTimerFrameInfo.
  121. */
  122. STATIC CONST CM_OBJ_PARSER CmArmGTBlockTimerFrameInfoParser[] = {
  123. { "FrameNumber", 1, "0x%x", NULL },
  124. { "PhysicalAddressCntBase", 8, "0x%llx", NULL },
  125. { "PhysicalAddressCntEL0Base", 8, "0x%llx", NULL },
  126. { "PhysicalTimerGSIV", 4, "0x%x", NULL },
  127. { "PhysicalTimerFlags", 4, "0x%x", NULL },
  128. { "VirtualTimerGSIV", 4, "0x%x", NULL },
  129. { "VirtualTimerFlags", 4, "0x%x", NULL },
  130. { "CommonFlags", 4, "0x%x", NULL }
  131. };
  132. /** A parser for EArmObjPlatformGenericWatchdogInfo.
  133. */
  134. STATIC CONST CM_OBJ_PARSER CmArmGenericWatchdogInfoParser[] = {
  135. { "ControlFrameAddress", 8, "0x%llx", NULL },
  136. { "RefreshFrameAddress", 8, "0x%llx", NULL },
  137. { "TimerGSIV", 4, "0x%x", NULL },
  138. { "Flags", 4, "0x%x", NULL }
  139. };
  140. /** A parser for EArmObjPciConfigSpaceInfo.
  141. */
  142. STATIC CONST CM_OBJ_PARSER CmArmPciConfigSpaceInfoParser[] = {
  143. { "BaseAddress", 8, "0x%llx", NULL },
  144. { "PciSegmentGroupNumber", 2, "0x%x", NULL },
  145. { "StartBusNumber", 1, "0x%x", NULL },
  146. { "EndBusNumber", 1, "0x%x", NULL },
  147. { "AddressMapToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  148. { "InterruptMapToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  149. };
  150. /** A parser for EArmObjHypervisorVendorIdentity.
  151. */
  152. STATIC CONST CM_OBJ_PARSER CmArmHypervisorVendorIdParser[] = {
  153. { "HypervisorVendorId", 8, "0x%llx", NULL }
  154. };
  155. /** A parser for EArmObjFixedFeatureFlags.
  156. */
  157. STATIC CONST CM_OBJ_PARSER CmArmFixedFeatureFlagsParser[] = {
  158. { "Flags", 4, "0x%x", NULL }
  159. };
  160. /** A parser for EArmObjItsGroup.
  161. */
  162. STATIC CONST CM_OBJ_PARSER CmArmItsGroupNodeParser[] = {
  163. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  164. { "ItsIdCount", 4, "0x%x", NULL },
  165. { "ItsIdToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  166. { "Identifier", 4, "0x%x", NULL },
  167. };
  168. /** A parser for EArmObjNamedComponent.
  169. */
  170. STATIC CONST CM_OBJ_PARSER CmArmNamedComponentNodeParser[] = {
  171. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  172. { "IdMappingCount", 4, "0x%x", NULL },
  173. { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  174. { "Flags", 4, "0x%x", NULL },
  175. { "CacheCoherent", 4, "0x%x", NULL },
  176. { "AllocationHints", 1, "0x%x", NULL },
  177. { "MemoryAccessFlags", 1, "0x%x", NULL },
  178. { "AddressSizeLimit", 1, "0x%x", NULL },
  179. { "ObjectName", sizeof (CHAR8 *), NULL, PrintString },
  180. { "Identifier", 4, "0x%x", NULL },
  181. };
  182. /** A parser for EArmObjRootComplex.
  183. */
  184. STATIC CONST CM_OBJ_PARSER CmArmRootComplexNodeParser[] = {
  185. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  186. { "IdMappingCount", 4, "0x%x", NULL },
  187. { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  188. { "CacheCoherent", 4, "0x%x", NULL },
  189. { "AllocationHints", 1, "0x%x", NULL },
  190. { "MemoryAccessFlags", 1, "0x%x", NULL },
  191. { "AtsAttribute", 4, "0x%x", NULL },
  192. { "PciSegmentNumber", 4, "0x%x", NULL },
  193. { "MemoryAddressSize", 1, "0x%x", NULL },
  194. { "PasidCapabilities", 2, "0x%x", NULL },
  195. { "Flags", 4, "0x%x", NULL },
  196. { "Identifier", 4, "0x%x", NULL },
  197. };
  198. /** A parser for EArmObjSmmuV1SmmuV2.
  199. */
  200. STATIC CONST CM_OBJ_PARSER CmArmSmmuV1SmmuV2NodeParser[] = {
  201. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  202. { "IdMappingCount", 4, "0x%x", NULL },
  203. { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  204. { "BaseAddress", 8, "0x%llx", NULL },
  205. { "Span", 8, "0x%llx", NULL },
  206. { "Model", 4, "0x%x", NULL },
  207. { "Flags", 4, "0x%x", NULL },
  208. { "ContextInterruptCount", 4, "0x%x", NULL },
  209. { "ContextInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  210. { "PmuInterruptCount", 4, "0x%x", NULL },
  211. { "PmuInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  212. { "SMMU_NSgIrpt", 4, "0x%x", NULL },
  213. { "SMMU_NSgIrptFlags", 4, "0x%x", NULL },
  214. { "SMMU_NSgCfgIrpt", 4, "0x%x", NULL },
  215. { "SMMU_NSgCfgIrptFlags", 4, "0x%x", NULL },
  216. { "Identifier", 4, "0x%x", NULL },
  217. };
  218. /** A parser for EArmObjSmmuV3.
  219. */
  220. STATIC CONST CM_OBJ_PARSER CmArmSmmuV3NodeParser[] = {
  221. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  222. { "IdMappingCount", 4, "0x%x", NULL },
  223. { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  224. { "BaseAddress", 8, "0x%llx", NULL },
  225. { "Flags", 4, "0x%x", NULL },
  226. { "VatosAddress", 8, "0x%llx", NULL },
  227. { "Model", 4, "0x%x", NULL },
  228. { "EventInterrupt", 4, "0x%x", NULL },
  229. { "PriInterrupt", 4, "0x%x", NULL },
  230. { "GerrInterrupt", 4, "0x%x", NULL },
  231. { "SyncInterrupt", 4, "0x%x", NULL },
  232. { "ProximityDomain", 4, "0x%x", NULL },
  233. { "DeviceIdMappingIndex", 4, "0x%x", NULL },
  234. { "Identifier", 4, "0x%x", NULL },
  235. };
  236. /** A parser for EArmObjPmcg.
  237. */
  238. STATIC CONST CM_OBJ_PARSER CmArmPmcgNodeParser[] = {
  239. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  240. { "IdMappingCount", 4, "0x%x", NULL },
  241. { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  242. { "BaseAddress", 8, "0x%llx", NULL },
  243. { "OverflowInterrupt", 4, "0x%x", NULL },
  244. { "Page1BaseAddress", 8, "0x%llx", NULL },
  245. { "ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  246. { "Identifier", 4, "0x%x", NULL },
  247. };
  248. /** A parser for EArmObjGicItsIdentifierArray.
  249. */
  250. STATIC CONST CM_OBJ_PARSER CmArmGicItsIdentifierParser[] = {
  251. { "ItsId", 4, "0x%x", NULL }
  252. };
  253. /** A parser for EArmObjIdMappingArray.
  254. */
  255. STATIC CONST CM_OBJ_PARSER CmArmIdMappingParser[] = {
  256. { "InputBase", 4, "0x%x", NULL },
  257. { "NumIds", 4, "0x%x", NULL },
  258. { "OutputBase", 4, "0x%x", NULL },
  259. { "OutputReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  260. { "Flags", 4, "0x%x", NULL }
  261. };
  262. /** A parser for EArmObjSmmuInterruptArray.
  263. */
  264. STATIC CONST CM_OBJ_PARSER CmArmGenericInterruptParser[] = {
  265. { "Interrupt", 4, "0x%x", NULL },
  266. { "Flags", 4, "0x%x", NULL }
  267. };
  268. /** A parser for EArmObjProcHierarchyInfo.
  269. */
  270. STATIC CONST CM_OBJ_PARSER CmArmProcHierarchyInfoParser[] = {
  271. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  272. { "Flags", 4, "0x%x", NULL },
  273. { "ParentToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  274. { "GicCToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  275. { "NoOfPrivateResources", 4, "0x%x", NULL },
  276. { "PrivateResourcesArrayToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  277. { "LpiToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  278. { "OverrideNameUidEnabled", 1, "%d", NULL },
  279. { "OverrideName", 2, "0x%x", NULL },
  280. { "OverrideUid", 4, "0x%x", NULL }
  281. };
  282. /** A parser for EArmObjCacheInfo.
  283. */
  284. STATIC CONST CM_OBJ_PARSER CmArmCacheInfoParser[] = {
  285. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  286. { "NextLevelOfCacheToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  287. { "Size", 4, "0x%x", NULL },
  288. { "NumberOfSets", 4, "0x%x", NULL },
  289. { "Associativity", 4, "0x%x", NULL },
  290. { "Attributes", 1, "0x%x", NULL },
  291. { "LineSize", 2, "0x%x", NULL },
  292. { "CacheId", 4, "0x%x", NULL },
  293. };
  294. /** A parser for EArmObjProcNodeIdInfo.
  295. */
  296. STATIC CONST CM_OBJ_PARSER CmArmProcNodeIdInfoParser[] = {
  297. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  298. { "VendorId", 4, "0x%p", NULL },
  299. { "Level1Id", 8, "0x%x", NULL },
  300. { "Level2Id", 8, "0x%x", NULL },
  301. { "MajorRev", 2, "0x%x", NULL },
  302. { "MinorRev", 2, "0x%x", NULL },
  303. { "SpinRev", 2, "0x%x", NULL }
  304. };
  305. /** A parser for EArmObjCmRef.
  306. */
  307. STATIC CONST CM_OBJ_PARSER CmArmObjRefParser[] = {
  308. { "ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
  309. };
  310. /** A parser for EArmObjMemoryAffinityInfo.
  311. */
  312. STATIC CONST CM_OBJ_PARSER CmArmMemoryAffinityInfoParser[] = {
  313. { "ProximityDomain", 4, "0x%x", NULL },
  314. { "BaseAddress", 8, "0x%llx", NULL },
  315. { "Length", 8, "0x%llx", NULL },
  316. { "Flags", 4, "0x%x", NULL }
  317. };
  318. /** A parser for EArmObjDeviceHandleAcpi.
  319. */
  320. STATIC CONST CM_OBJ_PARSER CmArmDeviceHandleAcpiParser[] = {
  321. { "Hid", 8, "0x%llx", NULL },
  322. { "Uid", 4, "0x%x", NULL }
  323. };
  324. /** A parser for EArmObjDeviceHandlePci.
  325. */
  326. STATIC CONST CM_OBJ_PARSER CmArmDeviceHandlePciParser[] = {
  327. { "SegmentNumber", 2, "0x%x", NULL },
  328. { "BusNumber", 1, "0x%x", NULL },
  329. { "DeviceNumber", 1, "0x%x", NULL },
  330. { "FunctionNumber", 1, "0x%x", NULL }
  331. };
  332. /** A parser for EArmObjGenericInitiatorAffinityInfo.
  333. */
  334. STATIC CONST CM_OBJ_PARSER CmArmGenericInitiatorAffinityInfoParser[] = {
  335. { "ProximityDomain", 4, "0x%x", NULL },
  336. { "Flags", 4, "0x%x", NULL },
  337. { "DeviceHandleType", 1, "0x%x", NULL },
  338. { "DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
  339. };
  340. /** A parser for EArmObjCmn600Info.
  341. */
  342. STATIC CONST CM_OBJ_PARSER CmArmCmn600InfoParser[] = {
  343. { "PeriphBaseAddress", 8, "0x%llx", NULL },
  344. { "PeriphBaseAddressLength", 8, "0x%llx", NULL },
  345. { "RootNodeBaseAddress", 8, "0x%llx", NULL },
  346. { "DtcCount", 1, "0x%x", NULL },
  347. { "DtcInterrupt[0]", 4, "0x%x", NULL },
  348. { "DtcFlags[0]", 4, "0x%x", NULL },
  349. { "DtcInterrupt[1]", 4, "0x%x", NULL },
  350. { "DtcFlags[1]", 4, "0x%x", NULL },
  351. { "DtcInterrupt[2]", 4, "0x%x", NULL },
  352. { "DtcFlags[2]", 4, "0x%x", NULL },
  353. { "DtcInterrupt[3]", 4, "0x%x", NULL },
  354. { "DtcFlags[3]", 4, "0x%x", NULL }
  355. };
  356. /** A parser for the EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE structure.
  357. */
  358. STATIC CONST CM_OBJ_PARSER AcpiGenericAddressParser[] = {
  359. { "AddressSpaceId", 1, "%d", NULL },
  360. { "RegisterBitWidth", 1, "%d", NULL },
  361. { "RegisterBitOffset", 1, "%d", NULL },
  362. { "AccessSize", 1, "%d", NULL },
  363. { "Address", 8, "0x%llx", NULL },
  364. };
  365. /** A parser for EArmObjLpiInfo.
  366. */
  367. STATIC CONST CM_OBJ_PARSER CmArmLpiInfoParser[] = {
  368. { "MinResidency", 4, "0x%x", NULL },
  369. { "WorstCaseWakeLatency", 4, "0x%x", NULL },
  370. { "Flags", 4, "0x%x", NULL },
  371. { "ArchFlags", 4, "0x%x", NULL },
  372. { "ResCntFreq", 4, "0x%x", NULL },
  373. { "EnableParentState", 4, "0x%x", NULL },
  374. { "IsInteger", 1, "%d", NULL },
  375. { "IntegerEntryMethod", 8, "0x%llx", NULL },
  376. { "RegisterEntryMethod", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
  377. NULL, NULL, AcpiGenericAddressParser,
  378. ARRAY_SIZE (AcpiGenericAddressParser) },
  379. { "ResidencyCounterRegister", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
  380. NULL, NULL, AcpiGenericAddressParser,
  381. ARRAY_SIZE (AcpiGenericAddressParser) },
  382. { "UsageCounterRegister", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
  383. NULL, NULL, AcpiGenericAddressParser,
  384. ARRAY_SIZE (AcpiGenericAddressParser) },
  385. { "StateName", 16, NULL, PrintString },
  386. };
  387. /** A parser for EArmObjPciAddressMapInfo.
  388. */
  389. STATIC CONST CM_OBJ_PARSER CmArmPciAddressMapInfoParser[] = {
  390. { "SpaceCode", 1, "%d", NULL },
  391. { "PciAddress", 8, "0x%llx", NULL },
  392. { "CpuAddress", 8, "0x%llx", NULL },
  393. { "AddressSize", 8, "0x%llx", NULL },
  394. };
  395. /** A parser for EArmObjPciInterruptMapInfo.
  396. */
  397. STATIC CONST CM_OBJ_PARSER CmPciInterruptMapInfoParser[] = {
  398. { "PciBus", 1, "0x%x", NULL },
  399. { "PciDevice", 1, "0x%x", NULL },
  400. { "PciInterrupt", 1, "0x%x", NULL },
  401. { "IntcInterrupt", sizeof (CM_ARM_GENERIC_INTERRUPT),
  402. NULL, NULL, CmArmGenericInterruptParser,
  403. ARRAY_SIZE (CmArmGenericInterruptParser) },
  404. };
  405. /** A parser for EArmObjRmr.
  406. */
  407. STATIC CONST CM_OBJ_PARSER CmArmRmrInfoParser[] = {
  408. { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  409. { "IdMappingCount", 4, "0x%x", NULL },
  410. { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  411. { "Identifier", 4, "0x%x", NULL },
  412. { "Flags", 4, "0x%x", NULL },
  413. { "MemRangeDescCount", 4, "0x%x", NULL },
  414. { "MemRangeDescToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
  415. };
  416. /** A parser for EArmObjMemoryRangeDescriptor.
  417. */
  418. STATIC CONST CM_OBJ_PARSER CmArmMemoryRangeDescriptorInfoParser[] = {
  419. { "BaseAddress", 8, "0x%llx", NULL },
  420. { "Length", 8, "0x%llx", NULL },
  421. };
  422. /** A parser for EArmObjCpcInfo.
  423. */
  424. STATIC CONST CM_OBJ_PARSER CmArmCpcInfoParser[] = {
  425. { "Revision", 4, "0x%lx", NULL },
  426. { "HighestPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  427. NULL, NULL, AcpiGenericAddressParser,
  428. ARRAY_SIZE (AcpiGenericAddressParser) },
  429. { "HighestPerformanceInteger", 4, "0x%lx", NULL },
  430. { "NominalPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  431. NULL, NULL, AcpiGenericAddressParser,
  432. ARRAY_SIZE (AcpiGenericAddressParser) },
  433. { "NominalPerformanceInteger", 4, "0x%lx", NULL },
  434. { "LowestNonlinearPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  435. NULL, NULL, AcpiGenericAddressParser,
  436. ARRAY_SIZE (AcpiGenericAddressParser) },
  437. { "LowestNonlinearPerformanceInteger", 4, "0x%lx", NULL },
  438. { "LowestPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  439. NULL, NULL, AcpiGenericAddressParser,
  440. ARRAY_SIZE (AcpiGenericAddressParser) },
  441. { "LowestPerformanceInteger", 4, "0x%lx", NULL },
  442. { "GuaranteedPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  443. NULL, NULL, AcpiGenericAddressParser,
  444. ARRAY_SIZE (AcpiGenericAddressParser) },
  445. { "DesiredPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  446. NULL, NULL, AcpiGenericAddressParser,
  447. ARRAY_SIZE (AcpiGenericAddressParser) },
  448. { "MinimumPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  449. NULL, NULL, AcpiGenericAddressParser,
  450. ARRAY_SIZE (AcpiGenericAddressParser) },
  451. { "MaximumPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  452. NULL, NULL, AcpiGenericAddressParser,
  453. ARRAY_SIZE (AcpiGenericAddressParser) },
  454. { "PerformanceReductionToleranceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  455. NULL, NULL, AcpiGenericAddressParser,
  456. ARRAY_SIZE (AcpiGenericAddressParser) },
  457. { "TimeWindowRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  458. NULL, NULL, AcpiGenericAddressParser,
  459. ARRAY_SIZE (AcpiGenericAddressParser) },
  460. { "CounterWraparoundTimeBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  461. NULL, NULL, AcpiGenericAddressParser,
  462. ARRAY_SIZE (AcpiGenericAddressParser) },
  463. { "CounterWraparoundTimeInteger", 4, "0x%lx", NULL },
  464. { "ReferencePerformanceCounterRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  465. NULL, NULL, AcpiGenericAddressParser,
  466. ARRAY_SIZE (AcpiGenericAddressParser) },
  467. { "DeliveredPerformanceCounterRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  468. NULL, NULL, AcpiGenericAddressParser,
  469. ARRAY_SIZE (AcpiGenericAddressParser) },
  470. { "PerformanceLimitedRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  471. NULL, NULL, AcpiGenericAddressParser,
  472. ARRAY_SIZE (AcpiGenericAddressParser) },
  473. { "CPPCEnableRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  474. NULL, NULL, AcpiGenericAddressParser,
  475. ARRAY_SIZE (AcpiGenericAddressParser) },
  476. { "AutonomousSelectionEnableBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  477. NULL, NULL, AcpiGenericAddressParser,
  478. ARRAY_SIZE (AcpiGenericAddressParser) },
  479. { "AutonomousSelectionEnableInteger", 4, "0x%lx", NULL },
  480. { "AutonomousActivityWindowRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  481. NULL, NULL, AcpiGenericAddressParser,
  482. ARRAY_SIZE (AcpiGenericAddressParser) },
  483. { "EnergyPerformancePreferenceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  484. NULL, NULL, AcpiGenericAddressParser,
  485. ARRAY_SIZE (AcpiGenericAddressParser) },
  486. { "ReferencePerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  487. NULL, NULL, AcpiGenericAddressParser,
  488. ARRAY_SIZE (AcpiGenericAddressParser) },
  489. { "ReferencePerformanceInteger", 4, "0x%lx", NULL },
  490. { "LowestFrequencyBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  491. NULL, NULL, AcpiGenericAddressParser,
  492. ARRAY_SIZE (AcpiGenericAddressParser) },
  493. { "LowestFrequencyInteger", 4, "0x%lx", NULL },
  494. { "NominalFrequencyBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
  495. NULL, NULL, AcpiGenericAddressParser,
  496. ARRAY_SIZE (AcpiGenericAddressParser) },
  497. { "NominalFrequencyInteger", 4, "0x%lx", NULL },
  498. };
  499. /** A parser for the PCC_MAILBOX_REGISTER_INFO struct.
  500. */
  501. STATIC CONST CM_OBJ_PARSER CmArmMailboxRegisterInfoParser[] = {
  502. { "Register", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), NULL, NULL,
  503. AcpiGenericAddressParser, ARRAY_SIZE (AcpiGenericAddressParser) },
  504. { "PreserveMask", 8, "0x%llx", NULL },
  505. { "WriteMask", 8, "0x%llx", NULL },
  506. };
  507. /** A parser for the PCC_SUBSPACE_CHANNEL_TIMING_INFO struct.
  508. */
  509. STATIC CONST CM_OBJ_PARSER CmArmPccSubspaceChannelTimingInfoParser[] = {
  510. { "NominalLatency", 4, "0x%x", NULL },
  511. { "MaxPeriodicAccessRate", 4, "0x%x", NULL },
  512. { "MinRequestTurnaroundTime", 2, "0x%x", NULL },
  513. };
  514. /** A parser for EArmObjPccSubspaceType0Info.
  515. */
  516. STATIC CONST CM_OBJ_PARSER CmArmPccSubspaceType0InfoParser[] = {
  517. { "SubspaceId", 1, "0x%x", NULL },
  518. { "Type", 1, "0x%x", NULL },
  519. { "BaseAddress", 8, "0x%llx", NULL },
  520. { "AddressLength", 8, "0x%llx", NULL },
  521. { "DoorbellReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  522. NULL, NULL, CmArmMailboxRegisterInfoParser,
  523. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  524. { "ChannelTiming", sizeof (PCC_SUBSPACE_CHANNEL_TIMING_INFO),
  525. NULL, NULL, CmArmPccSubspaceChannelTimingInfoParser,
  526. ARRAY_SIZE (CmArmPccSubspaceChannelTimingInfoParser) },
  527. };
  528. /** A parser for EArmObjPccSubspaceType1Info.
  529. */
  530. STATIC CONST CM_OBJ_PARSER CmArmPccSubspaceType1InfoParser[] = {
  531. { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
  532. NULL, NULL, CmArmPccSubspaceType0InfoParser,
  533. ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
  534. { "PlatIrq", sizeof (CM_ARM_GENERIC_INTERRUPT),
  535. NULL, NULL, CmArmGenericInterruptParser,
  536. ARRAY_SIZE (CmArmGenericInterruptParser) },
  537. };
  538. /** A parser for EArmObjPccSubspaceType2Info.
  539. */
  540. STATIC CONST CM_OBJ_PARSER CmArmPccSubspaceType2InfoParser[] = {
  541. { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
  542. NULL, NULL, CmArmPccSubspaceType0InfoParser,
  543. ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
  544. { "PlatIrq", sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,NULL,
  545. CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
  546. { "PlatIrqAckReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  547. NULL, NULL, CmArmMailboxRegisterInfoParser,
  548. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  549. };
  550. /** A parser for EArmObjPccSubspaceType3Info or EArmObjPccSubspaceType4Info.
  551. */
  552. STATIC CONST CM_OBJ_PARSER CmArmPccSubspaceType34InfoParser[] = {
  553. { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
  554. NULL, NULL, CmArmPccSubspaceType0InfoParser,
  555. ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
  556. { "PlatIrq", sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,NULL,
  557. CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
  558. { "PlatIrqAckReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  559. NULL, NULL, CmArmMailboxRegisterInfoParser,
  560. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  561. { "CmdCompleteCheckReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  562. NULL, NULL, CmArmMailboxRegisterInfoParser,
  563. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  564. { "CmdCompleteUpdateReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  565. NULL, NULL, CmArmMailboxRegisterInfoParser,
  566. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  567. { "ErrorStatusReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  568. NULL, NULL, CmArmMailboxRegisterInfoParser,
  569. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  570. };
  571. /** A parser for EArmObjPccSubspaceType5Info.
  572. */
  573. STATIC CONST CM_OBJ_PARSER CmArmPccSubspaceType5InfoParser[] = {
  574. { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
  575. NULL, NULL, CmArmPccSubspaceType0InfoParser,
  576. ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
  577. { "Version", 2, "0x%x",NULL },
  578. { "PlatIrq", sizeof (CM_ARM_GENERIC_INTERRUPT), NULL, NULL,
  579. CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
  580. { "CmdCompleteCheckReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  581. NULL, NULL, CmArmMailboxRegisterInfoParser,
  582. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  583. { "ErrorStatusReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
  584. NULL, NULL, CmArmMailboxRegisterInfoParser,
  585. ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
  586. };
  587. /** A parser for Arm namespace objects.
  588. */
  589. STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = {
  590. { "EArmObjReserved", NULL, 0 },
  591. { "EArmObjBootArchInfo", CmArmBootArchInfoParser,
  592. ARRAY_SIZE (CmArmBootArchInfoParser) },
  593. { "EArmObjCpuInfo", NULL, 0 },
  594. { "EArmObjPowerManagementProfileInfo", CmArmPowerManagementProfileInfoParser,
  595. ARRAY_SIZE (CmArmPowerManagementProfileInfoParser) },
  596. { "EArmObjGicCInfo", CmArmGicCInfoParser, ARRAY_SIZE (CmArmGicCInfoParser) },
  597. { "EArmObjGicDInfo", CmArmGicDInfoParser, ARRAY_SIZE (CmArmGicDInfoParser) },
  598. { "EArmObjGicMsiFrameInfo", CmArmGicMsiFrameInfoParser,
  599. ARRAY_SIZE (CmArmGicMsiFrameInfoParser) },
  600. { "EArmObjGicRedistributorInfo", CmArmGicRedistInfoParser,
  601. ARRAY_SIZE (CmArmGicRedistInfoParser) },
  602. { "EArmObjGicItsInfo", CmArmGicItsInfoParser,
  603. ARRAY_SIZE (CmArmGicItsInfoParser) },
  604. { "EArmObjSerialConsolePortInfo", CmArmSerialPortInfoParser,
  605. ARRAY_SIZE (CmArmSerialPortInfoParser) },
  606. { "EArmObjSerialDebugPortInfo", CmArmSerialPortInfoParser,
  607. ARRAY_SIZE (CmArmSerialPortInfoParser) },
  608. { "EArmObjGenericTimerInfo", CmArmGenericTimerInfoParser,
  609. ARRAY_SIZE (CmArmGenericTimerInfoParser) },
  610. { "EArmObjPlatformGTBlockInfo", CmArmGTBlockInfoParser,
  611. ARRAY_SIZE (CmArmGTBlockInfoParser) },
  612. { "EArmObjGTBlockTimerFrameInfo", CmArmGTBlockTimerFrameInfoParser,
  613. ARRAY_SIZE (CmArmGTBlockTimerFrameInfoParser) },
  614. { "EArmObjPlatformGenericWatchdogInfo", CmArmGenericWatchdogInfoParser,
  615. ARRAY_SIZE (CmArmGenericWatchdogInfoParser) },
  616. { "EArmObjPciConfigSpaceInfo", CmArmPciConfigSpaceInfoParser,
  617. ARRAY_SIZE (CmArmPciConfigSpaceInfoParser) },
  618. { "EArmObjHypervisorVendorIdentity", CmArmHypervisorVendorIdParser,
  619. ARRAY_SIZE (CmArmHypervisorVendorIdParser) },
  620. { "EArmObjFixedFeatureFlags", CmArmFixedFeatureFlagsParser,
  621. ARRAY_SIZE (CmArmFixedFeatureFlagsParser) },
  622. { "EArmObjItsGroup", CmArmItsGroupNodeParser,
  623. ARRAY_SIZE (CmArmItsGroupNodeParser) },
  624. { "EArmObjNamedComponent", CmArmNamedComponentNodeParser,
  625. ARRAY_SIZE (CmArmNamedComponentNodeParser) },
  626. { "EArmObjRootComplex", CmArmRootComplexNodeParser,
  627. ARRAY_SIZE (CmArmRootComplexNodeParser) },
  628. { "EArmObjSmmuV1SmmuV2", CmArmSmmuV1SmmuV2NodeParser,
  629. ARRAY_SIZE (CmArmSmmuV1SmmuV2NodeParser) },
  630. { "EArmObjSmmuV3", CmArmSmmuV3NodeParser,
  631. ARRAY_SIZE (CmArmSmmuV3NodeParser) },
  632. { "EArmObjPmcg", CmArmPmcgNodeParser, ARRAY_SIZE (CmArmPmcgNodeParser) },
  633. { "EArmObjGicItsIdentifierArray", CmArmGicItsIdentifierParser,
  634. ARRAY_SIZE (CmArmGicItsIdentifierParser) },
  635. { "EArmObjIdMappingArray", CmArmIdMappingParser,
  636. ARRAY_SIZE (CmArmIdMappingParser) },
  637. { "EArmObjSmmuInterruptArray", CmArmGenericInterruptParser,
  638. ARRAY_SIZE (CmArmGenericInterruptParser) },
  639. { "EArmObjProcHierarchyInfo", CmArmProcHierarchyInfoParser,
  640. ARRAY_SIZE (CmArmProcHierarchyInfoParser) },
  641. { "EArmObjCacheInfo", CmArmCacheInfoParser,
  642. ARRAY_SIZE (CmArmCacheInfoParser) },
  643. { "EArmObjProcNodeIdInfo", CmArmProcNodeIdInfoParser,
  644. ARRAY_SIZE (CmArmProcNodeIdInfoParser) },
  645. { "EArmObjCmRef", CmArmObjRefParser, ARRAY_SIZE (CmArmObjRefParser) },
  646. { "EArmObjMemoryAffinityInfo", CmArmMemoryAffinityInfoParser,
  647. ARRAY_SIZE (CmArmMemoryAffinityInfoParser) },
  648. { "EArmObjDeviceHandleAcpi", CmArmDeviceHandleAcpiParser,
  649. ARRAY_SIZE (CmArmDeviceHandleAcpiParser) },
  650. { "EArmObjDeviceHandlePci", CmArmDeviceHandlePciParser,
  651. ARRAY_SIZE (CmArmDeviceHandlePciParser) },
  652. { "EArmObjGenericInitiatorAffinityInfo",
  653. CmArmGenericInitiatorAffinityInfoParser,
  654. ARRAY_SIZE (CmArmGenericInitiatorAffinityInfoParser) },
  655. { "EArmObjSerialPortInfo", CmArmSerialPortInfoParser,
  656. ARRAY_SIZE (CmArmSerialPortInfoParser) },
  657. { "EArmObjCmn600Info", CmArmCmn600InfoParser,
  658. ARRAY_SIZE (CmArmCmn600InfoParser) },
  659. { "EArmObjLpiInfo", CmArmLpiInfoParser,
  660. ARRAY_SIZE (CmArmLpiInfoParser) },
  661. { "EArmObjPciAddressMapInfo", CmArmPciAddressMapInfoParser,
  662. ARRAY_SIZE (CmArmPciAddressMapInfoParser) },
  663. { "EArmObjPciInterruptMapInfo", CmPciInterruptMapInfoParser,
  664. ARRAY_SIZE (CmPciInterruptMapInfoParser) },
  665. { "EArmObjRmr", CmArmRmrInfoParser,
  666. ARRAY_SIZE (CmArmRmrInfoParser) },
  667. { "EArmObjMemoryRangeDescriptor", CmArmMemoryRangeDescriptorInfoParser,
  668. ARRAY_SIZE (CmArmMemoryRangeDescriptorInfoParser) },
  669. { "EArmObjCpcInfo", CmArmCpcInfoParser,
  670. ARRAY_SIZE (CmArmCpcInfoParser) },
  671. { "EArmObjPccSubspaceType0Info", CmArmPccSubspaceType0InfoParser,
  672. ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
  673. { "EArmObjPccSubspaceType1Info", CmArmPccSubspaceType1InfoParser,
  674. ARRAY_SIZE (CmArmPccSubspaceType1InfoParser) },
  675. { "EArmObjPccSubspaceType2Info", CmArmPccSubspaceType2InfoParser,
  676. ARRAY_SIZE (CmArmPccSubspaceType2InfoParser) },
  677. { "EArmObjPccSubspaceType3Info", CmArmPccSubspaceType34InfoParser,
  678. ARRAY_SIZE (CmArmPccSubspaceType34InfoParser) },
  679. { "EArmObjPccSubspaceType4Info", CmArmPccSubspaceType34InfoParser,
  680. ARRAY_SIZE (CmArmPccSubspaceType34InfoParser) },
  681. { "EArmObjPccSubspaceType5Info", CmArmPccSubspaceType5InfoParser,
  682. ARRAY_SIZE (CmArmPccSubspaceType5InfoParser) },
  683. { "EArmObjMax", NULL, 0 },
  684. };
  685. /** A parser for EStdObjCfgMgrInfo.
  686. */
  687. STATIC CONST CM_OBJ_PARSER StdObjCfgMgrInfoParser[] = {
  688. { "Revision", 4, "0x%x", NULL },
  689. { "OemId[6]", 6, "%C%C%C%C%C%C", PrintOemId }
  690. };
  691. /** A parser for EStdObjAcpiTableList.
  692. */
  693. STATIC CONST CM_OBJ_PARSER StdObjAcpiTableInfoParser[] = {
  694. { "AcpiTableSignature", 4, "0x%x", NULL },
  695. { "AcpiTableRevision", 1, "%d", NULL },
  696. { "TableGeneratorId", sizeof (ACPI_TABLE_GENERATOR_ID), "0x%x", NULL },
  697. { "AcpiTableData", sizeof (EFI_ACPI_DESCRIPTION_HEADER *), "0x%p", NULL },
  698. { "OemTableId", 8, "0x%LLX", NULL },
  699. { "OemRevision", 4, "0x%x", NULL },
  700. { "MinorRevision", 1, "0x%x", NULL },
  701. };
  702. /** A parser for EStdObjSmbiosTableList.
  703. */
  704. STATIC CONST CM_OBJ_PARSER StdObjSmbiosTableInfoParser[] = {
  705. { "TableGeneratorId", sizeof (SMBIOS_TABLE_GENERATOR_ID), "0x%x", NULL },
  706. { "SmbiosTableData", sizeof (SMBIOS_STRUCTURE *), "0x%p", NULL }
  707. };
  708. /** A parser for Standard namespace objects.
  709. */
  710. STATIC CONST CM_OBJ_PARSER_ARRAY StdNamespaceObjectParser[] = {
  711. { "EStdObjCfgMgrInfo", StdObjCfgMgrInfoParser,
  712. ARRAY_SIZE (StdObjCfgMgrInfoParser) },
  713. { "EStdObjAcpiTableList", StdObjAcpiTableInfoParser,
  714. ARRAY_SIZE (StdObjAcpiTableInfoParser) },
  715. { "EStdObjSmbiosTableList", StdObjSmbiosTableInfoParser,
  716. ARRAY_SIZE (StdObjSmbiosTableInfoParser) },
  717. };
  718. /** Print OEM Id.
  719. @param [in] Format Format to print the Ptr.
  720. @param [in] Ptr Pointer to the OEM Id.
  721. **/
  722. STATIC
  723. VOID
  724. EFIAPI
  725. PrintOemId (
  726. IN CONST CHAR8 *Format,
  727. IN UINT8 *Ptr
  728. )
  729. {
  730. DEBUG ((
  731. DEBUG_ERROR,
  732. (Format != NULL) ? Format : "%C%C%C%C%C%C",
  733. Ptr[0],
  734. Ptr[1],
  735. Ptr[2],
  736. Ptr[3],
  737. Ptr[4],
  738. Ptr[5]
  739. ));
  740. }
  741. /** Print string.
  742. The string must be NULL terminated.
  743. @param [in] Format Format to print the Ptr.
  744. @param [in] Ptr Pointer to the string.
  745. **/
  746. STATIC
  747. VOID
  748. EFIAPI
  749. PrintString (
  750. CONST CHAR8 *Format,
  751. UINT8 *Ptr
  752. )
  753. {
  754. DEBUG ((DEBUG_ERROR, "%a", Ptr));
  755. }
  756. /** Print fields of the objects.
  757. @param [in] Data Pointer to the object to print.
  758. @param [in] Parser Parser containing the object fields.
  759. @param [in] ItemCount Number of entries/fields in the Parser.
  760. @param [in] RemainingSize Parse at most *RemainingSize bytes.
  761. This function decrements the value
  762. from the number bytes consumed.
  763. @param [in] IndentLevel Indentation to use when printing.
  764. **/
  765. STATIC
  766. VOID
  767. PrintCmObjDesc (
  768. IN VOID *Data,
  769. IN CONST CM_OBJ_PARSER *Parser,
  770. IN UINTN ItemCount,
  771. IN INTN *RemainingSize,
  772. IN UINT32 IndentLevel
  773. )
  774. {
  775. UINT32 Index;
  776. UINT32 IndentIndex;
  777. INTN SubStructSize;
  778. if ((Data == NULL) ||
  779. (Parser == NULL) ||
  780. (ItemCount == 0) ||
  781. (RemainingSize == NULL))
  782. {
  783. ASSERT (0);
  784. return;
  785. }
  786. // Print each field.
  787. for (Index = 0; Index < ItemCount; Index++) {
  788. // Check there is enough space in left.
  789. *RemainingSize -= Parser[Index].Length;
  790. if (*RemainingSize < 0) {
  791. DEBUG ((
  792. DEBUG_ERROR,
  793. "\nERROR: %a: Buffer overrun\n",
  794. Parser[Index].NameStr
  795. ));
  796. ASSERT (0);
  797. return;
  798. }
  799. // Indentation
  800. for (IndentIndex = 0; IndentIndex < IndentLevel; IndentIndex++) {
  801. DEBUG ((DEBUG_ERROR, " "));
  802. }
  803. DEBUG ((
  804. DEBUG_ERROR,
  805. "%-*a :",
  806. OUTPUT_FIELD_COLUMN_WIDTH - 2 * IndentLevel,
  807. Parser[Index].NameStr
  808. ));
  809. if (Parser[Index].PrintFormatter != NULL) {
  810. Parser[Index].PrintFormatter (Parser[Index].Format, Data);
  811. } else if (Parser[Index].Format != NULL) {
  812. switch (Parser[Index].Length) {
  813. case 1:
  814. DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT8 *)Data));
  815. break;
  816. case 2:
  817. DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT16 *)Data));
  818. break;
  819. case 4:
  820. DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT32 *)Data));
  821. break;
  822. case 8:
  823. DEBUG ((DEBUG_ERROR, Parser[Index].Format, ReadUnaligned64 (Data)));
  824. break;
  825. default:
  826. DEBUG ((
  827. DEBUG_ERROR,
  828. "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",
  829. Parser[Index].NameStr,
  830. Parser[Index].Length
  831. ));
  832. } // switch
  833. } else if (Parser[Index].SubObjParser != NULL) {
  834. SubStructSize = Parser[Index].Length;
  835. DEBUG ((DEBUG_ERROR, "\n"));
  836. PrintCmObjDesc (
  837. Data,
  838. Parser[Index].SubObjParser,
  839. Parser[Index].SubObjItemCount,
  840. &SubStructSize,
  841. IndentLevel + 1
  842. );
  843. } else {
  844. ASSERT (0);
  845. DEBUG ((
  846. DEBUG_ERROR,
  847. "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",
  848. Parser[Index].NameStr,
  849. Parser[Index].Length
  850. ));
  851. }
  852. DEBUG ((DEBUG_ERROR, "\n"));
  853. Data = (UINT8 *)Data + Parser[Index].Length;
  854. } // for
  855. }
  856. /** Parse and print a CmObjDesc.
  857. @param [in] CmObjDesc The CmObjDesc to parse and print.
  858. **/
  859. VOID
  860. EFIAPI
  861. ParseCmObjDesc (
  862. IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc
  863. )
  864. {
  865. UINTN ObjId;
  866. UINTN NameSpaceId;
  867. UINT32 ObjIndex;
  868. UINT32 ObjectCount;
  869. INTN RemainingSize;
  870. INTN Offset;
  871. CONST CM_OBJ_PARSER_ARRAY *ParserArray;
  872. if ((CmObjDesc == NULL) || (CmObjDesc->Data == NULL)) {
  873. return;
  874. }
  875. NameSpaceId = GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId);
  876. ObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId);
  877. switch (NameSpaceId) {
  878. case EObjNameSpaceStandard:
  879. if (ObjId >= EStdObjMax) {
  880. ASSERT (0);
  881. return;
  882. }
  883. ParserArray = &StdNamespaceObjectParser[ObjId];
  884. break;
  885. case EObjNameSpaceArm:
  886. if (ObjId >= EArmObjMax) {
  887. ASSERT (0);
  888. return;
  889. }
  890. ParserArray = &ArmNamespaceObjectParser[ObjId];
  891. break;
  892. default:
  893. // Not supported
  894. ASSERT (0);
  895. return;
  896. } // switch
  897. ObjectCount = CmObjDesc->Count;
  898. RemainingSize = CmObjDesc->Size;
  899. Offset = 0;
  900. for (ObjIndex = 0; ObjIndex < ObjectCount; ObjIndex++) {
  901. DEBUG ((
  902. DEBUG_ERROR,
  903. "\n%-*a [%d/%d]:\n",
  904. OUTPUT_FIELD_COLUMN_WIDTH,
  905. ParserArray->ObjectName,
  906. ObjIndex + 1,
  907. ObjectCount
  908. ));
  909. PrintCmObjDesc (
  910. (VOID *)((UINTN)CmObjDesc->Data + Offset),
  911. ParserArray->Parser,
  912. ParserArray->ItemCount,
  913. &RemainingSize,
  914. 1
  915. );
  916. if ((RemainingSize > CmObjDesc->Size) ||
  917. (RemainingSize < 0))
  918. {
  919. ASSERT (0);
  920. return;
  921. }
  922. Offset = CmObjDesc->Size - RemainingSize;
  923. } // for
  924. ASSERT (RemainingSize == 0);
  925. }