* [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces @ 2024-05-23 4:12 Chang, Abner via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md Chang, Abner via groups.io ` (3 more replies) 0 siblings, 4 replies; 16+ messages in thread From: Chang, Abner via groups.io @ 2024-05-23 4:12 UTC (permalink / raw) To: devel Cc: Paul Grimes, Abdul Lateef Attar, Igniculus Fu, Ken Yao, Eric Xing, Duke Zhai From: Abner Chang <abner.chang@amd.com> BZ#: 4777 Initial commit of AMD cross platform/board generic encapsulated software architecture. This provides the basic definitions and protocols for the follow-up AMD open board project. Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- .../AgesaModulePkg/AgesaCommonModulePkg.dec | 39 + Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec | 18 + .../AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec | 20 + .../AMD/AgesaModulePkg/AgesaModuleDfPkg.dec | 25 + .../AMD/AgesaModulePkg/AgesaModuleFchPkg.dec | 62 + .../AMD/AgesaModulePkg/AgesaModuleMemPkg.dec | 26 + .../AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec | 34 + .../AMD/AgesaModulePkg/AgesaModulePspPkg.dec | 29 + Platform/AMD/AgesaPkg/AgesaPkg.dec | 435 +++ Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec | 41 + .../AgesaEdk2PlatformPkg.inc.dsc | 18 + .../AgesaSp5RsModulePkg.inc.dsc | 48 + .../CbsInstanceNull/CbsInstanceNull.inc.dsc | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.inc.dsc | 11 + .../AgesaSp5RsModulePkg.dxe.inc.fdf | 11 + .../AgesaSp5RsModulePkg.pei.inc.fdf | 9 + .../CbsInstanceNull.dxe.inc.fdf | 7 + .../CbsInstanceNull.pei.inc.fdf | 7 + .../0x19/RS/External/CbsStones.dxe.inc.fdf | 8 + .../0x19/RS/External/CbsStones.pei.inc.fdf | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf | 7 + .../Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf | 10 + .../Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf | 7 + .../Library/AmdCalloutLib/AmdCalloutLib.inf | 29 + .../AmdPspMboxLibV2/AmdPspMboxLibV2.inf | 30 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.inf | 27 + .../AmdPspRomArmorLibNull.inf | 26 + .../Library/ApcbLibV3/ApcbLibV3.inf | 37 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.inf | 32 + .../BaseFabricTopologyRsLib.inf | 28 + .../CcxTscTimerLib/BaseTscTimerLib.inf | 35 + .../Library/CcxTscTimerLib/DxeTscTimerLib.inf | 42 + .../Library/CcxTscTimerLib/PeiTscTimerLib.inf | 37 + .../PciHostBridgeLib.inf | 42 + .../DxeAmlGenerationLib/AmlGenerationLib.inf | 47 + .../Library/FchBaseLib/FchBaseLib.inf | 26 + .../FchBaseResetSystemLib.inf | 35 + .../Library/FchEspiCmdLib/FchEspiCmdLib.inf | 33 + .../Library/NbioHandleLib/NbioHandleLib.inf | 24 + .../Library/PcieConfigLib/PcieConfigLib.inf | 25 + .../Library/SmnAccessLib/SmnAccessLib.inf | 33 + .../Library/CommonDxe/NbioCommonDxeLib.inf | 29 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf | 45 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf | 33 + .../OemAgesaCcxPlatformLibNull.inf | 27 + .../PciExpressPciCfg2/PciExpressPciCfg2.inf | 61 + .../PciExpressPciSegmentInfoLib.inf | 32 + .../AmdPspFlashAccSpiNorLibSmm.inf | 45 + .../PspRomArmorWhitelistLib.inf | 32 + .../Addendum/Oem/OobPprDxe/OobPprDxe.inf | 42 + .../Dxe/PspPlatformDriver/PspPlatform.inf | 32 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.inf | 29 + .../AmdAutoDynamicCommand.inf | 53 + .../AmdAutoDynamicCommand/AmdAutoToolApp.inf | 50 + .../BasePlatformHookLibAmdFchUart.inf | 33 + Platform/AMD/AgesaModulePkg/Include/AGESA.h | 158 + Platform/AMD/AgesaModulePkg/Include/AMD.h | 91 + .../Include/AmdEdk2/CpuRegisters.h | 15 + .../AgesaModulePkg/Include/AmdPspDirectory.h | 61 + .../AgesaModulePkg/Include/CpuRegistersDef.h | 156 + .../Include/FchRegistersCommon.h | 85 + .../AMD/AgesaModulePkg/Include/Filecode.h | 31 + Platform/AMD/AgesaModulePkg/Include/Gnb.h | 14 + Platform/AMD/AgesaModulePkg/Include/GnbDxio.h | 521 ++++ .../AgesaModulePkg/Include/GnbRegistersRS.h | 18 + .../Include/GnbRegistersRS/IOHC.h | 22 + .../Include/Guid/GnbPcieInfoHob.h | 31 + .../Include/Library/AmdBaseLib.h | 16 + .../Include/Library/AmdPspMboxLibV2.h | 43 + .../Include/Library/BaseFabricTopologyLib.h | 22 + .../Include/Library/FchBaseLib.h | 16 + .../Include/Library/FchEspiCmdLib.h | 413 +++ .../Include/Library/GnbPcieConfigLib.h | 16 + .../Include/Library/NbioCommonLibDxe.h | 37 + .../Include/Library/NbioHandleLib.h | 62 + .../Include/Library/PcieConfigLib.h | 283 ++ .../Include/Library/SmnAccessLib.h | 30 + .../Protocol/AmdNbioPcieServicesProtocol.h | 47 + .../Include/Protocol/AmdOemOobPprProtocol.h | 14 + .../Include/Protocol/FabricNumaServices2.h | 155 + .../Protocol/FabricTopologyServices2.h | 14 + .../AMD/AgesaModulePkg/Include/SocLogicalId.h | 23 + .../Library/DxeAmlGenerationLib/LocalAmlLib.h | 100 + .../DxeAmlGenerationLib/LocalAmlObjects.h | 150 + .../AMD/AgesaPkg/Include/AmdPcieComplex.h | 432 +++ Platform/AMD/AgesaPkg/Include/AmdSoc.h | 17 + .../Include/FabricResourceManagerCmn.h | 42 + .../AgesaPkg/Include/Guid/AmdMemoryInfoHob.h | 96 + .../Include/Library/AmdPspBaseLibV2.h | 51 + .../AgesaPkg/Include/Library/AmdPspFtpmLib.h | 83 + .../Include/Library/AmdPspRomArmorLib.h | 231 ++ .../Include/Library/AmlGenerationLib.h | 2722 +++++++++++++++++ .../Library/PlatformPspRomArmorWhitelistLib.h | 25 + .../AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h | 134 + .../Include/Protocol/AmdCxlServicesProtocol.h | 183 ++ .../Protocol/AmdPciResourcesProtocol.h | 110 + .../Include/Protocol/AmdPspFtpmProtocol.h | 187 ++ .../FabricResourceManagerServicesProtocol.h | 14 + Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h | 19 + Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h | 78 + Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h | 17 + .../AMD/AmdCpmPkg/Include/AmdCpmFunction.h | 32 + .../AmdCpmTableProtocol/AmdCpmTableProtocol.h | 39 + .../Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c | 31 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.c | 12 + .../AmdPspRomArmorLibNull.c | 79 + .../Library/ApcbLibV3/ApcbLibV3.c | 12 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.c | 14 + .../BaseFabricTopologyRsLib.c | 37 + .../Library/CcxTscTimerLib/BaseTscTimerLib.c | 8 + .../Library/CcxTscTimerLib/DxeTscTimerLib.c | 35 + .../Library/CcxTscTimerLib/PeiTscTimerLib.c | 11 + .../Library/CcxTscTimerLib/TscTimerLibShare.c | 103 + .../DxeAmdPciHostBridgeLib/PciHostBridgeLib.c | 95 + .../DxeAmlGenerationLib/AmlArgObjects.c | 154 + .../DxeAmlGenerationLib/AmlAssistFunctions.c | 151 + .../DxeAmlGenerationLib/AmlDataObjects.c | 640 ++++ .../AmlExpressionOpcodes.c | 1294 ++++++++ .../DxeAmlGenerationLib/AmlLocalObjects.c | 158 + .../DxeAmlGenerationLib/AmlNameString.c | 576 ++++ .../DxeAmlGenerationLib/AmlNamedObject.c | 2138 +++++++++++++ .../AmlNamespaceModifierObjects.c | 360 +++ .../DxeAmlGenerationLib/AmlObjectsDebug.c | 144 + .../DxeAmlGenerationLib/AmlPkgLength.c | 267 ++ .../AmlResourceDescriptor.c | 1989 ++++++++++++ .../DxeAmlGenerationLib/AmlStatementOpcodes.c | 515 ++++ .../Library/DxeAmlGenerationLib/AmlTable.c | 213 ++ .../DxeAmlGenerationLib/LocalAmlObjects.c | 364 +++ .../Library/FchBaseLib/FchStallLib.c | 13 + .../FchBaseResetSystemLib.c | 90 + .../Library/FchEspiCmdLib/FchEspiCmdLib.c | 87 + .../Library/NbioHandleLib/NbioHandleLib.c | 68 + .../Library/PcieConfigLib/PcieConfigLib.c | 276 ++ .../PcieConfigLib/PcieInputParserLib.c | 117 + .../Library/SmnAccessLib/SmnAccessLib.c | 10 + .../Nbio/Library/CommonDxe/DxeLibFunctions.c | 42 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c | 23 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c | 29 + .../OemAgesaCcxPlatformLibNull.c | 39 + .../PciExpressPciCfg2/PciExpressPciCfg2.c | 33 + .../PciSegmentInfoLib.c | 30 + .../AmdPspFlashAccSpiNorLibSmm.c | 15 + .../PspRomArmorWhitelistLib.c | 12 + .../Addendum/Oem/OobPprDxe/OobPprDxe.c | 36 + .../Dxe/PspPlatformDriver/PspPlatformDriver.c | 20 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.c | 22 + .../AmdAutoDynamicCommand.c | 44 + .../AmdAutoDynamicCommand/AmdAutoToolApp.c | 36 + .../BasePlatformHookLibAmdFchUart.c | 29 + .../FchSongshanDxe/FchSongshanI2C_I3C.asl | 9 + .../AMD/AgesaPkg/Include/AmdUefiStackNasm.inc | 13 + .../Library/RiscVOpensbiLib/opensbi | 2 +- 152 files changed, 19669 insertions(+), 1 deletion(-) create mode 100644 Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec create mode 100644 Platform/AMD/AgesaPkg/AgesaPkg.dec create mode 100755 Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf create mode 100755 Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf create mode 100755 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf create mode 100644 Platform/AMD/AgesaModulePkg/Include/AGESA.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AMD.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Filecode.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Gnb.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbDxio.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h create mode 100755 Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h create mode 100644 Platform/AMD/AgesaPkg/Include/AmdSoc.h create mode 100644 Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h create mode 100644 Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h create mode 100644 Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c create mode 100644 Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl create mode 100644 Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc diff --git a/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec new file mode 100644 index 0000000000..d35a1f27b4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec @@ -0,0 +1,39 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Common Module Package DEC +# file. +# This file provides the minimum AMD SoC/Mircoporcessor definitions for building +# AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCommonPkg + PACKAGE_GUID = 6CBE6566-0D3F-4E35-8358-9602354E9F09 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = {0x7788adf0, 0x9788, 0x4a3f, {0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd}} + gAgesaConfigDbPointerVariableGuid = {0x21229d24, 0xc71d, 0x4bc0, {0xb6, 0x3e, 0x67, 0x2f, 0x6d, 0xbf, 0x5f, 0xf7}} + gAmdMemoryInfoHobGuid = {0x1bce3d14, 0xa5fe, 0x4a0b, {0x9a, 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}} + +[Protocols] + ## Soc Protocols + gAmdSocLogicalIdProtocolGuid = {0x72f8e409, 0x0d2a, 0x4b91, {0x88, 0x6f, 0xba, 0x13, 0x44, 0x9f, 0xd7, 0x78}} + gAmdOemOobPprDxeProtocolGuid = {0x78031be3, 0x54a2, 0x4819, {0xb5, 0xba, 0x32, 0x79, 0x04, 0xf3, 0xa8, 0x41}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxSocketSupportedV2|2|UINT8|0x00002002 # 2 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDiePerSocketV2|1|UINT8|0x00002003 # 1 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxChannelPerDieV2|8|UINT8|0x00002004 # 8 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDimmPerChannelV2|2|UINT8|0x00002005 # 2 by default + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdS3LibTableSize|0x4000|UINT64|0x00027003 + diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec new file mode 100644 index 0000000000..1637068432 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec @@ -0,0 +1,18 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaEdk2Pkg + PACKAGE_GUID = E866104F-D458-41B1-AB26-FA5951618A8C + PACKAGE_VERSION = 0.1 + +[Includes] + Include/AmdEdk2 + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec new file mode 100755 index 0000000000..b84fe5b738 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec @@ -0,0 +1,20 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Core Complex package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCcxPkg + PACKAGE_GUID = df325429-029e-40f0-82db-0e69be7f6560 + PACKAGE_VERSION = 0.1 + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdCcxSingleBitErrLogging|FALSE|BOOLEAN|0x000CC029 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec new file mode 100755 index 0000000000..57db15e663 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec @@ -0,0 +1,25 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Data Fabric package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaDfPkg + PACKAGE_GUID = 81e51ee3-c347-4563-92fe-790ba953bf0f + PACKAGE_VERSION = 0.1 + +[Guids] + gAmdTotalNumberOfRootBridgesGuid = {0xfb5703f5, 0xf8a7, 0xf401, {0x18, 0xb4, 0x3f, 0x10, 0x8d, 0xeb, 0x26, 0x12}} + gAmdResourceSizeForEachRbGuid = {0x542b8f2f, 0xbd52, 0x4233, {0x8c, 0x3d, 0x66, 0x53, 0x0d, 0xe8, 0xa3, 0x69}} + +[Protocols] + gAmdFabricNumaServices2ProtocolGuid = {0xa8ff2e64, 0xf319, 0x4af1, {0x9e, 0xc8, 0x18, 0x89, 0x89, 0xc3, 0x1e, 0x4a}} + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec new file mode 100644 index 0000000000..521957e809 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec @@ -0,0 +1,62 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Fusion Control Hub package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 1.5 + PACKAGE_NAME = AgesaFchPkg + PACKAGE_GUID = e47c8ed9-3000-4e6e-b1c6-875b365b3849 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = { 0x7788adf0, 0x9788, 0x4a3f, { 0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd } } + +[Protocols] + gFchInitDonePolicyProtocolGuid = { 0xc63c0c73, 0xf612, 0x4c02, { 0x84, 0xa3, 0xc6, 0x40, 0xad, 0x0b, 0xa6, 0x22 } } + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLegacyFree|FALSE|BOOLEAN|0x0003F001 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetEnable|TRUE|BOOLEAN|0x0003F002 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetMsiDis|TRUE|BOOLEAN|0x0003F003 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdResetMode|0x00|UINT8|0x0003F00D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdNoneSioKbcSupport|FALSE|BOOLEAN|0x0003F021 + + ### @brief This item allows the customer to change OC signal polarity to be active low. This is universal and applies to all OC pins. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE)At present, this control applies to Family17h Model 00h-2Fh. + ### @li TRUE - OC pin is low when OC occurs. + ### @li FALSE - OC pin is high when OC occurs. + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciOcPolarityCfgLow|FALSE|BOOLEAN|0x0003F309 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb20OcPinSelect|0xFFFFFFFFFFFFFFFF|UINT64|0x0003F340 + #Die 0 + #[7:0] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 2.0 ports on XHCI controller 1 + #[23:0] MTS -- 6 USB 2.0 ports on XHCI controller 0 + #Die 1 + #[39:32] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[47:40] SSP -- 2 USB 2.0 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb31OcPinSelect|0xFFFFFFFF|UINT32|0x0003F341 + #Die 0 + #[7:0] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 3.1 ports on XHCI controller 1 + #[15:0] MTS -- 4 USB 3.1 ports on XHCI controller 0 + #Die 1 + #[23:16] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[31:24] SSP -- 2 USB 3.1 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLpcEnable|TRUE|BOOLEAN|0x0003F400 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdUsbRSOemConfigurationTable|{0x0}|VOID*|0x0003F40A + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciSsid|0x00000000|UINT32|0x0003FF07 + gEfiAmdAgesaModulePkgTokenSpaceGuid.FchRTDeviceEnableMap|0x00000000|UINT32|0x0003FF81 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec new file mode 100644 index 0000000000..721d3ea73b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec @@ -0,0 +1,26 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Memory package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaMemPkg + PACKAGE_GUID = 445f7303-3171-428c-ad0b-32df4474a7ad + PACKAGE_VERSION = 0.1 + +[Includes] + Include/ + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries|64|UINT32|0x00029001 + + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec new file mode 100755 index 0000000000..0501774c9b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec @@ -0,0 +1,34 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD North Bridge I/O package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaNbioPkg + PACKAGE_GUID = 1486f0fe-39ee-4856-a39f-222ff2404f26 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Protocols] + gAmdNbioPcieServicesProtocolGuid = {0x756db75c, 0xbb9d, 0x4289, {0x81, 0x3a, 0xdf, 0x21, 0x5, 0xc4, 0xf8, 0xe}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIommuMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021100 #///< 1: Enable Iommu MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021101 #///< 1: Enable Ioapic MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdPreDefineEn|FALSE|BOOLEAN|0x00021102 #///< TRUE: Enable assign IOAPIC ID at PEI phase + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdBase|0xF1|UINT8|0x00021103 #///< Base NBIO IOAPIC ID. ID assigned start from this value + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgGnbIoapicId|0|UINT8|0x0004101D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgFchIoapicId|0|UINT8|0x0004101E + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdSmuFeatureControlDefinesExt|0x0|UINT32|0x00041200 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec new file mode 100644 index 0000000000..41cf320c76 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec @@ -0,0 +1,29 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Platform Security Processor package definitions +# for building AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPspPkg + PACKAGE_GUID = 5c48f900-a98c-431f-8be5-19c09c65bb05 + PACKAGE_VERSION = 0.1 + +[Guids] + gApSyncFlagNvVariableGuid = { 0xad3f6761, 0xf0a3, 0x46c8, { 0xa4, 0xcb, 0x19, 0xb7, 0x0f, 0xfd, 0xb3, 0x05 } } + gAmdPspApobHobGuid = { 0x30b174f3, 0x7712, 0x4cca, { 0xbd, 0x13, 0xd0, 0xb8, 0xa8, 0x80, 0x19, 0x97 } } + +[Protocols] + gPspFlashAccSmmCommReadyProtocolGuid = { 0x9f373486, 0xda76, 0x4c9f, { 0x81, 0x55, 0x6c, 0xcd, 0xdb, 0x0b, 0x0b, 0x04 } } + gAmdPspFtpmProtocolGuid = { 0xac234e04, 0xb036, 0x476c, { 0x91, 0x66, 0xbe, 0x47, 0x52, 0xa0, 0x95, 0x09 } } + +[Ppis] + gAmdPspFtpmPpiGuid = { 0x91774185, 0xf72d, 0x467e, { 0x93, 0x39, 0xe0, 0x08, 0xdb, 0xae, 0x0e, 0x14 } } + gAmdPspFtpmFactoryResetPpiGuid = { 0x9c98130a, 0x8921, 0x45eb, { 0x86, 0xf3, 0x16, 0x04, 0x35, 0xc7, 0xc6, 0x40 } } diff --git a/Platform/AMD/AgesaPkg/AgesaPkg.dec b/Platform/AMD/AgesaPkg/AgesaPkg.dec new file mode 100644 index 0000000000..9377c64cc3 --- /dev/null +++ b/Platform/AMD/AgesaPkg/AgesaPkg.dec @@ -0,0 +1,435 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Package DEC +# file. +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPkg + PACKAGE_GUID = DABFEFC6-5A79-444b-862A-1F6FE9F561FE + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaPkgTokenSpaceGuid = { 0xd4d8435f, 0xfffb, 0x4acb, { 0xa0, 0x4d, 0xff, 0x0f, 0xad, 0x67, 0x7f, 0xe9 } } + +[Protocols] + gAmdNbioCxlServicesProtocolGuid = {0x125CCFCE, 0x34AF, 0x422C, {0xB3, 0xB3, 0x71, 0x23, 0xA3, 0x1E, 0xC8, 0x61}} + gAmdPciResourceProtocolGuid = {0x663d4897, 0xed94, 0x4f0f, {0x86, 0x64, 0xfe, 0xdc, 0x70, 0x30, 0x7f, 0x19}} + gAmdCapsuleSmmHookProtocolGuid = {0x4fc43bbe, 0x1433, 0x4951, {0xac, 0x2d, 0x0d, 0x01, 0xfe, 0xc0, 0x0e, 0xb1}} + gAmdFspSetupTableInitDoneGuid = {0xef5394c6, 0x566d, 0x440f, {0x9d, 0x05, 0xc0, 0xa3, 0x2c, 0xb9, 0x33, 0x58}} + +[Ppis] + gAmdMemoryInfoHobPpiGuid = {0xba16e587, 0x1d66, 0x41b7, {0x9b, 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}} + gCapsuleUpdateDetectedPpiGuid = {0x745dfc73, 0xc401, 0x4ced, {0x8d, 0x3b, 0x1a, 0x82, 0xf3, 0xda, 0xdc, 0xf8}} + +[PcdsFixedAtBuild] + + ### @brief Enable EDK-II Protocols + ### @details This item enables support for EDKII implementation of ACPI Protocols when set to TRUE + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCompliantEdkIIAcpiSdtProtocol|TRUE|BOOLEAN|0x00020006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize |0x1000|UINT32|0x00020007 + + ### @brief assign non volatile storage base address + ### @details This assigns the base address to map to flash deivce. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress|0xFF000000|UINT32|0x00020017 + +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH.h" +#---------------------------------------------------------------------------- + + ### @name General FCH Controls + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1 register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0400) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1EvtBlkAddr|0x400|UINT16|0x0002F004 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1Cnt register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0404) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1CntBlkAddr|0x404|UINT16|0x0002F005 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM Timer as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0408) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPmTmrBlkAddr|0x408|UINT16|0x0002F006 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI CPU Control block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0410) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgCpuControlBlkAddr|0x410|UINT16|0x0002F007 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI GPE0 register block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0420) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiGpe0BlkAddr|0x420|UINT16|0x0002F008 + + ### @brief This item defines the SMI command value sent by the host BIOS during the S3 resume sequence, to re-initialize the + ### FCH registers. This must be issued before the platform driver restore function is started. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD3) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemBeforePciRestoreSwSmi|0xD3|UINT8|0x0002F010 + + ### @brief This item defines the SMI command used by the host BIOS to signal the FCH driver that the platform driver has + ### completed its restore function. This allows the FCH driver to perform some final FCH settings. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD4) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemAfterPciRestoreSwSmi|0xD4|UINT8|0x0002F011 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to activate ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemEnableAcpiSwSmi|0xA0|UINT8|0x0002F012 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to turn off ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA1) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemDisableAcpiSwSmi|0xA1|UINT8|0x0002F013 + + ### @brief SMI command used for releasing the SPI controller lock mode. All devices on the SPI bus will be writable. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAA) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiUnlockSwSmi|0xAA|UINT8|0x0002F014 + + ### @brief SMI command for setting the lock mode in the SPI controller. This will effectively provide a write protection to the + ### SPI Flash ROM; however, write access to secondary SPI devices will also be blocked. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAB) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiLockSwSmi|0xAB|UINT8|0x0002F015 +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH-IRQ.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart0Irq|0x03|UINT8|0x0002F01A + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart1Irq|0x0E|UINT8|0x0002F01B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart2Irq|0x05|UINT8|0x0002F01C + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart3Irq|0x0F|UINT8|0x0002F01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart4Irq|0x10|UINT8|0x0002F01E + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c0Irq|0x0A|UINT8|0x0002F01F + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c1Irq|0x0B|UINT8|0x0002F020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c2Irq|0x04|UINT8|0x0002F021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c3Irq|0x06|UINT8|0x0002F022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c4Irq|0x16|UINT8|0x0002F023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c5Irq|0x17|UINT8|0x0002F024 +#- DF Fixed PCDs +#- +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + #Fabric + + ### @name General DF Controls + + ### @brief This item informs the SMBios generation code as to how many physical processor sockets exist in the system and + ### therefore how many Type 4 SMBios records to produce. + ### @brief Permitted Choices: (Type: Value)(Default: 0x01) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdNumberOfPhysicalSocket|1|UINT8|0x000CC103 +#---------------------------------------------------------------------------- +#- CCX Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-MTRR.h" +#---------------------------------------------------------------------------- + + + ### @brief The base address of temporary page table for accessing PCIE MMIO base address above 4G in PEI phase. + ### @brief Permitted Choices: 0x0 - 0xFFFFFFFF (Type: Value)(Default: 0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPeiTempPageTableBaseAddress|0|UINT32|0x000CC11B + +#---------------------------------------------------------------------------- +#- CCX ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-ACPI.h" +#---------------------------------------------------------------------------- + #ACPI + # Cpu SSDT + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName0|0x43|UINT8|0x000AC001 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName1|0x30|UINT8|0x000AC002 + ### @brief This element specifies whether the ACPI _PSS objects are defined in the system bus or processor scope. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li TRUE - The objects will be under the \_SB scope. + ### @li FALSE - The objects will be under the \_PR scope + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeInSb|FALSE|BOOLEAN|0x000AC003 + + ### @brief Set the OEM ID field in ACPI table outputs to this string. The string must conform to the ACPI rules for the OEM ID field. + ### @brief Permitted Choices: (Type: Value)(Default: "AMD") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiTableHeaderOemId|"AMD"|VOID*|0x000AC004 + +#---------------------------------------------------------------------------- +#- CCX SMBIOS Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-SMBIOS.h" +#---------------------------------------------------------------------------- + + ### @name CCX SMBIOS Controls + + ### @brief When creating the SMBios table entry, use this as the label for the processor socket. This should match the + ### silkscreen label on the motherboard. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket0|"Unknown"|VOID*|0x00001001 + + ### @brief When creating the SMBios table entry, use this as the value for the 'serial number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket0|"Unknown"|VOID*|0x00001002 + + + ### @brief When creating the SMBios table entry, use this as the value for the 'Asset Tag' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket0|"Unknown"|VOID*|0x00001003 + + ### @brief When creating the SMBios table entry, use this as the value for the 'Part Number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket0|"Unknown"|VOID*|0x00001004 + + ### @brief SMBios socket 1 Label. + ### @details When creating the SMBios table entry, use this as the label for the + ### processor socket. This should match the silkscreen label on the motherboard. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket1|"Unknown"|VOID*|0x00001005 + + ### @brief SMBIOS socket 1 Serial Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'serial number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket1|"Unknown"|VOID*|0x00001006 + + ### @brief SMBios socket 1 Asset Tag. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Asset Tag' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket1|"Unknown"|VOID*|0x00001007 + + ### @brief Socket 1 Part Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Part Number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket1|"Unknown"|VOID*|0x00001008 + +#---------------------------------------------------------------------------- +#- ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-ACPI.h" +#---------------------------------------------------------------------------- + + ### @name General ACPI Controls + + ### @brief PCD supporting maximum capacity for Type 16 table + ### @details This PCD represents maximum memory capacity in KB + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT16MaximumCapacity|0x04000000|UINT32|0x00001009 # 4G - 0x00400000 + # 8G - 0x00800000 + # 16G - 0x01000000 + # 32G - 0x02000000 + # 64G - 0x04000000 + # 128G - 0x08000000 + # 256G - 0x10000000 + # 512G - 0x20000000 +[PcdsDynamic] +#---------------------------------------------------------------------------- +# System level Dynamic PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCStateIoBaseAddress|0x413|UINT16|0x000CC002 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdt|TRUE|BOOLEAN|0x000CC00B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdApicMode|0xFF|UINT8|0x000CC01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCpuWdtEn|TRUE|BOOLEAN|0x000CC200 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerInSb|FALSE|BOOLEAN|0x000CC50B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerName|"PLTF"|VOID*|0x000CC50C + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCcxCfgPFEHEnable|FALSE|BOOLEAN|0x000CC601 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT4CpuMaxSpeed|0|UINT16|0x000CC900 +#---------------------------------------------------------------------------- +#- DF Dynamic PCDs +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + + ### @cond (FF3||RN||BA||ZP||RMB||RPL||RS||SSP||MI3||BRH) + ### @brief Specifies the top address to be used for MMIO space allocations. No MMIO space will be used above this limit. Some devices have limits on the address space they + ### are able to access. For example a device with a 40-bit address limitation can not use MMIO space above 1TeraByte (1T). By setting this PCD to 0x10000000000 (1T), MMIO + ### space would not be allocated above 1T. The default is to use all of the space above the end of physical memory. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMmioAbove4GLimit|0xFFFFFFFFFFFFFFFF|UINT64|0x0003FFC2 + ### @endcond + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFabricResourceDefaultSizePtr|0|UINT64|0x00DF0000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgSmiCmdPortAddr|0xB0|UINT16|0x0003FFC0 + + ### I2C-0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c0SdaHold|0x00000035|UINT32|0x000FC000 + ### I2C-1 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c1SdaHold|0x00000035|UINT32|0x000FC001 + ### I2C-2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c2SdaHold|0x00000035|UINT32|0x000FC002 + ### I2C-3 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c3SdaHold|0x00000035|UINT32|0x000FC003 + ### I2C-4 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c4SdaHold|0x00000035|UINT32|0x000FC004 + ### I2C-5 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c5SdaHold|0x00000035|UINT32|0x000FC005 + ### @} end of I2C hold times + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-UART.h" +#---------------------------------------------------------------------------- + ### @name UART Legacy IO Assignments + ### @{ + ### @brief These controls allow the platform to specify the legacy IO ranges that are to be used by the UART ports in the processor. Permitted Choices: (Type: value)(Default: Disabled) + ### @li 0 - Disabled + ### @li 1 - IO range 0x02E8 - 0x02EF + ### @li 2 - IO range 0x02F8 - 0x02FF + ### @li 3 - IO range 0x03E8 - 0x03EF + ### @li 4 - IO range 0x03F8 - 0x03FF + + + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart0LegacyEnable|0x00|UINT8|0x000FC010 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart1LegacyEnable|0x00|UINT8|0x000FC011 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart2LegacyEnable|0x00|UINT8|0x000FC012 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart3LegacyEnable|0x00|UINT8|0x000FC013 + ### @} end UART Legacy IO assignments + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-USB.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci0Enable|TRUE|BOOLEAN|0x000FC020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci1Enable|TRUE|BOOLEAN|0x000FC021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci2Enable|TRUE|BOOLEAN|0x000FC022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci3Enable|TRUE|BOOLEAN|0x000FC023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhciECCDedErrRptEn|FALSE|BOOLEAN|0x000FC024 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataEnable|TRUE|BOOLEAN|0x000FC030 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataStaggeredSpinup|FALSE|BOOLEAN|0x000FC039 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdNvdimmEnable|FALSE|BOOLEAN|0x000A6024 + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO-BMC.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkTraining|FALSE|BOOLEAN|0x0004F004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkSocket|0xFF|UINT8|0x0004F005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkDie|0xFF|UINT8|0x0004F006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkLaneNum|0|UINT8|0x0004F03E + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgIommuSupport|TRUE|BOOLEAN|0x0004F027 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdIvInfoDmaReMap|FALSE|BOOLEAN|0x0004F028 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrVddfull_Scale_Current|0x00|UINT32|0x0004F0A0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrSocfull_Scale_Current|0x00|UINT32|0x0004F0A2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityLo|0x4|UINT32|0x0004F210 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityHi|0x30011|UINT32|0x0004F211 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlProtocolErrorReporting|0|UINT8|0x0004F362 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlComponentErrorReporting|0|UINT8|0x0004F363 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs DYNAMIC + + ### @brief This feature selects the APCB recovery support on x86 side. If or when an instance of a writable APCB is determined to be invalid, the PSP driver will + ### attempt a 'recovery' by copying the recovery instance of the APCB (default values as indicated in the APCB descriptor files). Upon boot up, the ABL reads CMOS + ### bytes 06/07 at index/data port of 0x72/0x73. If the CMOS flag reads anything else other than 0xA55A or 0x5555, the system boots in APCB recovery mode, in which + ### ABL consumes the recovery instances of APCB. Otherwise it boots in normal/non-recovery mode. + ### @brief Permitted Choices: (Type: Boolean)(Default: TRUE) + ### @brief This feature is affected by the platform CMOS power design. Please see Platform CMOS power . + ### @li TRUE - the AGESA PSP driver restores the APCB instances from the recovery instance, writes 0xA55A to the CMOS location and triggers a reset . The next time + ### the system powers up, ABL runs in normal/non-recovery mode. + ### @li FALSE - the AGESA PSP driver writes 0x5555 to the CMOS location without restoring the APCB instances or triggering a reset. In this mode the additional reset + ### is avoided at the potential risk of the writeable APCB instance being left corrupted forever. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspApcbRecoveryEnable|TRUE|BOOLEAN|0x95940008 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspAntiRollbackLateSplFuse|FALSE|BOOLEAN|0x95940018 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemPostPackageRepair|TRUE|BOOLEAN|0x00030004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemBootTimePostPackageRepair|TRUE|BOOLEAN|0x00030005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemRuntimePostPackageRepair|FALSE|BOOLEAN|0x00030006 +[PcdsDynamicEx] + +[PcdsFixedAtBuild, PcdsDynamic] +#---------------------------------------------------------------------------- +#- System control PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + ### @brief Switch for Debug Print function + ### @details Switch for Debug Print function to enable or not. + ### @li TRUE: Enable IdsDebugPrint output + ### @li FALSE: Disable IdsDebugPrint output + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEnable|FALSE|BOOLEAN|0x00020004 + ### @brief Specify the filter for IdsDebugPrint + ### @details When the filter values are matched, the AmdIdsDebugPrint can start to print debug message. + ### Refer Library/IdsLib.h for details, and the Master token is PcdAmdIdsDebugPrintEnable. + ### @li 0x100401008A30042C: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | MEM_STATUS | MEM_PMU | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + ### @li 0x100401008A300408: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintFilter|0x100401030A300408|UINT64|0x00020005 + ### @brief Switch for Serial port support of AGESA debug print + ### @details Switch for Serial port support of AGESA debug print, NOTE, AGESA will not init the serial port, + ### serial port should be initialized before call AGESA debug print. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortEnable|FALSE|BOOLEAN|0x00020009 + ### @brief The serial port used for debug output can be either 2-wire (Rx/Tx) or 4-wire (adding DSR/CTS). Waiting for CTS on a + ### 2-wire port would cause a hang. This control is added to check the cable connection. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li FALSE - Presume a 2-wire port and do not wait for CTS. + ### @li TRUE - Wait for both DSR and CTS to be set. DSR is set if a cable is connected. CTS is set if it is ok to transmit data. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortDetectCableConnection|FALSE|BOOLEAN|0x0002000A + + ### @brief Selection of UART and UART Legacy IO Serial port for AGESA debug print + ### @details Selection of UART and UART Legacy IO Serial port for AGESA debug print and invisible in ACPI name space. + ### @li Bit[0]: Select UART0 for AGESA debug print + ### @li Bit[1]: Select UART1 for AGESA debug print + ### @li Bit[2]: Select UART2 for AGESA debug print + ### @li Bit[3]: Select UART3 for AGESA debug print + ### @li Bit[4]: Select UART4 for AGESA debug print + ### @li Bit[8]: Select UART0 Legacy IO for AGESA debug print + ### @li Bit[9]: Select UART1 Legacy IO for AGESA debug print + ### @li Bit[10]: Select UART2 Legacy IO for AGESA debug print + ### @li Bit[11]: Select UART3 Legacy IO for AGESA debug print + ### @li Bit[15]: Set debug print serial port to invisible in ACPI name space at OS runtime + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortSelect|0x0000|UINT16|0x0002718A + + ### @brief Specify the IO port for serial out + ### @details ESPI or LPC COM1: 0x3F8, COM2: 0x2F8, COM3: 0x3E8, COM4: 0x2E8, + ### UART0: 0xFEDC9000, UART1: 0xFEDCA000, UART2: 0xFEDCE000, UART3: 0xFEDCF000, UART4: 0xFEDD1000. + ### @li If it's IO port: it must < 0x10000 + ### @li If it's Memory: it must >= 0x10000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPort|0x3F8|UINT64|0x0002000B + + ### @brief Debug Print Emulation Auto Detect + ### @details Auto detect emulation platform to instead of PcdAmdIdsDebugPrintRedirectIOEnable and + ### PcdAmdIdsDebugPrintSerialPortEnable. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEmulationAutoDetect|FALSE|BOOLEAN|0x00020016 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgPlatformPPT|0|UINT32|0x0004F111 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs + + ### @brief Rom Armor selection + ### @details Rom Armor selection + ### @li 0: Rom Armor is disabled + ### @li 1: Rom Armor 1 is enabled (VMR/MTS/CPK) + ### @li 2: Rom Armor 2 is enabled (RN/CZN) + ### @li 3: Rom Armor 3 is enabled (CGL, RMB and later) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspRomArmorSelection|0|UINT8|0x95940054 + + + + ### @brief System TPM config Value + ### @details System TPM config Value, SBIOS needs to set the value in PEI phase. + ### @li 0x0: dTPM + ### @li 0x1: PSP fTPM + ### @li 0x2: HSP fTPM + ### @li 0xFF: no TPM + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmConfig|0xFF|UINT8|0x95940024 + + ### @cond !BRH + ### @brief TPM SMx algorithm flag + ### @details TPM SMx algorithm flag, SBIOS needs to set the value in PEI phase. + ### @li 0: SM2, SM3 or SM4 crypto algorithms not supported + ### @li 1: SM2, SM3 or SM4 crypto algorithms supported + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmAlgSmx|0|UINT8|0x95940025 + ### @endcond diff --git a/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec new file mode 100755 index 0000000000..c8c474637f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec @@ -0,0 +1,41 @@ +## @file +# AMD Common Platform Module (CPM) Module Package DEC. +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = CpmPkg + PACKAGE_GUID = ABE128BA-1061-4A53-A1B8-D07329AA7A67 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + Library + +[Guids] + gAmdCpmPkgTokenSpaceGuid = {0x916e0ddd, 0x2bd2, 0x4704, {0x93, 0xb9, 0x59, 0x4b, 0x01, 0xa5, 0xfa, 0x9f}} + gShellActHiiGuid = {0x340EBE97, 0x3C1C, 0x4272, {0x9C, 0xCE, 0xC1, 0xFF, 0x86, 0x6F, 0x73, 0x3C}} + gAmdPbsSystemConfigurationGuid = {0xa339d746, 0xf678, 0x49b3, {0x9f, 0xc7, 0x54, 0xce, 0x0f, 0x9d, 0xf2, 0x26}} + +[Protocols] + gAmdCpmTableProtocolGuid = { 0x3724cf01, 0x00c2, 0x9762, {0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 }} + gAmdCpmAllPciIoProtocolsInstalledProtocolGuid = { 0x676D7012, 0x139B, 0x485A, {0x96, 0xF1, 0x98, 0x6F, 0xC4, 0x8A, 0x86, 0x4B }} + +[Ppis] + gAmdCpmTablePpiGuid = { 0xd71cf893, 0xa8b5, 0x49d3, { 0xa2, 0x1b, 0x31, 0xe2, 0xf5, 0xc4, 0xa7, 0x47 } } + +[PcdsFixedAtBuild] + gAmdCpmPkgTokenSpaceGuid.PcdFchUartPort|2|UINT8|0x00000052 + + #ACPI + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiHestTableHeaderOemTableId|"AMD HEST"|VOID*|0x000AC001 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiBertTableHeaderOemTableId|"AMD BERT"|VOID*|0x000AC002 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiEinjTableHeaderOemTableId|"AMD EINJ"|VOID*|0x000AC003 + + gAmdCpmPkgTokenSpaceGuid.UsePciXAslName|FALSE|BOOLEAN|0x12000003 + gAmdCpmPkgTokenSpaceGuid.AcpiRestoreSwSmi|0xE3|UINT8|0x00000040 diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc new file mode 100644 index 0000000000..37b8d15cb1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc @@ -0,0 +1,18 @@ +## @file +# +# The DSC include file for edk2 package to pull in the necessary AGESA modules +# into build process. +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses] + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc new file mode 100644 index 0000000000..e7e05fd2d8 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc @@ -0,0 +1,48 @@ +## @file +# The AGESA DSC file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses.Common.PEIM] + + ## APCB + ApcbLibV3Pei|AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf + +[LibraryClasses.Common.DXE_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses.Common.DXE_SMM_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses] + # + # Agesa specific common libraries + # + + ## PSP Libs + AmdPspMboxLibV2|AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf + + ## DF Lib + BaseFabricTopologyLib|AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + SmnAccessLib|AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Fch Lib + FchBaseLib|AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf + +[Components.IA32] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf + +[Components.X64] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc new file mode 100644 index 0000000000..1f1e04c414 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc new file mode 100644 index 0000000000..2916fecb26 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc @@ -0,0 +1,11 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEFINE AGESA_PKG_PATH = AgesaModulePkg + DEFINE AGESA_PKG_DEC = AgesaCommonModulePkg diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf new file mode 100644 index 0000000000..9303d1fac4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf @@ -0,0 +1,11 @@ +## @file +# The AGESA DXE FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +## APCB V3 Dxe Drivers + INF AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf new file mode 100644 index 0000000000..0ef5a2a806 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf @@ -0,0 +1,9 @@ +## @file +# The AGESA PEI FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf new file mode 100644 index 0000000000..b790e4ead5 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf @@ -0,0 +1,10 @@ +## @file +# +# Platform Package Flash Description File +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf new file mode 100755 index 0000000000..8d3357bf56 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdCalloutLib + FILE_GUID = A8FEA621-B381-4c06-9E9D-0897EF78BD78 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdCalloutLib + + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf new file mode 100644 index 0000000000..1594a99265 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf @@ -0,0 +1,30 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspMboxLibV2 + FILE_GUID = B9E57A31-CAB0-4CEE-9D50-9D43E2EEAA44 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspMboxLibV2 + +[Sources.common] + AmdPspMboxLibV2.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PciLib + SmnAccessLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf new file mode 100644 index 0000000000..c685a26604 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLib + FILE_GUID = 55871F80-4658-6EF3-A8AC-15B34FF8C2CE + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLib + +[Sources.common] + AmdPspRomArmorLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf new file mode 100644 index 0000000000..a3906dc13e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLibNull + FILE_GUID = 7351EAC0-4587-FED8-2788-BF9DA2ADCA6E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLibNull + +[Sources.common] + AmdPspRomArmorLibNull.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf new file mode 100644 index 0000000000..09d5bd38ac --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf @@ -0,0 +1,37 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3 + FILE_GUID = C7932467-DF16-4C7A-A32A-3E6F50213E68 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3 | DXE_DRIVER DXE_SMM_DRIVER DXE_RUNTIME_DRIVER DXE_CORE SMM_CORE UEFI_DRIVER + +[Sources.common] + ApcbLibV3.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSmmReadyToLockProtocolGuid + +[Pcd] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf new file mode 100644 index 0000000000..c031d00d79 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3Pei + FILE_GUID = EEA4E007-E408-4daa-82BD-4C52E7058753 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3Pei|PEIM + +[Sources.common] + ApcbLibV3Pei.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PcdLib + BaseMemoryLib + PeiServicesLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf new file mode 100644 index 0000000000..38a72e26b7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf @@ -0,0 +1,28 @@ +## @file +# +# For EDKII use Only +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseFabricTopologyRsLib + FILE_GUID = D0A070DD-630A-43F8-9D76-EAAABDDE5FB9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseFabricTopologyLib + CONSTRUCTOR = BaseFabricTopologyLibConstructor + +[Sources] + BaseFabricTopologyRsLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + +[LibraryClasses] + BaseLib diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf new file mode 100644 index 0000000000..d15d8169fe --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf @@ -0,0 +1,35 @@ +## @file +# Base Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseTscTimerLib + FILE_GUID = D29338B9-50FE-4e4f-B7D4-A150A2C1F4FB + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + BaseTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf new file mode 100644 index 0000000000..1e52768a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf @@ -0,0 +1,42 @@ +## @file +# Dxe Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeTscTimerLib + FILE_GUID = 95ab030f-b4fd-4ee4-92a5-9e04e87634d9 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE + + CONSTRUCTOR = DxeTscTimerLibConstructor + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + DxeTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + PcdLib + BaseLib + UefiLib + DebugLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf new file mode 100644 index 0000000000..b1eaefd282 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf @@ -0,0 +1,37 @@ +## @file +# Pei Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiTscTimerLib + FILE_GUID = 342C36C0-15DF-43b4-9EC9-FBF748BFB3D1 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|PEIM PEI_CORE + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + PeiTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + HobLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf new file mode 100644 index 0000000000..f60f97905a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf @@ -0,0 +1,42 @@ +## @file +# Library instance of PciHostBridgeLib library class for coreboot. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciHostBridgeLib + FILE_GUID = 74967FD7-A9A4-4B16-8B41-B26BC3230D0A + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciHostBridgeLib + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + PciHostBridgeLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseMemoryLib + PciHostBridgeLib + DevicePathLib + MemoryAllocationLib + DebugLib + UefiBootServicesTableLib diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf new file mode 100644 index 0000000000..2a72fa8117 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf @@ -0,0 +1,47 @@ +## @file +# +# Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmlGenerationLib + FILE_GUID = 8F62C8D1-B67F-4AFB-9179-54384F1A6163 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmlGenerationLib | DXE_DRIVER UEFI_DRIVER HOST_APPLICATION + +[Sources.common] + LocalAmlObjects.h + LocalAmlObjects.c + LocalAmlLib.h + AmlAssistFunctions.c + AmlObjectsDebug.c + AmlNameString.c + AmlDataObjects.c + AmlNamespaceModifierObjects.c + AmlPkgLength.c + AmlNamedObject.c + AmlTable.c + AmlStatementOpcodes.c + AmlResourceDescriptor.c + AmlExpressionOpcodes.c + AmlArgObjects.c + AmlLocalObjects.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf new file mode 100644 index 0000000000..e63a70e849 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchBaseLib + FILE_GUID = 4108287a-c864-4427-b2c3-bd0e91a83abd + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchBaseLib + +[Sources.common] + FchStallLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + PciSegmentLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf new file mode 100644 index 0000000000..e422cb69a4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf @@ -0,0 +1,35 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = BaseResetSystemLib + FILE_GUID = e669c365-2df2-4540-a343-afec4e85b198 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseResetSystemLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + FchBaseResetSystemLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PrintLib + IoLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf new file mode 100644 index 0000000000..d7f49c40de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchEspiCmdLib + FILE_GUID = 89671327-a620-43e9-93b1-d1da79a50392 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchEspiCmdLib + +[Sources.common] + FchEspiCmdLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + IoLib + FchBaseLib + + + + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf new file mode 100755 index 0000000000..f32bbc9ff2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf @@ -0,0 +1,24 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioHandleLib + FILE_GUID = DC4639D3-DB75-486B-AC38-C84AA49601E3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioHandleLib + +[Sources] + NbioHandleLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf new file mode 100755 index 0000000000..0d6ba605f5 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf @@ -0,0 +1,25 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PcieConfigLib + FILE_GUID = C1205AD2-FE67-4502-A0A7-FB1704A3F9AE + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PcieConfigLib + +[Sources] + PcieConfigLib.c + PcieInputParserLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf new file mode 100644 index 0000000000..ae1dd6cd83 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = SmnAccessLib + FILE_GUID = 9B7FF4FA-9DB5-4fec-BF71-B13D8A14A51E + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmnAccessLib + +[Sources] + SmnAccessLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + PrintLib + BaseLib + DebugPrintErrorLevelLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf new file mode 100644 index 0000000000..da7f5c185d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioCommonDxeLib + FILE_GUID = 1BF93335-5D55-46D9-99D9-5D962F039829 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioCommonDxeLib + +[Sources] + DxeLibFunctions.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + BaseLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf new file mode 100644 index 0000000000..54c3514020 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbDxeV3 + FILE_GUID = 4D3708A0-6D9B-47D3-AD87-E80C781BC0A7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3DxeDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + DxeServicesTableLib + MemoryAllocationLib + ApcbLibV3 + +[Sources] + ApcbV3Dxe.c + +[Protocols] + gEfiDxeSmmReadyToLockProtocolGuid + gEfiSmmCommunicationProtocolGuid + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf new file mode 100644 index 0000000000..7f90aa6ea0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbPeiV3 + FILE_GUID = E1B8CF4A-FE7B-4676-B4F7-50C7228282A4 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3PeiDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PeimEntryPoint + ApcbLibV3Pei + +[sources] + ApcbV3Pei.c + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf new file mode 100755 index 0000000000..0f115c362e --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = OemAgesaCcxPlatformLibNull + FILE_GUID = B1F58B07-0146-4804-B701-A56CB5716529 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = OemAgesaCcxPlatformLib + +[Sources.common] + OemAgesaCcxPlatformLibNull.c + +[Packages] + MdePkg/MdePkg.dec + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf new file mode 100644 index 0000000000..ba551e5c14 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf @@ -0,0 +1,61 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciCfg2 + FILE_GUID = 7A6DF3DB-1C0A-45C2-8251-AFE794D7D6B3 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = PeimInitializePciCfg + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC (EBC is for build only) +# + +[Sources] + PciExpressPciCfg2.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + + +[LibraryClasses] + PeimEntryPoint + BaseLib + PcdLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + HobLib + IoLib + +[Ppis] + gEfiPciCfg2PpiGuid ## PRODUCES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress + +[Pcd.IA32,Pcd.X64] + gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable ## SOMETIMES_CONSUMES + +[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64] + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES + +[Depex] + TRUE diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf new file mode 100644 index 0000000000..e712a80886 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciSegmentInfoLib + FILE_GUID = FA8B1082-88DF-4744-85A3-7F87A9EBF8DC + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciSegmentInfoLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + PciSegmentInfoLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + DebugLib + BaseLib diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf new file mode 100644 index 0000000000..f4b9d0d789 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspFlashAccLibSmm + FILE_GUID = 3BBDC3A5-A0E2-4E8A-8240-9E594920F040 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspFlashAccLib | DXE_SMM_DRIVER + +[Sources.common] + AmdPspFlashAccSpiNorLibSmm.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + AmdPspBaseLibV2 + BaseLib + DebugLib + SmmServicesTableLib + UefiBootServicesTableLib + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSpiSmmNorFlashProtocolGuid + +[Pcd] + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize ## CONSUMES + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress ## CONSUMES + +[Depex] + gEfiSmmBase2ProtocolGuid AND + gEfiSpiSmmNorFlashProtocolGuid + diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf new file mode 100644 index 0000000000..57bb0d9e25 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = PspRomArmorWhitelistLib + FILE_GUID = B6F8507A-C96B-4036-A8C0-26BAD6AC5F34 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformPspRomArmorWhitelistLib + +[Sources] + PspRomArmorWhitelistLib.c + +[Packages] + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseMemoryLib + MemoryAllocationLib + PcdLib + DebugLib + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf new file mode 100644 index 0000000000..64fd2913ad --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf @@ -0,0 +1,42 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = OobPprDxe + FILE_GUID = F91DCAB4-3639-11EE-BE56-0242AC120002 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = OobPprEntry + +[Sources] + OobPprDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DebugLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + MemoryAllocationLib + TimerLib + +[Protocols] + gEfiPciIoProtocolGuid #CONSUMES + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf new file mode 100644 index 0000000000..f4d7638c1a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PspPlatform + FILE_GUID = 28374747-76FF-41B3-9740-381EFAEF13BC + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = PspPlatformEntryPoint + +[Sources] + PspPlatformDriver.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + DebugLib + BaseLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf new file mode 100644 index 0000000000..973ace8632 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ServerHotplugDxe + FILE_GUID = FAFF8CA9-E515-44ed-B5F9-E2F6E5D902E3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = HotplugDescEntry + +[Sources] + ServerHotplugDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf new file mode 100644 index 0000000000..2d9dbeb715 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf @@ -0,0 +1,53 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoDynamicCommand + FILE_GUID = CCD8FEC8-1E30-45BD-8632-DB83A255FAC3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.1 + ENTRY_POINT = ActCommandInitialize + UNLOAD_IMAGE = ActLibraryUnregisterActCommand + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoDynamicCommand.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + UefiLib + FileHandleLib + HiiLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + +[Guids] + gShellActHiiGuid ## SOMETIMES_CONSUMES ## HII + gAgesaConfigDbPointerVariableGuid + +[Protocols] + gEfiShellDynamicCommandProtocolGuid + gEfiHiiPackageListProtocolGuid + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[DEPEX] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf new file mode 100644 index 0000000000..98c8755ab8 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf @@ -0,0 +1,50 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoToolApp + FILE_GUID = 470E1741-2DFE-43EF-861E-505CB3226DC0 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + ENTRY_POINT = ActCommandInitialize +# +# This flag specifies whether HII resource section is generated into PE image. +# + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoToolApp.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + FileHandleLib + HiiLib + MemoryAllocationLib + UefiApplicationEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + UefiLib + UefiRuntimeServicesTableLib + +[Protocols] + gEfiHiiPackageListProtocolGuid ## CONSUMES + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[Guids] + diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf new file mode 100644 index 0000000000..9c3c0dd0a9 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BasePlatformHookLibAmdFchUart + FILE_GUID = BF2F3F3F-4BE6-4B97-850D-D5D4941D391C + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformHookLib + +[Sources] + BasePlatformHookLibAmdFchUart.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + IoLib + PlatformHookLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Include/AGESA.h b/Platform/AMD/AgesaModulePkg/Include/AGESA.h new file mode 100644 index 0000000000..3ec03aafd3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AGESA.h @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AGESA_H_ +#define AGESA_H_ + +#include "AMD.h" +#include "SocLogicalId.h" + +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull +#define DESCRIPTOR_INITIALIZE_LIST 0x20000000ull + +/// PCIe link initialization +typedef enum { + EndpointDetect = 0, ///< Detect endpoint presence + EndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} PCIE_ENDPOINT_STATUS; + +/// PCIe port misc extended controls +typedef struct { + IN UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + IN UINT8 LinkSafeMode : 2; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through PCIe_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertise maximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 2; ///< Unused space +} PCIE_PORT_MISC_CONTROL; + +/// The IO APIC Interrupt Mapping Info +typedef struct { + IN UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + IN UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< - ABCD + ///< - BCDA + ///< - CDAB + ///< - DABC + IN UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< - Entry 0 of IO APIC redirection table + ///< - Entry 1 of IO APIC redirection table + ///< - Entry 31 of IO APIC redirection table +} APIC_DEVICE_INFO; + +/// GEN3 RxAdaptMode Configuration Structure +typedef struct { + IN BOOLEAN InitOffsetCancellation; ///< Initial Offset Cancellation Enable + IN UINT8 DFEControl; ///< DFE Control + IN UINT8 LEQControl; ///< LEQ Control + IN BOOLEAN DynamicOffsetCalibration; ///< Dynamic Offset Calibration Enable + IN BOOLEAN FOMCalculation; ///< FOM Calculation Enable + IN BOOLEAN PIOffsetCalibration; ///< PI Offset Calibratino Enable +} RX_ADAPT_MODE; + +/// PCIe port configuration data +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 ChannelType; ///< Channel type. + ///< 0 - "lowLoss", + ///< 1 - "highLoss", + ///< 2 - "mob0db", + ///< 3 - "mob3db", + ///< 4 - "extnd6db" + ///< 5 - "extnd8db" + IN UINT8 DeviceNumber; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 FunctionNumber; ///< Reserved for future use + IN UINT8 LinkSpeedCapability; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT8 ResetId; ///< Arbitrary number greater than 0 assigned by platform firmware for GPIO + ///< identification which control reset for given port. + ///< Each port with unique GPIO should have unique ResetId assigned. + ///< All ports use same GPIO to control reset should have same ResetId assigned. + ///< see AgesaPcieSlotResetContol. + IN UINT16 SlotNum; ///< Physical Slot Number + IN PCIE_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + IN PCIE_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + IN RX_ADAPT_MODE RxAdaptMode; ///< Gen3 RxAdaptMode configuration +} PCIE_PORT_DATA; + +/// PCIe Complex descriptor +typedef struct { + IN UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + IN UINT32 SocketId; ///< Socket Id + IN VOID *Reserved; ///< Reserved for future use +} PCIE_COMPLEX_DESCRIPTOR; + +/// VBIOS image info +typedef struct { + IN AMD_CONFIG_PARAMS StdHeader; ///< Standard configuration header + OUT VOID *ImagePtr; ///< Pointer to VBIOS image + IN PCI_ADDR GfxPciAddress; ///< PCI address of integrated graphics controller + IN UINT32 Flags; ///< BIT[0] - special repost requred +} GFX_VBIOS_IMAGE_INFO; + +// +// CPU MSR Register definitions +// +#define SYS_CFG 0xC0010010ul ///< Refer to AMD64 Architecture Programming manual. +#define TOP_MEM 0xC001001Aul ///< Refer to AMD64 Architecture Programming manual. +#define HWCR 0xC0010015ul ///< Refer to AMD64 Architecture Programming manual. + +/// +/// VDDP_VDDR Voltage Info for Low Power DIMM +/// +typedef struct _VDDP_VDDR_VOLTAGE { + IN BOOLEAN IsValid; ///< Indicates if daata is valid + IN UINT8 Voltage; ///< VDDP VDDR Voltage Value +} VDDP_VDDR_VOLTAGE; + +// CPU Build Configuration structures and definitions + +#define AMD_AP_MTRR_FIX64k_00000 0x00000250ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_80000 0x00000258ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_A0000 0x00000259ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C0000 0x00000268ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C8000 0x00000269ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_D0000 0x0000026Aul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_D8000 0x0000026Bul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E0000 0x0000026Cul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E8000 0x0000026Dul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F0000 0x0000026Eul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F8000 0x0000026Ful ///< Refer to AMD64 Architecture Programming manual + +#endif // AGESA_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AMD.h b/Platform/AMD/AgesaModulePkg/Include/AMD.h new file mode 100755 index 0000000000..062d9e1e1a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AMD.h @@ -0,0 +1,91 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_H_ +#define AMD_H_ + +/// The return status for all AGESA public services. +/// +/// Services return the most severe status of any logged event. Status other than SUCCESS, UNSUPPORTED, and BOUNDS_CHK +/// will have log entries with more detail. +/// +typedef enum { + AGESA_SUCCESS = 0, ///< 0 - The service completed normally. Info may be logged. + AGESA_UNSUPPORTED, ///< 1 - The dispatcher or create struct had an unimplemented function requested. + ///< Not logged. + AGESA_BOUNDS_CHK, ///< 2 - A dynamic parameter was out of range and the service was not provided. + ///< Example, memory address not installed, heap buffer handle not found. + ///< Not Logged. + AGESA_SYNC_MORE_DATA, ///< 3 - More data is available from PSP communications (used in ABL) + AGESA_SYNC_SLAVE_ASSERT, ///< 4 - Slave is at an ASSERT (used in ABL) + + // AGESA_STATUS of greater severity (the ones below this line), always have a log entry available. + AGESA_ALERT, ///< 5 - An observed condition, but no loss of function. See Log. + AGESA_WARNING, ///< 6 - Possible or minor loss of function. See Log. + AGESA_ERROR, ///< 7 - Significant loss of function, boot may be possible. See Log. + AGESA_CRITICAL, ///< 8 - Continue boot only to notify user. See Log. + AGESA_FATAL, ///< 9 - Halt booting. See Log, however Fatal errors pertaining to heap problems + ///< may not be able to reliably produce log events. + AGESA_OC_FATAL, ///< 10 - Halt booting. Critical Memory Overclock failure. (used in ABL) + AGESA_SKIP_ERROR, ///< 11 - Error, Skip init steps. (used in ABL) + AgesaStatusMax ///< Not a status, for limit checking. +} AGESA_STATUS; + +/** + Callout method to the host environment. + + Callout using a dispatch with appropriate thunk layer, which is determined by the host environment. + + @param[in] Function The specific callout function being invoked. + @param[in] FcnData Function specific data item. + @param[in,out] ConfigPtr Reference to Callout params. +**/ +typedef AGESA_STATUS (*CALLOUT_ENTRY) ( + IN UINT32 Function, + IN UINTN FcnData, + IN OUT VOID *ConfigPtr + ); + +/// AGESA Structures + +/// Extended PCI address format +typedef struct { + IN OUT UINT32 Register : 12; ///< Register offset + IN OUT UINT32 Function : 3; ///< Function number + IN OUT UINT32 Device : 5; ///< Device number + IN OUT UINT32 Bus : 8; ///< Bus number + IN OUT UINT32 Segment : 4; ///< Segment +} EXT_PCI_ADDR; + +/// Union type for PCI address +typedef union _PCI_ADDR { + IN UINT32 AddressValue; ///< Formal address + IN EXT_PCI_ADDR Address; ///< Extended address +} PCI_ADDR; + +/// +/// The standard header for all AGESA services. +/// +typedef struct { + IN UINT32 ImageBasePtr; ///< The AGESA Image base address. + IN UINT32 Func; ///< The service desired + IN UINT32 AltImageBasePtr; ///< Alternate Image location + IN CALLOUT_ENTRY CalloutPtr; ///< For Callout from AGESA + IN UINT8 HeapStatus; ///< For heap status from boot time slide. + IN UINT64 HeapBasePtr; ///< Location of the heap + IN OUT UINT8 Reserved[7]; ///< This space is reserved for future use. +} AMD_CONFIG_PARAMS; + +/// CPUID data received registers format +typedef struct { + OUT UINT32 EAX_Reg; ///< CPUID instruction result in EAX + OUT UINT32 EBX_Reg; ///< CPUID instruction result in EBX + OUT UINT32 ECX_Reg; ///< CPUID instruction result in ECX + OUT UINT32 EDX_Reg; ///< CPUID instruction result in EDX +} CPUID_DATA; +#endif // AMD_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h new file mode 100755 index 0000000000..534b03d4a7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h @@ -0,0 +1,15 @@ +/** @file + AMD CPU Register Table Related Functions. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_H_ +#define CPU_REGISTERS_H_ + +#include <CpuRegistersDef.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h new file mode 100644 index 0000000000..e086a4c9b1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h @@ -0,0 +1,61 @@ +/** @file + AMD Psp Directory header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_DIR_H_ +#define AMD_PSP_DIR_H_ + +#pragma pack (push, 1) +#define PSP_DIRECTORY_HEADER_SIGNATURE 0x50535024ul ///< $PSP +#define PSP_LV2_DIRECTORY_HEADER_SIGNATURE 0x324C5024ul ///< $PL2 + +/// Enum define various enum type for PSP entry type +enum _PSP_DIRECTORY_ENTRY_TYPE { + PSP_REGION_A_DIR = 0x48, ///< PSP entry points to PSP DIR in Region A + PSP_REGION_B_DIR = 0x4A, ///< PSP entry points to PSP DIR in Region B +}; + +/// Define structure for PSP directory +typedef struct { + UINT32 Cookie; ///< "$PSP" + UINT32 Checksum; ///< 32 bit CRC of header items below and the entire table + UINT32 TotalEntries; ///< Number of PSP Entries + UINT32 Reserved; ///< Unused +} PSP_DIRECTORY_HEADER; + +/// Define structure for 32 bits Entry type field +typedef struct { + UINT32 Type : 8; ///< Type of PSP Directory entry + UINT32 SubProgram : 8; ///< Specify the SubProgram + UINT32 RomId : 2; ///< Specify the ROM ID + UINT32 Reserved : 14; ///< Reserved +} PSP_DIRECTORY_ENTRY_TYPE_FIELD; + +/// Define union type for 32 bits Entry type field +typedef union { + PSP_DIRECTORY_ENTRY_TYPE_FIELD Field; ///< Definition of each filed + UINT32 Value; ///< Group it as 32bits Int +} PSP_DIRECTORY_ENTRY_TYPE; + +/// Structure for PSP Entry +typedef struct { + PSP_DIRECTORY_ENTRY_TYPE Type; ///< Type of PSP entry; 32 bit long + UINT32 Size; ///< Size of PSP Entry in bytes + UINT64 Location; ///< Location of PSP Entry (byte offset from start of SPI-ROM) +} PSP_DIRECTORY_ENTRY; + +/// Structure for PSP directory +typedef struct { + PSP_DIRECTORY_HEADER Header; ///< PSP directory header + PSP_DIRECTORY_ENTRY PspEntry[1]; ///< Array of PSP entries each pointing to a binary in SPI flash + ///< The actual size of this array comes from the + ///< header (PSP_DIRECTORY.Header.TotalEntries) +} PSP_DIRECTORY; + +#pragma pack (pop) +#endif //AMD_PSP_DIR_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h new file mode 100755 index 0000000000..faa8d35b1b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h @@ -0,0 +1,156 @@ +/** @file + AMD CPU Register Table Related Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_DEF_H_ +#define CPU_REGISTERS_DEF_H_ + +#undef BIT0 +#undef BIT1 +#undef BIT2 +#undef BIT3 +#undef BIT4 +#undef BIT5 +#undef BIT6 +#undef BIT7 +#undef BIT8 +#undef BIT9 +#undef BIT10 +#undef BIT10 +#undef BIT11 +#undef BIT12 +#undef BIT13 +#undef BIT14 +#undef BIT15 +#undef BIT16 +#undef BIT17 +#undef BIT18 +#undef BIT19 +#undef BIT20 +#undef BIT21 +#undef BIT22 +#undef BIT23 +#undef BIT24 +#undef BIT25 +#undef BIT26 +#undef BIT27 +#undef BIT28 +#undef BIT29 +#undef BIT30 +#undef BIT31 +#undef BIT32 +#undef BIT33 +#undef BIT34 +#undef BIT35 +#undef BIT36 +#undef BIT37 +#undef BIT38 +#undef BIT39 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT50 +#undef BIT51 +#undef BIT52 +#undef BIT53 +#undef BIT54 +#undef BIT55 +#undef BIT56 +#undef BIT57 +#undef BIT58 +#undef BIT59 +#undef BIT60 +#undef BIT61 +#undef BIT62 +#undef BIT63 + +#define BIT0 0x0000000000000001ull +#define BIT1 0x0000000000000002ull +#define BIT2 0x0000000000000004ull +#define BIT3 0x0000000000000008ull +#define BIT4 0x0000000000000010ull +#define BIT5 0x0000000000000020ull +#define BIT6 0x0000000000000040ull +#define BIT7 0x0000000000000080ull +#define BIT8 0x0000000000000100ull +#define BIT9 0x0000000000000200ull +#define BIT10 0x0000000000000400ull +#define BIT11 0x0000000000000800ull +#define BIT12 0x0000000000001000ull +#define BIT13 0x0000000000002000ull +#define BIT14 0x0000000000004000ull +#define BIT15 0x0000000000008000ull +#define BIT16 0x0000000000010000ull +#define BIT17 0x0000000000020000ull +#define BIT18 0x0000000000040000ull +#define BIT19 0x0000000000080000ull +#define BIT20 0x0000000000100000ull +#define BIT21 0x0000000000200000ull +#define BIT22 0x0000000000400000ull +#define BIT23 0x0000000000800000ull +#define BIT24 0x0000000001000000ull +#define BIT25 0x0000000002000000ull +#define BIT26 0x0000000004000000ull +#define BIT27 0x0000000008000000ull +#define BIT28 0x0000000010000000ull +#define BIT29 0x0000000020000000ull +#define BIT30 0x0000000040000000ull +#define BIT31 0x0000000080000000ull +#define BIT32 0x0000000100000000ull +#define BIT33 0x0000000200000000ull +#define BIT34 0x0000000400000000ull +#define BIT35 0x0000000800000000ull +#define BIT36 0x0000001000000000ull +#define BIT37 0x0000002000000000ull +#define BIT38 0x0000004000000000ull +#define BIT39 0x0000008000000000ull +#define BIT40 0x0000010000000000ull +#define BIT41 0x0000020000000000ull +#define BIT42 0x0000040000000000ull +#define BIT43 0x0000080000000000ull +#define BIT44 0x0000100000000000ull +#define BIT45 0x0000200000000000ull +#define BIT46 0x0000400000000000ull +#define BIT47 0x0000800000000000ull +#define BIT48 0x0001000000000000ull +#define BIT49 0x0002000000000000ull +#define BIT50 0x0004000000000000ull +#define BIT51 0x0008000000000000ull +#define BIT52 0x0010000000000000ull +#define BIT53 0x0020000000000000ull +#define BIT54 0x0040000000000000ull +#define BIT55 0x0080000000000000ull +#define BIT56 0x0100000000000000ull +#define BIT57 0x0200000000000000ull +#define BIT58 0x0400000000000000ull +#define BIT59 0x0800000000000000ull +#define BIT60 0x1000000000000000ull +#define BIT61 0x2000000000000000ull +#define BIT62 0x4000000000000000ull +#define BIT63 0x8000000000000000ull + +#define MSR_MMIO_CFG_BASE 0xC0010058ul // MMIO Configuration Base Address Register + +#endif // CPU_REGISTERS_DEF_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h new file mode 100644 index 0000000000..8ede1be838 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h @@ -0,0 +1,85 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FCH_REGISTER_COMMON_H_ +#define FCH_REGISTER_COMMON_H_ + +// Misc +#define R_FCH_ACPI_PM1_STATUS 0x00 +#define R_FCH_ACPI_PM1_ENABLE 0x02 +#define R_FCH_ACPI_PM_CONTROL 0x04 + +#define FCH_LPC_BUS 0 +#define FCH_LPC_DEV 20 +#define FCH_LPC_FUNC 3 + +#define ACPI_MMIO_BASE 0xFED80000ul +#define SMI_BASE 0x200 // DWORD +#define IOMUX_BASE 0xD00 // BYTE +#define MISC_BASE 0xE00 +#define PMIO_BASE 0x300 // DWORD + +// +// FCH LPC Device 0x780E +// Device 20 (0x14) Func 3 +// +#define FCH_LPC_REG48 0x48 // IO/Mem Port Decode Enable Register 5- RW +#define FCH_LPC_REG74 0x74 // Alternative Wide IO Range Enable- W/R +#define FCH_LPC_REG7C 0x7C // TPM (trusted plant form module) reg- W/R +#define FCH_LPC_REGA0 0x0A0 // SPI base address +#define FCH_LPC_REGB8 0x0B8 + +// +// FCH MMIO Base (SMI) +// offset : 0x200 +// +#define FCH_SMI_REG80 0x80 // SmiStatus0 +#define FCH_SMI_REG84 0x84 // SmiStatus1 +#define FCH_SMI_REG88 0x88 // SmiStatus2 +#define FCH_SMI_REG8C 0x8C // SmiStatus3 +#define FCH_SMI_REG90 0x90 // SmiStatus4 +#define FCH_SMI_REG98 0x98 // SmiTrig +#define FCH_SMI_REGA0 0xA0 +#define FCH_SMI_REGB0 0xB0 +#define FCH_SMI_REGC4 0xC4 + +// +// FCH MMIO Base (PMIO) +// offset : 0x300 +// +#define FCH_PMIOA_REG60 0x60 // AcpiPm1EvtBlk + +// +// +#define FCH_MISC_REG80 0x80 +// FCH SPI +// + +#define FCH_SPI_BASE_ADDRESS 0xFEC10000 + +#define FCH_SPI_MMIO_REG00 0x00 +#define FCH_SPI_FIFO_PTR_CRL 0x00100000l // +#define FCH_SPI_BUSY 0x80000000l // +#define FCH_SPI_MMIO_REG1D 0x1D // +#define FCH_SPI_MMIO_REG20 0x20 +#define FCH_SPI_MMIO_REG22 0x22 // +#define FCH_SPI_MMIO_REG30 0x30 // +#define FCH_SPI_R2VAL24 0x00000001l // +#define FCH_SPI_R2VAL25 0x00000002l // +#define FCH_SPI_R2MSK24 0x00000004l // +#define FCH_SPI_R2MSK25 0x00000008l // +#define FCH_SPI_MMIO_REG45_CMDCODE 0x45 // +#define FCH_SPI_MMIO_REG47_CMDTRIGGER 0x47 // +#define FCH_SPI_MMIO_REG48_TXBYTECOUNT 0x48 // +#define FCH_SPI_MMIO_REG4B_RXBYTECOUNT 0x4B // +#define FCH_SPI_MMIO_REG4C_SPISTATUS 0x4C // +#define FCH_SPI_MMIO_REG5C_Addr32_Ctrl3 0x5C // +#define FCH_SPI_SPIROM_PAGE_MASK 0xFF // +#define FCH_SPI_MMIO_REG80_FIFO 0x80 // + +#endif /* FCH_REGISTER_COMMON_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Filecode.h b/Platform/AMD/AgesaModulePkg/Include/Filecode.h new file mode 100644 index 0000000000..726479d79f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Filecode.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * Collectively assign unique filecodes for assert and debug to each source file. + * + * Publish values for decorated filenames, which can be used for + * ASSERT and debug support using a preprocessor define like: + * @n <tt> _#define FILECODE MY_C_FILENAME_FILECODE </tt> @n + * This file serves as a reference for debugging to associate the code and filename. + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: Include + * @e _$Revision: 312538 $ @e \$Date: 2015-02-09 16:53:54 +0800 (Mon, 09 Feb 2015) $ + */ + +#ifndef _FILECODE_H_ +#define _FILECODE_H_ + +#define UNASSIGNED_FILE_FILECODE (0xFFFF) + +#endif // _FILECODE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Gnb.h b/Platform/AMD/AgesaModulePkg/Include/Gnb.h new file mode 100755 index 0000000000..ddc9309d3d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Gnb.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_H_ +#define GNB_H_ + +#define PVOID UINT64 + +#endif // GNB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h new file mode 100644 index 0000000000..192e0d6a8b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h @@ -0,0 +1,521 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBDXIO_H_ +#define GNBDXIO_H_ + +#pragma pack (push, 1) + +#include <AGESA.h> +#include <Gnb.h> + +#define MAX_NUMBER_OF_COMPLEXES 16 + +#define DESCRIPTOR_TERMINATE_GNB 0x40000000ull +#define DESCRIPTOR_TERMINATE_TOPOLOGY 0x20000000ull +#define DESCRIPTOR_ALLOCATED 0x10000000ull +#define DESCRIPTOR_PLATFORM 0x08000000ull +#define DESCRIPTOR_COMPLEX 0x04000000ull +#define DESCRIPTOR_SILICON 0x02000000ull +#define DESCRIPTOR_PCIE_WRAPPER 0x01000000ull +#define DESCRIPTOR_PCIE_ENGINE 0x00800000ull +#define DESCRIPTOR_CXL_ENGINE 0x00200000ull + +#define SILICON_CXL_CAPABLE 0x00008000ull + +#define DESCRIPTOR_ALL_WRAPPERS (DESCRIPTOR_PCIE_WRAPPER) +#define DESCRIPTOR_ALL_ENGINES (DESCRIPTOR_PCIE_ENGINE | DESCRIPTOR_CXL_ENGINE) + +#define DESCRIPTOR_ALL_TYPES (DESCRIPTOR_ALL_WRAPPERS | DESCRIPTOR_ALL_ENGINES | DESCRIPTOR_SILICON | DESCRIPTOR_PLATFORM) +#define PcieLibGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) + +typedef UINT16 PCIE_ENGINE_INIT_STATUS; + +/// +/// Engine Configuration +/// +typedef struct { + IN UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + IN UINT16 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + IN UINT16 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG +} PCIE_ENGINE; + +/// +/// PCIe port misc extended controls +/// +typedef struct { + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 5; ///< Unused space +} PORT_MISC_CONTROL; + +/// +/// PCIe port configuration data +/// +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 FunctionNumber : 3; ///< Reserved for future use + IN UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 LinkSpeedCapability : 4; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm : 4; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT16 SlotNum; ///< Physical Slot Number + IN PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN UINT8 Reserved1; ///< Reserved for future use +} PORT_DATA; + +typedef struct { + UINT8 LinkSpeed; + UINT8 MaxPayloadSupport; + UINT8 AspmCapability; + UINT8 PciPmL1_1; + UINT8 PciPmL1_2; + UINT8 AspmL1_1; + UINT8 AspmL1_2; + UINT8 EsmSupport; + UINT8 LtrSupport; + UINT8 SurpriseDownErrorReport; + UINT8 TenBitTagSupport; + UINT8 AriForwarding; + UINT8 AcsSupport; + UINT8 AcsSourceValidation; + UINT8 AcsTranslationBlocking; + UINT8 AcsP2pRequestRedirect; + UINT8 AcsP2pCompletionRedirect; + UINT8 AcsUpstreamForwarding; + UINT8 AcsP2pEgressControl; + UINT8 AcsDirectTranslatedP2p; + UINT8 LaneMargining; + UINT8 DataLinkFeature; + UINT8 DownstreamPortContainment; + UINT8 AdvancedErrorReporting; + UINT8 ECRCSupport; + UINT8 MulticastEnable; + UINT8 NativePCIeEnclosureManagement; + UINT8 Capability1Address; + UINT8 Capability1Data; + UINT8 Capability2Address; + UINT8 Capability2Data; + UINT8 Capability3Address; + UINT8 Capability3Data; + UINT8 Capability4Address; + UINT8 Capability4Data; +} PORT_CAPABILITIES; + +/// +/// PCIe PORT_FEATURES +/// +typedef struct { + UINT8 LinkSpeedControl; + UINT8 MaxPayloadSizeControl; + UINT8 ESMControl; + UINT8 LTRControl; + UINT8 DataLinkFeatureExchangeControl; + UINT8 TenBitTagControl; + UINT8 ARIControl; + UINT8 ACSControl; + UINT8 RxLaneMarginingControl; + UINT8 DynLanesPwrState; + UINT8 L1PowerDown; + UINT8 L11PowerDown; + UINT8 L12PowerDown; + UINT8 AutoSpdChngEn; + UINT8 TurnOffUnusedLanes; +} PORT_FEATURES; + +typedef struct { + UINT8 SpcGen1 : 1; ///< SPC Mode 2P5GT + UINT8 SpcGen2 : 1; ///< SPC Mode 5GT + UINT8 SpcGen3 : 2; ///< SPC Mode 8GT + UINT8 SpcGen4 : 2; ///< SPC Mode 16GT + UINT8 SpcGen5 : 2; ///< SPC Mode 32GT +} SPC_MODE; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT32 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT32 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT32 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT32 LcPresetMask8Gt : 10; ///< Gen3 Preset Mask + UINT32 LcFapeEnable8GT : 1; ///< Gen3 FapeEnable + UINT32 UNUSED2 : 7; ///< Currently unassigned - for alignment +} GEN3_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT32 LcPresetMask16Gt : 10; ///< Gen4 Preset Mask + UINT32 LcFapeEnable16GT : 1; ///< Gen4 FapeEnable + UINT32 UNUSED3 : 13; ///< Currently unassigned - for alignment +} GEN4_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT32 LcPresetMask32Gt : 10; ///< Gen5 Preset Mask + UINT32 LcFapeEnable32GT : 1; ///< Gen5 FapeEnable + UINT32 PrecodeRequest : 1; ///< Precoding Request + UINT32 AdvertiseEqToHiRate : 1; ///< Advertise EQ To High Rate Support + UINT32 UNUSED4 : 11; ///< Currently unassigned - for alignment +} GEN5_LANE_CNTL; + +typedef struct { + UINT32 LcFapeReqPostCursor0 : 5; ///< PostCursor0 + UINT32 LcFapeReqPreCursor0 : 4; ///< PreCursor0 + UINT32 LcFapeReqPostCursor1 : 5; ///< PostCursor1 + UINT32 LcFapeReqPreCursor1 : 4; ///< PreCursor1 + UINT32 LcFapeReqPostCursor2 : 5; ///< PostCursor2 + UINT32 LcFapeReqPreCursor2 : 4; ///< PreCursor2 + UINT32 UNUSED6 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_0; + +typedef struct { + UINT32 LcFapeReqPostCursor3 : 5; ///< PostCursor3 + UINT32 LcFapeReqPreCursor3 : 4; ///< PreCursor3 + UINT32 LcFapeReqPostCursor4 : 5; ///< PostCursor4 + UINT32 LcFapeReqPreCursor4 : 4; ///< PreCursor4 + UINT32 LcFapeReqPostCursor5 : 5; ///< PostCursor5 + UINT32 LcFapeReqPreCursor5 : 4; ///< PreCursor5 + UINT32 UNUSED7 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_1; + +typedef struct { + UINT32 LcFapeReqPostCursor6 : 5; ///< PostCursor6 + UINT32 LcFapeReqPreCursor6 : 4; ///< PreCursor6 + UINT32 LcFapeReqPostCursor7 : 5; ///< PostCursor7 + UINT32 LcFapeReqPreCursor7 : 4; ///< PreCursor7 + UINT32 LcFapeReqPostCursor8 : 5; ///< PostCursor8 + UINT32 LcFapeReqPreCursor8 : 4; ///< PreCursor8 + UINT32 UNUSED8 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_2; + +typedef struct { + UINT32 LcFapeReqPostCursor9 : 5; ///< PostCursor9 + UINT32 LcFapeReqPreCursor9 : 4; ///< PreCursor9 + UINT32 LcFapeReqPostCursor10 : 5; ///< PostCursor10 + UINT32 LcFapeReqPreCursor10 : 4; ///< PreCursor10 + UINT32 LcFapeReqPostCursor11 : 5; ///< PostCursor11 + UINT32 LcFapeReqPreCursor11 : 4; ///< PreCursor11 + UINT32 UNUSED9 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_3; + +typedef struct { + UINT32 LcFapeReqPostCursor12 : 5; ///< PostCursor12 + UINT32 LcFapeReqPreCursor12 : 4; ///< PreCursor12 + UINT32 LcFapeReqPostCursor13 : 5; ///< PostCursor13 + UINT32 LcFapeReqPreCursor13 : 4; ///< PreCursor13 + UINT32 LcFapeReqPostCursor14 : 5; ///< PostCursor14 + UINT32 LcFapeReqPreCursor14 : 4; ///< PreCursor14 + UINT32 UNUSED10 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_4; + +typedef struct { + UINT32 LcFapeReqPostCursor15 : 5; ///< PostCursor15 + UINT32 LcFapeReqPreCursor15 : 4; ///< PreCursor15 + UINT32 LcFapeReqPostCursor16 : 5; ///< PostCursor16 + UINT32 LcFapeReqPreCursor16 : 4; ///< PreCursor16 + UINT32 LcFapeReqPostCursor17 : 5; ///< PostCursor17 + UINT32 LcFapeReqPreCursor17 : 4; ///< PreCursor17 + UINT32 UNUSED11 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_5; + +typedef struct { + UINT32 LcFapeReqPostCursor18 : 5; ///< PostCursor18 + UINT32 LcFapeReqPreCursor18 : 4; ///< PreCursor18 + UINT32 LcFapeReqPostCursor19 : 5; ///< PostCursor19 + UINT32 LcFapeReqPreCursor19 : 4; ///< PreCursor19 + UINT32 LcFapeReqPostCursor20 : 5; ///< PostCursor20 + UINT32 LcFapeReqPreCursor20 : 4; ///< PreCursor20 + UINT32 UNUSED12 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_6; + +/// +/// PCIe port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 IsBmcLocation : 1; ///< Port Location of BMC + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 TXDeEmphasis : 4; ///< TX De-emphasis + UINT8 TXMargin : 3; ///< TX Margin + UINT8 UNUSED1 : 1; ///< Currently unassigned - for alignment + + PORT_CAPABILITIES PortCapabilities; ///< Port Capabilities CBS + + SPC_MODE SpcMode; + + GEN3_LANE_CNTL LaneEqualizationCntl; + GEN4_LANE_CNTL Gen4LaneEqualizationCntl; + GEN5_LANE_CNTL Gen5LaneEqualizationCntl; + + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 UNUSED4 : 1; ///< Currently unassigned - for alignment + UINT8 SRIS_SRNS : 1; ///< SRIS SRNS + UINT8 SRIS_LowerSKPSupport : 1; ///< SRIS Lower SKP Support + UINT8 CcixControl : 1; ///< Bit to enable/disable ESM + UINT8 CxlControl : 1; ///< Bit to enable CXL Capability + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 SlotPowerLimitScale : 2; ///< Slot Power Limit Scale + UINT8 UNUSED5 : 1; ///< Currently unassigned - for alignment + + UINT8 RxMarginPersistence : 1; ///< Bit to enable/disable Rx Margin persistence mode + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 TxVetting : 1; ///< Gen4 Tx Vetting + UINT8 RxVetting : 1; ///< Gen4 Rx Vetting + UINT8 TxVettingGen5 : 1; ///< Gen5 Tx Vetting + UINT8 RxVettingGen5 : 1; ///< Gen5 Rx Vetting + + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 DlfCapDisable : 1; ///< DLF Capability 1:Disable 0:Enable + UINT8 DlfExchangeDisable : 1; ///< DLF Exchange 1:Disable 0:Enable + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + + UINT8 EqSearchMode : 2; ///< Equalization Search Mode + UINT8 BypassGen3EQ : 1; ///< BypassGen3EQ + UINT8 DisGen3EQPhase : 1; ///< Disable Gen3 EQ Phase2/3 + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset value + + UINT8 EqSearchModeGen4 : 2; ///< Equalization Search Mode for Gen4 + UINT8 BypassGen4EQ : 1; ///< Gen4 Bypass phase3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset value + UINT8 EqSearchModeGen5 : 2; ///< Equalization Search Mode for Gen5 + UINT8 BypassGen5EQ : 1; ///< Gen5 Bypass phase3 EQ + UINT8 DisGen5EQPhase : 1; ///< Gen5 Bypass phase2/3 EQ + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset value + + UINT16 PsppPolicyDC; ///< Pspp Policy DC + UINT16 PsppPolicyAC; ///< Pspp Policy AC + UINT8 PsppDeviceType; ///< Pspp Device Type + + LC_FAPE_GROUP_0 LcFapeSettingsGroup0; + LC_FAPE_GROUP_1 LcFapeSettingsGroup1; + LC_FAPE_GROUP_2 LcFapeSettingsGroup2; + LC_FAPE_GROUP_3 LcFapeSettingsGroup3; + LC_FAPE_GROUP_4 LcFapeSettingsGroup4; + LC_FAPE_GROUP_5 LcFapeSettingsGroup5; + LC_FAPE_GROUP_6 LcFapeSettingsGroup6; + + UINT8 ForceSteering : 1; ///< Steering is forced + UINT8 EsmUsTxPreset : 4; ///< ESM Upstream Tx Preset + UINT8 UNUSED13 : 3; ///< Currently unassigned - for alignment + + // Used by DXE + PORT_FEATURES PortFeatures; ///< Port Features CBS + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 I2CMuxInfo; ///< First I2c Mux on Bus + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:SRIS 2:SRNS 3:SRNS in SRIS 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 ClkReq : 4; ///< ClkReq:[0:3] + UINT8 EqPreset : 4; ///< EqPreset:[4:7] + UINT8 LinkAspmL1_1 : 1; ///< Enable PM L1 SS L1.1 + UINT8 LinkAspmL1_2 : 1; ///< Enable PM L1 SS L1.2 + UINT8 EsmControl : 1; ///< Bit to enable/disable ESM + UINT8 EsmDsTxPreset : 4; ///< ESM Downstream Tx Preset + UINT8 ClkReqFilterEn : 1; ///< Controls filtering of CLKREQb signal in LC in order to avoid false L1 substate entries/exits. +} PCIE_PORT_CONFIG; + +/// +/// CXL port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 UNUSED0 : 1; ///< Currently unassigned - for alignment + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 CxlIndex; + UINT8 CxlDeviceType : 2; ///< Type of CXL device connected + UINT8 CxlVersion : 2; ///< Version of CXL device connected (1=CXL1.1, 2=CXL2.0) + UINT8 IsCxlScanned : 1; ///< Indicates if the CXL device has been scanned + UINT8 ReportToMpioinDxe : 1; ///< Indicates if the CXL info needs to be reported to MPIO in DXE + UINT8 UNUSED1 : 2; ///< Currently unassigned - for alignment + + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT32 Mmio32Base; + UINT32 Mmio32Size; + UINT64 Mmio64Base; + UINT64 Mmio64Size; + UINT32 Mmio32Gran; +} PCIE_CXL_CONFIG; + +/// +/// Descriptor header +/// +typedef struct { + UINT32 DescriptorFlags; ///< Descriptor flags + UINT16 Parent; ///< Offset of parent descriptor + UINT16 Peer; ///< Offset of the peer descriptor + UINT16 Child; ///< Offset of the list of child descriptors +} PCIE_DESCRIPTOR_HEADER; + +/// +/// Engine configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor header + PCIE_ENGINE EngineData; ///< Engine Data + PCIE_ENGINE_INIT_STATUS InitStatus; ///< Initialization Status + UINT8 Scratch; ///< Scratch pad + union { + PCIE_PORT_CONFIG Port; ///< PCIe port configuration data + PCIE_CXL_CONFIG Cxl; ///< CXL Configuration data + } Type; +} PCIE_ENGINE_CONFIG; + +/// +/// Wrapper configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 WrapId; ///< Wrapper ID + UINT8 CcixCoreConfig; ///< Ccix CORE Configuration + UINT8 StartPhyLane; ///< Start PHY Lane + UINT8 EndPhyLane; ///< End PHY Lane + UINT8 StartDxioLane; ///< Start Dxio Lane (Translated) + UINT8 EndDxioLane; ///< End Dxio Lane (Translated) + struct { + UINT8 PowerOffUnusedLanes : 1; ///< Power Off unused lanes + UINT8 PowerOffUnusedPlls : 1; ///< Power Off unused Plls + UINT8 ClkGating : 1; ///< TXCLK gating + UINT8 LclkGating : 1; ///< LCLK gating + UINT8 TxclkGatingPllPowerDown : 1; ///< TXCLK clock gating PLL power down + UINT8 PllOffInL1 : 1; ///< PLL off in L1 + UINT8 AccessEncoding : 1; ///< Reg access encoding + UINT8 CoreReversed : 1; ///< Indicates lanes are reversed in package connection + } Features; + UINT8 MasterPll; ///< Bitmap of master PLL + UINT32 AcsSupport : 1; ///< Acs Support + UINT32 LtrSupport : 1; ///< LTR Support + UINT32 AriForwarding : 1; ///< ARI Forwarding + UINT32 LaneMargining : 1; ///< Lane Margining + UINT32 NativePCIeEnclosureManagement : 1; ///< NPEM + UINT32 DownstreamPortContainment : 1; ///< Downstream port containment + UINT32 AdvancedErrorReporting : 1; ///< Advacned Error Reporting + UINT32 ECRCSupport : 2; ///< ECRC Capability + UINT32 Reserved : 23; ///< Reserved bits +} PCIE_WRAPPER_CONFIG; + +/// +/// Silicon configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 SocketId; ///< Socket ID + UINT8 DieNumber; ///< Module ID + UINT8 RBIndex; ///< Physical Root Bridge + UINT8 InstanceId; ///< Logical Instance Identifier + PCI_ADDR Address; ///< PCI address of GNB host bridge + UINT16 StartLane; ///< Start Lane of this node + UINT16 EndLane; ///< End Lane of this node + UINT8 BusNumberLimit; ///< Last Bus Number assigned to this node + UINT8 SbPresent : 1; ///< Set to 1 if FCH connected to this NBIO + UINT8 SmuPresent : 1; ///< Set to 1 if SMU connected to this NBIO + UINT8 MP_Instance : 6; ///< MP Instance + UINT8 LogicalRBIndex; ///< Logical Root Bridge + UINT8 NumEngineDesc; ///< Total number of lane bifurcation descriptors +} PCIE_SILICON_CONFIG; + +typedef PCIE_SILICON_CONFIG GNB_HANDLE; + +/// +/// Complex configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 NodeId; ///< Processor Node ID + UINT8 Reserved; ///< For alignment +} PCIE_COMPLEX_CONFIG; + +/// +/// PCIe platform configuration info +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + PVOID Reserved1; ///< Reserved + UINT32 Reserved2; ///< Reserved + UINT32 PhyConfigData; ///< Phy Configuration Data + UINT32 Reserved3; ///< Reserved + UINT32 Reserved4; ///< Reserved + UINT32 PsppTuningParams; ///< Tuning parameters for PSPP + UINT32 PsppTuningParams2; ///< Tuning parameters 2 for PSPP + UINT8 Reserved5; ///< Reserved + UINT8 PsppPolicy; ///< PSPP policy + UINT8 Reserved6; ///< Reserved + UINT8 RootBridgesPerSocket; ///< Number of root bridges per socket + PCIE_COMPLEX_CONFIG ComplexList[MAX_NUMBER_OF_COMPLEXES]; ///< Complex +} PCIE_PLATFORM_CONFIG; + +/// +/// PCIe Engine Description +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor on wrapper + ///< Bit30 - Descriptor allocated for PCIe port + PCIE_ENGINE EngineData; ///< Engine Data +} PCIE_ENGINE_DESCRIPTOR; +#pragma pack (pop) + +#endif // GNBDXIO_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h new file mode 100644 index 0000000000..90f52cca7b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h @@ -0,0 +1,18 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _GNBREGISTERSRS_H_ +#define _GNBREGISTERSRS_H_ + +#include "GnbRegistersRS/IOHC.h" + +#ifndef NBIO_SPACE +#define NBIO_SPACE(HANDLE, ADDRESS) (ADDRESS + (HANDLE->RBIndex << 20)) +#endif + +#endif /*_GNBREGISTERSRS_H_*/ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h new file mode 100644 index 0000000000..b1a95237de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _IOHC_H_ +#define _IOHC_H_ + +// Bitfield Description : DBG MMIO enable. +#define DBG_BASE_ADDR_LO_DBG_MMIO_EN_OFFSET 0 + +// Bitfield Description : Locks the DBG MMIO address range and enable until the next warm reset. +#define DBG_BASE_ADDR_LO_DBG_MMIO_LOCK_OFFSET 1 + +#define SMN_IOHUB0NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13b102f0UL +#define IOAPIC_BASE_ADDR_LO_IOAPIC_BASE_ADDR_LO_MASK 0xffffff00 +#define SMN_IOHUB1NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13c102f0UL + +#endif /* _IOHC_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h new file mode 100644 index 0000000000..f5cc5e2228 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_PCIE_HOB_INFO_H_ +#define GNB_PCIE_HOB_INFO_H_ + +#define _GNB_PCIE_HOB_INFO_GUID \ +{ \ + 0x3eb1d90, 0xce14, 0x40d8, 0xa6, 0xba, 0x10, 0x3a, 0x8d, 0x7b, 0xd3, 0x2d \ +} +extern EFI_GUID gGnbPcieHobInfoGuid; + +#pragma pack (push, 1) +#define MAX_NUMBER_OF_CORES_PER_COMPLEX 3 +#define MAX_NUMBER_OF_PORTS_PER_COMPLEX 22 + +/// PCIe information HOB data +typedef struct _GNB_PCIE_INFORMATION_DATA_HOB { + EFI_HOB_GUID_TYPE EfiHobGuidType; ///< GUID Hob type structure + PCIE_PLATFORM_CONFIG PciePlatformConfigHob; ///< Platform Config Structure + UINT32 ComplexConfigs; ///< Allocation for Max Complex Structure suported +} GNB_PCIE_INFORMATION_DATA_HOB; + +#pragma pack (pop) + +#endif /* GNB_PCIE_HOB_INFO_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h new file mode 100644 index 0000000000..dc773737b9 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h @@ -0,0 +1,16 @@ +/** @file + Contains interface to the AMD AGESA library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_BASE_LIB_H_ +#define AMD_BASE_LIB_H_ + +#include "Uefi.h" +#include "AMD.h" + +#endif // AMD_BASE_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h new file mode 100644 index 0000000000..9d9892aa30 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h @@ -0,0 +1,43 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * PSP Mailbox related functions Prototype definition + * + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: PSP + * @e \$Revision: 312133 $ @e \$Date: 2015-02-03 02:47:45 +0800 (Tue, 03 Feb 2015) $ + */ + +#ifndef _PSP_MBOX_H_ +#define _PSP_MBOX_H_ + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ); + +#endif //_PSP_MBOX_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h new file mode 100644 index 0000000000..51935f413a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef BASE_FABRIC_TOPOLOGY_LIB_H_ +#define BASE_FABRIC_TOPOLOGY_LIB_H_ + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ); + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ); + +#endif // BASE_FABRIC_TOPOLOGY_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h new file mode 100644 index 0000000000..cae3aff9b3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h @@ -0,0 +1,16 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_BASE_LIB_H_ +#define _FCH_BASE_LIB_H_ + +#include <Library/IoLib.h> +#include <Library/PciLib.h> +#include <Library/BaseLib.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h new file mode 100644 index 0000000000..345e39adce --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h @@ -0,0 +1,413 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_ESPI_CMD_LIB_H_ +#define _FCH_ESPI_CMD_LIB_H_ + +#include <Uefi/UefiBaseType.h> + +#define MAX_ESPI_RETRY 100000ul +// +// Cycle Type +// +#define CYCLE_TYPE_FLASH_READ 0 +#define CYCLE_TYPE_FLASH_WRITE 1 +#define CYCLE_TYPE_FLASH_ERASE 2 +#define CYCLE_TYPE_RPMC_OP1 3 +#define CYCLE_TYPE_RPMC_OP2 4 + +// RPMC OP1/OP2 Command Payload Max Length (512 Bits) +#define RPMC_CMD_PAYLOAD_MAX_LEN 0x40 + +// +// Master Registers +// +#define SET_CONFIGURATION 0 +#define GET_CONFIGURATION 1 +#define IN_BAND_RESET 2 +#define PC_MSG_DOWN_STREAM 4 +#define VM_DOWN_STREAM 5 +#define OOB_DOWN_STREAM 6 +#define FA_DOWN_STREAM 7 + +// ESPIx00 +#define DNCMD_STATUS BIT3 + +// ESPIx2C Master Capability +#define MASTER_FA_SUPPORT BIT0 +#define MASTER_OOB_SUPPORT BIT1 +#define MASTER_VW_SUPPORT BIT2 +#define MASTER_PERIPHERAL_SUPPORT BIT3 + +// ESPIx68 Slave0 Configuration +#define SLAVE_FA_ENABLE BIT0 +#define SLAVE_OOB_ENABLE BIT1 +#define SLAVE_VW_ENABLE BIT2 +#define SLAVE_PC_ENABLE BIT3 + +/// eSPIx00 eSPI Software Specific Register 0 +#define ESPI_DN_TXHDR_0 0x00 +typedef union { + struct { + UINT32 SWCommandType : 3; + UINT32 CommandStatus : 1; + UINT32 PutFlashNpTranActive : 1; + UINT32 Reserved : 3; + UINT32 DnCmdHdata0 : 8; + UINT32 DnCmdHdata1 : 8; + UINT32 DnCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx00_DN_TXHDR0; + +/// eSPIx04 eSPI Software Specific Register 1 +#define ESPI_DN_TXHDR_1 0x04 +typedef union { + struct { + UINT32 DnCmdHdata3 : 8; + UINT32 DnCmdHdata4 : 8; + UINT32 DnCmdHdata5 : 8; + UINT32 DnCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx04_DN_TXHDR1; + +#define ESPI_DN_TXHDR_2 0x08 +typedef union { + struct { + UINT32 DnCmdHdata7 : 8; + UINT32 Reserved : 24; + } Field; + UINT32 Value; +} ESPIx08_DN_TXHDR2; + +#define ESPI_DN_TXDATA_PORT 0x0C +typedef union { + struct { + UINT32 DnTxData0 : 8; + UINT32 DnTxData1 : 8; + UINT32 DnTxData2 : 8; + UINT32 DnTxData3 : 8; + } Field; + UINT32 Value; +} ESPIx0C_DN_TXDATA_PORT; + +#define ESPI_UP_RXHDR_0 0x10 +typedef union { + struct { + UINT32 UpCommandType : 3; + UINT32 UpCommandStatus : 1; + UINT32 SlaveSel : 2; + UINT32 Reserved : 2; + UINT32 UpCmdHdata0 : 8; + UINT32 UpCmdHdata1 : 8; + UINT32 UpCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx10_UP_RXHDR0; + +#define ESPI_UP_RXHDR_1 0x14 +typedef union { + struct { + UINT32 UpCmdHdata3 : 8; + UINT32 UpCmdHdata4 : 8; + UINT32 UpCmdHdata5 : 8; + UINT32 UpCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx14_UP_RXHDR1; + +#define ESPI_UP_RXDATA_PORT 0x18 + +/// eSPIx2C eSPI Master Capability +#define ESPI_MASTER_CAP 0x2C +typedef union { + struct { + UINT32 FlashAccessChannelSupport : 1; + UINT32 OOBMessageChannelSupport : 1; + UINT32 VWChannelSupport : 1; + UINT32 PChannelSupport : 1; + UINT32 MasterVersion : 3; + UINT32 FlashAccessChannelMaxPayload : 3; + UINT32 OOBMessageChannelMaxPayload : 3; + UINT32 OperatingMaxVWCount : 6; + UINT32 PChannelMaxPayloadSize : 3; + UINT32 NumberOfSlave : 3; + UINT32 OperatingSupportFreq : 3; + UINT32 IOMode : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheck : 1; + } Field; + UINT32 Value; +} ESPIx2C_MASTER_CAP; + +/// eSPIx30 eSPI Global Control 0 +#define ESPI_GLOBAL_CTRL0 0x30 +typedef union { + struct { + UINT32 WdgEn : 1; + UINT32 WaitChkEn : 1; + UINT32 PrClkgatEn : 1; + UINT32 AlStopEn : 1; + UINT32 AlIdleTimer : 3; + UINT32 RgDbgclkGatingEn : 1; + UINT32 WdgCnt : 16; + UINT32 WaitCnt : 6; + UINT32 PrRstEnPltrst : 1; + UINT32 SafsClkGateEn : 1; + } Field; + UINT32 Value; +} ESPIx30_GLOBAL_CTRL0; + +/// eSPIx68 eSPI Slave0 Configuration +#define ESPI_SLAVE0_CONFIG 0x68 +typedef union { + struct { + UINT32 FlashAccessChannelEnable : 1; + UINT32 OOBMessageChannelEnable : 1; + UINT32 VWChannelEnable : 1; + UINT32 PChannelEnable : 1; + UINT32 FlashSharingMode : 1; + UINT32 FlashMaxPayloadSize : 3; + UINT32 PutFlashNpHeaderDataEn : 1; + UINT32 PutFlashNpHeaderEn : 1; + UINT32 SafsDeferValidEn : 1; + UINT32 FlashModifierEn : 1; + UINT32 Reserved_24_12 : 13; + UINT32 OperatingFreq : 3; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheckingEnable : 1; + } Field; + UINT32 Value; +} ESPIx68_SLAVE0_CONFIG; + +/// eSPIx70 eSPI Slave0 Interrupt Status +#define ESPI_SLAVE0_INT_STS 0x70 +typedef union { + struct { + UINT32 BusErrInt : 1; + UINT32 WaitTimeoutInt : 1; + UINT32 CrcErrInt : 1; + UINT32 Reserved_3 : 1; + UINT32 NoRspInt : 1; + UINT32 FatalErrInt : 1; + UINT32 NonFatalErrInt : 1; + UINT32 UnknownRspInt : 1; + UINT32 UnknownCtInt : 1; + UINT32 UnsucssCplInt : 1; + UINT32 IllegalTagInt : 1; + UINT32 IllegalLenInt : 1; + UINT32 RxOobOverflowInt : 1; + UINT32 RxMsgOverflowInt : 1; + UINT32 RxFlashOverflowInt : 1; + UINT32 ProtocolErrInt : 1; + UINT32 Reserved_16 : 1; + UINT32 UpFifoWdgTo : 1; + UINT32 MstAbortInt : 1; + UINT32 WdgTimeoutInt : 1; + UINT32 Reserved_23_20 : 4; + UINT32 RxVwGrp0Int : 1; + UINT32 RxVwGrp1Int : 1; + UINT32 RxVwGrp2Int : 1; + UINT32 RxVwGrp3Int : 1; + UINT32 DnCmdInt : 1; + UINT32 RxMsgInt : 1; + UINT32 RxOobInt : 1; + UINT32 FlashReqInt : 1; + } Field; + UINT32 Value; +} ESPIx70_SLAVE0_INT_STS; + +/// +/// Slave Registers +/// +#define SLAVE_REG_ID 0x04 +#define SLAVE_GENERAL_CAPCFG 0x08 +#define SLAVE_PC_CAPCFG 0x10 +#define SLAVE_VW_CAPCFG 0x20 +#define SLAVE_OOB_CAPCFG 0x30 +#define SLAVE_FA_CAPCFG 0x40 +#define SLAVE_FA_CAPCFG2 0x44 + +/// Offset 04h: Device Identification +typedef union { + struct { + UINT32 RO_VersionID : 8; + UINT32 Reserved_31_8 : 24; + } Field; + UINT32 Value; +} ESPI_SL04_DEVICE_ID; + +// SLAVE offset 0x08 SLAVE_GENERAL_CAPCFG +#define SLAVE_FA_SUPPORT BIT3 +#define SLAVE_OOB_SUPPORT BIT2 +#define SLAVE_VW_SUPPORT BIT1 +#define SLAVE_PERIPHERAL_SUPPORT BIT0 +/// Offset 08h: General Capabilities and Configurations +typedef union { + struct { + UINT32 RO_PCSupported : 1; + UINT32 RO_VWSupported : 1; + UINT32 RO_OOBMsgSupported : 1; + UINT32 RO_FASupported : 1; + UINT32 Reserved_7_3 : 4; + UINT32 Reserved_11_8 : 4; + UINT32 RO_MaxWaitStateAllowed : 4; + UINT32 RO_MaxFreqSupported : 3; + UINT32 RO_OpenDrainAlertSupported : 1; + UINT32 OperatingFreq : 3; + UINT32 OpenDrainAlertSelect : 1; + UINT32 RO_IOModeSupported : 2; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 Reserved_29 : 1; + UINT32 ResponseModifierEn : 1; + UINT32 CRCCheckingEn : 1; + } Field; + UINT32 Value; +} ESPI_SL08_SLAVE_GENERAL_CAPCFG; + +/// Offset 10h: Channel 0 Capabilities and Configurations +typedef union { + struct { + UINT32 PCEn : 1; + UINT32 RO_PCReady : 1; + UINT32 BusMasterEn : 1; + UINT32 Reserved_3 : 1; + UINT32 RO_PCMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 PCMaxPayloadSizeSelected : 3; + UINT32 Reserved_11 : 1; + UINT32 PCMaxReadRequestSize : 3; + UINT32 Reserved_31_15 : 17; + } Field; + UINT32 Value; +} ESPI_SL10_SLAVE_PC_CAPCFG; + +/// Offset 20h: Channel 1 Capabilities and Configurations +typedef union { + struct { + UINT32 VWEn : 1; + UINT32 RO_VWReady : 1; + UINT32 Reserved_7_2 : 6; + UINT32 RO_MaxVWCntSupported : 6; + UINT32 Reserved_15_14 : 2; + UINT32 OpMaxVWCnt : 6; + UINT32 Reserved_31_22 : 10; + } Field; + UINT32 Value; +} ESPI_SL20_SLAVE_VW_CAPCFG; + +/// Offset 30h: Channel 2 Capabilities and Configurations +typedef union { + struct { + UINT32 OOBEn : 1; + UINT32 RO_OOBReady : 1; + UINT32 Reserved_3_2 : 2; + UINT32 RO_MsgChMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 MsgChMaxPayloadSizeSelected : 3; + UINT32 Reserved_31_11 : 21; + } Field; + UINT32 Value; +} ESPI_SL30_SLAVE_OOB_CAPCFG; + +/// Offset 40h: Channel 3 Capabilities and Configurations +typedef union { + struct { + UINT32 FAEn : 1; + UINT32 RO_FAReady : 1; + UINT32 FlashBlockEraseSize : 3; + UINT32 RO_ChMaxPayloadSizeSupported : 3; + UINT32 ChMaxPayloadSizeSelected : 3; + UINT32 RO_FlashSharingMode : 1; + UINT32 ChMaxReadReqSize : 3; + UINT32 Reserved_15 : 1; + UINT32 RO_FlashSharingCapabilitySupported : 2; + UINT32 Reserved_19_18 : 2; + UINT32 RO_RPMCCounterOn1stDevice : 4; + UINT32 RO_RPMCOp1On1stDevice : 8; + } Field; + UINT32 Value; +} ESPI_SL40_SLAVE_FA_CAPCFG; + +/// Offset 44h: Channel 3 Capabilities and Configurations2 +typedef union { + struct { + UINT32 RO_TargetMaxReadReqSizeSupported : 3; + UINT32 Reserved_7_3 : 5; + UINT32 RO_TargetFlashEraseBlockSize : 8; + UINT32 RO_TargetRPMCSupported : 6; + UINT32 RO_NumOfRPMCdevices : 2; + UINT32 Reserved_31_24 : 8; + } Field; + UINT32 Value; +} ESPI_SL44_SLAVE_FA_CAPCFG2; + +// +// eSPI Command functions +// +VOID +FchEspiCmd_InBandRst ( + IN UINT32 EspiBase + ); + +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ); + +VOID +FchEspiCmd_SetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr, + IN UINT32 Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp1 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + IN UINT8 *Data + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp2 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h new file mode 100755 index 0000000000..19688e2548 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h @@ -0,0 +1,16 @@ +/** @file + GNB PCIe Library definition. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBPCIECONFIG_LIB_H_ +#define GNBPCIECONFIG_LIB_H_ + +#include <GnbDxio.h> +#include <Library/PcieConfigLib.h> + +#endif // GNBPCIECONFIG_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h new file mode 100644 index 0000000000..df88274530 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h @@ -0,0 +1,37 @@ +/** @file + Header file of AMD NBIO Common DXE library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOCOMMONLIBDXE_H_ +#define NBIOCOMMONLIBDXE_H_ + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ); + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ); + +#endif // NBIOCOMMONLIBDXE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h new file mode 100755 index 0000000000..4fec578a9f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h @@ -0,0 +1,62 @@ +/** @file + GNB function to GetHostPciAddress and GetHandle. + Contain code that create/locate and rebase configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOHANDLELIB_LIB_H_ +#define NBIOHANDLELIB_LIB_H_ + +#include <GnbDxio.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ); + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ); + +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define GnbGetSocketId(Handle) (Handle != NULL ? (Handle)->SocketId : 0) +#define GnbGetDieNumber(Handle) (Handle != NULL ? (Handle)->DieNumber : 0) +#define GnbGetRBIndex(Handle) (Handle != NULL ? (Handle)->RBIndex : 0) + +#endif // NBIOHANDLELIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h new file mode 100644 index 0000000000..9f53746814 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h @@ -0,0 +1,283 @@ +/** @file + Helper functions to access PCIe configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PCIECONFIGLIB_LIB_H_ +#define PCIECONFIGLIB_LIB_H_ + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_WRAPPER_CALLBACK) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK2) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +typedef VOID (*PCIE_RUN_ON_WRAPPER_CALLBACK2) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_DESCRIPTOR_CALLBACK) ( + IN PCIE_DESCRIPTOR_HEADER *Descriptor, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ); + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ); + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ); + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ); + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ); + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ); + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ); + +#define PcieConfigGetParentWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetParent (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetParentSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetParent (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetParentComplex(Descriptor) ((PCIE_COMPLEX_CONFIG *) PcieConfigGetParent (DESCRIPTOR_COMPLEX, &((Descriptor)->Header))) +#define PcieConfigGetPlatform(Descriptor) ((PCIE_PLATFORM_CONFIG *) PcieConfigGetParent (DESCRIPTOR_PLATFORM, &((Descriptor)->Header))) +#define PcieConfigGetChildWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetChildEngine(Descriptor) ((PCIE_ENGINE_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_ENGINES, &((Descriptor)->Header))) +#define PcieConfigGetChildSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetChild (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetNextDescriptor(Descriptor) ((((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : ((Descriptor + 1)))) +#define PcieConfigIsPcieEngine(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_ENGINE) != 0) : FALSE) +#define PcieConfigIsSbPcieEngine(Engine) ((Engine != NULL) ? ((BOOLEAN) (Engine->Type.Port.PortData.MiscControls.SbLink)) : FALSE) +#define PcieConfigIsEngineAllocated(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_ALLOCATED) != 0) : FALSE) +#define PcieConfigSetDescriptorFlags(Descriptor, SetDescriptorFlags) if (Descriptor != NULL) (Descriptor)->Header.DescriptorFlags |= SetDescriptorFlags +#define PcieConfigResetDescriptorFlags(Descriptor, ResetDescriptorFlags) if (Descriptor != NULL) ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags &= (~(ResetDescriptorFlags)) +#define PcieInputParsetGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) +#define PcieConfigGetNextTopologyDescriptor(Descriptor, Termination) ((Descriptor == NULL) ? NULL : ((((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags & Termination) != 0) ? NULL : ((UINT8 *) Descriptor + ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->Peer)) +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define PcieConfigGetNextDataDescriptor(Descriptor) ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0 ? NULL : (Descriptor + 1)) + +#endif // PCIECONFIGLIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h new file mode 100644 index 0000000000..f0c6d1ccbb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _SMNACCESSLIB_H_ +#define _SMNACCESSLIB_H_ + +VOID +SmnRegisterReadS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + OUT VOID *Value + ); + +VOID +SmnRegisterRMWS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + IN UINT32 AndMask, + IN UINT32 OrValue, + IN UINT32 Flags + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h new file mode 100644 index 0000000000..0e08e64b24 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h @@ -0,0 +1,47 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_PCIE_SERVICES_PROTOCOL_H_ +#define NBIO_PCIE_SERVICES_PROTOCOL_H_ + +// Current PROTOCOL revision +#define AMD_NBIO_PCIE_SERVICES_REVISION 0x00 + +/// +/// Forward declaration for the NBIO_PCIE_SERVICES_PROTOCOL +/// +typedef struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL; + +// +// Protocol Definitions +// + +/** + Returns the NBIO debug options configuration structure + This + A pointer to the DXE_AMD_NBIO_SMU_SERVICES_PROTOCOL instance. + DebugOptions + A pointer to a pointer to store the address of the PCIe topology structure +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT)( + IN DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL *This, + OUT UINT32 **DebugOptions + ); + +/// +/// The Dxe of PCIE Services +/// +struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL { + AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT PcieGetTopology; ///< +}; + +extern EFI_GUID gAmdNbioPcieServicesProtocolGuid; + +#endif /* NBIO_PCIE_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h new file mode 100644 index 0000000000..10d3b730a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_OEM_OOB_PPR_PROTOCOL_H_ +#define _AMD_OEM_OOB_PPR_PROTOCOL_H_ + +extern EFI_GUID gAmdOemOobPprDxeProtocolGuid; + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h new file mode 100644 index 0000000000..a15995188b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h @@ -0,0 +1,155 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_NUMA_SERVICES2_H_ +#define FABRIC_NUMA_SERVICES2_H_ +#include "AMD.h" + +#pragma pack (push, 1) + +#define MAX_PXM_VALUES_PER_QUADRANT 16 + +/// Domain type +typedef enum { + NumaDram, + NumaSLink, + NumaCxl, + MaxNumaDomainType2 +} DOMAIN_TYPE2; + +/// Reported Domain Info +typedef struct { + DOMAIN_TYPE2 Type; ///< Type + UINT32 SocketMap; ///< Bitmap indicating physical socket location + UINT32 PhysicalDomain; ///< Physical domain number +} DOMAIN_INFO2; + +/// Physical Dram Info +typedef struct { + UINT32 NormalizedCsMap; ///< Bitmap of CSs comprising this physical domain + UINT32 SharingEntityCount; ///< Number of virtual domains sharing this physical domain + UINT32 SharingEntityMap; ///< Bitmap of reported domains that share this physical domain + UINT32 Reserved; ///< Reserved +} PHYS_DOMAIN_INFO; + +/// Proximity Domain Info +typedef struct { + UINTN Count; ///< Entries in Domain array + UINTN Domain[MAX_PXM_VALUES_PER_QUADRANT]; ///< Domains in Quadrant +} PXM_DOMAIN_INFO; + +/// +/// Forward declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL +/// +typedef struct _FABRIC_NUMA_SERVICES2_PROTOCOL FABRIC_NUMA_SERVICES2_PROTOCOL; + +/** + * @brief Get the numa domain information. + * + * @details Get the numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfDomainsInSystem Number of unique NUMA domains + * @param[out] DomainInfo An array with information about each domain + * @param[out] CcxAsNumaDomain TRUE: each core complex is its own domain + * FALSE: physical mapping is employed + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfDomainsInSystem, + OUT DOMAIN_INFO2 **DomainInfo, + OUT BOOLEAN *CcxAsNumaDomain + ); + +/** + * @brief Translates a core's physical location to the appropriate NUMA domain. + * + * @details Translates a core's physical location to the appropriate NUMA domain. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] Socket Zero based socket that the core is attached to + * @param[in] Die DF die on socket that the core is attached to + * @param[in] Ccd Logical CCD the core is on + * @param[in] Ccx Logical core complex + * @param[out] Domain Domain the core belongs to + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_DOMAIN_XLAT)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN UINTN Socket, + IN UINTN Die, + IN UINTN Ccd, + IN UINTN Ccx, + OUT UINT32 *Domain + ); + +/** + * @brief Get physical numa domain information. + * + * @details Get physical numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfPhysDomainsInSystem Number of valid domains in the system + * @param[out] PhysDomainInfo An array with information about each physical domain + * @param[out] PhysNodesPerSocket Actual NPS as determined by ABL (not including SLink) + * @param[out] NumberOfSystemSLinkDomains Number of domains describing SLink connected memory + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfPhysDomainsInSystem, + OUT PHYS_DOMAIN_INFO **PhysDomainInfo, + OUT UINT32 *PhysNodesPerSocket, + OUT UINT32 *NumberOfSystemSLinkDomains + ); + +/** + * @brief Get the proximity domain information about a PCIe root-port bridge + * + * @details Get the proximity domain information about a PCIe root-port bridge + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] RootPortBDF BDF for root-port bridge in PCI_ADDR format. + * @param[out] PxmDomainInfo Pointer to a structure returning associated NUMA node(s). + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN PCI_ADDR RootPortBDF, + OUT PXM_DOMAIN_INFO *PxmDomainInfo + ); + +/// +/// When installed, the Fabric NUMA Services 2 Protocol produces a collection of +/// services that return various information associated with non-uniform memory +/// architecture. +/// +struct _FABRIC_NUMA_SERVICES2_PROTOCOL { + UINTN Revision; ///< Revision Number + FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO GetDomainInfo; ///< Get Domain Info + FABRIC_NUMA_SERVICES2_DOMAIN_XLAT DomainXlat; ///< Domain Translation + FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO GetPhysDomainInfo; ///< Get Physical Domain Info + FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO GetPxmDomainInfo; ///< Get Proximity Domain Info +}; + +/// +/// Guid declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL. +/// +extern EFI_GUID gAmdFabricNumaServices2ProtocolGuid; + +#pragma pack (pop) +#endif // _FABRIC_NUMA_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h new file mode 100644 index 0000000000..485240c0fb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_TOPOLOGY_SERVICES2_H_ +#define FABRIC_TOPOLOGY_SERVICES2_H_ + +#include <Library/BaseFabricTopologyLib.h> + +#endif // FABRIC_TOPOLOGY_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h new file mode 100755 index 0000000000..44093e4097 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h @@ -0,0 +1,23 @@ +/** @file + SoC Logical ID Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SOC_LOGICAL_ID_H_ +#define SOC_LOGICAL_ID_H_ +#pragma pack (push, 1) + +/// +/// SOC logical ID structure +/// +typedef struct _SOC_LOGICAL_ID { + IN OUT UINT32 Family; ///< Indicates logical ID Family + IN OUT UINT16 Revision; ///< Indicates logical ID Revision +} SOC_LOGICAL_ID; + +#pragma pack (pop) +#endif // SOC_LOGICAL_ID_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h new file mode 100644 index 0000000000..a60ae20d33 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h @@ -0,0 +1,100 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_LIB_H_ +#define _INTERNAL_AML_LIB_H_ + +#include <Uefi.h> +#include <Library/AmlGenerationLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <IndustryStandard/Acpi.h> + +#include "LocalAmlObjects.h" + +// EDK2 open source MdePkg/Include/IndustryStandard/AcpiAml.h does not have +// these and should. +#define AML_DIGIT_CHAR_0 0x30 +#define AML_DIGIT_CHAR_9 0x39 + +// The max string size for a QWord is 8 bytes = 16 characters plus NULL Terminator +#define MAX_AML_DATA_INTEGER_SIZE 17 + +// Defines similar to ctype.h functions isalpha() and isdigit() +#define IS_ASCII_UPPER_ALPHA(c) ( ((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_Z) ) +#define IS_ASCII_HEX_DIGIT(c) ( (((c) >= AML_DIGIT_CHAR_0) && ((c) <= AML_DIGIT_CHAR_9)) ||\ + (((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_F)) ) + +// Swap bytes of upper and lower WORDs within a DWORD +#define Swap4Bytes(val) \ + ( (((val) >> 8) & 0x000000FF) | (((val) << 8) & 0x0000FF00) | \ + (((val) >> 8) & 0x00FF0000) | (((val) << 8) & 0xFF000000) ) + +/* + Calculates the optimized integer value used by AmlDataInteger and others + + Not a public function so no doxygen comment identifiers. + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ); + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ); + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - Field NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h new file mode 100644 index 0000000000..b19b6fe867 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h @@ -0,0 +1,150 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_OBJECTS_H_ +#define _INTERNAL_AML_OBJECTS_H_ + +// #include "LocalAmlLib.h" + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **Object, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ); + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ); + +#endif // _INTERNAL_AML_OBJECTS_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h new file mode 100755 index 0000000000..3a628ed0b2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h @@ -0,0 +1,432 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCIE_COMPLEX_H_ +#define AMD_PCIE_COMPLEX_H_ + +// +// GNB PCIe configuration info +// +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull + +// +// Port parameter count +// +#define PCIE_PORT_PARAMETER_COUNT 64 + +/// +/// PCIe link initialization +/// DXIO endpoint status +/// +typedef enum { + DxioEndpointDetect = 0, ///< Detect endpoint presence + DxioEndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} DXIO_ENDPOINT_STATUS; + +#pragma pack(push,1) +typedef struct { + UINT16 ParamType; ///< This identifies a specific port parameter to set. + UINT16 ParamValue; ///< Specifies the value to be assigned to port parameter. +} PORT_PARAM; + +typedef struct { + PORT_PARAM PhyParam[PCIE_PORT_PARAMETER_COUNT]; ///< PHY port parameter +} PORT_PARAMS; + +/// +/// Ancillary data struct with table size and address +/// +typedef struct { + IN UINT32 Count; ///< Total count in this Ancillary data table + IN UINT32 Ovrd; ///< Ancillary data table address point to ANC_DATA_PARAM[] +} ANC_DATA; + +typedef struct { + UINT16 ParamType; ///< This identifies a specific PHY parameter + UINT16 ParamValue; ///< This specifies the value to be assigned to indicated PHY parameter +} DXIO_PHY_PARAM; + +typedef struct { + DXIO_PHY_PARAM PhyParam[44]; ///< physical parameter +} PHY_DATA; + +/// +/// PCIe specific data structures +/// PCIe port misc extended controls +/// +typedef struct { + UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + UINT8 LinkSafeMode : 1; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through DXIO_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertize muximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + UINT8 ChannelType : 3; ///< Channel Type + ///< 0 - Channel Type Not Specified + ///< - Channel Type Short Trace + ///< 2 - Channel Type Long Trace + UINT8 TurnOffUnusedLanes : 1; ///< Turn Off Unused Lanes + ///< 0 - Turn on + ///< 1 - Turn off +} DXIO_PORT_MISC_CONTROL; + +/// +/// The IO APIC Interrupt Mapping Info +/// +typedef struct { + UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< 0 - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< 1 - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< 2 - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< ... + ///< 8 - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< 0 - ABCD + ///< 1 - BCDA + ///< 2 - CDAB + ///< 3 - DABC + UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< 0 - Entry 0 of IO APIC redirection table + ///< 1 - Entry 1 of IO APIC redirection table + ///< ... + ///< 31 - Entry 31 of IO APIC redirection table +} DXIO_APIC_DEVICE_INFO; +/// +/// PCIe port configuration data +/// +typedef struct { + UINT8 PortPresent : 1; ///< Enable PCIe port for initialization. + UINT8 Reserved1 : 2; ///< Reserved + UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + UINT8 FunctionNumber : 3; ///< Reserved for future use + UINT8 LinkSpeedCapability : 3; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + ///< 4 - Gen4 + ///< 5 - Gen5 + UINT8 AutoSpdChng : 2; ///< Upstread Auto Speed Change Allowed/ + ///< 0 - Use default implementation (Disabled for Gen1, Enabled for Gen2/3) + ///< 1 - Always Disabled + ///< 2 - Always Enabled + ///< 3 - Reserved + UINT8 EqPreset : 4; ///< Gen3 Equalization Preset */ + UINT8 LinkAspm : 2; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + UINT8 LinkAspmL1_1 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 LinkAspmL1_2 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 ClkReq : 4; ///< ASPM Reserved Field + ///< 0 - NONE + ///< 1 - CLKREQ0 signal + ///< 2 - CLKREQ1 signal + ///< 3 - CLKREQ2 signal + ///< 4 - CLKREQ3 signal + ///< 5 - CLKREQG signal + UINT8 LinkHotplug : 4; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + UINT8 SlotPowerLimit; ///< PCIe slot power limit. + UINT8 SlotPowerLimitScale : 2; ///< PCIe slot power limit Scale. + ///< 00b = 1.0x + ///< 01b = 0.1x + ///< 10b = 0.01x + ///< 11b = 0.001x + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 Gen4Features : 5; ///< Unused bits + ///< BIT0(DLF_Exchange) 1 - Disable, 0 - Enable + ///< IT1(DLF_Capability) 1 - Disable, 0 - Enable + UINT16 SlotNum : 13; ///< PHYSICAL_SLOT_NUM + UINT16 CsLink : 3; ///< Reserved + DXIO_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + DXIO_APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + DXIO_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 EsmControl : 1; ///< Enhanced speed mode control + UINT8 CcixControl : 1; ///< Ccix/Cxl control + UINT8 TxVetting : 1; ///< Tx Vetting + UINT8 RxVetting : 1; ///< Rx Vetting + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + UINT8 NtbHotplug : 1; ///< NTB Hotplug flag + ///< 0b = Disabled + ///< 1b = Enabled + UINT8 Reserved2 : 1; ///< Reserved + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 Reserved3 : 5; ///< Reserved + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset + UINT8 Reserved4 : 4; ///< Reserved + UINT16 PsppPolicyDC; ///< Pspp DC control + UINT16 PsppPolicyAC; ///< PSPP AC control + UINT8 PsppDeviceType; ///< Pspp Device Type + UINT8 DisGen3EQPhase : 1; ///< Gen3 Bypass phase2/3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 TXDeEmphasisOride : 1; ///< Override Gen2 DXIO deemphasis default + UINT8 TXDeEmphasis : 2; ///< Gen2 DXIO deemphasis setting + UINT8 Reserved5 : 3; ///< Reserved + struct { + UINT16 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT16 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT16 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT16 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT16 Reserved1 : 2; ///< Unused bits + UINT8 SetDsTxPreset : 1; ///< Gen3 Set Downstream Tx Preset + UINT8 SetDsRxPresetHint : 1; ///< Gen3 Set Downstream Rx Preset Hint + UINT8 SetUsTxPreset : 1; ///< Gen3 Set Upstream Tx Preset + UINT8 SetUsRxPresetHint : 1; ///< Gen3 Set Upstream Rx Preset Hint + UINT8 Reserved2 : 4; ///< Unused bits + } LaneEqualizationCntl; ///< Lane equalization control structure used for Gen3 values + struct { + UINT8 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen4 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen4 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen4LaneEqualizationCntl; ///< Lane equalization control structure used for Gen4 values + struct { + UINT8 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen5 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen5 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen5LaneEqualizationCntl; ///< Lane equalization control structure used for Gen5 values + struct { + UINT32 PresetMask8Gt : 10; ///< Preset Mask 8GT. + UINT32 PresetMask16Gt : 10; ///< Preset Mask 16GT. + UINT32 PresetMask32Gt : 10; ///< Preset Mask 32GT. + UINT32 Reserved1 : 2; ///< Unused bits + UINT8 SetPresetMask8Gt : 1; ///< Preset Mask 8GT Set + UINT8 SetPresetMask16Gt : 1; ///< Preset Mask 16GT Set + UINT8 SetPresetMask32Gt : 1; ///< Preset Mask 32GT Set + UINT8 Reserved2 : 5; ///< Unused bits + } PresetMaskCntl; ///< Preset Mask control structure used for Gen3/Gen4/Gen5 values + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 BypassGen3EQ : 1; ///< Bypass Gen3 equalization + UINT8 BypassGen4EQ : 1; ///< Bypass Gen4 equalization + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:Enable 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 IsBmcLocation : 1; ///< IsBmcLocation + UINT8 SetEsmControl : 1; ///< Set ESM Control + UINT8 SetEsmSpeedBump : 1; ///< Set Speed bump for ESM + UINT8 Reserved6 : 1; ///< Unused bits + UINT8 I2CMuxInfo : 6; ///< Legacy I2c switch + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 Reserved7 : 1; ///< Unused bits + UINT16 NpemEnable : 12; ///< Controls NPEM Enable + UINT16 Reserved8 : 4; ///< Unused bits + UINT16 NpemCapability : 12; ///< Controls NPEM Capability + UINT8 SwingMode : 3; ///< PCIe Swing Mode + UINT16 Reserved9 : 1; ///< Unused bits + UINT16 MpioAncDataIdx; ///< Reserved for internal use only + UINT8 Reserved10; ///< Reserved bits +} DXIO_PORT_DATA; + +/// +/// EtherNet specific data structures +/// +typedef struct { + UINT32 PortNum : 8; ///< Port Number + UINT32 PlatConf : 4; ///< Platform Config + ///< 0 = Reserved + ///< 1 = 10G/1G BackPlane + ///< 2 = 2.5G BackPlane + ///< 3= Soldered down 1000Base-T + ///< 4 = Soldered down 1000Base-X + ///< 5 = Soldered down NBase-T + ///< 6 = Soldered down 10GBase-T + ///< 7 = Soldered down 10GBase-r + ///< 8 = SFP+ Connector + UINT32 Reserved1 : 4; ///< Unused 12-15 + UINT32 MdioId : 5; ///< MDIO ID when MDIO Side band is used + UINT32 Reserved2 : 2; ///< Unused 21-22 + UINT32 SuppSpeed : 4; ///< Supported Speeds by Platform + ///< 1 = 100M Supported + ///< 2 = 1G Supported + ///< 4 = 2.5G Supported + ///< 8 = 10G Supported + UINT32 Reserved3 : 1; ///< Unused 27 + UINT32 ConnType : 3; ///< Supported Speeds by Platform + ///< 0 = Port not Used + ///< 1 = SFP+ Connection I2C interface + ///< 2 = MDIO PHY + ///< 4 = Backplane Connection + UINT32 Reserved4 : 1; ///< Unused 31 +} ETH_PORT_PROPERTY0; + +typedef struct { + UINT32 MdioReset : 2; ///< MDIO Reset Type + ///< 0 = None + ///< 1 = I2C GPIO + ///< 2 = Integrated GPIO + ///< 3 = Reserved + UINT32 Reserved1 : 2; ///< Unused 2-3 + UINT32 MdioGpioResetNum : 2; ///< Integrated GPIO number for reset + UINT32 Reserved2 : 2; ///< Unused 6-7 + UINT32 SfpGpioAdd : 3; ///< Lower I2C address of GPIO Expander PCA9535 + UINT32 Reserved3 : 1; ///< Unused 11 + UINT32 TxFault : 4; ///< TX FAULT + UINT32 Rs : 4; ///< RS Signal + UINT32 ModAbs : 4; ///< MOD_ABS signal + UINT32 RxLoss : 4; ///< Rx_LOS signal + UINT32 SfpGpioMask : 4; ///< SFP+ sideband signals that are not supported by platform +} ETH_PORT_PROPERTY3; + +typedef struct { + UINT32 SfpMux : 3; ///< Lower address of Mux PCA 9545 + UINT32 Reserved1 : 1; ///< Unused 3 + UINT32 SfpBusSeg : 3; ///< SFP BUS Segment. Downstream channels of PCA9545 + UINT32 Reserved2 : 1; ///< Unused 7 + UINT32 SfpMuxUpAdd : 5; ///< Upper address of Mux PCA 9545 + UINT32 Reserved3 : 3; ///< Unused 13-15 + UINT32 RedriverAddress : 7; ///< Address of ReDriver + UINT32 RedriverInterface : 1; ///< ReDriver Interface Descriptor + UINT32 RedriverLane : 3; ///< ReDriver Lane number + UINT32 Reserved4 : 1; ///< Unused 27 + UINT32 RedriverModel : 3; ///< ReDriver Model + UINT32 RedriverPresent : 1; ///< Redriver Present +} ETH_PORT_PROPERTY4; + +typedef struct { + UINT32 TxEqPre : 6; ///< TX EQ PRE + UINT32 Reserved1 : 2; ///< Unused 7-6 + UINT32 TxEqMain : 6; ///< TX EQ MAIN + UINT32 Reserved2 : 2; ///< Unused 15-14 + UINT32 TxEqPost : 6; ///< TX EQ POST + UINT32 Reserved3 : 10; ///< Unused 31-23 +} ETH_PORT_TXEQ; +/// Ethernet PCIe port configuration data +/// +typedef struct { + ETH_PORT_PROPERTY0 EthPortProp0; ///< XGBE_PORT_PROPERTY_0 + ETH_PORT_PROPERTY3 EthPortProp3; ///< XGBE_PORT_PROPERTY_3 + ETH_PORT_PROPERTY4 EthPortProp4; ///< XGBE_PORT_PROPERTY_4 + UINT32 PadMux0; ///< PadMux0 Setting (8 bits) + UINT32 PadMux1; ///< PadMux1 Setting (8 bits) + UINT32 MacAddressLo; ///< Lower 32 bits of MAC Address + UINT32 MacAddressHi; ///< Upper 32 bits of MAC Address + ETH_PORT_TXEQ EthPortTxEq; ///< TX EQ Settings +} ETHERNET_PORT_DATA; + +/// +/// High level data structures for passing topology from platform to AGESA +/// +typedef struct { + UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + UINT8 HotPluggable : 1; ///< HotPluggable + ///< 0 - Link is NOT Hot-Switchable + ///< 1 - Link IS Hot-Switchable + UINT8 Reserved1 : 7; ///< Unused field, leave as 0 + UINT8 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 GpioGroupId; ///< Unique identifier for the GPIO or GPIO group associated with + ///< this engine. GPIOs are used for hotplug notification and link + ///< type (e.g SATA Express or PCIe) + UINT8 DxioStartLane; ///< Internal coding of start lane + UINT8 DxioEndLane; ///< Internal coding of end lane + UINT8 SearchDepth; ///< SearchDepth only uses 1 bit - always initialize to 0 will be updated dynamically +} DXIO_ENGINE_DATA; + +/// +/// PCIe port descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in complex + DXIO_ENGINE_DATA EngineData; ///< Engine data + DXIO_PORT_DATA Port; ///< PCIe port specific configuration info + ETHERNET_PORT_DATA EtherNet; ///< Ancillary data for EtherNet + PHY_DATA Phy; ///< Ancillary data for PHY programming customization + PORT_PARAMS PortParams; ///< Extensible port parameter list for simplified topology structure + ANC_DATA AncData; ///< Ancillary data override +} DXIO_PORT_DESCRIPTOR; + +#pragma pack(pop) + +/// +/// +/// PCIe Complex descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR *PciePortList; ///< Pointer to array of PCIe port descriptors or NULL (Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST). + VOID *Reserved2; ///< Reserved for future use + UINT8 BmcLinkLocation; ///< Identifies the socket/die location of a BMC link (Used by AGESA, input not required) + UINT8 BmcLinkLaneNum; ///< Identifies the socket/die location of a BMC Lane number + UINT8 Reserved3[2]; ///< Reserved for future +} DXIO_COMPLEX_DESCRIPTOR; + +/// +/// Engine descriptor type +/// +typedef enum { + DxioUnusedEngine = 0, ///< Unused descriptor Excluded from configuration + DxioPcieEngine = 1, ///< PCIe port + DxioUSBEngine = 2, ///< USB port + ///< __Deprecated__ + DxioSATAEngine = 3, ///< SATA + DxioUSB_OVER_PCIE = 4, ///< USB4 PCIe (internal use only) + DxioUBMHFCEngine = 5, ///< New for Genoa UBM HFC Connector for auto-discovery + DxioOCP3Engine = 6, ///< New for Genoa OCP3 Bifurcatable Connector + DxioUdot3Engine = 7, ///< New for Genoa U.3 Multiprotocol Connector + DxioDPEngine = 8, ///< Digital Display __For APU display connector list__ + DxioEthernetEngine = 0x10, ///< Ethernet (GBe, XGBe) + ///< __Deprecated__ + DxioGOPEngine = 0x20, ///< GOP + ///< __Deprecated__ + DxioNTBDevice = 0x60, ///< For NBIF NTB Enable (internal use only) + DxioHDaudioEngine, ///< For NBIF HDaudtio Enable (internal use only) + DxioACPEngine, ///< For NBIF ACP Enable (internal use only) + DxioMP2Engine, ///< For NBIF MP2 Enable (internal use only) + DxioMaxPcieEngine ///< Max engine type for boundary check. +} DXIO_ENGINE_TYPE; + +/// +/// PCIe link speeds +/// +typedef enum { + DxioGenMaxSupported, ///< Maximum supported + DxioGen1 = 1, ///< Gen1 + DxioGen2, ///< Gen2 + DxioGen3, ///< Gen3 + DxioGen4, ///< Gen4 + DxioGen5, ///< Gen5 + MaxDxioGen ///< Max Gen for boundary check +} DXIO_LINK_SPEEDS; +#endif // AMD_PCIE_COMPLEX_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdSoc.h b/Platform/AMD/AgesaPkg/Include/AmdSoc.h new file mode 100644 index 0000000000..d62f260235 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdSoc.h @@ -0,0 +1,17 @@ +/** @file + + Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_SOC_H_ +#define _AMD_SOC_H_ + +#define F1A_BRH_A0_RAW_ID 0x00B00F00ul +#define F1A_BRH_B0_RAW_ID 0x00B00F10ul +#define F1A_BRH_B1_RAW_ID 0x00B00F11ul +#define F1A_BRHD_A0_RAW_ID 0x00B10F00ul +#define F1A_BRHD_B0_RAW_ID 0x00B10F10ul +#endif // _AMD_SOC_H_ diff --git a/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h new file mode 100644 index 0000000000..2291f7dc83 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h @@ -0,0 +1,42 @@ +/** @file + Fabric resource manager common definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_CMN_H_ +#define FABRIC_RESOURCE_MANAGER_CMN_H_ +#pragma pack (push, 1) + +#define MAX_SOCKETS_SUPPORTED 2 ///< Max number of sockets in system. +#define MAX_RBS_PER_SOCKET 20 ///< Max number of root bridges per socket. + +/** + * @brief DF address aperture structure. + * @details This contains information used to define an MMIO region. + */ +typedef struct _FABRIC_ADDR_APERTURE { + UINT64 Base; ///< Aperture base Address. + UINT64 Size; ///< Aperture size. + UINT64 Alignment; ///< Alignment bit map. 0xFFFFF means 1MB align. +} FABRIC_ADDR_APERTURE; + +/** + * @brief DF Resource for each RootBridge structure. + * @details This contains information used to define the MMIO region for each RootBridge. + */ +typedef struct _FABRIC_RESOURCE_FOR_EACH_RB { + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondNonPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second nonprefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second prefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE IO[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< IO resource(s) @see FABRIC_ADDR_APERTURE + UINT16 PciBusNumber[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< PCI bus number(s). +} FABRIC_RESOURCE_FOR_EACH_RB; +#pragma pack (pop) +#endif // FABRIC_RESOURCE_MANAGER_CMN_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h new file mode 100644 index 0000000000..9e58f299b4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h @@ -0,0 +1,96 @@ +/** @file + AMD Memory Info Hob Definition + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_MEMORY_INFO_HOB_H_ +#define AMD_MEMORY_INFO_HOB_H_ + +/** + * @brief 128 bit Buffer containing UID Unique Identifier value for Memory Info HOB. + * EFI_GUID defined in UefiBaseType.h + */ +extern EFI_GUID gAmdMemoryInfoHobGuid; + +#pragma pack (push, 1) + +/** + * @brief Memory descriptor structure for each memory range + */ +typedef struct { + UINT64 Base; ///< Base address of memory rang + UINT64 Size; ///< Size of memory rang + UINT32 Attribute; ///< Attribute of memory rang + UINT32 Reserved; ///< For alignment purpose +} AMD_MEMORY_RANGE_DESCRIPTOR; + +/** + * @brief Memory attribute in the memory range descriptor = AVAILABLE + */ +#define AMD_MEMORY_ATTRIBUTE_AVAILABLE 0x1 + +/** + * @brief Memory attribute in the memory range descriptor = UMA + */ +#define AMD_MEMORY_ATTRIBUTE_UMA 0x2 + +/** + * @brief Memory attribute in the memory range descriptor = MMIO + */ +#define AMD_MEMORY_ATTRIBUTE_MMIO 0x3 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_RESERVED 0x4 + +/** + * @brief Memory attribute in the memory range descriptor = GPUMEM + */ +#define AMD_MEMORY_ATTRIBUTE_GPUMEM 0x5 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_SP + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_SP 0x6 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED 0x7 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED_TMR + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED_TMR 0x8 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED_SMUFEATURES + */ +#define AMD_MEMORY_ATTRIBUTE_Reserved_SmuFeatures 0x9 + +/// Memory info HOB structure +typedef struct { + UINT32 Version; ///< Version of HOB structure + BOOLEAN AmdMemoryVddioValid; ///< This field determines if Vddio is valid + UINT16 AmdMemoryVddio; ///< Vddio Voltage + BOOLEAN AmdMemoryVddpVddrValid; ///< This field determines if VddpVddr is valid + UINT8 AmdMemoryVddpVddr; ///< VddpVddr voltage + BOOLEAN AmdMemoryFrequencyValid; ///< Memory Frequency Valid + UINT32 AmdMemoryFrequency; ///< Memory Frquency + UINT32 AmdMemoryDdrMaxRate; ///< Memory DdrMaxRate + UINT32 NumberOfDescriptor; ///< Number of memory range descriptor + AMD_MEMORY_RANGE_DESCRIPTOR Ranges[1]; ///< Memory ranges array +} AMD_MEMORY_INFO_HOB; + +#pragma pack (pop) + +/** + * @brief Macro that defines the Memory Info HOB version + */ +#define AMD_MEMORY_INFO_HOB_VERISION 0x00000110ul // Ver: 00.00.01.10 + +#endif // AMD_MEMORY_INFO_HOB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h new file mode 100644 index 0000000000..d144a4ad20 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h @@ -0,0 +1,51 @@ +/** @file + AMD Psp Base Lib + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_BASELIB_V2_H_ +#define AMD_PSP_BASELIB_V2_H_ + +#include <AmdPspDirectory.h> + +#define MAX_IMAGE_SLOT_COUNT 32 + +#define ALIGNMENT_4K BASE_4KB +#define ALIGN_CHECK(addr, alignment) ((((UINTN)(addr)) & ((alignment) - 1)) == 0) +#define ALIGN_4K_CHECK(addr) ALIGN_CHECK((addr), ALIGNMENT_4K) + +#define IS_VALID_ADDR32(addr) (((UINT32)(addr) != 0) && (UINT32)(addr) != 0xFFFFFFFF) + +#pragma pack (push, 1) + +#define FIRMWARE_TABLE_SIGNATURE 0x55AA55AAul + +/// Define the structure OEM signature table +typedef struct _FIRMWARE_ENTRY_TABLEV2 { + UINT32 Signature; ///< 0x00 Signature should be 0x55AA55AAul + UINT32 ImcRomBase; ///< 0x04 Base Address for Imc Firmware + UINT32 GecRomBase; ///< 0x08 Base Address for Gmc Firmware + UINT32 XHCRomBase; ///< 0x0C Base Address for XHCI Firmware + UINT32 LegacyPspDirBase; ///< 0x10 Base Address of PSP directory + UINT32 PspDirBase; ///< 0x14 Base Address for PSP directory + UINT32 Reserved1; ///< 0x18 Base Address for Reserved BIOS directory + UINT32 Reserved2; ///< 0x1C Base Address for Reserved BIOS directory + UINT32 Reserved3; ///< 0x20 Base Address for Reserved BIOS directory + UINT32 Config; ///< 0x24 reserved for EFS Configuration + UINT32 NewBiosDirBase; ///< 0x28 Generic Base address for all program + UINT32 PspDirBackupBase; ///< 0x2C Backup PSP directory address for all programs +} FIRMWARE_ENTRY_TABLEV2; + +/// It also used as structure to store ISH generic information across programs +typedef struct { + UINT32 Priority; + UINT32 UpdateRetries; + UINT32 GlitchRetries; + UINT32 ImageSlotAddr; +} IMAGE_SLOT_HEADER; + +#pragma pack (pop) + +#endif // AMD_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h new file mode 100644 index 0000000000..23c90b65c2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h @@ -0,0 +1,83 @@ +/** @file + AMD Psp Ftpm Library header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_LIB_H_ +#define PSP_FTPM_LIB_H_ +#include <IndustryStandard/Acpi30.h> + +/* SYSTEM_TPM_CONFIG_VAL + * Value range for APCB_TOKEN_UID_PSP_SYSTEM_TPM_CONFIG + */ +typedef enum { + SYSTEM_TPM_CONFIG_DTPM = 0x00, ///< dTPM + SYSTEM_TPM_CONFIG_PSP_FTPM = 0x01, ///< PSP FTPM + SYSTEM_TPM_CONFIG_HSP_FTPM = 0x02, ///< HSP FTPM + SYSTEM_TPM_CONFIG_NONE = 0xFF, ///< None of TPM +} SYSTEM_TPM_CONFIG_VAL; + +#pragma pack (push, 1) +/// Define TPM_2_CONTROL_AREA +typedef struct { + // Interface Identifier + volatile UINT64 InterfaceIdentifier; ///< Interface Identifier + // TPM2 Control Area Extension + volatile UINT32 Clear; ///< Clear + volatile UINT32 RemainingBytes; ///< RemainingBytes + volatile UINT32 StatusReserved; ///< StatusReserved + volatile UINT32 StatusError; ///< StatusError + volatile UINT32 StatusCancel; ///< StatusCancel + volatile UINT32 StatusStart; ///< StatusStart + UINT64 InterruptControl; ///< InterruptControl + UINT32 CommandSize; ///< CommandSize + EFI_PHYSICAL_ADDRESS CommandAddress; ///< CommandAddress + UINT32 ResponseSize; ///< ResponseSize + EFI_PHYSICAL_ADDRESS ResponseAddress; ///< ResponseAddress + // Memory Absent command/response buffer + volatile UINT32 CmdRespHWBuffer; ///< Cmd/Rsp HW Buffer +} TPM2_CONTROL_AREA; + +#pragma pack (pop) + +/** + GET TPM related Info + + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +EFI_STATUS +FtpmGetInfo ( + IN OUT UINTN *FtpmStatus + ); + +/** + Execute a TPM command + + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +EFI_STATUS +FtpmExecuteCommand ( + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +#endif //PSP_FTPM_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h new file mode 100644 index 0000000000..4ad4020f95 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h @@ -0,0 +1,231 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _PSP_ROM_ARMOR_LIB_H_ +#define _PSP_ROM_ARMOR_LIB_H_ + +#include "Uefi.h" + +#define PSP_MAX_SPI_CMD_SUPPORT (4) ///< Max number of SPI command support +#define PSP_MAX_SPI_DATA_BUFFER_SIZE (72) ///< Max SPI Command Data Buffer Size +#define PSP_MAX_WHITE_LIST_CMD_NUM (32) ///< Max White list allowed command array number support +#define PSP_MAX_WHITE_LIST_REGION_NUM (16) ///< Max White list allowed region array number support + +#define SPI_CHIP_SELECT_ALL (0) ///< Allowed on all chip selects +#define SPI_CHIP_SELECT_1 (1) ///< Chip Select 1 +#define SPI_CHIP_SELECT_2 (2) ///< Chip Select 2 + +#define SPI_COMMAND_FREQUENCY_66_66MHZ (0) ///< 0=66.66MHz +#define SPI_COMMAND_FREQUENCY_33_33MHZ (1) ///< 1=33.33MHz +#define SPI_COMMAND_FREQUENCY_22_22MHZ (2) ///< 2=22.22MHz +#define SPI_COMMAND_FREQUENCY_16_66MHZ (3) ///< 3=16.66MHz +#define SPI_COMMAND_FREQUENCY_100MHZ (4) ///< 4=100MHz +#define SPI_COMMAND_FREQUENCY_800KHZ (5) ///< 5=800KHz + +#define SPI_COMMAND_NOT_PROCEDDED (0) ///< 0 = Command not examined/processed +#define SPI_COMMAND_COMPLETED (1) ///< 1 = Command completed successfully +#define SPI_COMMAND_EXECUTION_ERROR (2) ///< 2 = Execution Error (i.e. timeout) +#define SPI_COMMAND_NOT_ALLOWED (3) ///< 3 = Command not allowed by Whitelist +#define SPI_COMMAND_MALFORMED (4) ///< 4 = Command malformed + +#pragma pack (push, 1) + +typedef struct { + UINT8 ChipSelect; ///< 1 = CS1, 2 = CS2, all other values illegal + + UINT8 Frequency; ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 BytesToTx; ///< Bytes to Transmit, valid range is 0-72. Does not include the + ///< SPI Opcode byte, but does include the address, dummy bytes, and + ///< data. + + UINT8 BytesToRx; ///< Bytes to Receive from device, BytesToTx + BytesToRx <= 72 + + UINT8 OpCode; ///< The SPI Command OpCode (the first byte sent by the SPI controller) + + UINT8 Reserved[3]; ///< Reserved for future expansion + + UINT8 Buffer[PSP_MAX_SPI_DATA_BUFFER_SIZE]; ///< The remaining 0-72 bytes sent/received by the SPI controller. + ///< + ///< The SPI Controller will + ///< 1. Assert the ChipSelect + ///< 2. Send the one byte OpCode + ///< 3. Send Buffer[0] to Buffer[BytesToTx-1] to the SPI device + ///< 4. Read BytesToRx bytes from the device into Buffer[BytesToTx] to + ///< Buffer[BytesToTx+BytesToRx-1] + ///< 5. Deassert the ChipSelect line + ///< + ///< SPI ROM Commands that include a target address send the address + ///< immediately after the OpCode (i.e. Buffer[0..2] or Buffer[0..3] + ///< depending if 24 or 32bit addresses are associated with the OpCode). + ///< See the SPI ROM Device's datasheet for full details on your + ///< devices commands and formats. +} SPI_COMMAND; ///< The struct of Spi Command + +typedef union { + struct { + ///< SPI_COMMUNICATION_RESULT + UINT16 Command0Result : 4; ///< Result[ 3: 0] The result of Command[0] + UINT16 Command1Result : 4; ///< Result[ 7: 4] The result of Command[1] + UINT16 Command2Result : 4; ///< Result[11: 8] The result of Command[2] + UINT16 Command3Result : 4; ///< Result[15:12] The result of Command[3] + } Field; ///< the struct type of Command0 ~ Command4 + UINT16 Value; ///< 16 bit value of Command0 ~ Command4 +} SPI_COMMUNICATION_RESULT; ///< The union struct type of Spi Communication Result + +typedef struct { + UINT8 ReadyToRun; ///< Set to FALSE by x86 while the buffer is being constructed. Set to + ///< TRUE by x86 as the last step in building the communication buffer, + ///< just before x86 rings the PSP doorbell. + ///< + ///< Set to FALSE by PSP after the PSP copies the buffer from DRAM to + ///< private SRAM. + + UINT8 CommandCount; ///< Number of commands to execute, Valid Values 1-4 + + SPI_COMMUNICATION_RESULT SpiCommunicationResult; ///< Set to zero by x86 when the buffer is built. Atomically set to a + ///< non-zero value by the PSP to indicate the PSP has finished + ///< processing the requests in the communication buffer. The specific + ///< value written by the PSP provides per command results + ///< + ///< Result values with special meaning: + ///< 0x0000 = (written by x86) PSP has not finished handling the request + ///< 0x1000 = PSP determined the request is malformed (invalid + ///< CommandCount, chipselect, BytesToRx/Tx, etc) + ///< 0x2000, 0x3000, 0x4000, ... , 0xF000 = Reserved for future errors + ///< + ///< Generic Result values: + ///< SpiCommunicationResult[ 3: 0] The result of Command[0] + ///< SpiCommunicationResult[ 7: 4] The result of Command[1] + ///< SpiCommunicationResult[11: 8] The result of Command[2] + ///< SpiCommunicationResult[15:12] The result of Command[3] + ///< 0 = Command not examined/processed + ///< 1 = Command completed successfully + ///< 2 = Execution Error (i.e. timeout) + ///< 3 = Command not allowed by Whitelist + ///< 4 = Command malformed + ///< 5-15 = reserved for future use + ///< + ///< Examples of Generic Results: + ///< 0x0000 - PSP has not finished the request + ///< 0x0001 - PSP ran Command0 successfully, and is now idle + ///< 0x0111 - PSP ran Command0/1/2 successfully and is now idle + ///< 0x0031 - PSP ran Command0, but Command1 was blocked by whitelist + + SPI_COMMAND SpiCommand[PSP_MAX_SPI_CMD_SUPPORT]; ///< Spi command array +} SPI_COMMUNICATION_BUFFER; ///< The struct type of Spi Communication Buffer + +typedef struct { + UINT8 ChipSelect; ///< 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + + UINT8 Frequency; ///< The allowed frequency for the command + ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 OpCode; ///< The allowed commands opcode + + UINT8 MinTx; ///< The minimum range of allowed transmit byte counts for this command + ///< (does not include opcode) + UINT8 MaxTx; ///< The maximum range of allowed transmit byte counts for this command + ///< (does not include opcode) + + UINT8 MinRx; ///< The minimum range of allowed Rx byte counts + UINT8 MaxRx; ///< The maximum range of allowed Rx byte counts + + UINT8 AddrChkMethod; ///< 0=No address verification performed + ///< 1=Treat Buffer[0-2] as a 24-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + ///< 2=Treat Buffer[0-3] as a 32-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + + UINT32 ImpactSize; ///< The Impact Zone is the naturally aligned power of two sized block + ///< of addresses that may be impacted by a given SPI Command. For + ///< example, a sector erase command targeted at an address within a + ///< 64K block will impact every byte within that 64K block. Likewise + ///< a page program SPI command (i.e. write) may impact many bytes + ///< within the targeted 256/512 byte page due to page wrap-around, but + ///< no bytes outside the page. The ImapctSize field specifies the power + ///< of two size of the ImpactZone for this command. If VerifyAddress is + ///< zero (no checking) this field must also be zero, otherwise this + ///< field must be a power of two between 256 and 64MB (256, 512, ..., + ///< 67108864). NOTE: When setting this field, carefully examine your + ///< device's datasheet. + ///< +} WHITE_LIST_ALLOWED_COMMAND; ///< The struct type of White List Allowed Command + +typedef struct { + // 8 bytes + UINT32 StartAddress; ///< LSB must be 0x00, bit31 identifies a chipselect: 0=CS1, 1=CS2 + UINT32 EndAddress; ///< LSB must be 0xFF, StartAddress must be less than EndAddress +} WHITE_LIST_ALLOWED_REGION; ///< The struct type of White List Allowed Region + +typedef struct { + UINT8 AllowedCmdCount; ///< Allow Command Count + UINT8 AllowedRegionCount; ///< Allow Region Count + WHITE_LIST_ALLOWED_COMMAND WhitelistAllowedCommands[PSP_MAX_WHITE_LIST_CMD_NUM]; ///< White List Allowed Command Table + WHITE_LIST_ALLOWED_REGION WhitelistAllowedRegions[PSP_MAX_WHITE_LIST_REGION_NUM]; ///< White List Allowed Region Table +} SPI_WHITE_LIST; ///< The struct type of Spi White List + +#pragma pack (pop) + +/** + * @brief Request secures the SPI Controller + * + * @param[in,out] SpiCommunicationBuffer Spi Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN OUT SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ); + +/** + * @brief Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI white list structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ); + +/** + * @brief Request execute SPI command provide in TSEG comm buffer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ); + +/** + * @brief Request PSP firmware switch SPI controller chip select. + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ); + +#endif //_PSP_ROM_ARMOR_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h new file mode 100644 index 0000000000..0189910bd1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h @@ -0,0 +1,2722 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AML_LIB_H_ +#define AML_LIB_H_ + +#include <Uefi.h> +#include <IndustryStandard/Acpi.h> + +typedef enum { + AmlStart, + AmlClose, + AmlInvalid +} AML_FUNCTION_PHASE; + +#define AML_OBJECT_INSTANCE_SIGNATURE SIGNATURE_32 ('a', 'm', 'l', 'o') + +// +// Device Status Bitmap (Section 6.3.7 ACPI version 6.3) +// Bit [0] - Set if the device is present. +// Bit [1] - Set if the device is enabled and decoding its resources. +// Bit [2] - Set if the device should be shown in the UI. +// Bit [3] - Set if the device is functioning properly (cleared if device +// failed its diagnostics). +// Bit [4] - Set if the battery is present. +// Bits [31:5] - Reserved (must be cleared). +// +#define DEVICE_PRESENT_BIT 0x0001 +#define DEVICE_ENABLED_BIT 0x0002 +#define DEVICE_IN_UI_BIT 0x0004 +#define DEVICE_HEALTH_BIT 0x0008 +#define DEVICE_BATTERY_BIT 0x0010 // Control Method Battery Device Only + +typedef enum { + UnknownObj, + IntObj, + StrObj, + BuffObj, + PkgObj, + FieldUnitObj, + DeviceObj, + EventObj, + MethodObj, + MutexObj, + OpRegionObj, + PowerResObj, + ProcessorObj, + ThermalZoneObj, + BuffFieldObj, + DDBHandlObj, + InvalidObj +} OBJECT_TYPE_KEYWORD; + +typedef struct { + UINT32 Signature; + BOOLEAN Completed; + UINTN DataSize; + UINT8 *Data; + LIST_ENTRY Link; +} AML_OBJECT_INSTANCE; + +// *************************************************************************** +// AML defines to be consistent with already existing +// MdePkg/Include/IndustryStandard/Acpi*.h defines. +// *** These could be upstreamed at some point. +// *************************************************************************** +// Limits of (DWord|Word|QWord)Space ResourceType +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MIN 0xC0 +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MAX 0xFF + +// General Flags: Flags that are common to all resource types +// Bits[7:4] Reserved(must be 0) +// Bit[3] Max Address Fixed, _MAF: +// 1 The specified maximum address is fixed +// 0 The specified maximum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED (1 << 3) +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED (0 << 3) +#define EFI_ACPI_GENERAL_FLAG_MASK_MAF EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +// Bit[2] Min Address Fixed, _MIF: +// 1 The specified minimum address is fixed +// 0 The specified minimum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED (1 << 2) +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED (0 << 2) +#define EFI_ACPI_GENERAL_FLAG_MASK_MIF EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +// Bit[1] Decode Type, _DEC: +// 1 This bridge subtractively decodes this address(top level bridges only) +// 0 This bridge positively decodes this address +#define EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE (1 << 1) +#define EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE (0 << 1) +#define EFI_ACPI_GENERAL_FLAG_MASK_DEC EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +// Bit[0] Consumer / Producer: +// 1 This device consumes this resource +// 0 This device produces and consumes this resource +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER (1 << 0) +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER (0 << 0) +#define EFI_ACPI_GENERAL_FLAG_MASK_USAGE EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER + +// Memory Resource Flag (Resource Type = 0) DefinitionsBits +// Memory Resource Flag Masks +// Bits[7:6] Reserved(must be 0) +// Bit[5] Memory to I/O Translation, _TTP: +// 0 TypeStatic +// 1 Type Translation +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_TTP (1 << 5) +// Bit[4:3] Memory Attributes, _MTP: +// 0 AddressRangeMemory +// 1 AddressRangeReserved +// 2 AddressRangeACPI +// 3 AddressRangeNVS +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MTP (3 << 3) +// Bit[2:1] Memory Attributes, _MEM: +// 0 The memory is non-cacheable +// 1 The memory is cacheable +// 2 The memory is cacheable and supports write-combining +// 3 The memory is cacheable and prefetchable +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM (3 << 1) +// Bit[0] Write Status, _RW: +// 0 This memory range is read-only +// 1 This memory is read-write +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW (1 << 0) + +// I/O Resource Flag (Resource Type = 1) DefinitionsBits +// I/O Resource Flags +// Bit [7:6] Reserved (must be 0) +// Bit [5] Sparse Translation, _TRS. This bit is only meaningful if Bit [4] is set. +// 1 SparseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = (((port & 0xFFFc) << 10) || (port & 0xFFF)) + _TRA In the address +// used to access the I/O port, bits[11:2] must be identical to bits[21:12], +// this gives four bytes of I/O ports on each 4 KB page. +// 0 DenseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = port + _TRA +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_SPARSE_TRANSLATION (1 << 5) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_DENSE_TRANSLATION (0 << 5) +// Bit [4] I/O to Memory Translation, _TTP +// 1 TypeTranslation: This resource, which is I/O on the secondary side of the +// bridge, is memory on the primary side of the bridge. +// 0 TypeStatic: This resource, which is I/O on the secondary side of the +// bridge, is also I/O on the primary side of the bridge. +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_TRANSLATION (1 << 4) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_STATIC (0 << 4) +// Bit [3:2] Reserved (must be 0) +// Bit [1:0] _RNG +// 3 Memory window covers the entire range +// 2 ISARangesOnly. This flag is for bridges on systems with multiple bridges. +// Setting this bit means the memory window specified in this descriptor is +// limited to the ISA I/O addresses that fall within the specified window. The +// ISA I/O ranges are: n000-n0FF, n400-n4FF, n800-n8FF, nC00-nCFF. This bit can +// only be set for bridges entirely configured throughACPI namespace. +// 1 NonISARangesOnly. This flag is for bridges on systems with multiple +// bridges. Setting this bit means the memory window specified in this +// descriptor is limited to the non-ISA I/O addresses that fall within the +// specified window. The non-ISA I/O ranges are: n100-n3FF, n500-n7FF, +// n900-nBFF, nD00-nFFF. This bit can only be set for bridges entirely +// configured through ACPI namespace. +// 0 Reserved +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE (3 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY (2 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY (1 << 0) + +#define AML_OBJECT_INSTANCE_FROM_LINK(a) BASE_CR (a, AML_OBJECT_INSTANCE, Link) + +// Method Serialize Flag Values +typedef enum { + NotSerialized, + Serialized, + FlagInvalid +} METHOD_SERIALIZE_FLAG; +// AccessField Access Attrib Flags. +// Ref ACPI spec 6.3 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL 0x00 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK 0x02 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE 0x04 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE 0x06 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD 0x08 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK 0x0A +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES 0x0B +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL 0x0C +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL 0x0D +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES 0x0E +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES 0X0F + +// AccessField access types +typedef enum { + AnyAcc, + ByteAcc, + WordAcc, + DWordAcc, + QWordAcc, + BufferAcc, +} EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS; + +// Field lock rules +typedef enum { + NoLock, + Lock +} EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS; + +// Field update rules +typedef enum { + Preserve, + WriteAsOnes, + WriteAsZeros +} EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS; + +// Field access attributes. for AttribBytes, AttribRawBytes and AttribRawProcessBytes +// the ExtendedAccessField definition is used, as this is what iASL compiles into, rather +// than the AccessField that is specified in the ACPI spec. +typedef enum { + AttribNormal = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL, + AttribQuick = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK, + AttribSendReceive = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE, + AttribByte = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE, + AttribWord = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD, + AttribBlock = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK, + AttribBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES, + AttribProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL, + AttribBlockProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL, + AttribRawBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES, + AttribRawProcessBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES +} EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS; + +// +// Resource Type Specific Flags +// Ref ACPI specification 6.4.3.5.5 +// +// +// DMA Information +// Ref ACPI specification 6.4.2.2 +// +// DmaType values +typedef enum { + Compatibility = EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY, + TypeA = EFI_ACPI_DMA_SPEED_TYPE_A, + TypeB = EFI_ACPI_DMA_SPEED_TYPE_B, + TypeF = EFI_ACPI_DMA_SPEED_TYPE_F +} EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS; + +// IsBusMaster values +typedef enum { + NotBusMaster = 0, + BusMaster = EFI_ACPI_DMA_BUS_MASTER +} EFI_ACPI_DMA_BUS_MASTER_KEYWORDS; + +// DmaTransferSize values +typedef enum { + Transfer8 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT, + Transfer8_16 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT, + Transfer16 = EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT +} EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS; + +// +// Interrupt Resource Descriptor Information +// Ref ACPI specification 6.4.2.1 +// +// IRQ Information - Wake Capability +// +#define EFI_ACPI_IRQ_WAKE_CAPABLE_MASK 0x20 +#define EFI_ACPI_IRQ_NOT_WAKE_CAPABLE 0x0 +#define EFI_ACPI_IRQ_WAKE_CAPABLE 0x20 + +typedef enum { + NotWakeCapable = EFI_ACPI_IRQ_NOT_WAKE_CAPABLE, + WakeCapable = EFI_ACPI_IRQ_WAKE_CAPABLE +} EFI_ACPI_IRQ_WAKE_CAPABILITY_KEYWORDS; + +// +// IRQ Information - Interrupt Sharing +// +#define EFI_ACPI_IRQ_EXCLUSIVE 0x0 + +typedef enum { + Exclusive = EFI_ACPI_IRQ_EXCLUSIVE, + Shared = EFI_ACPI_IRQ_SHARABLE, + ExclusiveAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_EXCLUSIVE, + SharedAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_SHARABLE +} EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS; + +// +// IRQ Information - Interrupt Polarity +// +typedef enum { + ActiveHigh = EFI_ACPI_IRQ_HIGH_TRUE, + ActiveLow = EFI_ACPI_IRQ_LOW_FALSE +} EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS; + +// +// IRQ Information - Interrupt Mode +// +#define EFI_ACPI_IRQ_MODE_MASK 0x1 +typedef enum { + LevelTriggered = EFI_ACPI_IRQ_LEVEL_TRIGGERED, + EdgeTriggered = EFI_ACPI_IRQ_EDGE_TRIGGERED +} EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS; + +// IO Port Descriptor Information +// Ref ACPI specification 6.4.2.5 +// +typedef enum { + Decode16 = EFI_ACPI_IO_DECODE_16_BIT, + Decode10 = EFI_ACPI_IO_DECODE_10_BIT +} EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION; + +// +// Memory Resource Information +// Ref ACPI specification 6.4.3.5 +// +// Consumer/Producer Bit[0] +typedef enum { + ResourceProducer = EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER, + ResourceConsumer = EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER +} RESOURCE_USAGE_FLAG; + +// Decode Type (_DEC) Bit[1] +typedef enum { + PosDecode = EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE, + SubDecode = EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +} MEM_DECODE_FLAG; + +// Min Address Fixed (_MIF) Bit[2] +typedef enum { + MinNotFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED, + MinFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +} MIN_FIXED_FLAG; + +// Max Address Fixed (_MAF) Bit[3] +typedef enum { + MaxNotFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED, + MaxFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +} MAX_FIXED_FLAG; + +// Memory Attributes (_MEM) Bits[2:1] +typedef enum { + NonCacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_NON_CACHEABLE, + Cacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE, + WriteCombining = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_WRITE_COMBINING, + Prefetchable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE +} CACHEABLE_FLAG; + +// Write Status (_RW) Bit[0] +typedef enum { + ReadOnly = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_ONLY, + ReadWrite = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_WRITE +} READ_WRITE_FLAG; + +// Memory Attributes (_MTP) Bits[4:3] +typedef enum { + AddressRangeMemory = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_MEMORY, + AddressRangeReserved = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_RESERVED, + AddressRangeACPI = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_ACPI, + AddressRangeNVS = EFI_APCI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_NVS +} MEMORY_RANGE_TYPE; + +// Memory to IO Translation (_TTP) Bit[5] +// Note: IO and Memory Resources use different bits for this. +// Value must be handled at function level when implemented. +typedef enum { + TypeStatic = 0, + TypeTranslation = 1 +} MEMORY_TRANSLATION_TYPE; + +// Memory Window Attributes (_RNG) Bits[1:0] +typedef enum { + Reserved = 0, + NonISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY, + ISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY, + EntireRange = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE, + ISARangeMax +} IO_ISA_RANGES; + +// Generic Address Space Address IDs +typedef enum { + SystemMemory = EFI_ACPI_6_4_SYSTEM_MEMORY, + SystemIO = EFI_ACPI_6_4_SYSTEM_IO, + PCI_Config = EFI_ACPI_6_4_PCI_CONFIGURATION_SPACE, + EmbeddedControl = EFI_ACPI_6_4_EMBEDDED_CONTROLLER, + SMBus = EFI_ACPI_6_4_SMBUS, + SystemCMOS = EFI_ACPI_6_4_SYSTEM_CMOS, + PciBarTarget = EFI_ACPI_6_4_PCI_BAR_TARGET, + IPMI = EFI_ACPI_6_4_IPMI, + GeneralPurposeIO = EFI_ACPI_6_4_GENERAL_PURPOSE_IO, + GenericSerialBus = EFI_ACPI_6_4_GENERIC_SERIAL_BUS, + PCC = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + PlatformCommChannel = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + FFixedHW = EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE +} GENERIC_ADDRESS_SPACE_ID; + +typedef enum { + UndefinedSize = EFI_ACPI_6_4_UNDEFINED, + ByteSize = EFI_ACPI_6_4_BYTE, + WordSize = EFI_ACPI_6_4_WORD, + DWordSize = EFI_ACPI_6_4_DWORD, + QWordSize = EFI_ACPI_6_4_QWORD +} ACPI_DATA_SIZE; + +typedef ACPI_DATA_SIZE GENERIC_ADDRESS_ACCESS_SIZE; + +// *************************************************************************** +// AML Objects +// *************************************************************************** + +// --------------------------------------------------------------------------- +// Table and Table Header Encoding +// --------------------------------------------------------------------------- + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Name Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Namestring AML Object and inserts it into the linked list + + Completes NameString in one call as "one phase" + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Data Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an optimized integer object + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Package Length Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Term Objects Encoding +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Namespace Modifier Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString DataRefObject + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Named Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be created between AmlStart and AmlClose Phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ); + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + // + // x' is encoded as bits 0:7 of the AccessAttrib byte. + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed AccessAs Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj since AML does not store + ArgTypes here. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 1 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 2 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Resource Descriptor Objects Encoding +// --------------------------------------------------------------------------- + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlDWordSpace () + + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. RangeLength + evaluates to a 32-bit integer that specifies the total number of bytes decoded + in the memory range. The 32-bit field DescriptorName. _LEN is automatically + created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlQWordSpace () + + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Expression Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Miscellaneous Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op |Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ + +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// *************************************************************************** +// AML Assistance Functions +// *************************************************************************** + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ); + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ); + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +// *************************************************************************** +// AML Debug Functions +// *************************************************************************** + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ); + +/** + DEBUG print a buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS.IS.A.SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ); + +#endif // AML_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h new file mode 100644 index 0000000000..d48ca1a90a --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h @@ -0,0 +1,25 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/AmdPspRomArmorLib.h> + +/* + * Return allocated and filled AMD PSP ROM Armor White list Table + * + * + * @param[in] PlatformSpiWhitelist Pointer to white list table + * + * @return EFI_SUCCESS + * @return EFI_OUT_OF_RESOURCES Buffer to return couldn't be allocated + */ +EFI_STATUS +EFIAPI +GetPspRomArmorWhitelist ( + IN SPI_WHITE_LIST **PlatformSpiWhitelist + ); diff --git a/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h new file mode 100644 index 0000000000..6c854651cc --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h @@ -0,0 +1,134 @@ +/** @file + AMD Psp Ftpm Ppi Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_PPI_H_ +#define PSP_FTPM_PPI_H_ +#include <Uefi.h> + +typedef struct _PSP_FTPM_PPI PSP_FTPM_PPI; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: GET TPM related Info + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PPI *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + **/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs. + + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @retval EFI_STATUS 0: Success, Non-Zero Error +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + PSP_FTPM_PPI prototype + + Defines PSP_FTPM_PPI. This PPI is used to get Ftpm info. + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PPI { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs +} PSP_FTPM_PPI; + +extern EFI_GUID gAmdPspFtpmPpiGuid; +extern EFI_GUID gAmdPspFtpmFactoryResetPpiGuid; + +#endif diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h new file mode 100644 index 0000000000..715cbbcf78 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h @@ -0,0 +1,183 @@ +/** @file + CXL Configuration Services Protocol prototype definition + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_CXL_SERVICES_PROTOCOL_H_ +#define NBIO_CXL_SERVICES_PROTOCOL_H_ + +#include "AMD.h" +#include <Protocol/FabricTopologyServices2.h> +#include <Protocol/FabricResourceManagerServicesProtocol.h> + +#define AMD_NBIO_CXL_SERVICES_REVISION 0x00 + +/// Forward declaration for the AMD_NBIO_CXL_SERVICES_PROTOCOL +typedef struct _AMD_NBIO_CXL_SERVICES_PROTOCOL AMD_NBIO_CXL_SERVICES_PROTOCOL; + +extern EFI_GUID gAmdNbioCxlServicesProtocolGuid; ///< CXL services protocol calling + +#pragma pack (push, 1) +/// Port Information Structure +typedef struct _AMD_CXL_PORT_INFO_STRUCT { + PCI_ADDR EndPointBDF; ///< Bus/Device/Function of Root Port in PCI_ADDR format + UINT8 LogicalNbioInstance; ///< Logical Instance ID of NBIO + UINT8 PhysicalNbioInstance; ///< Physical Instance ID of NBIO where this port is located + UINT8 SocketID; ///< Socket ID for this port + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT8 PortId; ///< Physical port location + UINT8 PortWidth; ///< Lane width of the port + UINT32 CxlPortAddress; ///< CXL root port address (CXL 2.0 root port or CXL 1.1 RCiEP) + BOOLEAN IsSwitch; ///< CXL Switch flag +} AMD_CXL_PORT_INFO_STRUCT; + +/// Port MMIO32 Resources Information Structure +typedef struct _AMD_CXL_RESOURCES_INFO_STRUCT { + UINT32 Mmio32Base[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Size[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Gran; +} AMD_CXL_RESOURCES_INFO_STRUCT; +#pragma pack (pop) + +// Protocol Definitions + +/** + This function gets information about a specific PCIe root port. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortInformation + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_ROOT_PORT_INFORMATION)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr + IN UINTN PortIndex, ///< port index + OUT AMD_CXL_PORT_INFO_STRUCT *PortInformation ///< port information ptr + ); + +/** + This function configures a specific PCIe root port for CXL capabilities. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port. + PortInformation OPTIONAL (can be NULL) + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_CONFIGURE_ROOT_PORT)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< this ptr + IN PCI_ADDR EndpointBDF ///< end pt bdf + ); + +/** + This function configures a specific PCIe root port for CXL presence + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port such as Socket id,rbindex,port id,segment,bus base,limit or presence. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_AVAILABLE)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT FABRIC_RESOURCE_FOR_EACH_RB *ResourceForEachRb ///< + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_PORT_RB_LOCATION)( + ///< get port rb location + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN UINT8 Segment, ///< + IN UINT8 BusBase, ///< + OUT UINT8 *SocketId, ///< + OUT UINT8 *RbIndex ///< + ); + +/** + This function gets the CXL MMIO32 values to be used by the fabric resource manager + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + CxlMmio32ResourceForEachRb + A pointer to the structure that will hold the MMIO32 base and size values for each root bridge +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_INFORMATION)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT AMD_CXL_RESOURCES_INFO_STRUCT *CxlMmio32Resources ///< + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_REPORT_TO_MPIO)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This ///< ptr to protocol + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_FIND_2P0_DEVICES)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN UINTN PortIndex ///< port index + ); + +/** + * @brief + * + */ +typedef +VOID +(EFIAPI *AMD_CXL_ENABLE_SCM_PMEM)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN PCI_ADDR CxlPciAddress ///< PCI address + ); + +/// The Protocol Definition for CXL Services +struct _AMD_NBIO_CXL_SERVICES_PROTOCOL { + UINT32 Revision; ///< revision + UINTN CxlCount; ///< CXL count + AMD_CXL_GET_ROOT_PORT_INFORMATION CxlGetRootPortInformation; ///< CXL root port information + AMD_CXL_CONFIGURE_ROOT_PORT CxlConfigureRootPort; ///< configuring the root port + AMD_CXL_GET_PORT_RB_LOCATION GetCxlPortRBLocation; ///< CXL port RB location + AMD_CXL_RESOURCES_AVAILABLE GetCxlAvailableResources; ///< Get resources allocated for CXL RCiEP + AMD_CXL_RESOURCES_INFORMATION GetCxlMmio32Resources; ///< Get CXL MMIO resources for CXL RCiEP + AMD_CXL_REPORT_TO_MPIO CxlReportToMpio; ///< Sends the CXL info to MPIO + AMD_CXL_FIND_2P0_DEVICES CxlFind2p0Devices; ///< Finds CXL 2.0 devices after PCIe enumeration + AMD_CXL_ENABLE_SCM_PMEM CxlEnableScmForPersistentMemory; ///< Notifies SMU that CXL persistent memory is present +}; + +#endif /* NBIO_CXL_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h new file mode 100644 index 0000000000..7bcff65dc9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h @@ -0,0 +1,110 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCI_RESOURCES_PROTOCOL_H_ +#define AMD_PCI_RESOURCES_PROTOCOL_H_ + +typedef struct { + UINTN Index; + UINT8 SocketId; + UINTN Segment; + UINTN BaseBusNumber; +} PCI_ROOT_BRIDGE_OBJECT; + +typedef struct { + UINTN Index; + BOOLEAN Enabled; + UINT8 PortPresent; + UINTN Device; + UINTN Function; + UINTN SlotNum; + // Interrupts are relative to IOAPIC 0->n + UINTN BridgeInterrupt; // Redirection table entry for mapped bridge interrupt + UINTN EndpointInterruptArray[4]; // Redirection table entries for mapped INT A/B/C/D +} PCI_ROOT_PORT_OBJECT; + +typedef enum { + IOMMU = 0, + IOAPIC +} FIXED_RESOURCE_TYPE; + +typedef struct { + UINTN Index; + FIXED_RESOURCE_TYPE ResourceType; + UINTN Address; + UINTN Limit; +} FIXED_RESOURCES_OBJECT; + +/// Forward declaration for the AMD_PCI_RESOURCES_PROTOCOL. +typedef struct _AMD_PCI_RESOURCES_PROTOCOL AMD_PCI_RESOURCES_PROTOCOL; + +/** + * @brief System information through EFI call + * @details + */ +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + OUT UINTN *NumberOfRootBridges + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT PCI_ROOT_BRIDGE_OBJECT **RootBridgeInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfRootPorts + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN RootPortIndex, + OUT PCI_ROOT_PORT_OBJECT **RootPortInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfFixedResources + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN FixedResourceIndex, + OUT FIXED_RESOURCES_OBJECT **FixedResourceInfo + ); + +struct _AMD_PCI_RESOURCES_PROTOCOL { + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES AmdPciResourcesGetNumberOfRootBridges; + AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO AmdPciResourcesGetRootBridgeInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS AmdPciResourcesGetNumberOfRootPorts; + AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO AmdPciResourcesGetRootPortInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES AmdPciResourcesGetNumberOfFixedResources; + AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO AmdPciResourcesGetFixedResourceInfo; +}; + +extern EFI_GUID gAmdPciResourceProtocolGuid; ///< Guid for calling + +#endif // AMD_PCI_RESOURCES_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h new file mode 100644 index 0000000000..ebc7812b18 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h @@ -0,0 +1,187 @@ +/** @file + AMD Psp Ftpm Protocol Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FTPM_PROTOCOL_H_ +#define FTPM_PROTOCOL_H_ + +#include <Uefi.h> +// +// GUID definition +// +extern EFI_GUID gAmdPspFtpmProtocolGuid; + +/** + structure definition for HSP mailbox + +**/ +typedef struct { + // C2H_TPM_L0 + UINT64 TPM_L0_Address; /// Mailbox address + UINT64 TPM_L0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 TPM_L0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L0(VLT0) + UINT64 VLT0_Address; /// Mailbox address + UINT64 VLT0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L1(VLT1) + UINT64 VLT1_Address; /// Mailbox address + UINT64 VLT1_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT1_HSC_MSG_Address; /// Doorbell address HSP->CPU + + // Interrupt Information + UINT8 Gsi[4]; /// Gsi[0] is for HSP Channel 0 TPM + /// Gsi[1] is for HSP Channel 1 VTL0 + /// Gsi[2] is for HSP Channel 2 VTL1 + /// Gsi[3] is reserved +} HSP_MAILBOX_ADDRESS, *PHSP_MAILBOX_ADDRESS; + +typedef union { + HSP_MAILBOX_ADDRESS HSP_info; +} FTPM_INFO; + +typedef struct _PSP_FTPM_PROTOCOL PSP_FTPM_PROTOCOL; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: GET TPM related Information + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Function prototype for GetHspfTPMInfo. Return Pluton mailbox base address to SBIOS. + SBIOS should call this procedure after PCI Enumeration Complete. + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmInfo Point to Pluton mailbox base address + + @return EFI_SUCCESS - Success + @return EFI_INVALID_PARAMETER - Input parameter is invalid + @return EFI_NOT_READY - Pluton-fTPM device BAR0 MMIO is not ready. +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TPM_INFO)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *FtpmInfo + ); + +/** + PSP_FTPM_PROTOCOL prototype + + Defines PSP_FTPM_PROTOCOL. This protocol is used to get Ftpm info + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PROTOCOL { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs + FTPM_GET_TPM_INFO GetInfo; ///< Get TPM info +} PSP_FTPM_PROTOCOL; + +#endif //FTPM_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h new file mode 100644 index 0000000000..7f57facf88 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h @@ -0,0 +1,14 @@ +/** @file + Fabric MMIO map manager Protocol prototype definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#define FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#include <FabricResourceManagerCmn.h> + +#endif // FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h new file mode 100644 index 0000000000..a7fef5a35c --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h @@ -0,0 +1,19 @@ +/** @file + AMD CPM Base Definitions. + + Copyright (C) 2014-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_BASE_H_ +#define AMD_CPM_BASE_H_ + +#include <Base.h> +#include <Uefi.h> +#include <PiPei.h> +#include <AmdCpmCommon.h> +#include <Library/DebugLib.h> + +#endif // AMD_CPM_BASE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h new file mode 100644 index 0000000000..af192fcf03 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h @@ -0,0 +1,78 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_COMMON_H_ +#define AMD_CPM_COMMON_H_ + +#pragma pack(push) + +#include <AGESA.h> +#include <AmdPcieComplex.h> +#include <AmdCpmDefine.h> +#include <AmdCpmFunction.h> + +/// The signatures of CPM table + +typedef enum { + CPM_SIGNATURE_DXIO_TOPOLOGY = SIGNATURE_32 ('$', 'A', '2', '6'), ///< The signature of Socket 0 AMD_CPM_DXIO_TOPOLOGY_TABLE + CPM_SIGNATURE_DXIO_TOPOLOGY_S1 = SIGNATURE_32 ('$', 'A', '2', '7') ///< The signature of Socket 1 AMD_CPM_DXIO_TOPOLOGY_TABLE +} AMD_CPM_TABLE_SIGNATURE; + +/// CPM table header +typedef struct { + UINT32 TableSignature; ///< Signature of CPM table + UINT16 TableSize; ///< Table size + UINT8 FormatRevision; ///< Revision of table format + UINT8 ContentRevision; ///< Revision of table content + UINT32 PlatformMask; ///< The mask of platform table supports + UINT32 Attribute; ///< Table attribute +} AMD_CPM_TABLE_COMMON_HEADER; + +/// Table pointer +typedef union { + VOID *Pointer; ///< Table pointer + UINT64 Raw; ///< Table pointer value +} AMD_CPM_POINTER; + +/// DXIO Topology Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR Port[AMD_DXIO_PORT_DESCRIPTOR_SIZE]; ///< DXIO Port Descriptor List +} AMD_CPM_DXIO_TOPOLOGY_TABLE; + +/// AMD CPM Main Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT8 PlatformName[32]; ///< Platform name + UINT8 BiosType; ///< BIOS type + UINT16 CurrentPlatformId; ///< Current Platform Id + UINT32 PcieMemIoBaseAddr; ///< PcieMemIoBaseAddr + UINT32 AcpiMemIoBaseAddr; ///< AcpiMemIoBaseAddr + AMD_CPM_POINTER Service; ///< Reserved for internal use + AMD_CPM_POINTER TableInRomList; ///< Reserved for internal use + AMD_CPM_POINTER TableInRamList; ///< Reserved for internal use + AMD_CPM_POINTER TableInHobList; ///< Reserved for internal use + AMD_CPM_POINTER HobTablePtr; ///< Reserved for internal use + + UINT8 ExtClkGen; ///< External ClkGen Config. 0x00~0x7F + UINT8 UnusedGppClkOffEn; ///< Config to turn off unused GPP clock + UINT8 LpcUartEn; ///< LpcUartEn + UINT64 AltAcpiMemIoBaseAddr; ///< Alternate AcpiMemIoBaseAddr for Slave FCH +} AMD_CPM_MAIN_TABLE; + +/// Structure for Chip Id +typedef struct { + UINT8 Cpu; ///< CPU/APU Chip Id + UINT8 Sb; ///< SB Chip Id + UINT8 Reserved[6]; +} AMD_CPM_CHIP_ID; +#pragma pack (pop) + +#endif //AMD_CPM_COMMON_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h new file mode 100644 index 0000000000..4fc3f97a80 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h @@ -0,0 +1,17 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_DEFINE_H_ +#define AMD_CPM_DEFINE_H_ + +#ifndef AMD_DXIO_PORT_DESCRIPTOR_SIZE +#define AMD_DXIO_PORT_DESCRIPTOR_SIZE 0x30 +#endif + +#endif // AMD_CPM_DEFINE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h new file mode 100644 index 0000000000..7dce238135 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h @@ -0,0 +1,32 @@ +/** @file + AMD CPM Common Functions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_FUNCTION_H_ +#define AMD_CPM_FUNCTION_H_ + +typedef VOID *(EFIAPI *AMD_CPM_GETTABLEPTR_FN)( + IN VOID *This, + IN UINT32 TableId + ); + +typedef AGESA_STATUS (EFIAPI *AMD_CPM_GETPOSTEDVBIOSIMAGE_FN)( + IN GFX_VBIOS_IMAGE_INFO *VbiosImageInfo + ); + +/// Common Functions for CPM Drivers +typedef struct _AMD_CPM_COMMON_FUNCTION { + AMD_CPM_GETTABLEPTR_FN GetTablePtr2; ///< Get CPM Table Pointer. The table can be re-writable +} AMD_CPM_COMMON_FUNCTION; + +/// CPM Public Functions for platform DXE Driver to use +typedef struct _AMD_CPM_DXE_PUBLIC_FUNCTION { + AMD_CPM_GETPOSTEDVBIOSIMAGE_FN GetPostedVbiosImage; ///< Get posted VBIOS image +} AMD_CPM_DXE_PUBLIC_FUNCTION; + +#endif //AMD_CPM_FUNCTION_H_ diff --git a/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h new file mode 100644 index 0000000000..4a90aa3d8b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h @@ -0,0 +1,39 @@ +/** @file + AMD CPM Table Protocol. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_TABLE_PROTOCOL_H_ +#define AMD_CPM_TABLE_PROTOCOL_H_ + +#include <AmdCpmBase.h> + +// +// GUID definition +// +#define AMD_CPM_TABLE_PROTOCOL_GUID \ + { 0x3724cf01, 0x00c2, 0x9762, 0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 } + +#define AMD_CPM_TABLE_SMM_PROTOCOL_GUID \ + { 0xaf6efacf, 0x7a13, 0x45a3, 0xb1, 0xa5, 0xaa, 0xfc, 0x06, 0x1c, 0x4b, 0x79 } + +extern EFI_GUID gAmdCpmTableProtocolGuid; +extern EFI_GUID gAmdCpmTableSmmProtocolGuid; + +/// DXE Protocol Structure +typedef struct _AMD_CPM_TABLE_PROTOCOL { + UINTN Revision; ///< Protocol Revision + AMD_CPM_MAIN_TABLE *MainTablePtr; ///< Pointer to CPM Main Table + AMD_CPM_CHIP_ID ChipId; ///< Id of SB Chip + AMD_CPM_COMMON_FUNCTION CommonFunction; ///< Private Common Functions + AMD_CPM_DXE_PUBLIC_FUNCTION DxePublicFunction; ///< Public Function of Protocol +} AMD_CPM_TABLE_PROTOCOL; + +// Current Protocol Revision +#define AMD_CPM_TABLE_PROTOCOL_REV 0x00 + +#endif // AMD_CPM_TABLE_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c new file mode 100644 index 0000000000..fa83888e95 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c @@ -0,0 +1,31 @@ +/** @file + PSP Mailbox related functions + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c new file mode 100644 index 0000000000..0e9baad955 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c new file mode 100644 index 0000000000..a04bc1f992 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c @@ -0,0 +1,79 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/AmdPspRomArmorLib.h> + +/** + * Request secures the SPI Controller + * + * @param[in, out] SpiCommunicationBuffer SPI Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI White List structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request execute SPI command provide in TSEG comm buffer. + * + * @param[in] NONE + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request PSP firmware switch SPI controller chip select. + * + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c new file mode 100644 index 0000000000..fce82d75b0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/PcdLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c new file mode 100644 index 0000000000..f8b9eb0bcf --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <PiPei.h> +#include <Base.h> +#include <Library/PcdLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PeiServicesLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c new file mode 100644 index 0000000000..cff678d76b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c @@ -0,0 +1,37 @@ +** @file + Fabric Topology Base Lib implementation + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ) +{ + return 0; +} + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ) +{ + return 0; +} + +RETURN_STATUS +EFIAPI +BaseFabricTopologyLibConstructor ( + VOID + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c new file mode 100644 index 0000000000..f72cbe7dff --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c @@ -0,0 +1,8 @@ +/** @file + A Base Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c new file mode 100644 index 0000000000..a155978a5d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c @@ -0,0 +1,35 @@ +/** @file + A Dxe Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> + +/** The constructor function determines the actual TSC frequency. + + First, Get TSC frequency from system configuration table with TSC frequency GUID, + if the table is not found, install it. + This function will always return EFI_SUCCESS. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +DxeTscTimerLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c new file mode 100644 index 0000000000..f70aa3de0e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c @@ -0,0 +1,11 @@ +/** @file + A Pei Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Library/HobLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c new file mode 100644 index 0000000000..7d14d62e60 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c @@ -0,0 +1,103 @@ +/** @file + The Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** Stalls the CPU for at least the specified number of MicroSeconds. + + @param[in] MicroSeconds The minimum number of microseconds to delay. + + @return The value of MicroSeconds input. + +**/ +UINTN +EFIAPI +MicroSecondDelay ( + IN UINTN MicroSeconds + ) +{ + return 0; +} + +/** Stalls the CPU for at least the specified number of NanoSeconds. + + @param[in] NanoSeconds The minimum number of nanoseconds to delay. + + @return The value of NanoSeconds input. + +**/ +UINTN +EFIAPI +NanoSecondDelay ( + IN UINTN NanoSeconds + ) +{ + return 0; +} + +/** Retrieves the current value of the 64-bit free running Time-Stamp counter. + + The properties of the counter can be retrieved by the + GetPerformanceCounterProperties() function. + + @return The current value of the free running performance counter. + +**/ +UINT64 +EFIAPI +GetPerformanceCounter ( + VOID + ) +{ + return 0; +} + +/** Retrieves the 64-bit frequency in Hz and the range of performance counter + values. + + If StartValue is not NULL, then the value that the performance counter starts + with, 0x0, is returned in StartValue. If EndValue is not NULL, then the value + that the performance counter end with, 0xFFFFFFFFFFFFFFFF, is returned in + EndValue. + + The 64-bit frequency of the performance counter, in Hz, is always returned. + + @param[out] StartValue Pointer to where the performance counter's starting value is saved, or NULL. + @param[out] EndValue Pointer to where the performance counter's ending value is saved, or NULL. + + @return The frequency in Hz. + +**/ +UINT64 +EFIAPI +GetPerformanceCounterProperties ( + OUT UINT64 *StartValue, OPTIONAL + OUT UINT64 *EndValue OPTIONAL + ) +{ + return 0; +} + +/** + Converts elapsed ticks of performance counter to time in nanoseconds. + + This function converts the elapsed ticks of running performance counter to + time value in unit of nanoseconds. + + @param Ticks The number of elapsed ticks of running performance counter. + + @return The elapsed time in nanoseconds. + +**/ +UINT64 +EFIAPI +GetTimeInNanoSecond ( + IN UINT64 Ticks + ) +{ + return 0; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c new file mode 100644 index 0000000000..44e23df62f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c @@ -0,0 +1,95 @@ +/** @file + AMD instance of the PCI Host Bridge Library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/PciHostBridgeLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciRootBridgeIo.h> +#include <Protocol/PciHostBridgeResourceAllocation.h> + +/** + Sort all root bridges in bus ascending order and set DevicePath UIDs + continuous and ascending from zero + + @param[in,out] RootBridgeList Array of root bridges. + @param[in] Count Count of root bridges in RootBridgeList + + @return All the root bridge instances in an array are sorted in bus order. + DevicePath UID updated to continuous and ascending numbers starting + with 0. +**/ +VOID +EFIAPI +PciHostBridgeSortRootBridges ( + IN PCI_ROOT_BRIDGE *RootBridgeList, + IN UINTN Count + ) +{ +} + +/** + Return all the root bridge instances in an array. + + @param Count Return the count of root bridge instances. + + @return All the root bridge instances in an array. + The array should be passed into PciHostBridgeFreeRootBridges() + when it's not used. +**/ +PCI_ROOT_BRIDGE * +EFIAPI +PciHostBridgeGetRootBridges ( + UINTN *Count + ) +{ + return (PCI_ROOT_BRIDGE *)NULL; +} + +/** + Free the root bridge instances array returned from PciHostBridgeGetRootBridges(). + + @param Bridges The root bridge instances array. + @param Count The count of the array. +**/ +VOID +EFIAPI +PciHostBridgeFreeRootBridges ( + PCI_ROOT_BRIDGE *Bridges, + UINTN Count + ) +{ +} + +/** + Inform the platform that the resource conflict happens. + + @param HostBridgeHandle Handle of the Host Bridge. + @param Configuration Pointer to PCI I/O and PCI memory resource + descriptors. The Configuration contains the resources + for all the root bridges. The resource for each root + bridge is terminated with END descriptor and an + additional END is appended indicating the end of the + entire resources. The resource descriptor field + values follow the description in + EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL + .SubmitResources(). +**/ +VOID +EFIAPI +PciHostBridgeResourceConflict ( + EFI_HANDLE HostBridgeHandle, + VOID *Configuration + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c new file mode 100644 index 0000000000..318f8e5ad7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c @@ -0,0 +1,154 @@ +/** @file + + Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLARGOBJECTS_FILECODE + +/* + Fill the DataBuffer with correct Arg Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 argument, i.e., Arg1, Arg2 ... Arg6. + + @param[in] ArgN - Argument Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid ArgN provided. +*/ +EFI_STATUS +EFIAPI +InternalAmlArgBuffer ( + IN OUT UINT8 ArgN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (ArgN) { + case 0: + Data[0] = AML_ARG0; + break; + case 1: + Data[0] = AML_ARG1; + break; + case 2: + Data[0] = AML_ARG2; + break; + case 3: + Data[0] = AML_ARG3; + break; + case 4: + Data[0] = AML_ARG4; + break; + case 5: + Data[0] = AML_ARG5; + break; + case 6: + Data[0] = AML_ARG6; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "ARGN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlArgBuffer ( + ArgN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + ArgN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c new file mode 100644 index 0000000000..371537c9aa --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c @@ -0,0 +1,151 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLASSISTFUNCTIONS_FILECODE + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Get next node before freeing current Object + Node = GetNextNode (ListHead, Node); + // Free Object + InternalFreeAmlObject (&Object, ListHead); + } + + return EFI_SUCCESS; +} + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead cannot be NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + *TableSize = 0; + Node = GetFirstNode (ListHead); + if (!IsNodeAtEnd (ListHead, Node)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Multiple nodes remain, Likely missed an 'AmlClose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } else { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if (!Object->Completed) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Final node not completed: Likely missed an 'AmlCLose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } + + *Table = Object->Data; + *TableSize = Object->DataSize; + } + + return EFI_SUCCESS; +} + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead = NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *ListHead = AllocatePool (sizeof (LIST_ENTRY)); + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to allocate Table List Head\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + InitializeListHead (*ListHead); + + return EFI_SUCCESS; +} + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NULL ListHead passed in\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + AmlFreeObjectList (*ListHead); + FreePool (*ListHead); + *ListHead = NULL; + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c new file mode 100644 index 0000000000..b7d4f4c9d7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c @@ -0,0 +1,640 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLDATAOBJECTS_FILECODE + +/* + Creates an allocated buffer with sized data and no Op Code + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] // 0x0000000000000000- 0xFFFFFFFFFFFFFFFF + + Forces max integer size UINT64 + + Caller is responsible for freeing returned buffer. + + @param[in] Integer - Integer value to encode + @param[in] IntegerSize - Size of integer in bytes + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlSizedDataBuffer ( + IN UINT64 Integer, + IN UINTN IntegerSize, + OUT VOID **ReturnData + ) +{ + UINT8 *Data; + + if ((IntegerSize != sizeof (UINT8)) && + (IntegerSize != sizeof (UINT16)) && + (IntegerSize != sizeof (UINT32)) && + (IntegerSize != sizeof (UINT64))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Incorrect integer size=%d requested.\n", __func__, IntegerSize)); + return EFI_INVALID_PARAMETER; + } + + if ((IntegerSize < sizeof (UINT64)) && (Integer >= LShiftU64 (1, IntegerSize * 8))) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer is larger than requestd size.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Max Data Size is 64 bit. Plus one Opcode byte + Data = AllocateZeroPool (sizeof (UINT64)); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + // Already established we only have supported sizes above + switch (IntegerSize) { + case sizeof (UINT8): + *(UINT8 *)Data = (UINT8)Integer; + break; + case sizeof (UINT16): + *(UINT16 *)Data = (UINT16)Integer; + break; + case sizeof (UINT32): + *(UINT32 *)Data = (UINT32)Integer; + break; + case sizeof (UINT64): + *(UINT64 *)Data = (UINT64)Integer; + break; + } + + *ReturnData = (VOID *)Data; + return EFI_SUCCESS; +} + +/* + Calculates the optimized integer value used by AmlOPDataInteger and others + + Forces max integer size UINT64 + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *IntegerData; + UINTN IntegerDataSize; + UINT8 *Data = NULL; + UINTN DataSize; + + // Max Data Size is 64 bit. Plus one Opcode byte + IntegerData = AllocateZeroPool (sizeof (UINT64) + 1); + if (IntegerData == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + if (Integer == 0) { + // ZeroOp + IntegerDataSize = 1; + IntegerData[0] = AML_ZERO_OP; + } else if (Integer == 1) { + // OneOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONE_OP; + } else if (Integer == (UINT64) ~0x0) { + // OnesOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONES_OP; + } else { + if (Integer >= 0x100000000) { + // QWordConst + IntegerDataSize = sizeof (UINT64) + 1; + IntegerData[0] = AML_QWORD_PREFIX; + } else if (Integer >= 0x10000) { + // DWordConst + IntegerDataSize = sizeof (UINT32) + 1; + IntegerData[0] = AML_DWORD_PREFIX; + } else if (Integer >= 0x100) { + // WordConst + IntegerDataSize = sizeof (UINT16) + 1; + IntegerData[0] = AML_WORD_PREFIX; + } else { + // ByteConst + IntegerDataSize = sizeof (UINT8) + 1; + IntegerData[0] = AML_BYTE_PREFIX; + } + + DataSize = IntegerDataSize - 1; + InternalAmlSizedDataBuffer (Integer, DataSize, (VOID **)&Data); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Data Space Alloc Failed\n", __func__)); + FreePool (IntegerData); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (&IntegerData[1], Data, DataSize); + FreePool (Data); + } + + // Reallocate the pool so size is exact + *ReturnData = (VOID *)IntegerData; + *ReturnDataSize = IntegerDataSize; + + return EFI_SUCCESS; +} + +/** + Creates an optimized integer object + + Forces max integer size UINT64 + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DATA_INTEGER")); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + Integer, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an Sized Data integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +InternalAmlOPSizedData ( + IN UINT64 Integer, + IN UINTN IntegerSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "SIZED_DATA_INTEGER")); + goto Done; + } + + Object->DataSize = IntegerSize; + Status = InternalAmlSizedDataBuffer ( + Integer, + Object->DataSize, + (VOID **)&(Object->Data) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT8), ListHead); +} + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT16), ListHead); +} + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT32), ListHead); +} + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT64), ListHead); +} + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + UINT8 *Data; + UINTN DataSize; + UINTN Index; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Validate all characters + DataSize = AsciiStrLen (String); + for (Index = 0; Index < DataSize; Index++) { + if (String[Index] < 0x01) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid character String[%d] : %a\n", + __func__, + Index, + String + )); + return Status; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // AML_STRING_PREFIX + String + NULL Terminator + DataSize += 2; + Data = AllocatePool (DataSize); + if (Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: String Space Allocation %a\n", + __func__, + String + )); + goto Done; + } + + Data[0] = AML_STRING_PREFIX; + CopyMem (&Data[1], String, DataSize - 1); + + // DataString Complete, Put into Object + Object->Data = Data; + Object->DataSize = DataSize; + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Buffer == NULL) || (BufferSize == 0) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Data Buffer object\n", __func__)); + goto Done; + } + + Object->Data = AllocatePool (BufferSize); + Object->DataSize = BufferSize; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Data Buffer allocate failed\n", __func__)); + goto Done; + } + + CopyMem (Object->Data, Buffer, BufferSize); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + UINT32 EncodedEisaId; + UINT8 i; + + EncodedEisaId = 0; + + if ((String == NULL) || (ListHead == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, inputs cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AsciiStrLen (String) != 0x7) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid length for 'String' parameter.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // + // Verify String is formatted as "UUUNNNN". + // + for (i = 0; i <= 0x6; i++) { + // + // If first 3 characters are not uppercase alpha or last 4 characters are not hexadecimal + // + if (((i <= 0x2) && (!IS_ASCII_UPPER_ALPHA (String[i]))) || + ((i >= 0x3) && (!IS_ASCII_HEX_DIGIT (String[i])))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid EISA ID string format!\n", __func__)); + DEBUG ((DEBUG_ERROR, " Input String must be formatted as 'UUUNNNN'.\n")); + return EFI_INVALID_PARAMETER; + } + } + + // + // Convert string to 4-byte EISA ID encoding. + // Ex: 'PNP0A03' encodes to '0x30AD041' + // + EncodedEisaId = ((((String[0] - AML_NAME_CHAR_A + 1) & 0x1f) << 10) + + (((String[1] - AML_NAME_CHAR_A + 1) & 0x1f) << 5) + + (((String[2] - AML_NAME_CHAR_A + 1) & 0x1f) << 0) + + (UINT32)(AsciiStrHexToUint64 (&String[3]) << 16)); + + // + // Swap bytes of upper and lower WORD to format EISA ID with proper endian-ness. + // + EncodedEisaId = Swap4Bytes (EncodedEisaId); + + // + // Insert DWordPrefix into list. + // Note: EncodedEisaId will always be 32-bits, resulting in DWordConst. + // + Status = AmlOPDataInteger (EncodedEisaId, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to create ACPI DWordConst from Encoded EISA ID.\n", __func__)); + return Status; + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c new file mode 100644 index 0000000000..e8ea9d8e84 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c @@ -0,0 +1,1294 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLEXPRESSIONOPCODES_FILECODE + +// ---------------------------------------------------------------------------- +// Expression Opcodes Encoding +// ---------------------------------------------------------------------------- +// ExpressionOpcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat | +// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement | +// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit | +// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual | +// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid | +// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod | +// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr | +// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight | +// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer | +// DefToDecimalString | DefToHexString | DefToInteger | DefToString | +// DefWait | DefXOr | MethodInvocation +// ---------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN InternalBufferSize; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. Have a message with this to be + // very specific + if (BufferSize >= SIZE_4GB) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BufferSize=0x%X >= 4GB\n", __func__, BufferSize)); + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Buffer Object + Status = InternalAppendNewAmlObject (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFER object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer PkgLength object\n", __func__)); + goto Done; + } + + // Start BufferSize + Status = InternalAppendNewAmlObject (&Object, "BUFFERSIZE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFERSIZE object\n", __func__)); + goto Done; + } + + // ByteList is too complicated and must be added outside + break; + + case AmlClose: + // ByteList items should be closed already + + // Close BufferSize + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "BUFFERSIZE", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate BufferSize object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect BufferSize children\n", __func__)); + goto Done; + } + + // Set BufferSize Object to correct value and size. + // BufferSize should be from zero (no Child Data) to MAX of requested + // BufferSize or size required for ChildObject->Data. + InternalBufferSize = MAX (BufferSize, ChildObject->DataSize); + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. + if (InternalBufferSize >= SIZE_4GB) { + Status = EFI_BAD_BUFFER_SIZE; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: BufferSize 0x%X >= 4GB\n", + __func__, + InternalBufferSize + )); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + InternalBufferSize, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc BufferSize\n", __func__)); + goto Done; + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate BufferSize\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Buffer object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Buffer object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // Buffer must have at least PkgLength BufferSize + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Buffer Data\n", __func__)); + goto Done; + } + + // BufferOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_BUFFER_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the LEqual Object + Status = InternalAppendNewAmlObject (&Object, "LEQUAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start LEQUAL object\n", __func__)); + goto Done; + } + + // Operands are too complicated and must be added outside + break; + + case AmlClose: + + // Close LEqual + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "LEQUAL", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate LEqual object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // LEqual must have at least two operands + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No LEqual Args\n", __func__)); + goto Done; + } + + // LequalOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_LEQUAL_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + Creates (NumElements) section of a Package: {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + Internal only function no public reference or documentation needed. + + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlNumElements ( + IN AML_FUNCTION_PHASE Phase, + IN OUT UINTN *NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + ChildCount = 0; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Number of Elements Object + Status = InternalAppendNewAmlObject (&Object, "NUM_ELEMENTS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "NUM_ELEMENTS", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect NUM_ELEMENTS children\n", __func__)); + goto Done; + } + + // We do not have to change anything for NumElements >= Child Count + if (*NumElements == 0) { + *NumElements = ChildCount; + } else if (*NumElements < ChildCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements < ChildCount.\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } + + if (*NumElements <= MAX_UINT8) { + Object->DataSize = 1; + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = (UINT8)*NumElements; + } else { + Status = InternalAmlDataIntegerBuffer ( + *NumElements, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc NumElements\n", __func__)); + goto Done; + } + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate NumElements\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINT8 OpCode; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Package Object + Status = InternalAppendNewAmlObject (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PACKAGE object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package PkgLength object\n", __func__)); + goto Done; + } + + // Start Number of Elements Object + Status = InternalAmlNumElements (AmlStart, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlNumElements (AmlClose, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + if (NumElements <= MAX_UINT8) { + OpCode = AML_PACKAGE_OP; + } else { + OpCode = AML_VAR_PACKAGE_OP; + } + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Package object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate PACKAGE object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + // Package must have at least PkgLength NumElements + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Package Data\n", __func__)); + goto Done; + } + + // PackageOp and VarPackageOp are both one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append STORE object\n", __func__)); + goto Done; + } + + // TermArg and SuperName are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlStore(AmlStart,..) and + // AmlStore(AmlClose,...) - when creating the Store expression. + break; + + case AmlClose: + // TermArg and SuperName must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating STORE Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = AML_STORE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left or Right expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftOp Operand ShiftCount Target + ShiftOp := 0x79 or 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] ShiftOp - Specifies whether to shift left or shift + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlShift ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 ShiftOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append SHIFT object\n", __func__)); + goto Done; + } + + // Operand, ShiftCount, and Target are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlShift(AmlStart,..) and + // AmlShift(AmlClose,...) - when creating the Shift expression. + + break; + + case AmlClose: + // Operand, ShiftCount, and Target must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating SHIFT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = ShiftOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Result) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_LEFT_OP, ListHead); + return Status; +} + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_RIGHT_OP, ListHead); + return Status; +} + +/** + Creates a Find First Set Bit AML object for + both right and left searches. + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetRightBit (Source, Result) => Integer + + Bit Fields must be created between AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + DefFindSetRightBit := FindSetRightBitOp Operand Target + FindSetRightBitOp := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] FindSetOp - Specifies whether to search left or search + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlFindSetBit ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 FindSetOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append FIND_SET object\n", __func__)); + goto Done; + } + + // Source and Result are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlFindSet(AmlStart,..) and + // AmlFindSet(AmlClose,...) - when creating the FindSetBit expression. + + break; + + case AmlClose: + // Source and Result must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating FIND_SET Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = FindSetOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_LEFT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_RIGHT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start decrement expression + Status = InternalAppendNewAmlObject (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append DECREMENT object\n", __func__)); + goto Done; + } + + // Minuend is outside the scope of this object. It must be + // defined as part of a multi-tier call - in between AmlDecrement(AmlStart,..) and + // AmlDecrement(AmlClose,...) - when creating the Decrement expression. + + break; + + case AmlClose: + // Minuend must created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating DECREMENT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Decrement Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Decrement object + Object->Data[0] = AML_DECREMENT_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c new file mode 100644 index 0000000000..21deb200e3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLLOCALOBJECTS_FILECODE + +/** + Fill the DataBuffer with correct Local Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 Local variables, i.e., Local1, Local2 ... Local6. + + @param[in] LocalN - Local variable Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid LocalN provided. +**/ +EFI_STATUS +EFIAPI +InternalAmlLocalBuffer ( + IN OUT UINT8 LocalN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (LocalN) { + case 0: + Data[0] = AML_LOCAL0; + break; + case 1: + Data[0] = AML_LOCAL1; + break; + case 2: + Data[0] = AML_LOCAL2; + break; + case 3: + Data[0] = AML_LOCAL3; + break; + case 4: + Data[0] = AML_LOCAL4; + break; + case 5: + Data[0] = AML_LOCAL5; + break; + case 6: + Data[0] = AML_LOCAL6; + break; + case 7: + Data[0] = AML_LOCAL7; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "LOCALN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlLocalBuffer ( + LocalN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + LocalN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c new file mode 100644 index 0000000000..0502547a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c @@ -0,0 +1,576 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESTRING_FILECODE + +#define MAX_NAME_SEG_COUNT 255 + +/* + Is character a RootChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a RootChar + @return FALSE - Character is not a RootChar + */ +BOOLEAN +InternalIsRootChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_ROOT_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a ParentPrefixChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a ParentPrefixChar + @return FALSE - Character is not a ParentPrefixChar + */ +BOOLEAN +InternalIsParentPrefixChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_PARENT_PREFIX_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a LeadNameChar = '_', 'A' - 'Z' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a LeadNameChar + @return FALSE - Character is not a LeadNameChar + */ +BOOLEAN +InternalIsLeadNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChars '_', 'A'-'Z' + (TestChar == AML_NAME_CHAR__) || + ((TestChar >= AML_NAME_CHAR_A) && + (TestChar <= AML_NAME_CHAR_Z)) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a DigitChar = '0' - '9' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a DigitChar + @return FALSE - Character is not a DigitChar + */ +BOOLEAN +InternalIsDigitChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed DigitChars '0'-'9' + (TestChar >= AML_DIGIT_CHAR_0) && + (TestChar <= AML_DIGIT_CHAR_9) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameChar = LeadNameChar | DigitChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChar and DigitChars + InternalIsDigitChar (TestChar) || + InternalIsLeadNameChar (TestChar) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameSeg separator + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameSegSeparator ( + IN CHAR8 TestChar + ) +{ + if (TestChar == '.') { + return TRUE; + } + + return FALSE; +} + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + UINT8 *NameSeg; + UINTN NameLen; + EFI_STATUS Status; + + if (Name == NULL) { + return EFI_INVALID_PARAMETER; + } + + NameLen = AsciiStrLen (Name); + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameSeg = NULL; + // parameter validation + if ((NameLen == 0) || (NameLen > 4)) { + return EFI_INVALID_PARAMETER; + } + + if (!InternalIsLeadNameChar (Name[0])) { + return EFI_INVALID_PARAMETER; + } + + for (UINT8 i = 1; NameLen > 1 && i < NameLen; i++) { + if (!InternalIsNameChar (Name[i])) { + return EFI_INVALID_PARAMETER; + } + } + + NameSeg = AllocateZeroPool (4); + if (NameSeg == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (NameSeg, Name, NameLen); + + if (NameLen < 4) { + SetMem (&NameSeg[NameLen], 4 - NameLen, '_'); + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (Object != NULL) { + if (!EFI_ERROR (Status)) { + Object->Data = NameSeg; + Object->DataSize = 4; + Object->Completed = TRUE; + } else { + InternalFreeAmlObject (&Object, ListHead); + FreePool (NameSeg); + } + } + + return Status; +} + +/** + Creates a Namestring AML Object and inserts it into the linked list + + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + CHAR8 *NameString; + CHAR8 *NameStringPrefix; + UINTN NameStringBufferSize; + UINTN NameStringSize; + UINTN NameStringPrefixSize; + UINTN NameSegCount; + UINTN StringIndex; + UINTN StringLength; + UINTN NameSegIndex; + BOOLEAN FoundRootChar; + BOOLEAN FoundParentPrefixChar; + BOOLEAN FoundParenthesisOpenChar; + BOOLEAN FoundParenthesisCloseChar; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameString = NULL; + FoundRootChar = FALSE; + FoundParentPrefixChar = FALSE; + NameStringBufferSize = 0; + FoundParenthesisOpenChar = FALSE; + FoundParenthesisCloseChar = FALSE; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString %a object\n", __func__, String)); + goto Done; + } + + // Create a buffer to fit NameSeg [4] * max NameSegCount [255] + NameStringBufferSize = 4 * MAX_NAME_SEG_COUNT; + NameString = AllocateZeroPool (NameStringBufferSize); + // Create arbitrarily large RootChar\ParentPrefixChar buffer + NameStringPrefix = AllocateZeroPool (NameStringBufferSize); + + // Calculate length of required space + StringLength = AsciiStrLen (String); + NameStringSize = 0; + NameStringPrefixSize = 0; + NameSegIndex = 0; + NameSegCount = 0; + for (StringIndex = 0; StringIndex < StringLength; StringIndex++) { + if (NameStringPrefixSize >= NameStringBufferSize) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Exceeded ParentPrefixChar support at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (InternalIsRootChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: RootChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains more than 1 RootChar.\n", __func__, String)); + goto Done; + } + + if (FoundParentPrefixChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // RootChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundRootChar = TRUE; + } else if (InternalIsParentPrefixChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: ParentPrefixChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // ParentPrefixChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundParentPrefixChar = TRUE; + } else if (!InternalIsNameChar (String[StringIndex])) { + if (InternalIsNameSegSeparator (String[StringIndex])) { + if (NameSegIndex == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid NameSeg separator at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + NameSegIndex = 0; + } + } else if (String[StringIndex] == '(') { + if (FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisOpenChar = TRUE; + } else if (String[StringIndex] == ')') { + if (FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if (!FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: No Open Parenthesis before offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisCloseChar = TRUE; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Unsupported character at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + } else { + // Must be NameChar + if (FoundParenthesisOpenChar || FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameChar after Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if ((NameSegIndex == 0) && InternalIsDigitChar (String[StringIndex])) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: must be LeadNameChar at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (NameSegIndex >= 4) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameSeg > 4 characters at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + if (NameSegIndex == 0) { + NameSegCount++; + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Max NameSegCount=%d reached at offset=%d of String=%a'\n", + __func__, + MAX_NAME_SEG_COUNT, + StringIndex, + String + )); + goto Done; + } + } + + NameString[NameStringSize] = String[StringIndex]; + NameStringSize++; + NameSegIndex++; + if ((StringIndex + 1 >= StringLength) || + !InternalIsNameChar (String[StringIndex + 1])) + { + // Extend in progress NameSeg with '_'s + if (NameSegIndex < 4) { + SetMem (&NameString[NameStringSize], 4 - NameSegIndex, '_'); + NameStringSize += 4 - NameSegIndex; + } + } + } + } + } + + // Create AML Record with NameString contents from above + // Copy in RootChar or ParentPrefixChar(s) + if (NameStringPrefixSize != 0) { + Object->Data = ReallocatePool ( + Object->DataSize, + NameStringPrefixSize, + Object->Data + ); + CopyMem ( + &Object->Data[Object->DataSize], + NameStringPrefix, + NameStringPrefixSize + ); + Object->DataSize += NameStringPrefixSize; + FreePool (NameStringPrefix); + } + + // Set up for Dual/MultiName Prefix + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Exceeded MaxNameSegCount in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Must be at least one NameSeg in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 1) { + // Single NameSeg + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize, + Object->Data + ); + } else if (NameSegCount == 2) { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 1, + Object->Data + ); + Object->Data[Object->DataSize] = AML_DUAL_NAME_PREFIX; + Object->DataSize += 1; + } else { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 2, + Object->Data + ); + Object->Data[Object->DataSize] = AML_MULTI_NAME_PREFIX; + Object->Data[Object->DataSize + 1] = NameSegCount & 0xFF; + Object->DataSize += 2; + } + + // Copy NameString data over. From above must be at least one NameSeg + CopyMem (&Object->Data[Object->DataSize], NameString, NameStringSize); + Object->DataSize += NameStringSize; + FreePool (NameString); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + if (NameString != NULL) { + FreePool (NameString); + } + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c new file mode 100644 index 0000000000..37ae9319be --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c @@ -0,0 +1,2138 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMEDOBJECT_FILECODE + +#define METHOD_ARGS_MAX 7 +#define MAX_SYNC_LEVEL 0x0F +#define GENERIC_FIELD_IDENTIFIER "FIELD" + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Device for %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, String)); + goto Done; + } + + // Device Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_DEVICE_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an AccessField + + AccessField := 0x01 AccessType AccessAttrib + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start ACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (3); + // AML_ACCESSFIELD_OP + AccessType + AccessAttrib + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for ACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->DataSize = 3; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an ExtendedAccessField + + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Specifies the access length for the field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlExtendedAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start EXTENDEDACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (4); + // AML_EXTACCESSFIELD_OP + AccessType + AccessAttrib + AccessLength + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for EXTENDEDACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_EXT_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->Data[3] = AccessLength; + Object->DataSize = 4; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + + // x' is encoded as bits 0:7 of the AccessAttrib byte. + The description of bits 7:6 is incorrect and if AttribBytes, + AttribRawBytes, or AttribRawProcessBytes are used here, an + ExtendedAccessField is used with the following definitions + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + ExtendedAccessAttrib := ByteData // 0x0B AttribBytes + // 0x0E AttribRawBytes + // 0x0F AttribRawProcess + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // AcessType parameter check + if (AccessType > BufferAcc) { + return EFI_INVALID_PARAMETER; + } + + // AccessAttrib parameter checking + if ((AccessAttribute >= AttribNormal) && (AccessAttribute <= AttribBlock)) { + if ((AccessAttribute & 1) == 1) { + return EFI_INVALID_PARAMETER; + } + } else if (AccessAttribute > AttribRawProcessBytes) { + return EFI_INVALID_PARAMETER; + } + + // if AccessAttrib requires a length parameter, then an ExtendedAccessField is used + switch (AccessAttribute) { + case AttribBytes: + case AttribRawBytes: + case AttribRawProcessBytes: + Status = InternalAmlExtendedAccessField (AccessType, AccessAttribute, AccessLength, ListHead); + break; + default: + Status = InternalAmlAccessField (AccessType, AccessAttribute, ListHead); + break; + } + + return Status; +} + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (ObjectType >= InvalidObj) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start EXTERNAL object + Status = InternalAppendNewAmlObject (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a NameString object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, Name)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 3); + // AML_EXTERNAL_OP + Name + ObjectType + ArgumentCount + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->DataSize = 0; + Object->Data[0] = AML_EXTERNAL_OP; + Object->DataSize++; + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + Object->Data[Object->DataSize] = ObjectType; + Object->DataSize++; + Object->Data[Object->DataSize] = NumArgs; + Object->DataSize++; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Locates the AML object that holds the cumulative offset term. + This is the node directly after the node designated by + GENERIC_FIELD_IDENTIFIER in Object->Data. + + @param[out] ReturnObject - Object that contains the offset term + @param[in,out] ListHead - Linked list that contains the GENERIC_FIELD_IDENTIFIER + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateOffsetTerm ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + CHAR8 *Identifier; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + Identifier = GENERIC_FIELD_IDENTIFIER; + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + break; + } + } while (Node != ListHead); + + // Check to make sure FIELD is found, otherwise error + if ((Object->DataSize == 0) || + (Object->DataSize != IdentifierSize) || + CompareMem ( + Object->Data, + Identifier, + (MAX (Object->DataSize, IdentifierSize) != 0) + )) + { + return EFI_DEVICE_ERROR; + } + + // Have found FIELD + Node = GetNextNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + UINT8 *PkgLength; + UINTN DataLength; + EFI_STATUS Status; + UINT64 InternalOffsetData; + UINT64 BitCount; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + InternalOffsetData = 0; + BitCount = LShiftU64 (ByteOffset, 3); + Object = NULL; + OffsetObject = NULL; + PkgLength = NULL; + + // Find and read internal offset data + Status = InternalAmlLocateOffsetTerm (&OffsetObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term\n", __func__)); + goto Done; + } + + InternalOffsetData = *(UINT64 *)OffsetObject->Data; + + if (InternalOffsetData > BitCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid backwards offset\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } else if (InternalOffsetData == BitCount) { + // Do not need to append any reserved fields + Status = EFI_SUCCESS; + goto Done; + } + + // update internal offset value to new offset + *(UINT64 *)OffsetObject->Data = BitCount; + + // take difference to find how many bits to reserve + BitCount = BitCount - InternalOffsetData; + + // Create new object for the offset data, add pkglength encoding + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: appending new AML object\n", __func__)); + goto Done; + } + + Status = InternalAmlBitPkgLength ((UINT32)BitCount, &PkgLength, &DataLength); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: internal AML PkgLength\n", __func__)); + goto Done; + } + + Object->DataSize = DataLength + 1; // add one for Reserved Field Indicator + Object->Data = AllocateZeroPool (Object->DataSize); + + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Offset\n", __func__)); + goto Done; + } + + Object->Data[0] = 0; + CopyMem (&Object->Data[1], PkgLength, DataLength); // read internal offset data + Object->Completed = TRUE; + FreePool (PkgLength); + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + EFI_STATUS Status; + + if ((ListHead == NULL) || (Name == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + OffsetObject = NULL; + + if (AsciiStrLen (Name) == 0) { + if (BitLength > 0) { + // Prepend a 0 to the list + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (1); + Object->DataSize = 1; + Object->Completed = TRUE; + } else { + Status = EFI_SUCCESS; + goto Done; + } + } else { + // add NameSeg to List + Status = InternalAmlNameSeg (Name, ListHead); + } + + if (EFI_ERROR (Status)) { + goto Done; + } + + // Locate and update internal Offset term + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating offset term for %a object\n", __func__, Name)); + goto Done; + } + + *(UINT64 *)Object->Data += BitLength; // write + + // Add BitLength as a PkgLength term + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlBitPkgLength (BitLength, &Object->Data, &Object->DataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (Name == NULL) || (AsciiStrLen (Name) == 0)) { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field for %a object\n", __func__, Name)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field internal offset %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, Name)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, Name)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || + (BankName == NULL) || (AsciiStrLen (BankName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField internal offset %a object\n", __func__, BankName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required Region NameString + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, RegionName)); + goto Done; + } + + // Insert required Bank NameString + Status = AmlOPNameString (BankName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required BankValue integer + Status = AmlOPDataInteger (BankValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Adding BankValue Integer for %a object\n", __func__, BankName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, BankName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameStrings completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, BankName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, BankName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, BankName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, BankName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_BANK_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (IndexName == NULL) || (AsciiStrLen (IndexName) == 0) || + (DataName == NULL) || (AsciiStrLen (DataName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField internal offset %a object\n", __func__, IndexName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Index NameString + Status = AmlOPNameString (IndexName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Data NameString + Status = AmlOPNameString (DataName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, DataName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, IndexName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, IndexName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, IndexName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, IndexName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, IndexName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_INDEX_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_STATUS Status; + + // Input parameter validation + if ((RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || (ListHead == NULL) || + ((RegionSpace > PCC) && (RegionSpace < 0x80)) || (RegionSpace > 0xFF)) + { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + ChildObject = NULL; + Status = EFI_DEVICE_ERROR; + + Status = InternalAppendNewAmlObject (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start OpRegion for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Name String for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPByteData ((UINT8)RegionSpace, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Region space byte data for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Offset, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Offset data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Length, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Length data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, RegionName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, RegionName)); + goto Done; + } + + // OpRegion Opcode is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, RegionName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_REGION_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + Object = NULL; + + if ((SourceBuffer == NULL) || (FieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + ChildObject = NULL; + Status = InternalAppendNewAmlObject (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (BitIndex, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BitIndex for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (NumBits, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumBits for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (FieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FieldName)); + goto Done; + } + + // CreateFieldOp is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FieldName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_CREATE_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Internal function used to create a CreateBit|Byte|Word|DWord|QWordField objects + and insert them into the linked list + + @param[in] SourceBuffer, - Buffer to insert the new buffer fixed field object + @param[in] Index, - Starting index to place the new buffer + @param[in] FixedFieldName, - Name of the FixedField + @param[in] OpCode, - AML opcode for the Create_Field encoding + @param[in,out] ListHead - Linked list has completed CreateFixedField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlCreateFixedField ( + IN CHAR8 *SourceBuffer, + IN UINT64 Index, + IN CHAR8 *FixedFieldName, + IN UINT8 OpCode, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + + if ((SourceBuffer == NULL) || (FixedFieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FixedFieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObject (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Check if Localx Buffer + if (AsciiStrnCmp (SourceBuffer, "Local", 5) == 0) { + if ((SourceBuffer[5] >= '0') && (SourceBuffer[5] <= '9')) { + Status = AmlOPLocalN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[5]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: LocalN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + // Check if Argx Buffer + } else if (AsciiStrnCmp (SourceBuffer, "Arg", 3) == 0) { + if ((SourceBuffer[3] >= '0') && (SourceBuffer[3] <= '9')) { + Status = AmlOpArgN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[3]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ArgN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + } else { + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + Status = AmlOPDataInteger (Index, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Index for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = AmlOPNameString (FixedFieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FixedFieldName)); + goto Done; + } + + // CreateWordFieldOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FixedFieldName)); + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, BitIndex, BitFieldName, AML_CREATE_BIT_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, ByteFieldName, AML_CREATE_BYTE_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, DWordFieldName, AML_CREATE_DWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, QWordFieldName, AML_CREATE_QWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, WordFieldName, AML_CREATE_WORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 MethodFlags; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (SyncLevel > MAX_SYNC_LEVEL) || + (SerializeRule >= FlagInvalid) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Method for %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Method Flags + Status = InternalAppendNewAmlObject (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + // Add Method Flags + Status = InternalAmlLocateObjectByIdentifier (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a METHOD_FLAGS child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Flags is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + MethodFlags = NumArgs & 0x07; + if (SerializeRule) { + MethodFlags |= BIT3; + } + + MethodFlags |= (SyncLevel & 0x0F) << 4; + Object->Data[0] = MethodFlags; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_METHOD_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c new file mode 100644 index 0000000000..afe51cdcf2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c @@ -0,0 +1,360 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESPACEMODIFIEROBJECTS_FILECODE + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + // Scope Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_SCOPE_OP; + CopyMem (&Object->Data[1], ChildObject->Data, ChildObject->DataSize); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString ChildObjectData + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, String)); + goto Done; + } + + break; + case AmlClose: + // DataRefObject should be closed already + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + Object->Data = AllocatePool (ChildObject->DataSize + 1); + // Name Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_NAME_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((SourceName == NULL) || (AliasName == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start ALIAS object + Status = InternalAppendNewAmlObject (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append ALIAS object\n", __func__)); + goto Done; + } + + // Insert required Object (to be aliased) NameString + Status = AmlOPNameString (SourceName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, SourceName)); + goto Done; + } + + // Insert required Alias NameString + Status = AmlOPNameString (AliasName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, AliasName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot locate ALIAS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, SourceName)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + // Alias Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, SourceName)); + goto Done; + } + + Object->Data[0] = AML_ALIAS_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c new file mode 100644 index 0000000000..279bfc782d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c @@ -0,0 +1,144 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLOBJECTSDEBUG_FILECODE + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ) +{ + UINTN Column; + UINTN Index; + UINTN NumberOfColumns; + UINT8 *Data; + + Data = Buffer; + NumberOfColumns = 16; + // Header + DEBUG ((DEBUG_VERBOSE, " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n")); + for (Index = 0; Index < BufferSize;) { + // Row Counter + DEBUG ((DEBUG_VERBOSE, "%4X ", Index)); + + // Hex ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + DEBUG ((DEBUG_VERBOSE, " %02X", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, " ")); + } + } + + DEBUG ((DEBUG_VERBOSE, " ")); + // Ascii ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + // Only print ACPI acceptable characters + if (((Data[Index + Column] >= 0x30) && // '0' - '9' + (Data[Index + Column] <= 0x39)) || + ((Data[Index + Column] >= 0x41) && // 'A' - 'Z' + (Data[Index + Column] <= 0x5A)) || + (Data[Index + Column] == 0x5C) || // '\' + (Data[Index + Column] == 0x5F) || // '_' + (Data[Index + Column] == 0x5E) // '^' + ) + { + DEBUG ((DEBUG_VERBOSE, "%c", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, ".")); + } + } + } + + Index += NumberOfColumns; + DEBUG ((DEBUG_VERBOSE, "\n")); + } + + return EFI_SUCCESS; +} + +/** + DEBUG print an AML Object including an array of HEX bytes for the data + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS, EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if ((Object == NULL) || (Object->Signature != AML_OBJECT_INSTANCE_SIGNATURE)) { + return EFI_INVALID_PARAMETER; + } + + DEBUG (( + DEBUG_VERBOSE, + "Object=0x%X, Size=0x%d\n", + (UINTN)Object, + Object->DataSize + )); + AmlDebugPrintBuffer (Object->Data, Object->DataSize); + DEBUG ((DEBUG_VERBOSE, "Completed=%a\n", Object->Completed ? "TRUE" : "FALSE")); + DEBUG ((DEBUG_VERBOSE, "\n")); + return EFI_SUCCESS; +} + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + DEBUG ((DEBUG_VERBOSE, "Printing AML_OBJECT_INSTANCE Linked List\n")); + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + AmlDebugPrintObject (Object); + Node = GetNextNode (ListHead, Node); + } + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c new file mode 100644 index 0000000000..85d184b759 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c @@ -0,0 +1,267 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLPKGLENGTH_FILECODE + +#define MAX_ONE_BYTE_PKG_LENGTH 63 +#define ONE_BYTE_PKG_LENGTH_ENCODING 0x00 +#define ONE_BYTE_NIBBLE_MASK 0x3F + +#define MAX_TWO_BYTE_PKG_LENGTH 4095 +#define TWO_BYTE_PKG_LENGTH_ENCODING 0x40 +#define PKG_LENGTH_NIBBLE_MASK 0x0F + +#define MAX_THREE_BYTE_PKG_LENGTH 1048575 +#define THREE_BYTE_PKG_LENGTH_ENCODING 0x80 + +#define MAX_FOUR_BYTE_PKG_LENGTH 268435455 +#define FOUR_BYTE_PKG_LENGTH_ENCODING 0xC0 + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ) +{ + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + EFI_STATUS Status; + + Status = EFI_INVALID_PARAMETER; + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((DataSize) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((DataSize) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + // DataSize = DataLength + DataSize; + *PkgLengthEncoding = AllocatePool (DataLength); + if (*PkgLengthEncoding == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + *PkgLengthEncoding[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (DataSize) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&PkgLengthEncoding[0][1], &PkgLengthRemainder, DataLength - 1); + } + + *ReturnDataLength = DataLength; + +Done: + return Status; +} + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Length object\n", __func__)); + goto Done; + } + + break; + case AmlClose: + Status = InternalAmlLocateObjectByIdentifier (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Length object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, "Length")); + goto Done; + } + + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((ChildObject->DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((ChildObject->DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_DEVICE_ERROR; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + Object->DataSize = DataLength + ChildObject->DataSize; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + Object->Data[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (ChildObject->DataSize + DataLength) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&Object->Data[1], &PkgLengthRemainder, DataLength - 1); + } + + CopyMem ( + &Object->Data[DataLength], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c new file mode 100644 index 0000000000..4ef746327b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c @@ -0,0 +1,1989 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLRESOURCEDESCRIPTOR_FILECODE + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_ACPI_END_TAG_DESCRIPTOR *EndTag; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = AmlBuffer (AmlStart, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + // Start EndTag object to be completed in Close + // ACPI 6.3: 6.4.2.9 End Tag: ...The End Tag is automatically generated by + // the ASL compiler at the end of the ResourceTemplate statement. + Status = InternalAppendNewAmlObject (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "END_TAG")); + goto Done; + } + + // ResourceMacroList is too complicated and must be added outside + break; + case AmlClose: + // ResourceMacroList should be closed already + + // Locate and complete End Tag + Status = InternalAmlLocateObjectByIdentifier (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, "END_TAG")); + goto Done; + } + + // Release Object->Data Identifier + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: EndTag Alloc Failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + // ChildObject Data goes before End Tag + if ((ChildObject->Data != NULL) && (ChildObject->DataSize > 0)) { + CopyMem (Object->Data, ChildObject->Data, ChildObject->DataSize); + } + + EndTag = (EFI_ACPI_END_TAG_DESCRIPTOR *)&Object->Data[ChildObject->DataSize]; + EndTag->Desc = ACPI_END_TAG_DESCRIPTOR; + // Spec says the byte is a checksum, but I have never seen a value other + // than zero in the field compiled from ASL. + // EndTag->Checksum already = 0; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = AmlBuffer (AmlClose, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + InternalAmlAddressSpaceCheck + + Checks Address space parameters for Word, DWord, or QWord size Address space + Descriptor. Size will be constrained by the Resource Descriptor input + parameters being of the correct size. + + @param[in] IsMinFixed + @param[in] IsMaxFixed + @param[in] AddressGranularity + @param[in] AddressMinimum + @param[in] AddressMaximum + @param[in] RangeLength + +**/ +EFI_STATUS +EFIAPI +InternalAmlAddressSpaceCheck ( + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 RangeLength + ) +{ + // Max must be greater than Min + if (AddressMaximum < AddressMinimum) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum greater than AddressMaximum\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Address Granularity must be (2^n)-1 + if (((AddressGranularity + 1) & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity must be (a power of 2)-1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (RangeLength == 0) { + // LEN _MIF _MAF Definition + // 0 0 0 + // 0 0 1 + // 0 1 0 + // Variable size, variable location resource descriptor for _PRS. + // If _MIF is set, _MIN must be a multiple of (_GRA+1). If _MAF + // is set, _MAX must be (a multiple of (_GRA+1))-1. + // OS can pick the resource range that satisfies following conditions: + // If _MIF is not set, start address is a multiple of (_GRA+1) + // and greater or equal to _MIN. Otherwise, start address is _MIN. + // If _MAF is not set, end address is (a multiple of (_GRA+1))-1 + // and less or equal to _MAX. Otherwise, end address is _MAX. + // 0 1 1 (Invalid combination) + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // 0 1 1 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsMinFixed and IsMaxFixed cannot both be set\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED) { + // 0 0 1 + if ((AddressMaximum & AddressGranularity) != AddressGranularity) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMaximum=0x%lX + 1) is not a multiple of\n", __func__, AddressMaximum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressMaximum == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMaximum can not be 0\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if (IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) { + // 0 1 0 + if ((AddressMinimum & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum=0x%lX is not a multiple of\n", __func__, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED) && + (AddressMinimum == 0) && + (AddressMaximum == 0) && + (AddressGranularity == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Maximum, Minimum, Granularity all 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else { + // LEN _MIF _MAF Definition + // >0 0 0 Fixed size, variable location resource descriptor for _PRS. + // _LEN must be a multiple of (_GRA+1). + // OS can pick the resource range that satisfies following conditions: + // Start address is a multiple of (_GRA+1) and greater or equal to _MIN. + // End address is (start address+_LEN-1) and less or equal to _MAX. + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + // >0 1 1 Fixed size, fixed location resource descriptor. + // _GRA must be 0 and _LEN must be (_MAX - _MIN +1). + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED)) + { + // >0 0 0 + if ((RangeLength & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX is not a multiple of\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 0, IsMaxFixed = 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength > (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX > (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 0, IsMaxFixed = 0\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // >0 1 1 + if (AddressGranularity != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity=0x%lX != 0\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX > 0, IsMinFixed = 1, and IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength != (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX != (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 1, IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else { + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: When RangeLength=0x%lX > 0,\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed and IsMaxFixed must both be either 1 or 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } + + return EFI_SUCCESS; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + The DWORD address space descriptor is used to report resource usage in a + 32-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPDWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: DWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DMA_DESCRIPTOR *Descriptor; + + if ((DmaType & (UINT8) ~EFI_ACPI_DMA_SPEED_TYPE_MASK) != 0) { + // Invalid DmaType value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaType '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if ((IsBusMaster & ~EFI_ACPI_DMA_BUS_MASTER_MASK) != 0) { + // Invalid IsBusMaster value + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsBusMaster '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (((DmaTransferSize & ~EFI_ACPI_DMA_TRANSFER_TYPE_MASK) != 0) || + (DmaTransferSize == 0x3)) + { + // Invalid DmaTransferSize value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaTransferSize '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "DMA_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DMA_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DMA_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DMA_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_DMA_DESCRIPTOR; + Descriptor->ChannelMask = DmaChannelList; + // + // Descriptor->Information bit mask: + // Bit [7] Reserved (must be 0) + // Bits [6:5] DMA channel speed supported, _TYP + // 00 Indicates compatibility mode + // 01 Indicates Type A DMA as described in the EISA + // 10 Indicates Type B DMA + // 11 Indicates Type F + // Bits [4:3] Ignored + // Bit [2] Logical device bus master status, _BM + // 0 Logical device is not a bus master + // 1 Logical device is a bus master + // Bits [1:0] DMA transfer type preference, _SIZ + // 00 8-bit only + // 01 8- and 16-bit + // 10 16-bit only + Descriptor->Information = (UINT8)(DmaType + + IsBusMaster + + DmaTransferSize); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 are Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create QWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPQWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: QWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "QWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "QWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IRQ_DESCRIPTOR *Descriptor; + + if ((EdgeLevel & (UINT8) ~EFI_ACPI_IRQ_MODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: EdgeLevel '%x' is not valid.\n", __func__, EdgeLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((ActiveLevel & (UINT8) ~EFI_ACPI_IRQ_POLARITY_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ActiveLevel '%x' is not valid.\n", __func__, ActiveLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((Shared & (UINT8) ~(EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | EFI_ACPI_IRQ_SHARABLE_MASK)) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Shared '%x' is not valid.\n", __func__, Shared)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create %a object.", __func__, "IRQ_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IRQ_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Alloc for %a failed\n", __func__, "IRQ_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IRQ_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_IRQ_DESCRIPTOR; + Descriptor->Mask = InterruptList; + // + // Ref 6.4.2.1 IRQ Descriptor - IRQ Information + // Descriptor->Information bit mask: + // IRQ Information. Each bit, when set, indicates this device is capable of + // driving a certain type of interrupt. (Optional-if not included then assume + // edge sensitive, high true interrupts.) These bits can be used both for + // reporting and setting IRQ resources. + // Note: This descriptor is meant for describing interrupts that are connected + // to PIC-compatible interrupt controllers, which can only be programmed + // for Active-High-Edge-Triggered or Active-Low-LevelTriggered interrupts. + // Any other combination is invalid. The Extended Interrupt Descriptor can + // be used to describe other combinations. + // + // Bit [7:6] Reserved (must be 0) + // Bit [5] Wake Capability, _WKC + // 0x0 = Not Wake Capable: This interrupt is not capable of waking the system. + // 0x1 = Wake Capable: This interrupt is capable of waking the system from a + // low-power idle state or a system sleep state. + // Bit [4] Interrupt Sharing, _SHR + // 0x0 = Exclusive: This interrupt is not shared with other devices. + // 0x1 = Shared: This interrupt is shared with other devices. + // Bit [3] Interrupt Polarity, _LL + // 0 Active-High - This interrupt is sampled when the signal is high, or true + // 1 Active-Low - This interrupt is sampled when the signal is low, or false. + // Bit [2:1] Ignored + // Bit [0] Interrupt Mode, _HE + // 0 Level-Triggered - Interrupt is triggered in response to signal in a low state. + // 1 Edge-Triggered - Interrupt is triggered in response to a change in signal state from + // low to high. + // + Descriptor->Information = (UINT8)((EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | + EFI_ACPI_IRQ_SHARABLE_MASK | + EFI_ACPI_IRQ_POLARITY_MASK | + EFI_ACPI_IRQ_MODE_MASK) & + (Shared | + ActiveLevel | + EdgeLevel)); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IO_PORT_DESCRIPTOR *Descriptor; + UINT64 Remainder; + + if ((Decode & (UINT8) ~EFI_ACPI_IO_DECODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Decode '%x' is not valid.\n", __func__, Decode)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressAlignment != 0) { + DivU64x64Remainder (AddressMin, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMin=0x%X) is not a multiple of\n", __func__, AddressMin)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + + DivU64x64Remainder (AddressMax, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMax=0x%X) is not a multiple of\n", __func__, AddressMax)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IO_PORT_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IO_PORT_DESCRIPTOR *)Object->Data; + + /* + * According to ACPI spec for + * ACPI_IO_PORT_DESCRIPTOR = 0x47 contains the informaion about + * Name, Type and Length, hence no need to calculate the length. + * Below is description from ACPI spec + * Byte 0 I/O Port Descriptor Value = 0x47 (01000111B) - Type = 0, Small item name = + * 0x8, Length = 7 + */ + Descriptor->Header.Byte = ACPI_IO_PORT_DESCRIPTOR; + // + // Descriptor->Information bit mask: + // Bit [7:1] Reserved, must be 0 + // Bit [0] (_DEC) + // 1 The logical device decodes 16-bit addresses + // 0 The logical device decodes 10-bit addresses + Descriptor->Information = (UINT8)(EFI_ACPI_IO_DECODE_MASK & Decode); + Descriptor->BaseAddressMin = AddressMin; + Descriptor->BaseAddressMax = AddressMax; + Descriptor->Alignment = AddressAlignment; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *Descriptor; + + if ((AddressSpaceKeyword < EFI_ACPI_6_4_SYSTEM_MEMORY) || + (AddressSpaceKeyword > EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if ((AddressSpaceKeyword > EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL) && + (AddressSpaceKeyword < EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if (AccessSize > EFI_ACPI_6_4_QWORD) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AccessSize=0x%02X\n", __func__, AccessSize)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *)Object->Data; + + Descriptor->Header.Header.Byte = ACPI_GENERIC_REGISTER_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->AddressSpaceId = AddressSpaceKeyword; + Descriptor->RegisterBitWidth = RegisterBitWidth; + Descriptor->RegisterBitOffset = RegisterBitOffset; + Descriptor->AddressSize = AccessSize; + Descriptor->RegisterAddress = RegisterAddress; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: Evaluates to a 32-bit integer that specifies the total number of + bytes decoded in the memory range. The 32-bit field DescriptorName. _LEN is + automatically created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *Descriptor; + + if ((ReadAndWrite & (UINT8) ~EFI_ACPI_MEMORY_WRITE_STATUS_MASK) != 0) { + // Invalid ReadAndWrite value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ReadAndWrite '%x' is not valid.\n", __func__, ReadAndWrite)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "MEMORY_32_FIXED_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "MEMORY_32_FIXED_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->Information = ReadAndWrite; + Descriptor->BaseAddress = AddressBase; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + The WORD address space descriptor is used to report resource usage in a + 16-bit address space (like memory and I/O, Bus Number). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "WORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + + This function only requires a single call and therefore no Phases + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_BUS, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + 0, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c new file mode 100644 index 0000000000..03201d0109 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c @@ -0,0 +1,515 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLSTATEMENTOPCODES_FILECODE + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Else", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Else", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_ELSE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "If", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "If", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_IF_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + Status = InternalAppendNewAmlObject (&Object, NotifyObject, ListHead); + Status = AmlOPNameString (NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyObject NameString\n", __func__)); + goto Done; + } + + Status = AmlOPDataInteger (NotifyValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyValue Integer\n", __func__)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_NOTIFY_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Return", ListHead); + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Return", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + // Return without arguments is treated like Return(0) + // Zeroed byte = ZeroOp + ChildObject->Data = AllocateZeroPool (sizeof (UINT8)); + if (ChildObject->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Zero Child for Return\n", __func__)); + goto Done; + } + + ChildObject->DataSize = 1; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_RETURN_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c new file mode 100644 index 0000000000..c9a4399764 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c @@ -0,0 +1,213 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLTABLE_FILECODE + +// String Length Constants +#define OEM_ID_LENGTH 6 +#define OEM_TABLE_ID_LENGTH 8 +#define SIGNATURE_LENGTH 4 +#define CREATOR_ID_LENGTH 4 + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (ListHead == NULL) || + (TableNameString == NULL) || + (OemId == NULL) || + (OemTableId == NULL) || + (CreatorId == NULL) || + (AsciiStrLen (TableNameString) != SIGNATURE_LENGTH) || + (AsciiStrLen (OemId) > OEM_ID_LENGTH) || + (AsciiStrLen (OemTableId) > OEM_TABLE_ID_LENGTH) || + (AsciiStrLen (CreatorId) != CREATOR_ID_LENGTH)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, TableNameString, ListHead); + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, TableNameString, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate %a object\n", __func__, TableNameString)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, TableNameString)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_DESCRIPTION_HEADER); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, TableNameString)); + goto Done; + } + + // Fill table header with data + // Signature + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Signature)], + TableNameString, + AsciiStrLen (TableNameString) + ); + + // Table Length + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Length)], + (UINT32 *)&Object->DataSize, + sizeof (UINT32) + ); + + // ACPI Table Version + Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Revision)] = ComplianceRev; + + // OEM ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemId)], + OemId, + AsciiStrLen (OemId) + ); + + // OEM Table ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemTableId)], + OemTableId, + AsciiStrLen (OemTableId) + ); + + // OEM Table Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemRevision)], + (UINT8 *)&OemRevision, + sizeof (UINT32) + ); + + // Creator ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorId)], + CreatorId, + AsciiStrLen (CreatorId) + ); + + // Creator Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorRevision)], + (UINT8 *)&CreatorRevision, + sizeof (UINT32) + ); + + // Copy rest of data into Object + CopyMem ( + &Object->Data[sizeof (EFI_ACPI_DESCRIPTION_HEADER)], + ChildObject->Data, + ChildObject->DataSize + ); + + // Checksum Set on Table Install + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c new file mode 100644 index 0000000000..b1ad9b7037 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c @@ -0,0 +1,364 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_LOCALAMLOBJECTS_FILECODE + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if (Object == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (Object->Data != NULL) { + FreePool (Object->Data); + Object->Data = NULL; + Object->DataSize = 0; + Object->Completed = FALSE; + } + + return EFI_SUCCESS; +} + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **FreeObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + + if ((FreeObject == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = *FreeObject; + if (Object != NULL) { + InternalFreeAmlObjectData (Object); + if (IsNodeInList (ListHead, &Object->Link)) { + RemoveEntryList (&Object->Link); + } + + FreePool (Object); + } + + *FreeObject = NULL; + return EFI_SUCCESS; +} + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ) +{ + AML_OBJECT_INSTANCE *Object; + + if (ReturnObject == NULL) { + return EFI_INVALID_PARAMETER; + } + + *ReturnObject = NULL; + + // Allocate AML Object + Object = AllocateZeroPool (sizeof (AML_OBJECT_INSTANCE)); + if (Object == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Object Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + Object->DataSize = 0; + Object->Data = NULL; + Object->Signature = AML_OBJECT_INSTANCE_SIGNATURE; + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((ListHead == NULL) || (ReturnObject == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = InternalNewAmlObjectNoData (&Object); + if (!EFI_ERROR (Status)) { + InsertTailList (ListHead, &Object->Link); + *ReturnObject = Object; + } + + return Status; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + // Allocate Identifier Data + NULL termination + Object->DataSize = AsciiStrLen (Identifier) + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Data Identifier=%a\n", __func__, Identifier)); + InternalFreeAmlObject (&Object, ListHead); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (Object->Data, Identifier, Object->DataSize); + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + + if (Object->Completed) { + // Object to be found cannot be completed yet + continue; + } else { + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + *ReturnObject = Object; + return EFI_SUCCESS; + } else { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: First incomplete Object is not %a.\n", + __func__, + Identifier + )); + // Object looking for should be the first uncompleted Object. + return EFI_NOT_FOUND; + } + } + } while (Node != ListHead); + + *ReturnObject = NULL; + return EFI_NOT_FOUND; +} + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 *TempBuffer; + + Status = EFI_SUCCESS; + if ((ReturnObject == NULL) || + (ChildCount == NULL) || + (Link == NULL) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + *ChildCount = 0; + + Status = InternalNewAmlObjectNoData (&Object); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocating Object Data\n", __func__)); + goto Done; + } + + // Get first Child Node + Node = GetNextNode (ListHead, Link); + while (Node != ListHead) { + ChildObject = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Expand data buffer to fit existing data + new data + TempBuffer = ReallocatePool ( + Object->DataSize, + Object->DataSize + ChildObject->DataSize, + Object->Data + ); + if (TempBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + FreePool (Object->Data); + Object->Data = NULL; + DEBUG ((DEBUG_ERROR, "%a: ERROR: reallocating Object Data\n", __func__)); + goto Done; + } + + Object->Data = TempBuffer; + // Copy new data at end of buffer + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + // Get Next ChildObject Node, then free ChildObject from list + Node = GetNextNode (ListHead, Node); + InternalFreeAmlObject (&ChildObject, ListHead); + *ChildCount = *ChildCount + 1; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + Object = NULL; + } + + *ReturnObject = Object; + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c new file mode 100644 index 0000000000..2f4f676adb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c @@ -0,0 +1,13 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/*---------------------------------------------------------------------------------------- + * M O D U L E S U S E D + *---------------------------------------------------------------------------------------- + */ +#include <Filecode.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c new file mode 100644 index 0000000000..60305ee4a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c @@ -0,0 +1,90 @@ +/** @file + Library to support reset library, inheritted from Agesa Cf9Reset module. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> + +/** + This function causes a system-wide reset (cold reset), in which + all circuitry within the system returns to its initial state. This type of reset + is asynchronous to system operation and operates without regard to + cycle boundaries. + + If this function returns, it means that the system does not support cold reset. +**/ +VOID +EFIAPI +ResetCold ( + VOID + ) +{ +} + +/** + This function causes a system-wide initialization (warm reset), in which all processors + are set to their initial state. Pending cycles are not corrupted. + + If this function returns, it means that the system does not support warm reset. +**/ +VOID +EFIAPI +ResetWarm ( + VOID + ) +{ +} + +/** + This function causes the system to enter a power state equivalent + to the ACPI G2/S5 or G3 states. + + If this function returns, it means that the system does not support shutdown reset. +**/ +VOID +EFIAPI +ResetShutdown ( + VOID + ) +{ +} + +/** + This function causes the system to enter S3 and then wake up immediately. + + If this function returns, it means that the system does not support S3 feature. +**/ +VOID +EFIAPI +EnterS3WithImmediateWake ( + VOID + ) +{ +} + +/** + This function causes a systemwide reset. The exact type of the reset is + defined by the EFI_GUID that follows the Null-terminated Unicode string passed + into ResetData. If the platform does not recognize the EFI_GUID in ResetData + the platform must pick a supported reset type to perform.The platform may + optionally log the parameters from any non-normal reset that occurs. + + @param[in] DataSize The size, in bytes, of ResetData. + @param[in] ResetData The data buffer starts with a Null-terminated string, + followed by the EFI_GUID. +**/ +VOID +EFIAPI +ResetPlatformSpecific ( + IN UINTN DataSize, + IN VOID *ResetData + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c new file mode 100644 index 0000000000..d10e676668 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c @@ -0,0 +1,87 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Filecode.h> +#include <Uefi.h> +/*----------------------------------------------------------------------------------------*/ + +/** + * @param[in] EspiBase Espi MMIO base + * @param[in] RegAddr Slave register address + * + * @retval Register Value + */ +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ) +{ + return 0; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to read + * @param[in] Length Length in byte to read + * @param[in] Buffer Pointer to the data read to + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to write + * @param[in] Length Length in byte to write + * @param[in] Value Pointer to the data to write + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to erase + * @param[in] Length Block Size to erase + * + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c new file mode 100755 index 0000000000..9044d3d497 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c @@ -0,0 +1,68 @@ +/** @file + GNB function to create/locate PCIe configuration data area, Contain code + that create/locate/manages GNB/PCIe configuration + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/NbioHandleLib.h> +#include <Library/AmdBaseLib.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ) +{ + return NULL; +} + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ) +{ + PCI_ADDR PciAddr; + + PciAddr.AddressValue = 0; + return PciAddr; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c new file mode 100755 index 0000000000..d5fbe98d22 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c @@ -0,0 +1,276 @@ +/** @file + GNB function to create/locate PCIe configuration data area + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/GnbPcieConfigLib.h> + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ) +{ + return FALSE; +} + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ) +{ + return 0; +} + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ) +{ +} + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ +} + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ) +{ + return FALSE; +} + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ + return NULL; +} + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ) +{ +} + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ) +{ +} + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ) +{ +} + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c new file mode 100755 index 0000000000..5c6be22ee4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c @@ -0,0 +1,117 @@ +/** @file + Procedure to parse PCIe input configuration data + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <GnbDxio.h> + +/** + Get number of complexes in platform topology configuration + + @param[in] ComplexList First complex configuration in complex configuration array + @retval Number of Complexes + +**/ +UINTN +PcieInputParserGetNumberOfComplexes ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList + ) +{ + return 0; +} + +/** + Get number of PCIe engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfPcieEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of DDI engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfDdiEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of engines in given complex + + + + @param[in] Complex Complex configuration header + @retval Number of Engines +**/ +UINTN +PcieInputParserGetNumberOfEngines ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] Index Complex descriptor Index + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINTN Index + ) +{ + return NULL; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] SocketId Socket Id + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptorOfSocket ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINT32 SocketId + ) +{ + return NULL; +} + +/** + Get Engine descriptor from given complex by index + + @param[in] Complex Complex descriptor + @param[in] Index Engine descriptor index + @retval Pointer to Engine Descriptor +**/ +PCIE_ENGINE_DESCRIPTOR * +PcieInputParserGetEngineDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex, + IN UINTN Index + ) +{ + return NULL; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c new file mode 100644 index 0000000000..e6be32b071 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c @@ -0,0 +1,10 @@ +/** @file + SMN Register Access Methods + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/SmnAccessLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c new file mode 100644 index 0000000000..1dc13900c7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c @@ -0,0 +1,42 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/PcieConfigLib.h> +#include <Library/NbioCommonLibDxe.h> + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c new file mode 100644 index 0000000000..fbd3ddcf37 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c @@ -0,0 +1,23 @@ +/** @file + APCB DXE Driver + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PcdLib.h> + +EFI_STATUS +EFIAPI +AmdApcbV3DxeDriverEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c new file mode 100644 index 0000000000..23d1a8fee0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> + +/** + * @brief Amd Apcb V3 Pei Driver Entry + * + * @param[in] FileHandle File Handie + * @param[in] PeiServices Pei Services + * + * @retval EFI_SUCCESS Set APCB value successfully + * Non-EFI_SUCCESS Function Error + * + **/ +EFI_STATUS +EFIAPI +AmdApcbV3PeiDriverEntry ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c new file mode 100644 index 0000000000..74b129931b --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c @@ -0,0 +1,39 @@ +/** @file + Required OEM hooks for CCX initialization + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + Hook to store the vector that all APs should jump to out of reset to a non-volatile, + shared location. + + @param[in] ApInitAddress Address of the code that AP should jump to + @param[in,out] ContentToRestore The current value in the non-volatile storage + +**/ +VOID +SaveApInitVector ( + IN UINT32 ApInitAddress, + IN OUT UINT32 *ContentToRestore + ) +{ +} + +/** + Hook to restore the initial content of the non-volatile storage location. + + @param[in] ContentToRestore The value to restore + +**/ +VOID +RestoreContentVector ( + IN UINT32 ContentToRestore + ) +{ +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c new file mode 100644 index 0000000000..54ce202cb1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c @@ -0,0 +1,33 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Ppi/PciCfg2.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> + +/** + Module's entry function. + This routine will install EFI_PEI_PCI_CFG2_PPI. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @return Whether success to install service. +**/ +EFI_STATUS +EFIAPI +PeimInitializePciCfg ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c new file mode 100644 index 0000000000..643174d7b9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/PciSegmentInfoLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> + +/** + Return an array of PCI_SEGMENT_INFO holding the segment information. + + Note: The returned array/buffer is owned by callee. + + @param Count Return the count of segments. + + @retval A callee owned array holding the segment information. +**/ +PCI_SEGMENT_INFO * +EFIAPI +GetPciSegmentInfo ( + UINTN *Count + ) +{ + return (PCI_SEGMENT_INFO *)NULL; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c new file mode 100644 index 0000000000..d83bb6c2d8 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c @@ -0,0 +1,15 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiSmm.h> +#include <Register/Cpuid.h> +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Library/DebugLib.h> +#include <Protocol/SmmBase2.h> +#include <Library/IoLib.h> diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c new file mode 100644 index 0000000000..a264eb9294 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c @@ -0,0 +1,12 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/PcdLib.h> diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c new file mode 100644 index 0000000000..e379538e3a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c @@ -0,0 +1,36 @@ +/** @file + OEM OOB PPR DXE Driver. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <Library/DebugLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciIo.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TimerLib.h> +#include <IndustryStandard/Pci22.h> + +/** +* This function installs a protocol used by platform BIOS to provide the hotplug descriptor. +* +* @param[in] ImageHandle Image handler +* @param[in] SystemTable Pointer to the system table +* +* @retval EFI_SUCCESS The thread was successfully launched. +* +**/ +EFI_STATUS +EFIAPI +OobPprEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c new file mode 100644 index 0000000000..5242e6261a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c @@ -0,0 +1,20 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DebugLib.h> + +EFI_STATUS +EFIAPI +PspPlatformEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c new file mode 100644 index 0000000000..530bd9d4b6 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiPei.h> +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> + +EFI_STATUS +EFIAPI +HotplugDescEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c new file mode 100644 index 0000000000..fbc372586b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c @@ -0,0 +1,44 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} + +/** + Destructor for the library. free any resources. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. +**/ +EFI_STATUS +EFIAPI +ActLibraryUnregisterActCommand ( + IN EFI_HANDLE ImageHandle + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c new file mode 100644 index 0000000000..0a5f4a7e81 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c @@ -0,0 +1,36 @@ +/** @file + String token ID of help message text. + Shell supports to find help message in the resource section of an + application image if * .MAN file is not found. + This global variable is added to make build tool recognizes + that the help string is consumed by user and then build tool will + add the string into the resource section. + Thus the application can use '-?' option to show help message in Shell. + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c new file mode 100644 index 0000000000..47eb700f8f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/IoLib.h> + +/** + Performs platform specific initialization required for the CPU to access + the hardware associated with a SerialPortLib instance. This function does + not intiailzie the serial port hardware itself. Instead, it initializes + hardware devices that are required for the CPU to access the serial port + hardware. This function may be called more than once. + + @retval RETURN_SUCCESS The platform specific initialization succeeded. + @retval RETURN_DEVICE_ERROR The platform specific initialization could not be completed. + +**/ +RETURN_STATUS +EFIAPI +PlatformHookSerialPortInitialize ( + VOID + ) +{ + return RETURN_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl new file mode 100644 index 0000000000..72b9a87639 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl @@ -0,0 +1,9 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + diff --git a/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc new file mode 100644 index 0000000000..2dfb3190d4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc @@ -0,0 +1,13 @@ +; @file +; +; AMD Generic Encapsulated Software Architecture +; Code to setup temporary memory access for stack usage. This code +; is to be used on memory present systems that do not need CAR. +; +; Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +; +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +%macro AMD_ENABLE_UEFI_STACK2 2-3 + +%endmacro diff --git a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi index a731c7e369..937caee083 160000 --- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi +++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi @@ -1 +1 @@ -Subproject commit a731c7e36988c3308e1978ecde491f2f6182d490 +Subproject commit 937caee0833115f69d697ca190001ba0aa5c7368 -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119130): https://edk2.groups.io/g/devel/message/119130 Mute This Topic: https://groups.io/mt/106257082/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md 2024-05-23 4:12 [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Chang, Abner via groups.io @ 2024-05-23 4:12 ` Chang, Abner via groups.io 2024-05-23 7:25 ` Xing, Eric via groups.io 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages Chang, Abner via groups.io ` (2 subsequent siblings) 3 siblings, 2 replies; 16+ messages in thread From: Chang, Abner via groups.io @ 2024-05-23 4:12 UTC (permalink / raw) To: devel Cc: Paul Grimes, Abdul Lateef Attar, Igniculus Fu, Ken Yao, Eric Xing, Duke Zhai From: Abner Chang <abner.chang@amd.com> Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- Platform/AMD/Readme.md | 64 ++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/Platform/AMD/Readme.md b/Platform/AMD/Readme.md index 99d2b990c7..3297c6ba59 100644 --- a/Platform/AMD/Readme.md +++ b/Platform/AMD/Readme.md @@ -7,18 +7,25 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Term and Definitions +* **AGESA** + + AMD Generic Encapsulated Software Architecture that are executed as part of a + host platform BIOS. + * **AMD Platform** (platform in short) - AMD platform refers to a platform that supports the particular AMD SoC (processor), such as AMD EPYC Milan and Genoa processors. + AMD platform refers to a platform that supports the particular AMD SoC (processor), such as + AMD EPYC Milan and Genoa processors. * **AMD Board** (board in short) AMD board is a generic terminology refers to a board that is designed based on a specific AMD SoC architecture (also referred as AMD platform). More than one boards - are possibly designed to support an AMD platform with different configuration, such as 1-processor socket or 2-processor sockets board. + are possibly designed to support an AMD platform with different configuration, such as + 1-processor socket or 2-processor sockets board. * **AMD edk2 Platform Package** (platform package in short) - + The folder has the AMD edk2 platform common modules. * **AMD edk2 Board Package** (board package in short) @@ -28,29 +35,52 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Package Definition +* **AgesaModulePkg** + + This package contains all of the private interfaces and build configuration files for the + AGESA support. + +* **AgesaPkg** + + This package contains all of the public interfaces and build configuration files + for the AGESA support. + +* **AmdCbsPkg** + + AMD Configurable BIOS Setting. Provides the edk2 formset following the UEFI HII + spec to configure BIOS settings. + +* **AmdCpmPkg** + + AMD Common Platform Module software is a BIOS procedure library designed to aid + AMD customers to quickly implement AMD platform technology into their products. + * **AmdPlatformPkg** - AMD platform edk2 package under this folder provides the common edk2 modules those - are leverage by platforms. Usually those modules have no dependencies with - particular platforms. The module under this scope can provides a common implementation - for all platforms, or it may just provide a framework but the differences of implementation could be configured through the PCDs declared in AmdPlatformPkg.dec, or - the board level library provided in the \<Board name\>Pkg. + AMD platform edk2 package under this folder provides the common edk2 + modules that are leveraged by platforms. Usually those modules have no dependencies with + particular platforms. Modules under this scope can provide a common implementation + for all platforms, or may just provide a framework but the differences of implementation + could be configured through the PCDs declared in AmdPlatformPkg.dec, or the board level + library provided in the \<Board name\>Pkg. * **AmdMinBoardPkg** - This package provides the common edk2 modules those can be leverage across AMD boards those use MinPlatformPkg framework. + This package provides the common edk2 modules that can be leveraged across AMD boards using + the MinPlatform framework. * **\<SoC name\>Board** - This is the folder named by SoC and accommodate one or multiple board packages those - are designed base on the same SoC platform. <SoC name>Board folder may contain edk2 - package meta files directly or the sub-folders named by \<Board name\>Pkg for a - variety configurations of a platform. + This is the folder named by SoC and accommodates one or multiple board packages + that are designed based on the same SoC platform. <SoC name>Board folder may + contain edk2 package meta files directly or the sub-folders named by \<Board name\>Pkg for + a variety configurations of a platform. * **<Board name\>Pkg** - This is the folder that contains edk2 package meta files for a board which is designed base on a platform. Besides the edk2 meta files, <Board name\>Pkg may also provides - edk2 modules which are specifically to a board. + This is the folder that contains edk2 package meta files for a board which is designed base + on a platform. Besides the edk2 meta files, <Board name\>Pkg may also provides edk2 modules + which are specifically to a board. ``` e.g. OverdriveBoard @@ -63,6 +93,10 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ``` Platform/AMD + |----AgesaModulePkg + |----AgesaPkg + |----AmdCbsPkg + |----AmdCpmPkg |----AmdPlatformPkg |----AmdMinBoardPkg |----OverdriveBoard -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119128): https://edk2.groups.io/g/devel/message/119128 Mute This Topic: https://groups.io/mt/106257080/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md Chang, Abner via groups.io @ 2024-05-23 7:25 ` Xing, Eric via groups.io 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 1 sibling, 0 replies; 16+ messages in thread From: Xing, Eric via groups.io @ 2024-05-23 7:25 UTC (permalink / raw) To: Chang, Abner, devel@edk2.groups.io Cc: Grimes, Paul, Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Yao, Ken, Zhai, MingXin (Duke) [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. Reviewed-by: Eric Xing <Eric.Xing@amd.com> > -----Original Message----- > From: Chang, Abner <Abner.Chang@amd.com> > Sent: Thursday, May 23, 2024 12:12 PM > To: devel@edk2.groups.io > Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) > <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, > Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin > (Duke) <duke.zhai@amd.com> > Subject: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md > > From: Abner Chang <abner.chang@amd.com> > > Cc: Paul Grimes <paul.grimes@amd.com> > Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> > Cc: Igniculus Fu <igniculus.fu@amd.com> > Cc: Ken Yao <ken.yao@amd.com> > Cc: Eric Xing <eric.xing@amd.com> > Cc: Duke Zhai <Duke.Zhai@amd.com> > Signed-off-by: Abner Chang <abner.chang@amd.com> > --- > Platform/AMD/Readme.md | 64 ++++++++++++++++++++++++++++++++---- > ------ > 1 file changed, 49 insertions(+), 15 deletions(-) > > diff --git a/Platform/AMD/Readme.md b/Platform/AMD/Readme.md index > 99d2b990c7..3297c6ba59 100644 > --- a/Platform/AMD/Readme.md > +++ b/Platform/AMD/Readme.md > @@ -7,18 +7,25 @@ booting certain AMD platforms. The definition of sub- > folders is described in bel > > ## Term and Definitions > > +* **AGESA** > + > + AMD Generic Encapsulated Software Architecture that are executed as > + part of a host platform BIOS. > + > * **AMD Platform** (platform in short) > > - AMD platform refers to a platform that supports the particular AMD SoC > (processor), such as AMD EPYC Milan and Genoa processors. > + AMD platform refers to a platform that supports the particular AMD > + SoC (processor), such as AMD EPYC Milan and Genoa processors. > > * **AMD Board** (board in short) > > AMD board is a generic terminology refers to a board that is designed based > on a > specific AMD SoC architecture (also referred as AMD platform). More than > one boards > - are possibly designed to support an AMD platform with different > configuration, such as 1-processor socket or 2-processor sockets board. > + are possibly designed to support an AMD platform with different > + configuration, such as 1-processor socket or 2-processor sockets board. > > * **AMD edk2 Platform Package** (platform package in short) > - > + > The folder has the AMD edk2 platform common modules. > > * **AMD edk2 Board Package** (board package in short) @@ -28,29 +35,52 > @@ booting certain AMD platforms. The definition of sub-folders is described > in bel > > ## Package Definition > > +* **AgesaModulePkg** > + > + This package contains all of the private interfaces and build > + configuration files for the AGESA support. > + > +* **AgesaPkg** > + > + This package contains all of the public interfaces and build > + configuration files for the AGESA support. > + > +* **AmdCbsPkg** > + > + AMD Configurable BIOS Setting. Provides the edk2 formset following > + the UEFI HII spec to configure BIOS settings. > + > +* **AmdCpmPkg** > + > + AMD Common Platform Module software is a BIOS procedure library > + designed to aid AMD customers to quickly implement AMD platform > technology into their products. > + > * **AmdPlatformPkg** > > - AMD platform edk2 package under this folder provides the common edk2 > modules those > - are leverage by platforms. Usually those modules have no dependencies > with > - particular platforms. The module under this scope can provides a common > implementation > - for all platforms, or it may just provide a framework but the differences of > implementation could be configured through the PCDs declared in > AmdPlatformPkg.dec, or > - the board level library provided in the \<Board name\>Pkg. > + AMD platform edk2 package under this folder provides the common edk2 > + modules that are leveraged by platforms. Usually those modules have no > + dependencies with particular platforms. Modules under this scope can > + provide a common implementation for all platforms, or may just > + provide a framework but the differences of implementation could be > + configured through the PCDs declared in AmdPlatformPkg.dec, or the board > level library provided in the \<Board name\>Pkg. > > * **AmdMinBoardPkg** > > - This package provides the common edk2 modules those can be leverage > across AMD boards those use MinPlatformPkg framework. > + This package provides the common edk2 modules that can be leveraged > + across AMD boards using the MinPlatform framework. > > * **\<SoC name\>Board** > > - This is the folder named by SoC and accommodate one or multiple board > packages those > - are designed base on the same SoC platform. <SoC name>Board folder may > contain edk2 > - package meta files directly or the sub-folders named by \<Board name\>Pkg > for a > - variety configurations of a platform. > + This is the folder named by SoC and accommodates one or multiple > + board packages that are designed based on the same SoC platform. <SoC > + name>Board folder may contain edk2 package meta files directly or the > + sub-folders named by \<Board name\>Pkg for a variety configurations of a > platform. > > * **<Board name\>Pkg** > > - This is the folder that contains edk2 package meta files for a board which is > designed base on a platform. Besides the edk2 meta files, <Board name\>Pkg > may also provides > - edk2 modules which are specifically to a board. > + This is the folder that contains edk2 package meta files for a board > + which is designed base on a platform. Besides the edk2 meta files, > + <Board name\>Pkg may also provides edk2 modules which are specifically > to a board. > > ``` > e.g. OverdriveBoard > @@ -63,6 +93,10 @@ booting certain AMD platforms. The definition of sub- > folders is described in bel > > ``` > Platform/AMD > + |----AgesaModulePkg > + |----AgesaPkg > + |----AmdCbsPkg > + |----AmdCpmPkg > |----AmdPlatformPkg > |----AmdMinBoardPkg > |----OverdriveBoard > -- > 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119131): https://edk2.groups.io/g/devel/message/119131 Mute This Topic: https://groups.io/mt/106257080/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md Chang, Abner via groups.io 2024-05-23 7:25 ` Xing, Eric via groups.io @ 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 2024-05-23 8:30 ` Yao, Ken via groups.io 1 sibling, 1 reply; 16+ messages in thread From: Zhai, MingXin (Duke) via groups.io @ 2024-05-23 7:47 UTC (permalink / raw) To: Chang, Abner, devel@edk2.groups.io Cc: Grimes, Paul, Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Yao, Ken, Xing, Eric [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. -----Original Message----- From: Chang, Abner <Abner.Chang@amd.com> Sent: Thursday, May 23, 2024 12:12 PM To: devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin (Duke) <duke.zhai@amd.com> Subject: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md From: Abner Chang <abner.chang@amd.com> Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- Platform/AMD/Readme.md | 64 ++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/Platform/AMD/Readme.md b/Platform/AMD/Readme.md index 99d2b990c7..3297c6ba59 100644 --- a/Platform/AMD/Readme.md +++ b/Platform/AMD/Readme.md @@ -7,18 +7,25 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Term and Definitions +* **AGESA** + + AMD Generic Encapsulated Software Architecture that are executed as + part of a host platform BIOS. + * **AMD Platform** (platform in short) - AMD platform refers to a platform that supports the particular AMD SoC (processor), such as AMD EPYC Milan and Genoa processors. + AMD platform refers to a platform that supports the particular AMD + SoC (processor), such as AMD EPYC Milan and Genoa processors. * **AMD Board** (board in short) AMD board is a generic terminology refers to a board that is designed based on a specific AMD SoC architecture (also referred as AMD platform). More than one boards - are possibly designed to support an AMD platform with different configuration, such as 1-processor socket or 2-processor sockets board. + are possibly designed to support an AMD platform with different + configuration, such as 1-processor socket or 2-processor sockets board. * **AMD edk2 Platform Package** (platform package in short) - + The folder has the AMD edk2 platform common modules. * **AMD edk2 Board Package** (board package in short) @@ -28,29 +35,52 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Package Definition +* **AgesaModulePkg** + + This package contains all of the private interfaces and build + configuration files for the AGESA support. + +* **AgesaPkg** + + This package contains all of the public interfaces and build + configuration files for the AGESA support. + +* **AmdCbsPkg** + + AMD Configurable BIOS Setting. Provides the edk2 formset following + the UEFI HII spec to configure BIOS settings. + +* **AmdCpmPkg** + + AMD Common Platform Module software is a BIOS procedure library + designed to aid AMD customers to quickly implement AMD platform technology into their products. + * **AmdPlatformPkg** - AMD platform edk2 package under this folder provides the common edk2 modules those - are leverage by platforms. Usually those modules have no dependencies with - particular platforms. The module under this scope can provides a common implementation - for all platforms, or it may just provide a framework but the differences of implementation could be configured through the PCDs declared in AmdPlatformPkg.dec, or - the board level library provided in the \<Board name\>Pkg. + AMD platform edk2 package under this folder provides the common edk2 + modules that are leveraged by platforms. Usually those modules have no + dependencies with particular platforms. Modules under this scope can + provide a common implementation for all platforms, or may just + provide a framework but the differences of implementation could be + configured through the PCDs declared in AmdPlatformPkg.dec, or the board level library provided in the \<Board name\>Pkg. * **AmdMinBoardPkg** - This package provides the common edk2 modules those can be leverage across AMD boards those use MinPlatformPkg framework. + This package provides the common edk2 modules that can be leveraged + across AMD boards using the MinPlatform framework. * **\<SoC name\>Board** - This is the folder named by SoC and accommodate one or multiple board packages those - are designed base on the same SoC platform. <SoC name>Board folder may contain edk2 - package meta files directly or the sub-folders named by \<Board name\>Pkg for a - variety configurations of a platform. + This is the folder named by SoC and accommodates one or multiple + board packages that are designed based on the same SoC platform. <SoC + name>Board folder may contain edk2 package meta files directly or the + sub-folders named by \<Board name\>Pkg for a variety configurations of a platform. * **<Board name\>Pkg** - This is the folder that contains edk2 package meta files for a board which is designed base on a platform. Besides the edk2 meta files, <Board name\>Pkg may also provides - edk2 modules which are specifically to a board. + This is the folder that contains edk2 package meta files for a board + which is designed base on a platform. Besides the edk2 meta files, + <Board name\>Pkg may also provides edk2 modules which are specifically to a board. ``` e.g. OverdriveBoard @@ -63,6 +93,10 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ``` Platform/AMD + |----AgesaModulePkg + |----AgesaPkg + |----AmdCbsPkg + |----AmdCpmPkg |----AmdPlatformPkg |----AmdMinBoardPkg |----OverdriveBoard -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119134): https://edk2.groups.io/g/devel/message/119134 Mute This Topic: https://groups.io/mt/106257080/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io @ 2024-05-23 8:30 ` Yao, Ken via groups.io 2024-05-24 4:40 ` Paul via groups.io 0 siblings, 1 reply; 16+ messages in thread From: Yao, Ken via groups.io @ 2024-05-23 8:30 UTC (permalink / raw) To: Zhai, MingXin (Duke), Chang, Abner, devel@edk2.groups.io Cc: Grimes, Paul, Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Xing, Eric [AMD Official Use Only - AMD Internal Distribution Only] [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. Reviewed-by: Ken Yao <Ken.Yao@amd.com> -----Original Message----- From: Zhai, MingXin (Duke) <duke.zhai@amd.com> Sent: Thursday, May 23, 2024 3:47 PM To: Chang, Abner <Abner.Chang@amd.com>; devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com> Subject: RE: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. -----Original Message----- From: Chang, Abner <Abner.Chang@amd.com> Sent: Thursday, May 23, 2024 12:12 PM To: devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin (Duke) <duke.zhai@amd.com> Subject: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md From: Abner Chang <abner.chang@amd.com> Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- Platform/AMD/Readme.md | 64 ++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/Platform/AMD/Readme.md b/Platform/AMD/Readme.md index 99d2b990c7..3297c6ba59 100644 --- a/Platform/AMD/Readme.md +++ b/Platform/AMD/Readme.md @@ -7,18 +7,25 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Term and Definitions +* **AGESA** + + AMD Generic Encapsulated Software Architecture that are executed as + part of a host platform BIOS. + * **AMD Platform** (platform in short) - AMD platform refers to a platform that supports the particular AMD SoC (processor), such as AMD EPYC Milan and Genoa processors. + AMD platform refers to a platform that supports the particular AMD + SoC (processor), such as AMD EPYC Milan and Genoa processors. * **AMD Board** (board in short) AMD board is a generic terminology refers to a board that is designed based on a specific AMD SoC architecture (also referred as AMD platform). More than one boards - are possibly designed to support an AMD platform with different configuration, such as 1-processor socket or 2-processor sockets board. + are possibly designed to support an AMD platform with different + configuration, such as 1-processor socket or 2-processor sockets board. * **AMD edk2 Platform Package** (platform package in short) - + The folder has the AMD edk2 platform common modules. * **AMD edk2 Board Package** (board package in short) @@ -28,29 +35,52 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Package Definition +* **AgesaModulePkg** + + This package contains all of the private interfaces and build + configuration files for the AGESA support. + +* **AgesaPkg** + + This package contains all of the public interfaces and build + configuration files for the AGESA support. + +* **AmdCbsPkg** + + AMD Configurable BIOS Setting. Provides the edk2 formset following + the UEFI HII spec to configure BIOS settings. + +* **AmdCpmPkg** + + AMD Common Platform Module software is a BIOS procedure library + designed to aid AMD customers to quickly implement AMD platform technology into their products. + * **AmdPlatformPkg** - AMD platform edk2 package under this folder provides the common edk2 modules those - are leverage by platforms. Usually those modules have no dependencies with - particular platforms. The module under this scope can provides a common implementation - for all platforms, or it may just provide a framework but the differences of implementation could be configured through the PCDs declared in AmdPlatformPkg.dec, or - the board level library provided in the \<Board name\>Pkg. + AMD platform edk2 package under this folder provides the common edk2 + modules that are leveraged by platforms. Usually those modules have no + dependencies with particular platforms. Modules under this scope can + provide a common implementation for all platforms, or may just + provide a framework but the differences of implementation could be + configured through the PCDs declared in AmdPlatformPkg.dec, or the board level library provided in the \<Board name\>Pkg. * **AmdMinBoardPkg** - This package provides the common edk2 modules those can be leverage across AMD boards those use MinPlatformPkg framework. + This package provides the common edk2 modules that can be leveraged + across AMD boards using the MinPlatform framework. * **\<SoC name\>Board** - This is the folder named by SoC and accommodate one or multiple board packages those - are designed base on the same SoC platform. <SoC name>Board folder may contain edk2 - package meta files directly or the sub-folders named by \<Board name\>Pkg for a - variety configurations of a platform. + This is the folder named by SoC and accommodates one or multiple + board packages that are designed based on the same SoC platform. <SoC + name>Board folder may contain edk2 package meta files directly or the + sub-folders named by \<Board name\>Pkg for a variety configurations of a platform. * **<Board name\>Pkg** - This is the folder that contains edk2 package meta files for a board which is designed base on a platform. Besides the edk2 meta files, <Board name\>Pkg may also provides - edk2 modules which are specifically to a board. + This is the folder that contains edk2 package meta files for a board + which is designed base on a platform. Besides the edk2 meta files, + <Board name\>Pkg may also provides edk2 modules which are specifically to a board. ``` e.g. OverdriveBoard @@ -63,6 +93,10 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ``` Platform/AMD + |----AgesaModulePkg + |----AgesaPkg + |----AmdCbsPkg + |----AmdCpmPkg |----AmdPlatformPkg |----AmdMinBoardPkg |----OverdriveBoard -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119162): https://edk2.groups.io/g/devel/message/119162 Mute This Topic: https://groups.io/mt/106257080/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md 2024-05-23 8:30 ` Yao, Ken via groups.io @ 2024-05-24 4:40 ` Paul via groups.io 2024-05-24 5:02 ` Abdul Lateef Attar via groups.io 0 siblings, 1 reply; 16+ messages in thread From: Paul via groups.io @ 2024-05-24 4:40 UTC (permalink / raw) To: Yao, Ken, Zhai, MingXin (Duke), Chang, Abner, devel@edk2.groups.io Cc: Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Xing, Eric [-- Attachment #1: Type: text/plain, Size: 7668 bytes --] [AMD Official Use Only - AMD Internal Distribution Only] Thanks for the up-stream, Abner. Looks good to me. Reviewed-by: Paul Grimes <paul.grimes@amd.com> ________________________________ From: Yao, Ken <Ken.Yao@amd.com> Sent: Thursday, May 23, 2024 1:30:48 AM To: Zhai, MingXin (Duke) <duke.zhai@amd.com>; Chang, Abner <Abner.Chang@amd.com>; devel@edk2.groups.io <devel@edk2.groups.io> Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Xing, Eric <Eric.Xing@amd.com> Subject: RE: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md [AMD Official Use Only - AMD Internal Distribution Only] [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. Reviewed-by: Ken Yao <Ken.Yao@amd.com> -----Original Message----- From: Zhai, MingXin (Duke) <duke.zhai@amd.com> Sent: Thursday, May 23, 2024 3:47 PM To: Chang, Abner <Abner.Chang@amd.com>; devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com> Subject: RE: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. -----Original Message----- From: Chang, Abner <Abner.Chang@amd.com> Sent: Thursday, May 23, 2024 12:12 PM To: devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin (Duke) <duke.zhai@amd.com> Subject: [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md From: Abner Chang <abner.chang@amd.com> Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- Platform/AMD/Readme.md | 64 ++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/Platform/AMD/Readme.md b/Platform/AMD/Readme.md index 99d2b990c7..3297c6ba59 100644 --- a/Platform/AMD/Readme.md +++ b/Platform/AMD/Readme.md @@ -7,18 +7,25 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Term and Definitions +* **AGESA** + + AMD Generic Encapsulated Software Architecture that are executed as + part of a host platform BIOS. + * **AMD Platform** (platform in short) - AMD platform refers to a platform that supports the particular AMD SoC (processor), such as AMD EPYC Milan and Genoa processors. + AMD platform refers to a platform that supports the particular AMD + SoC (processor), such as AMD EPYC Milan and Genoa processors. * **AMD Board** (board in short) AMD board is a generic terminology refers to a board that is designed based on a specific AMD SoC architecture (also referred as AMD platform). More than one boards - are possibly designed to support an AMD platform with different configuration, such as 1-processor socket or 2-processor sockets board. + are possibly designed to support an AMD platform with different + configuration, such as 1-processor socket or 2-processor sockets board. * **AMD edk2 Platform Package** (platform package in short) - + The folder has the AMD edk2 platform common modules. * **AMD edk2 Board Package** (board package in short) @@ -28,29 +35,52 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ## Package Definition +* **AgesaModulePkg** + + This package contains all of the private interfaces and build + configuration files for the AGESA support. + +* **AgesaPkg** + + This package contains all of the public interfaces and build + configuration files for the AGESA support. + +* **AmdCbsPkg** + + AMD Configurable BIOS Setting. Provides the edk2 formset following + the UEFI HII spec to configure BIOS settings. + +* **AmdCpmPkg** + + AMD Common Platform Module software is a BIOS procedure library + designed to aid AMD customers to quickly implement AMD platform technology into their products. + * **AmdPlatformPkg** - AMD platform edk2 package under this folder provides the common edk2 modules those - are leverage by platforms. Usually those modules have no dependencies with - particular platforms. The module under this scope can provides a common implementation - for all platforms, or it may just provide a framework but the differences of implementation could be configured through the PCDs declared in AmdPlatformPkg.dec, or - the board level library provided in the \<Board name\>Pkg. + AMD platform edk2 package under this folder provides the common edk2 + modules that are leveraged by platforms. Usually those modules have no + dependencies with particular platforms. Modules under this scope can + provide a common implementation for all platforms, or may just + provide a framework but the differences of implementation could be + configured through the PCDs declared in AmdPlatformPkg.dec, or the board level library provided in the \<Board name\>Pkg. * **AmdMinBoardPkg** - This package provides the common edk2 modules those can be leverage across AMD boards those use MinPlatformPkg framework. + This package provides the common edk2 modules that can be leveraged + across AMD boards using the MinPlatform framework. * **\<SoC name\>Board** - This is the folder named by SoC and accommodate one or multiple board packages those - are designed base on the same SoC platform. <SoC name>Board folder may contain edk2 - package meta files directly or the sub-folders named by \<Board name\>Pkg for a - variety configurations of a platform. + This is the folder named by SoC and accommodates one or multiple + board packages that are designed based on the same SoC platform. <SoC + name>Board folder may contain edk2 package meta files directly or the + sub-folders named by \<Board name\>Pkg for a variety configurations of a platform. * **<Board name\>Pkg** - This is the folder that contains edk2 package meta files for a board which is designed base on a platform. Besides the edk2 meta files, <Board name\>Pkg may also provides - edk2 modules which are specifically to a board. + This is the folder that contains edk2 package meta files for a board + which is designed base on a platform. Besides the edk2 meta files, + <Board name\>Pkg may also provides edk2 modules which are specifically to a board. ``` e.g. OverdriveBoard @@ -63,6 +93,10 @@ booting certain AMD platforms. The definition of sub-folders is described in bel ``` Platform/AMD + |----AgesaModulePkg + |----AgesaPkg + |----AmdCbsPkg + |----AmdCpmPkg |----AmdPlatformPkg |----AmdMinBoardPkg |----OverdriveBoard -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119202): https://edk2.groups.io/g/devel/message/119202 Mute This Topic: https://groups.io/mt/106257080/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 11614 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md 2024-05-24 4:40 ` Paul via groups.io @ 2024-05-24 5:02 ` Abdul Lateef Attar via groups.io 0 siblings, 0 replies; 16+ messages in thread From: Abdul Lateef Attar via groups.io @ 2024-05-24 5:02 UTC (permalink / raw) To: Paul, devel [-- Attachment #1: Type: text/plain, Size: 427 bytes --] Reviewed-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119205): https://edk2.groups.io/g/devel/message/119205 Mute This Topic: https://groups.io/mt/106257080/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 845 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages 2024-05-23 4:12 [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Chang, Abner via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md Chang, Abner via groups.io @ 2024-05-23 4:12 ` Chang, Abner via groups.io 2024-05-23 16:27 ` Michael D Kinney 2024-05-23 7:26 ` [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Xing, Eric via groups.io 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 3 siblings, 1 reply; 16+ messages in thread From: Chang, Abner via groups.io @ 2024-05-23 4:12 UTC (permalink / raw) To: devel; +Cc: Leif Lindholm, Michael D Kinney From: Abner Chang <abner.chang@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> --- Maintainers.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index 877620a1b0..af688c3813 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -86,8 +86,20 @@ M: Leif Lindholm <quic_llindhol@quicinc.com> AMD F: Platform/AMD M: Abner Chang <abner.chang@amd.com> -M: Abdul Lateef Attar <abdattar@amd.com> +M: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> +M: Paul Grimes <paul.grimes@amd.com> + +F: Platform/AMD/AgesaModulePkg +F: Platform/AMD/AgesaPkg +F: Platform/AMD/AmdCbsPkg +M: Paul Grimes <paul.grimes@amd.com> +R: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> +R: Abner Chang <abner.chang@amd.com> + +F: Platform/AMD/AmdCpmPkg +M: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> R: Paul Grimes <paul.grimes@amd.com> +R: Abner Chang <abner.chang@amd.com> AMD Seattle F: Platform/AMD/OverdriveBoard/ -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119129): https://edk2.groups.io/g/devel/message/119129 Mute This Topic: https://groups.io/mt/106257081/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages Chang, Abner via groups.io @ 2024-05-23 16:27 ` Michael D Kinney 2024-05-24 2:00 ` Abdul Lateef Attar via groups.io 0 siblings, 1 reply; 16+ messages in thread From: Michael D Kinney @ 2024-05-23 16:27 UTC (permalink / raw) To: abner.chang@amd.com, devel@edk2.groups.io Cc: Leif Lindholm, Kinney, Michael D Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com> > -----Original Message----- > From: abner.chang@amd.com <abner.chang@amd.com> > Sent: Wednesday, May 22, 2024 9:12 PM > To: devel@edk2.groups.io > Cc: Leif Lindholm <quic_llindhol@quicinc.com>; Kinney, Michael D > <michael.d.kinney@intel.com> > Subject: [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries > for AMD packages > > From: Abner Chang <abner.chang@amd.com> > > Signed-off-by: Abner Chang <abner.chang@amd.com> > Cc: Leif Lindholm <quic_llindhol@quicinc.com> > Cc: Michael D Kinney <michael.d.kinney@intel.com> > --- > Maintainers.txt | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > diff --git a/Maintainers.txt b/Maintainers.txt > index 877620a1b0..af688c3813 100644 > --- a/Maintainers.txt > +++ b/Maintainers.txt > @@ -86,8 +86,20 @@ M: Leif Lindholm <quic_llindhol@quicinc.com> > AMD > F: Platform/AMD > M: Abner Chang <abner.chang@amd.com> > -M: Abdul Lateef Attar <abdattar@amd.com> > +M: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> > +M: Paul Grimes <paul.grimes@amd.com> > + > +F: Platform/AMD/AgesaModulePkg > +F: Platform/AMD/AgesaPkg > +F: Platform/AMD/AmdCbsPkg > +M: Paul Grimes <paul.grimes@amd.com> > +R: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> > +R: Abner Chang <abner.chang@amd.com> > + > +F: Platform/AMD/AmdCpmPkg > +M: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> > R: Paul Grimes <paul.grimes@amd.com> > +R: Abner Chang <abner.chang@amd.com> > > AMD Seattle > F: Platform/AMD/OverdriveBoard/ > -- > 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119166): https://edk2.groups.io/g/devel/message/119166 Mute This Topic: https://groups.io/mt/106257081/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages 2024-05-23 16:27 ` Michael D Kinney @ 2024-05-24 2:00 ` Abdul Lateef Attar via groups.io 2024-05-24 4:46 ` Paul via groups.io 0 siblings, 1 reply; 16+ messages in thread From: Abdul Lateef Attar via groups.io @ 2024-05-24 2:00 UTC (permalink / raw) To: devel, michael.d.kinney, abner.chang@amd.com; +Cc: Leif Lindholm [-- Attachment #1: Type: text/plain, Size: 2304 bytes --] Reviewed-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> On 23-05-2024 21:57, Michael D Kinney via groups.io wrote: > Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. > > > Reviewed-by: Michael D Kinney<michael.d.kinney@intel.com> > >> -----Original Message----- >> From:abner.chang@amd.com <abner.chang@amd.com> >> Sent: Wednesday, May 22, 2024 9:12 PM >> To:devel@edk2.groups.io >> Cc: Leif Lindholm<quic_llindhol@quicinc.com>; Kinney, Michael D >> <michael.d.kinney@intel.com> >> Subject: [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries >> for AMD packages >> >> From: Abner Chang<abner.chang@amd.com> >> >> Signed-off-by: Abner Chang<abner.chang@amd.com> >> Cc: Leif Lindholm<quic_llindhol@quicinc.com> >> Cc: Michael D Kinney<michael.d.kinney@intel.com> >> --- >> Maintainers.txt | 14 +++++++++++++- >> 1 file changed, 13 insertions(+), 1 deletion(-) >> >> diff --git a/Maintainers.txt b/Maintainers.txt >> index 877620a1b0..af688c3813 100644 >> --- a/Maintainers.txt >> +++ b/Maintainers.txt >> @@ -86,8 +86,20 @@ M: Leif Lindholm<quic_llindhol@quicinc.com> >> AMD >> F: Platform/AMD >> M: Abner Chang<abner.chang@amd.com> >> -M: Abdul Lateef Attar<abdattar@amd.com> >> +M: Abdul Lateef Attar<AbdulLateef.Attar@amd.com> >> +M: Paul Grimes<paul.grimes@amd.com> >> + >> +F: Platform/AMD/AgesaModulePkg >> +F: Platform/AMD/AgesaPkg >> +F: Platform/AMD/AmdCbsPkg >> +M: Paul Grimes<paul.grimes@amd.com> >> +R: Abdul Lateef Attar<AbdulLateef.Attar@amd.com> >> +R: Abner Chang<abner.chang@amd.com> >> + >> +F: Platform/AMD/AmdCpmPkg >> +M: Abdul Lateef Attar<AbdulLateef.Attar@amd.com> >> R: Paul Grimes<paul.grimes@amd.com> >> +R: Abner Chang<abner.chang@amd.com> >> >> AMD Seattle >> F: Platform/AMD/OverdriveBoard/ >> -- >> 2.37.1.windows.1 > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119171): https://edk2.groups.io/g/devel/message/119171 Mute This Topic: https://groups.io/mt/106257081/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 6367 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages 2024-05-24 2:00 ` Abdul Lateef Attar via groups.io @ 2024-05-24 4:46 ` Paul via groups.io 0 siblings, 0 replies; 16+ messages in thread From: Paul via groups.io @ 2024-05-24 4:46 UTC (permalink / raw) To: devel@edk2.groups.io, Attar, AbdulLateef (Abdul Lateef), michael.d.kinney@intel.com, Chang, Abner Cc: Leif Lindholm [-- Attachment #1: Type: text/plain, Size: 3650 bytes --] [AMD Official Use Only - AMD Internal Distribution Only] Reviewed-by: Paul Grimes <paul.grimes@amd.com<mailto:paul.grimes@amd.com>> ________________________________ From: devel@edk2.groups.io <devel@edk2.groups.io> on behalf of Abdul Lateef Attar via groups.io <AbdulLateef.Attar=amd.com@groups.io> Sent: Thursday, May 23, 2024 7:00:03 PM To: devel@edk2.groups.io <devel@edk2.groups.io>; michael.d.kinney@intel.com <michael.d.kinney@intel.com>; Chang, Abner <Abner.Chang@amd.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Subject: Re: [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. Reviewed-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com><mailto:AbdulLateef.Attar@amd.com> On 23-05-2024 21:57, Michael D Kinney via groups.io wrote: Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com><mailto:michael.d.kinney@intel.com> -----Original Message----- From: abner.chang@amd.com<mailto:abner.chang@amd.com> <abner.chang@amd.com><mailto:abner.chang@amd.com> Sent: Wednesday, May 22, 2024 9:12 PM To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> Cc: Leif Lindholm <quic_llindhol@quicinc.com><mailto:quic_llindhol@quicinc.com>; Kinney, Michael D <michael.d.kinney@intel.com><mailto:michael.d.kinney@intel.com> Subject: [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages From: Abner Chang <abner.chang@amd.com><mailto:abner.chang@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com><mailto:abner.chang@amd.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com><mailto:quic_llindhol@quicinc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com><mailto:michael.d.kinney@intel.com> --- Maintainers.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index 877620a1b0..af688c3813 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -86,8 +86,20 @@ M: Leif Lindholm <quic_llindhol@quicinc.com><mailto:quic_llindhol@quicinc.com> AMD F: Platform/AMD M: Abner Chang <abner.chang@amd.com><mailto:abner.chang@amd.com> -M: Abdul Lateef Attar <abdattar@amd.com><mailto:abdattar@amd.com> +M: Abdul Lateef Attar <AbdulLateef.Attar@amd.com><mailto:AbdulLateef.Attar@amd.com> +M: Paul Grimes <paul.grimes@amd.com><mailto:paul.grimes@amd.com> + +F: Platform/AMD/AgesaModulePkg +F: Platform/AMD/AgesaPkg +F: Platform/AMD/AmdCbsPkg +M: Paul Grimes <paul.grimes@amd.com><mailto:paul.grimes@amd.com> +R: Abdul Lateef Attar <AbdulLateef.Attar@amd.com><mailto:AbdulLateef.Attar@amd.com> +R: Abner Chang <abner.chang@amd.com><mailto:abner.chang@amd.com> + +F: Platform/AMD/AmdCpmPkg +M: Abdul Lateef Attar <AbdulLateef.Attar@amd.com><mailto:AbdulLateef.Attar@amd.com> R: Paul Grimes <paul.grimes@amd.com><mailto:paul.grimes@amd.com> +R: Abner Chang <abner.chang@amd.com><mailto:abner.chang@amd.com> AMD Seattle F: Platform/AMD/OverdriveBoard/ -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119203): https://edk2.groups.io/g/devel/message/119203 Mute This Topic: https://groups.io/mt/106257081/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 8328 bytes --] ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces 2024-05-23 4:12 [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Chang, Abner via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md Chang, Abner via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages Chang, Abner via groups.io @ 2024-05-23 7:26 ` Xing, Eric via groups.io 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 3 siblings, 0 replies; 16+ messages in thread From: Xing, Eric via groups.io @ 2024-05-23 7:26 UTC (permalink / raw) To: Chang, Abner, devel@edk2.groups.io Cc: Grimes, Paul, Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Yao, Ken, Zhai, MingXin (Duke) [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. Reviewed-by: Eric Xing <Eric.Xing@amd.com> > -----Original Message----- > From: Chang, Abner <Abner.Chang@amd.com> > Sent: Thursday, May 23, 2024 12:12 PM > To: devel@edk2.groups.io > Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) > <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, > Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin > (Duke) <duke.zhai@amd.com> > Subject: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross > platform/board interfaces > > From: Abner Chang <abner.chang@amd.com> > > BZ#: 4777 > > Initial commit of AMD cross platform/board generic > encapsulated software architecture. This provides > the basic definitions and protocols for the follow-up > AMD open board project. > > Cc: Paul Grimes <paul.grimes@amd.com> > Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> > Cc: Igniculus Fu <igniculus.fu@amd.com> > Cc: Ken Yao <ken.yao@amd.com> > Cc: Eric Xing <eric.xing@amd.com> > Cc: Duke Zhai <Duke.Zhai@amd.com> > Signed-off-by: Abner Chang <abner.chang@amd.com> > --- > .../AgesaModulePkg/AgesaCommonModulePkg.dec | 39 + > Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec | 18 + > .../AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec | 20 + > .../AMD/AgesaModulePkg/AgesaModuleDfPkg.dec | 25 + > .../AMD/AgesaModulePkg/AgesaModuleFchPkg.dec | 62 + > .../AMD/AgesaModulePkg/AgesaModuleMemPkg.dec | 26 + > .../AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec | 34 + > .../AMD/AgesaModulePkg/AgesaModulePspPkg.dec | 29 + > Platform/AMD/AgesaPkg/AgesaPkg.dec | 435 +++ > Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec | 41 + > .../AgesaEdk2PlatformPkg.inc.dsc | 18 + > .../AgesaSp5RsModulePkg.inc.dsc | 48 + > .../CbsInstanceNull/CbsInstanceNull.inc.dsc | 8 + > .../Genoa/AmdCpmGenoaQuartzPkg.inc.dsc | 11 + > .../AgesaSp5RsModulePkg.dxe.inc.fdf | 11 + > .../AgesaSp5RsModulePkg.pei.inc.fdf | 9 + > .../CbsInstanceNull.dxe.inc.fdf | 7 + > .../CbsInstanceNull.pei.inc.fdf | 7 + > .../0x19/RS/External/CbsStones.dxe.inc.fdf | 8 + > .../0x19/RS/External/CbsStones.pei.inc.fdf | 8 + > .../Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf | 7 + > .../Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf | 10 + > .../Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf | 7 + > .../Library/AmdCalloutLib/AmdCalloutLib.inf | 29 + > .../AmdPspMboxLibV2/AmdPspMboxLibV2.inf | 30 + > .../AmdPspRomArmorLib/AmdPspRomArmorLib.inf | 27 + > .../AmdPspRomArmorLibNull.inf | 26 + > .../Library/ApcbLibV3/ApcbLibV3.inf | 37 + > .../Library/ApcbLibV3Pei/ApcbLibV3Pei.inf | 32 + > .../BaseFabricTopologyRsLib.inf | 28 + > .../CcxTscTimerLib/BaseTscTimerLib.inf | 35 + > .../Library/CcxTscTimerLib/DxeTscTimerLib.inf | 42 + > .../Library/CcxTscTimerLib/PeiTscTimerLib.inf | 37 + > .../PciHostBridgeLib.inf | 42 + > .../DxeAmlGenerationLib/AmlGenerationLib.inf | 47 + > .../Library/FchBaseLib/FchBaseLib.inf | 26 + > .../FchBaseResetSystemLib.inf | 35 + > .../Library/FchEspiCmdLib/FchEspiCmdLib.inf | 33 + > .../Library/NbioHandleLib/NbioHandleLib.inf | 24 + > .../Library/PcieConfigLib/PcieConfigLib.inf | 25 + > .../Library/SmnAccessLib/SmnAccessLib.inf | 33 + > .../Library/CommonDxe/NbioCommonDxeLib.inf | 29 + > .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf | 45 + > .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf | 33 + > .../OemAgesaCcxPlatformLibNull.inf | 27 + > .../PciExpressPciCfg2/PciExpressPciCfg2.inf | 61 + > .../PciExpressPciSegmentInfoLib.inf | 32 + > .../AmdPspFlashAccSpiNorLibSmm.inf | 45 + > .../PspRomArmorWhitelistLib.inf | 32 + > .../Addendum/Oem/OobPprDxe/OobPprDxe.inf | 42 + > .../Dxe/PspPlatformDriver/PspPlatform.inf | 32 + > .../Dxe/ServerHotplugDxe/ServerHotplugDxe.inf | 29 + > .../AmdAutoDynamicCommand.inf | 53 + > .../AmdAutoDynamicCommand/AmdAutoToolApp.inf | 50 + > .../BasePlatformHookLibAmdFchUart.inf | 33 + > Platform/AMD/AgesaModulePkg/Include/AGESA.h | 158 + > Platform/AMD/AgesaModulePkg/Include/AMD.h | 91 + > .../Include/AmdEdk2/CpuRegisters.h | 15 + > .../AgesaModulePkg/Include/AmdPspDirectory.h | 61 + > .../AgesaModulePkg/Include/CpuRegistersDef.h | 156 + > .../Include/FchRegistersCommon.h | 85 + > .../AMD/AgesaModulePkg/Include/Filecode.h | 31 + > Platform/AMD/AgesaModulePkg/Include/Gnb.h | 14 + > Platform/AMD/AgesaModulePkg/Include/GnbDxio.h | 521 ++++ > .../AgesaModulePkg/Include/GnbRegistersRS.h | 18 + > .../Include/GnbRegistersRS/IOHC.h | 22 + > .../Include/Guid/GnbPcieInfoHob.h | 31 + > .../Include/Library/AmdBaseLib.h | 16 + > .../Include/Library/AmdPspMboxLibV2.h | 43 + > .../Include/Library/BaseFabricTopologyLib.h | 22 + > .../Include/Library/FchBaseLib.h | 16 + > .../Include/Library/FchEspiCmdLib.h | 413 +++ > .../Include/Library/GnbPcieConfigLib.h | 16 + > .../Include/Library/NbioCommonLibDxe.h | 37 + > .../Include/Library/NbioHandleLib.h | 62 + > .../Include/Library/PcieConfigLib.h | 283 ++ > .../Include/Library/SmnAccessLib.h | 30 + > .../Protocol/AmdNbioPcieServicesProtocol.h | 47 + > .../Include/Protocol/AmdOemOobPprProtocol.h | 14 + > .../Include/Protocol/FabricNumaServices2.h | 155 + > .../Protocol/FabricTopologyServices2.h | 14 + > .../AMD/AgesaModulePkg/Include/SocLogicalId.h | 23 + > .../Library/DxeAmlGenerationLib/LocalAmlLib.h | 100 + > .../DxeAmlGenerationLib/LocalAmlObjects.h | 150 + > .../AMD/AgesaPkg/Include/AmdPcieComplex.h | 432 +++ > Platform/AMD/AgesaPkg/Include/AmdSoc.h | 17 + > .../Include/FabricResourceManagerCmn.h | 42 + > .../AgesaPkg/Include/Guid/AmdMemoryInfoHob.h | 96 + > .../Include/Library/AmdPspBaseLibV2.h | 51 + > .../AgesaPkg/Include/Library/AmdPspFtpmLib.h | 83 + > .../Include/Library/AmdPspRomArmorLib.h | 231 ++ > .../Include/Library/AmlGenerationLib.h | 2722 +++++++++++++++++ > .../Library/PlatformPspRomArmorWhitelistLib.h | 25 + > .../AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h | 134 + > .../Include/Protocol/AmdCxlServicesProtocol.h | 183 ++ > .../Protocol/AmdPciResourcesProtocol.h | 110 + > .../Include/Protocol/AmdPspFtpmProtocol.h | 187 ++ > .../FabricResourceManagerServicesProtocol.h | 14 + > Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h | 19 + > Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h | 78 + > Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h | 17 + > .../AMD/AmdCpmPkg/Include/AmdCpmFunction.h | 32 + > .../AmdCpmTableProtocol/AmdCpmTableProtocol.h | 39 + > .../Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c | 31 + > .../AmdPspRomArmorLib/AmdPspRomArmorLib.c | 12 + > .../AmdPspRomArmorLibNull.c | 79 + > .../Library/ApcbLibV3/ApcbLibV3.c | 12 + > .../Library/ApcbLibV3Pei/ApcbLibV3Pei.c | 14 + > .../BaseFabricTopologyRsLib.c | 37 + > .../Library/CcxTscTimerLib/BaseTscTimerLib.c | 8 + > .../Library/CcxTscTimerLib/DxeTscTimerLib.c | 35 + > .../Library/CcxTscTimerLib/PeiTscTimerLib.c | 11 + > .../Library/CcxTscTimerLib/TscTimerLibShare.c | 103 + > .../DxeAmdPciHostBridgeLib/PciHostBridgeLib.c | 95 + > .../DxeAmlGenerationLib/AmlArgObjects.c | 154 + > .../DxeAmlGenerationLib/AmlAssistFunctions.c | 151 + > .../DxeAmlGenerationLib/AmlDataObjects.c | 640 ++++ > .../AmlExpressionOpcodes.c | 1294 ++++++++ > .../DxeAmlGenerationLib/AmlLocalObjects.c | 158 + > .../DxeAmlGenerationLib/AmlNameString.c | 576 ++++ > .../DxeAmlGenerationLib/AmlNamedObject.c | 2138 +++++++++++++ > .../AmlNamespaceModifierObjects.c | 360 +++ > .../DxeAmlGenerationLib/AmlObjectsDebug.c | 144 + > .../DxeAmlGenerationLib/AmlPkgLength.c | 267 ++ > .../AmlResourceDescriptor.c | 1989 ++++++++++++ > .../DxeAmlGenerationLib/AmlStatementOpcodes.c | 515 ++++ > .../Library/DxeAmlGenerationLib/AmlTable.c | 213 ++ > .../DxeAmlGenerationLib/LocalAmlObjects.c | 364 +++ > .../Library/FchBaseLib/FchStallLib.c | 13 + > .../FchBaseResetSystemLib.c | 90 + > .../Library/FchEspiCmdLib/FchEspiCmdLib.c | 87 + > .../Library/NbioHandleLib/NbioHandleLib.c | 68 + > .../Library/PcieConfigLib/PcieConfigLib.c | 276 ++ > .../PcieConfigLib/PcieInputParserLib.c | 117 + > .../Library/SmnAccessLib/SmnAccessLib.c | 10 + > .../Nbio/Library/CommonDxe/DxeLibFunctions.c | 42 + > .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c | 23 + > .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c | 29 + > .../OemAgesaCcxPlatformLibNull.c | 39 + > .../PciExpressPciCfg2/PciExpressPciCfg2.c | 33 + > .../PciSegmentInfoLib.c | 30 + > .../AmdPspFlashAccSpiNorLibSmm.c | 15 + > .../PspRomArmorWhitelistLib.c | 12 + > .../Addendum/Oem/OobPprDxe/OobPprDxe.c | 36 + > .../Dxe/PspPlatformDriver/PspPlatformDriver.c | 20 + > .../Dxe/ServerHotplugDxe/ServerHotplugDxe.c | 22 + > .../AmdAutoDynamicCommand.c | 44 + > .../AmdAutoDynamicCommand/AmdAutoToolApp.c | 36 + > .../BasePlatformHookLibAmdFchUart.c | 29 + > .../FchSongshanDxe/FchSongshanI2C_I3C.asl | 9 + > .../AMD/AgesaPkg/Include/AmdUefiStackNasm.inc | 13 + > .../Library/RiscVOpensbiLib/opensbi | 2 +- > 152 files changed, 19669 insertions(+), 1 deletion(-) > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec > create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec > create mode 100755 > Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec > create mode 100755 > Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec > create mode 100755 > Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec > create mode 100644 Platform/AMD/AgesaPkg/AgesaPkg.dec > create mode 100755 Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc > create mode 100644 > Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Amd > CpmGenoaQuartzPkg.inc.dsc > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf > create mode 100644 > Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf > create mode 100644 > Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.f > df > create mode 100644 > Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.f > df > create mode 100644 > Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.i > nc.fdf > create mode 100644 > Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.in > c.fdf > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Amd > CpmGenoaQuartzPkg.dxe.inc.fdf > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Amd > CpmGenoaQuartzPkg.fdf > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Amd > CpmGenoaQuartzPkg.pei.inc.fdf > create mode 100755 > Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLi > bV2.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRom > ArmorLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspR > omArmorLibNull.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabri > cTopologyRsLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBri > dgeLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerati > onLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseRes > etSystemLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf > create mode 100755 > Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf > create mode 100755 > Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDx > eLib.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf > create mode 100644 > Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf > create mode 100755 > Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oem > AgesaCcxPlatformLibNull.inf > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpr > essPciCfg2.inf > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfo > Lib/PciExpressPciSegmentInfoLib.inf > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/Am > dPspFlashAccSpiNorLibSmm.inf > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRom > ArmorWhitelistLib.inf > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver > /PspPlatform.inf > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe > /ServerHotplugDxe.inf > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDy > namicCommand.inf > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoTo > olApp.inf > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFc > hUart/BasePlatformHookLibAmdFchUart.inf > create mode 100644 Platform/AMD/AgesaModulePkg/Include/AGESA.h > create mode 100755 Platform/AMD/AgesaModulePkg/Include/AMD.h > create mode 100755 > Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h > create mode 100755 > Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h > create mode 100644 Platform/AMD/AgesaModulePkg/Include/Filecode.h > create mode 100755 Platform/AMD/AgesaModulePkg/Include/Gnb.h > create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbDxio.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h > create mode 100755 > Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h > create mode 100755 > Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProt > ocol.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol. > h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h > create mode 100755 > Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib. > h > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObj > ects.h > create mode 100755 Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h > create mode 100644 Platform/AMD/AgesaPkg/Include/AmdSoc.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib. > h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h > create mode 100644 > Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesP > rotocol.h > create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h > create mode 100644 > Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h > create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h > create mode 100644 > Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCp > mTableProtocol.h > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLi > bV2.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRom > ArmorLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspR > omArmorLibNull.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabri > cTopologyRsLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBri > dgeLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjec > ts.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFun > ctions.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObje > cts.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressio > nOpcodes.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObj > ects.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameStri > ng.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedO > bject.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespa > ceModifierObjects.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsD > ebug.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLengt > h.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResource > Descriptor.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatemen > tOpcodes.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObj > ects.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseRes > etSystemLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c > create mode 100755 > Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c > create mode 100755 > Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c > create mode 100755 > Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions. > c > create mode 100644 > Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oem > AgesaCcxPlatformLibNull.c > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpr > essPciCfg2.c > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfo > Lib/PciSegmentInfoLib.c > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/Am > dPspFlashAccSpiNorLibSmm.c > create mode 100644 > Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRom > ArmorWhitelistLib.c > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver > /PspPlatformDriver.c > create mode 100644 > Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe > /ServerHotplugDxe.c > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDy > namicCommand.c > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoTo > olApp.c > create mode 100644 > Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFc > hUart/BasePlatformHookLibAmdFchUart.c > create mode 100644 > Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongsha > nI2C_I3C.asl > create mode 100644 > Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc > > diff --git a/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec > new file mode 100644 > index 0000000000..d35a1f27b4 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec > @@ -0,0 +1,39 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) Common > Module Package DEC > +# file. > +# This file provides the minimum AMD SoC/Mircoporcessor definitions for > building > +# AMD edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaCommonPkg > + PACKAGE_GUID = 6CBE6566-0D3F-4E35-8358-9602354E9F09 > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include > + > +[Guids] > + gEfiAmdAgesaModulePkgTokenSpaceGuid = {0x7788adf0, 0x9788, > 0x4a3f, {0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd}} > + gAgesaConfigDbPointerVariableGuid = {0x21229d24, 0xc71d, 0x4bc0, > {0xb6, 0x3e, 0x67, 0x2f, 0x6d, 0xbf, 0x5f, 0xf7}} > + gAmdMemoryInfoHobGuid = {0x1bce3d14, 0xa5fe, 0x4a0b, > {0x9a, 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}} > + > +[Protocols] > + ## Soc Protocols > + gAmdSocLogicalIdProtocolGuid = {0x72f8e409, 0x0d2a, 0x4b91, > {0x88, 0x6f, 0xba, 0x13, 0x44, 0x9f, 0xd7, 0x78}} > + gAmdOemOobPprDxeProtocolGuid = {0x78031be3, 0x54a2, 0x4819, > {0xb5, 0xba, 0x32, 0x79, 0x04, 0xf3, 0xa8, 0x41}} > + > +[PcdsFixedAtBuild] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxSocketSupported > V2|2|UINT8|0x00002002 # 2 by default > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDiePerSocketV2| > 1|UINT8|0x00002003 # 1 by default > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxChannelPerDieV2 > |8|UINT8|0x00002004 # 8 by default > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDimmPerChannel > V2|2|UINT8|0x00002005 # 2 by default > + > +[PcdsDynamic] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdS3LibTableSize|0x4000|UI > NT64|0x00027003 > + > diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec > new file mode 100644 > index 0000000000..1637068432 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec > @@ -0,0 +1,18 @@ > +## @file > +# > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaEdk2Pkg > + PACKAGE_GUID = E866104F-D458-41B1-AB26-FA5951618A8C > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include/AmdEdk2 > + > + > diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec > new file mode 100755 > index 0000000000..b84fe5b738 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec > @@ -0,0 +1,20 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module > Package DEC > +# file. > +# This file provides the minimum AMD Core Complex package definitions for > building AMD > +# edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaCcxPkg > + PACKAGE_GUID = df325429-029e-40f0-82db-0e69be7f6560 > + PACKAGE_VERSION = 0.1 > + > +[PcdsDynamic] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdCcxSingleBitErrLogging|FA > LSE|BOOLEAN|0x000CC029 > diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec > new file mode 100755 > index 0000000000..57db15e663 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec > @@ -0,0 +1,25 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module > Package DEC > +# file. > +# This file provides the minimum AMD Data Fabric package definitions for > building AMD > +# edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaDfPkg > + PACKAGE_GUID = 81e51ee3-c347-4563-92fe-790ba953bf0f > + PACKAGE_VERSION = 0.1 > + > +[Guids] > + gAmdTotalNumberOfRootBridgesGuid = {0xfb5703f5, 0xf8a7, 0xf401, > {0x18, 0xb4, 0x3f, 0x10, 0x8d, 0xeb, 0x26, 0x12}} > + gAmdResourceSizeForEachRbGuid = {0x542b8f2f, 0xbd52, 0x4233, > {0x8c, 0x3d, 0x66, 0x53, 0x0d, 0xe8, 0xa3, 0x69}} > + > +[Protocols] > + gAmdFabricNumaServices2ProtocolGuid = {0xa8ff2e64, 0xf319, 0x4af1, > {0x9e, 0xc8, 0x18, 0x89, 0x89, 0xc3, 0x1e, 0x4a}} > + > diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec > new file mode 100644 > index 0000000000..521957e809 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec > @@ -0,0 +1,62 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module > Package DEC > +# file. > +# This file provides the minimum AMD Fusion Control Hub package > definitions for building AMD > +# edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 1.5 > + PACKAGE_NAME = AgesaFchPkg > + PACKAGE_GUID = e47c8ed9-3000-4e6e-b1c6-875b365b3849 > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include > + > +[Guids] > + gEfiAmdAgesaModulePkgTokenSpaceGuid = { 0x7788adf0, 0x9788, 0x4a3f, > { 0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd } } > + > +[Protocols] > + gFchInitDonePolicyProtocolGuid = { 0xc63c0c73, 0xf612, 0x4c02, { 0x84, > 0xa3, 0xc6, 0x40, 0xad, 0x0b, 0xa6, 0x22 } } > + > +[PcdsDynamic] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLegacyFree|FALSE|BOOLEAN| > 0x0003F001 > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetEnable|TRUE|BOOLEAN|0 > x0003F002 > + > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetMsiDis|TRUE|BOOLEAN|0 > x0003F003 > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdResetMode|0x00|UINT8|0x00 > 03F00D > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdNoneSioKbcSupport|FALSE|BO > OLEAN|0x0003F021 > + > + ### @brief This item allows the customer to change OC signal polarity to be > active low. This is universal and applies to all OC pins. > + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE)At present, > this control applies to Family17h Model 00h-2Fh. > + ### @li TRUE - OC pin is low when OC occurs. > + ### @li FALSE - OC pin is high when OC occurs. > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciOcPolarityCfgLow|FALSE|B > OOLEAN|0x0003F309 > + > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb20OcPinSelect|0xFFFFF > FFFFFFFFFFF|UINT64|0x0003F340 > + #Die 0 > + #[7:0] SSP -- 2 USB 2.0 > ports on XHCI controller 0 > + #[15:8] SSP -- 2 USB 2.0 > ports on XHCI controller 1 > + #[23:0] MTS -- 6 USB > 2.0 ports on XHCI controller 0 > + #Die 1 > + #[39:32] SSP -- 2 USB > 2.0 ports on XHCI controller 0 > + #[47:40] SSP -- 2 USB > 2.0 ports on XHCI controller 1 > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb31OcPinSelect|0xFFFFF > FFF|UINT32|0x0003F341 > + #Die 0 > + #[7:0] SSP -- 2 USB 3.1 > ports on XHCI controller 0 > + #[15:8] SSP -- 2 USB 3.1 > ports on XHCI controller 1 > + #[15:0] MTS -- 4 USB > 3.1 ports on XHCI controller 0 > + #Die 1 > + #[23:16] SSP -- 2 USB > 3.1 ports on XHCI controller 0 > + #[31:24] SSP -- 2 USB > 3.1 ports on XHCI controller 1 > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLpcEnable|TRUE|BOOLEAN|0x > 0003F400 > + > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdUsbRSOemConfigurationTable|{ > 0x0}|VOID*|0x0003F40A > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciSsid|0x00000000|UINT32| > 0x0003FF07 > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.FchRTDeviceEnableMap|0x000000 > 00|UINT32|0x0003FF81 > diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec > new file mode 100644 > index 0000000000..721d3ea73b > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec > @@ -0,0 +1,26 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module > Package DEC > +# file. > +# This file provides the minimum AMD Memory package definitions for > building AMD > +# edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaMemPkg > + PACKAGE_GUID = 445f7303-3171-428c-ad0b-32df4474a7ad > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include/ > + > +[PcdsFixedAtBuild] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageR > epairEntries|64|UINT32|0x00029001 > + > + > + > diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec > new file mode 100755 > index 0000000000..0501774c9b > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec > @@ -0,0 +1,34 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module > Package DEC > +# file. > +# This file provides the minimum AMD North Bridge I/O package definitions > for building AMD > +# edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaNbioPkg > + PACKAGE_GUID = 1486f0fe-39ee-4856-a39f-222ff2404f26 > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include > + > +[Protocols] > + gAmdNbioPcieServicesProtocolGuid = {0x756db75c, 0xbb9d, 0x4289, > {0x81, 0x3a, 0xdf, 0x21, 0x5, 0xc4, 0xf8, 0xe}} > + > +[PcdsFixedAtBuild] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIommuMMIOAddressReserv > edEnable|FALSE|BOOLEAN|0x00021100 #///< 1: Enable Iommu MMIO > reserved from GNB driver. 0:Disable > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicMMIOAddressReserv > edEnable|FALSE|BOOLEAN|0x00021101 #///< 1: Enable Ioapic MMIO > reserved from GNB driver. 0:Disable > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdPreDefineEn|FALSE > |BOOLEAN|0x00021102 #///< TRUE: Enable assign IOAPIC ID at PEI > phase > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdBase|0xF1|UINT8|0 > x00021103 #///< Base NBIO IOAPIC ID. ID assigned start from this > value > + > +[PcdsDynamic] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgGnbIoapicId|0|UINT8|0x00 > 04101D > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgFchIoapicId|0|UINT8|0x000 > 4101E > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdSmuFeatureControlDefinesExt| > 0x0|UINT32|0x00041200 > diff --git a/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec > b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec > new file mode 100644 > index 0000000000..41cf320c76 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec > @@ -0,0 +1,29 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module > Package DEC > +# file. > +# This file provides the minimum AMD Platform Security Processor package > definitions > +# for building AMD edk2 modules. > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaPspPkg > + PACKAGE_GUID = 5c48f900-a98c-431f-8be5-19c09c65bb05 > + PACKAGE_VERSION = 0.1 > + > +[Guids] > + gApSyncFlagNvVariableGuid = { 0xad3f6761, 0xf0a3, 0x46c8, { 0xa4, 0xcb, > 0x19, 0xb7, 0x0f, 0xfd, 0xb3, 0x05 } } > + gAmdPspApobHobGuid = { 0x30b174f3, 0x7712, 0x4cca, { 0xbd, 0x13, > 0xd0, 0xb8, 0xa8, 0x80, 0x19, 0x97 } } > + > +[Protocols] > + gPspFlashAccSmmCommReadyProtocolGuid = { 0x9f373486, 0xda76, 0x4c9f, > { 0x81, 0x55, 0x6c, 0xcd, 0xdb, 0x0b, 0x0b, 0x04 } } > + gAmdPspFtpmProtocolGuid = { 0xac234e04, 0xb036, 0x476c, { 0x91, > 0x66, 0xbe, 0x47, 0x52, 0xa0, 0x95, 0x09 } } > + > +[Ppis] > + gAmdPspFtpmPpiGuid = { 0x91774185, 0xf72d, 0x467e, { 0x93, > 0x39, 0xe0, 0x08, 0xdb, 0xae, 0x0e, 0x14 } } > + gAmdPspFtpmFactoryResetPpiGuid = { 0x9c98130a, 0x8921, 0x45eb, > { 0x86, 0xf3, 0x16, 0x04, 0x35, 0xc7, 0xc6, 0x40 } } > diff --git a/Platform/AMD/AgesaPkg/AgesaPkg.dec > b/Platform/AMD/AgesaPkg/AgesaPkg.dec > new file mode 100644 > index 0000000000..9377c64cc3 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/AgesaPkg.dec > @@ -0,0 +1,435 @@ > +## @file > +# AMD Generic Encapsulated Software Architecture (AGESA) Package DEC > +# file. > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = AgesaPkg > + PACKAGE_GUID = DABFEFC6-5A79-444b-862A-1F6FE9F561FE > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include > + > +[Guids] > + gEfiAmdAgesaPkgTokenSpaceGuid = { 0xd4d8435f, 0xfffb, 0x4acb, { 0xa0, > 0x4d, 0xff, 0x0f, 0xad, 0x67, 0x7f, 0xe9 } } > + > +[Protocols] > + gAmdNbioCxlServicesProtocolGuid = {0x125CCFCE, 0x34AF, 0x422C, > {0xB3, 0xB3, 0x71, 0x23, 0xA3, 0x1E, 0xC8, 0x61}} > + gAmdPciResourceProtocolGuid = {0x663d4897, 0xed94, 0x4f0f, > {0x86, 0x64, 0xfe, 0xdc, 0x70, 0x30, 0x7f, 0x19}} > + gAmdCapsuleSmmHookProtocolGuid = {0x4fc43bbe, 0x1433, 0x4951, > {0xac, 0x2d, 0x0d, 0x01, 0xfe, 0xc0, 0x0e, 0xb1}} > + gAmdFspSetupTableInitDoneGuid = {0xef5394c6, 0x566d, 0x440f, > {0x9d, 0x05, 0xc0, 0xa3, 0x2c, 0xb9, 0x33, 0x58}} > + > +[Ppis] > + gAmdMemoryInfoHobPpiGuid = {0xba16e587, 0x1d66, 0x41b7, > {0x9b, 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}} > + gCapsuleUpdateDetectedPpiGuid = {0x745dfc73, 0xc401, 0x4ced, > {0x8d, 0x3b, 0x1a, 0x82, 0xf3, 0xda, 0xdc, 0xf8}} > + > +[PcdsFixedAtBuild] > + > + ### @brief Enable EDK-II Protocols > + ### @details This item enables support for EDKII implementation of ACPI > Protocols when set to TRUE > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdCompliantEdkIIAcpiSdtProtocol|TRUE|B > OOLEAN|0x00020006 > + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize > |0x1000|UINT32|0x00020007 > + > + ### @brief assign non volatile storage base address > + ### @details This assigns the base address to map to flash deivce. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress|0xFF0000 > 00|UINT32|0x00020017 > + > +#---------------------------------------------------------------------------- > +#- FCH Fixed PCDs > +#- > +### Set Doxy_path: "PCD-FCH.h" > +#---------------------------------------------------------------------------- > + > + ### @name General FCH Controls > + > + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1 > register blocks as defined by ACPI spec. > + ### @brief Permitted Choices: (Type: Value)(Default: 0x0400) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1EvtBlkAddr|0x400 > |UINT16|0x0002F004 > + > + ### @brief Allows the host BIOS to specify the IO address for the ACPI > PM1Cnt register blocks as defined by ACPI spec. > + ### @brief Permitted Choices: (Type: Value)(Default: 0x0404) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1CntBlkAddr|0x404 > |UINT16|0x0002F005 > + > + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM > Timer as defined by ACPI spec. > + ### @brief Permitted Choices: (Type: Value)(Default: 0x0408) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPmTmrBlkAddr|0x408| > UINT16|0x0002F006 > + > + ### @brief Allows the host BIOS to specify the IO address for the ACPI CPU > Control block as defined by ACPI spec. > + ### @brief Permitted Choices: (Type: Value)(Default: 0x0410) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgCpuControlBlkAddr|0x410| > UINT16|0x0002F007 > + > + ### @brief Allows the host BIOS to specify the IO address for the ACPI > GPE0 register block as defined by ACPI spec. > + ### @brief Permitted Choices: (Type: Value)(Default: 0x0420) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiGpe0BlkAddr|0x420|U > INT16|0x0002F008 > + > + ### @brief This item defines the SMI command value sent by the host BIOS > during the S3 resume sequence, to re-initialize the > + ### FCH registers. This must be issued before the platform driver restore > function is started. > + ### @brief Permitted Choices: (Type: Value)(Default: 0xD3) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemBeforePciRestoreSwSmi|0xD3 > |UINT8|0x0002F010 > + > + ### @brief This item defines the SMI command used by the host BIOS to > signal the FCH driver that the platform driver has > + ### completed its restore function. This allows the FCH driver to perform > some final FCH settings. > + ### @brief Permitted Choices: (Type: Value)(Default: 0xD4) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemAfterPciRestoreSwSmi|0xD4|U > INT8|0x0002F011 > + > + ### @brief Allows the host BIOS to set the SMI command value used by the > OS to activate ACPI mode. > + ### @brief Permitted Choices: (Type: Value)(Default: 0xA0) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemEnableAcpiSwSmi|0xA0|UINT8 > |0x0002F012 > + > + ### @brief Allows the host BIOS to set the SMI command value used by the > OS to turn off ACPI mode. > + ### @brief Permitted Choices: (Type: Value)(Default: 0xA1) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemDisableAcpiSwSmi|0xA1|UINT > 8|0x0002F013 > + > + ### @brief SMI command used for releasing the SPI controller lock mode. > All devices on the SPI bus will be writable. > + ### @brief Permitted Choices: (Type: Value)(Default: 0xAA) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiUnlockSwSmi|0xAA|UINT8| > 0x0002F014 > + > + ### @brief SMI command for setting the lock mode in the SPI controller. > This will effectively provide a write protection to the > + ### SPI Flash ROM; however, write access to secondary SPI devices will also > be blocked. > + ### @brief Permitted Choices: (Type: Value)(Default: 0xAB) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiLockSwSmi|0xAB|UINT8|0x > 0002F015 > +#---------------------------------------------------------------------------- > +#- FCH Fixed PCDs > +#- > +### Set Doxy_path: "PCD-FCH-IRQ.h" > +#---------------------------------------------------------------------------- > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart0Irq|0x03|UINT8|0x0002F01A > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart1Irq|0x0E|UINT8|0x0002F01B > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart2Irq|0x05|UINT8|0x0002F01C > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart3Irq|0x0F|UINT8|0x0002F01D > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart4Irq|0x10|UINT8|0x0002F01E > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c0Irq|0x0A|UINT8|0x0002F01F > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c1Irq|0x0B|UINT8|0x0002F020 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c2Irq|0x04|UINT8|0x0002F021 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c3Irq|0x06|UINT8|0x0002F022 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c4Irq|0x16|UINT8|0x0002F023 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c5Irq|0x17|UINT8|0x0002F024 > +#- DF Fixed PCDs > +#- > +### Set Doxy_path: "PCD-DF.h" > +#---------------------------------------------------------------------------- > + > + #Fabric > + > + ### @name General DF Controls > + > + ### @brief This item informs the SMBios generation code as to how many > physical processor sockets exist in the system and > + ### therefore how many Type 4 SMBios records to produce. > + ### @brief Permitted Choices: (Type: Value)(Default: 0x01) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdNumberOfPhysicalSocket|1|UINT8 > |0x000CC103 > +#---------------------------------------------------------------------------- > +#- CCX Fixed PCDs > +#- > +### Set Doxy_path: "PCD-CCX-MTRR.h" > +#---------------------------------------------------------------------------- > + > + > + ### @brief The base address of temporary page table for accessing PCIE > MMIO base address above 4G in PEI phase. > + ### @brief Permitted Choices: 0x0 - 0xFFFFFFFF (Type: Value)(Default: 0) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPeiTempPageTableBaseAddress|0 > |UINT32|0x000CC11B > + > +#---------------------------------------------------------------------------- > +#- CCX ACPI Fixed PCDs > +#- > +### Set Doxy_path: "PCD-CCX-ACPI.h" > +#---------------------------------------------------------------------------- > + #ACPI > + # Cpu SSDT > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName > 0|0x43|UINT8|0x000AC001 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName > 1|0x30|UINT8|0x000AC002 > + ### @brief This element specifies whether the ACPI _PSS objects are > defined in the system bus or processor scope. > + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) > + ### @li TRUE - The objects will be under the \_SB scope. > + ### @li FALSE - The objects will be under the \_PR scope > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeInSb| > FALSE|BOOLEAN|0x000AC003 > + > + ### @brief Set the OEM ID field in ACPI table outputs to this string. The > string must conform to the ACPI rules for the OEM ID field. > + ### @brief Permitted Choices: (Type: Value)(Default: "AMD") > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiTableHeaderOemId|"AMD"|V > OID*|0x000AC004 > + > +#---------------------------------------------------------------------------- > +#- CCX SMBIOS Fixed PCDs > +#- > +### Set Doxy_path: "PCD-CCX-SMBIOS.h" > +#---------------------------------------------------------------------------- > + > + ### @name CCX SMBIOS Controls > + > + ### @brief When creating the SMBios table entry, use this as the label for > the processor socket. This should match the > + ### silkscreen label on the motherboard. > + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket0| > "Unknown"|VOID*|0x00001001 > + > + ### @brief When creating the SMBios table entry, use this as the value for > the 'serial number' field for each processor. > + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket0|"Unk > nown"|VOID*|0x00001002 > + > + > + ### @brief When creating the SMBios table entry, use this as the value for > the 'Asset Tag' field for each processor. > + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket0|"Unknow > n"|VOID*|0x00001003 > + > + ### @brief When creating the SMBios table entry, use this as the value for > the 'Part Number' field for each processor. > + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket0|"Unkn > own"|VOID*|0x00001004 > + > + ### @brief SMBios socket 1 Label. > + ### @details When creating the SMBios table entry, use this as the label > for the > + ### processor socket. This should match the silkscreen label on the > motherboard. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket1| > "Unknown"|VOID*|0x00001005 > + > + ### @brief SMBIOS socket 1 Serial Number. > + ### @details When creating the SMBios table entry, use this as the value > for > + ### the 'serial number' field for the processor in socket 1. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket1|"Unk > nown"|VOID*|0x00001006 > + > + ### @brief SMBios socket 1 Asset Tag. > + ### @details When creating the SMBios table entry, use this as the value > for > + ### the 'Asset Tag' field for the processor in socket 1. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket1|"Unknow > n"|VOID*|0x00001007 > + > + ### @brief Socket 1 Part Number. > + ### @details When creating the SMBios table entry, use this as the value > for > + ### the 'Part Number' field for the processor in socket 1. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket1|"Unkn > own"|VOID*|0x00001008 > + > +#---------------------------------------------------------------------------- > +#- ACPI Fixed PCDs > +#- > +### Set Doxy_path: "PCD-ACPI.h" > +#---------------------------------------------------------------------------- > + > + ### @name General ACPI Controls > + > + ### @brief PCD supporting maximum capacity for Type 16 table > + ### @details This PCD represents maximum memory capacity in KB > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT16MaximumCapacity|0x0 > 4000000|UINT32|0x00001009 # 4G - 0x00400000 > + # 8G - 0x00800000 > + # 16G - 0x01000000 > + # 32G - 0x02000000 > + # 64G - 0x04000000 > + # 128G - 0x08000000 > + # 256G - 0x10000000 > + # 512G - 0x20000000 > +[PcdsDynamic] > +#---------------------------------------------------------------------------- > +# System level Dynamic PCDs > +### Set Doxy_path: "PCD-Sys.h" > +#---------------------------------------------------------------------------- > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCStateIoBaseAddress|0x413|UINT > 16|0x000CC002 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdt|TRUE|BOOLEAN|0x0 > 00CC00B > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdApicMode|0xFF|UINT8|0x000CC0 > 1D > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCpuWdtEn|TRUE|BOOLEAN|0x00 > 0CC200 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerIn > Sb|FALSE|BOOLEAN|0x000CC50B > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerNa > me|"PLTF"|VOID*|0x000CC50C > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCcxCfgPFEHEnable|FALSE|BOOLEA > N|0x000CC601 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT4CpuMaxSpeed|0|UINT16 > |0x000CC900 > +#---------------------------------------------------------------------------- > +#- DF Dynamic PCDs > +### Set Doxy_path: "PCD-DF.h" > +#---------------------------------------------------------------------------- > + > + > + ### @cond (FF3||RN||BA||ZP||RMB||RPL||RS||SSP||MI3||BRH) > + ### @brief Specifies the top address to be used for MMIO space > allocations. No MMIO space will be used above this limit. Some devices have > limits on the address space they > + ### are able to access. For example a device with a 40-bit address > limitation can not use MMIO space above 1TeraByte (1T). By setting this PCD > to 0x10000000000 (1T), MMIO > + ### space would not be allocated above 1T. The default is to use all of the > space above the end of physical memory. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMmioAbove4GLimit|0xFFFFFFFFFF > FFFFFF|UINT64|0x0003FFC2 > + ### @endcond > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFabricResourceDefaultSizePtr|0|U > INT64|0x00DF0000 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgSmiCmdPortAddr|0xB0|UIN > T16|0x0003FFC0 > + > + ### I2C-0 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c0SdaHold|0x00000035|UIN > T32|0x000FC000 > + ### I2C-1 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c1SdaHold|0x00000035|UIN > T32|0x000FC001 > + ### I2C-2 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c2SdaHold|0x00000035|UIN > T32|0x000FC002 > + ### I2C-3 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c3SdaHold|0x00000035|UIN > T32|0x000FC003 > + ### I2C-4 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c4SdaHold|0x00000035|UIN > T32|0x000FC004 > + ### I2C-5 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c5SdaHold|0x00000035|UIN > T32|0x000FC005 > + ### @} end of I2C hold times > + > +#---------------------------------------------------------------------------- > +#- FCH Dynamic PCDs > +### Set Doxy_path: "PCD-FCH-UART.h" > +#---------------------------------------------------------------------------- > + ### @name UART Legacy IO Assignments > + ### @{ > + ### @brief These controls allow the platform to specify the legacy IO > ranges that are to be used by the UART ports in the processor. Permitted > Choices: (Type: value)(Default: Disabled) > + ### @li 0 - Disabled > + ### @li 1 - IO range 0x02E8 - 0x02EF > + ### @li 2 - IO range 0x02F8 - 0x02FF > + ### @li 3 - IO range 0x03E8 - 0x03EF > + ### @li 4 - IO range 0x03F8 - 0x03FF > + > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.FchUart0LegacyEnable|0x00|UINT8|0x000 > FC010 > + > gEfiAmdAgesaPkgTokenSpaceGuid.FchUart1LegacyEnable|0x00|UINT8|0x000 > FC011 > + > gEfiAmdAgesaPkgTokenSpaceGuid.FchUart2LegacyEnable|0x00|UINT8|0x000 > FC012 > + > gEfiAmdAgesaPkgTokenSpaceGuid.FchUart3LegacyEnable|0x00|UINT8|0x000 > FC013 > + ### @} end UART Legacy IO assignments > + > +#---------------------------------------------------------------------------- > +#- FCH Dynamic PCDs > +### Set Doxy_path: "PCD-FCH-USB.h" > +#---------------------------------------------------------------------------- > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci0Enable|TRUE|BOOLEAN|0x000FC > 020 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci1Enable|TRUE|BOOLEAN|0x000FC > 021 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci2Enable|TRUE|BOOLEAN|0x000FC > 022 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci3Enable|TRUE|BOOLEAN|0x000FC > 023 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhciECCDedErrRptEn|FALSE|BOOLEAN > |0x000FC024 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataEnable|TRUE|BOOLEAN|0x000FC0 > 30 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataStaggeredSpinup|FALSE|BOOLEAN > |0x000FC039 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdNvdimmEnable|FALSE|BOOLEAN|0x00 > 0A6024 > + > +#---------------------------------------------------------------------------- > +#- NBIO Dynamic PCDs > +### Set Doxy_path: "PCD-NBIO-BMC.h" > +#---------------------------------------------------------------------------- > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkTraining|FALSE|BOOLEAN > |0x0004F004 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkSocket|0xFF|UINT8|0x00 > 04F005 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkDie|0xFF|UINT8|0x0004F > 006 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkLaneNum|0|UINT8|0x000 > 4F03E > + > +#---------------------------------------------------------------------------- > +#- NBIO Dynamic PCDs > +### Set Doxy_path: "PCD-NBIO.h" > +#---------------------------------------------------------------------------- > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgIommuSupport|TRUE|BOOLEAN|0x > 0004F027 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdIvInfoDmaReMap|FALSE|BOOLEAN|0x > 0004F028 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrVddfull_Scale_Curren > t|0x00|UINT32|0x0004F0A0 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrSocfull_Scale_Curren > t|0x00|UINT32|0x0004F0A2 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityLo|0x4|UINT32|0 > x0004F210 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityHi|0x30011|UINT > 32|0x0004F211 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlProtocolErrorReporting|0|UINT > 8|0x0004F362 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlComponentErrorReporting|0|U > INT8|0x0004F363 > + > +#---------------------------------------------------------------------------- > +#- PSP Dynamic PCDs > +### Set Doxy_path: "PCD-PSP.h" > +#---------------------------------------------------------------------------- > + ### PSP PCDs DYNAMIC > + > + ### @brief This feature selects the APCB recovery support on x86 side. If > or when an instance of a writable APCB is determined to be invalid, the PSP > driver will > + ### attempt a 'recovery' by copying the recovery instance of the APCB > (default values as indicated in the APCB descriptor files). Upon boot up, the > ABL reads CMOS > + ### bytes 06/07 at index/data port of 0x72/0x73. If the CMOS flag reads > anything else other than 0xA55A or 0x5555, the system boots in APCB > recovery mode, in which > + ### ABL consumes the recovery instances of APCB. Otherwise it boots in > normal/non-recovery mode. > + ### @brief Permitted Choices: (Type: Boolean)(Default: TRUE) > + ### @brief This feature is affected by the platform CMOS power design. > Please see Platform CMOS power . > + ### @li TRUE - the AGESA PSP driver restores the APCB instances from the > recovery instance, writes 0xA55A to the CMOS location and triggers a reset . > The next time > + ### the system powers up, ABL runs in normal/non-recovery mode. > + ### @li FALSE - the AGESA PSP driver writes 0x5555 to the CMOS location > without restoring the APCB instances or triggering a reset. In this mode the > additional reset > + ### is avoided at the potential risk of the writeable APCB instance being left > corrupted forever. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspApcbRecoveryEnable|TRUE|B > OOLEAN|0x95940008 > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspAntiRollbackLateSplFuse|FALSE > |BOOLEAN|0x95940018 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemPostPackageRepair|TRUE|BO > OLEAN|0x00030004 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemBootTimePostPackageRepair| > TRUE|BOOLEAN|0x00030005 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemRuntimePostPackageRepair|F > ALSE|BOOLEAN|0x00030006 > +[PcdsDynamicEx] > + > +[PcdsFixedAtBuild, PcdsDynamic] > +#---------------------------------------------------------------------------- > +#- System control PCDs > +### Set Doxy_path: "PCD-Sys.h" > +#---------------------------------------------------------------------------- > + ### @brief Switch for Debug Print function > + ### @details Switch for Debug Print function to enable or not. > + ### @li TRUE: Enable IdsDebugPrint output > + ### @li FALSE: Disable IdsDebugPrint output > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEnable|FALSE|BOOL > EAN|0x00020004 > + ### @brief Specify the filter for IdsDebugPrint > + ### @details When the filter values are matched, the AmdIdsDebugPrint > can start to print debug message. > + ### Refer Library/IdsLib.h for details, and the Master token is > PcdAmdIdsDebugPrintEnable. > + ### @li 0x100401008A30042C: (GNB_TRACE | PCIE_MISC | NB_MISC | > GFX_MISC | CPU_TRACE | MEM_FLOW | MEM_STATUS | MEM_PMU | > FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) > + ### @li 0x100401008A300408: (GNB_TRACE | PCIE_MISC | NB_MISC | > GFX_MISC | CPU_TRACE | MEM_FLOW | FCH_TRACE | MAIN_FLOW| > TEST_POINT | PSP_TRACE) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintFilter|0x100401030 > A300408|UINT64|0x00020005 > + ### @brief Switch for Serial port support of AGESA debug print > + ### @details Switch for Serial port support of AGESA debug print, NOTE, > AGESA will not init the serial port, > + ### serial port should be initialized before call AGESA debug print. > + ### @li TRUE: Enable > + ### @li FALSE: Disable > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortEnable|FA > LSE|BOOLEAN|0x00020009 > + ### @brief The serial port used for debug output can be either 2-wire > (Rx/Tx) or 4-wire (adding DSR/CTS). Waiting for CTS on a > + ### 2-wire port would cause a hang. This control is added to check the > cable connection. > + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) > + ### @li FALSE - Presume a 2-wire port and do not wait for CTS. > + ### @li TRUE - Wait for both DSR and CTS to be set. DSR is set if a cable is > connected. CTS is set if it is ok to transmit data. > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortDetectCabl > eConnection|FALSE|BOOLEAN|0x0002000A > + > + ### @brief Selection of UART and UART Legacy IO Serial port for AGESA > debug print > + ### @details Selection of UART and UART Legacy IO Serial port for AGESA > debug print and invisible in ACPI name space. > + ### @li Bit[0]: Select UART0 for AGESA debug print > + ### @li Bit[1]: Select UART1 for AGESA debug print > + ### @li Bit[2]: Select UART2 for AGESA debug print > + ### @li Bit[3]: Select UART3 for AGESA debug print > + ### @li Bit[4]: Select UART4 for AGESA debug print > + ### @li Bit[8]: Select UART0 Legacy IO for AGESA debug print > + ### @li Bit[9]: Select UART1 Legacy IO for AGESA debug print > + ### @li Bit[10]: Select UART2 Legacy IO for AGESA debug print > + ### @li Bit[11]: Select UART3 Legacy IO for AGESA debug print > + ### @li Bit[15]: Set debug print serial port to invisible in ACPI name space > at OS runtime > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortSelect|0x0 > 000|UINT16|0x0002718A > + > + ### @brief Specify the IO port for serial out > + ### @details ESPI or LPC COM1: 0x3F8, COM2: 0x2F8, COM3: 0x3E8, > COM4: 0x2E8, > + ### UART0: 0xFEDC9000, UART1: 0xFEDCA000, UART2: 0xFEDCE000, > UART3: 0xFEDCF000, UART4: 0xFEDD1000. > + ### @li If it's IO port: it must < 0x10000 > + ### @li If it's Memory: it must >= 0x10000 > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPort|0x3F8|UI > NT64|0x0002000B > + > + ### @brief Debug Print Emulation Auto Detect > + ### @details Auto detect emulation platform to instead of > PcdAmdIdsDebugPrintRedirectIOEnable and > + ### PcdAmdIdsDebugPrintSerialPortEnable. > + ### @li TRUE: Enable > + ### @li FALSE: Disable > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEmulationAutoDetec > t|FALSE|BOOLEAN|0x00020016 > + > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgPlatformPPT|0|UINT32|0x0004F11 > 1 > + > +#---------------------------------------------------------------------------- > +#- PSP Dynamic PCDs > +### Set Doxy_path: "PCD-PSP.h" > +#---------------------------------------------------------------------------- > + ### PSP PCDs > + > + ### @brief Rom Armor selection > + ### @details Rom Armor selection > + ### @li 0: Rom Armor is disabled > + ### @li 1: Rom Armor 1 is enabled (VMR/MTS/CPK) > + ### @li 2: Rom Armor 2 is enabled (RN/CZN) > + ### @li 3: Rom Armor 3 is enabled (CGL, RMB and later) > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspRomArmorSelection|0|UINT8| > 0x95940054 > + > + > + > + ### @brief System TPM config Value > + ### @details System TPM config Value, SBIOS needs to set the value in PEI > phase. > + ### @li 0x0: dTPM > + ### @li 0x1: PSP fTPM > + ### @li 0x2: HSP fTPM > + ### @li 0xFF: no TPM > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmConfig|0xFF|UINT8 > |0x95940024 > + > + ### @cond !BRH > + ### @brief TPM SMx algorithm flag > + ### @details TPM SMx algorithm flag, SBIOS needs to set the value in PEI > phase. > + ### @li 0: SM2, SM3 or SM4 crypto algorithms not supported > + ### @li 1: SM2, SM3 or SM4 crypto algorithms supported > + > gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmAlgSmx|0|UINT8|0 > x95940025 > + ### @endcond > diff --git a/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec > b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec > new file mode 100755 > index 0000000000..c8c474637f > --- /dev/null > +++ b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec > @@ -0,0 +1,41 @@ > +## @file > +# AMD Common Platform Module (CPM) Module Package DEC. > +# > +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEC_SPECIFICATION = 0x00010005 > + PACKAGE_NAME = CpmPkg > + PACKAGE_GUID = ABE128BA-1061-4A53-A1B8-D07329AA7A67 > + PACKAGE_VERSION = 0.1 > + > +[Includes] > + Include > + Library > + > +[Guids] > + gAmdCpmPkgTokenSpaceGuid = {0x916e0ddd, 0x2bd2, 0x4704, {0x93, > 0xb9, 0x59, 0x4b, 0x01, 0xa5, 0xfa, 0x9f}} > + gShellActHiiGuid = {0x340EBE97, 0x3C1C, 0x4272, {0x9C, 0xCE, > 0xC1, 0xFF, 0x86, 0x6F, 0x73, 0x3C}} > + gAmdPbsSystemConfigurationGuid = {0xa339d746, 0xf678, 0x49b3, {0x9f, > 0xc7, 0x54, 0xce, 0x0f, 0x9d, 0xf2, 0x26}} > + > +[Protocols] > + gAmdCpmTableProtocolGuid = { 0x3724cf01, 0x00c2, 0x9762, > {0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 }} > + gAmdCpmAllPciIoProtocolsInstalledProtocolGuid = { 0x676D7012, 0x139B, > 0x485A, {0x96, 0xF1, 0x98, 0x6F, 0xC4, 0x8A, 0x86, 0x4B }} > + > +[Ppis] > + gAmdCpmTablePpiGuid = { 0xd71cf893, 0xa8b5, 0x49d3, { 0xa2, 0x1b, > 0x31, 0xe2, 0xf5, 0xc4, 0xa7, 0x47 } } > + > +[PcdsFixedAtBuild] > + gAmdCpmPkgTokenSpaceGuid.PcdFchUartPort|2|UINT8|0x00000052 > + > + #ACPI > + > gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiHestTableHeaderOemTableId|"A > MD HEST"|VOID*|0x000AC001 > + > gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiBertTableHeaderOemTableId|"A > MD BERT"|VOID*|0x000AC002 > + > gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiEinjTableHeaderOemTableId|"AM > D EINJ"|VOID*|0x000AC003 > + > + > gAmdCpmPkgTokenSpaceGuid.UsePciXAslName|FALSE|BOOLEAN|0x120000 > 03 > + > gAmdCpmPkgTokenSpaceGuid.AcpiRestoreSwSmi|0xE3|UINT8|0x00000040 > diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc > b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc > new file mode 100644 > index 0000000000..37b8d15cb1 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc > @@ -0,0 +1,18 @@ > +## @file > +# > +# The DSC include file for edk2 package to pull in the necessary AGESA > modules > +# into build process. > +# > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[LibraryClasses] > + > NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioComm > onDxeLib.inf > + > + ## Gnb Lib > + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf > + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf > + > diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc > b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc > new file mode 100644 > index 0000000000..e7e05fd2d8 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc > @@ -0,0 +1,48 @@ > +## @file > +# The AGESA DSC file for building AMD SP5 Genoa boards. > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[LibraryClasses.Common.PEIM] > + > + ## APCB > + ApcbLibV3Pei|AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf > + > +[LibraryClasses.Common.DXE_DRIVER] > + > AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/A > mdPspRomArmorLibNull.inf > + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf > + > +[LibraryClasses.Common.DXE_SMM_DRIVER] > + > AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/A > mdPspRomArmorLibNull.inf > + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf > + > +[LibraryClasses] > + # > + # Agesa specific common libraries > + # > + > + ## PSP Libs > + > AmdPspMboxLibV2|AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspM > boxLibV2.inf > + > + ## DF Lib > + > BaseFabricTopologyLib|AgesaModulePkg/Library/BaseFabricTopologyRsLib/B > aseFabricTopologyRsLib.inf > + > + ## Gnb Lib > + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf > + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf > + SmnAccessLib|AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf > + > NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioComm > onDxeLib.inf > + > + ## Fch Lib > + FchBaseLib|AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf > + > +[Components.IA32] > + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf > + > +[Components.X64] > + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf > + > diff --git > a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc > b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc > new file mode 100644 > index 0000000000..1f1e04c414 > --- /dev/null > +++ > b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc > @@ -0,0 +1,8 @@ > +## @file > +# > +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Am > dCpmGenoaQuartzPkg.inc.dsc > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.inc.dsc > new file mode 100644 > index 0000000000..2916fecb26 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.inc.dsc > @@ -0,0 +1,11 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + DEFINE AGESA_PKG_PATH = AgesaModulePkg > + DEFINE AGESA_PKG_DEC = AgesaCommonModulePkg > diff --git > a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf > b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf > new file mode 100644 > index 0000000000..9303d1fac4 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf > @@ -0,0 +1,11 @@ > +## @file > +# The AGESA DXE FDF file for building AMD SP5 Genoa boards. > +# > +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +## APCB V3 Dxe Drivers > + INF AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf > diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf > b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf > new file mode 100644 > index 0000000000..0ef5a2a806 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf > @@ -0,0 +1,9 @@ > +## @file > +# The AGESA PEI FDF file for building AMD SP5 Genoa boards. > +# > +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > diff --git > a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.in > c.fdf > b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.in > c.fdf > new file mode 100644 > index 0000000000..4766ad0447 > --- /dev/null > +++ > b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.in > c.fdf > @@ -0,0 +1,7 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > diff --git > a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc > .fdf > b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc > .fdf > new file mode 100644 > index 0000000000..4766ad0447 > --- /dev/null > +++ > b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc > .fdf > @@ -0,0 +1,7 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > diff --git > a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe > .inc.fdf > b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dx > e.inc.fdf > new file mode 100644 > index 0000000000..da3afe6e59 > --- /dev/null > +++ > b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dx > e.inc.fdf > @@ -0,0 +1,8 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > diff --git > a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei. > inc.fdf > b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei > .inc.fdf > new file mode 100644 > index 0000000000..da3afe6e59 > --- /dev/null > +++ > b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei > .inc.fdf > @@ -0,0 +1,8 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Am > dCpmGenoaQuartzPkg.dxe.inc.fdf > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.dxe.inc.fdf > new file mode 100644 > index 0000000000..4766ad0447 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.dxe.inc.fdf > @@ -0,0 +1,7 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Am > dCpmGenoaQuartzPkg.fdf > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.fdf > new file mode 100644 > index 0000000000..b790e4ead5 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.fdf > @@ -0,0 +1,10 @@ > +## @file > +# > +# Platform Package Flash Description File > +# > +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/Am > dCpmGenoaQuartzPkg.pei.inc.fdf > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.pei.inc.fdf > new file mode 100644 > index 0000000000..4766ad0447 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/A > mdCpmGenoaQuartzPkg.pei.inc.fdf > @@ -0,0 +1,7 @@ > +## @file > +# > +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf > b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf > new file mode 100755 > index 0000000000..8d3357bf56 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf > @@ -0,0 +1,29 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = AmdCalloutLib > + FILE_GUID = A8FEA621-B381-4c06-9E9D-0897EF78BD78 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = AmdCalloutLib > + > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaPkg/AgesaPkg.dec > + > +[LibraryClasses] > + BaseLib > + PcdLib > + > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMbox > LibV2.inf > b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMbox > LibV2.inf > new file mode 100644 > index 0000000000..1594a99265 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMbox > LibV2.inf > @@ -0,0 +1,30 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = AmdPspMboxLibV2 > + FILE_GUID = B9E57A31-CAB0-4CEE-9D50-9D43E2EEAA44 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = AmdPspMboxLibV2 > + > +[Sources.common] > + AmdPspMboxLibV2.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > +[LibraryClasses] > + PciLib > + SmnAccessLib > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRo > mArmorLib.inf > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRo > mArmorLib.inf > new file mode 100644 > index 0000000000..c685a26604 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRo > mArmorLib.inf > @@ -0,0 +1,27 @@ > +## @file > +# > +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = AmdPspRomArmorLib > + FILE_GUID = 55871F80-4658-6EF3-A8AC-15B34FF8C2CE > + MODULE_TYPE = DXE_SMM_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = AmdPspRomArmorLib > + > +[Sources.common] > + AmdPspRomArmorLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPs > pRomArmorLibNull.inf > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPs > pRomArmorLibNull.inf > new file mode 100644 > index 0000000000..a3906dc13e > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPs > pRomArmorLibNull.inf > @@ -0,0 +1,26 @@ > +## @file > +# > +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = AmdPspRomArmorLibNull > + FILE_GUID = 7351EAC0-4587-FED8-2788-BF9DA2ADCA6E > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = AmdPspRomArmorLibNull > + > +[Sources.common] > + AmdPspRomArmorLibNull.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > + > diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf > b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf > new file mode 100644 > index 0000000000..09d5bd38ac > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf > @@ -0,0 +1,37 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = ApcbLibV3 > + FILE_GUID = C7932467-DF16-4C7A-A32A-3E6F50213E68 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = ApcbLibV3 | DXE_DRIVER DXE_SMM_DRIVER > DXE_RUNTIME_DRIVER DXE_CORE SMM_CORE UEFI_DRIVER > + > +[Sources.common] > + ApcbLibV3.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleMemPkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > +[Protocols] > + gEfiSmmBase2ProtocolGuid > + gEfiSmmReadyToLockProtocolGuid > + > +[Pcd] > + > gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageR > epairEntries > + > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf > b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf > new file mode 100644 > index 0000000000..c031d00d79 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf > @@ -0,0 +1,32 @@ > +## @file > +# > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = ApcbLibV3Pei > + FILE_GUID = EEA4E007-E408-4daa-82BD-4C52E7058753 > + MODULE_TYPE = PEIM > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = ApcbLibV3Pei|PEIM > + > +[Sources.common] > + ApcbLibV3Pei.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleMemPkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > +[LibraryClasses] > + PcdLib > + BaseMemoryLib > + PeiServicesLib > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFab > ricTopologyRsLib.inf > b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFab > ricTopologyRsLib.inf > new file mode 100644 > index 0000000000..38a72e26b7 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFab > ricTopologyRsLib.inf > @@ -0,0 +1,28 @@ > +## @file > +# > +# For EDKII use Only > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = BaseFabricTopologyRsLib > + FILE_GUID = D0A070DD-630A-43F8-9D76-EAAABDDE5FB9 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = BaseFabricTopologyLib > + CONSTRUCTOR = BaseFabricTopologyLibConstructor > + > +[Sources] > + BaseFabricTopologyRsLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleDfPkg.dec > + > +[LibraryClasses] > + BaseLib > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.i > nf > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.i > nf > new file mode 100644 > index 0000000000..d15d8169fe > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.i > nf > @@ -0,0 +1,35 @@ > +## @file > +# Base Timer Library which uses the Time Stamp Counter in the processor. > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = BaseTscTimerLib > + FILE_GUID = D29338B9-50FE-4e4f-B7D4-A150A2C1F4FB > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = TimerLib > + > +# > +# VALID_ARCHITECTURES = IA32 X64 > +# > + > +[Sources.common] > + TscTimerLibShare.c > + BaseTscTimerLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleCcxPkg.dec > + AgesaPkg/AgesaPkg.dec > + > +[LibraryClasses] > + PcdLib > + BaseLib > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.in > f > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.i > nf > new file mode 100644 > index 0000000000..1e52768a01 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.i > nf > @@ -0,0 +1,42 @@ > +## @file > +# Dxe Timer Library which uses the Time Stamp Counter in the processor. > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = DxeTscTimerLib > + FILE_GUID = 95ab030f-b4fd-4ee4-92a5-9e04e87634d9 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = TimerLib|DXE_CORE DXE_DRIVER > DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER > SMM_CORE > + > + CONSTRUCTOR = DxeTscTimerLibConstructor > + > +# > +# VALID_ARCHITECTURES = IA32 X64 > +# > + > +[Sources.common] > + TscTimerLibShare.c > + DxeTscTimerLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleCcxPkg.dec > + AgesaPkg/AgesaPkg.dec > + > +[LibraryClasses] > + UefiBootServicesTableLib > + PcdLib > + BaseLib > + UefiLib > + DebugLib > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.in > f > new file mode 100644 > index 0000000000..b1eaefd282 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.in > f > @@ -0,0 +1,37 @@ > +## @file > +# Pei Timer Library which uses the Time Stamp Counter in the processor. > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PeiTscTimerLib > + FILE_GUID = 342C36C0-15DF-43b4-9EC9-FBF748BFB3D1 > + MODULE_TYPE = PEIM > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = TimerLib|PEIM PEI_CORE > + > +# > +# VALID_ARCHITECTURES = IA32 X64 > +# > + > +[Sources.common] > + TscTimerLibShare.c > + PeiTscTimerLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleCcxPkg.dec > + AgesaPkg/AgesaPkg.dec > + > +[LibraryClasses] > + PcdLib > + BaseLib > + HobLib > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHost > BridgeLib.inf > b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHost > BridgeLib.inf > new file mode 100644 > index 0000000000..f60f97905a > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHost > BridgeLib.inf > @@ -0,0 +1,42 @@ > +## @file > +# Library instance of PciHostBridgeLib library class for coreboot. > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PciHostBridgeLib > + FILE_GUID = 74967FD7-A9A4-4B16-8B41-B26BC3230D0A > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PciHostBridgeLib > + > +# > +# The following information is for reference only and not required by the > build > +# tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 > +# > + > +[Sources] > + PciHostBridgeLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleDfPkg.dec > + AgesaModulePkg/AgesaModuleNbioPkg.dec > + AgesaPkg/AgesaPkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + PciHostBridgeLib > + DevicePathLib > + MemoryAllocationLib > + DebugLib > + UefiBootServicesTableLib > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenera > tionLib.inf > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenera > tionLib.inf > new file mode 100644 > index 0000000000..2a72fa8117 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenera > tionLib.inf > @@ -0,0 +1,47 @@ > +## @file > +# > +# Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = AmlGenerationLib > + FILE_GUID = 8F62C8D1-B67F-4AFB-9179-54384F1A6163 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = AmlGenerationLib | DXE_DRIVER UEFI_DRIVER > HOST_APPLICATION > + > +[Sources.common] > + LocalAmlObjects.h > + LocalAmlObjects.c > + LocalAmlLib.h > + AmlAssistFunctions.c > + AmlObjectsDebug.c > + AmlNameString.c > + AmlDataObjects.c > + AmlNamespaceModifierObjects.c > + AmlPkgLength.c > + AmlNamedObject.c > + AmlTable.c > + AmlStatementOpcodes.c > + AmlResourceDescriptor.c > + AmlExpressionOpcodes.c > + AmlArgObjects.c > + AmlLocalObjects.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + > +[LibraryClasses] > + BaseLib > + DebugLib > + BaseMemoryLib > + MemoryAllocationLib > + > +[Depex] > + TRUE > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf > b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf > new file mode 100644 > index 0000000000..e63a70e849 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf > @@ -0,0 +1,26 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = FchBaseLib > + FILE_GUID = 4108287a-c864-4427-b2c3-bd0e91a83abd > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = FchBaseLib > + > +[Sources.common] > + FchStallLib.c > + > +[Packages] > + AgesaModulePkg/AgesaModuleFchPkg.dec > + MdePkg/MdePkg.dec > + > +[LibraryClasses] > + PciSegmentLib > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseR > esetSystemLib.inf > b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseR > esetSystemLib.inf > new file mode 100644 > index 0000000000..e422cb69a4 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseR > esetSystemLib.inf > @@ -0,0 +1,35 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = BaseResetSystemLib > + FILE_GUID = e669c365-2df2-4540-a343-afec4e85b198 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = BaseResetSystemLib > + > +# > +# VALID_ARCHITECTURES = IA32 X64 > +# > + > +[Sources] > + FchBaseResetSystemLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaModulePkg/AgesaModuleFchPkg.dec > + > +[LibraryClasses] > + BaseLib > + PrintLib > + IoLib > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf > b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf > new file mode 100644 > index 0000000000..d7f49c40de > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf > @@ -0,0 +1,33 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = FchEspiCmdLib > + FILE_GUID = 89671327-a620-43e9-93b1-d1da79a50392 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = FchEspiCmdLib > + > +[Sources.common] > + FchEspiCmdLib.c > + > +[Packages] > + AgesaModulePkg/AgesaModuleFchPkg.dec > + MdePkg/MdePkg.dec > + > +[LibraryClasses] > + IoLib > + FchBaseLib > + > + > + > + > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf > b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf > new file mode 100755 > index 0000000000..f32bbc9ff2 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf > @@ -0,0 +1,24 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = NbioHandleLib > + FILE_GUID = DC4639D3-DB75-486B-AC38-C84AA49601E3 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = NbioHandleLib > + > +[Sources] > + NbioHandleLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleNbioPkg.dec > + AgesaPkg/AgesaPkg.dec > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf > b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf > new file mode 100755 > index 0000000000..0d6ba605f5 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf > @@ -0,0 +1,25 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PcieConfigLib > + FILE_GUID = C1205AD2-FE67-4502-A0A7-FB1704A3F9AE > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PcieConfigLib > + > +[Sources] > + PcieConfigLib.c > + PcieInputParserLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleNbioPkg.dec > + > diff --git > a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf > b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf > new file mode 100644 > index 0000000000..ae1dd6cd83 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf > @@ -0,0 +1,33 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = SmnAccessLib > + FILE_GUID = 9B7FF4FA-9DB5-4fec-BF71-B13D8A14A51E > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = SmnAccessLib > + > +[Sources] > + SmnAccessLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleNbioPkg.dec > + > +[LibraryClasses] > + PrintLib > + BaseLib > + DebugPrintErrorLevelLib > + > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonD > xeLib.inf > b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonD > xeLib.inf > new file mode 100644 > index 0000000000..da7f5c185d > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonD > xeLib.inf > @@ -0,0 +1,29 @@ > +## @file > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = NbioCommonDxeLib > + FILE_GUID = 1BF93335-5D55-46D9-99D9-5D962F039829 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = NbioCommonDxeLib > + > +[Sources] > + DxeLibFunctions.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModuleNbioPkg.dec > + > +[LibraryClasses] > + BaseLib > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf > new file mode 100644 > index 0000000000..54c3514020 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf > @@ -0,0 +1,45 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = AmdApcbDxeV3 > + FILE_GUID = 4D3708A0-6D9B-47D3-AD87-E80C781BC0A7 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = AmdApcbV3DxeDriverEntry > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > +[LibraryClasses] > + BaseLib > + PcdLib > + BaseMemoryLib > + UefiBootServicesTableLib > + UefiRuntimeServicesTableLib > + UefiDriverEntryPoint > + DxeServicesTableLib > + MemoryAllocationLib > + ApcbLibV3 > + > +[Sources] > + ApcbV3Dxe.c > + > +[Protocols] > + gEfiDxeSmmReadyToLockProtocolGuid > + gEfiSmmCommunicationProtocolGuid > + > +[Depex] > + TRUE > + > + > + > diff --git > a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf > new file mode 100644 > index 0000000000..7f90aa6ea0 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf > @@ -0,0 +1,33 @@ > +## @file > +# > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = AmdApcbPeiV3 > + FILE_GUID = E1B8CF4A-FE7B-4676-B4F7-50C7228282A4 > + MODULE_TYPE = PEIM > + VERSION_STRING = 1.0 > + ENTRY_POINT = AmdApcbV3PeiDriverEntry > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > +[LibraryClasses] > + BaseLib > + PeimEntryPoint > + ApcbLibV3Pei > + > +[sources] > + ApcbV3Pei.c > + > +[Depex] > + TRUE > + > diff --git > a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oe > mAgesaCcxPlatformLibNull.inf > b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oe > mAgesaCcxPlatformLibNull.inf > new file mode 100755 > index 0000000000..0f115c362e > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oe > mAgesaCcxPlatformLibNull.inf > @@ -0,0 +1,27 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = OemAgesaCcxPlatformLibNull > + FILE_GUID = B1F58B07-0146-4804-B701-A56CB5716529 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = OemAgesaCcxPlatformLib > + > +[Sources.common] > + OemAgesaCcxPlatformLibNull.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > +[Depex] > + TRUE > + > + > + > diff --git > a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciEx > pressPciCfg2.inf > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciEx > pressPciCfg2.inf > new file mode 100644 > index 0000000000..ba551e5c14 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciEx > pressPciCfg2.inf > @@ -0,0 +1,61 @@ > +## @file > +# > +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PciExpressPciCfg2 > + FILE_GUID = 7A6DF3DB-1C0A-45C2-8251-AFE794D7D6B3 > + MODULE_TYPE = PEIM > + VERSION_STRING = 1.0 > + ENTRY_POINT = PeimInitializePciCfg > + > +# > +# The following information is for reference only and not required by the > build tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 EBC (EBC is for build only) > +# > + > +[Sources] > + PciExpressPciCfg2.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaPkg/AgesaPkg.dec > + > + > +[LibraryClasses] > + PeimEntryPoint > + BaseLib > + PcdLib > + DebugLib > + BaseMemoryLib > + MemoryAllocationLib > + HobLib > + IoLib > + > +[Ppis] > + gEfiPciCfg2PpiGuid ## PRODUCES > + > +[Pcd] > + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress > + > +[Pcd.IA32,Pcd.X64] > + gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## > SOMETIMES_CONSUMES > + > gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMas > k ## CONSUMES > + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask > ## CONSUMES > + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## > CONSUMES > + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable ## > SOMETIMES_CONSUMES > + > +[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64] > + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## > SOMETIMES_CONSUMES > + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## > SOMETIMES_CONSUMES > + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## > SOMETIMES_CONSUMES > + > +[Depex] > + TRUE > diff --git > a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentIn > foLib/PciExpressPciSegmentInfoLib.inf > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentIn > foLib/PciExpressPciSegmentInfoLib.inf > new file mode 100644 > index 0000000000..e712a80886 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentIn > foLib/PciExpressPciSegmentInfoLib.inf > @@ -0,0 +1,32 @@ > +## @file > +# > +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PciExpressPciSegmentInfoLib > + FILE_GUID = FA8B1082-88DF-4744-85A3-7F87A9EBF8DC > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PciSegmentInfoLib > + > +# > +# The following information is for reference only and not required by the > build tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 EBC > +# > + > +[Sources] > + PciSegmentInfoLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + > +[LibraryClasses] > + DebugLib > + BaseLib > diff --git > a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/A > mdPspFlashAccSpiNorLibSmm.inf > b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/ > AmdPspFlashAccSpiNorLibSmm.inf > new file mode 100644 > index 0000000000..f4b9d0d789 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/ > AmdPspFlashAccSpiNorLibSmm.inf > @@ -0,0 +1,45 @@ > +## @file > +# > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = AmdPspFlashAccLibSmm > + FILE_GUID = 3BBDC3A5-A0E2-4E8A-8240-9E594920F040 > + MODULE_TYPE = DXE_SMM_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = AmdPspFlashAccLib | DXE_SMM_DRIVER > + > +[Sources.common] > + AmdPspFlashAccSpiNorLibSmm.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + UefiCpuPkg/UefiCpuPkg.dec > + AgesaPkg/AgesaPkg.dec > + > +[LibraryClasses] > + AmdPspBaseLibV2 > + BaseLib > + DebugLib > + SmmServicesTableLib > + UefiBootServicesTableLib > + > +[Protocols] > + gEfiSmmBase2ProtocolGuid > + gEfiSpiSmmNorFlashProtocolGuid > + > +[Pcd] > + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize ## > CONSUMES > + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress ## > CONSUMES > + > +[Depex] > + gEfiSmmBase2ProtocolGuid AND > + gEfiSpiSmmNorFlashProtocolGuid > + > diff --git > a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRo > mArmorWhitelistLib.inf > b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRo > mArmorWhitelistLib.inf > new file mode 100644 > index 0000000000..57bb0d9e25 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRo > mArmorWhitelistLib.inf > @@ -0,0 +1,32 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = PspRomArmorWhitelistLib > + FILE_GUID = B6F8507A-C96B-4036-A8C0-26BAD6AC5F34 > + MODULE_TYPE = DXE_SMM_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PlatformPspRomArmorWhitelistLib > + > +[Sources] > + PspRomArmorWhitelistLib.c > + > +[Packages] > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaPkg/AgesaPkg.dec > + MdePkg/MdePkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + MemoryAllocationLib > + PcdLib > + DebugLib > + > +[Depex] > + TRUE > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf > new file mode 100644 > index 0000000000..64fd2913ad > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf > @@ -0,0 +1,42 @@ > +## @file > +# > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = OobPprDxe > + FILE_GUID = F91DCAB4-3639-11EE-BE56-0242AC120002 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = OobPprEntry > + > +[Sources] > + OobPprDxe.c > + > +[Packages] > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + MdePkg/MdePkg.dec > + AmdCpmPkg/AmdCpmPkg.dec > + > +[LibraryClasses] > + UefiDriverEntryPoint > + DebugLib > + PcdLib > + BaseMemoryLib > + UefiBootServicesTableLib > + UefiRuntimeServicesTableLib > + MemoryAllocationLib > + TimerLib > + > +[Protocols] > + gEfiPciIoProtocolGuid #CONSUMES > + > +[Depex] > + TRUE > + > + > + > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriv > er/PspPlatform.inf > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriv > er/PspPlatform.inf > new file mode 100644 > index 0000000000..f4d7638c1a > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriv > er/PspPlatform.inf > @@ -0,0 +1,32 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PspPlatform > + FILE_GUID = 28374747-76FF-41B3-9740-381EFAEF13BC > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = PspPlatformEntryPoint > + > +[Sources] > + PspPlatformDriver.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AgesaPkg/AgesaPkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AgesaModulePkg/AgesaModulePspPkg.dec > + > +[LibraryClasses] > + DebugLib > + BaseLib > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + > +[Depex] > + TRUE > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugD > xe/ServerHotplugDxe.inf > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugD > xe/ServerHotplugDxe.inf > new file mode 100644 > index 0000000000..973ace8632 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugD > xe/ServerHotplugDxe.inf > @@ -0,0 +1,29 @@ > +## @file > +# > +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = ServerHotplugDxe > + FILE_GUID = FAFF8CA9-E515-44ed-B5F9-E2F6E5D902E3 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + > + ENTRY_POINT = HotplugDescEntry > + > +[Sources] > + ServerHotplugDxe.c > + > +[Packages] > + AgesaPkg/AgesaPkg.dec > + MdePkg/MdePkg.dec > + AmdCpmPkg/AmdCpmPkg.dec > + > +[LibraryClasses] > + UefiDriverEntryPoint > + > +[Depex] > + TRUE > diff --git > a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > DynamicCommand.inf > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > DynamicCommand.inf > new file mode 100644 > index 0000000000..2d9dbeb715 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > DynamicCommand.inf > @@ -0,0 +1,53 @@ > +## @file > +# > +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = AmdAutoDynamicCommand > + FILE_GUID = CCD8FEC8-1E30-45BD-8632-DB83A255FAC3 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.1 > + ENTRY_POINT = ActCommandInitialize > + UNLOAD_IMAGE = ActLibraryUnregisterActCommand > + UEFI_HII_RESOURCE_SECTION = TRUE > + > +[Sources.common] > + AmdAutoDynamicCommand.c > + > +[Packages] > + MdePkg/MdePkg.dec > + ShellPkg/ShellPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AmdCpmPkg/AmdCpmPkg.dec > + > +[LibraryClasses] > + BaseLib > + UefiLib > + FileHandleLib > + HiiLib > + DebugLib > + BaseMemoryLib > + MemoryAllocationLib > + UefiRuntimeServicesTableLib > + UefiDriverEntryPoint > + UefiBootServicesTableLib > + UefiHiiServicesLib > + > +[Guids] > + gShellActHiiGuid ## SOMETIMES_CONSUMES ## HII > + gAgesaConfigDbPointerVariableGuid > + > +[Protocols] > + gEfiShellDynamicCommandProtocolGuid > + gEfiHiiPackageListProtocolGuid > + gEfiShellParametersProtocolGuid > + gEfiUnicodeCollation2ProtocolGuid > + > +[DEPEX] > + TRUE > diff --git > a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > ToolApp.inf > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > ToolApp.inf > new file mode 100644 > index 0000000000..98c8755ab8 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > ToolApp.inf > @@ -0,0 +1,50 @@ > +## @file > +# > +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010006 > + BASE_NAME = AmdAutoToolApp > + FILE_GUID = 470E1741-2DFE-43EF-861E-505CB3226DC0 > + MODULE_TYPE = UEFI_APPLICATION > + VERSION_STRING = 1.0 > + ENTRY_POINT = ActCommandInitialize > +# > +# This flag specifies whether HII resource section is generated into PE image. > +# > + UEFI_HII_RESOURCE_SECTION = TRUE > + > +[Sources.common] > + AmdAutoToolApp.c > + > +[Packages] > + MdePkg/MdePkg.dec > + ShellPkg/ShellPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AgesaModulePkg/AgesaCommonModulePkg.dec > + AmdCpmPkg/AmdCpmPkg.dec > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + DebugLib > + FileHandleLib > + HiiLib > + MemoryAllocationLib > + UefiApplicationEntryPoint > + UefiBootServicesTableLib > + UefiHiiServicesLib > + UefiLib > + UefiRuntimeServicesTableLib > + > +[Protocols] > + gEfiHiiPackageListProtocolGuid ## CONSUMES > + gEfiShellParametersProtocolGuid > + gEfiUnicodeCollation2ProtocolGuid > + > +[Guids] > + > diff --git > a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmd > FchUart/BasePlatformHookLibAmdFchUart.inf > b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmd > FchUart/BasePlatformHookLibAmdFchUart.inf > new file mode 100644 > index 0000000000..9c3c0dd0a9 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmd > FchUart/BasePlatformHookLibAmdFchUart.inf > @@ -0,0 +1,33 @@ > +## @file > +# > +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = BasePlatformHookLibAmdFchUart > + FILE_GUID = BF2F3F3F-4BE6-4B97-850D-D5D4941D391C > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PlatformHookLib > + > +[Sources] > + BasePlatformHookLibAmdFchUart.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + AmdCpmPkg/AmdCpmPkg.dec > + AgesaModulePkg/AgesaModuleFchPkg.dec > + > +[LibraryClasses] > + BaseLib > + PcdLib > + IoLib > + PlatformHookLib > + > + > + > diff --git a/Platform/AMD/AgesaModulePkg/Include/AGESA.h > b/Platform/AMD/AgesaModulePkg/Include/AGESA.h > new file mode 100644 > index 0000000000..3ec03aafd3 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/AGESA.h > @@ -0,0 +1,158 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AGESA_H_ > +#define AGESA_H_ > + > +#include "AMD.h" > +#include "SocLogicalId.h" > + > +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull > +#define DESCRIPTOR_IGNORE 0x40000000ull > +#define DESCRIPTOR_INITIALIZE_LIST 0x20000000ull > + > +/// PCIe link initialization > +typedef enum { > + EndpointDetect = 0, ///< Detect endpoint presence > + EndpointNotPresent ///< Endpoint not present (or > connected). Used in case there is alternative way to determine > + ///< if device present on board or in slot. > For example GPIO can be used to determine device presence. > +} PCIE_ENDPOINT_STATUS; > + > +/// PCIe port misc extended controls > +typedef struct { > + IN UINT8 LinkComplianceMode : 1; ///< Force port into > compliance mode (device will not be trained, port output compliance pattern) > + IN UINT8 LinkSafeMode : 2; ///< Safe mode PCIe capability. > (Parameter may limit PCIe speed requested through > PCIe_PORT_DATA::LinkSpeedCapability) > + ///< 0 - port can advertise maximum > supported capability > + ///< 1 - port limit advertized capability and > speed to PCIe Gen1 > + IN UINT8 SbLink : 1; ///< PCIe link type > + ///< 0 - General purpose port > + ///< 1 - Port connected to SB > + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management > Support > + ///< 0 - Clock Power Management not > configured > + ///< 1 - Clock Power Management > configured according to PCIe device capability > + IN UINT8 CsLink : 1; ///< PCIe link type > + ///< 0 - General purpose port > + ///< 1 - Port connected to chipset > + IN UINT8 Reserved0 : 2; ///< Unused space > +} PCIE_PORT_MISC_CONTROL; > + > +/// The IO APIC Interrupt Mapping Info > +typedef struct { > + IN UINT8 GroupMap; ///< Group mapping for slot or > endpoint device (connected to PCIE port) interrupts . > + ///< - IGNORE THIS STRUCTURE AND USE > RECOMMENDED SETTINGS > + ///< - mapped to Grp 0 (Interrupts 0..3 of > IO APIC redirection table) > + ///< - mapped to Grp 1 (Interrupts 4..7 of > IO APIC redirection table) > + ///< - mapped to Grp 7 (Interrupts 28..31 > of IO APIC redirection table) > + IN UINT8 Swizzle; ///< Swizzle interrupt in the Group. > + ///< - ABCD > + ///< - BCDA > + ///< - CDAB > + ///< - DABC > + IN UINT8 BridgeInt; ///< IOAPIC redirection table entry > for PCIE bridge interrupt > + ///< - Entry 0 of IO APIC redirection table > + ///< - Entry 1 of IO APIC redirection table > + ///< - Entry 31 of IO APIC redirection table > +} APIC_DEVICE_INFO; > + > +/// GEN3 RxAdaptMode Configuration Structure > +typedef struct { > + IN BOOLEAN InitOffsetCancellation; ///< Initial Offset > Cancellation Enable > + IN UINT8 DFEControl; ///< DFE Control > + IN UINT8 LEQControl; ///< LEQ Control > + IN BOOLEAN DynamicOffsetCalibration; ///< Dynamic Offset > Calibration Enable > + IN BOOLEAN FOMCalculation; ///< FOM Calculation > Enable > + IN BOOLEAN PIOffsetCalibration; ///< PI Offset Calibratino > Enable > +} RX_ADAPT_MODE; > + > +/// PCIe port configuration data > +typedef struct { > + IN UINT8 PortPresent; ///< Enable PCIe port for > initialization. > + IN UINT8 ChannelType; ///< Channel type. > + ///< 0 - "lowLoss", > + ///< 1 - "highLoss", > + ///< 2 - "mob0db", > + ///< 3 - "mob3db", > + ///< 4 - "extnd6db" > + ///< 5 - "extnd8db" > + IN UINT8 DeviceNumber; ///< PCI Device number for > port. > + ///< 0 - Native port device number > + ///< N - Port device number (See > available configurations in BKDG > + IN UINT8 FunctionNumber; ///< Reserved for future use > + IN UINT8 LinkSpeedCapability; ///< PCIe link speed/ > + ///< 0 - Maximum supported by silicon > + ///< 1 - Gen1 > + ///< 2 - Gen2 > + ///< 3 - Gen3 > + IN UINT8 LinkAspm; ///< ASPM control. (see > AgesaPcieLinkAspm for additional option to control ASPM) > + ///< 0 - Disabled > + ///< 1 - L0s only > + ///< 2 - L1 only > + ///< 3 - L0s and L1 > + IN UINT8 LinkHotplug; ///< Hotplug control. > + ///< 0 - Disabled > + ///< 1 - Basic > + ///< 2 - Server > + ///< 3 - Enhanced > + IN UINT8 ResetId; ///< Arbitrary number greater > than 0 assigned by platform firmware for GPIO > + ///< identification which control reset for > given port. > + ///< Each port with unique GPIO should > have unique ResetId assigned. > + ///< All ports use same GPIO to control > reset should have same ResetId assigned. > + ///< see AgesaPcieSlotResetContol. > + IN UINT16 SlotNum; ///< Physical Slot Number > + IN PCIE_PORT_MISC_CONTROL MiscControls; ///< Misc extended > controls > + IN APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device > programming info > + IN PCIE_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint > (device connected to PCIe port) status > + IN RX_ADAPT_MODE RxAdaptMode; ///< Gen3 > RxAdaptMode configuration > +} PCIE_PORT_DATA; > + > +/// PCIe Complex descriptor > +typedef struct { > + IN UINT32 Flags; ///< Descriptor flags > + ///< Bit31 - last descriptor in topology > + IN UINT32 SocketId; ///< Socket Id > + IN VOID *Reserved; ///< Reserved for future use > +} PCIE_COMPLEX_DESCRIPTOR; > + > +/// VBIOS image info > +typedef struct { > + IN AMD_CONFIG_PARAMS StdHeader; ///< Standard > configuration header > + OUT VOID *ImagePtr; ///< Pointer to VBIOS image > + IN PCI_ADDR GfxPciAddress; ///< PCI address of integrated > graphics controller > + IN UINT32 Flags; ///< BIT[0] - special repost requred > +} GFX_VBIOS_IMAGE_INFO; > + > +// > +// CPU MSR Register definitions > +// > +#define SYS_CFG 0xC0010010ul ///< Refer to AMD64 Architecture > Programming manual. > +#define TOP_MEM 0xC001001Aul ///< Refer to AMD64 Architecture > Programming manual. > +#define HWCR 0xC0010015ul ///< Refer to AMD64 Architecture > Programming manual. > + > +/// > +/// VDDP_VDDR Voltage Info for Low Power DIMM > +/// > +typedef struct _VDDP_VDDR_VOLTAGE { > + IN BOOLEAN IsValid; ///< Indicates if daata is valid > + IN UINT8 Voltage; ///< VDDP VDDR Voltage Value > +} VDDP_VDDR_VOLTAGE; > + > +// CPU Build Configuration structures and definitions > + > +#define AMD_AP_MTRR_FIX64k_00000 0x00000250ul ///< Refer to > AMD64 Architecture Programming manual. > +#define AMD_AP_MTRR_FIX16k_80000 0x00000258ul ///< Refer to > AMD64 Architecture Programming manual. > +#define AMD_AP_MTRR_FIX16k_A0000 0x00000259ul ///< Refer to > AMD64 Architecture Programming manual. > +#define AMD_AP_MTRR_FIX4k_C0000 0x00000268ul ///< Refer to > AMD64 Architecture Programming manual. > +#define AMD_AP_MTRR_FIX4k_C8000 0x00000269ul ///< Refer to > AMD64 Architecture Programming manual. > +#define AMD_AP_MTRR_FIX4k_D0000 0x0000026Aul ///< Refer to > AMD64 Architecture Programming manual > +#define AMD_AP_MTRR_FIX4k_D8000 0x0000026Bul ///< Refer to > AMD64 Architecture Programming manual > +#define AMD_AP_MTRR_FIX4k_E0000 0x0000026Cul ///< Refer to > AMD64 Architecture Programming manual > +#define AMD_AP_MTRR_FIX4k_E8000 0x0000026Dul ///< Refer to > AMD64 Architecture Programming manual > +#define AMD_AP_MTRR_FIX4k_F0000 0x0000026Eul ///< Refer to > AMD64 Architecture Programming manual > +#define AMD_AP_MTRR_FIX4k_F8000 0x0000026Ful ///< Refer to > AMD64 Architecture Programming manual > + > +#endif // AGESA_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/AMD.h > b/Platform/AMD/AgesaModulePkg/Include/AMD.h > new file mode 100755 > index 0000000000..062d9e1e1a > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/AMD.h > @@ -0,0 +1,91 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_H_ > +#define AMD_H_ > + > +/// The return status for all AGESA public services. > +/// > +/// Services return the most severe status of any logged event. Status other > than SUCCESS, UNSUPPORTED, and BOUNDS_CHK > +/// will have log entries with more detail. > +/// > +typedef enum { > + AGESA_SUCCESS = 0, ///< 0 - The service completed normally. Info > may be logged. > + AGESA_UNSUPPORTED, ///< 1 - The dispatcher or create struct had > an unimplemented function requested. > + ///< Not logged. > + AGESA_BOUNDS_CHK, ///< 2 - A dynamic parameter was out of > range and the service was not provided. > + ///< Example, memory address not installed, heap buffer > handle not found. > + ///< Not Logged. > + AGESA_SYNC_MORE_DATA, ///< 3 - More data is available from PSP > communications (used in ABL) > + AGESA_SYNC_SLAVE_ASSERT, ///< 4 - Slave is at an ASSERT (used in ABL) > + > + // AGESA_STATUS of greater severity (the ones below this line), always have > a log entry available. > + AGESA_ALERT, ///< 5 - An observed condition, but no loss of > function. See Log. > + AGESA_WARNING, ///< 6 - Possible or minor loss of function. See > Log. > + AGESA_ERROR, ///< 7 - Significant loss of function, boot may be > possible. See Log. > + AGESA_CRITICAL, ///< 8 - Continue boot only to notify user. See > Log. > + AGESA_FATAL, ///< 9 - Halt booting. See Log, however Fatal > errors pertaining to heap problems > + ///< may not be able to reliably produce log events. > + AGESA_OC_FATAL, ///< 10 - Halt booting. Critical Memory > Overclock failure. (used in ABL) > + AGESA_SKIP_ERROR, ///< 11 - Error, Skip init steps. (used in ABL) > + AgesaStatusMax ///< Not a status, for limit checking. > +} AGESA_STATUS; > + > +/** > + Callout method to the host environment. > + > + Callout using a dispatch with appropriate thunk layer, which is determined > by the host environment. > + > + @param[in] Function The specific callout function being invoked. > + @param[in] FcnData Function specific data item. > + @param[in,out] ConfigPtr Reference to Callout params. > +**/ > +typedef AGESA_STATUS (*CALLOUT_ENTRY) ( > + IN UINT32 Function, > + IN UINTN FcnData, > + IN OUT VOID *ConfigPtr > + ); > + > +/// AGESA Structures > + > +/// Extended PCI address format > +typedef struct { > + IN OUT UINT32 Register : 12; ///< Register offset > + IN OUT UINT32 Function : 3; ///< Function number > + IN OUT UINT32 Device : 5; ///< Device number > + IN OUT UINT32 Bus : 8; ///< Bus number > + IN OUT UINT32 Segment : 4; ///< Segment > +} EXT_PCI_ADDR; > + > +/// Union type for PCI address > +typedef union _PCI_ADDR { > + IN UINT32 AddressValue; ///< Formal address > + IN EXT_PCI_ADDR Address; ///< Extended address > +} PCI_ADDR; > + > +/// > +/// The standard header for all AGESA services. > +/// > +typedef struct { > + IN UINT32 ImageBasePtr; ///< The AGESA Image base address. > + IN UINT32 Func; ///< The service desired > + IN UINT32 AltImageBasePtr; ///< Alternate Image location > + IN CALLOUT_ENTRY CalloutPtr; ///< For Callout from AGESA > + IN UINT8 HeapStatus; ///< For heap status from boot time > slide. > + IN UINT64 HeapBasePtr; ///< Location of the heap > + IN OUT UINT8 Reserved[7]; ///< This space is reserved for > future use. > +} AMD_CONFIG_PARAMS; > + > +/// CPUID data received registers format > +typedef struct { > + OUT UINT32 EAX_Reg; ///< CPUID instruction result in EAX > + OUT UINT32 EBX_Reg; ///< CPUID instruction result in EBX > + OUT UINT32 ECX_Reg; ///< CPUID instruction result in ECX > + OUT UINT32 EDX_Reg; ///< CPUID instruction result in EDX > +} CPUID_DATA; > +#endif // AMD_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h > b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h > new file mode 100755 > index 0000000000..534b03d4a7 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h > @@ -0,0 +1,15 @@ > +/** @file > + AMD CPU Register Table Related Functions. > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef CPU_REGISTERS_H_ > +#define CPU_REGISTERS_H_ > + > +#include <CpuRegistersDef.h> > + > +#endif > diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h > b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h > new file mode 100644 > index 0000000000..e086a4c9b1 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h > @@ -0,0 +1,61 @@ > +/** @file > + AMD Psp Directory header file > + > + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_PSP_DIR_H_ > +#define AMD_PSP_DIR_H_ > + > +#pragma pack (push, 1) > +#define PSP_DIRECTORY_HEADER_SIGNATURE 0x50535024ul ///< $PSP > +#define PSP_LV2_DIRECTORY_HEADER_SIGNATURE 0x324C5024ul ///< > $PL2 > + > +/// Enum define various enum type for PSP entry type > +enum _PSP_DIRECTORY_ENTRY_TYPE { > + PSP_REGION_A_DIR = 0x48, ///< PSP entry points to PSP > DIR in Region A > + PSP_REGION_B_DIR = 0x4A, ///< PSP entry points to PSP > DIR in Region B > +}; > + > +/// Define structure for PSP directory > +typedef struct { > + UINT32 Cookie; ///< "$PSP" > + UINT32 Checksum; ///< 32 bit CRC of header items > below and the entire table > + UINT32 TotalEntries; ///< Number of PSP Entries > + UINT32 Reserved; ///< Unused > +} PSP_DIRECTORY_HEADER; > + > +/// Define structure for 32 bits Entry type field > +typedef struct { > + UINT32 Type : 8; ///< Type of PSP Directory entry > + UINT32 SubProgram : 8; ///< Specify the SubProgram > + UINT32 RomId : 2; ///< Specify the ROM ID > + UINT32 Reserved : 14; ///< Reserved > +} PSP_DIRECTORY_ENTRY_TYPE_FIELD; > + > +/// Define union type for 32 bits Entry type field > +typedef union { > + PSP_DIRECTORY_ENTRY_TYPE_FIELD Field; ///< Definition of each > filed > + UINT32 Value; ///< Group it as 32bits Int > +} PSP_DIRECTORY_ENTRY_TYPE; > + > +/// Structure for PSP Entry > +typedef struct { > + PSP_DIRECTORY_ENTRY_TYPE Type; ///< Type of PSP entry; > 32 bit long > + UINT32 Size; ///< Size of PSP Entry in bytes > + UINT64 Location; ///< Location of PSP Entry (byte > offset from start of SPI-ROM) > +} PSP_DIRECTORY_ENTRY; > + > +/// Structure for PSP directory > +typedef struct { > + PSP_DIRECTORY_HEADER Header; ///< PSP directory header > + PSP_DIRECTORY_ENTRY PspEntry[1]; ///< Array of PSP entries > each pointing to a binary in SPI flash > + ///< The actual size of this array comes from > the > + ///< header > (PSP_DIRECTORY.Header.TotalEntries) > +} PSP_DIRECTORY; > + > +#pragma pack (pop) > +#endif //AMD_PSP_DIR_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h > b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h > new file mode 100755 > index 0000000000..faa8d35b1b > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h > @@ -0,0 +1,156 @@ > +/** @file > + AMD CPU Register Table Related Definitions. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef CPU_REGISTERS_DEF_H_ > +#define CPU_REGISTERS_DEF_H_ > + > +#undef BIT0 > +#undef BIT1 > +#undef BIT2 > +#undef BIT3 > +#undef BIT4 > +#undef BIT5 > +#undef BIT6 > +#undef BIT7 > +#undef BIT8 > +#undef BIT9 > +#undef BIT10 > +#undef BIT10 > +#undef BIT11 > +#undef BIT12 > +#undef BIT13 > +#undef BIT14 > +#undef BIT15 > +#undef BIT16 > +#undef BIT17 > +#undef BIT18 > +#undef BIT19 > +#undef BIT20 > +#undef BIT21 > +#undef BIT22 > +#undef BIT23 > +#undef BIT24 > +#undef BIT25 > +#undef BIT26 > +#undef BIT27 > +#undef BIT28 > +#undef BIT29 > +#undef BIT30 > +#undef BIT31 > +#undef BIT32 > +#undef BIT33 > +#undef BIT34 > +#undef BIT35 > +#undef BIT36 > +#undef BIT37 > +#undef BIT38 > +#undef BIT39 > +#undef BIT40 > +#undef BIT41 > +#undef BIT42 > +#undef BIT43 > +#undef BIT44 > +#undef BIT45 > +#undef BIT46 > +#undef BIT47 > +#undef BIT48 > +#undef BIT49 > +#undef BIT40 > +#undef BIT41 > +#undef BIT42 > +#undef BIT43 > +#undef BIT44 > +#undef BIT45 > +#undef BIT46 > +#undef BIT47 > +#undef BIT48 > +#undef BIT49 > +#undef BIT50 > +#undef BIT51 > +#undef BIT52 > +#undef BIT53 > +#undef BIT54 > +#undef BIT55 > +#undef BIT56 > +#undef BIT57 > +#undef BIT58 > +#undef BIT59 > +#undef BIT60 > +#undef BIT61 > +#undef BIT62 > +#undef BIT63 > + > +#define BIT0 0x0000000000000001ull > +#define BIT1 0x0000000000000002ull > +#define BIT2 0x0000000000000004ull > +#define BIT3 0x0000000000000008ull > +#define BIT4 0x0000000000000010ull > +#define BIT5 0x0000000000000020ull > +#define BIT6 0x0000000000000040ull > +#define BIT7 0x0000000000000080ull > +#define BIT8 0x0000000000000100ull > +#define BIT9 0x0000000000000200ull > +#define BIT10 0x0000000000000400ull > +#define BIT11 0x0000000000000800ull > +#define BIT12 0x0000000000001000ull > +#define BIT13 0x0000000000002000ull > +#define BIT14 0x0000000000004000ull > +#define BIT15 0x0000000000008000ull > +#define BIT16 0x0000000000010000ull > +#define BIT17 0x0000000000020000ull > +#define BIT18 0x0000000000040000ull > +#define BIT19 0x0000000000080000ull > +#define BIT20 0x0000000000100000ull > +#define BIT21 0x0000000000200000ull > +#define BIT22 0x0000000000400000ull > +#define BIT23 0x0000000000800000ull > +#define BIT24 0x0000000001000000ull > +#define BIT25 0x0000000002000000ull > +#define BIT26 0x0000000004000000ull > +#define BIT27 0x0000000008000000ull > +#define BIT28 0x0000000010000000ull > +#define BIT29 0x0000000020000000ull > +#define BIT30 0x0000000040000000ull > +#define BIT31 0x0000000080000000ull > +#define BIT32 0x0000000100000000ull > +#define BIT33 0x0000000200000000ull > +#define BIT34 0x0000000400000000ull > +#define BIT35 0x0000000800000000ull > +#define BIT36 0x0000001000000000ull > +#define BIT37 0x0000002000000000ull > +#define BIT38 0x0000004000000000ull > +#define BIT39 0x0000008000000000ull > +#define BIT40 0x0000010000000000ull > +#define BIT41 0x0000020000000000ull > +#define BIT42 0x0000040000000000ull > +#define BIT43 0x0000080000000000ull > +#define BIT44 0x0000100000000000ull > +#define BIT45 0x0000200000000000ull > +#define BIT46 0x0000400000000000ull > +#define BIT47 0x0000800000000000ull > +#define BIT48 0x0001000000000000ull > +#define BIT49 0x0002000000000000ull > +#define BIT50 0x0004000000000000ull > +#define BIT51 0x0008000000000000ull > +#define BIT52 0x0010000000000000ull > +#define BIT53 0x0020000000000000ull > +#define BIT54 0x0040000000000000ull > +#define BIT55 0x0080000000000000ull > +#define BIT56 0x0100000000000000ull > +#define BIT57 0x0200000000000000ull > +#define BIT58 0x0400000000000000ull > +#define BIT59 0x0800000000000000ull > +#define BIT60 0x1000000000000000ull > +#define BIT61 0x2000000000000000ull > +#define BIT62 0x4000000000000000ull > +#define BIT63 0x8000000000000000ull > + > +#define MSR_MMIO_CFG_BASE 0xC0010058ul // MMIO > Configuration Base Address Register > + > +#endif // CPU_REGISTERS_DEF_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h > b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h > new file mode 100644 > index 0000000000..8ede1be838 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h > @@ -0,0 +1,85 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef FCH_REGISTER_COMMON_H_ > +#define FCH_REGISTER_COMMON_H_ > + > +// Misc > +#define R_FCH_ACPI_PM1_STATUS 0x00 > +#define R_FCH_ACPI_PM1_ENABLE 0x02 > +#define R_FCH_ACPI_PM_CONTROL 0x04 > + > +#define FCH_LPC_BUS 0 > +#define FCH_LPC_DEV 20 > +#define FCH_LPC_FUNC 3 > + > +#define ACPI_MMIO_BASE 0xFED80000ul > +#define SMI_BASE 0x200 // DWORD > +#define IOMUX_BASE 0xD00 // BYTE > +#define MISC_BASE 0xE00 > +#define PMIO_BASE 0x300 // DWORD > + > +// > +// FCH LPC Device 0x780E > +// Device 20 (0x14) Func 3 > +// > +#define FCH_LPC_REG48 0x48 // IO/Mem Port Decode Enable > Register 5- RW > +#define FCH_LPC_REG74 0x74 // Alternative Wide IO Range Enable- > W/R > +#define FCH_LPC_REG7C 0x7C // TPM (trusted plant form module) > reg- W/R > +#define FCH_LPC_REGA0 0x0A0 // SPI base address > +#define FCH_LPC_REGB8 0x0B8 > + > +// > +// FCH MMIO Base (SMI) > +// offset : 0x200 > +// > +#define FCH_SMI_REG80 0x80 // SmiStatus0 > +#define FCH_SMI_REG84 0x84 // SmiStatus1 > +#define FCH_SMI_REG88 0x88 // SmiStatus2 > +#define FCH_SMI_REG8C 0x8C // SmiStatus3 > +#define FCH_SMI_REG90 0x90 // SmiStatus4 > +#define FCH_SMI_REG98 0x98 // SmiTrig > +#define FCH_SMI_REGA0 0xA0 > +#define FCH_SMI_REGB0 0xB0 > +#define FCH_SMI_REGC4 0xC4 > + > +// > +// FCH MMIO Base (PMIO) > +// offset : 0x300 > +// > +#define FCH_PMIOA_REG60 0x60 // AcpiPm1EvtBlk > + > +// > +// > +#define FCH_MISC_REG80 0x80 > +// FCH SPI > +// > + > +#define FCH_SPI_BASE_ADDRESS 0xFEC10000 > + > +#define FCH_SPI_MMIO_REG00 0x00 > +#define FCH_SPI_FIFO_PTR_CRL 0x00100000l // > +#define FCH_SPI_BUSY 0x80000000l // > +#define FCH_SPI_MMIO_REG1D 0x1D // > +#define FCH_SPI_MMIO_REG20 0x20 > +#define FCH_SPI_MMIO_REG22 0x22 // > +#define FCH_SPI_MMIO_REG30 0x30 // > +#define FCH_SPI_R2VAL24 0x00000001l // > +#define FCH_SPI_R2VAL25 0x00000002l // > +#define FCH_SPI_R2MSK24 0x00000004l // > +#define FCH_SPI_R2MSK25 0x00000008l // > +#define FCH_SPI_MMIO_REG45_CMDCODE 0x45 // > +#define FCH_SPI_MMIO_REG47_CMDTRIGGER 0x47 // > +#define FCH_SPI_MMIO_REG48_TXBYTECOUNT 0x48 // > +#define FCH_SPI_MMIO_REG4B_RXBYTECOUNT 0x4B // > +#define FCH_SPI_MMIO_REG4C_SPISTATUS 0x4C // > +#define FCH_SPI_MMIO_REG5C_Addr32_Ctrl3 0x5C // > +#define FCH_SPI_SPIROM_PAGE_MASK 0xFF // > +#define FCH_SPI_MMIO_REG80_FIFO 0x80 // > + > +#endif /* FCH_REGISTER_COMMON_H_ */ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Filecode.h > b/Platform/AMD/AgesaModulePkg/Include/Filecode.h > new file mode 100644 > index 0000000000..726479d79f > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Filecode.h > @@ -0,0 +1,31 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +/* $NoKeywords:$ */ > + > +/** > + * @file > + * > + * Collectively assign unique filecodes for assert and debug to each source > file. > + * > + * Publish values for decorated filenames, which can be used for > + * ASSERT and debug support using a preprocessor define like: > + * @n <tt> _#define FILECODE MY_C_FILENAME_FILECODE </tt> @n > + * This file serves as a reference for debugging to associate the code and > filename. > + * > + * @xrefitem bom "File Content Label" "Release Content" > + * @e project: AGESA > + * @e sub-project: Include > + * @e _$Revision: 312538 $ @e \$Date: 2015-02-09 16:53:54 +0800 > (Mon, 09 Feb 2015) $ > + */ > + > +#ifndef _FILECODE_H_ > +#define _FILECODE_H_ > + > +#define UNASSIGNED_FILE_FILECODE (0xFFFF) > + > +#endif // _FILECODE_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Gnb.h > b/Platform/AMD/AgesaModulePkg/Include/Gnb.h > new file mode 100755 > index 0000000000..ddc9309d3d > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Gnb.h > @@ -0,0 +1,14 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef GNB_H_ > +#define GNB_H_ > + > +#define PVOID UINT64 > + > +#endif // GNB_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h > b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h > new file mode 100644 > index 0000000000..192e0d6a8b > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h > @@ -0,0 +1,521 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef GNBDXIO_H_ > +#define GNBDXIO_H_ > + > +#pragma pack (push, 1) > + > +#include <AGESA.h> > +#include <Gnb.h> > + > +#define MAX_NUMBER_OF_COMPLEXES 16 > + > +#define DESCRIPTOR_TERMINATE_GNB 0x40000000ull > +#define DESCRIPTOR_TERMINATE_TOPOLOGY 0x20000000ull > +#define DESCRIPTOR_ALLOCATED 0x10000000ull > +#define DESCRIPTOR_PLATFORM 0x08000000ull > +#define DESCRIPTOR_COMPLEX 0x04000000ull > +#define DESCRIPTOR_SILICON 0x02000000ull > +#define DESCRIPTOR_PCIE_WRAPPER 0x01000000ull > +#define DESCRIPTOR_PCIE_ENGINE 0x00800000ull > +#define DESCRIPTOR_CXL_ENGINE 0x00200000ull > + > +#define SILICON_CXL_CAPABLE 0x00008000ull > + > +#define DESCRIPTOR_ALL_WRAPPERS (DESCRIPTOR_PCIE_WRAPPER) > +#define DESCRIPTOR_ALL_ENGINES (DESCRIPTOR_PCIE_ENGINE | > DESCRIPTOR_CXL_ENGINE) > + > +#define DESCRIPTOR_ALL_TYPES (DESCRIPTOR_ALL_WRAPPERS | > DESCRIPTOR_ALL_ENGINES | DESCRIPTOR_SILICON | DESCRIPTOR_PLATFORM) > +#define PcieLibGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? > NULL : ((Descriptor->Header.DescriptorFlags & > DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) > + > +typedef UINT16 PCIE_ENGINE_INIT_STATUS; > + > +/// > +/// Engine Configuration > +/// > +typedef struct { > + IN UINT8 EngineType; ///< Engine type > + ///< 0 - Ignore engine configuration > + ///< 1 - PCIe port > + IN UINT16 StartLane; ///< Start Lane ID (in reversed > configuration StartLane > EndLane) > + ///< Refer to lane descriptions and > supported configurations in BKDG > + IN UINT16 EndLane; ///< End lane ID (in reversed > configuration StartLane > EndLane) > + ///< Refer to lane descriptions and > supported configurations in BKDG > +} PCIE_ENGINE; > + > +/// > +/// PCIe port misc extended controls > +/// > +typedef struct { > + IN UINT8 SbLink : 1; ///< PCIe link type > + ///< 0 - General purpose port > + ///< 1 - Port connected to SB > + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management > Support > + ///< 0 - Clock Power Management not > configured > + ///< 1 - Clock Power Management > configured according to PCIe device capability > + IN UINT8 CsLink : 1; ///< PCIe link type > + ///< 0 - General purpose port > + ///< 1 - Port connected to chipset > + IN UINT8 Reserved0 : 5; ///< Unused space > +} PORT_MISC_CONTROL; > + > +/// > +/// PCIe port configuration data > +/// > +typedef struct { > + IN UINT8 PortPresent; ///< Enable PCIe port for > initialization. > + IN UINT8 FunctionNumber : 3; ///< Reserved for future use > + IN UINT8 DeviceNumber : 5; ///< PCI Device number for > port. > + ///< 0 - Native port device number > + ///< N - Port device number (See > available configurations in BKDG > + IN UINT8 LinkSpeedCapability : 4; ///< PCIe link speed/ > + ///< 0 - Maximum supported by silicon > + ///< 1 - Gen1 > + ///< 2 - Gen2 > + ///< 3 - Gen3 > + IN UINT8 LinkAspm : 4; ///< ASPM control. (see > AgesaPcieLinkAspm for additional option to control ASPM) > + ///< 0 - Disabled > + ///< 1 - L0s only > + ///< 2 - L1 only > + ///< 3 - L0s and L1 > + IN UINT8 LinkHotplug; ///< Hotplug control. > + ///< 0 - Disabled > + ///< 1 - Basic > + ///< 2 - Server > + ///< 3 - Enhanced > + IN UINT16 SlotNum; ///< Physical Slot Number > + IN PORT_MISC_CONTROL MiscControls; ///< Misc extended > controls > + IN UINT8 Reserved1; ///< Reserved for future use > +} PORT_DATA; > + > +typedef struct { > + UINT8 LinkSpeed; > + UINT8 MaxPayloadSupport; > + UINT8 AspmCapability; > + UINT8 PciPmL1_1; > + UINT8 PciPmL1_2; > + UINT8 AspmL1_1; > + UINT8 AspmL1_2; > + UINT8 EsmSupport; > + UINT8 LtrSupport; > + UINT8 SurpriseDownErrorReport; > + UINT8 TenBitTagSupport; > + UINT8 AriForwarding; > + UINT8 AcsSupport; > + UINT8 AcsSourceValidation; > + UINT8 AcsTranslationBlocking; > + UINT8 AcsP2pRequestRedirect; > + UINT8 AcsP2pCompletionRedirect; > + UINT8 AcsUpstreamForwarding; > + UINT8 AcsP2pEgressControl; > + UINT8 AcsDirectTranslatedP2p; > + UINT8 LaneMargining; > + UINT8 DataLinkFeature; > + UINT8 DownstreamPortContainment; > + UINT8 AdvancedErrorReporting; > + UINT8 ECRCSupport; > + UINT8 MulticastEnable; > + UINT8 NativePCIeEnclosureManagement; > + UINT8 Capability1Address; > + UINT8 Capability1Data; > + UINT8 Capability2Address; > + UINT8 Capability2Data; > + UINT8 Capability3Address; > + UINT8 Capability3Data; > + UINT8 Capability4Address; > + UINT8 Capability4Data; > +} PORT_CAPABILITIES; > + > +/// > +/// PCIe PORT_FEATURES > +/// > +typedef struct { > + UINT8 LinkSpeedControl; > + UINT8 MaxPayloadSizeControl; > + UINT8 ESMControl; > + UINT8 LTRControl; > + UINT8 DataLinkFeatureExchangeControl; > + UINT8 TenBitTagControl; > + UINT8 ARIControl; > + UINT8 ACSControl; > + UINT8 RxLaneMarginingControl; > + UINT8 DynLanesPwrState; > + UINT8 L1PowerDown; > + UINT8 L11PowerDown; > + UINT8 L12PowerDown; > + UINT8 AutoSpdChngEn; > + UINT8 TurnOffUnusedLanes; > +} PORT_FEATURES; > + > +typedef struct { > + UINT8 SpcGen1 : 1; ///< SPC Mode 2P5GT > + UINT8 SpcGen2 : 1; ///< SPC Mode 5GT > + UINT8 SpcGen3 : 2; ///< SPC Mode 8GT > + UINT8 SpcGen4 : 2; ///< SPC Mode 16GT > + UINT8 SpcGen5 : 2; ///< SPC Mode 32GT > +} SPC_MODE; > + > +typedef struct { > + UINT32 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset > + UINT32 DsRxPresetHint : 3; ///< Gen3 Downstream Rx > Preset Hint > + UINT32 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset > + UINT32 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset > Hint > + UINT32 LcPresetMask8Gt : 10; ///< Gen3 Preset Mask > + UINT32 LcFapeEnable8GT : 1; ///< Gen3 FapeEnable > + UINT32 UNUSED2 : 7; ///< Currently unassigned - for > alignment > +} GEN3_LANE_CNTL; > + > +typedef struct { > + UINT32 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset > + UINT32 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset > + UINT32 LcPresetMask16Gt : 10; ///< Gen4 Preset Mask > + UINT32 LcFapeEnable16GT : 1; ///< Gen4 FapeEnable > + UINT32 UNUSED3 : 13; ///< Currently unassigned - for > alignment > +} GEN4_LANE_CNTL; > + > +typedef struct { > + UINT32 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset > + UINT32 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset > + UINT32 LcPresetMask32Gt : 10; ///< Gen5 Preset Mask > + UINT32 LcFapeEnable32GT : 1; ///< Gen5 FapeEnable > + UINT32 PrecodeRequest : 1; ///< Precoding Request > + UINT32 AdvertiseEqToHiRate : 1; ///< Advertise EQ To High > Rate Support > + UINT32 UNUSED4 : 11; ///< Currently unassigned - for > alignment > +} GEN5_LANE_CNTL; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor0 : 5; ///< PostCursor0 > + UINT32 LcFapeReqPreCursor0 : 4; ///< PreCursor0 > + UINT32 LcFapeReqPostCursor1 : 5; ///< PostCursor1 > + UINT32 LcFapeReqPreCursor1 : 4; ///< PreCursor1 > + UINT32 LcFapeReqPostCursor2 : 5; ///< PostCursor2 > + UINT32 LcFapeReqPreCursor2 : 4; ///< PreCursor2 > + UINT32 UNUSED6 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_0; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor3 : 5; ///< PostCursor3 > + UINT32 LcFapeReqPreCursor3 : 4; ///< PreCursor3 > + UINT32 LcFapeReqPostCursor4 : 5; ///< PostCursor4 > + UINT32 LcFapeReqPreCursor4 : 4; ///< PreCursor4 > + UINT32 LcFapeReqPostCursor5 : 5; ///< PostCursor5 > + UINT32 LcFapeReqPreCursor5 : 4; ///< PreCursor5 > + UINT32 UNUSED7 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_1; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor6 : 5; ///< PostCursor6 > + UINT32 LcFapeReqPreCursor6 : 4; ///< PreCursor6 > + UINT32 LcFapeReqPostCursor7 : 5; ///< PostCursor7 > + UINT32 LcFapeReqPreCursor7 : 4; ///< PreCursor7 > + UINT32 LcFapeReqPostCursor8 : 5; ///< PostCursor8 > + UINT32 LcFapeReqPreCursor8 : 4; ///< PreCursor8 > + UINT32 UNUSED8 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_2; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor9 : 5; ///< PostCursor9 > + UINT32 LcFapeReqPreCursor9 : 4; ///< PreCursor9 > + UINT32 LcFapeReqPostCursor10 : 5; ///< PostCursor10 > + UINT32 LcFapeReqPreCursor10 : 4; ///< PreCursor10 > + UINT32 LcFapeReqPostCursor11 : 5; ///< PostCursor11 > + UINT32 LcFapeReqPreCursor11 : 4; ///< PreCursor11 > + UINT32 UNUSED9 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_3; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor12 : 5; ///< PostCursor12 > + UINT32 LcFapeReqPreCursor12 : 4; ///< PreCursor12 > + UINT32 LcFapeReqPostCursor13 : 5; ///< PostCursor13 > + UINT32 LcFapeReqPreCursor13 : 4; ///< PreCursor13 > + UINT32 LcFapeReqPostCursor14 : 5; ///< PostCursor14 > + UINT32 LcFapeReqPreCursor14 : 4; ///< PreCursor14 > + UINT32 UNUSED10 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_4; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor15 : 5; ///< PostCursor15 > + UINT32 LcFapeReqPreCursor15 : 4; ///< PreCursor15 > + UINT32 LcFapeReqPostCursor16 : 5; ///< PostCursor16 > + UINT32 LcFapeReqPreCursor16 : 4; ///< PreCursor16 > + UINT32 LcFapeReqPostCursor17 : 5; ///< PostCursor17 > + UINT32 LcFapeReqPreCursor17 : 4; ///< PreCursor17 > + UINT32 UNUSED11 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_5; > + > +typedef struct { > + UINT32 LcFapeReqPostCursor18 : 5; ///< PostCursor18 > + UINT32 LcFapeReqPreCursor18 : 4; ///< PreCursor18 > + UINT32 LcFapeReqPostCursor19 : 5; ///< PostCursor19 > + UINT32 LcFapeReqPreCursor19 : 4; ///< PreCursor19 > + UINT32 LcFapeReqPostCursor20 : 5; ///< PostCursor20 > + UINT32 LcFapeReqPreCursor20 : 4; ///< PreCursor20 > + UINT32 UNUSED12 : 5; ///< Currently unassigned - for > alignment > +} LC_FAPE_GROUP_6; > + > +/// > +/// PCIe port configuration info > +/// > +typedef struct { > + PORT_DATA PortData; ///< Port data > + UINT8 StartCoreLane; ///< Start Core Lane > + UINT8 EndCoreLane; ///< End Core lane > + UINT8 NativeDevNumber : 5; ///< Native PCI device number > of the port > + UINT8 NativeFunNumber : 3; ///< Native PCI function > number of the port > + UINT8 CoreId : 4; ///< PCIe core ID > + UINT8 PortId : 4; ///< Port ID on wrapper > + PCI_ADDR Address; ///< PCI address of the port > + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID > + UINT8 IsBmcLocation : 1; ///< Port Location of BMC > + UINT8 LogicalBridgeId; ///< Logical Bridge ID > + UINT8 SlotPowerLimit; ///< Slot Power Limit > + UINT8 MaxPayloadSize; ///< Max_Payload_Size > + > + UINT8 TXDeEmphasis : 4; ///< TX De-emphasis > + UINT8 TXMargin : 3; ///< TX Margin > + UINT8 UNUSED1 : 1; ///< Currently unassigned - for > alignment > + > + PORT_CAPABILITIES PortCapabilities; ///< Port Capabilities CBS > + > + SPC_MODE SpcMode; > + > + GEN3_LANE_CNTL LaneEqualizationCntl; > + GEN4_LANE_CNTL Gen4LaneEqualizationCntl; > + GEN5_LANE_CNTL Gen5LaneEqualizationCntl; > + > + UINT8 LowerSkpOsGenSup; ///< Controls > LOWER_SKP_OS_GEN_SUPPORT > + UINT8 LowerSkpOsRcvSup; ///< Controls > LOWER_SKP_OS_RCV_SUPPORT > + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation > interval > + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval > Selection Mode > + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for > SKP ordered set interval when generated based on elasticity buffer pointer > slip feedback from PCS > + UINT8 UNUSED4 : 1; ///< Currently unassigned - for > alignment > + UINT8 SRIS_SRNS : 1; ///< SRIS SRNS > + UINT8 SRIS_LowerSKPSupport : 1; ///< SRIS Lower SKP Support > + UINT8 CcixControl : 1; ///< Bit to enable/disable ESM > + UINT8 CxlControl : 1; ///< Bit to enable CXL Capability > + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE > port > + UINT8 SlotPowerLimitScale : 2; ///< Slot Power Limit Scale > + UINT8 UNUSED5 : 1; ///< Currently unassigned - for > alignment > + > + UINT8 RxMarginPersistence : 1; ///< Bit to enable/disable Rx > Margin persistence mode > + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set > + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set > + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set > + UINT8 TxVetting : 1; ///< Gen4 Tx Vetting > + UINT8 RxVetting : 1; ///< Gen4 Rx Vetting > + UINT8 TxVettingGen5 : 1; ///< Gen5 Tx Vetting > + UINT8 RxVettingGen5 : 1; ///< Gen5 Rx Vetting > + > + UINT8 IsMasterPLL : 1; ///< IsMasterPLL > + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed > + UINT8 DlfCapDisable : 1; ///< DLF Capability 1:Disable > 0:Enable > + UINT8 DlfExchangeDisable : 1; ///< DLF Exchange 1:Disable > 0:Enable > + UINT8 InvertPolarity : 1; ///< Invert RX Polarity > + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity > + > + UINT8 EqSearchMode : 2; ///< Equalization Search Mode > + UINT8 BypassGen3EQ : 1; ///< BypassGen3EQ > + UINT8 DisGen3EQPhase : 1; ///< Disable Gen3 EQ Phase2/3 > + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset value > + > + UINT8 EqSearchModeGen4 : 2; ///< Equalization Search > Mode for Gen4 > + UINT8 BypassGen4EQ : 1; ///< Gen4 Bypass phase3 EQ > + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ > + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset value > + UINT8 EqSearchModeGen5 : 2; ///< Equalization Search > Mode for Gen5 > + UINT8 BypassGen5EQ : 1; ///< Gen5 Bypass phase3 EQ > + UINT8 DisGen5EQPhase : 1; ///< Gen5 Bypass phase2/3 EQ > + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset value > + > + UINT16 PsppPolicyDC; ///< Pspp Policy DC > + UINT16 PsppPolicyAC; ///< Pspp Policy AC > + UINT8 PsppDeviceType; ///< Pspp Device Type > + > + LC_FAPE_GROUP_0 LcFapeSettingsGroup0; > + LC_FAPE_GROUP_1 LcFapeSettingsGroup1; > + LC_FAPE_GROUP_2 LcFapeSettingsGroup2; > + LC_FAPE_GROUP_3 LcFapeSettingsGroup3; > + LC_FAPE_GROUP_4 LcFapeSettingsGroup4; > + LC_FAPE_GROUP_5 LcFapeSettingsGroup5; > + LC_FAPE_GROUP_6 LcFapeSettingsGroup6; > + > + UINT8 ForceSteering : 1; ///< Steering is forced > + UINT8 EsmUsTxPreset : 4; ///< ESM Upstream Tx Preset > + UINT8 UNUSED13 : 3; ///< Currently unassigned - for > alignment > + > + // Used by DXE > + PORT_FEATURES PortFeatures; ///< Port Features CBS > + UINT8 EsmSpeedBump; ///< Speed bump for ESM > + UINT8 I2CMuxInfo; ///< First I2c Mux on Bus > + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:SRIS 2:SRNS > 3:SRNS in SRIS 0xF:Auto > + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect > mode 0:Disable 1:Enable 0xF:Auto > + UINT8 ClkReq : 4; ///< ClkReq:[0:3] > + UINT8 EqPreset : 4; ///< EqPreset:[4:7] > + UINT8 LinkAspmL1_1 : 1; ///< Enable PM L1 SS L1.1 > + UINT8 LinkAspmL1_2 : 1; ///< Enable PM L1 SS L1.2 > + UINT8 EsmControl : 1; ///< Bit to enable/disable ESM > + UINT8 EsmDsTxPreset : 4; ///< ESM Downstream Tx Preset > + UINT8 ClkReqFilterEn : 1; ///< Controls filtering of CLKREQb > signal in LC in order to avoid false L1 substate entries/exits. > +} PCIE_PORT_CONFIG; > + > +/// > +/// CXL port configuration info > +/// > +typedef struct { > + PORT_DATA PortData; ///< Port data > + UINT8 StartCoreLane; ///< Start Core Lane > + UINT8 EndCoreLane; ///< End Core lane > + UINT8 NativeDevNumber : 5; ///< Native PCI device number > of the port > + UINT8 NativeFunNumber : 3; ///< Native PCI function > number of the port > + UINT8 CoreId : 4; ///< PCIe core ID > + UINT8 PortId : 4; ///< Port ID on wrapper > + PCI_ADDR Address; ///< PCI address of the port > + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID > + UINT8 UNUSED0 : 1; ///< Currently unassigned - for > alignment > + UINT8 LogicalBridgeId; ///< Logical Bridge ID > + UINT8 SlotPowerLimit; ///< Slot Power Limit > + UINT8 MaxPayloadSize; ///< Max_Payload_Size > + > + UINT8 CxlIndex; > + UINT8 CxlDeviceType : 2; ///< Type of CXL device > connected > + UINT8 CxlVersion : 2; ///< Version of CXL device > connected (1=CXL1.1, 2=CXL2.0) > + UINT8 IsCxlScanned : 1; ///< Indicates if the CXL device has > been scanned > + UINT8 ReportToMpioinDxe : 1; ///< Indicates if the CXL info > needs to be reported to MPIO in DXE > + UINT8 UNUSED1 : 2; ///< Currently unassigned - for > alignment > + > + UINT32 UsRcrb; ///< Upstream Port RCRB address > + UINT32 DsRcrb; ///< Downstream Port RCRB address > + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 > + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 > + UINT32 Mmio32Base; > + UINT32 Mmio32Size; > + UINT64 Mmio64Base; > + UINT64 Mmio64Size; > + UINT32 Mmio32Gran; > +} PCIE_CXL_CONFIG; > + > +/// > +/// Descriptor header > +/// > +typedef struct { > + UINT32 DescriptorFlags; ///< Descriptor flags > + UINT16 Parent; ///< Offset of parent descriptor > + UINT16 Peer; ///< Offset of the peer descriptor > + UINT16 Child; ///< Offset of the list of child > descriptors > +} PCIE_DESCRIPTOR_HEADER; > + > +/// > +/// Engine configuration data > +/// > +typedef struct { > + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor header > + PCIE_ENGINE EngineData; ///< Engine Data > + PCIE_ENGINE_INIT_STATUS InitStatus; ///< Initialization Status > + UINT8 Scratch; ///< Scratch pad > + union { > + PCIE_PORT_CONFIG Port; ///< PCIe port configuration > data > + PCIE_CXL_CONFIG Cxl; ///< CXL Configuration data > + } Type; > +} PCIE_ENGINE_CONFIG; > + > +/// > +/// Wrapper configuration data > +/// > +typedef struct { > + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header > + UINT8 WrapId; ///< Wrapper ID > + UINT8 CcixCoreConfig; ///< Ccix CORE Configuration > + UINT8 StartPhyLane; ///< Start PHY Lane > + UINT8 EndPhyLane; ///< End PHY Lane > + UINT8 StartDxioLane; ///< Start Dxio Lane (Translated) > + UINT8 EndDxioLane; ///< End Dxio Lane (Translated) > + struct { > + UINT8 PowerOffUnusedLanes : 1; ///< Power Off unused lanes > + UINT8 PowerOffUnusedPlls : 1; ///< Power Off unused Plls > + UINT8 ClkGating : 1; ///< TXCLK gating > + UINT8 LclkGating : 1; ///< LCLK gating > + UINT8 TxclkGatingPllPowerDown : 1; ///< TXCLK clock gating PLL > power down > + UINT8 PllOffInL1 : 1; ///< PLL off in L1 > + UINT8 AccessEncoding : 1; ///< Reg access encoding > + UINT8 CoreReversed : 1; ///< Indicates lanes are reversed > in package connection > + } Features; > + UINT8 MasterPll; ///< Bitmap of master PLL > + UINT32 AcsSupport : 1; ///< Acs Support > + UINT32 LtrSupport : 1; ///< LTR Support > + UINT32 AriForwarding : 1; ///< ARI Forwarding > + UINT32 LaneMargining : 1; ///< Lane Margining > + UINT32 NativePCIeEnclosureManagement : 1; ///< NPEM > + UINT32 DownstreamPortContainment : 1; ///< Downstream port > containment > + UINT32 AdvancedErrorReporting : 1; ///< Advacned Error > Reporting > + UINT32 ECRCSupport : 2; ///< ECRC Capability > + UINT32 Reserved : 23; ///< Reserved bits > +} PCIE_WRAPPER_CONFIG; > + > +/// > +/// Silicon configuration data > +/// > +typedef struct { > + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header > + UINT8 SocketId; ///< Socket ID > + UINT8 DieNumber; ///< Module ID > + UINT8 RBIndex; ///< Physical Root Bridge > + UINT8 InstanceId; ///< Logical Instance Identifier > + PCI_ADDR Address; ///< PCI address of GNB host bridge > + UINT16 StartLane; ///< Start Lane of this node > + UINT16 EndLane; ///< End Lane of this node > + UINT8 BusNumberLimit; ///< Last Bus Number assigned to > this node > + UINT8 SbPresent : 1; ///< Set to 1 if FCH connected to > this NBIO > + UINT8 SmuPresent : 1; ///< Set to 1 if SMU connected to > this NBIO > + UINT8 MP_Instance : 6; ///< MP Instance > + UINT8 LogicalRBIndex; ///< Logical Root Bridge > + UINT8 NumEngineDesc; ///< Total number of lane > bifurcation descriptors > +} PCIE_SILICON_CONFIG; > + > +typedef PCIE_SILICON_CONFIG GNB_HANDLE; > + > +/// > +/// Complex configuration data > +/// > +typedef struct { > + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header > + UINT8 NodeId; ///< Processor Node ID > + UINT8 Reserved; ///< For alignment > +} PCIE_COMPLEX_CONFIG; > + > +/// > +/// PCIe platform configuration info > +/// > +typedef struct { > + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor > Header > + PVOID Reserved1; ///< Reserved > + UINT32 Reserved2; ///< Reserved > + UINT32 PhyConfigData; ///< Phy Configuration Data > + UINT32 Reserved3; ///< Reserved > + UINT32 Reserved4; ///< Reserved > + UINT32 PsppTuningParams; ///< Tuning parameters > for PSPP > + UINT32 PsppTuningParams2; ///< Tuning parameters 2 > for PSPP > + UINT8 Reserved5; ///< Reserved > + UINT8 PsppPolicy; ///< PSPP policy > + UINT8 Reserved6; ///< Reserved > + UINT8 RootBridgesPerSocket; ///< Number of root > bridges per socket > + PCIE_COMPLEX_CONFIG ComplexList[MAX_NUMBER_OF_COMPLEXES]; > ///< Complex > +} PCIE_PLATFORM_CONFIG; > + > +/// > +/// PCIe Engine Description > +/// > +typedef struct { > + UINT32 Flags; ///< Descriptor flags > + ///< Bit31 - last descriptor on wrapper > + ///< Bit30 - Descriptor allocated for PCIe > port > + PCIE_ENGINE EngineData; ///< Engine Data > +} PCIE_ENGINE_DESCRIPTOR; > +#pragma pack (pop) > + > +#endif // GNBDXIO_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h > b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h > new file mode 100644 > index 0000000000..90f52cca7b > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h > @@ -0,0 +1,18 @@ > +/** @file > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _GNBREGISTERSRS_H_ > +#define _GNBREGISTERSRS_H_ > + > +#include "GnbRegistersRS/IOHC.h" > + > +#ifndef NBIO_SPACE > +#define NBIO_SPACE(HANDLE, ADDRESS) (ADDRESS + (HANDLE->RBIndex > << 20)) > +#endif > + > +#endif /*_GNBREGISTERSRS_H_*/ > diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h > b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h > new file mode 100644 > index 0000000000..b1a95237de > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h > @@ -0,0 +1,22 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _IOHC_H_ > +#define _IOHC_H_ > + > +// Bitfield Description : DBG MMIO enable. > +#define DBG_BASE_ADDR_LO_DBG_MMIO_EN_OFFSET 0 > + > +// Bitfield Description : Locks the DBG MMIO address range and enable until > the next warm reset. > +#define DBG_BASE_ADDR_LO_DBG_MMIO_LOCK_OFFSET 1 > + > +#define SMN_IOHUB0NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS > 0x13b102f0UL > +#define IOAPIC_BASE_ADDR_LO_IOAPIC_BASE_ADDR_LO_MASK 0xffffff00 > +#define SMN_IOHUB1NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS > 0x13c102f0UL > + > +#endif /* _IOHC_H_ */ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h > b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h > new file mode 100644 > index 0000000000..f5cc5e2228 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h > @@ -0,0 +1,31 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef GNB_PCIE_HOB_INFO_H_ > +#define GNB_PCIE_HOB_INFO_H_ > + > +#define _GNB_PCIE_HOB_INFO_GUID \ > +{ \ > + 0x3eb1d90, 0xce14, 0x40d8, 0xa6, 0xba, 0x10, 0x3a, 0x8d, 0x7b, 0xd3, > 0x2d \ > +} > +extern EFI_GUID gGnbPcieHobInfoGuid; > + > +#pragma pack (push, 1) > +#define MAX_NUMBER_OF_CORES_PER_COMPLEX 3 > +#define MAX_NUMBER_OF_PORTS_PER_COMPLEX 22 > + > +/// PCIe information HOB data > +typedef struct _GNB_PCIE_INFORMATION_DATA_HOB { > + EFI_HOB_GUID_TYPE EfiHobGuidType; ///< GUID Hob type > structure > + PCIE_PLATFORM_CONFIG PciePlatformConfigHob; ///< Platform Config > Structure > + UINT32 ComplexConfigs; ///< Allocation for Max Complex > Structure suported > +} GNB_PCIE_INFORMATION_DATA_HOB; > + > +#pragma pack (pop) > + > +#endif /* GNB_PCIE_HOB_INFO_H_ */ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h > new file mode 100644 > index 0000000000..dc773737b9 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h > @@ -0,0 +1,16 @@ > +/** @file > + Contains interface to the AMD AGESA library. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_BASE_LIB_H_ > +#define AMD_BASE_LIB_H_ > + > +#include "Uefi.h" > +#include "AMD.h" > + > +#endif // AMD_BASE_LIB_H_ > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h > b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h > new file mode 100644 > index 0000000000..9d9892aa30 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h > @@ -0,0 +1,43 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +/* $NoKeywords:$ */ > + > +/** > + * @file > + * > + * PSP Mailbox related functions Prototype definition > + * > + * > + * @xrefitem bom "File Content Label" "Release Content" > + * @e project: AGESA > + * @e sub-project: PSP > + * @e \$Revision: 312133 $ @e \$Date: 2015-02-03 02:47:45 +0800 (Tue, > 03 Feb 2015) $ > + */ > + > +#ifndef _PSP_MBOX_H_ > +#define _PSP_MBOX_H_ > + > +/** > + * @brief Bios send these commands to PSP to grant dTPM status and event > log > + * > + * @param[out] DesiredConfig dTPM configuration requested > + * @param[out] ConfigStatus 0 - success. non-zero failure. > + * @param[in,out] LogDataSize Size of LogData buffer > + * @param[out] LogData Point to allocated event log buffer > + * > + * @retval EFI_STATUS 0: Success, NonZero Error > + */ > +EFI_STATUS > +PspMboxGetDTPMData ( > + OUT UINT32 *DesiredConfig, > + OUT UINT32 *ConfigStatus, > + IN OUT UINT32 *LogDataSize, > + OUT VOID *LogData > + ); > + > +#endif //_PSP_MBOX_H_ > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h > new file mode 100644 > index 0000000000..51935f413a > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h > @@ -0,0 +1,22 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef BASE_FABRIC_TOPOLOGY_LIB_H_ > +#define BASE_FABRIC_TOPOLOGY_LIB_H_ > + > +UINTN > +FabricTopologyGetNumberOfProcessorsPresent ( > + VOID > + ); > + > +UINTN > +FabricTopologyGetNumberOfRootBridgesOnSocket ( > + IN UINTN Socket > + ); > + > +#endif // BASE_FABRIC_TOPOLOGY_LIB_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h > new file mode 100644 > index 0000000000..cae3aff9b3 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h > @@ -0,0 +1,16 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _FCH_BASE_LIB_H_ > +#define _FCH_BASE_LIB_H_ > + > +#include <Library/IoLib.h> > +#include <Library/PciLib.h> > +#include <Library/BaseLib.h> > + > +#endif > diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h > new file mode 100644 > index 0000000000..345e39adce > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h > @@ -0,0 +1,413 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _FCH_ESPI_CMD_LIB_H_ > +#define _FCH_ESPI_CMD_LIB_H_ > + > +#include <Uefi/UefiBaseType.h> > + > +#define MAX_ESPI_RETRY 100000ul > +// > +// Cycle Type > +// > +#define CYCLE_TYPE_FLASH_READ 0 > +#define CYCLE_TYPE_FLASH_WRITE 1 > +#define CYCLE_TYPE_FLASH_ERASE 2 > +#define CYCLE_TYPE_RPMC_OP1 3 > +#define CYCLE_TYPE_RPMC_OP2 4 > + > +// RPMC OP1/OP2 Command Payload Max Length (512 Bits) > +#define RPMC_CMD_PAYLOAD_MAX_LEN 0x40 > + > +// > +// Master Registers > +// > +#define SET_CONFIGURATION 0 > +#define GET_CONFIGURATION 1 > +#define IN_BAND_RESET 2 > +#define PC_MSG_DOWN_STREAM 4 > +#define VM_DOWN_STREAM 5 > +#define OOB_DOWN_STREAM 6 > +#define FA_DOWN_STREAM 7 > + > +// ESPIx00 > +#define DNCMD_STATUS BIT3 > + > +// ESPIx2C Master Capability > +#define MASTER_FA_SUPPORT BIT0 > +#define MASTER_OOB_SUPPORT BIT1 > +#define MASTER_VW_SUPPORT BIT2 > +#define MASTER_PERIPHERAL_SUPPORT BIT3 > + > +// ESPIx68 Slave0 Configuration > +#define SLAVE_FA_ENABLE BIT0 > +#define SLAVE_OOB_ENABLE BIT1 > +#define SLAVE_VW_ENABLE BIT2 > +#define SLAVE_PC_ENABLE BIT3 > + > +/// eSPIx00 eSPI Software Specific Register 0 > +#define ESPI_DN_TXHDR_0 0x00 > +typedef union { > + struct { > + UINT32 SWCommandType : 3; > + UINT32 CommandStatus : 1; > + UINT32 PutFlashNpTranActive : 1; > + UINT32 Reserved : 3; > + UINT32 DnCmdHdata0 : 8; > + UINT32 DnCmdHdata1 : 8; > + UINT32 DnCmdHdata2 : 8; > + } Field; > + UINT32 Value; > +} ESPIx00_DN_TXHDR0; > + > +/// eSPIx04 eSPI Software Specific Register 1 > +#define ESPI_DN_TXHDR_1 0x04 > +typedef union { > + struct { > + UINT32 DnCmdHdata3 : 8; > + UINT32 DnCmdHdata4 : 8; > + UINT32 DnCmdHdata5 : 8; > + UINT32 DnCmdHdata6 : 8; > + } Field; > + UINT32 Value; > +} ESPIx04_DN_TXHDR1; > + > +#define ESPI_DN_TXHDR_2 0x08 > +typedef union { > + struct { > + UINT32 DnCmdHdata7 : 8; > + UINT32 Reserved : 24; > + } Field; > + UINT32 Value; > +} ESPIx08_DN_TXHDR2; > + > +#define ESPI_DN_TXDATA_PORT 0x0C > +typedef union { > + struct { > + UINT32 DnTxData0 : 8; > + UINT32 DnTxData1 : 8; > + UINT32 DnTxData2 : 8; > + UINT32 DnTxData3 : 8; > + } Field; > + UINT32 Value; > +} ESPIx0C_DN_TXDATA_PORT; > + > +#define ESPI_UP_RXHDR_0 0x10 > +typedef union { > + struct { > + UINT32 UpCommandType : 3; > + UINT32 UpCommandStatus : 1; > + UINT32 SlaveSel : 2; > + UINT32 Reserved : 2; > + UINT32 UpCmdHdata0 : 8; > + UINT32 UpCmdHdata1 : 8; > + UINT32 UpCmdHdata2 : 8; > + } Field; > + UINT32 Value; > +} ESPIx10_UP_RXHDR0; > + > +#define ESPI_UP_RXHDR_1 0x14 > +typedef union { > + struct { > + UINT32 UpCmdHdata3 : 8; > + UINT32 UpCmdHdata4 : 8; > + UINT32 UpCmdHdata5 : 8; > + UINT32 UpCmdHdata6 : 8; > + } Field; > + UINT32 Value; > +} ESPIx14_UP_RXHDR1; > + > +#define ESPI_UP_RXDATA_PORT 0x18 > + > +/// eSPIx2C eSPI Master Capability > +#define ESPI_MASTER_CAP 0x2C > +typedef union { > + struct { > + UINT32 FlashAccessChannelSupport : 1; > + UINT32 OOBMessageChannelSupport : 1; > + UINT32 VWChannelSupport : 1; > + UINT32 PChannelSupport : 1; > + UINT32 MasterVersion : 3; > + UINT32 FlashAccessChannelMaxPayload : 3; > + UINT32 OOBMessageChannelMaxPayload : 3; > + UINT32 OperatingMaxVWCount : 6; > + UINT32 PChannelMaxPayloadSize : 3; > + UINT32 NumberOfSlave : 3; > + UINT32 OperatingSupportFreq : 3; > + UINT32 IOMode : 2; > + UINT32 AlertMode : 1; > + UINT32 CRCCheck : 1; > + } Field; > + UINT32 Value; > +} ESPIx2C_MASTER_CAP; > + > +/// eSPIx30 eSPI Global Control 0 > +#define ESPI_GLOBAL_CTRL0 0x30 > +typedef union { > + struct { > + UINT32 WdgEn : 1; > + UINT32 WaitChkEn : 1; > + UINT32 PrClkgatEn : 1; > + UINT32 AlStopEn : 1; > + UINT32 AlIdleTimer : 3; > + UINT32 RgDbgclkGatingEn : 1; > + UINT32 WdgCnt : 16; > + UINT32 WaitCnt : 6; > + UINT32 PrRstEnPltrst : 1; > + UINT32 SafsClkGateEn : 1; > + } Field; > + UINT32 Value; > +} ESPIx30_GLOBAL_CTRL0; > + > +/// eSPIx68 eSPI Slave0 Configuration > +#define ESPI_SLAVE0_CONFIG 0x68 > +typedef union { > + struct { > + UINT32 FlashAccessChannelEnable : 1; > + UINT32 OOBMessageChannelEnable : 1; > + UINT32 VWChannelEnable : 1; > + UINT32 PChannelEnable : 1; > + UINT32 FlashSharingMode : 1; > + UINT32 FlashMaxPayloadSize : 3; > + UINT32 PutFlashNpHeaderDataEn : 1; > + UINT32 PutFlashNpHeaderEn : 1; > + UINT32 SafsDeferValidEn : 1; > + UINT32 FlashModifierEn : 1; > + UINT32 Reserved_24_12 : 13; > + UINT32 OperatingFreq : 3; > + UINT32 IOModeSelect : 2; > + UINT32 AlertMode : 1; > + UINT32 CRCCheckingEnable : 1; > + } Field; > + UINT32 Value; > +} ESPIx68_SLAVE0_CONFIG; > + > +/// eSPIx70 eSPI Slave0 Interrupt Status > +#define ESPI_SLAVE0_INT_STS 0x70 > +typedef union { > + struct { > + UINT32 BusErrInt : 1; > + UINT32 WaitTimeoutInt : 1; > + UINT32 CrcErrInt : 1; > + UINT32 Reserved_3 : 1; > + UINT32 NoRspInt : 1; > + UINT32 FatalErrInt : 1; > + UINT32 NonFatalErrInt : 1; > + UINT32 UnknownRspInt : 1; > + UINT32 UnknownCtInt : 1; > + UINT32 UnsucssCplInt : 1; > + UINT32 IllegalTagInt : 1; > + UINT32 IllegalLenInt : 1; > + UINT32 RxOobOverflowInt : 1; > + UINT32 RxMsgOverflowInt : 1; > + UINT32 RxFlashOverflowInt : 1; > + UINT32 ProtocolErrInt : 1; > + UINT32 Reserved_16 : 1; > + UINT32 UpFifoWdgTo : 1; > + UINT32 MstAbortInt : 1; > + UINT32 WdgTimeoutInt : 1; > + UINT32 Reserved_23_20 : 4; > + UINT32 RxVwGrp0Int : 1; > + UINT32 RxVwGrp1Int : 1; > + UINT32 RxVwGrp2Int : 1; > + UINT32 RxVwGrp3Int : 1; > + UINT32 DnCmdInt : 1; > + UINT32 RxMsgInt : 1; > + UINT32 RxOobInt : 1; > + UINT32 FlashReqInt : 1; > + } Field; > + UINT32 Value; > +} ESPIx70_SLAVE0_INT_STS; > + > +/// > +/// Slave Registers > +/// > +#define SLAVE_REG_ID 0x04 > +#define SLAVE_GENERAL_CAPCFG 0x08 > +#define SLAVE_PC_CAPCFG 0x10 > +#define SLAVE_VW_CAPCFG 0x20 > +#define SLAVE_OOB_CAPCFG 0x30 > +#define SLAVE_FA_CAPCFG 0x40 > +#define SLAVE_FA_CAPCFG2 0x44 > + > +/// Offset 04h: Device Identification > +typedef union { > + struct { > + UINT32 RO_VersionID : 8; > + UINT32 Reserved_31_8 : 24; > + } Field; > + UINT32 Value; > +} ESPI_SL04_DEVICE_ID; > + > +// SLAVE offset 0x08 SLAVE_GENERAL_CAPCFG > +#define SLAVE_FA_SUPPORT BIT3 > +#define SLAVE_OOB_SUPPORT BIT2 > +#define SLAVE_VW_SUPPORT BIT1 > +#define SLAVE_PERIPHERAL_SUPPORT BIT0 > +/// Offset 08h: General Capabilities and Configurations > +typedef union { > + struct { > + UINT32 RO_PCSupported : 1; > + UINT32 RO_VWSupported : 1; > + UINT32 RO_OOBMsgSupported : 1; > + UINT32 RO_FASupported : 1; > + UINT32 Reserved_7_3 : 4; > + UINT32 Reserved_11_8 : 4; > + UINT32 RO_MaxWaitStateAllowed : 4; > + UINT32 RO_MaxFreqSupported : 3; > + UINT32 RO_OpenDrainAlertSupported : 1; > + UINT32 OperatingFreq : 3; > + UINT32 OpenDrainAlertSelect : 1; > + UINT32 RO_IOModeSupported : 2; > + UINT32 IOModeSelect : 2; > + UINT32 AlertMode : 1; > + UINT32 Reserved_29 : 1; > + UINT32 ResponseModifierEn : 1; > + UINT32 CRCCheckingEn : 1; > + } Field; > + UINT32 Value; > +} ESPI_SL08_SLAVE_GENERAL_CAPCFG; > + > +/// Offset 10h: Channel 0 Capabilities and Configurations > +typedef union { > + struct { > + UINT32 PCEn : 1; > + UINT32 RO_PCReady : 1; > + UINT32 BusMasterEn : 1; > + UINT32 Reserved_3 : 1; > + UINT32 RO_PCMaxPayloadSizeSupported : 3; > + UINT32 Reserved_7 : 1; > + UINT32 PCMaxPayloadSizeSelected : 3; > + UINT32 Reserved_11 : 1; > + UINT32 PCMaxReadRequestSize : 3; > + UINT32 Reserved_31_15 : 17; > + } Field; > + UINT32 Value; > +} ESPI_SL10_SLAVE_PC_CAPCFG; > + > +/// Offset 20h: Channel 1 Capabilities and Configurations > +typedef union { > + struct { > + UINT32 VWEn : 1; > + UINT32 RO_VWReady : 1; > + UINT32 Reserved_7_2 : 6; > + UINT32 RO_MaxVWCntSupported : 6; > + UINT32 Reserved_15_14 : 2; > + UINT32 OpMaxVWCnt : 6; > + UINT32 Reserved_31_22 : 10; > + } Field; > + UINT32 Value; > +} ESPI_SL20_SLAVE_VW_CAPCFG; > + > +/// Offset 30h: Channel 2 Capabilities and Configurations > +typedef union { > + struct { > + UINT32 OOBEn : 1; > + UINT32 RO_OOBReady : 1; > + UINT32 Reserved_3_2 : 2; > + UINT32 RO_MsgChMaxPayloadSizeSupported : 3; > + UINT32 Reserved_7 : 1; > + UINT32 MsgChMaxPayloadSizeSelected : 3; > + UINT32 Reserved_31_11 : 21; > + } Field; > + UINT32 Value; > +} ESPI_SL30_SLAVE_OOB_CAPCFG; > + > +/// Offset 40h: Channel 3 Capabilities and Configurations > +typedef union { > + struct { > + UINT32 FAEn : 1; > + UINT32 RO_FAReady : 1; > + UINT32 FlashBlockEraseSize : 3; > + UINT32 RO_ChMaxPayloadSizeSupported : 3; > + UINT32 ChMaxPayloadSizeSelected : 3; > + UINT32 RO_FlashSharingMode : 1; > + UINT32 ChMaxReadReqSize : 3; > + UINT32 Reserved_15 : 1; > + UINT32 RO_FlashSharingCapabilitySupported : 2; > + UINT32 Reserved_19_18 : 2; > + UINT32 RO_RPMCCounterOn1stDevice : 4; > + UINT32 RO_RPMCOp1On1stDevice : 8; > + } Field; > + UINT32 Value; > +} ESPI_SL40_SLAVE_FA_CAPCFG; > + > +/// Offset 44h: Channel 3 Capabilities and Configurations2 > +typedef union { > + struct { > + UINT32 RO_TargetMaxReadReqSizeSupported : 3; > + UINT32 Reserved_7_3 : 5; > + UINT32 RO_TargetFlashEraseBlockSize : 8; > + UINT32 RO_TargetRPMCSupported : 6; > + UINT32 RO_NumOfRPMCdevices : 2; > + UINT32 Reserved_31_24 : 8; > + } Field; > + UINT32 Value; > +} ESPI_SL44_SLAVE_FA_CAPCFG2; > + > +// > +// eSPI Command functions > +// > +VOID > +FchEspiCmd_InBandRst ( > + IN UINT32 EspiBase > + ); > + > +UINT32 > +FchEspiCmd_GetConfiguration ( > + IN UINT32 EspiBase, > + IN UINT32 RegAddr > + ); > + > +VOID > +FchEspiCmd_SetConfiguration ( > + IN UINT32 EspiBase, > + IN UINT32 RegAddr, > + IN UINT32 Value > + ); > + > +EFI_STATUS > +FchEspiCmd_SafsFlashRead ( > + IN UINT32 EspiBase, > + IN UINT32 Address, > + IN UINT32 Length, > + OUT UINT8 *Buffer > + ); > + > +EFI_STATUS > +FchEspiCmd_SafsFlashWrite ( > + IN UINT32 EspiBase, > + IN UINT32 Address, > + IN UINT32 Length, > + IN UINT8 *Value > + ); > + > +EFI_STATUS > +FchEspiCmd_SafsFlashErase ( > + IN UINT32 EspiBase, > + IN UINT32 Address, > + IN UINT32 Length > + ); > + > +EFI_STATUS > +FchEspiCmd_SafsRpmcOp1 ( > + IN UINT32 EspiBase, > + IN UINT8 RpmcFlashDev, > + IN UINT32 Length, > + IN UINT8 *Data > + ); > + > +EFI_STATUS > +FchEspiCmd_SafsRpmcOp2 ( > + IN UINT32 EspiBase, > + IN UINT8 RpmcFlashDev, > + IN UINT32 Length, > + OUT UINT8 *Buffer > + ); > + > +#endif > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h > new file mode 100755 > index 0000000000..19688e2548 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h > @@ -0,0 +1,16 @@ > +/** @file > + GNB PCIe Library definition. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef GNBPCIECONFIG_LIB_H_ > +#define GNBPCIECONFIG_LIB_H_ > + > +#include <GnbDxio.h> > +#include <Library/PcieConfigLib.h> > + > +#endif // GNBPCIECONFIG_LIB_H_ > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h > b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h > new file mode 100644 > index 0000000000..df88274530 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h > @@ -0,0 +1,37 @@ > +/** @file > + Header file of AMD NBIO Common DXE library. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef NBIOCOMMONLIBDXE_H_ > +#define NBIOCOMMONLIBDXE_H_ > + > +/** > + Function to retrieve SOC_LOGICAL_ID > + > + @param[out] LogicalId Pointer to SOC_LOGICAL_ID > + @retval EFI_UNSUPPORTED > + > +**/ > +EFI_STATUS > +PcieGetLogicalId ( > + OUT SOC_LOGICAL_ID *LogicalId > + ); > + > +/** > + Function to retrieve PCIE_PLATFORM_CONFIG > + > + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer > + @retval EFI_UNSUPPORTED > + > +**/ > +EFI_STATUS > +PcieGetPcieDxe ( > + OUT PCIE_PLATFORM_CONFIG **Pcie > + ); > + > +#endif // NBIOCOMMONLIBDXE_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h > new file mode 100755 > index 0000000000..4fec578a9f > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h > @@ -0,0 +1,62 @@ > +/** @file > + GNB function to GetHostPciAddress and GetHandle. > + Contain code that create/locate and rebase configuration data area. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef NBIOHANDLELIB_LIB_H_ > +#define NBIOHANDLELIB_LIB_H_ > + > +#include <GnbDxio.h> > + > +/** > + Get GNB handle > + > + @param[in] Pcie Pointer to global PCIe configuration > + > +**/ > +GNB_HANDLE * > +NbioGetHandle ( > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Get GNB handle of alternate host bridge (e.g. MI200) > + > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +GNB_HANDLE * > +NbioGetAltHandle ( > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Get GNB handle of next socket > + > + @param[in] NbioHandle Pointer to current GnbHandle > +**/ > +GNB_HANDLE * > +NbioGetNextSocket ( > + IN GNB_HANDLE *NbioHandle > + ); > + > +/** > + Get PCI_ADDR of GNB > + > + @param[in] Handle Pointer to GNB_HANDLE > +**/ > +PCI_ADDR > +NbioGetHostPciAddress ( > + IN GNB_HANDLE *Handle > + ); > + > +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) > PcieConfigGetNextTopologyDescriptor (Descriptor, > DESCRIPTOR_TERMINATE_TOPOLOGY) > +#define GnbGetSocketId(Handle) (Handle != NULL ? (Handle)->SocketId : > 0) > +#define GnbGetDieNumber(Handle) (Handle != NULL ? (Handle)- > >DieNumber : 0) > +#define GnbGetRBIndex(Handle) (Handle != NULL ? (Handle)->RBIndex : > 0) > + > +#endif // NBIOHANDLELIB_LIB_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h > new file mode 100644 > index 0000000000..9f53746814 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h > @@ -0,0 +1,283 @@ > +/** @file > + Helper functions to access PCIe configuration data area. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef PCIECONFIGLIB_LIB_H_ > +#define PCIECONFIGLIB_LIB_H_ > + > +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK) ( > + IN PCIE_ENGINE_CONFIG *Engine, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +typedef AGESA_STATUS (*PCIE_RUN_ON_WRAPPER_CALLBACK) ( > + IN PCIE_WRAPPER_CONFIG *Wrapper, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK2) ( > + IN PCIE_ENGINE_CONFIG *Engine, > + IN OUT VOID *Buffer, > + IN PCIE_WRAPPER_CONFIG *Wrapper > + ); > + > +typedef VOID (*PCIE_RUN_ON_WRAPPER_CALLBACK2) ( > + IN PCIE_WRAPPER_CONFIG *Wrapper, > + IN OUT VOID *Buffer, > + IN GNB_HANDLE *GnbHandle > + ); > + > +typedef AGESA_STATUS (*PCIE_RUN_ON_DESCRIPTOR_CALLBACK) ( > + IN PCIE_DESCRIPTOR_HEADER *Descriptor, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Check Port Status > + > + @param[in] Engine Pointer to engine config descriptor > + @param[in] PortStatus Check if status asserted for port > + @retval TRUE if status asserted > +**/ > +BOOLEAN > +PcieConfigCheckPortStatus ( > + IN PCIE_ENGINE_CONFIG *Engine, > + IN UINT32 PortStatus > + ); > + > +/** > + Set/Reset port status > + > + @param[in] Engine Pointer to engine config descriptor > + @param[in] SetStatus SetStatus > + @param[in] ResetStatus ResetStatus > + > +**/ > +UINT16 > +PcieConfigUpdatePortStatus ( > + IN PCIE_ENGINE_CONFIG *Engine, > + IN PCIE_ENGINE_INIT_STATUS SetStatus, > + IN PCIE_ENGINE_INIT_STATUS ResetStatus > + ); > + > +/** > + Execute callback on all engine in topology > + > + @param[in] DescriptorFlags Engine flags. > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigRunProcForAllEngines ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Execute callback on all engine in wrapper > + > + @param[in] DescriptorFlags Engine flags. > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigRunProcForAllEnginesInWrapper ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, > + IN OUT VOID *Buffer, > + IN PCIE_WRAPPER_CONFIG *Wrapper > + ); > + > +/** > + Execute callback on all wrappers in topology > + > + @param[in] DescriptorFlags Wrapper Flags > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +AGESA_STATUS > +PcieConfigRunProcForAllWrappers ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Execute callback on all wrappers in NBIO > + > + > + @param[in] DescriptorFlags Wrapper Flags > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigRunProcForAllWrappersInNbio ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, > + IN OUT VOID *Buffer, > + IN GNB_HANDLE *GnbHandle > + ); > + > +/** > + Execute callback on all descriptor of specific type > + > + @param[in] InDescriptorFlags Include descriptor flags > + @param[in] OutDescriptorFlags Exclude descriptor flags > + @param[in] TerminationFlags Termination flags > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +AGESA_STATUS > +PcieConfigRunProcForAllDescriptors ( > + IN UINT32 InDescriptorFlags, > + IN UINT32 OutDescriptorFlags, > + IN UINT32 TerminationFlags, > + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Get parent descriptor of specific type > + > + @param[in] Type Descriptor type > + @param[in] Descriptor Pointer to buffer to pass information to > callback > +**/ > +PCIE_DESCRIPTOR_HEADER * > +PcieConfigGetParent ( > + IN UINT32 Type, > + IN PCIE_DESCRIPTOR_HEADER *Descriptor > + ); > + > +/** > + Get child descriptor of specific type > + > + @param[in] Type Descriptor type > + @param[in] Descriptor Pointer to buffer to pass information to > callback > +**/ > +PCIE_DESCRIPTOR_HEADER * > +PcieConfigGetChild ( > + IN UINT32 Type, > + IN PCIE_DESCRIPTOR_HEADER *Descriptor > + ); > + > +/** > + Get peer descriptor of specific type > + > + @param[in] Type Descriptor type > + @param[in] Descriptor Pointer to buffer to pass information to > callback > +**/ > +PCIE_DESCRIPTOR_HEADER * > +PcieConfigGetPeer ( > + IN UINT32 Type, > + IN PCIE_DESCRIPTOR_HEADER *Descriptor > + ); > + > +/** > + Check is engine is active or potentially active > + > + @param[in] Engine Pointer to engine descriptor > + @retval TRUE - engine active > + @retval FALSE - engine not active > +**/ > +BOOLEAN > +PcieConfigIsActivePcieEngine ( > + IN PCIE_ENGINE_CONFIG *Engine > + ); > + > +/** > + Locate SB engine on wrapper > + > + @param[in] Wrapper Pointer to wrapper config descriptor > + @retval SB engine pointer or NULL > +**/ > +PCIE_ENGINE_CONFIG * > +PcieConfigLocateSbEngine ( > + IN PCIE_WRAPPER_CONFIG *Wrapper > + ); > + > +/** > + Helper function to dump configuration to debug out > + > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigDebugDump ( > + IN PCIE_PLATFORM_CONFIG *Pcie > + ); > + > +/** > + Helper function to dump wrapper configuration > + > + @param[in] WrapperList Wrapper Configuration > +**/ > +VOID > +PcieConfigWrapperDebugDump ( > + IN PCIE_WRAPPER_CONFIG *WrapperList > + ); > + > +/** > + Helper function to dump engine configuration > + > + @param[in] EngineList Engine Configuration > +**/ > +VOID > +PcieConfigEngineDebugDump ( > + IN PCIE_ENGINE_CONFIG *EngineList > + ); > + > +/** > + Helper function to dump input configuration to debug out > + > + @param[in] ComplexDescriptor Pointer to user defined complex > descriptor > +**/ > +VOID > +PcieUserConfigConfigDump ( > + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor > + ); > + > +/** > + Helper function to dump input configuration to user engine descriptor > + > + @param[in] EngineDescriptor Pointer to engine descriptor > +**/ > +VOID > +PcieUserDescriptorConfigDump ( > + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor > + ); > + > +#define PcieConfigGetParentWrapper(Descriptor) > ((PCIE_WRAPPER_CONFIG *) PcieConfigGetParent > (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) > +#define PcieConfigGetParentSilicon(Descriptor) > ((PCIE_SILICON_CONFIG *) PcieConfigGetParent (DESCRIPTOR_SILICON, > &((Descriptor)->Header))) > +#define PcieConfigGetParentComplex(Descriptor) > ((PCIE_COMPLEX_CONFIG *) PcieConfigGetParent (DESCRIPTOR_COMPLEX, > &((Descriptor)->Header))) > +#define PcieConfigGetPlatform(Descriptor) > ((PCIE_PLATFORM_CONFIG *) PcieConfigGetParent (DESCRIPTOR_PLATFORM, > &((Descriptor)->Header))) > +#define PcieConfigGetChildWrapper(Descriptor) > ((PCIE_WRAPPER_CONFIG *) PcieConfigGetChild > (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) > +#define PcieConfigGetChildEngine(Descriptor) > ((PCIE_ENGINE_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_ENGINES, > &((Descriptor)->Header))) > +#define PcieConfigGetChildSilicon(Descriptor) > ((PCIE_SILICON_CONFIG *) PcieConfigGetChild (DESCRIPTOR_SILICON, > &((Descriptor)->Header))) > +#define PcieConfigGetNextDescriptor(Descriptor) > ((((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != > 0) ? NULL : ((Descriptor + 1)))) > +#define PcieConfigIsPcieEngine(Descriptor) ((Descriptor != > NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_ENGINE) != > 0) : FALSE) > +#define PcieConfigIsSbPcieEngine(Engine) ((Engine != > NULL) ? ((BOOLEAN) (Engine->Type.Port.PortData.MiscControls.SbLink)) : > FALSE) > +#define PcieConfigIsEngineAllocated(Descriptor) > ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & > DESCRIPTOR_ALLOCATED) != 0) : FALSE) > +#define PcieConfigSetDescriptorFlags(Descriptor, SetDescriptorFlags) if > (Descriptor != NULL) (Descriptor)->Header.DescriptorFlags |= > SetDescriptorFlags > +#define PcieConfigResetDescriptorFlags(Descriptor, ResetDescriptorFlags) if > (Descriptor != NULL) ((PCIE_DESCRIPTOR_HEADER *) Descriptor)- > >DescriptorFlags &= (~(ResetDescriptorFlags)) > +#define PcieInputParsetGetNextDescriptor(Descriptor) > ((Descriptor == NULL) ? NULL : ((Descriptor->Flags & > DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) > +#define PcieConfigGetNextTopologyDescriptor(Descriptor, Termination) > ((Descriptor == NULL) ? NULL : ((((PCIE_DESCRIPTOR_HEADER *) Descriptor)- > >DescriptorFlags & Termination) != 0) ? NULL : ((UINT8 *) Descriptor + > ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->Peer)) > +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE > *) PcieConfigGetNextTopologyDescriptor (Descriptor, > DESCRIPTOR_TERMINATE_TOPOLOGY) > +#define PcieConfigGetNextDataDescriptor(Descriptor) > ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0 ? NULL : (Descriptor > + 1)) > + > +#endif // PCIECONFIGLIB_LIB_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h > b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h > new file mode 100644 > index 0000000000..f0c6d1ccbb > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h > @@ -0,0 +1,30 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _SMNACCESSLIB_H_ > +#define _SMNACCESSLIB_H_ > + > +VOID > +SmnRegisterReadS ( > + IN UINT32 SegmentNumber, > + IN UINT32 BusNumber, > + IN UINT32 Address, > + OUT VOID *Value > + ); > + > +VOID > +SmnRegisterRMWS ( > + IN UINT32 SegmentNumber, > + IN UINT32 BusNumber, > + IN UINT32 Address, > + IN UINT32 AndMask, > + IN UINT32 OrValue, > + IN UINT32 Flags > + ); > + > +#endif > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesPr > otocol.h > b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesPr > otocol.h > new file mode 100644 > index 0000000000..0e08e64b24 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesPr > otocol.h > @@ -0,0 +1,47 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef NBIO_PCIE_SERVICES_PROTOCOL_H_ > +#define NBIO_PCIE_SERVICES_PROTOCOL_H_ > + > +// Current PROTOCOL revision > +#define AMD_NBIO_PCIE_SERVICES_REVISION 0x00 > + > +/// > +/// Forward declaration for the NBIO_PCIE_SERVICES_PROTOCOL > +/// > +typedef struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL > DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL; > + > +// > +// Protocol Definitions > +// > + > +/** > + Returns the NBIO debug options configuration structure > + This > + A pointer to the DXE_AMD_NBIO_SMU_SERVICES_PROTOCOL instance. > + DebugOptions > + A pointer to a pointer to store the address of the PCIe topology structure > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT)( > + IN DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL *This, > + OUT UINT32 **DebugOptions > + ); > + > +/// > +/// The Dxe of PCIE Services > +/// > +struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL { > + AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT PcieGetTopology; ///< > +}; > + > +extern EFI_GUID gAmdNbioPcieServicesProtocolGuid; > + > +#endif /* NBIO_PCIE_SERVICES_PROTOCOL_H */ > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtoc > ol.h > b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtoc > ol.h > new file mode 100644 > index 0000000000..10d3b730a6 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtoc > ol.h > @@ -0,0 +1,14 @@ > +/** @file > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _AMD_OEM_OOB_PPR_PROTOCOL_H_ > +#define _AMD_OEM_OOB_PPR_PROTOCOL_H_ > + > +extern EFI_GUID gAmdOemOobPprDxeProtocolGuid; > + > +#endif > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h > b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h > new file mode 100644 > index 0000000000..a15995188b > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h > @@ -0,0 +1,155 @@ > +/** @file > + > + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef FABRIC_NUMA_SERVICES2_H_ > +#define FABRIC_NUMA_SERVICES2_H_ > +#include "AMD.h" > + > +#pragma pack (push, 1) > + > +#define MAX_PXM_VALUES_PER_QUADRANT 16 > + > +/// Domain type > +typedef enum { > + NumaDram, > + NumaSLink, > + NumaCxl, > + MaxNumaDomainType2 > +} DOMAIN_TYPE2; > + > +/// Reported Domain Info > +typedef struct { > + DOMAIN_TYPE2 Type; ///< Type > + UINT32 SocketMap; ///< Bitmap indicating physical socket location > + UINT32 PhysicalDomain; ///< Physical domain number > +} DOMAIN_INFO2; > + > +/// Physical Dram Info > +typedef struct { > + UINT32 NormalizedCsMap; ///< Bitmap of CSs comprising this > physical domain > + UINT32 SharingEntityCount; ///< Number of virtual domains > sharing this physical domain > + UINT32 SharingEntityMap; ///< Bitmap of reported domains that > share this physical domain > + UINT32 Reserved; ///< Reserved > +} PHYS_DOMAIN_INFO; > + > +/// Proximity Domain Info > +typedef struct { > + UINTN Count; ///< Entries in Domain array > + UINTN Domain[MAX_PXM_VALUES_PER_QUADRANT]; ///< Domains in > Quadrant > +} PXM_DOMAIN_INFO; > + > +/// > +/// Forward declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL > +/// > +typedef struct _FABRIC_NUMA_SERVICES2_PROTOCOL > FABRIC_NUMA_SERVICES2_PROTOCOL; > + > +/** > + * @brief Get the numa domain information. > + * > + * @details Get the numa domain information. > + * > + * @param[in] This A pointer to the > FABRIC_NUMA_SERVICES2_PROTOCOL instance. > + * @param[out] NumberOfDomainsInSystem Number of unique NUMA > domains > + * @param[out] DomainInfo An array with information about each > domain > + * @param[out] CcxAsNumaDomain TRUE: each core complex is its > own domain > + * FALSE: physical mapping is employed > + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. > + */ > +typedef > +EFI_STATUS > +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO)( > + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, > + OUT UINT32 *NumberOfDomainsInSystem, > + OUT DOMAIN_INFO2 **DomainInfo, > + OUT BOOLEAN *CcxAsNumaDomain > + ); > + > +/** > + * @brief Translates a core's physical location to the appropriate NUMA > domain. > + * > + * @details Translates a core's physical location to the appropriate NUMA > domain. > + * > + * @param[in] This A pointer to the > FABRIC_NUMA_SERVICES2_PROTOCOL instance. > + * @param[in] Socket Zero based socket that the core is attached to > + * @param[in] Die DF die on socket that the core is attached to > + * @param[in] Ccd Logical CCD the core is on > + * @param[in] Ccx Logical core complex > + * @param[out] Domain Domain the core belongs to > + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. > + */ > +typedef > +EFI_STATUS > +(EFIAPI *FABRIC_NUMA_SERVICES2_DOMAIN_XLAT)( > + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, > + IN UINTN Socket, > + IN UINTN Die, > + IN UINTN Ccd, > + IN UINTN Ccx, > + OUT UINT32 *Domain > + ); > + > +/** > + * @brief Get physical numa domain information. > + * > + * @details Get physical numa domain information. > + * > + * @param[in] This A pointer to the > FABRIC_NUMA_SERVICES2_PROTOCOL instance. > + * @param[out] NumberOfPhysDomainsInSystem Number of valid domains > in the system > + * @param[out] PhysDomainInfo An array with information about > each physical domain > + * @param[out] PhysNodesPerSocket Actual NPS as determined by > ABL (not including SLink) > + * @param[out] NumberOfSystemSLinkDomains Number of domains > describing SLink connected memory > + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. > + */ > +typedef > +EFI_STATUS > +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO)( > + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, > + OUT UINT32 *NumberOfPhysDomainsInSystem, > + OUT PHYS_DOMAIN_INFO **PhysDomainInfo, > + OUT UINT32 *PhysNodesPerSocket, > + OUT UINT32 *NumberOfSystemSLinkDomains > + ); > + > +/** > + * @brief Get the proximity domain information about a PCIe root-port > bridge > + * > + * @details Get the proximity domain information about a PCIe root-port > bridge > + * > + * @param[in] This A pointer to the > FABRIC_NUMA_SERVICES2_PROTOCOL instance. > + * @param[in] RootPortBDF BDF for root-port bridge in PCI_ADDR > format. > + * @param[out] PxmDomainInfo Pointer to a structure returning > associated NUMA node(s). > + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. > + */ > +typedef > +EFI_STATUS > +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO)( > + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, > + IN PCI_ADDR RootPortBDF, > + OUT PXM_DOMAIN_INFO *PxmDomainInfo > + ); > + > +/// > +/// When installed, the Fabric NUMA Services 2 Protocol produces a > collection of > +/// services that return various information associated with non-uniform > memory > +/// architecture. > +/// > +struct _FABRIC_NUMA_SERVICES2_PROTOCOL { > + UINTN Revision; ///< Revision Number > + FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO GetDomainInfo; > ///< Get Domain Info > + FABRIC_NUMA_SERVICES2_DOMAIN_XLAT DomainXlat; ///< > Domain Translation > + FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO > GetPhysDomainInfo; ///< Get Physical Domain Info > + FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO > GetPxmDomainInfo; ///< Get Proximity Domain Info > +}; > + > +/// > +/// Guid declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL. > +/// > +extern EFI_GUID gAmdFabricNumaServices2ProtocolGuid; > + > +#pragma pack (pop) > +#endif // _FABRIC_NUMA_SERVICES2_H_ > diff --git > a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices > 2.h > b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices > 2.h > new file mode 100644 > index 0000000000..485240c0fb > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices > 2.h > @@ -0,0 +1,14 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef FABRIC_TOPOLOGY_SERVICES2_H_ > +#define FABRIC_TOPOLOGY_SERVICES2_H_ > + > +#include <Library/BaseFabricTopologyLib.h> > + > +#endif // FABRIC_TOPOLOGY_SERVICES2_H_ > diff --git a/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h > b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h > new file mode 100755 > index 0000000000..44093e4097 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h > @@ -0,0 +1,23 @@ > +/** @file > + SoC Logical ID Definitions. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef SOC_LOGICAL_ID_H_ > +#define SOC_LOGICAL_ID_H_ > +#pragma pack (push, 1) > + > +/// > +/// SOC logical ID structure > +/// > +typedef struct _SOC_LOGICAL_ID { > + IN OUT UINT32 Family; ///< Indicates logical ID Family > + IN OUT UINT16 Revision; ///< Indicates logical ID Revision > +} SOC_LOGICAL_ID; > + > +#pragma pack (pop) > +#endif // SOC_LOGICAL_ID_H_ > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLi > b.h > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLi > b.h > new file mode 100644 > index 0000000000..a60ae20d33 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLi > b.h > @@ -0,0 +1,100 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _INTERNAL_AML_LIB_H_ > +#define _INTERNAL_AML_LIB_H_ > + > +#include <Uefi.h> > +#include <Library/AmlGenerationLib.h> > +#include <Library/DebugLib.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <IndustryStandard/Acpi.h> > + > +#include "LocalAmlObjects.h" > + > +// EDK2 open source MdePkg/Include/IndustryStandard/AcpiAml.h does not > have > +// these and should. > +#define AML_DIGIT_CHAR_0 0x30 > +#define AML_DIGIT_CHAR_9 0x39 > + > +// The max string size for a QWord is 8 bytes = 16 characters plus NULL > Terminator > +#define MAX_AML_DATA_INTEGER_SIZE 17 > + > +// Defines similar to ctype.h functions isalpha() and isdigit() > +#define IS_ASCII_UPPER_ALPHA(c) ( ((c) >= AML_NAME_CHAR_A) && ((c) > <= AML_NAME_CHAR_Z) ) > +#define IS_ASCII_HEX_DIGIT(c) ( (((c) >= AML_DIGIT_CHAR_0) && ((c) <= > AML_DIGIT_CHAR_9)) ||\ > + (((c) >= AML_NAME_CHAR_A) && ((c) <= > AML_NAME_CHAR_F)) ) > + > +// Swap bytes of upper and lower WORDs within a DWORD > +#define Swap4Bytes(val) \ > + ( (((val) >> 8) & 0x000000FF) | (((val) << 8) & 0x0000FF00) | \ > + (((val) >> 8) & 0x00FF0000) | (((val) << 8) & 0xFF000000) ) > + > +/* > + Calculates the optimized integer value used by AmlDataInteger and others > + > + Not a public function so no doxygen comment identifiers. > + > + @param[in] Integer - Integer value to encode > + @param[out] ReturnData - Allocated DataBuffer with encoded integer > + @param[out] ReturnDataSize - Size of ReturnData > + > + @return EFI_SUCCESS - Successful completion > + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlDataIntegerBuffer ( > + IN UINT64 Integer, > + OUT VOID **ReturnData, > + OUT UINTN *ReturnDataSize > + ); > + > +/** > + Creates a Package Length encoding and places it in the return buffer, > + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not > + include the length of its own encoding. > + > + @param[in] DataSize - The size of data to be encoded as a pkglength > + @param[out] PkgLengthEncoding - Return buffer containing the AML > encoding > + @param[out] ReturnDataLength - Size of the return buffer > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > + **/ > +EFI_STATUS > +EFIAPI > +InternalAmlBitPkgLength ( > + IN UINT32 DataSize, > + OUT UINT8 **PkgLengthEncoding, > + OUT UINTN *ReturnDataLength > + ); > + > +/** > + Creates a NameSeg AML object and inserts it into the List > + > + NameSeg := <leadnamechar namechar namechar namechar> > + > + NameSegs shorter than 4 characters are filled with trailing underscores > + > + @param[in] Name - Field NameSeg > + @param[in,out] ListHead - Linked list has NameSeg after call > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlNameSeg ( > + IN CHAR8 *Name, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +#endif > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlO > bjects.h > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlO > bjects.h > new file mode 100644 > index 0000000000..b19b6fe867 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlO > bjects.h > @@ -0,0 +1,150 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _INTERNAL_AML_OBJECTS_H_ > +#define _INTERNAL_AML_OBJECTS_H_ > + > +// #include "LocalAmlLib.h" > + > +/** > + Free Object->Data > + > + Frees Object->Data, Nulls pointer, zeros size and marks > + Object->Completed = FALSE > + > + @param [in] Object - Pointer to Object to have Data freed > + > + @return EFI_SUCCESS - Object Freed > + @return <all others> - Object free failed > +**/ > +EFI_STATUS > +EFIAPI > +InternalFreeAmlObjectData ( > + IN AML_OBJECT_INSTANCE *Object > + ); > + > +/** > + Free an Object > + > + Removes Object from it's linked list. > + Frees Object->Data > + Frees Object > + > + @param [in] Object - Pointer to Object to be freed > + @param [in,out] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object Freed > + @return <all others> - Object free failed > +**/ > +EFI_STATUS > +EFIAPI > +InternalFreeAmlObject ( > + IN AML_OBJECT_INSTANCE **Object, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and > + Object->DataSize will be 0 > + > + Allocates AML_OBJECT_INSTANCE which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object > + > + @return EFI_SUCCESS - Object created and appended to linked list > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalNewAmlObjectNoData ( > + OUT AML_OBJECT_INSTANCE **ReturnObject > + ); > + > +/** > + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object- > >Data > + will be NULL and Object->DataSize will be 0 > + > + Allocates AML_OBJECT_INSTANCE which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object > + @param [in,out] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object created and appended to linked list > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAppendNewAmlObjectNoData ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a > + string Identifier for comparison purposes > + > + Allocates AML_OBJECT_INSTANCE which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object > + @param [in] Identifier - String Identifier to create object with > + @param [in,out] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object created and appended to linked list > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAppendNewAmlObject ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN CHAR8 *Identifier, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in > the > + AML_OBJECT_INSTANCE linked list > + > + @param [out] ReturnObject - Pointer to an Object > + @param [in] Identifier - String Identifier to create object with > + @param [in] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object located and returned > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlLocateObjectByIdentifier ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN CHAR8 *Identifier, > + IN LIST_ENTRY *ListHead > + ); > + > +/** > + Finds all children of the Link and appends them into a single ObjectData > + buffer of ObjectDataSize > + > + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object pointer > + @param [out] ChildCount - Count of Child Objects collapsed > + @param [in] Link - Linked List Object entry to collect children > + @param [in,out] ListHead - Head of Object Linked List > + > + @return EFI_SUCCESS - ChildObject created and returned > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlCollapseAndReleaseChildren ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + OUT UINTN *ChildCount, > + IN LIST_ENTRY *Link, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +#endif // _INTERNAL_AML_OBJECTS_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h > b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h > new file mode 100755 > index 0000000000..3a628ed0b2 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h > @@ -0,0 +1,432 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_PCIE_COMPLEX_H_ > +#define AMD_PCIE_COMPLEX_H_ > + > +// > +// GNB PCIe configuration info > +// > +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull > +#define DESCRIPTOR_IGNORE 0x40000000ull > + > +// > +// Port parameter count > +// > +#define PCIE_PORT_PARAMETER_COUNT 64 > + > +/// > +/// PCIe link initialization > +/// DXIO endpoint status > +/// > +typedef enum { > + DxioEndpointDetect = 0, ///< Detect endpoint presence > + DxioEndpointNotPresent ///< Endpoint not present (or > connected). Used in case there is alternative way to determine > + ///< if device present on board or in slot. > For example GPIO can be used to determine device presence. > +} DXIO_ENDPOINT_STATUS; > + > +#pragma pack(push,1) > +typedef struct { > + UINT16 ParamType; ///< This identifies a specific port > parameter to set. > + UINT16 ParamValue; ///< Specifies the value to be assigned > to port parameter. > +} PORT_PARAM; > + > +typedef struct { > + PORT_PARAM PhyParam[PCIE_PORT_PARAMETER_COUNT]; ///< > PHY port parameter > +} PORT_PARAMS; > + > +/// > +/// Ancillary data struct with table size and address > +/// > +typedef struct { > + IN UINT32 Count; ///< Total count in this Ancillary data > table > + IN UINT32 Ovrd; ///< Ancillary data table address point > to ANC_DATA_PARAM[] > +} ANC_DATA; > + > +typedef struct { > + UINT16 ParamType; ///< This identifies a specific PHY parameter > + UINT16 ParamValue; ///< This specifies the value to be assigned > to indicated PHY parameter > +} DXIO_PHY_PARAM; > + > +typedef struct { > + DXIO_PHY_PARAM PhyParam[44]; ///< physical parameter > +} PHY_DATA; > + > +/// > +/// PCIe specific data structures > +/// PCIe port misc extended controls > +/// > +typedef struct { > + UINT8 LinkComplianceMode : 1; ///< Force port into > compliance mode (device will not be trained, port output compliance pattern) > + UINT8 LinkSafeMode : 1; ///< Safe mode PCIe capability. > (Parameter may limit PCIe speed requested through > DXIO_PORT_DATA::LinkSpeedCapability) > + ///< 0 - port can advertize muximum > supported capability > + ///< 1 - port limit advertized capability and > speed to PCIe Gen1 > + UINT8 SbLink : 1; ///< PCIe link type > + ///< 0 - General purpose port > + ///< 1 - Port connected to SB > + UINT8 ClkPmSupport : 1; ///< Clock Power Management > Support > + ///< 0 - Clock Power Management not > configured > + ///< 1 - Clock Power Management > configured according to PCIe device capability > + UINT8 ChannelType : 3; ///< Channel Type > + ///< 0 - Channel Type Not Specified > + ///< - Channel Type Short Trace > + ///< 2 - Channel Type Long Trace > + UINT8 TurnOffUnusedLanes : 1; ///< Turn Off Unused Lanes > + ///< 0 - Turn on > + ///< 1 - Turn off > +} DXIO_PORT_MISC_CONTROL; > + > +/// > +/// The IO APIC Interrupt Mapping Info > +/// > +typedef struct { > + UINT8 GroupMap; ///< Group mapping for slot or > endpoint device (connected to PCIE port) interrupts . > + ///< 0 - IGNORE THIS STRUCTURE AND USE > RECOMMENDED SETTINGS > + ///< 1 - mapped to Grp 0 (Interrupts 0..3 of IO > APIC redirection table) > + ///< 2 - mapped to Grp 1 (Interrupts 4..7 of IO > APIC redirection table) > + ///< ... > + ///< 8 - mapped to Grp 7 (Interrupts 28..31 of > IO APIC redirection table) > + UINT8 Swizzle; ///< Swizzle interrupt in the Group. > + ///< 0 - ABCD > + ///< 1 - BCDA > + ///< 2 - CDAB > + ///< 3 - DABC > + UINT8 BridgeInt; ///< IOAPIC redirection table entry for > PCIE bridge interrupt > + ///< 0 - Entry 0 of IO APIC redirection table > + ///< 1 - Entry 1 of IO APIC redirection table > + ///< ... > + ///< 31 - Entry 31 of IO APIC redirection table > +} DXIO_APIC_DEVICE_INFO; > +/// > +/// PCIe port configuration data > +/// > +typedef struct { > + UINT8 PortPresent : 1; ///< Enable PCIe port for > initialization. > + UINT8 Reserved1 : 2; ///< Reserved > + UINT8 DeviceNumber : 5; ///< PCI Device number for port. > + ///< 0 - Native port device number > + ///< N - Port device number (See available > configurations in BKDG > + UINT8 FunctionNumber : 3; ///< Reserved for future use > + UINT8 LinkSpeedCapability : 3; ///< PCIe link speed/ > + ///< 0 - Maximum supported by silicon > + ///< 1 - Gen1 > + ///< 2 - Gen2 > + ///< 3 - Gen3 > + ///< 4 - Gen4 > + ///< 5 - Gen5 > + UINT8 AutoSpdChng : 2; ///< Upstread Auto Speed Change > Allowed/ > + ///< 0 - Use default implementation (Disabled > for Gen1, Enabled for Gen2/3) > + ///< 1 - Always Disabled > + ///< 2 - Always Enabled > + ///< 3 - Reserved > + UINT8 EqPreset : 4; ///< Gen3 Equalization Preset */ > + UINT8 LinkAspm : 2; ///< ASPM control. (see > AgesaPcieLinkAspm for additional option to control ASPM) > + ///< 0 - Disabled > + ///< 1 - L0s only > + ///< 2 - L1 only > + ///< 3 - L0s and L1 > + UINT8 LinkAspmL1_1 : 1; ///< ASPM control. (see > AgesaPcieLinkAspm for additional option to control ASPM) > + ///< 0 - Disabled > + ///< 1 - Enabled > + UINT8 LinkAspmL1_2 : 1; ///< ASPM control. (see > AgesaPcieLinkAspm for additional option to control ASPM) > + ///< 0 - Disabled > + ///< 1 - Enabled > + UINT8 ClkReq : 4; ///< ASPM Reserved Field > + ///< 0 - NONE > + ///< 1 - CLKREQ0 signal > + ///< 2 - CLKREQ1 signal > + ///< 3 - CLKREQ2 signal > + ///< 4 - CLKREQ3 signal > + ///< 5 - CLKREQG signal > + UINT8 LinkHotplug : 4; ///< Hotplug control. > + ///< 0 - Disabled > + ///< 1 - Basic > + ///< 2 - Server > + ///< 3 - Enhanced > + UINT8 SlotPowerLimit; ///< PCIe slot power limit. > + UINT8 SlotPowerLimitScale : 2; ///< PCIe slot power limit Scale. > + ///< 00b = 1.0x > + ///< 01b = 0.1x > + ///< 10b = 0.01x > + ///< 11b = 0.001x > + UINT8 IsMasterPLL : 1; ///< IsMasterPLL > + UINT8 Gen4Features : 5; ///< Unused bits > + ///< BIT0(DLF_Exchange) 1 - Disable, 0 - > Enable > + ///< IT1(DLF_Capability) 1 - Disable, 0 - Enable > + UINT16 SlotNum : 13; ///< PHYSICAL_SLOT_NUM > + UINT16 CsLink : 3; ///< Reserved > + DXIO_PORT_MISC_CONTROL MiscControls; ///< Misc extended > controls > + DXIO_APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device > programming info > + DXIO_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint > (device connected to PCIe port) status > + UINT8 EsmSpeedBump; ///< Speed bump for ESM > + UINT8 EsmControl : 1; ///< Enhanced speed mode control > + UINT8 CcixControl : 1; ///< Ccix/Cxl control > + UINT8 TxVetting : 1; ///< Tx Vetting > + UINT8 RxVetting : 1; ///< Rx Vetting > + UINT8 InvertPolarity : 1; ///< Invert RX Polarity > + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity > + UINT8 NtbHotplug : 1; ///< NTB Hotplug flag > + ///< 0b = Disabled > + ///< 1b = Enabled > + UINT8 Reserved2 : 1; ///< Reserved > + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set > + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set > + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set > + UINT8 Reserved3 : 5; ///< Reserved > + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset > + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset > + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset > + UINT8 Reserved4 : 4; ///< Reserved > + UINT16 PsppPolicyDC; ///< Pspp DC control > + UINT16 PsppPolicyAC; ///< PSPP AC control > + UINT8 PsppDeviceType; ///< Pspp Device Type > + UINT8 DisGen3EQPhase : 1; ///< Gen3 Bypass phase2/3 EQ > + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ > + UINT8 TXDeEmphasisOride : 1; ///< Override Gen2 DXIO > deemphasis default > + UINT8 TXDeEmphasis : 2; ///< Gen2 DXIO deemphasis > setting > + UINT8 Reserved5 : 3; ///< Reserved > + struct { > + UINT16 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset > + UINT16 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset > Hint > + UINT16 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset > + UINT16 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset > Hint > + UINT16 Reserved1 : 2; ///< Unused bits > + UINT8 SetDsTxPreset : 1; ///< Gen3 Set Downstream Tx > Preset > + UINT8 SetDsRxPresetHint : 1; ///< Gen3 Set Downstream Rx > Preset Hint > + UINT8 SetUsTxPreset : 1; ///< Gen3 Set Upstream Tx Preset > + UINT8 SetUsRxPresetHint : 1; ///< Gen3 Set Upstream Rx > Preset Hint > + UINT8 Reserved2 : 4; ///< Unused bits > + } LaneEqualizationCntl; ///< Lane equalization control > structure used for Gen3 values > + struct { > + UINT8 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset > + UINT8 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset > + UINT8 SetDsTxPreset : 1; ///< Gen4 Set Downstream Tx > Preset > + UINT8 SetUsTxPreset : 1; ///< Gen4 Set Upstream Tx Preset > + UINT8 Reserved1 : 6; ///< Unused bits > + } Gen4LaneEqualizationCntl; ///< Lane equalization control > structure used for Gen4 values > + struct { > + UINT8 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset > + UINT8 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset > + UINT8 SetDsTxPreset : 1; ///< Gen5 Set Downstream Tx > Preset > + UINT8 SetUsTxPreset : 1; ///< Gen5 Set Upstream Tx Preset > + UINT8 Reserved1 : 6; ///< Unused bits > + } Gen5LaneEqualizationCntl; ///< Lane equalization control > structure used for Gen5 values > + struct { > + UINT32 PresetMask8Gt : 10; ///< Preset Mask 8GT. > + UINT32 PresetMask16Gt : 10; ///< Preset Mask 16GT. > + UINT32 PresetMask32Gt : 10; ///< Preset Mask 32GT. > + UINT32 Reserved1 : 2; ///< Unused bits > + UINT8 SetPresetMask8Gt : 1; ///< Preset Mask 8GT Set > + UINT8 SetPresetMask16Gt : 1; ///< Preset Mask 16GT Set > + UINT8 SetPresetMask32Gt : 1; ///< Preset Mask 32GT Set > + UINT8 Reserved2 : 5; ///< Unused bits > + } PresetMaskCntl; ///< Preset Mask control structure > used for Gen3/Gen4/Gen5 values > + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed > + UINT8 BypassGen3EQ : 1; ///< Bypass Gen3 equalization > + UINT8 BypassGen4EQ : 1; ///< Bypass Gen4 equalization > + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation > interval > + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:Enable 0xF:Auto > + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect > mode 0:Disable 1:Enable 0xF:Auto > + UINT8 LowerSkpOsGenSup; ///< Controls > LOWER_SKP_OS_GEN_SUPPORT > + UINT8 LowerSkpOsRcvSup; ///< Controls > LOWER_SKP_OS_RCV_SUPPORT > + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval > Selection Mode > + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for > SKP ordered set interval when generated based on elasticity buffer pointer > slip feedback from PCS > + UINT8 IsBmcLocation : 1; ///< IsBmcLocation > + UINT8 SetEsmControl : 1; ///< Set ESM Control > + UINT8 SetEsmSpeedBump : 1; ///< Set Speed bump for ESM > + UINT8 Reserved6 : 1; ///< Unused bits > + UINT8 I2CMuxInfo : 6; ///< Legacy I2c switch > + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE > port > + UINT8 Reserved7 : 1; ///< Unused bits > + UINT16 NpemEnable : 12; ///< Controls NPEM Enable > + UINT16 Reserved8 : 4; ///< Unused bits > + UINT16 NpemCapability : 12; ///< Controls NPEM Capability > + UINT8 SwingMode : 3; ///< PCIe Swing Mode > + UINT16 Reserved9 : 1; ///< Unused bits > + UINT16 MpioAncDataIdx; ///< Reserved for internal use only > + UINT8 Reserved10; ///< Reserved bits > +} DXIO_PORT_DATA; > + > +/// > +/// EtherNet specific data structures > +/// > +typedef struct { > + UINT32 PortNum : 8; ///< Port Number > + UINT32 PlatConf : 4; ///< Platform Config > + ///< 0 = Reserved > + ///< 1 = 10G/1G BackPlane > + ///< 2 = 2.5G BackPlane > + ///< 3= Soldered down 1000Base-T > + ///< 4 = Soldered down 1000Base-X > + ///< 5 = Soldered down NBase-T > + ///< 6 = Soldered down 10GBase-T > + ///< 7 = Soldered down 10GBase-r > + ///< 8 = SFP+ Connector > + UINT32 Reserved1 : 4; ///< Unused 12-15 > + UINT32 MdioId : 5; ///< MDIO ID when MDIO Side band is > used > + UINT32 Reserved2 : 2; ///< Unused 21-22 > + UINT32 SuppSpeed : 4; ///< Supported Speeds by Platform > + ///< 1 = 100M Supported > + ///< 2 = 1G Supported > + ///< 4 = 2.5G Supported > + ///< 8 = 10G Supported > + UINT32 Reserved3 : 1; ///< Unused 27 > + UINT32 ConnType : 3; ///< Supported Speeds by Platform > + ///< 0 = Port not Used > + ///< 1 = SFP+ Connection I2C interface > + ///< 2 = MDIO PHY > + ///< 4 = Backplane Connection > + UINT32 Reserved4 : 1; ///< Unused 31 > +} ETH_PORT_PROPERTY0; > + > +typedef struct { > + UINT32 MdioReset : 2; ///< MDIO Reset Type > + ///< 0 = None > + ///< 1 = I2C GPIO > + ///< 2 = Integrated GPIO > + ///< 3 = Reserved > + UINT32 Reserved1 : 2; ///< Unused 2-3 > + UINT32 MdioGpioResetNum : 2; ///< Integrated GPIO number for > reset > + UINT32 Reserved2 : 2; ///< Unused 6-7 > + UINT32 SfpGpioAdd : 3; ///< Lower I2C address of GPIO > Expander PCA9535 > + UINT32 Reserved3 : 1; ///< Unused 11 > + UINT32 TxFault : 4; ///< TX FAULT > + UINT32 Rs : 4; ///< RS Signal > + UINT32 ModAbs : 4; ///< MOD_ABS signal > + UINT32 RxLoss : 4; ///< Rx_LOS signal > + UINT32 SfpGpioMask : 4; ///< SFP+ sideband signals that are > not supported by platform > +} ETH_PORT_PROPERTY3; > + > +typedef struct { > + UINT32 SfpMux : 3; ///< Lower address of Mux PCA 9545 > + UINT32 Reserved1 : 1; ///< Unused 3 > + UINT32 SfpBusSeg : 3; ///< SFP BUS Segment. Downstream > channels of PCA9545 > + UINT32 Reserved2 : 1; ///< Unused 7 > + UINT32 SfpMuxUpAdd : 5; ///< Upper address of Mux PCA > 9545 > + UINT32 Reserved3 : 3; ///< Unused 13-15 > + UINT32 RedriverAddress : 7; ///< Address of ReDriver > + UINT32 RedriverInterface : 1; ///< ReDriver Interface Descriptor > + UINT32 RedriverLane : 3; ///< ReDriver Lane number > + UINT32 Reserved4 : 1; ///< Unused 27 > + UINT32 RedriverModel : 3; ///< ReDriver Model > + UINT32 RedriverPresent : 1; ///< Redriver Present > +} ETH_PORT_PROPERTY4; > + > +typedef struct { > + UINT32 TxEqPre : 6; ///< TX EQ PRE > + UINT32 Reserved1 : 2; ///< Unused 7-6 > + UINT32 TxEqMain : 6; ///< TX EQ MAIN > + UINT32 Reserved2 : 2; ///< Unused 15-14 > + UINT32 TxEqPost : 6; ///< TX EQ POST > + UINT32 Reserved3 : 10; ///< Unused 31-23 > +} ETH_PORT_TXEQ; > +/// Ethernet PCIe port configuration data > +/// > +typedef struct { > + ETH_PORT_PROPERTY0 EthPortProp0; ///< > XGBE_PORT_PROPERTY_0 > + ETH_PORT_PROPERTY3 EthPortProp3; ///< > XGBE_PORT_PROPERTY_3 > + ETH_PORT_PROPERTY4 EthPortProp4; ///< > XGBE_PORT_PROPERTY_4 > + UINT32 PadMux0; ///< PadMux0 Setting (8 bits) > + UINT32 PadMux1; ///< PadMux1 Setting (8 bits) > + UINT32 MacAddressLo; ///< Lower 32 bits of MAC Address > + UINT32 MacAddressHi; ///< Upper 32 bits of MAC Address > + ETH_PORT_TXEQ EthPortTxEq; ///< TX EQ Settings > +} ETHERNET_PORT_DATA; > + > +/// > +/// High level data structures for passing topology from platform to AGESA > +/// > +typedef struct { > + UINT8 EngineType; ///< Engine type > + ///< 0 - Ignore engine configuration > + ///< 1 - PCIe port > + UINT8 HotPluggable : 1; ///< HotPluggable > + ///< 0 - Link is NOT Hot-Switchable > + ///< 1 - Link IS Hot-Switchable > + UINT8 Reserved1 : 7; ///< Unused field, leave as 0 > + UINT8 StartLane; ///< Start Lane ID (in reversed > configuration StartLane > EndLane) > + ///< Refer to lane descriptions and supported > configurations in BKDG > + UINT8 EndLane; ///< End lane ID (in reversed > configuration StartLane > EndLane) > + ///< Refer to lane descriptions and supported > configurations in BKDG > + UINT8 GpioGroupId; ///< Unique identifier for the GPIO or > GPIO group associated with > + ///< this engine. GPIOs are used for hotplug > notification and link > + ///< type (e.g SATA Express or PCIe) > + UINT8 DxioStartLane; ///< Internal coding of start lane > + UINT8 DxioEndLane; ///< Internal coding of end lane > + UINT8 SearchDepth; ///< SearchDepth only uses 1 bit - > always initialize to 0 will be updated dynamically > +} DXIO_ENGINE_DATA; > + > +/// > +/// PCIe port descriptor > +/// > +typedef struct { > + UINT32 Flags; ///< Descriptor flags > + ///< Bit31 - last descriptor in complex > + DXIO_ENGINE_DATA EngineData; ///< Engine data > + DXIO_PORT_DATA Port; ///< PCIe port specific configuration > info > + ETHERNET_PORT_DATA EtherNet; ///< Ancillary data for EtherNet > + PHY_DATA Phy; ///< Ancillary data for PHY programming > customization > + PORT_PARAMS PortParams; ///< Extensible port parameter list > for simplified topology structure > + ANC_DATA AncData; ///< Ancillary data override > +} DXIO_PORT_DESCRIPTOR; > + > +#pragma pack(pop) > + > +/// > +/// > +/// PCIe Complex descriptor > +/// > +typedef struct { > + UINT32 Flags; ///< Descriptor flags > + ///< Bit31 - last descriptor in topology > + UINT32 SocketId; ///< Socket Id > + DXIO_PORT_DESCRIPTOR *PciePortList; ///< Pointer to array of PCIe > port descriptors or NULL (Last element of array must be terminated with > DESCRIPTOR_TERMINATE_LIST). > + VOID *Reserved2; ///< Reserved for future use > + UINT8 BmcLinkLocation; ///< Identifies the socket/die location > of a BMC link (Used by AGESA, input not required) > + UINT8 BmcLinkLaneNum; ///< Identifies the socket/die > location of a BMC Lane number > + UINT8 Reserved3[2]; ///< Reserved for future > +} DXIO_COMPLEX_DESCRIPTOR; > + > +/// > +/// Engine descriptor type > +/// > +typedef enum { > + DxioUnusedEngine = 0, ///< Unused descriptor Excluded > from configuration > + DxioPcieEngine = 1, ///< PCIe port > + DxioUSBEngine = 2, ///< USB port > + ///< __Deprecated__ > + DxioSATAEngine = 3, ///< SATA > + DxioUSB_OVER_PCIE = 4, ///< USB4 PCIe (internal use > only) > + DxioUBMHFCEngine = 5, ///< New for Genoa UBM HFC > Connector for auto-discovery > + DxioOCP3Engine = 6, ///< New for Genoa OCP3 > Bifurcatable Connector > + DxioUdot3Engine = 7, ///< New for Genoa U.3 > Multiprotocol Connector > + DxioDPEngine = 8, ///< Digital Display __For APU > display connector list__ > + DxioEthernetEngine = 0x10, ///< Ethernet (GBe, XGBe) > + ///< __Deprecated__ > + DxioGOPEngine = 0x20, ///< GOP > + ///< __Deprecated__ > + DxioNTBDevice = 0x60, ///< For NBIF NTB Enable > (internal use only) > + DxioHDaudioEngine, ///< For NBIF HDaudtio Enable > (internal use only) > + DxioACPEngine, ///< For NBIF ACP Enable (internal > use only) > + DxioMP2Engine, ///< For NBIF MP2 Enable (internal > use only) > + DxioMaxPcieEngine ///< Max engine type for > boundary check. > +} DXIO_ENGINE_TYPE; > + > +/// > +/// PCIe link speeds > +/// > +typedef enum { > + DxioGenMaxSupported, ///< Maximum supported > + DxioGen1 = 1, ///< Gen1 > + DxioGen2, ///< Gen2 > + DxioGen3, ///< Gen3 > + DxioGen4, ///< Gen4 > + DxioGen5, ///< Gen5 > + MaxDxioGen ///< Max Gen for boundary check > +} DXIO_LINK_SPEEDS; > +#endif // AMD_PCIE_COMPLEX_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/AmdSoc.h > b/Platform/AMD/AgesaPkg/Include/AmdSoc.h > new file mode 100644 > index 0000000000..d62f260235 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/AmdSoc.h > @@ -0,0 +1,17 @@ > +/** @file > + > + Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _AMD_SOC_H_ > +#define _AMD_SOC_H_ > + > +#define F1A_BRH_A0_RAW_ID 0x00B00F00ul > +#define F1A_BRH_B0_RAW_ID 0x00B00F10ul > +#define F1A_BRH_B1_RAW_ID 0x00B00F11ul > +#define F1A_BRHD_A0_RAW_ID 0x00B10F00ul > +#define F1A_BRHD_B0_RAW_ID 0x00B10F10ul > +#endif // _AMD_SOC_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h > b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h > new file mode 100644 > index 0000000000..2291f7dc83 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h > @@ -0,0 +1,42 @@ > +/** @file > + Fabric resource manager common definition > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef FABRIC_RESOURCE_MANAGER_CMN_H_ > +#define FABRIC_RESOURCE_MANAGER_CMN_H_ > +#pragma pack (push, 1) > + > +#define MAX_SOCKETS_SUPPORTED 2 ///< Max number of sockets > in system. > +#define MAX_RBS_PER_SOCKET 20 ///< Max number of root > bridges per socket. > + > +/** > + * @brief DF address aperture structure. > + * @details This contains information used to define an MMIO region. > + */ > +typedef struct _FABRIC_ADDR_APERTURE { > + UINT64 Base; ///< Aperture base Address. > + UINT64 Size; ///< Aperture size. > + UINT64 Alignment; ///< Alignment bit map. 0xFFFFF means 1MB > align. > +} FABRIC_ADDR_APERTURE; > + > +/** > + * @brief DF Resource for each RootBridge structure. > + * @details This contains information used to define the MMIO region for > each RootBridge. > + */ > +typedef struct _FABRIC_RESOURCE_FOR_EACH_RB { > + FABRIC_ADDR_APERTURE > NonPrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_ > PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) above 4G. @see > FABRIC_ADDR_APERTURE > + FABRIC_ADDR_APERTURE > PrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER > _SOCKET]; ///< Prefetchable MMIO resource(s) above 4G. @see > FABRIC_ADDR_APERTURE > + FABRIC_ADDR_APERTURE > NonPrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_ > PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) below 4G. @see > FABRIC_ADDR_APERTURE > + FABRIC_ADDR_APERTURE > PrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_ > SOCKET]; ///< Prefetchable MMIO resource(s) below 4G. @see > FABRIC_ADDR_APERTURE > + FABRIC_ADDR_APERTURE > PrimaryRbSecondNonPrefetchableMmioSizeBelow4G; ///< > Primary RootBridge's second nonprefetchable MMIO size below 4G. @see > FABRIC_ADDR_APERTURE > + FABRIC_ADDR_APERTURE > PrimaryRbSecondPrefetchableMmioSizeBelow4G; ///< > Primary RootBridge's second prefetchable MMIO size below 4G. @see > FABRIC_ADDR_APERTURE > + FABRIC_ADDR_APERTURE > IO[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; > ///< IO resource(s) @see FABRIC_ADDR_APERTURE > + UINT16 > PciBusNumber[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; > ///< PCI bus number(s). > +} FABRIC_RESOURCE_FOR_EACH_RB; > +#pragma pack (pop) > +#endif // FABRIC_RESOURCE_MANAGER_CMN_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h > b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h > new file mode 100644 > index 0000000000..9e58f299b4 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h > @@ -0,0 +1,96 @@ > +/** @file > + AMD Memory Info Hob Definition > + > + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_MEMORY_INFO_HOB_H_ > +#define AMD_MEMORY_INFO_HOB_H_ > + > +/** > + * @brief 128 bit Buffer containing UID Unique Identifier value for Memory > Info HOB. > + * EFI_GUID defined in UefiBaseType.h > + */ > +extern EFI_GUID gAmdMemoryInfoHobGuid; > + > +#pragma pack (push, 1) > + > +/** > + * @brief Memory descriptor structure for each memory range > + */ > +typedef struct { > + UINT64 Base; ///< Base address of memory rang > + UINT64 Size; ///< Size of memory rang > + UINT32 Attribute; ///< Attribute of memory rang > + UINT32 Reserved; ///< For alignment purpose > +} AMD_MEMORY_RANGE_DESCRIPTOR; > + > +/** > + * @brief Memory attribute in the memory range descriptor = AVAILABLE > + */ > +#define AMD_MEMORY_ATTRIBUTE_AVAILABLE 0x1 > + > +/** > + * @brief Memory attribute in the memory range descriptor = UMA > + */ > +#define AMD_MEMORY_ATTRIBUTE_UMA 0x2 > + > +/** > + * @brief Memory attribute in the memory range descriptor = MMIO > + */ > +#define AMD_MEMORY_ATTRIBUTE_MMIO 0x3 > + > +/** > + * @brief Memory attribute in the memory range descriptor = RESERVED > + */ > +#define AMD_MEMORY_ATTRIBUTE_RESERVED 0x4 > + > +/** > + * @brief Memory attribute in the memory range descriptor = GPUMEM > + */ > +#define AMD_MEMORY_ATTRIBUTE_GPUMEM 0x5 > + > +/** > + * @brief Memory attribute in the memory range descriptor = GPU_SP > + */ > +#define AMD_MEMORY_ATTRIBUTE_GPU_SP 0x6 > + > +/** > + * @brief Memory attribute in the memory range descriptor = > GPU_RESERVED > + */ > +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED 0x7 > + > +/** > + * @brief Memory attribute in the memory range descriptor = > GPU_RESERVED_TMR > + */ > +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED_TMR 0x8 > + > +/** > + * @brief Memory attribute in the memory range descriptor = > RESERVED_SMUFEATURES > + */ > +#define AMD_MEMORY_ATTRIBUTE_Reserved_SmuFeatures 0x9 > + > +/// Memory info HOB structure > +typedef struct { > + UINT32 Version; ///< Version of HOB structure > + BOOLEAN AmdMemoryVddioValid; ///< This field > determines if Vddio is valid > + UINT16 AmdMemoryVddio; ///< Vddio Voltage > + BOOLEAN AmdMemoryVddpVddrValid; ///< This field > determines if VddpVddr is valid > + UINT8 AmdMemoryVddpVddr; ///< VddpVddr voltage > + BOOLEAN AmdMemoryFrequencyValid; ///< Memory > Frequency Valid > + UINT32 AmdMemoryFrequency; ///< Memory Frquency > + UINT32 AmdMemoryDdrMaxRate; ///< Memory > DdrMaxRate > + UINT32 NumberOfDescriptor; ///< Number of memory > range descriptor > + AMD_MEMORY_RANGE_DESCRIPTOR Ranges[1]; ///< Memory > ranges array > +} AMD_MEMORY_INFO_HOB; > + > +#pragma pack (pop) > + > +/** > + * @brief Macro that defines the Memory Info HOB version > + */ > +#define AMD_MEMORY_INFO_HOB_VERISION 0x00000110ul // Ver: > 00.00.01.10 > + > +#endif // AMD_MEMORY_INFO_HOB_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h > b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h > new file mode 100644 > index 0000000000..d144a4ad20 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h > @@ -0,0 +1,51 @@ > +/** @file > + AMD Psp Base Lib > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_PSP_BASELIB_V2_H_ > +#define AMD_PSP_BASELIB_V2_H_ > + > +#include <AmdPspDirectory.h> > + > +#define MAX_IMAGE_SLOT_COUNT 32 > + > +#define ALIGNMENT_4K BASE_4KB > +#define ALIGN_CHECK(addr, alignment) ((((UINTN)(addr)) & ((alignment) - 1)) > == 0) > +#define ALIGN_4K_CHECK(addr) ALIGN_CHECK((addr), ALIGNMENT_4K) > + > +#define IS_VALID_ADDR32(addr) (((UINT32)(addr) != 0) && > (UINT32)(addr) != 0xFFFFFFFF) > + > +#pragma pack (push, 1) > + > +#define FIRMWARE_TABLE_SIGNATURE 0x55AA55AAul > + > +/// Define the structure OEM signature table > +typedef struct _FIRMWARE_ENTRY_TABLEV2 { > + UINT32 Signature; ///< 0x00 Signature should be 0x55AA55AAul > + UINT32 ImcRomBase; ///< 0x04 Base Address for Imc Firmware > + UINT32 GecRomBase; ///< 0x08 Base Address for Gmc Firmware > + UINT32 XHCRomBase; ///< 0x0C Base Address for XHCI Firmware > + UINT32 LegacyPspDirBase; ///< 0x10 Base Address of PSP directory > + UINT32 PspDirBase; ///< 0x14 Base Address for PSP directory > + UINT32 Reserved1; ///< 0x18 Base Address for Reserved BIOS > directory > + UINT32 Reserved2; ///< 0x1C Base Address for Reserved BIOS > directory > + UINT32 Reserved3; ///< 0x20 Base Address for Reserved BIOS > directory > + UINT32 Config; ///< 0x24 reserved for EFS Configuration > + UINT32 NewBiosDirBase; ///< 0x28 Generic Base address for all > program > + UINT32 PspDirBackupBase; ///< 0x2C Backup PSP directory address for > all programs > +} FIRMWARE_ENTRY_TABLEV2; > + > +/// It also used as structure to store ISH generic information across programs > +typedef struct { > + UINT32 Priority; > + UINT32 UpdateRetries; > + UINT32 GlitchRetries; > + UINT32 ImageSlotAddr; > +} IMAGE_SLOT_HEADER; > + > +#pragma pack (pop) > + > +#endif // AMD_LIB_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h > b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h > new file mode 100644 > index 0000000000..23c90b65c2 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h > @@ -0,0 +1,83 @@ > +/** @file > + AMD Psp Ftpm Library header file > + > + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef PSP_FTPM_LIB_H_ > +#define PSP_FTPM_LIB_H_ > +#include <IndustryStandard/Acpi30.h> > + > +/* SYSTEM_TPM_CONFIG_VAL > + * Value range for APCB_TOKEN_UID_PSP_SYSTEM_TPM_CONFIG > + */ > +typedef enum { > + SYSTEM_TPM_CONFIG_DTPM = 0x00, ///< dTPM > + SYSTEM_TPM_CONFIG_PSP_FTPM = 0x01, ///< PSP FTPM > + SYSTEM_TPM_CONFIG_HSP_FTPM = 0x02, ///< HSP FTPM > + SYSTEM_TPM_CONFIG_NONE = 0xFF, ///< None of TPM > +} SYSTEM_TPM_CONFIG_VAL; > + > +#pragma pack (push, 1) > +/// Define TPM_2_CONTROL_AREA > +typedef struct { > + // Interface Identifier > + volatile UINT64 InterfaceIdentifier; ///< Interface Identifier > + // TPM2 Control Area Extension > + volatile UINT32 Clear; ///< Clear > + volatile UINT32 RemainingBytes; ///< RemainingBytes > + volatile UINT32 StatusReserved; ///< StatusReserved > + volatile UINT32 StatusError; ///< StatusError > + volatile UINT32 StatusCancel; ///< StatusCancel > + volatile UINT32 StatusStart; ///< StatusStart > + UINT64 InterruptControl; ///< InterruptControl > + UINT32 CommandSize; ///< CommandSize > + EFI_PHYSICAL_ADDRESS CommandAddress; ///< CommandAddress > + UINT32 ResponseSize; ///< ResponseSize > + EFI_PHYSICAL_ADDRESS ResponseAddress; ///< ResponseAddress > + // Memory Absent command/response buffer > + volatile UINT32 CmdRespHWBuffer; ///< Cmd/Rsp HW Buffer > +} TPM2_CONTROL_AREA; > + > +#pragma pack (pop) > + > +/** > + GET TPM related Info > + > + @param[in,out] FtpmStatus Used to hold more detail info (Unused > Currently) > + > + @return EFI_SUCCESS Ftpm function supported > + @return EFI_UNSUPPORTED Ftpm function unsupported > + > +**/ > +EFI_STATUS > +FtpmGetInfo ( > + IN OUT UINTN *FtpmStatus > + ); > + > +/** > + Execute a TPM command > + > + @param[in] CommandBuffer Point to the TPM command buffer > + @param[in] CommandSize Size of the TPM command buffer > + @param[in, out] ResponseBuffer Point to the TPM response buffer > + @param[in, out] ResponseSize Size of the TPM response buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold > the response > + > +**/ > +EFI_STATUS > +FtpmExecuteCommand ( > + IN VOID *CommandBuffer, > + IN UINT32 CommandSize, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINT32 *ResponseSize > + ); > + > +#endif //PSP_FTPM_LIB_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h > b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h > new file mode 100644 > index 0000000000..4ad4020f95 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h > @@ -0,0 +1,231 @@ > +/** @file > + > + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _PSP_ROM_ARMOR_LIB_H_ > +#define _PSP_ROM_ARMOR_LIB_H_ > + > +#include "Uefi.h" > + > +#define PSP_MAX_SPI_CMD_SUPPORT (4) ///< Max number of SPI > command support > +#define PSP_MAX_SPI_DATA_BUFFER_SIZE (72) ///< Max SPI Command > Data Buffer Size > +#define PSP_MAX_WHITE_LIST_CMD_NUM (32) ///< Max White list > allowed command array number support > +#define PSP_MAX_WHITE_LIST_REGION_NUM (16) ///< Max White list > allowed region array number support > + > +#define SPI_CHIP_SELECT_ALL (0) ///< Allowed on all chip selects > +#define SPI_CHIP_SELECT_1 (1) ///< Chip Select 1 > +#define SPI_CHIP_SELECT_2 (2) ///< Chip Select 2 > + > +#define SPI_COMMAND_FREQUENCY_66_66MHZ (0) ///< 0=66.66MHz > +#define SPI_COMMAND_FREQUENCY_33_33MHZ (1) ///< 1=33.33MHz > +#define SPI_COMMAND_FREQUENCY_22_22MHZ (2) ///< 2=22.22MHz > +#define SPI_COMMAND_FREQUENCY_16_66MHZ (3) ///< 3=16.66MHz > +#define SPI_COMMAND_FREQUENCY_100MHZ (4) ///< 4=100MHz > +#define SPI_COMMAND_FREQUENCY_800KHZ (5) ///< 5=800KHz > + > +#define SPI_COMMAND_NOT_PROCEDDED (0) ///< 0 = Command not > examined/processed > +#define SPI_COMMAND_COMPLETED (1) ///< 1 = Command > completed successfully > +#define SPI_COMMAND_EXECUTION_ERROR (2) ///< 2 = Execution > Error (i.e. timeout) > +#define SPI_COMMAND_NOT_ALLOWED (3) ///< 3 = Command not > allowed by Whitelist > +#define SPI_COMMAND_MALFORMED (4) ///< 4 = Command > malformed > + > +#pragma pack (push, 1) > + > +typedef struct { > + UINT8 ChipSelect; ///< 1 = CS1, 2 = CS2, all other values illegal > + > + UINT8 Frequency; ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, > + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal > + > + UINT8 BytesToTx; ///< Bytes to Transmit, valid range is 0-72. Does not > include the > + ///< SPI Opcode byte, but does include the address, dummy > bytes, and > + ///< data. > + > + UINT8 BytesToRx; ///< Bytes to Receive from device, BytesToTx + > BytesToRx <= 72 > + > + UINT8 OpCode; ///< The SPI Command OpCode (the first byte sent by > the SPI controller) > + > + UINT8 Reserved[3]; ///< Reserved for future expansion > + > + UINT8 Buffer[PSP_MAX_SPI_DATA_BUFFER_SIZE]; ///< The remaining > 0-72 bytes sent/received by the SPI controller. > + ///< > + ///< The SPI Controller will > + ///< 1. Assert the ChipSelect > + ///< 2. Send the one byte OpCode > + ///< 3. Send Buffer[0] to Buffer[BytesToTx-1] > to the SPI device > + ///< 4. Read BytesToRx bytes from the device > into Buffer[BytesToTx] to > + ///< Buffer[BytesToTx+BytesToRx-1] > + ///< 5. Deassert the ChipSelect line > + ///< > + ///< SPI ROM Commands that include a target > address send the address > + ///< immediately after the OpCode (i.e. > Buffer[0..2] or Buffer[0..3] > + ///< depending if 24 or 32bit addresses are > associated with the OpCode). > + ///< See the SPI ROM Device's datasheet for > full details on your > + ///< devices commands and formats. > +} SPI_COMMAND; ///< The struct of Spi Command > + > +typedef union { > + struct { > + ///< SPI_COMMUNICATION_RESULT > + UINT16 Command0Result : 4; ///< Result[ 3: 0] The result of > Command[0] > + UINT16 Command1Result : 4; ///< Result[ 7: 4] The result of > Command[1] > + UINT16 Command2Result : 4; ///< Result[11: 8] The result of > Command[2] > + UINT16 Command3Result : 4; ///< Result[15:12] The result of > Command[3] > + } Field; ///< the struct type of Command0 ~ Command4 > + UINT16 Value; ///< 16 bit value of Command0 ~ Command4 > +} SPI_COMMUNICATION_RESULT; ///< The union struct type of Spi > Communication Result > + > +typedef struct { > + UINT8 ReadyToRun; ///< Set to FALSE by x86 while the buffer is > being constructed. Set to > + ///< TRUE by x86 as the last step in building the > communication buffer, > + ///< just before x86 rings the PSP doorbell. > + ///< > + ///< Set to FALSE by PSP after the PSP copies the > buffer from DRAM to > + ///< private SRAM. > + > + UINT8 CommandCount; ///< Number of commands to execute, > Valid Values 1-4 > + > + SPI_COMMUNICATION_RESULT SpiCommunicationResult; ///< Set to zero > by x86 when the buffer is built. Atomically set to a > + ///< non-zero value by the PSP to indicate the > PSP has finished > + ///< processing the requests in the > communication buffer. The specific > + ///< value written by the PSP provides per > command results > + ///< > + ///< Result values with special meaning: > + ///< 0x0000 = (written by x86) PSP has not > finished handling the request > + ///< 0x1000 = PSP determined the request is > malformed (invalid > + ///< CommandCount, chipselect, > BytesToRx/Tx, etc) > + ///< 0x2000, 0x3000, 0x4000, ... , 0xF000 = > Reserved for future errors > + ///< > + ///< Generic Result values: > + ///< SpiCommunicationResult[ 3: 0] The > result of Command[0] > + ///< SpiCommunicationResult[ 7: 4] The > result of Command[1] > + ///< SpiCommunicationResult[11: 8] The > result of Command[2] > + ///< SpiCommunicationResult[15:12] The > result of Command[3] > + ///< 0 = Command not examined/processed > + ///< 1 = Command completed successfully > + ///< 2 = Execution Error (i.e. timeout) > + ///< 3 = Command not allowed by Whitelist > + ///< 4 = Command malformed > + ///< 5-15 = reserved for future use > + ///< > + ///< Examples of Generic Results: > + ///< 0x0000 - PSP has not finished the > request > + ///< 0x0001 - PSP ran Command0 > successfully, and is now idle > + ///< 0x0111 - PSP ran Command0/1/2 > successfully and is now idle > + ///< 0x0031 - PSP ran Command0, but > Command1 was blocked by whitelist > + > + SPI_COMMAND SpiCommand[PSP_MAX_SPI_CMD_SUPPORT]; ///< Spi > command array > +} SPI_COMMUNICATION_BUFFER; ///< The struct type of Spi > Communication Buffer > + > +typedef struct { > + UINT8 ChipSelect; ///< 0= Allowed on all chip selects, 1= CS1, 2= CS2, all > else invalid > + > + UINT8 Frequency; ///< The allowed frequency for the command > + ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, > + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal > + > + UINT8 OpCode; ///< The allowed commands opcode > + > + UINT8 MinTx; ///< The minimum range of allowed transmit byte > counts for this command > + ///< (does not include opcode) > + UINT8 MaxTx; ///< The maximum range of allowed transmit byte > counts for this command > + ///< (does not include opcode) > + > + UINT8 MinRx; ///< The minimum range of allowed Rx byte counts > + UINT8 MaxRx; ///< The maximum range of allowed Rx byte counts > + > + UINT8 AddrChkMethod; ///< 0=No address verification performed > + ///< 1=Treat Buffer[0-2] as a 24-bit address, and verify the > entire > + ///< ImpactZone of the command falls within one of the > allowed regions > + ///< 2=Treat Buffer[0-3] as a 32-bit address, and verify the > entire > + ///< ImpactZone of the command falls within one of the > allowed regions > + > + UINT32 ImpactSize; ///< The Impact Zone is the naturally aligned power > of two sized block > + ///< of addresses that may be impacted by a given SPI > Command. For > + ///< example, a sector erase command targeted at an address > within a > + ///< 64K block will impact every byte within that 64K block. > Likewise > + ///< a page program SPI command (i.e. write) may impact > many bytes > + ///< within the targeted 256/512 byte page due to page > wrap-around, but > + ///< no bytes outside the page. The ImapctSize field specifies > the power > + ///< of two size of the ImpactZone for this command. If > VerifyAddress is > + ///< zero (no checking) this field must also be zero, otherwise > this > + ///< field must be a power of two between 256 and 64MB > (256, 512, ..., > + ///< 67108864). NOTE: When setting this field, carefully > examine your > + ///< device's datasheet. > + ///< > +} WHITE_LIST_ALLOWED_COMMAND; ///< The struct type of White List > Allowed Command > + > +typedef struct { > + // 8 bytes > + UINT32 StartAddress; ///< LSB must be 0x00, bit31 identifies a > chipselect: 0=CS1, 1=CS2 > + UINT32 EndAddress; ///< LSB must be 0xFF, StartAddress must be less > than EndAddress > +} WHITE_LIST_ALLOWED_REGION; ///< The struct type of White List Allowed > Region > + > +typedef struct { > + UINT8 AllowedCmdCount; ///< Allow > Command Count > + UINT8 AllowedRegionCount; ///< Allow > Region Count > + WHITE_LIST_ALLOWED_COMMAND > WhitelistAllowedCommands[PSP_MAX_WHITE_LIST_CMD_NUM]; ///< White > List Allowed Command Table > + WHITE_LIST_ALLOWED_REGION > WhitelistAllowedRegions[PSP_MAX_WHITE_LIST_REGION_NUM]; ///< White > List Allowed Region Table > +} SPI_WHITE_LIST; ///< The struct type of Spi White List > + > +#pragma pack (pop) > + > +/** > + * @brief Request secures the SPI Controller > + * > + * @param[in,out] SpiCommunicationBuffer Spi Communication Structure > Buffer pointer > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspEnterSmmOnlyMode ( > + IN OUT SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer > + ); > + > +/** > + * @brief Loads the whitelist into the PSP. > + * > + * @param[in] SpiWhitelist SPI white list structure buffer pointer. > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspEnforceWhitelist ( > + IN SPI_WHITE_LIST *SpiWhitelist > + ); > + > +/** > + * @brief Request execute SPI command provide in TSEG comm buffer. > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspExecuteSpiCommand ( > + VOID > + ); > + > +/** > + * @brief Request PSP firmware switch SPI controller chip select. > + * > + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip > selects, 1= CS1, 2= CS2, all else invalid > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspSwitchChipSelect ( > + IN UINT8 ChipSelect > + ); > + > +#endif //_PSP_ROM_ARMOR_LIB_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h > b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h > new file mode 100644 > index 0000000000..0189910bd1 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h > @@ -0,0 +1,2722 @@ > +/** @file > + > + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AML_LIB_H_ > +#define AML_LIB_H_ > + > +#include <Uefi.h> > +#include <IndustryStandard/Acpi.h> > + > +typedef enum { > + AmlStart, > + AmlClose, > + AmlInvalid > +} AML_FUNCTION_PHASE; > + > +#define AML_OBJECT_INSTANCE_SIGNATURE SIGNATURE_32 ('a', 'm', 'l', 'o') > + > +// > +// Device Status Bitmap (Section 6.3.7 ACPI version 6.3) > +// Bit [0] - Set if the device is present. > +// Bit [1] - Set if the device is enabled and decoding its resources. > +// Bit [2] - Set if the device should be shown in the UI. > +// Bit [3] - Set if the device is functioning properly (cleared if device > +// failed its diagnostics). > +// Bit [4] - Set if the battery is present. > +// Bits [31:5] - Reserved (must be cleared). > +// > +#define DEVICE_PRESENT_BIT 0x0001 > +#define DEVICE_ENABLED_BIT 0x0002 > +#define DEVICE_IN_UI_BIT 0x0004 > +#define DEVICE_HEALTH_BIT 0x0008 > +#define DEVICE_BATTERY_BIT 0x0010 // Control Method Battery Device > Only > + > +typedef enum { > + UnknownObj, > + IntObj, > + StrObj, > + BuffObj, > + PkgObj, > + FieldUnitObj, > + DeviceObj, > + EventObj, > + MethodObj, > + MutexObj, > + OpRegionObj, > + PowerResObj, > + ProcessorObj, > + ThermalZoneObj, > + BuffFieldObj, > + DDBHandlObj, > + InvalidObj > +} OBJECT_TYPE_KEYWORD; > + > +typedef struct { > + UINT32 Signature; > + BOOLEAN Completed; > + UINTN DataSize; > + UINT8 *Data; > + LIST_ENTRY Link; > +} AML_OBJECT_INSTANCE; > + > +// > ************************************************************ > *************** > +// AML defines to be consistent with already existing > +// MdePkg/Include/IndustryStandard/Acpi*.h defines. > +// *** These could be upstreamed at some point. > +// > ************************************************************ > *************** > +// Limits of (DWord|Word|QWord)Space ResourceType > +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MIN 0xC0 > +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MAX 0xFF > + > +// General Flags: Flags that are common to all resource types > +// Bits[7:4] Reserved(must be 0) > +// Bit[3] Max Address Fixed, _MAF: > +// 1 The specified maximum address is fixed > +// 0 The specified maximum address is not fixed and can be changed > +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED (1 << 3) > +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED (0 << 3) > +#define EFI_ACPI_GENERAL_FLAG_MASK_MAF > EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED > +// Bit[2] Min Address Fixed, _MIF: > +// 1 The specified minimum address is fixed > +// 0 The specified minimum address is not fixed and can be changed > +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED (1 << 2) > +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED (0 << 2) > +#define EFI_ACPI_GENERAL_FLAG_MASK_MIF > EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED > +// Bit[1] Decode Type, _DEC: > +// 1 This bridge subtractively decodes this address(top level bridges only) > +// 0 This bridge positively decodes this address > +#define EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE (1 << 1) > +#define EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE (0 << 1) > +#define EFI_ACPI_GENERAL_FLAG_MASK_DEC > EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE > +// Bit[0] Consumer / Producer: > +// 1 This device consumes this resource > +// 0 This device produces and consumes this resource > +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER (1 << 0) > +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER (0 << 0) > +#define EFI_ACPI_GENERAL_FLAG_MASK_USAGE > EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER > + > +// Memory Resource Flag (Resource Type = 0) DefinitionsBits > +// Memory Resource Flag Masks > +// Bits[7:6] Reserved(must be 0) > +// Bit[5] Memory to I/O Translation, _TTP: > +// 0 TypeStatic > +// 1 Type Translation > +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_TTP (1 << 5) > +// Bit[4:3] Memory Attributes, _MTP: > +// 0 AddressRangeMemory > +// 1 AddressRangeReserved > +// 2 AddressRangeACPI > +// 3 AddressRangeNVS > +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MTP (3 << 3) > +// Bit[2:1] Memory Attributes, _MEM: > +// 0 The memory is non-cacheable > +// 1 The memory is cacheable > +// 2 The memory is cacheable and supports write-combining > +// 3 The memory is cacheable and prefetchable > +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM (3 << 1) > +// Bit[0] Write Status, _RW: > +// 0 This memory range is read-only > +// 1 This memory is read-write > +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW (1 << 0) > + > +// I/O Resource Flag (Resource Type = 1) DefinitionsBits > +// I/O Resource Flags > +// Bit [7:6] Reserved (must be 0) > +// Bit [5] Sparse Translation, _TRS. This bit is only meaningful if Bit [4] is set. > +// 1 SparseTranslation: The primary-side memory address of any specific > I/O port > +// within the secondary-side range can be found using the following > function. > +// address = (((port & 0xFFFc) << 10) || (port & 0xFFF)) + _TRA In the > address > +// used to access the I/O port, bits[11:2] must be identical to bits[21:12], > +// this gives four bytes of I/O ports on each 4 KB page. > +// 0 DenseTranslation: The primary-side memory address of any specific > I/O port > +// within the secondary-side range can be found using the following > function. > +// address = port + _TRA > +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_SPARSE_TRANSLATION (1 > << 5) > +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_DENSE_TRANSLATION (0 > << 5) > +// Bit [4] I/O to Memory Translation, _TTP > +// 1 TypeTranslation: This resource, which is I/O on the secondary side of > the > +// bridge, is memory on the primary side of the bridge. > +// 0 TypeStatic: This resource, which is I/O on the secondary side of the > +// bridge, is also I/O on the primary side of the bridge. > +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_TRANSLATION (1 << > 4) > +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_STATIC (0 << 4) > +// Bit [3:2] Reserved (must be 0) > +// Bit [1:0] _RNG > +// 3 Memory window covers the entire range > +// 2 ISARangesOnly. This flag is for bridges on systems with multiple > bridges. > +// Setting this bit means the memory window specified in this descriptor > is > +// limited to the ISA I/O addresses that fall within the specified window. > The > +// ISA I/O ranges are: n000-n0FF, n400-n4FF, n800-n8FF, nC00-nCFF. This > bit can > +// only be set for bridges entirely configured throughACPI namespace. > +// 1 NonISARangesOnly. This flag is for bridges on systems with multiple > +// bridges. Setting this bit means the memory window specified in this > +// descriptor is limited to the non-ISA I/O addresses that fall within the > +// specified window. The non-ISA I/O ranges are: n100-n3FF, n500-n7FF, > +// n900-nBFF, nD00-nFFF. This bit can only be set for bridges entirely > +// configured through ACPI namespace. > +// 0 Reserved > +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE > (3 << 0) > +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY > (2 << 0) > +#define > EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY (1 << > 0) > + > +#define AML_OBJECT_INSTANCE_FROM_LINK(a) BASE_CR (a, > AML_OBJECT_INSTANCE, Link) > + > +// Method Serialize Flag Values > +typedef enum { > + NotSerialized, > + Serialized, > + FlagInvalid > +} METHOD_SERIALIZE_FLAG; > +// AccessField Access Attrib Flags. > +// Ref ACPI spec 6.3 > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL > 0x00 > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK > 0x02 > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE > 0x04 > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE 0x06 > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD > 0x08 > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK > 0x0A > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES 0x0B > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL > 0x0C > +#define > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL > 0x0D > +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES > 0x0E > +#define > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES > 0X0F > + > +// AccessField access types > +typedef enum { > + AnyAcc, > + ByteAcc, > + WordAcc, > + DWordAcc, > + QWordAcc, > + BufferAcc, > +} EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS; > + > +// Field lock rules > +typedef enum { > + NoLock, > + Lock > +} EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS; > + > +// Field update rules > +typedef enum { > + Preserve, > + WriteAsOnes, > + WriteAsZeros > +} EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS; > + > +// Field access attributes. for AttribBytes, AttribRawBytes and > AttribRawProcessBytes > +// the ExtendedAccessField definition is used, as this is what iASL compiles > into, rather > +// than the AccessField that is specified in the ACPI spec. > +typedef enum { > + AttribNormal = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL, > + AttribQuick = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK, > + AttribSendReceive = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE, > + AttribByte = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE, > + AttribWord = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD, > + AttribBlock = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK, > + AttribBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES, > + AttribProcessCall = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL, > + AttribBlockProcessCall = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL, > + AttribRawBytes = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES, > + AttribRawProcessBytes = > EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES > +} EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS; > + > +// > +// Resource Type Specific Flags > +// Ref ACPI specification 6.4.3.5.5 > +// > +// > +// DMA Information > +// Ref ACPI specification 6.4.2.2 > +// > +// DmaType values > +typedef enum { > + Compatibility = EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY, > + TypeA = EFI_ACPI_DMA_SPEED_TYPE_A, > + TypeB = EFI_ACPI_DMA_SPEED_TYPE_B, > + TypeF = EFI_ACPI_DMA_SPEED_TYPE_F > +} EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS; > + > +// IsBusMaster values > +typedef enum { > + NotBusMaster = 0, > + BusMaster = EFI_ACPI_DMA_BUS_MASTER > +} EFI_ACPI_DMA_BUS_MASTER_KEYWORDS; > + > +// DmaTransferSize values > +typedef enum { > + Transfer8 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT, > + Transfer8_16 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT, > + Transfer16 = EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT > +} EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS; > + > +// > +// Interrupt Resource Descriptor Information > +// Ref ACPI specification 6.4.2.1 > +// > +// IRQ Information - Wake Capability > +// > +#define EFI_ACPI_IRQ_WAKE_CAPABLE_MASK 0x20 > +#define EFI_ACPI_IRQ_NOT_WAKE_CAPABLE 0x0 > +#define EFI_ACPI_IRQ_WAKE_CAPABLE 0x20 > + > +typedef enum { > + NotWakeCapable = EFI_ACPI_IRQ_NOT_WAKE_CAPABLE, > + WakeCapable = EFI_ACPI_IRQ_WAKE_CAPABLE > +} EFI_ACPI_IRQ_WAKE_CAPABILITY_KEYWORDS; > + > +// > +// IRQ Information - Interrupt Sharing > +// > +#define EFI_ACPI_IRQ_EXCLUSIVE 0x0 > + > +typedef enum { > + Exclusive = EFI_ACPI_IRQ_EXCLUSIVE, > + Shared = EFI_ACPI_IRQ_SHARABLE, > + ExclusiveAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | > EFI_ACPI_IRQ_EXCLUSIVE, > + SharedAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | > EFI_ACPI_IRQ_SHARABLE > +} EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS; > + > +// > +// IRQ Information - Interrupt Polarity > +// > +typedef enum { > + ActiveHigh = EFI_ACPI_IRQ_HIGH_TRUE, > + ActiveLow = EFI_ACPI_IRQ_LOW_FALSE > +} EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS; > + > +// > +// IRQ Information - Interrupt Mode > +// > +#define EFI_ACPI_IRQ_MODE_MASK 0x1 > +typedef enum { > + LevelTriggered = EFI_ACPI_IRQ_LEVEL_TRIGGERED, > + EdgeTriggered = EFI_ACPI_IRQ_EDGE_TRIGGERED > +} EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS; > + > +// IO Port Descriptor Information > +// Ref ACPI specification 6.4.2.5 > +// > +typedef enum { > + Decode16 = EFI_ACPI_IO_DECODE_16_BIT, > + Decode10 = EFI_ACPI_IO_DECODE_10_BIT > +} EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION; > + > +// > +// Memory Resource Information > +// Ref ACPI specification 6.4.3.5 > +// > +// Consumer/Producer Bit[0] > +typedef enum { > + ResourceProducer = EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER, > + ResourceConsumer = EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER > +} RESOURCE_USAGE_FLAG; > + > +// Decode Type (_DEC) Bit[1] > +typedef enum { > + PosDecode = EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE, > + SubDecode = EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE > +} MEM_DECODE_FLAG; > + > +// Min Address Fixed (_MIF) Bit[2] > +typedef enum { > + MinNotFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED, > + MinFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED > +} MIN_FIXED_FLAG; > + > +// Max Address Fixed (_MAF) Bit[3] > +typedef enum { > + MaxNotFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED, > + MaxFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED > +} MAX_FIXED_FLAG; > + > +// Memory Attributes (_MEM) Bits[2:1] > +typedef enum { > + NonCacheable = > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_NON_CACHEABLE, > + Cacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE, > + WriteCombining = > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_WRITE_COMBINI > NG, > + Prefetchable = > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE > +} CACHEABLE_FLAG; > + > +// Write Status (_RW) Bit[0] > +typedef enum { > + ReadOnly = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_ONLY, > + ReadWrite = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_WRITE > +} READ_WRITE_FLAG; > + > +// Memory Attributes (_MTP) Bits[4:3] > +typedef enum { > + AddressRangeMemory = > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_MEMORY, > + AddressRangeReserved = > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_RESERVED, > + AddressRangeACPI = > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_ACPI, > + AddressRangeNVS = > EFI_APCI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_NVS > +} MEMORY_RANGE_TYPE; > + > +// Memory to IO Translation (_TTP) Bit[5] > +// Note: IO and Memory Resources use different bits for this. > +// Value must be handled at function level when implemented. > +typedef enum { > + TypeStatic = 0, > + TypeTranslation = 1 > +} MEMORY_TRANSLATION_TYPE; > + > +// Memory Window Attributes (_RNG) Bits[1:0] > +typedef enum { > + Reserved = 0, > + NonISAOnly = > EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY, > + ISAOnly = > EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY, > + EntireRange = > EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE, > + ISARangeMax > +} IO_ISA_RANGES; > + > +// Generic Address Space Address IDs > +typedef enum { > + SystemMemory = EFI_ACPI_6_4_SYSTEM_MEMORY, > + SystemIO = EFI_ACPI_6_4_SYSTEM_IO, > + PCI_Config = EFI_ACPI_6_4_PCI_CONFIGURATION_SPACE, > + EmbeddedControl = EFI_ACPI_6_4_EMBEDDED_CONTROLLER, > + SMBus = EFI_ACPI_6_4_SMBUS, > + SystemCMOS = EFI_ACPI_6_4_SYSTEM_CMOS, > + PciBarTarget = EFI_ACPI_6_4_PCI_BAR_TARGET, > + IPMI = EFI_ACPI_6_4_IPMI, > + GeneralPurposeIO = EFI_ACPI_6_4_GENERAL_PURPOSE_IO, > + GenericSerialBus = EFI_ACPI_6_4_GENERIC_SERIAL_BUS, > + PCC = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, > + PlatformCommChannel = > EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, > + FFixedHW = EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE > +} GENERIC_ADDRESS_SPACE_ID; > + > +typedef enum { > + UndefinedSize = EFI_ACPI_6_4_UNDEFINED, > + ByteSize = EFI_ACPI_6_4_BYTE, > + WordSize = EFI_ACPI_6_4_WORD, > + DWordSize = EFI_ACPI_6_4_DWORD, > + QWordSize = EFI_ACPI_6_4_QWORD > +} ACPI_DATA_SIZE; > + > +typedef ACPI_DATA_SIZE GENERIC_ADDRESS_ACCESS_SIZE; > + > +// > ************************************************************ > *************** > +// AML Objects > +// > ************************************************************ > *************** > + > +// --------------------------------------------------------------------------- > +// Table and Table Header Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates an AML Encoded Table > + Object must be created between AmlStart and AmlClose Phase > + > + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum > OemID > + OemTableID OemRevision CreatorID CreatorRevision > + > + TableSignature := DWordData // As defined in section 5.2.3. > + TableLength := DWordData // Length of the table in bytes including > the > + // block header > + SpecCompliance := ByteData // The revision of the structure. > + CheckSum := ByteData // Byte checksum of the entire table. > + OemID := ByteData(6) // OEM ID of up to 6 characters. > + // If the OEM ID is shorter than 6 > + // characters, it can be terminated with a > + // NULL character. > + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. > + // If the OEM Table ID is shorter than > + // 8 characters, it can be terminated with > + // a NULL character. > + OemRevision := DWordData // OEM Table Revision. > + CreatorID := DWordData // Vendor ID of the ASL compiler. > + CreatorRevision := DWordData // Revision of the ASL compiler. > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] TableNameString - Table Name > + @param[in] ComplianceRev - Compliance Revision > + @param[in] OemId - OEM ID > + @param[in] OemTableId - OEM ID of table > + @param[in] OemRevision - OEM Revision number > + @param[in] CreatorId - Vendor ID of the ASL compiler > + @param[in] CreatorRevision - Vendor Revision of the ASL compiler > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDefinitionBlock ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *TableNameString, > + IN UINT8 ComplianceRev, > + IN CHAR8 *OemId, > + IN CHAR8 *OemTableId, > + IN UINT32 OemRevision, > + IN CHAR8 *CreatorId, > + IN UINT32 CreatorRevision, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Name Objects Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates a Namestring AML Object and inserts it into the linked list > + > + Completes NameString in one call as "one phase" > + LeadNameChar := 'A'-'Z' | '_' > + DigitChar := '0'-'9' > + NameChar := DigitChar | LeadNameChar > + RootChar := '\' > + ParentPrefixChar := '^' > + > + 'A'-'Z' := 0x41 - 0x5A > + '_' := 0x5F > + '0'-'9' := 0x30 - 0x39 > + '\' := 0x5C > + '^' := 0x5E > + > + NameSeg := <LeadNameChar NameChar NameChar NameChar> > + // Notice that NameSegs shorter than 4 characters are filled with > + // trailing underscores ('_'s). > + NameString := <RootChar NamePath> | <PrefixPath NamePath> > + PrefixPath := Nothing | <'^' PrefixPath> > + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName > + > + DualNamePath := DualNamePrefix NameSeg NameSeg > + DualNamePrefix := 0x2E > + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) > + MultiNamePrefix := 0x2F > + > + SegCount := ByteData > + > + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is > + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total > encoding > + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg > + NameSeg has a smaller encoding than the encoding of: > MultiNamePrefix(2) > + NameSeg NameSeg > + > + SimpleName := NameString | ArgObj | LocalObj > + SuperName := SimpleName | DebugObj | Type6Opcode > + NullName := 0x00 > + Target := SuperName | NullName > + > + @param[in] String - Null Terminated NameString Representation > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > + **/ > +EFI_STATUS > +EFIAPI > +AmlOPNameString ( > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Data Objects Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates an optimized integer object > + > + ComputationalData := ByteConst | WordConst | DWordConst | > QWordConst | String | > + ConstObj | RevisionOp | DefBuffer > + DataObject := ComputationalData | DefPackage | DefVarPackage > + DataRefObject := DataObject | ObjectReference | DDBHandle > + ByteConst := BytePrefix ByteData > + BytePrefix := 0x0A > + WordConst := WordPrefix WordData > + WordPrefix := 0x0B > + DWordConst := DWordPrefix DWordData > + DWordPrefix := 0x0C > + QWordConst := QWordPrefix QWordData > + QWordPrefix := 0x0E > + ConstObj := ZeroOp | OneOp | OnesOp > + ByteData := 0x00 - 0xFF > + WordData := ByteData[0:7] ByteData[8:15] > + // 0x0000-0xFFFF > + DWordData := WordData[0:15] WordData[16:31] > + // 0x00000000-0xFFFFFFFF > + QWordData := DWordData[0:31] DWordData[32:63] > + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF > + ZeroOp := 0x00 > + OneOp := 0x01 > + OnesOp := 0xFF > + > + @param[in] Phase - Example: AmlStart, AmlClose > + @param[in] Integer - Number to be optimized and encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDataInteger ( > + IN UINT64 Integer, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a ByteData integer object for use in Buffer objects. Does not > + include opcode. > + > + ByteData := 0x00 - 0xFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPByteData ( > + IN UINT8 Integer, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a WordData integer object for use in Buffer objects. Does not > + include opcode. > + > + WordData := 0x0000 - 0xFFFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordData ( > + IN UINT16 Integer, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a DWordData integer object for use in Buffer objects. Does not > + include opcode. > + > + DWordData := 0x00000000 - 0xFFFFFFFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordData ( > + IN UINT32 Integer, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a QWordData integer object for use in Buffer objects. Does not > + include opcode. > + > + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordData ( > + IN UINT64 Integer, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a data string object > + > + ComputationalData := String > + > + String := StringPrefix AsciiCharList NullChar > + StringPrefix := 0x0D > + AsciiCharList := Nothing | <AsciiChar AsciiCharList> > + AsciiChar := 0x01 - 0x7F > + NullChar := 0x00 > + > + @param[in] String - String to be encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDataString ( > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a data buffer AML object from an array > + > + This will take the passed in buffer and generate an AML Object from that > + buffer > + > + @param[in] Buffer - Buffer to be placed in AML Object > + @param[in] BufferSize - Size of Buffer to be copied into Object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDataBufferFromArray ( > + IN VOID *Buffer, > + IN UINTN BufferSize, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Package Length Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates a Package Length AML Object and inserts it into the linked list > + > + PkgLength := PkgLeadByte | > + <PkgLeadByte ByteData> | > + <PkgLeadByte ByteData ByteData> | > + <PkgLeadByte ByteData ByteData ByteData> > + > + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> > + <bit 5-4: Only used if PkgLength < 63> > + <bit 3-0: Least significant package length nybble> > + > + Note: The high 2 bits of the first byte reveal how many follow bytes are in > + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used > + to encode the package length (in other words, values 0-63). If the package > + length value is more than 63, more than one byte must be used for the > encoding > + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. > + > + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become > + the least significant 4 bits of the resulting package length value. The next > + ByteData will become the next least significant 8 bits of the resulting value > + and so on, up to 3 ByteData bytes. Thus, the maximum package length is > 2**28. > + > + @param[in] Phase - Example: AmlStart, AmlClose > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlPkgLength ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Term Objects Encoding > +// --------------------------------------------------------------------------- > + > +// --------------------------------------------------------------------------- > +// Namespace Modifier Objects Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates a Scope (ObjectName, Object) > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefScope := ScopeOp PkgLength NameString TermList > + ScopeOp := 0x10 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] String - Location > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlScope ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Name (ObjectName, Object) > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefName := NameOp NameString DataRefObject > + NameOp := 0x08 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] Name - Named Object name > + @param[in,out] ListHead - Linked list has completed Name Object after > AmlClose > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlName ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates an Alias (SourceObject, AliasObject) > + > + DefAlias := AliasOp NameString NameString > + AliasOp := 0x06 > + > + @param[in] SourceName - Any named Source Object NameString > + @param[in] AliasName - Alias Object NameString > + @param[in,out] ListHead - Linked list has completed the Alias Object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPAlias ( > + IN CHAR8 *SourceName, > + IN CHAR8 *AliasName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Named Objects Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates a Device (ObjectName, Object) > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefName := DeviceOp PkgLength NameString TermList > + NameOp := ExtOpPrefix 0x82 > + ExtOpPrefix := 0x5B > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] Name - Named Object name > + @param[in,out] ListHead - Linked list has completed Name Object after > AmlClose > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDevice ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a NamedField or a ReservedField, depending on the > + parameters. > + > + To create a NamedField item pass in the NameSeg and Bitlength > + as in ASL. To create a ReservedField pass "" as the Name. > + Must be used inside a Field or IndexField TermList. > + > + NamedField := NameSeg PkgLength > + ReservedField := 0x00 PkgLength > + > + @param[in] Name - Field NameSeg > + @param[in] BitLength - Length of field item in bits > + @param[in,out] ListHead - Linked list has completed FieldUnitItem > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPFieldUnit ( > + IN CHAR8 *Name, > + IN UINT32 BitLength, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Field > + > + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} > + > + FieldUnitList must be created between AmlStart and AmlClose Phase > + > + DefField := FieldOp PkgLength NameString FieldFlags FieldList > + FieldOp := ExtOpPrefix 0x81 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] Name - Field NameString > + @param[in] AccessType - Access Type for field > + @param[in] LockRule - Lock rule for field > + @param[in] UpdateRule - Update rule for field > + @param[in,out] ListHead - Linked list has completed Field Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlField ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *Name, > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, > + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a BankField > + > + BankField (RegionName, BankName, BankValue, AccessType, LockRule, > UpdateRule) {FieldUnitList} > + FieldUnitList must be added between AmlStart and AmlClose phase > + > + DefBankField := BankFieldOp PkgLength NameString NameString BankValue > FieldFlags FieldList > + BankFieldOp := ExtOpPrefix 0x87 > + BankValue := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] RegionName - Name of host Operation Region > + @param[in] BankName - Name of bank selection register > + @param[in] BankValue - Bank Selection ID > + @param[in] AccessType - Access Type as in Field > + @param[in] LockRule - Lock rule as in Field > + @param[in] UpdateRule - Update rule as in Field > + @param[in,out] ListHead - Linked list has completed BankField Object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlBankField ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *RegionName, > + IN CHAR8 *BankName, > + IN UINT64 BankValue, > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, > + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates an IndexField > + > + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) > {FieldUnitList} > + > + FieldUnitList must be added between AmlStart and AmlClose phase > + > + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags > FieldList > + IndexFieldOp := ExtOpPrefix 0x86 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] IndexName - Name of Index FieldUnit > + @param[in] DataName - Name of Data FieldUnit > + @param[in] AccessType - Access Type for the FieldUnit > + @param[in] LockRule - Lock rule for the FieldUnit > + @param[in] UpdateRule - Update rule for the FieldUnit > + @param[in,out] ListHead - Linked list has completed IndexField Object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlIndexField ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *IndexName, > + IN CHAR8 *DataName, > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, > + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Offset (ByteOffset) > + > + Creates a ReservedField if the passed ByteOffset is larger than > + the previous bit length value optionally specified by an AmlOPFieldListItem, > + or another Offset call. All offsets are defined starting from zero, based at > + the starting address of the parent Operation Region. > + > + ReservedField := 0x00 PkgLength > + > + @param[in] ByteLength -Byte offset of the next defined field within > + the parent Operation Region > + @param[in,out] ListHead - Linked list has completed Offset object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPOffset ( > + IN UINT32 ByteOffset, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + OperationRegion (RegionName, RegionSpace, Offset, Length) > + > + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset > RegionLen > + OpRegionOp := ExtOpPrefix 0x80 > + RegionSpace := > + ByteData // 0x00 SystemMemory > + // 0x01 SystemIO > + // 0x02 PCI_Config > + // 0x03 EmbeddedControl > + // 0x04 SMBus > + // 0x05 System CMOS > + // 0x06 PciBarTarget > + // 0x07 IPMI > + // 0x08 GeneralPurposeIO > + // 0x09 GenericSerialBus > + // 0x0A PCC > + // 0x80-0xFF: OEM Defined > + RegionOffset := TermArg => Integer > + RegionLen := TermArg => Integer > + > + @param[in] RegionName - Name for the Operation Region > + @param[in] RegionSpace - Region Space type > + @param[in] Offset - Offset within the selected RegionSpace at which > the > + region starts (byte-granular) > + @param[in] Length - Length of the region in bytes. > + @param[in,out] ListHead - Linked list head > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPOperationRegion ( > + IN CHAR8 *RegionName, > + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, > + IN UINT64 Offset, > + IN UINT64 Length, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates an AccessAs Field Unit > + > + AccessAs (AccessType, AccessAttribute) > + AccessAs (AccessType, AccessAttribute (AccessLength)) > + > + AccessField := 0x01 AccessType AccessAttrib > + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. > + // Bits 4:5 - Reserved > + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes > + // 1 = AccessAttrib = AttribBytes (x) > + // 2 = AccessAttrib = AttribRawBytes (x) > + // 3 = AccessAttrib = AttribRawProcessBytes (x) > + // > + // x' is encoded as bits 0:7 of the AccessAttrib byte. > + > + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or > + // GPIO OpRegions, AccessAttrib can be one of > + // the following values: > + // 0x02 AttribQuick > + // 0x04 AttribSendReceive > + // 0x06 AttribByte > + // 0x08 AttribWord > + // 0x0A AttribBlock > + // 0x0C AttribProcessCall > + // 0x0D AttribBlockProcessCall > + > + @param[in] AccessType - Access type for field member > + @param[in] AccessAttribute - Access attribute for field member > + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, > + AttribRawBytes, or AttribRawProcessBytes. > + Specifies the access length for the field member > + Otherwise, ignored. > + @param[in,out] ListHead - Linked list that has completed AccessAs > Object > + after AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPAccessAs ( > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, > + IN UINT8 AccessLength, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates an External Object > + > + External (ObjectName, ObjectType, ReturnType, ParameterTypes) > + > + Note: ReturnType is not used for AML encoding and is therefore not passed > in > + to this function. > + ParameterTypes is only used if the ObjectType is a MethodObj. It > + specifies MethodObj's argument types in a list. For the purposes of > + this library, we are passing in the the number of input parameters for > + that MethodObj. > + > + DefExternal := ExternalOp NameString ObjectType ArgumentCount > + ExternalOp := 0x15 > + ObjectType := ByteData > + ArgumentCount := ByteData (0 - 7) > + > + @param[in] Name - Object name > + @param[in] ObjectType - Type of object declared > + @param[in] NumArgs - Only used if ObjectType is MethodObj. > + Specifies the number of input parameters for > + that MethodObj since AML does not store > + ArgTypes here. > + Otherwise, ignored. > + @param[in,out] ListHead - Linked list that has completed External Object > + after AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPExternal ( > + IN CHAR8 *Name, > + IN UINT8 ObjectType, > + IN UINT8 NumArgs, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a CreateField AML Object and inserts it into the linked list > + > + Syntax: > + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) > + > + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString > + CreateFieldOp := ExtOpPrefix 0x13 > + ExtOpPrefix := 0x5B > + SourceBuff := TermArg => Buffer > + BitIndex := TermArg => Integer > + NumBits := TermArg -> Integer > + > + @param[in] SourceBuffer, - Buffer to house the new buffer field object > + @param[in] BitIndex, - Starting bit index place the new buffer > + @param[in] NumBits, - Number of bits to reserve > + @param[in] FieldName, - The new buffer field object to be created in > SourceBuffer > + @param[in,out] ListHead - Linked list has completed CreateField object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 BitIndex, > + IN UINT64 NumBits, > + IN CHAR8 *FieldName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a CreateBitField AML Object and inserts it into the linked list > + > + Syntax: > + CreateBitField (SourceBuffer, BitIndex, BitFieldName) > + > + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString > + CreateBitFieldOp := 0x8D > + SourceBuff := TermArg => Buffer > + BitIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field > object > + @param[in] BitIndex, - Starting bit index to place the new buffer > + @param[in] BitFieldName, - Name of the BitField > + @param[in,out] ListHead - Linked list has completed CreateBitField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateBitField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 BitIndex, > + IN CHAR8 *BitFieldName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a CreateByteField AML Object and inserts it into the linked list > + > + Syntax: > + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) > + > + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex > NameString > + CreateByteFieldOp := 0x8C > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field > object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] ByteFieldName, - Name of the ByteField > + @param[in,out] ListHead - Linked list has completed CreateByteField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateByteField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *ByteFieldName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a CreateDWordField AML Object and inserts it into the linked list > + > + Syntax: > + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) > + > + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex > NameString > + CreateDWordFieldOp := 0x8A > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord > field object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] DWordFieldName, - Name of the DWordField > + @param[in,out] ListHead - Linked list has completed > CreateDWordField object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateDWordField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *DWordFieldName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a CreateQWordField AML Object and inserts it into the linked list > + > + Syntax: > + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) > + > + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex > NameString > + CreateQWordFieldOp := 0x8F > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord > field object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] QWordFieldName, - Name of the QWordField > + @param[in,out] ListHead - Linked list has completed > CreateQWordField object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateQWordField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *QWordFieldName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a CreateWordField AML Object and inserts it into the linked list > + > + Syntax: > + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) > + > + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex > NameString > + CreateWordFieldOp := 0x8B > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to house the new buffer word field > object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] WordFieldName, - Name of the WordField > + @param[in,out] ListHead - Linked list has completed CreateWordField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateWordField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *WordFieldName, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Method > + > + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, > + ParameterTypes) {TermList} > + > + TermList must be created between AmlStart and AmlClose Phase > + > + Note: ReturnType and ParameterTypes are not used for AML encoding > + and are therefore not passed in to this function. > + > + DefMethod := MethodOp PkgLength NameString MethodFlags TermList > + MethodOp := 0x14 > + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) > + // bit 3: SerializeFlag > + // 0 NotSerialized > + // 1 Serialized > + // bit 4-7: SyncLevel (0x00-0x0f) > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] Name - Method name > + @param[in] NumArgs - Number of arguments passed in to method > + @param[in] SerializeRule - Flag indicating whether method is serialized > + or not > + @param[in] SyncLevel - synchronization level for the method (0 - 15), > + use zero for default sync level. > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlMethod ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *Name, > + IN UINT8 NumArgs, > + IN METHOD_SERIALIZE_FLAG SerializeRule, > + IN UINT8 SyncLevel, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Type 1 Opcodes Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates an Else object > + > + TermList must be created between AmlStart and AmlClose Phase > + > + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be > + supported and must be created with Else and If. > + > + DefElse := Nothing | <elseop pkglength termlist> > + ElseOp := 0xA1 > + > + EXAMPLE: > + AmlIf (AmlStart, ListHead); > + { > + { // Predicate > + AmlOpDataInteger (1, ListHead); > + } // Predicate > + { // TermList > + ... > + } // TermList > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + { > + AmlIf (AmlStart, ListHead); > + { > + {} // Predicate > + {} // Termlist > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + {} // TermList > + AmlElse (AmlClose, ListHead); > + } > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed AmlElse Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlElse ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a If object > + > + Predicate and TermList must be created between AmlStart and AmlClose > Phase > + > + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be > + supported and must be created with Else and If. > + > + DefIfElse := IfOp PkgLength Predicate TermList DefElse > + IfOp := 0xA0 > + Predicate := TermArg => Integer > + > + EXAMPLE: > + AmlIf (AmlStart, ListHead); > + { > + { // Predicate > + AmlOpDataInteger (1, ListHead); > + } // Predicate > + { // TermList > + ... > + } // TermList > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + { > + AmlIf (AmlStart, ListHead); > + { > + {} // Predicate > + {} // Termlist > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + {} // TermList > + AmlElse (AmlClose, ListHead); > + } > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed AmlIf Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlIf ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Notify object > + > + DefNotify := NotifyOp NotifyObject NotifyValue > + NotifyOp := 0x86 > + NotifyObject := SuperName => ThermalZone | Processor | Device > + NotifyValue := TermArg => Integer > + > + @param[in] NotifyObject - String of Namestring to a device > + @param[in] NotifyValue - Integer Notify value > + @param[in,out] ListHead - Linked list updated with Notify object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPNotify ( > + IN CHAR8 *NotifyObject, > + IN UINT64 NotifyValue, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Return object > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefReturn := ReturnOp ArgObject > + ReturnOp := 0xA4 > + ArgObject := TermArg => DataRefObject > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlReturn ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Type 2 Opcodes Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates a Buffer (BufferSize) {Initializer} => Buffer Object > + > + Initializers must be created between AmlStart and AmlClose Phase > + > + DefBuffer := BufferOp PkgLength BufferSize ByteList > + BufferOp := 0x11 > + BufferSize := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] BufferSize - Requested BufferSize, Encoded value will be > + MAX (BufferSize OR Child->DataSize) > + @param[in,out] ListHead - Linked list has completed Buffer Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlBuffer ( > + IN AML_FUNCTION_PHASE Phase, > + IN UINTN BufferSize, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a LEqual (Source1, Source2) => Boolean > + > + Source1 and Source2 operands must be created between AmlStart and > AmlClose Phase > + > + DefLEqual := LequalOp Operand Operand > + LequalOp := 0x93 > + Operand := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed LEqual Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlLEqual ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Package (NumElements) {PackageList} => Package > + > + Initializers must be created between AmlStart and AmlClose Phase > + > + DefPackage := PackageOp PkgLength NumElements > PackageElementList > + PackageOp := 0x12 > + DefVarPackage := VarPackageOp PkgLength VarNumElements > PackageElementList > + VarPackageOp := 0x13 > + NumElements := ByteData > + VarNumElements := TermArg => Integer > + PackageElementList := Nothing | <PackageElement PackageElementList> > + PackageElement := DataRefObject | NameString > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] NumElements - Number of elements in the package > + @param[in,out] ListHead - Linked list has completed Package Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlPackage ( > + IN AML_FUNCTION_PHASE Phase, > + IN UINTN NumElements, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Resource Descriptor Objects Encoding > +// --------------------------------------------------------------------------- > + > +/** > + ResourceTemplate (Resource To Buffer Conversion Macro) > + > + Syntax: > + ResourceTemplate () {ResourceMacroList} => Buffer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed ResourceTemplate > Object > + after AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlResourceTemplate ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.32 DMA (DMA Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) > {DmaChannelList} => Buffer (BitMask) > + > + Generates: 6.4.2.2 DMA Descriptor > + > + @param[in] DmaType - DMA channel speed supported > + @param[in] IsBusMaster - Logical device bus master status > + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16- > bit, both) > + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - > 7), _DMA > + Bit [0] is channel 0, etc. > + // DescriptorName - Optional - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordIO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDma ( > + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, > + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, > + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, > + IN UINT8 DmaChannelList, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, TranslationType, > + TranslationDensity) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] ISARanges, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + TranslationDensity - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordIO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordIO ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT8 ISARanges, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + // TranslationDensity - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, > Cacheable, > + ReadAndWrite, AddressGranularity, AddressMinimum, > AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, MemoryRangeType, > TranslationType) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Cacheable, > + @param[in] ReadAndWrite, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + MemoryRangeType - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordMemory > buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordMemory ( > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Cacheable, > + IN UINT8 ReadAndWrite, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // MemoryRangeType - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + AmlDWordSpace () > + > + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, > IsMaxFixed, > + TypeSpecificFlags, AddressGranularity, AddressMinimum, > + AddressMaximum, AddressTranslation, RangeLength, > + ResourceSourceIndex, ResourceSource, DescriptorName) > + > + Generates: > + 6.4.3.5.2 DWord Address Space Descriptor > + Type 1, Large Item Value 0x7 > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) > + > + Syntax: > + EISAID (EisaIdString) => DWordConst > + > + Arguments: > + The EisaIdString must be a String object of the form "UUUNNNN", where > "U" > + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other > + characters are allowed in the string. > + > + Description: > + Converts EisaIdString, a 7-character text string argument, into its > + corresponding 4-byte numeric EISA ID encoding. It can be used when > declaring > + IDs for devices that have EISA IDs. > + > + Encoded EISA ID Definition - 32-bits > + bits[15:0] - three character compressed ASCII EISA ID. * > + bits[31:16] - binary number > + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' > + > + Example: > + EISAID ("PNP0C09") // This is a valid invocation of the macro. > + > + @param[in] String - EISA ID string. > + @param[in,out] ListHead - Head of Linked List of all AML Objects > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPEisaId ( > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) > + > + Syntax: > + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, > DescriptorName) > + > + Arguments: > + ReadAndWrite: Specifies whether or not the memory region is read-only > (ReadOnly) > + or read/write (ReadWrite). If nothing is specified, then ReadWrite is > assumed. > + The 1-bit field DescriptorName._RW is automatically created to refer to > this > + portion of the resource descriptor, where '1' is ReadWrite and '0' is > ReadOnly. > + > + AddressBase: Evaluates to a 32-bit integer that specifies the base address > + of the memory range. The 32-bit field DescriptorName. _BAS is > automatically > + created to refer to this portion of the resource descriptor. RangeLength > + evaluates to a 32-bit integer that specifies the total number of bytes > decoded > + in the memory range. The 32-bit field DescriptorName. _LEN is > automatically > + created to refer to this portion of the resource descriptor. > + > + DescriptorName: Is an optional argument that specifies a name for an > integer > + constant that will be created in the current scope that contains the offset > + of this resource descriptor within the current resource template buffer. > The > + predefined descriptor field names may be appended to this name to > access > + individual fields within the descriptor via the Buffer Field operators. > + > + Description: > + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit > memory > + descriptor, which describes a fixed range of memory addresses. The > format of > + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory > Range > + Descriptor. The macro is designed to be used inside of a > ResourceTemplate. > + > + Generates: > + 6.4.3.4 32-Bit Fixed Memory Range Descriptor > + Type 1, Large Item Value 0x6 > + This memory range descriptor describes a device's memory resources > within a > + 32-bit address space. > + > + @param[in] ReadAndWrite, > + @param[in] AddressBase, > + @param[in] RangeLength, > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed memory resource > descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPMemory32Fixed ( > + IN READ_WRITE_FLAG ReadAndWrite, > + IN UINT32 AddressBase, > + IN UINT32 RangeLength, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.64 IO (IO Resource Descriptor Macro) > + > + Syntax: > + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, > DescriptorName) => Buffer > + > + Arguments: > + Decode: > + Describes whether the I/O range uses 10-bit decode (Decode10) or 16- > bit > + decode (Decode16). The field DescriptorName. _DEC is automatically > created > + to refer to this portion of the resource descriptor, where '1' is Decode16 > + and '0' is Decode10. > + > + AddressMin: > + Evaluates to a 16-bit integer that specifies the minimum acceptable > starting > + address for the I/O range. It must be an even multiple of > AddressAlignment. > + The field DescriptorName._MIN is automatically created to refer to this > + portion of the resource descriptor. > + > + AddressMax: > + Evaluates to a 16-bit integer that specifies the maximum acceptable > starting > + address for the I/O range. It must be an even multiple of > AddressAlignment. > + The field DescriptorName._MAX is automatically created to refer to this > + portion of the resource descriptor. > + > + AddressAlignment: > + Evaluates to an 8-bit integer that specifies the alignment granularity > + for the I/O address assigned. The field DescriptorName. _ALN is > automatically > + created to refer to this portion of the resource descriptor. > + > + RangeLength: > + Evaluates to an 8-bit integer that specifies the number of bytes in the > + I/O range. The field DescriptorName. _LEN is automatically created to > refer > + to this portion of the resource descriptor. > + > + DescriptorName: > + An optional argument that specifies a name for an integer constant that > + will be created in the current scope that contains the offset of this > + resource descriptor within the current resource template buffer. The > + predefined descriptor field names may be appended to this name to > access > + individual fields within the descriptor via the Buffer Field operators. > + > + Description: > + The IO macro evaluates to a buffer which contains an IO resource > descriptor. > + The format of the IO descriptor can be found in the ACPI Specification > section > + "I/O Port Descriptor". The macro is designed to be used inside of a > ResourceTemplate. > + > + Generates: > + 6.4.2.5 I/O Port Descriptor > + Type 0, Small Item Name 0x8, Length = 7 > + > + @param[in] Decode, > + @param[in] AddressMin, > + @param[in] AddressMax, > + @param[in] AddressAlignment, > + @param[in] RangeLength, > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed IO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPIO ( > + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, > + IN UINT16 AddressMin, > + IN UINT16 AddressMax, > + IN UINT8 AddressAlignment, > + IN UINT8 RangeLength, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/* > + 19.6.114 Register (Generic Register Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, > + RegisterAddress, AccessSize, DescriptorName) > + > + Generates: > + 6.4.3.7 Generic Register Descriptor > + Type 1, Large Item Value 0x2 > + The generic register descriptor describes the location of a fixed width > + register within any of the ACPI-defined address spaces. See Generic > Register > + Descriptor for details. > + > + > + @param[in] AddressSpaceKeyword, > + @param[in] RegisterBitWidth, > + @param[in] RegisterBitOffset, > + @param[in] RegisterAddress, > + @param[in] AccessSize, > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +AmlOPRegister ( > + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, > + IN UINT8 RegisterBitWidth, > + IN UINT8 RegisterBitOffset, > + IN UINT64 RegisterAddress, > + IN UINT8 AccessSize, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, TranslationType, > + TranslationDensity) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] ISARanges, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + TranslationDensity - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordIO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordIO ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT8 ISARanges, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + // TranslationDensity - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, > Cacheable, > + ReadAndWrite, AddressGranularity, AddressMinimum, > AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, MemoryRangeType, > TranslationType) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Cacheable, > + @param[in] ReadAndWrite, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + MemoryRangeType - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordMemory > buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordMemory ( > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Cacheable, > + IN UINT8 ReadAndWrite, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // MemoryRangeType - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + AmlQWordSpace () > + > + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, > IsMaxFixed, > + TypeSpecificFlags, AddressGranularity, AddressMinimum, > + AddressMaximum, AddressTranslation, RangeLength, > + ResourceSourceIndex, ResourceSource, DescriptorName) > + > + Generates: > + 6.4.3.5.1 QWord Address Space Descriptor > + Type 1, Large Item Value 0xA > + The QWORD address space descriptor is used to report resource usage in a > + 64-bit address space (like memory and I/O). > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) > + > + Syntax: > + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => > Buffer > + > + Arguments: > + EdgeLevel: > + Describes whether the interrupt is edge triggered (Edge) or level > triggered > + (Level). The field DescriptorName. _HE is automatically created to refer > to > + this portion of the resource descriptor, where '1' is Edge and ActiveHigh > + and '0' is Level and ActiveLow. > + > + ActiveLevel: > + Describes whether the interrupt is active-high (ActiveHigh) or active-low > + (ActiveLow). The field DescriptorName. _LL is automatically created to > refer > + to this portion of the resource descriptor, where '1' is Edge and > ActiveHigh > + and '0' is Level and ActiveLow. > + > + Shared: > + Describes whether the interrupt can be shared with other devices > (Shared) or > + not (Exclusive), and whether it is capable of waking the system from a > + low-power idle or system sleep state (SharedAndWake or > ExclusiveAndWake). > + The field DescriptorName. _SHR is automatically created to refer to this > portion > + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If > nothing > + is specified, then Exclusive is assumed. > + > + InterruptList: > + IRQ mask bits [15:0] > + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. > + > + DescriptorName: > + Is an optional argument that specifies a name for an integer constant that > + will be created in the current scope that contains the offset of this > resource > + descriptor within the current resource template buffer. The predefined > + descriptor field names may be appended to this name to access > individual > + fields within the descriptor via the Buffer Field operators. > + > + Description: > + The IRQ macro evaluates to a buffer that contains an IRQ resource > descriptor. > + The format of the IRQ descriptor can be found in "IRQ Descriptor". The > macro > + produces the three-byte form of the descriptor. The macro is designed to > be > + used inside of a ResourceTemplate. > + > + Generates: 6.4.2.1 IRQ Descriptor > + > + @param[in] EdgeLevel - trigger level supported > + @param[in] ActiveLevel - interrupt polarity > + @param[in] Shared - interrupt exclusivity > + @param[in] InterruptList - IRQ mask bits[7:0], _INT > + Bit [0] represents IRQ0, > + bit[1] is IRQ1, and so on. > + IRQ mask bits[15:8], _INT > + Bit [0] represents IRQ8, > + bit[1] is IRQ9, and so on. > + // DescriptorName - Optional - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed IRQ buffer > + > + @retval EFI_SUCCESS > + @retval Error status > + > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPIRQ ( > + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, > + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, > + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, > + IN UINT16 InterruptList, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordBusNumber > + Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordBusNumber ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.151 WordIO (Word IO Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, TranslationType, TranslationDensity) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] ISARanges, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + TranslationDensity - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordIO Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordIO ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT8 ISARanges, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + // TranslationDensity - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) > + Syntax > + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, > IsMaxFixed, > + TypeSpecificFlags, AddressGranularity, AddressMinimum, > + AddressMaximum, AddressTranslation, RangeLength, > + ResourceSourceIndex, ResourceSource, DescriptorName) > + > + Generates: > + 6.4.3.5.3 Word Address Space Descriptor > + Type 1, Large Item Value 0x8 > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordSpace > Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Expression Opcodes Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates a Store expression > + > + Syntax: > + Store (Source, Destination) => DataRefObject Destination = Source => > DataRefObject > + > + Store expression must be created between AmlStart and AmlClose Phase. > + > + DefStore := StoreOp TermArg SuperName > + StoreOp := 0x70 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlStore ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// --------------------------------------------------------------------------- > +// Miscellaneous Objects Encoding > +// --------------------------------------------------------------------------- > + > +/** > + Creates an ArgN Opcode object > + > + Arg Objects Encoding > + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op |Arg5Op | > Arg6Op > + Arg0Op := 0x68 > + Arg1Op := 0x69 > + Arg2Op := 0x6A > + Arg3Op := 0x6B > + Arg4Op := 0x6C > + Arg5Op := 0x6D > + Arg6Op := 0x6E > + > + @param[in] ArgN - Argument Number to be encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOpArgN ( > + IN UINT8 ArgN, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates an LocalN Opcode object > + > + Local Objects Encoding > + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | > Local5Op | Local6Op | Local7Op > + Local0Op := 0x60 > + Local1Op := 0x61 > + Local2Op := 0x62 > + Local3Op := 0x63 > + Local4Op := 0x64 > + Local5Op := 0x65 > + Local6Op := 0x66 > + Local7Op := 0x67 > + > + @param[in] LocalN - Argument Number to be encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPLocalN ( > + IN UINT8 LocalN, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Shift Left expression > + > + Syntax: > + ShiftLeft (Source, ShiftCount, Reult) => Integer > + Result = Source << ShiftCount => Integer > + Result <<= ShiftCount => Integer > + > + Shift expression must be created between AmlStart and AmlClose Phase. > + > + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target > + ShiftLeftOp := 0x79 > + ShiftCount := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlShiftLeft ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Shift Right expression > + > + Syntax: > + ShiftRight (Source, ShiftCount, Reult) => Integer > + Result = Source >> ShiftCount => Integer > + Result >>= ShiftCount => Integer > + > + Shift expression must be created between AmlStart and AmlClose Phase. > + > + DefShiftRight := ShiftRightOp Operand ShiftCount Target > + ShiftRightOp := 0x7A > + ShiftCount := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlShiftRight ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a FindSetLeftBit AML Object > + > + Syntax: > + FindSetLeftBit (Source, Result) => Integer > + > + FindSetLeftBit expression must be created between > + AmlStart and AmlClose Phase. > + > + DefFindSetLeftBit := FindSetLeftBitOp Operand Target > + FindSetLeftBitOp := 0x81 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > + > +EFI_STATUS > +EFIAPI > +AmlFindSetLeftBit ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a FindSetRightBit AML Object > + > + Syntax: > + FindSetRightBit (Source, Result) => Integer > + > + FindSetRightBit expression must be created between > + AmlStart and AmlClose Phase. > + > + DefFindSetRightBit := FindSetRightBit Operand Target > + FindSetRightBit := 0x82 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlFindSetRightBit ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Creates a Decrement expression > + > + Syntax: > + Decrement (Minuend) => Integer > + Minuend-- => Integer > + > + Creates object to decrement Minuend. > + > + DefDecrement := DecrementOp SuperName > + DecrementOp := 0x76 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDecrement ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ); > + > +// > ************************************************************ > *************** > +// AML Assistance Functions > +// > ************************************************************ > *************** > + > +/** > + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. > + Will not free ListHead nor an Object containing ListHead. > + > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > +**/ > +EFI_STATUS > +EFIAPI > +AmlFreeObjectList ( > + IN OUT LIST_ENTRY *ListHead > + ); > + > +/** > + Validate that ACPI table is completed and return Table and Size > + > + @param[in,out] ListHead - Head of linked list of Objects > + @param[out] Table - Completed ACPI Table > + @param[out] TableSize - Completed ACPI Table size > + > + @retval EFI_SUCCESS > + EFI_INVALID_PARAMETER > + EFI_DEVICE_ERROR > +**/ > +EFI_STATUS > +EFIAPI > +AmlGetCompletedTable ( > + IN OUT LIST_ENTRY *ListHead, > + OUT VOID **Table, > + OUT UINTN *TableSize > + ); > + > +/** > + Initialize Table List to work with AmlGenerationLib > + > + Allocates a LIST_ENTRY linked list item and initializes it. Use > + AmlReleaseTableList to free resulting table and LIST_ENTRY. > + > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > + EFI_INVALID_PARAMETER > + EFI_OUT_OF_RESOURCES > +**/ > +EFI_STATUS > +EFIAPI > +AmlInitializeTableList ( > + IN OUT LIST_ENTRY **ListHead > + ); > + > +/** > + Release table List > + > + Releases all elements. Use to free built table and LIST_ENTRY allocated by > + AmlInitializeTableList. > + > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > + EFI_INVALID_PARAMETER > +**/ > +EFI_STATUS > +EFIAPI > +AmlReleaseTableList ( > + IN OUT LIST_ENTRY **ListHead > + ); > + > +// > ************************************************************ > *************** > +// AML Debug Functions > +// > ************************************************************ > *************** > + > +/** > + DEBUG print a (VOID *)buffer in an array of HEX bytes > + > + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F > + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE > + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 > + Completed=(TRUE|FALSE) > + > + @param[in] Buffer - Buffer containing buffer > + @param[in] BufferSize - Number of bytes to print > +**/ > +EFI_STATUS > +EFIAPI > +AmlDebugPrintBuffer ( > + IN VOID *Buffer, > + IN UINTN BufferSize > + ); > + > +/** > + DEBUG print a buffer in an array of HEX bytes > + > + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F > + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS.IS.A.SAMPLE > + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 > + Completed=(TRUE|FALSE) > + > + @param[in] Object - AML_OBJECT_INSTANCE > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDebugPrintObject ( > + IN AML_OBJECT_INSTANCE *Object > + ); > + > +/** > + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes > + > + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDebugPrintLinkedObjects ( > + IN LIST_ENTRY *ListHead > + ); > + > +#endif // AML_LIB_H_ > diff --git > a/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLi > b.h > b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLi > b.h > new file mode 100644 > index 0000000000..d48ca1a90a > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLi > b.h > @@ -0,0 +1,25 @@ > +/** @file > + Platform ROM Armor Whitelist table > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Library/AmdPspRomArmorLib.h> > + > +/* > + * Return allocated and filled AMD PSP ROM Armor White list Table > + * > + * > + * @param[in] PlatformSpiWhitelist Pointer to white list table > + * > + * @return EFI_SUCCESS > + * @return EFI_OUT_OF_RESOURCES Buffer to return couldn't be > allocated > + */ > +EFI_STATUS > +EFIAPI > +GetPspRomArmorWhitelist ( > + IN SPI_WHITE_LIST **PlatformSpiWhitelist > + ); > diff --git a/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h > b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h > new file mode 100644 > index 0000000000..6c854651cc > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h > @@ -0,0 +1,134 @@ > +/** @file > + AMD Psp Ftpm Ppi Header > + > + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef PSP_FTPM_PPI_H_ > +#define PSP_FTPM_PPI_H_ > +#include <Uefi.h> > + > +typedef struct _PSP_FTPM_PPI PSP_FTPM_PPI; > + > +/** > + Define function prototype: Execute a TPM command > + > + @param[in] This Point to PSP_FTPM_PPI itself > + @param[in] CommandBuffer Point to the TPM command buffer > + @param[in] CommandSize Size of the TPM command buffer > + @param[in,out] ResponseBuffer Point to the TPM response buffer > + @param[in,out] ResponseSize Size of the TPM response buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status > set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to > hold the response > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_EXECUTE)( > + IN PSP_FTPM_PPI *This, > + IN VOID *CommandBuffer, > + IN UINTN CommandSize, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINTN *ResponseSize > + ); > + > +/** > + Define function prototype: GET TPM related Info > + > + @param[in] This Point to PSP_FTPM_PPI itself > + @param[in,out] FtpmStatus Used to hold more detail info (Unused > Currently) > + > + @return EFI_SUCCESS Ftpm function supported > + @return EFI_UNSUPPORTED Ftpm function unsupported > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_CHECK_STATUS)( > + IN PSP_FTPM_PPI *This, > + IN OUT UINTN *FtpmStatus > + ); > + > +/** > + Define function prototype: Send a TPM command > + > + @param[in] This Point to PSP_FTPM_PPI itself > + @param[in] CommandBuffer Point to the TPM command buffer > + @param[in] CommandSize Size of the TPM command buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold > the response > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_SEND_COMMAND)( > + IN PSP_FTPM_PPI *This, > + IN VOID *CommandBuffer, > + IN UINTN CommandSize > + ); > + > +/** > + Define function prototype: Get a TPM command's response > + > + @param[in] This Point to PSP_FTPM_PPI itself > + @param[in,out] ResponseBuffer Point to the TPM response buffer > + @param[in,out] ResponseSize Size of the TPM response buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status > set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to > hold the response > + **/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_GET_RESPONSE)( > + IN PSP_FTPM_PPI *This, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINTN *ResponseSize > + ); > + > +/** > + Define function prototype: Get TCG Logs. > + > + This function only implemented on Pluton-fTPM > + > + @param[in] This Point to PSP_FTPM_PPI itself > + @param[in,out] ResponseBuffer Point to the TPM response buffer > + @param[in,out] ResponseSize Size of the TPM response buffer > + > + @retval EFI_STATUS 0: Success, Non-Zero Error > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_GET_TCG_LOGS)( > + IN PSP_FTPM_PPI *This, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINTN *ResponseSize > + ); > + > +/** > + PSP_FTPM_PPI prototype > + > + Defines PSP_FTPM_PPI. This PPI is used to get Ftpm info. > + Send TPM command, Get TPM command's response, Execute TPM > command(Include send & get response) > +**/ > +typedef struct _PSP_FTPM_PPI { > + FTPM_EXECUTE Execute; ///< Execute TPM command, > include send & get response > + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status > + FTPM_SEND_COMMAND SendCommand; ///< Send TPM > command > + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM > command response > + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs > +} PSP_FTPM_PPI; > + > +extern EFI_GUID gAmdPspFtpmPpiGuid; > +extern EFI_GUID gAmdPspFtpmFactoryResetPpiGuid; > + > +#endif > diff --git > a/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h > b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h > new file mode 100644 > index 0000000000..715cbbcf78 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h > @@ -0,0 +1,183 @@ > +/** @file > + CXL Configuration Services Protocol prototype definition > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef NBIO_CXL_SERVICES_PROTOCOL_H_ > +#define NBIO_CXL_SERVICES_PROTOCOL_H_ > + > +#include "AMD.h" > +#include <Protocol/FabricTopologyServices2.h> > +#include <Protocol/FabricResourceManagerServicesProtocol.h> > + > +#define AMD_NBIO_CXL_SERVICES_REVISION 0x00 > + > +/// Forward declaration for the AMD_NBIO_CXL_SERVICES_PROTOCOL > +typedef struct _AMD_NBIO_CXL_SERVICES_PROTOCOL > AMD_NBIO_CXL_SERVICES_PROTOCOL; > + > +extern EFI_GUID gAmdNbioCxlServicesProtocolGuid; ///< CXL services > protocol calling > + > +#pragma pack (push, 1) > +/// Port Information Structure > +typedef struct _AMD_CXL_PORT_INFO_STRUCT { > + PCI_ADDR EndPointBDF; ///< Bus/Device/Function of Root Port in > PCI_ADDR format > + UINT8 LogicalNbioInstance; ///< Logical Instance ID of NBIO > + UINT8 PhysicalNbioInstance; ///< Physical Instance ID of NBIO where > this port is located > + UINT8 SocketID; ///< Socket ID for this port > + UINT32 UsRcrb; ///< Upstream Port RCRB address > + UINT32 DsRcrb; ///< Downstream Port RCRB address > + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 > + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 > + UINT8 PortId; ///< Physical port location > + UINT8 PortWidth; ///< Lane width of the port > + UINT32 CxlPortAddress; ///< CXL root port address (CXL 2.0 root > port or CXL 1.1 RCiEP) > + BOOLEAN IsSwitch; ///< CXL Switch flag > +} AMD_CXL_PORT_INFO_STRUCT; > + > +/// Port MMIO32 Resources Information Structure > +typedef struct _AMD_CXL_RESOURCES_INFO_STRUCT { > + UINT32 > Mmio32Base[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; > + UINT32 > Mmio32Size[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; > + UINT32 Mmio32Gran; > +} AMD_CXL_RESOURCES_INFO_STRUCT; > +#pragma pack (pop) > + > +// Protocol Definitions > + > +/** > + This function gets information about a specific PCIe root port. > + > + This > + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. > + EndpointBDF > + Bus/Device/Function of Endpoint in PCI_ADDR format. > + PortInformation > + A pointer to an information structure to be populated by this function to > + identify the location of the CXL port. > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_GET_ROOT_PORT_INFORMATION)( > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr > + IN UINTN PortIndex, ///< port index > + OUT AMD_CXL_PORT_INFO_STRUCT *PortInformation ///< port > information ptr > + ); > + > +/** > + This function configures a specific PCIe root port for CXL capabilities. > + > + This > + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. > + EndpointBDF > + Bus/Device/Function of Endpoint in PCI_ADDR format. > + PortConfiguration > + A pointer to a configuration structure that contains the information > necessary > + to configurare the CXL port. > + PortInformation OPTIONAL (can be NULL) > + A pointer to an information structure to be populated by this function to > + identify the location of the CXL port. > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_CONFIGURE_ROOT_PORT)( > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< this ptr > + IN PCI_ADDR EndpointBDF ///< end pt bdf > + ); > + > +/** > + This function configures a specific PCIe root port for CXL presence > + > + This > + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. > + EndpointBDF > + Bus/Device/Function of Endpoint in PCI_ADDR format. > + PortConfiguration > + A pointer to a configuration structure that contains the information > necessary > + to configurare the CXL port such as Socket id,rbindex,port id,segment,bus > base,limit or presence. > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_RESOURCES_AVAILABLE)( > + ///< cxl port presence info > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< > + IN OUT FABRIC_RESOURCE_FOR_EACH_RB *ResourceForEachRb ///< > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_GET_PORT_RB_LOCATION)( > + ///< get port rb location > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< > + IN UINT8 Segment, ///< > + IN UINT8 BusBase, ///< > + OUT UINT8 *SocketId, ///< > + OUT UINT8 *RbIndex ///< > + ); > + > +/** > + This function gets the CXL MMIO32 values to be used by the fabric > resource manager > + > + This > + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. > + CxlMmio32ResourceForEachRb > + A pointer to the structure that will hold the MMIO32 base and size values > for each root bridge > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_RESOURCES_INFORMATION)( > + ///< cxl port presence info > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< > + IN OUT AMD_CXL_RESOURCES_INFO_STRUCT *CxlMmio32Resources ///< > + ); > + > +/** > + * @brief > + * > + */ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_REPORT_TO_MPIO)( > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This ///< ptr to > protocol > + ); > + > +/** > + * @brief > + * > + */ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_CXL_FIND_2P0_DEVICES)( > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to > protocol > + IN UINTN PortIndex ///< port index > + ); > + > +/** > + * @brief > + * > + */ > +typedef > +VOID > +(EFIAPI *AMD_CXL_ENABLE_SCM_PMEM)( > + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to > protocol > + IN PCI_ADDR CxlPciAddress ///< PCI address > + ); > + > +/// The Protocol Definition for CXL Services > +struct _AMD_NBIO_CXL_SERVICES_PROTOCOL { > + UINT32 Revision; ///< revision > + UINTN CxlCount; ///< CXL count > + AMD_CXL_GET_ROOT_PORT_INFORMATION CxlGetRootPortInformation; > ///< CXL root port information > + AMD_CXL_CONFIGURE_ROOT_PORT CxlConfigureRootPort; ///< > configuring the root port > + AMD_CXL_GET_PORT_RB_LOCATION GetCxlPortRBLocation; ///< > CXL port RB location > + AMD_CXL_RESOURCES_AVAILABLE GetCxlAvailableResources; > ///< Get resources allocated for CXL RCiEP > + AMD_CXL_RESOURCES_INFORMATION GetCxlMmio32Resources; > ///< Get CXL MMIO resources for CXL RCiEP > + AMD_CXL_REPORT_TO_MPIO CxlReportToMpio; ///< > Sends the CXL info to MPIO > + AMD_CXL_FIND_2P0_DEVICES CxlFind2p0Devices; ///< Finds > CXL 2.0 devices after PCIe enumeration > + AMD_CXL_ENABLE_SCM_PMEM > CxlEnableScmForPersistentMemory; ///< Notifies SMU that CXL persistent > memory is present > +}; > + > +#endif /* NBIO_CXL_SERVICES_PROTOCOL_H */ > diff --git > a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h > b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h > new file mode 100644 > index 0000000000..7bcff65dc9 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h > @@ -0,0 +1,110 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_PCI_RESOURCES_PROTOCOL_H_ > +#define AMD_PCI_RESOURCES_PROTOCOL_H_ > + > +typedef struct { > + UINTN Index; > + UINT8 SocketId; > + UINTN Segment; > + UINTN BaseBusNumber; > +} PCI_ROOT_BRIDGE_OBJECT; > + > +typedef struct { > + UINTN Index; > + BOOLEAN Enabled; > + UINT8 PortPresent; > + UINTN Device; > + UINTN Function; > + UINTN SlotNum; > + // Interrupts are relative to IOAPIC 0->n > + UINTN BridgeInterrupt; // Redirection table entry for mapped > bridge interrupt > + UINTN EndpointInterruptArray[4]; // Redirection table entries for > mapped INT A/B/C/D > +} PCI_ROOT_PORT_OBJECT; > + > +typedef enum { > + IOMMU = 0, > + IOAPIC > +} FIXED_RESOURCE_TYPE; > + > +typedef struct { > + UINTN Index; > + FIXED_RESOURCE_TYPE ResourceType; > + UINTN Address; > + UINTN Limit; > +} FIXED_RESOURCES_OBJECT; > + > +/// Forward declaration for the AMD_PCI_RESOURCES_PROTOCOL. > +typedef struct _AMD_PCI_RESOURCES_PROTOCOL > AMD_PCI_RESOURCES_PROTOCOL; > + > +/** > + * @brief System information through EFI call > + * @details > + */ > +typedef > +EFI_STATUS > +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES)( > + IN AMD_PCI_RESOURCES_PROTOCOL *This, > + OUT UINTN *NumberOfRootBridges > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO)( > + IN AMD_PCI_RESOURCES_PROTOCOL *This, > + IN UINTN RootBridgeIndex, > + OUT PCI_ROOT_BRIDGE_OBJECT **RootBridgeInfo > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS)( > + IN AMD_PCI_RESOURCES_PROTOCOL *This, > + IN UINTN RootBridgeIndex, > + OUT UINTN *NumberOfRootPorts > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO)( > + IN AMD_PCI_RESOURCES_PROTOCOL *This, > + IN UINTN RootBridgeIndex, > + IN UINTN RootPortIndex, > + OUT PCI_ROOT_PORT_OBJECT **RootPortInfo > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES)( > + IN AMD_PCI_RESOURCES_PROTOCOL *This, > + IN UINTN RootBridgeIndex, > + OUT UINTN *NumberOfFixedResources > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO)( > + IN AMD_PCI_RESOURCES_PROTOCOL *This, > + IN UINTN RootBridgeIndex, > + IN UINTN FixedResourceIndex, > + OUT FIXED_RESOURCES_OBJECT **FixedResourceInfo > + ); > + > +struct _AMD_PCI_RESOURCES_PROTOCOL { > + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES > AmdPciResourcesGetNumberOfRootBridges; > + AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO > AmdPciResourcesGetRootBridgeInfo; > + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS > AmdPciResourcesGetNumberOfRootPorts; > + AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO > AmdPciResourcesGetRootPortInfo; > + AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES > AmdPciResourcesGetNumberOfFixedResources; > + AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO > AmdPciResourcesGetFixedResourceInfo; > +}; > + > +extern EFI_GUID gAmdPciResourceProtocolGuid; ///< Guid for calling > + > +#endif // AMD_PCI_RESOURCES_PROTOCOL_H_ > diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h > b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h > new file mode 100644 > index 0000000000..ebc7812b18 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h > @@ -0,0 +1,187 @@ > +/** @file > + AMD Psp Ftpm Protocol Header > + > + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef FTPM_PROTOCOL_H_ > +#define FTPM_PROTOCOL_H_ > + > +#include <Uefi.h> > +// > +// GUID definition > +// > +extern EFI_GUID gAmdPspFtpmProtocolGuid; > + > +/** > + structure definition for HSP mailbox > + > +**/ > +typedef struct { > + // C2H_TPM_L0 > + UINT64 TPM_L0_Address; /// Mailbox address > + UINT64 TPM_L0_C2H_MSG_Address; /// Doorbell address CPU- > >HSP > + UINT64 TPM_L0_H2C_MSG_Address; /// Doorbell address HSP- > >CPU > + > + // C2H_HSP_L0(VLT0) > + UINT64 VLT0_Address; /// Mailbox address > + UINT64 VLT0_C2H_MSG_Address; /// Doorbell address CPU- > >HSP > + UINT64 VLT0_H2C_MSG_Address; /// Doorbell address HSP- > >CPU > + > + // C2H_HSP_L1(VLT1) > + UINT64 VLT1_Address; /// Mailbox address > + UINT64 VLT1_C2H_MSG_Address; /// Doorbell address CPU- > >HSP > + UINT64 VLT1_HSC_MSG_Address; /// Doorbell address HSP- > >CPU > + > + // Interrupt Information > + UINT8 Gsi[4]; /// Gsi[0] is for HSP Channel 0 TPM > + /// Gsi[1] is for HSP Channel 1 VTL0 > + /// Gsi[2] is for HSP Channel 2 VTL1 > + /// Gsi[3] is reserved > +} HSP_MAILBOX_ADDRESS, *PHSP_MAILBOX_ADDRESS; > + > +typedef union { > + HSP_MAILBOX_ADDRESS HSP_info; > +} FTPM_INFO; > + > +typedef struct _PSP_FTPM_PROTOCOL PSP_FTPM_PROTOCOL; > + > +/** > + Define function prototype: Execute a TPM command > + > + @param[in] This Point to PSP_FTPM_PROTOCOL itself > + @param[in] CommandBuffer Point to the TPM command buffer > + @param[in] CommandSize Size of the TPM command buffer > + @param[in, out] ResponseBuffer Point to the TPM response buffer > + @param[in, out] ResponseSize Size of the TPM response buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold > the response > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_EXECUTE)( > + IN PSP_FTPM_PROTOCOL *This, > + IN VOID *CommandBuffer, > + IN UINT32 CommandSize, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINT32 *ResponseSize > + ); > + > +/** > + Define function prototype: GET TPM related Information > + > + @param[in] This Point to PSP_FTPM_PROTOCOL itself > + @param[in,out] FtpmStatus Used to hold more detail info (Unused > Currently) > + > + @return EFI_SUCCESS Ftpm function supported > + @return EFI_UNSUPPORTED Ftpm function unsupported > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_CHECK_STATUS)( > + IN PSP_FTPM_PROTOCOL *This, > + IN OUT UINTN *FtpmStatus > + ); > + > +/** > + Define function prototype: Send a TPM command > + > + @param[in] This Point to PSP_FTPM_PROTOCOL itself > + @param[in] CommandBuffer Point to the TPM command buffer > + @param[in] CommandSize Size of the TPM command buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold > the response > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_SEND_COMMAND)( > + IN PSP_FTPM_PROTOCOL *This, > + IN VOID *CommandBuffer, > + IN UINT32 CommandSize > + ); > + > +/** > + Define function prototype: Get a TPM command's response > + > + @param[in] This Point to PSP_FTPM_PROTOCOL itself > + @param[in, out] ResponseBuffer Point to the TPM response buffer > + @param[in, out] ResponseSize Size of the TPM response buffer > + > + @return EFI_SUCCESS Command executed successfully > + @return EFI_UNSUPPORTED Device unsupported > + @return EFI_TIMEOUT Command fail due the time out > + @return EFI_DEVICE_ERROR Command fail due the error status set > + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold > the response > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_GET_RESPONSE)( > + IN PSP_FTPM_PROTOCOL *This, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINT32 *ResponseSize > + ); > + > +/** > + Define function prototype: Get TCG Logs > + This function only implemented on Pluton-fTPM > + > + @param[in] This Point to PSP_FTPM_PROTOCOL itself > + @param[in, out] ResponseBuffer Point to the TPM response buffer > + @param[in, out] ResponseSize Size of the TPM response buffer > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_GET_TCG_LOGS)( > + IN PSP_FTPM_PROTOCOL *This, > + IN OUT VOID *ResponseBuffer, > + IN OUT UINTN *ResponseSize > + ); > + > +/** > + Function prototype for GetHspfTPMInfo. Return Pluton mailbox base > address to SBIOS. > + SBIOS should call this procedure after PCI Enumeration Complete. > + > + @param[in] This Point to PSP_FTPM_PROTOCOL itself > + @param[in,out] FtpmInfo Point to Pluton mailbox base address > + > + @return EFI_SUCCESS - Success > + @return EFI_INVALID_PARAMETER - Input parameter is invalid > + @return EFI_NOT_READY - Pluton-fTPM device BAR0 MMIO is not > ready. > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *FTPM_GET_TPM_INFO)( > + IN PSP_FTPM_PROTOCOL *This, > + IN OUT VOID *FtpmInfo > + ); > + > +/** > + PSP_FTPM_PROTOCOL prototype > + > + Defines PSP_FTPM_PROTOCOL. This protocol is used to get Ftpm info > + Send TPM command, Get TPM command's response, Execute TPM > command(Include send & get response) > +**/ > +typedef struct _PSP_FTPM_PROTOCOL { > + FTPM_EXECUTE Execute; ///< Execute TPM command, > include send & get response > + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status > + FTPM_SEND_COMMAND SendCommand; ///< Send TPM > command > + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command > response > + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs > + FTPM_GET_TPM_INFO GetInfo; ///< Get TPM info > +} PSP_FTPM_PROTOCOL; > + > +#endif //FTPM_PROTOCOL_H_ > diff --git > a/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerService > sProtocol.h > b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerService > sProtocol.h > new file mode 100644 > index 0000000000..7f57facf88 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerService > sProtocol.h > @@ -0,0 +1,14 @@ > +/** @file > + Fabric MMIO map manager Protocol prototype definition > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ > +#define FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ > +#include <FabricResourceManagerCmn.h> > + > +#endif // FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ > diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h > b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h > new file mode 100644 > index 0000000000..a7fef5a35c > --- /dev/null > +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h > @@ -0,0 +1,19 @@ > +/** @file > + AMD CPM Base Definitions. > + > + Copyright (C) 2014-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_CPM_BASE_H_ > +#define AMD_CPM_BASE_H_ > + > +#include <Base.h> > +#include <Uefi.h> > +#include <PiPei.h> > +#include <AmdCpmCommon.h> > +#include <Library/DebugLib.h> > + > +#endif // AMD_CPM_BASE_H_ > diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h > b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h > new file mode 100644 > index 0000000000..af192fcf03 > --- /dev/null > +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h > @@ -0,0 +1,78 @@ > +/** @file > + AMD CPM Common Definitions. > + > + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_CPM_COMMON_H_ > +#define AMD_CPM_COMMON_H_ > + > +#pragma pack(push) > + > +#include <AGESA.h> > +#include <AmdPcieComplex.h> > +#include <AmdCpmDefine.h> > +#include <AmdCpmFunction.h> > + > +/// The signatures of CPM table > + > +typedef enum { > + CPM_SIGNATURE_DXIO_TOPOLOGY = SIGNATURE_32 ('$', 'A', '2', > '6'), ///< The signature of Socket 0 AMD_CPM_DXIO_TOPOLOGY_TABLE > + CPM_SIGNATURE_DXIO_TOPOLOGY_S1 = SIGNATURE_32 ('$', 'A', '2', > '7') ///< The signature of Socket 1 AMD_CPM_DXIO_TOPOLOGY_TABLE > +} AMD_CPM_TABLE_SIGNATURE; > + > +/// CPM table header > +typedef struct { > + UINT32 TableSignature; ///< Signature of CPM table > + UINT16 TableSize; ///< Table size > + UINT8 FormatRevision; ///< Revision of table format > + UINT8 ContentRevision; ///< Revision of table content > + UINT32 PlatformMask; ///< The mask of platform table > supports > + UINT32 Attribute; ///< Table attribute > +} AMD_CPM_TABLE_COMMON_HEADER; > + > +/// Table pointer > +typedef union { > + VOID *Pointer; ///< Table pointer > + UINT64 Raw; ///< Table pointer value > +} AMD_CPM_POINTER; > + > +/// DXIO Topology Table > +typedef struct { > + AMD_CPM_TABLE_COMMON_HEADER Header; ///< > Table header > + UINT32 SocketId; ///< Socket Id > + DXIO_PORT_DESCRIPTOR Port[AMD_DXIO_PORT_DESCRIPTOR_SIZE]; > ///< DXIO Port Descriptor List > +} AMD_CPM_DXIO_TOPOLOGY_TABLE; > + > +/// AMD CPM Main Table > +typedef struct { > + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table > header > + UINT8 PlatformName[32]; ///< Platform name > + UINT8 BiosType; ///< BIOS type > + UINT16 CurrentPlatformId; ///< Current Platform Id > + UINT32 PcieMemIoBaseAddr; ///< > PcieMemIoBaseAddr > + UINT32 AcpiMemIoBaseAddr; ///< > AcpiMemIoBaseAddr > + AMD_CPM_POINTER Service; ///< Reserved for > internal use > + AMD_CPM_POINTER TableInRomList; ///< Reserved for > internal use > + AMD_CPM_POINTER TableInRamList; ///< Reserved for > internal use > + AMD_CPM_POINTER TableInHobList; ///< Reserved for > internal use > + AMD_CPM_POINTER HobTablePtr; ///< Reserved for > internal use > + > + UINT8 ExtClkGen; ///< External ClkGen Config. > 0x00~0x7F > + UINT8 UnusedGppClkOffEn; ///< Config to turn off > unused GPP clock > + UINT8 LpcUartEn; ///< LpcUartEn > + UINT64 AltAcpiMemIoBaseAddr; ///< Alternate > AcpiMemIoBaseAddr for Slave FCH > +} AMD_CPM_MAIN_TABLE; > + > +/// Structure for Chip Id > +typedef struct { > + UINT8 Cpu; ///< CPU/APU Chip Id > + UINT8 Sb; ///< SB Chip Id > + UINT8 Reserved[6]; > +} AMD_CPM_CHIP_ID; > +#pragma pack (pop) > + > +#endif //AMD_CPM_COMMON_H_ > diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h > b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h > new file mode 100644 > index 0000000000..4fc3f97a80 > --- /dev/null > +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h > @@ -0,0 +1,17 @@ > +/** @file > + AMD CPM Common Definitions. > + > + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_CPM_DEFINE_H_ > +#define AMD_CPM_DEFINE_H_ > + > +#ifndef AMD_DXIO_PORT_DESCRIPTOR_SIZE > +#define AMD_DXIO_PORT_DESCRIPTOR_SIZE 0x30 > +#endif > + > +#endif // AMD_CPM_DEFINE_H_ > diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h > b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h > new file mode 100644 > index 0000000000..7dce238135 > --- /dev/null > +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h > @@ -0,0 +1,32 @@ > +/** @file > + AMD CPM Common Functions. > + > + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_CPM_FUNCTION_H_ > +#define AMD_CPM_FUNCTION_H_ > + > +typedef VOID *(EFIAPI *AMD_CPM_GETTABLEPTR_FN)( > + IN VOID *This, > + IN UINT32 TableId > + ); > + > +typedef AGESA_STATUS (EFIAPI *AMD_CPM_GETPOSTEDVBIOSIMAGE_FN)( > + IN GFX_VBIOS_IMAGE_INFO *VbiosImageInfo > + ); > + > +/// Common Functions for CPM Drivers > +typedef struct _AMD_CPM_COMMON_FUNCTION { > + AMD_CPM_GETTABLEPTR_FN GetTablePtr2; ///< Get CPM Table > Pointer. The table can be re-writable > +} AMD_CPM_COMMON_FUNCTION; > + > +/// CPM Public Functions for platform DXE Driver to use > +typedef struct _AMD_CPM_DXE_PUBLIC_FUNCTION { > + AMD_CPM_GETPOSTEDVBIOSIMAGE_FN GetPostedVbiosImage; ///< > Get posted VBIOS image > +} AMD_CPM_DXE_PUBLIC_FUNCTION; > + > +#endif //AMD_CPM_FUNCTION_H_ > diff --git > a/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/Amd > CpmTableProtocol.h > b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/Amd > CpmTableProtocol.h > new file mode 100644 > index 0000000000..4a90aa3d8b > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/Amd > CpmTableProtocol.h > @@ -0,0 +1,39 @@ > +/** @file > + AMD CPM Table Protocol. > + > + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef AMD_CPM_TABLE_PROTOCOL_H_ > +#define AMD_CPM_TABLE_PROTOCOL_H_ > + > +#include <AmdCpmBase.h> > + > +// > +// GUID definition > +// > +#define AMD_CPM_TABLE_PROTOCOL_GUID \ > + { 0x3724cf01, 0x00c2, 0x9762, 0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, > 0x00 } > + > +#define AMD_CPM_TABLE_SMM_PROTOCOL_GUID \ > + { 0xaf6efacf, 0x7a13, 0x45a3, 0xb1, 0xa5, 0xaa, 0xfc, 0x06, 0x1c, 0x4b, > 0x79 } > + > +extern EFI_GUID gAmdCpmTableProtocolGuid; > +extern EFI_GUID gAmdCpmTableSmmProtocolGuid; > + > +/// DXE Protocol Structure > +typedef struct _AMD_CPM_TABLE_PROTOCOL { > + UINTN Revision; ///< Protocol Revision > + AMD_CPM_MAIN_TABLE *MainTablePtr; ///< Pointer to > CPM Main Table > + AMD_CPM_CHIP_ID ChipId; ///< Id of SB Chip > + AMD_CPM_COMMON_FUNCTION CommonFunction; ///< > Private Common Functions > + AMD_CPM_DXE_PUBLIC_FUNCTION DxePublicFunction; ///< > Public Function of Protocol > +} AMD_CPM_TABLE_PROTOCOL; > + > +// Current Protocol Revision > +#define AMD_CPM_TABLE_PROTOCOL_REV 0x00 > + > +#endif // AMD_CPM_TABLE_PROTOCOL_H_ > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMbox > LibV2.c > b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMbox > LibV2.c > new file mode 100644 > index 0000000000..fa83888e95 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMbox > LibV2.c > @@ -0,0 +1,31 @@ > +/** @file > + PSP Mailbox related functions > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > + > +/** > + * @brief Bios send these commands to PSP to grant dTPM status and event > log > + * > + * @param[out] DesiredConfig dTPM configuration requested > + * @param[out] ConfigStatus 0 - success. non-zero failure. > + * @param[in,out] LogDataSize Size of LogData buffer > + * @param[out] LogData Point to allocated event log buffer > + * > + * @retval EFI_STATUS 0: Success, NonZero Error > + */ > +EFI_STATUS > +PspMboxGetDTPMData ( > + OUT UINT32 *DesiredConfig, > + OUT UINT32 *ConfigStatus, > + IN OUT UINT32 *LogDataSize, > + OUT VOID *LogData > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRo > mArmorLib.c > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRo > mArmorLib.c > new file mode 100644 > index 0000000000..0e9baad955 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRo > mArmorLib.c > @@ -0,0 +1,12 @@ > +/** @file > + > + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/SmmServicesTableLib.h> > +#include <Protocol/SmmBase2.h> > diff --git > a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPs > pRomArmorLibNull.c > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPs > pRomArmorLibNull.c > new file mode 100644 > index 0000000000..a04bc1f992 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPs > pRomArmorLibNull.c > @@ -0,0 +1,79 @@ > +/** @file > + > + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > +#include <Library/AmdPspRomArmorLib.h> > + > +/** > + * Request secures the SPI Controller > + * > + * @param[in, out] SpiCommunicationBuffer SPI Communication Structure > Buffer pointer > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspEnterSmmOnlyMode ( > + IN SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + * Loads the whitelist into the PSP. > + * > + * @param[in] SpiWhitelist SPI White List structure buffer pointer. > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspEnforceWhitelist ( > + IN SPI_WHITE_LIST *SpiWhitelist > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + * Request execute SPI command provide in TSEG comm buffer. > + * > + * @param[in] NONE > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspExecuteSpiCommand ( > + VOID > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + * Request PSP firmware switch SPI controller chip select. > + * > + * > + * @param[in] Chipset SPI controller chip select, 0= Allowed on > all chip selects, 1= CS1, 2= CS2, all else invalid > + * > + * @retval EFI_SUCCESS Initial success > + * @retval Others Error happens during initialize > + */ > +EFI_STATUS > +EFIAPI > +PspSwitchChipSelect ( > + IN UINT8 ChipSelect > + ) > +{ > + return EFI_UNSUPPORTED; > +} > diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c > b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c > new file mode 100644 > index 0000000000..fce82d75b0 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c > @@ -0,0 +1,12 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <Library/PcdLib.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Protocol/SmmBase2.h> > diff --git > a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c > b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c > new file mode 100644 > index 0000000000..f8b9eb0bcf > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c > @@ -0,0 +1,14 @@ > +/** @file > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > +#include <PiPei.h> > +#include <Base.h> > +#include <Library/PcdLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/PeiServicesLib.h> > diff --git > a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFab > ricTopologyRsLib.c > b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFab > ricTopologyRsLib.c > new file mode 100644 > index 0000000000..cff678d76b > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFab > ricTopologyRsLib.c > @@ -0,0 +1,37 @@ > +** @file > + Fabric Topology Base Lib implementation > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > + > +UINTN > +FabricTopologyGetNumberOfProcessorsPresent ( > + VOID > + ) > +{ > + return 0; > +} > + > +UINTN > +FabricTopologyGetNumberOfRootBridgesOnSocket ( > + IN UINTN Socket > + ) > +{ > + return 0; > +} > + > +RETURN_STATUS > +EFIAPI > +BaseFabricTopologyLibConstructor ( > + VOID > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib. > c > new file mode 100644 > index 0000000000..f72cbe7dff > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib. > c > @@ -0,0 +1,8 @@ > +/** @file > + A Base Timer Library implementation which uses the Time Stamp Counter in > the processor. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c > new file mode 100644 > index 0000000000..a155978a5d > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c > @@ -0,0 +1,35 @@ > +/** @file > + A Dxe Timer Library implementation which uses the Time Stamp Counter in > the processor. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiLib.h> > +#include <Library/DebugLib.h> > + > +/** The constructor function determines the actual TSC frequency. > + > + First, Get TSC frequency from system configuration table with TSC > frequency GUID, > + if the table is not found, install it. > + This function will always return EFI_SUCCESS. > + > + @param ImageHandle The firmware allocated handle for the EFI image. > + @param SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. > + > +**/ > +EFI_STATUS > +EFIAPI > +DxeTscTimerLibConstructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c > new file mode 100644 > index 0000000000..f70aa3de0e > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c > @@ -0,0 +1,11 @@ > +/** @file > + A Pei Timer Library implementation which uses the Time Stamp Counter in > the processor. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiPei.h> > +#include <Library/HobLib.h> > diff --git > a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare. > c > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare > .c > new file mode 100644 > index 0000000000..7d14d62e60 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare > .c > @@ -0,0 +1,103 @@ > +/** @file > + The Timer Library implementation which uses the Time Stamp Counter in > the processor. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +/** Stalls the CPU for at least the specified number of MicroSeconds. > + > + @param[in] MicroSeconds The minimum number of microseconds to > delay. > + > + @return The value of MicroSeconds input. > + > +**/ > +UINTN > +EFIAPI > +MicroSecondDelay ( > + IN UINTN MicroSeconds > + ) > +{ > + return 0; > +} > + > +/** Stalls the CPU for at least the specified number of NanoSeconds. > + > + @param[in] NanoSeconds The minimum number of nanoseconds to delay. > + > + @return The value of NanoSeconds input. > + > +**/ > +UINTN > +EFIAPI > +NanoSecondDelay ( > + IN UINTN NanoSeconds > + ) > +{ > + return 0; > +} > + > +/** Retrieves the current value of the 64-bit free running Time-Stamp > counter. > + > + The properties of the counter can be retrieved by the > + GetPerformanceCounterProperties() function. > + > + @return The current value of the free running performance counter. > + > +**/ > +UINT64 > +EFIAPI > +GetPerformanceCounter ( > + VOID > + ) > +{ > + return 0; > +} > + > +/** Retrieves the 64-bit frequency in Hz and the range of performance > counter > + values. > + > + If StartValue is not NULL, then the value that the performance counter > starts > + with, 0x0, is returned in StartValue. If EndValue is not NULL, then the value > + that the performance counter end with, 0xFFFFFFFFFFFFFFFF, is returned in > + EndValue. > + > + The 64-bit frequency of the performance counter, in Hz, is always returned. > + > + @param[out] StartValue Pointer to where the performance counter's > starting value is saved, or NULL. > + @param[out] EndValue Pointer to where the performance counter's > ending value is saved, or NULL. > + > + @return The frequency in Hz. > + > +**/ > +UINT64 > +EFIAPI > +GetPerformanceCounterProperties ( > + OUT UINT64 *StartValue, OPTIONAL > + OUT UINT64 *EndValue OPTIONAL > + ) > +{ > + return 0; > +} > + > +/** > + Converts elapsed ticks of performance counter to time in nanoseconds. > + > + This function converts the elapsed ticks of running performance counter to > + time value in unit of nanoseconds. > + > + @param Ticks The number of elapsed ticks of running performance > counter. > + > + @return The elapsed time in nanoseconds. > + > +**/ > +UINT64 > +EFIAPI > +GetTimeInNanoSecond ( > + IN UINT64 Ticks > + ) > +{ > + return 0; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHost > BridgeLib.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHost > BridgeLib.c > new file mode 100644 > index 0000000000..44e23df62f > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHost > BridgeLib.c > @@ -0,0 +1,95 @@ > +/** @file > + AMD instance of the PCI Host Bridge Library. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/PciHostBridgeLib.h> > +#include <Library/DebugLib.h> > +#include <Library/DevicePathLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <Protocol/PciRootBridgeIo.h> > +#include <Protocol/PciHostBridgeResourceAllocation.h> > + > +/** > + Sort all root bridges in bus ascending order and set DevicePath UIDs > + continuous and ascending from zero > + > + @param[in,out] RootBridgeList Array of root bridges. > + @param[in] Count Count of root bridges in RootBridgeList > + > + @return All the root bridge instances in an array are sorted in bus order. > + DevicePath UID updated to continuous and ascending numbers starting > + with 0. > +**/ > +VOID > +EFIAPI > +PciHostBridgeSortRootBridges ( > + IN PCI_ROOT_BRIDGE *RootBridgeList, > + IN UINTN Count > + ) > +{ > +} > + > +/** > + Return all the root bridge instances in an array. > + > + @param Count Return the count of root bridge instances. > + > + @return All the root bridge instances in an array. > + The array should be passed into PciHostBridgeFreeRootBridges() > + when it's not used. > +**/ > +PCI_ROOT_BRIDGE * > +EFIAPI > +PciHostBridgeGetRootBridges ( > + UINTN *Count > + ) > +{ > + return (PCI_ROOT_BRIDGE *)NULL; > +} > + > +/** > + Free the root bridge instances array returned from > PciHostBridgeGetRootBridges(). > + > + @param Bridges The root bridge instances array. > + @param Count The count of the array. > +**/ > +VOID > +EFIAPI > +PciHostBridgeFreeRootBridges ( > + PCI_ROOT_BRIDGE *Bridges, > + UINTN Count > + ) > +{ > +} > + > +/** > + Inform the platform that the resource conflict happens. > + > + @param HostBridgeHandle Handle of the Host Bridge. > + @param Configuration Pointer to PCI I/O and PCI memory resource > + descriptors. The Configuration contains the resources > + for all the root bridges. The resource for each root > + bridge is terminated with END descriptor and an > + additional END is appended indicating the end of the > + entire resources. The resource descriptor field > + values follow the description in > + EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL > + .SubmitResources(). > +**/ > +VOID > +EFIAPI > +PciHostBridgeResourceConflict ( > + EFI_HANDLE HostBridgeHandle, > + VOID *Configuration > + ) > +{ > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObj > ects.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObj > ects.c > new file mode 100644 > index 0000000000..318f8e5ad7 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObj > ects.c > @@ -0,0 +1,154 @@ > +/** @file > + > + Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLARGOBJECTS_FILECODE > + > +/* > + Fill the DataBuffer with correct Arg Opcode based on provided argument > number > + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. > + AML supports max 7 argument, i.e., Arg1, Arg2 ... Arg6. > + > + @param[in] ArgN - Argument Number > + @param[out] ReturnData - Allocated DataBuffer with encoded integer > + @param[out] ReturnDataSize - Size of ReturnData > + > + @return EFI_SUCCESS - Successful completion > + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer > + @return EFI_INVALID_PARAMETER - Invalid ArgN provided. > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlArgBuffer ( > + IN OUT UINT8 ArgN, > + OUT VOID **ReturnData, > + OUT UINTN *ReturnDataSize > + ) > +{ > + UINT8 *Data; > + UINTN DataSize; > + > + Data = AllocateZeroPool (sizeof (UINT8)); > + if (Data == NULL) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Failed to create Data Buffer.\n", > + __func__ > + )); > + return EFI_OUT_OF_RESOURCES; > + } > + > + DataSize = 1; > + switch (ArgN) { > + case 0: > + Data[0] = AML_ARG0; > + break; > + case 1: > + Data[0] = AML_ARG1; > + break; > + case 2: > + Data[0] = AML_ARG2; > + break; > + case 3: > + Data[0] = AML_ARG3; > + break; > + case 4: > + Data[0] = AML_ARG4; > + break; > + case 5: > + Data[0] = AML_ARG5; > + break; > + case 6: > + Data[0] = AML_ARG6; > + break; > + default: > + FreePool (Data); > + return EFI_INVALID_PARAMETER; > + } > + > + *ReturnData = (VOID *)Data; > + *ReturnDataSize = DataSize; > + > + return EFI_SUCCESS; > +} > + > +/** > + Creates an ArgN Opcode object > + > + Arg Objects Encoding > + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | > Arg6Op > + Arg0Op := 0x68 > + Arg1Op := 0x69 > + Arg2Op := 0x6A > + Arg3Op := 0x6B > + Arg4Op := 0x6C > + Arg5Op := 0x6D > + Arg6Op := 0x6E > + > + @param[in] ArgN - Argument Number to be encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOpArgN ( > + IN UINT8 ArgN, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Start %a object\n", > + __func__, > + "ARGN_OPCODE" > + )); > + goto Done; > + } > + > + Status = InternalAmlArgBuffer ( > + ArgN, > + (VOID **)&(Object->Data), > + &(Object->DataSize) > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: ACPI Argument 0x%X object\n", > + __func__, > + ArgN > + )); > + goto Done; > + } > + > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistF > unctions.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistF > unctions.c > new file mode 100644 > index 0000000000..371537c9aa > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistF > unctions.c > @@ -0,0 +1,151 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLASSISTFUNCTIONS_FILECODE > + > +/** > + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. > + Will not free ListHead nor an Object containing ListHead. > + > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > +**/ > +EFI_STATUS > +EFIAPI > +AmlFreeObjectList ( > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + LIST_ENTRY *Node; > + AML_OBJECT_INSTANCE *Object; > + > + Node = GetNextNode (ListHead, ListHead); > + while (Node != ListHead) { > + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + // Get next node before freeing current Object > + Node = GetNextNode (ListHead, Node); > + // Free Object > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Validate that ACPI table is completed and return Table and Size > + > + @param[in,out] ListHead - Head of linked list of Objects > + @param[out] Table - Completed ACPI Table > + @param[out] TableSize - Completed ACPI Table size > + > + @retval EFI_SUCCESS > + EFI_INVALID_PARAMETER > + EFI_DEVICE_ERROR > +**/ > +EFI_STATUS > +EFIAPI > +AmlGetCompletedTable ( > + IN OUT LIST_ENTRY *ListHead, > + OUT VOID **Table, > + OUT UINTN *TableSize > + ) > +{ > + LIST_ENTRY *Node; > + AML_OBJECT_INSTANCE *Object; > + > + if (ListHead == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead cannot be NULL\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + *Table = NULL; > + *TableSize = 0; > + Node = GetFirstNode (ListHead); > + if (!IsNodeAtEnd (ListHead, Node)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Multiple nodes remain, Likely > missed an 'AmlClose' call\n", __func__)); > + return EFI_DEVICE_ERROR; > + } else { > + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + if (!Object->Completed) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Final node not completed: Likely > missed an 'AmlCLose' call\n", __func__)); > + return EFI_DEVICE_ERROR; > + } > + > + *Table = Object->Data; > + *TableSize = Object->DataSize; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Initialize Table List to work with AmlGenerationLib > + > + Allocates a LIST_ENTRY linked list item and initializes it. Use > + AmlReleaseTableList to free resulting table and LIST_ENTRY. > + > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > + EFI_INVALID_PARAMETER > + EFI_OUT_OF_RESOURCES > +**/ > +EFI_STATUS > +EFIAPI > +AmlInitializeTableList ( > + IN OUT LIST_ENTRY **ListHead > + ) > +{ > + if (ListHead == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead = NULL\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + *ListHead = AllocatePool (sizeof (LIST_ENTRY)); > + if (*ListHead == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to allocate Table List Head\n", > __func__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + InitializeListHead (*ListHead); > + > + return EFI_SUCCESS; > +} > + > +/** > + Release table List > + > + Releases all elements. Use to free built table and LIST_ENTRY allocated by > + AmlInitializeTableList. > + > + @param[in,out] ListHead - Head of linked list of Objects > + > + @retval EFI_SUCCESS > + EFI_INVALID_PARAMETER > +**/ > +EFI_STATUS > +EFIAPI > +AmlReleaseTableList ( > + IN OUT LIST_ENTRY **ListHead > + ) > +{ > + if (*ListHead == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NULL ListHead passed in\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + AmlFreeObjectList (*ListHead); > + FreePool (*ListHead); > + *ListHead = NULL; > + > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataOb > jects.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataOb > jects.c > new file mode 100644 > index 0000000000..b7d4f4c9d7 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataOb > jects.c > @@ -0,0 +1,640 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLDATAOBJECTS_FILECODE > + > +/* > + Creates an allocated buffer with sized data and no Op Code > + > + ByteData := 0x00 - 0xFF > + WordData := ByteData[0:7] ByteData[8:15] // 0x0000-0xFFFF > + DWordData := WordData[0:15] WordData[16:31] // 0x00000000- > 0xFFFFFFFF > + QWordData := DWordData[0:31] DWordData[32:63] // > 0x0000000000000000- 0xFFFFFFFFFFFFFFFF > + > + Forces max integer size UINT64 > + > + Caller is responsible for freeing returned buffer. > + > + @param[in] Integer - Integer value to encode > + @param[in] IntegerSize - Size of integer in bytes > + @param[out] ReturnData - Allocated DataBuffer with encoded integer > + @param[out] ReturnDataSize - Size of ReturnData > + > + @return EFI_SUCCESS - Successful completion > + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlSizedDataBuffer ( > + IN UINT64 Integer, > + IN UINTN IntegerSize, > + OUT VOID **ReturnData > + ) > +{ > + UINT8 *Data; > + > + if ((IntegerSize != sizeof (UINT8)) && > + (IntegerSize != sizeof (UINT16)) && > + (IntegerSize != sizeof (UINT32)) && > + (IntegerSize != sizeof (UINT64))) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Incorrect integer size=%d > requested.\n", __func__, IntegerSize)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IntegerSize < sizeof (UINT64)) && (Integer >= LShiftU64 (1, IntegerSize * > 8))) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer is larger than requestd > size.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + // Max Data Size is 64 bit. Plus one Opcode byte > + Data = AllocateZeroPool (sizeof (UINT64)); > + if (Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", > __func__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + // Already established we only have supported sizes above > + switch (IntegerSize) { > + case sizeof (UINT8): > + *(UINT8 *)Data = (UINT8)Integer; > + break; > + case sizeof (UINT16): > + *(UINT16 *)Data = (UINT16)Integer; > + break; > + case sizeof (UINT32): > + *(UINT32 *)Data = (UINT32)Integer; > + break; > + case sizeof (UINT64): > + *(UINT64 *)Data = (UINT64)Integer; > + break; > + } > + > + *ReturnData = (VOID *)Data; > + return EFI_SUCCESS; > +} > + > +/* > + Calculates the optimized integer value used by AmlOPDataInteger and > others > + > + Forces max integer size UINT64 > + > + @param[in] Integer - Integer value to encode > + @param[out] ReturnData - Allocated DataBuffer with encoded integer > + @param[out] ReturnDataSize - Size of ReturnData > + > + @return EFI_SUCCESS - Successful completion > + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlDataIntegerBuffer ( > + IN UINT64 Integer, > + OUT VOID **ReturnData, > + OUT UINTN *ReturnDataSize > + ) > +{ > + UINT8 *IntegerData; > + UINTN IntegerDataSize; > + UINT8 *Data = NULL; > + UINTN DataSize; > + > + // Max Data Size is 64 bit. Plus one Opcode byte > + IntegerData = AllocateZeroPool (sizeof (UINT64) + 1); > + if (IntegerData == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", > __func__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + if (Integer == 0) { > + // ZeroOp > + IntegerDataSize = 1; > + IntegerData[0] = AML_ZERO_OP; > + } else if (Integer == 1) { > + // OneOp > + IntegerDataSize = 1; > + IntegerData[0] = AML_ONE_OP; > + } else if (Integer == (UINT64) ~0x0) { > + // OnesOp > + IntegerDataSize = 1; > + IntegerData[0] = AML_ONES_OP; > + } else { > + if (Integer >= 0x100000000) { > + // QWordConst > + IntegerDataSize = sizeof (UINT64) + 1; > + IntegerData[0] = AML_QWORD_PREFIX; > + } else if (Integer >= 0x10000) { > + // DWordConst > + IntegerDataSize = sizeof (UINT32) + 1; > + IntegerData[0] = AML_DWORD_PREFIX; > + } else if (Integer >= 0x100) { > + // WordConst > + IntegerDataSize = sizeof (UINT16) + 1; > + IntegerData[0] = AML_WORD_PREFIX; > + } else { > + // ByteConst > + IntegerDataSize = sizeof (UINT8) + 1; > + IntegerData[0] = AML_BYTE_PREFIX; > + } > + > + DataSize = IntegerDataSize - 1; > + InternalAmlSizedDataBuffer (Integer, DataSize, (VOID **)&Data); > + if (Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Data Space Alloc Failed\n", > __func__)); > + FreePool (IntegerData); > + return EFI_OUT_OF_RESOURCES; > + } > + > + CopyMem (&IntegerData[1], Data, DataSize); > + FreePool (Data); > + } > + > + // Reallocate the pool so size is exact > + *ReturnData = (VOID *)IntegerData; > + *ReturnDataSize = IntegerDataSize; > + > + return EFI_SUCCESS; > +} > + > +/** > + Creates an optimized integer object > + > + Forces max integer size UINT64 > + > + ComputationalData := ByteConst | WordConst | DWordConst | > QWordConst | String | > + ConstObj | RevisionOp | DefBuffer > + DataObject := ComputationalData | DefPackage | DefVarPackage > + DataRefObject := DataObject | ObjectReference | DDBHandle > + ByteConst := BytePrefix ByteData > + BytePrefix := 0x0A > + WordConst := WordPrefix WordData > + WordPrefix := 0x0B > + DWordConst := DWordPrefix DWordData > + DWordPrefix := 0x0C > + QWordConst := QWordPrefix QWordData > + QWordPrefix := 0x0E > + ConstObj := ZeroOp | OneOp | OnesOp > + ByteData := 0x00 - 0xFF > + WordData := ByteData[0:7] ByteData[8:15] > + // 0x0000-0xFFFF > + DWordData := WordData[0:15] WordData[16:31] > + // 0x00000000-0xFFFFFFFF > + QWordData := DWordData[0:31] DWordData[32:63] > + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF > + ZeroOp := 0x00 > + OneOp := 0x01 > + OnesOp := 0xFF > + > + @param[in] Integer - Number to be optimized and encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDataInteger ( > + IN UINT64 Integer, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "DATA_INTEGER")); > + goto Done; > + } > + > + Status = InternalAmlDataIntegerBuffer ( > + Integer, > + (VOID **)&(Object->Data), > + &(Object->DataSize) > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", > __func__, Integer)); > + goto Done; > + } > + > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates an Sized Data integer object for use in Buffer objects. Does not > + include opcode. > + > + ByteData := 0x00 - 0xFF > + WordData := ByteData[0:7] ByteData[8:15] > + // 0x0000-0xFFFF > + DWordData := WordData[0:15] WordData[16:31] > + // 0x00000000-0xFFFFFFFF > + QWordData := DWordData[0:31] DWordData[32:63] > + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF > + > + @param[in] Integer - Number to be optimized and encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlOPSizedData ( > + IN UINT64 Integer, > + IN UINTN IntegerSize, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "SIZED_DATA_INTEGER")); > + goto Done; > + } > + > + Object->DataSize = IntegerSize; > + Status = InternalAmlSizedDataBuffer ( > + Integer, > + Object->DataSize, > + (VOID **)&(Object->Data) > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", > __func__, Integer)); > + goto Done; > + } > + > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a ByteData integer object for use in Buffer objects. Does not > + include opcode. > + > + ByteData := 0x00 - 0xFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPByteData ( > + IN UINT8 Integer, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + return InternalAmlOPSizedData (Integer, sizeof (UINT8), ListHead); > +} > + > +/** > + Creates a WordData integer object for use in Buffer objects. Does not > + include opcode. > + > + WordData := 0x0000 - 0xFFFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordData ( > + IN UINT16 Integer, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + return InternalAmlOPSizedData (Integer, sizeof (UINT16), ListHead); > +} > + > +/** > + Creates a DWordData integer object for use in Buffer objects. Does not > + include opcode. > + > + DWordData := 0x00000000 - 0xFFFFFFFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordData ( > + IN UINT32 Integer, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + return InternalAmlOPSizedData (Integer, sizeof (UINT32), ListHead); > +} > + > +/** > + Creates a QWordData integer object for use in Buffer objects. Does not > + include opcode. > + > + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF > + > + @param[in] Integer - Number to be placed in object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordData ( > + IN UINT64 Integer, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + return InternalAmlOPSizedData (Integer, sizeof (UINT64), ListHead); > +} > + > +/** > + Creates a data string object > + > + ComputationalData := String > + > + String := StringPrefix AsciiCharList NullChar > + StringPrefix := 0x0D > + AsciiCharList := Nothing | <AsciiChar AsciiCharList> > + AsciiChar := 0x01 - 0x7F > + NullChar := 0x00 > + > + @param[in] String - String to be encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDataString ( > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + UINT8 *Data; > + UINTN DataSize; > + UINTN Index; > + > + if ((String == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + // Validate all characters > + DataSize = AsciiStrLen (String); > + for (Index = 0; Index < DataSize; Index++) { > + if (String[Index] < 0x01) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Invalid character String[%d] : %a\n", > + __func__, > + Index, > + String > + )); > + return Status; > + } > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > String)); > + goto Done; > + } > + > + // AML_STRING_PREFIX + String + NULL Terminator > + DataSize += 2; > + Data = AllocatePool (DataSize); > + if (Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: String Space Allocation %a\n", > + __func__, > + String > + )); > + goto Done; > + } > + > + Data[0] = AML_STRING_PREFIX; > + CopyMem (&Data[1], String, DataSize - 1); > + > + // DataString Complete, Put into Object > + Object->Data = Data; > + Object->DataSize = DataSize; > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a data buffer AML object from an array > + > + This will take the passed in buffer and generate an AML Object from that > + buffer > + > + @param[in] Buffer - Buffer to be placed in AML Object > + @param[in] BufferSize - Size of Buffer to be copied into Object > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDataBufferFromArray ( > + IN VOID *Buffer, > + IN UINTN BufferSize, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if ((Buffer == NULL) || (BufferSize == 0) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Object = NULL; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Data Buffer object\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocatePool (BufferSize); > + Object->DataSize = BufferSize; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Data Buffer allocate failed\n", > __func__)); > + goto Done; > + } > + > + CopyMem (Object->Data, Buffer, BufferSize); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) > + > + Syntax: > + EISAID (EisaIdString) => DWordConst > + > + Arguments: > + The EisaIdString must be a String object of the form "UUUNNNN", where > "U" > + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other > + characters are allowed in the string. > + > + Description: > + Converts EisaIdString, a 7-character text string argument, into its > + corresponding 4-byte numeric EISA ID encoding. It can be used when > declaring > + IDs for devices that have EISA IDs. > + > + Encoded EISA ID Definition - 32-bits > + bits[15:0] - three character compressed ASCII EISA ID. * > + bits[31:16] - binary number > + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' > + > + > + Example: > + EISAID ("PNP0C09") // This is a valid invocation of the macro. > + > + @param[in] String - EISA ID string. > + @param[in,out] ListHead - Head of Linked List of all AML Objects > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPEisaId ( > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + UINT32 EncodedEisaId; > + UINT8 i; > + > + EncodedEisaId = 0; > + > + if ((String == NULL) || (ListHead == NULL)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, inputs cannot == > NULL.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (AsciiStrLen (String) != 0x7) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid length for 'String' > parameter.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Verify String is formatted as "UUUNNNN". > + // > + for (i = 0; i <= 0x6; i++) { > + // > + // If first 3 characters are not uppercase alpha or last 4 characters are not > hexadecimal > + // > + if (((i <= 0x2) && (!IS_ASCII_UPPER_ALPHA (String[i]))) || > + ((i >= 0x3) && (!IS_ASCII_HEX_DIGIT (String[i])))) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid EISA ID string format!\n", > __func__)); > + DEBUG ((DEBUG_ERROR, " Input String must be formatted as > 'UUUNNNN'.\n")); > + return EFI_INVALID_PARAMETER; > + } > + } > + > + // > + // Convert string to 4-byte EISA ID encoding. > + // Ex: 'PNP0A03' encodes to '0x30AD041' > + // > + EncodedEisaId = ((((String[0] - AML_NAME_CHAR_A + 1) & 0x1f) << 10) > + + (((String[1] - AML_NAME_CHAR_A + 1) & 0x1f) << 5) > + + (((String[2] - AML_NAME_CHAR_A + 1) & 0x1f) << 0) > + + (UINT32)(AsciiStrHexToUint64 (&String[3]) << 16)); > + > + // > + // Swap bytes of upper and lower WORD to format EISA ID with proper > endian-ness. > + // > + EncodedEisaId = Swap4Bytes (EncodedEisaId); > + > + // > + // Insert DWordPrefix into list. > + // Note: EncodedEisaId will always be 32-bits, resulting in DWordConst. > + // > + Status = AmlOPDataInteger (EncodedEisaId, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to create ACPI DWordConst > from Encoded EISA ID.\n", __func__)); > + return Status; > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpress > ionOpcodes.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpres > sionOpcodes.c > new file mode 100644 > index 0000000000..e8ea9d8e84 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpres > sionOpcodes.c > @@ -0,0 +1,1294 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLEXPRESSIONOPCODES_FILECODE > + > +// ---------------------------------------------------------------------------- > +// Expression Opcodes Encoding > +// ---------------------------------------------------------------------------- > +// ExpressionOpcode := DefAcquire | DefAdd | DefAnd | DefBuffer | > DefConcat | > +// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement | > +// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit | > +// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual | > +// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid | > +// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod > | > +// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr | > +// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight | > +// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | > DefToBuffer | > +// DefToDecimalString | DefToHexString | DefToInteger | DefToString | > +// DefWait | DefXOr | MethodInvocation > +// ---------------------------------------------------------------------------- > + > +/** > + Creates a Buffer (BufferSize) {Initializer} => Buffer Object > + > + Initializers must be created between AmlStart and AmlClose Phase > + > + DefBuffer := BufferOp PkgLength BufferSize ByteList > + BufferOp := 0x11 > + BufferSize := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] BufferSize - Requested BufferSize, Encoded value will be > + MAX (BufferSize OR Child->DataSize) > + @param[in,out] ListHead - Linked list has completed Buffer Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlBuffer ( > + IN AML_FUNCTION_PHASE Phase, > + IN UINTN BufferSize, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + UINTN InternalBufferSize; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if > + // someone requests something >= 4GB size. Have a message with this to > be > + // very specific > + if (BufferSize >= SIZE_4GB) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: BufferSize=0x%X >= 4GB\n", > __func__, BufferSize)); > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start the Buffer Object > + Status = InternalAppendNewAmlObject (&Object, "BUFFER", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFER object\n", > __func__)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer PkgLength object\n", > __func__)); > + goto Done; > + } > + > + // Start BufferSize > + Status = InternalAppendNewAmlObject (&Object, "BUFFERSIZE", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFERSIZE object\n", > __func__)); > + goto Done; > + } > + > + // ByteList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // ByteList items should be closed already > + > + // Close BufferSize > + Status = InternalAmlLocateObjectByIdentifier ( > + &Object, > + "BUFFERSIZE", > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate BufferSize object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect BufferSize children\n", > __func__)); > + goto Done; > + } > + > + // Set BufferSize Object to correct value and size. > + // BufferSize should be from zero (no Child Data) to MAX of requested > + // BufferSize or size required for ChildObject->Data. > + InternalBufferSize = MAX (BufferSize, ChildObject->DataSize); > + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if > + // someone requests something >= 4GB size. > + if (InternalBufferSize >= SIZE_4GB) { > + Status = EFI_BAD_BUFFER_SIZE; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: BufferSize 0x%X >= 4GB\n", > + __func__, > + InternalBufferSize > + )); > + goto Done; > + } > + > + Status = InternalAmlDataIntegerBuffer ( > + InternalBufferSize, > + (VOID **)&Object->Data, > + &Object->DataSize > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc BufferSize\n", __func__)); > + goto Done; > + } > + > + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { > + // Make room for ChildObject->Data > + Object->Data = ReallocatePool ( > + Object->DataSize, > + Object->DataSize + > + ChildObject->DataSize, > + Object->Data > + ); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate BufferSize\n", > __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + CopyMem ( > + &Object->Data[Object->DataSize], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + Object->DataSize += ChildObject->DataSize; > + } > + > + // Free Child Object since it has been consumed > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", > __func__)); > + goto Done; > + } > + > + // Complete Buffer object with all data > + Status = InternalAmlLocateObjectByIdentifier (&Object, "BUFFER", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Buffer object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + > + // Buffer must have at least PkgLength BufferSize > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Buffer Data\n", __func__)); > + goto Done; > + } > + > + // BufferOp is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", > __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Object->Data[0] = AML_BUFFER_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + // Free Child Object since it has been consumed > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a LEqual (Source1, Source2) => Boolean > + > + Source1 and Source2 operands must be created between AmlStart and > AmlClose Phase > + > + DefLEqual := LequalOp Operand Operand > + LequalOp := 0x93 > + Operand := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed LEqual Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlLEqual ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start the LEqual Object > + Status = InternalAppendNewAmlObject (&Object, "LEQUAL", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start LEQUAL object\n", > __func__)); > + goto Done; > + } > + > + // Operands are too complicated and must be added outside > + break; > + > + case AmlClose: > + > + // Close LEqual > + Status = InternalAmlLocateObjectByIdentifier ( > + &Object, > + "LEQUAL", > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate LEqual object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + > + // LEqual must have at least two operands > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: No LEqual Args\n", __func__)); > + goto Done; > + } > + > + // LequalOp is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", > __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Object->Data[0] = AML_LEQUAL_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + // Free Child Object since it has been consumed > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/* > + Creates (NumElements) section of a Package: {PackageList} => Package > + > + Initializers must be created between AmlStart and AmlClose Phase > + Internal only function no public reference or documentation needed. > + > + NumElements := ByteData > + VarNumElements := TermArg => Integer > + PackageElementList := Nothing | <PackageElement PackageElementList> > + PackageElement := DataRefObject | NameString > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] NumElements - Number of elements in the package. If 0, > size > + is calculated from the PackageList. > + @param[in,out] ListHead - Linked list has completed Package Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlNumElements ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT UINTN *NumElements, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + ChildCount = 0; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start Number of Elements Object > + Status = InternalAppendNewAmlObject (&Object, "NUM_ELEMENTS", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", > __func__)); > + goto Done; > + } > + > + // PackageList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // PackageList items should be closed already > + > + // Close Number of Elements Object > + Status = InternalAmlLocateObjectByIdentifier ( > + &Object, > + "NUM_ELEMENTS", > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate NUM_ELEMENTS > object\n", __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect NUM_ELEMENTS > children\n", __func__)); > + goto Done; > + } > + > + // We do not have to change anything for NumElements >= Child Count > + if (*NumElements == 0) { > + *NumElements = ChildCount; > + } else if (*NumElements < ChildCount) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements < ChildCount.\n", > __func__)); > + Status = EFI_INVALID_PARAMETER; > + goto Done; > + } > + > + if (*NumElements <= MAX_UINT8) { > + Object->DataSize = 1; > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements allocate failed\n", > __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Object->Data[0] = (UINT8)*NumElements; > + } else { > + Status = InternalAmlDataIntegerBuffer ( > + *NumElements, > + (VOID **)&Object->Data, > + &Object->DataSize > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc NumElements\n", > __func__)); > + goto Done; > + } > + } > + > + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { > + // Make room for ChildObject->Data > + Object->Data = ReallocatePool ( > + Object->DataSize, > + Object->DataSize + > + ChildObject->DataSize, > + Object->Data > + ); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate NumElements\n", > __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + CopyMem ( > + &Object->Data[Object->DataSize], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + Object->DataSize += ChildObject->DataSize; > + } > + > + // Free Child Object since it has been consumed > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Package (NumElements) {PackageList} => Package > + > + Initializers must be created between AmlStart and AmlClose Phase > + > + DefPackage := PackageOp PkgLength NumElements > PackageElementList > + PackageOp := 0x12 > + DefVarPackage := VarPackageOp PkgLength VarNumElements > PackageElementList > + VarPackageOp := 0x13 > + NumElements := ByteData > + VarNumElements := TermArg => Integer > + PackageElementList := Nothing | <PackageElement PackageElementList> > + PackageElement := DataRefObject | NameString > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] NumElements - Number of elements in the package. If 0, size > + is calculated from the PackageList. > + @param[in,out] ListHead - Linked list has completed Package Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlPackage ( > + IN AML_FUNCTION_PHASE Phase, > + IN UINTN NumElements, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + UINT8 OpCode; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start the Package Object > + Status = InternalAppendNewAmlObject (&Object, "PACKAGE", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PACKAGE object\n", > __func__)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package PkgLength object\n", > __func__)); > + goto Done; > + } > + > + // Start Number of Elements Object > + Status = InternalAmlNumElements (AmlStart, &NumElements, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", > __func__)); > + goto Done; > + } > + > + // PackageList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // PackageList items should be closed already > + > + // Close Number of Elements Object > + Status = InternalAmlNumElements (AmlClose, &NumElements, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close NUM_ELEMENTS object\n", > __func__)); > + goto Done; > + } > + > + if (NumElements <= MAX_UINT8) { > + OpCode = AML_PACKAGE_OP; > + } else { > + OpCode = AML_VAR_PACKAGE_OP; > + } > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", > __func__)); > + goto Done; > + } > + > + // Complete Package object with all data > + Status = InternalAmlLocateObjectByIdentifier (&Object, "PACKAGE", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate PACKAGE object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + // Package must have at least PkgLength NumElements > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Package Data\n", __func__)); > + goto Done; > + } > + > + // PackageOp and VarPackageOp are both one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package allocate failed\n", > __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Object->Data[0] = OpCode; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + // Free Child Object since it has been consumed > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Store expression > + > + Syntax: > + Store (Source, Destination) => DataRefObject Destination = Source => > DataRefObject > + > + Store expression must be created between AmlStart and AmlClose Phase. > + > + DefStore := StoreOp TermArg SuperName > + StoreOp := 0x70 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlStore ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + // Start Store expression > + Status = InternalAppendNewAmlObject (&Object, "STORE", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append STORE object\n", > __func__)); > + goto Done; > + } > + > + // TermArg and SuperName are outside the scope of this object. They > must be > + // defined as part of a multi-tier call - in between AmlStore(AmlStart,..) > and > + // AmlStore(AmlClose,...) - when creating the Store expression. > + break; > + > + case AmlClose: > + // TermArg and SuperName must have been created and closed by now. > + Status = InternalAmlLocateObjectByIdentifier (&Object, "STORE", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating STORE Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for > Store()\n", __func__)); > + goto Done; > + } > + > + // Store Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + > + // Fill out Store object > + Object->Data[0] = AML_STORE_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Shift Left or Right expression > + > + Syntax: > + ShiftLeft (Source, ShiftCount, Reult) => Integer > + Result = Source << ShiftCount => Integer > + Result <<= ShiftCount => Integer > + > + ShiftRight (Source, ShiftCount, Reult) => Integer > + Result = Source >> ShiftCount => Integer > + Result >>= ShiftCount => Integer > + > + Shift expression must be created between AmlStart and AmlClose Phase. > + > + DefShiftLeft := ShiftOp Operand ShiftCount Target > + ShiftOp := 0x79 or 0x7A > + ShiftCount := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] ShiftOp - Specifies whether to shift left or shift > + right. > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlShift ( > + IN AML_FUNCTION_PHASE Phase, > + IN UINT8 ShiftOp, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start Store expression > + Status = InternalAppendNewAmlObject (&Object, "SHIFT", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append SHIFT object\n", > __func__)); > + goto Done; > + } > + > + // Operand, ShiftCount, and Target are outside the scope of this object. > They must be > + // defined as part of a multi-tier call - in between AmlShift(AmlStart,..) and > + // AmlShift(AmlClose,...) - when creating the Shift expression. > + > + break; > + > + case AmlClose: > + // Operand, ShiftCount, and Target must have been created and closed > by now. > + Status = InternalAmlLocateObjectByIdentifier (&Object, "SHIFT", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating SHIFT Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for > Store()\n", __func__)); > + goto Done; > + } > + > + // Store Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + > + // Fill out Store object > + Object->Data[0] = ShiftOp; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Shift Left expression > + > + Syntax: > + ShiftLeft (Source, ShiftCount, Result) => Integer > + Result = Source << ShiftCount => Integer > + Result <<= ShiftCount => Integer > + > + Shift expression must be created between AmlStart and AmlClose Phase. > + > + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target > + ShiftLeftOp := 0x79 > + ShiftCount := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlShiftLeft ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlShift (Phase, AML_SHIFT_LEFT_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a Shift Right expression > + > + Syntax: > + ShiftRight (Source, ShiftCount, Reult) => Integer > + Result = Source >> ShiftCount => Integer > + Result >>= ShiftCount => Integer > + > + Shift expression must be created between AmlStart and AmlClose Phase. > + > + DefShiftRight := ShiftRightOp Operand ShiftCount Target > + ShiftRightOp := 0x7A > + ShiftCount := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlShiftRight ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlShift (Phase, AML_SHIFT_RIGHT_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a Find First Set Bit AML object for > + both right and left searches. > + > + Syntax: > + FindSetLeftBit (Source, Result) => Integer > + > + FindSetRightBit (Source, Result) => Integer > + > + Bit Fields must be created between AmlStart and AmlClose Phase. > + > + DefFindSetLeftBit := FindSetLeftBitOp Operand Target > + FindSetLeftBitOp := 0x81 > + > + DefFindSetRightBit := FindSetRightBitOp Operand Target > + FindSetRightBitOp := 0x82 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] FindSetOp - Specifies whether to search left or search > + right. > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlFindSetBit ( > + IN AML_FUNCTION_PHASE Phase, > + IN UINT8 FindSetOp, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start Store expression > + Status = InternalAppendNewAmlObject (&Object, "FINDSET", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append FIND_SET > object\n", __func__)); > + goto Done; > + } > + > + // Source and Result are outside the scope of this object. They must be > + // defined as part of a multi-tier call - in between AmlFindSet(AmlStart,..) > and > + // AmlFindSet(AmlClose,...) - when creating the FindSetBit expression. > + > + break; > + > + case AmlClose: > + // Source and Result must have been created and closed by now. > + Status = InternalAmlLocateObjectByIdentifier (&Object, "FINDSET", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating FIND_SET Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for > Store()\n", __func__)); > + goto Done; > + } > + > + // Store Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + > + // Fill out Store object > + Object->Data[0] = FindSetOp; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a FindSetLeftBit AML Object > + > + Syntax: > + FindSetLeftBit (Source, Result) => Integer > + > + FindSetLeftBit expression must be created between > + AmlStart and AmlClose Phase. > + > + DefFindSetLeftBit := FindSetLeftBitOp Operand Target > + FindSetLeftBitOp := 0x81 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlFindSetLeftBit ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_LEFT_BIT_OP, > ListHead); > + return Status; > +} > + > +/** > + Creates a FindSetRightBit AML Object > + > + Syntax: > + FindSetRightBit (Source, Result) => Integer > + > + FindSetRightBit expression must be created between > + AmlStart and AmlClose Phase. > + > + DefFindSetRightBit := FindSetRightBit Operand Target > + FindSetRightBit := 0x82 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlFindSetRightBit ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_RIGHT_BIT_OP, > ListHead); > + return Status; > +} > + > +/** > + Creates a Decrement expression > + > + Syntax: > + Decrement (Minuend) => Integer > + Minuend-- => Integer > + > + Creates object to decrement Minuend. > + > + DefDecrement := DecrementOp SuperName > + DecrementOp := 0x76 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDecrement ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Phase) { > + case AmlStart: > + // Start decrement expression > + Status = InternalAppendNewAmlObject (&Object, "DECREMENT", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append DECREMENT > object\n", __func__)); > + goto Done; > + } > + > + // Minuend is outside the scope of this object. It must be > + // defined as part of a multi-tier call - in between > AmlDecrement(AmlStart,..) and > + // AmlDecrement(AmlClose,...) - when creating the Decrement > expression. > + > + break; > + > + case AmlClose: > + // Minuend must created and closed by now. > + Status = InternalAmlLocateObjectByIdentifier (&Object, "DECREMENT", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating DECREMENT Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for > Store()\n", __func__)); > + goto Done; > + } > + > + // Decrement Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + > + // Fill out Decrement object > + Object->Data[0] = AML_DECREMENT_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalO > bjects.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalO > bjects.c > new file mode 100644 > index 0000000000..21deb200e3 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalO > bjects.c > @@ -0,0 +1,158 @@ > +/** @file > + > + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLLOCALOBJECTS_FILECODE > + > +/** > + Fill the DataBuffer with correct Local Opcode based on provided argument > number > + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. > + AML supports max 7 Local variables, i.e., Local1, Local2 ... Local6. > + > + @param[in] LocalN - Local variable Number > + @param[out] ReturnData - Allocated DataBuffer with encoded integer > + @param[out] ReturnDataSize - Size of ReturnData > + > + @return EFI_SUCCESS - Successful completion > + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer > + @return EFI_INVALID_PARAMETER - Invalid LocalN provided. > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlLocalBuffer ( > + IN OUT UINT8 LocalN, > + OUT VOID **ReturnData, > + OUT UINTN *ReturnDataSize > + ) > +{ > + UINT8 *Data; > + UINTN DataSize; > + > + Data = AllocateZeroPool (sizeof (UINT8)); > + if (Data == NULL) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Failed to create Data Buffer.\n", > + __func__ > + )); > + return EFI_OUT_OF_RESOURCES; > + } > + > + DataSize = 1; > + switch (LocalN) { > + case 0: > + Data[0] = AML_LOCAL0; > + break; > + case 1: > + Data[0] = AML_LOCAL1; > + break; > + case 2: > + Data[0] = AML_LOCAL2; > + break; > + case 3: > + Data[0] = AML_LOCAL3; > + break; > + case 4: > + Data[0] = AML_LOCAL4; > + break; > + case 5: > + Data[0] = AML_LOCAL5; > + break; > + case 6: > + Data[0] = AML_LOCAL6; > + break; > + case 7: > + Data[0] = AML_LOCAL7; > + break; > + default: > + FreePool (Data); > + return EFI_INVALID_PARAMETER; > + } > + > + *ReturnData = (VOID *)Data; > + *ReturnDataSize = DataSize; > + > + return EFI_SUCCESS; > +} > + > +/** > + Creates an LocalN Opcode object > + > + Local Objects Encoding > + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | > Local5Op | Local6Op | Local7Op > + Local0Op := 0x60 > + Local1Op := 0x61 > + Local2Op := 0x62 > + Local3Op := 0x63 > + Local4Op := 0x64 > + Local5Op := 0x65 > + Local6Op := 0x66 > + Local7Op := 0x67 > + > + @param[in] LocalN - Argument Number to be encoded > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPLocalN ( > + IN UINT8 LocalN, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Start %a object\n", > + __func__, > + "LOCALN_OPCODE" > + )); > + goto Done; > + } > + > + Status = InternalAmlLocalBuffer ( > + LocalN, > + (VOID **)&(Object->Data), > + &(Object->DataSize) > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: ACPI Argument 0x%X object\n", > + __func__, > + LocalN > + )); > + goto Done; > + } > + > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameSt > ring.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameS > tring.c > new file mode 100644 > index 0000000000..0502547a01 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameS > tring.c > @@ -0,0 +1,576 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESTRING_FILECODE > + > +#define MAX_NAME_SEG_COUNT 255 > + > +/* > + Is character a RootChar > + > + @param[in] TestChar - Character to check > + > + @return TRUE - Character is a RootChar > + @return FALSE - Character is not a RootChar > + */ > +BOOLEAN > +InternalIsRootChar ( > + IN CHAR8 TestChar > + ) > +{ > + if (TestChar == AML_ROOT_CHAR) { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/* > + Is character a ParentPrefixChar > + > + @param[in] TestChar - Character to check > + > + @return TRUE - Character is a ParentPrefixChar > + @return FALSE - Character is not a ParentPrefixChar > + */ > +BOOLEAN > +InternalIsParentPrefixChar ( > + IN CHAR8 TestChar > + ) > +{ > + if (TestChar == AML_PARENT_PREFIX_CHAR) { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/* > + Is character a LeadNameChar = '_', 'A' - 'Z' > + > + @param[in] TestChar - Character to check > + > + @return TRUE - Character is a LeadNameChar > + @return FALSE - Character is not a LeadNameChar > + */ > +BOOLEAN > +InternalIsLeadNameChar ( > + IN CHAR8 TestChar > + ) > +{ > + if ( // Allowed LeadNameChars '_', 'A'-'Z' > + (TestChar == AML_NAME_CHAR__) || > + ((TestChar >= AML_NAME_CHAR_A) && > + (TestChar <= AML_NAME_CHAR_Z)) > + ) > + { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/* > + Is character a DigitChar = '0' - '9' > + > + @param[in] TestChar - Character to check > + > + @return TRUE - Character is a DigitChar > + @return FALSE - Character is not a DigitChar > + */ > +BOOLEAN > +InternalIsDigitChar ( > + IN CHAR8 TestChar > + ) > +{ > + if ( // Allowed DigitChars '0'-'9' > + (TestChar >= AML_DIGIT_CHAR_0) && > + (TestChar <= AML_DIGIT_CHAR_9) > + ) > + { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/* > + Is character a NameChar = LeadNameChar | DigitChar > + > + @param[in] TestChar - Character to check > + > + @return TRUE - Character is a NameChar > + @return FALSE - Character is not a NameChar > + */ > +BOOLEAN > +InternalIsNameChar ( > + IN CHAR8 TestChar > + ) > +{ > + if ( // Allowed LeadNameChar and DigitChars > + InternalIsDigitChar (TestChar) || > + InternalIsLeadNameChar (TestChar) > + ) > + { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/* > + Is character a NameSeg separator > + > + @param[in] TestChar - Character to check > + > + @return TRUE - Character is a NameChar > + @return FALSE - Character is not a NameChar > + */ > +BOOLEAN > +InternalIsNameSegSeparator ( > + IN CHAR8 TestChar > + ) > +{ > + if (TestChar == '.') { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/** > + Creates a NameSeg AML object and inserts it into the List > + > + NameSeg := <leadnamechar namechar namechar namechar> > + > + NameSegs shorter than 4 characters are filled with trailing underscores > + > + @param[in] Name - NameSeg > + @param[in,out] ListHead - Linked list has NameSeg after call > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlNameSeg ( > + IN CHAR8 *Name, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + AML_OBJECT_INSTANCE *Object; > + UINT8 *NameSeg; > + UINTN NameLen; > + EFI_STATUS Status; > + > + if (Name == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + NameLen = AsciiStrLen (Name); > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + NameSeg = NULL; > + // parameter validation > + if ((NameLen == 0) || (NameLen > 4)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (!InternalIsLeadNameChar (Name[0])) { > + return EFI_INVALID_PARAMETER; > + } > + > + for (UINT8 i = 1; NameLen > 1 && i < NameLen; i++) { > + if (!InternalIsNameChar (Name[i])) { > + return EFI_INVALID_PARAMETER; > + } > + } > + > + NameSeg = AllocateZeroPool (4); > + if (NameSeg == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + CopyMem (NameSeg, Name, NameLen); > + > + if (NameLen < 4) { > + SetMem (&NameSeg[NameLen], 4 - NameLen, '_'); > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (Object != NULL) { > + if (!EFI_ERROR (Status)) { > + Object->Data = NameSeg; > + Object->DataSize = 4; > + Object->Completed = TRUE; > + } else { > + InternalFreeAmlObject (&Object, ListHead); > + FreePool (NameSeg); > + } > + } > + > + return Status; > +} > + > +/** > + Creates a Namestring AML Object and inserts it into the linked list > + > + LeadNameChar := 'A'-'Z' | '_' > + DigitChar := '0'-'9' > + NameChar := DigitChar | LeadNameChar > + RootChar := '\' > + ParentPrefixChar := '^' > + > + 'A'-'Z' := 0x41 - 0x5A > + '_' := 0x5F > + '0'-'9' := 0x30 - 0x39 > + '\' := 0x5C > + '^' := 0x5E > + > + NameSeg := <LeadNameChar NameChar NameChar NameChar> > + // Notice that NameSegs shorter than 4 characters are filled with > + // trailing underscores ('_'s). > + NameString := <RootChar NamePath> | <PrefixPath NamePath> > + PrefixPath := Nothing | <'^' PrefixPath> > + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName > + > + DualNamePath := DualNamePrefix NameSeg NameSeg > + DualNamePrefix := 0x2E > + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) > + MultiNamePrefix := 0x2F > + > + SegCount := ByteData > + > + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is > + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total > encoding > + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg > + NameSeg has a smaller encoding than the encoding of: > MultiNamePrefix(2) > + NameSeg NameSeg > + > + SimpleName := NameString | ArgObj | LocalObj > + SuperName := SimpleName | DebugObj | Type6Opcode > + NullName := 0x00 > + Target := SuperName | NullName > + > + @param[in] String - Null Terminated NameString Representation > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > + **/ > +EFI_STATUS > +EFIAPI > +AmlOPNameString ( > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + CHAR8 *NameString; > + CHAR8 *NameStringPrefix; > + UINTN NameStringBufferSize; > + UINTN NameStringSize; > + UINTN NameStringPrefixSize; > + UINTN NameSegCount; > + UINTN StringIndex; > + UINTN StringLength; > + UINTN NameSegIndex; > + BOOLEAN FoundRootChar; > + BOOLEAN FoundParentPrefixChar; > + BOOLEAN FoundParenthesisOpenChar; > + BOOLEAN FoundParenthesisCloseChar; > + > + if ((String == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + NameString = NULL; > + FoundRootChar = FALSE; > + FoundParentPrefixChar = FALSE; > + NameStringBufferSize = 0; > + FoundParenthesisOpenChar = FALSE; > + FoundParenthesisCloseChar = FALSE; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString %a object\n", > __func__, String)); > + goto Done; > + } > + > + // Create a buffer to fit NameSeg [4] * max NameSegCount [255] > + NameStringBufferSize = 4 * MAX_NAME_SEG_COUNT; > + NameString = AllocateZeroPool (NameStringBufferSize); > + // Create arbitrarily large RootChar\ParentPrefixChar buffer > + NameStringPrefix = AllocateZeroPool (NameStringBufferSize); > + > + // Calculate length of required space > + StringLength = AsciiStrLen (String); > + NameStringSize = 0; > + NameStringPrefixSize = 0; > + NameSegIndex = 0; > + NameSegCount = 0; > + for (StringIndex = 0; StringIndex < StringLength; StringIndex++) { > + if (NameStringPrefixSize >= NameStringBufferSize) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Exceeded ParentPrefixChar support at offset=%d of > String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } > + > + if (InternalIsRootChar (String[StringIndex])) { > + if (NameSegCount != 0) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: RootChar at offset=%d of > String=%a\n", __func__, StringIndex, String)); > + goto Done; > + } > + > + if (FoundRootChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains more > than 1 RootChar.\n", __func__, String)); > + goto Done; > + } > + > + if (FoundParentPrefixChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar > and ParentPrefixChar.\n", __func__, String)); > + goto Done; > + } > + > + // RootChar; increment NameStringSize > + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; > + NameStringPrefixSize++; > + FoundRootChar = TRUE; > + } else if (InternalIsParentPrefixChar (String[StringIndex])) { > + if (NameSegCount != 0) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ParentPrefixChar at offset=%d of > String=%a\n", __func__, StringIndex, String)); > + goto Done; > + } > + > + if (FoundRootChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar > and ParentPrefixChar.\n", __func__, String)); > + goto Done; > + } > + > + // ParentPrefixChar; increment NameStringSize > + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; > + NameStringPrefixSize++; > + FoundParentPrefixChar = TRUE; > + } else if (!InternalIsNameChar (String[StringIndex])) { > + if (InternalIsNameSegSeparator (String[StringIndex])) { > + if (NameSegIndex == 0) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Invalid NameSeg separator at offset=%d of String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } else { > + NameSegIndex = 0; > + } > + } else if (String[StringIndex] == '(') { > + if (FoundParenthesisOpenChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } > + > + FoundParenthesisOpenChar = TRUE; > + } else if (String[StringIndex] == ')') { > + if (FoundParenthesisCloseChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } else if (!FoundParenthesisOpenChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: No Open Parenthesis before offset=%d of String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } > + > + FoundParenthesisCloseChar = TRUE; > + } else { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Unsupported character at offset=%d of String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } > + } else { > + // Must be NameChar > + if (FoundParenthesisOpenChar || FoundParenthesisCloseChar) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: NameChar after Parenthesis at offset=%d of String=%a\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } else if ((NameSegIndex == 0) && InternalIsDigitChar (String[StringIndex])) > { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: must be LeadNameChar at offset=%d of String=%a'\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } > + > + if (NameSegIndex >= 4) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: NameSeg > 4 characters at offset=%d of String=%a'\n", > + __func__, > + StringIndex, > + String > + )); > + goto Done; > + } else { > + if (NameSegIndex == 0) { > + NameSegCount++; > + if (NameSegCount > MAX_NAME_SEG_COUNT) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: Max NameSegCount=%d reached at offset=%d of > String=%a'\n", > + __func__, > + MAX_NAME_SEG_COUNT, > + StringIndex, > + String > + )); > + goto Done; > + } > + } > + > + NameString[NameStringSize] = String[StringIndex]; > + NameStringSize++; > + NameSegIndex++; > + if ((StringIndex + 1 >= StringLength) || > + !InternalIsNameChar (String[StringIndex + 1])) > + { > + // Extend in progress NameSeg with '_'s > + if (NameSegIndex < 4) { > + SetMem (&NameString[NameStringSize], 4 - NameSegIndex, '_'); > + NameStringSize += 4 - NameSegIndex; > + } > + } > + } > + } > + } > + > + // Create AML Record with NameString contents from above > + // Copy in RootChar or ParentPrefixChar(s) > + if (NameStringPrefixSize != 0) { > + Object->Data = ReallocatePool ( > + Object->DataSize, > + NameStringPrefixSize, > + Object->Data > + ); > + CopyMem ( > + &Object->Data[Object->DataSize], > + NameStringPrefix, > + NameStringPrefixSize > + ); > + Object->DataSize += NameStringPrefixSize; > + FreePool (NameStringPrefix); > + } > + > + // Set up for Dual/MultiName Prefix > + if (NameSegCount > MAX_NAME_SEG_COUNT) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Exceeded MaxNameSegCount in > NameString=%a\n", __func__, String)); > + goto Done; > + } else if (NameSegCount == 0) { > + Status = EFI_INVALID_PARAMETER; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Must be at least one NameSeg in > NameString=%a\n", __func__, String)); > + goto Done; > + } else if (NameSegCount == 1) { > + // Single NameSeg > + Object->Data = ReallocatePool ( > + Object->DataSize, > + Object->DataSize + NameStringSize, > + Object->Data > + ); > + } else if (NameSegCount == 2) { > + Object->Data = ReallocatePool ( > + Object->DataSize, > + Object->DataSize + NameStringSize + 1, > + Object->Data > + ); > + Object->Data[Object->DataSize] = AML_DUAL_NAME_PREFIX; > + Object->DataSize += 1; > + } else { > + Object->Data = ReallocatePool ( > + Object->DataSize, > + Object->DataSize + NameStringSize + 2, > + Object->Data > + ); > + Object->Data[Object->DataSize] = AML_MULTI_NAME_PREFIX; > + Object->Data[Object->DataSize + 1] = NameSegCount & 0xFF; > + Object->DataSize += 2; > + } > + > + // Copy NameString data over. From above must be at least one NameSeg > + CopyMem (&Object->Data[Object->DataSize], NameString, NameStringSize); > + Object->DataSize += NameStringSize; > + FreePool (NameString); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + if (NameString != NULL) { > + FreePool (NameString); > + } > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamed > Object.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamed > Object.c > new file mode 100644 > index 0000000000..37ae9319be > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamed > Object.c > @@ -0,0 +1,2138 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLNAMEDOBJECT_FILECODE > + > +#define METHOD_ARGS_MAX 7 > +#define MAX_SYNC_LEVEL 0x0F > +#define GENERIC_FIELD_IDENTIFIER "FIELD" > + > +/** > + Creates a Device (ObjectName, Object) > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefName := DeviceOp PkgLength NameString TermList > + NameOp := ExtOpPrefix 0x82 > + ExtOpPrefix := 0x5B > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] String - Object name > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDevice ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Device for %a object\n", > __func__, String)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", > __func__, String)); > + goto Done; > + } > + > + // Insert required NameString > + Status = AmlOPNameString (String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a > object\n", __func__, String)); > + goto Done; > + } > + > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // TermList should be closed already > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", > __func__, String)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > String)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, String)); > + goto Done; > + } > + > + // Device Op is two bytes > + Object->DataSize = ChildObject->DataSize + 2; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, String)); > + goto Done; > + } > + > + Object->Data[0] = AML_EXT_OP; > + Object->Data[1] = AML_EXT_DEVICE_OP; > + CopyMem ( > + &Object->Data[2], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates an AccessField > + > + AccessField := 0x01 AccessType AccessAttrib > + > + @param[in] AccessType - Access type for field member > + @param[in] AccessAttribute - Access attribute for field member > + @param[in,out] ListHead - Linked list containing AML objects > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlAccessField ( > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + // Start new AML object > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start ACCESSFIELD object\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (3); > + // AML_ACCESSFIELD_OP + AccessType + AccessAttrib > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for > ACCESSFIELD\n", __func__)); > + goto Done; > + } > + > + Object->Data[0] = AML_FIELD_ACCESS_OP; > + Object->Data[1] = (UINT8)AccessType; > + Object->Data[2] = (UINT8)AccessAttribute; > + Object->DataSize = 3; > + > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates an ExtendedAccessField > + > + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib > AccessLength > + > + @param[in] AccessType - Access type for field member > + @param[in] AccessAttribute - Access attribute for field member > + @param[in] AccessLength - Specifies the access length for the field > member > + @param[in,out] ListHead - Linked list containing AML objects > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlExtendedAccessField ( > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, > + IN UINT8 AccessLength, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + > + // Start new AML object > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start EXTENDEDACCESSFIELD > object\n", __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (4); > + // AML_EXTACCESSFIELD_OP + AccessType + AccessAttrib + AccessLength > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for > EXTENDEDACCESSFIELD\n", __func__)); > + goto Done; > + } > + > + Object->Data[0] = AML_FIELD_EXT_ACCESS_OP; > + Object->Data[1] = (UINT8)AccessType; > + Object->Data[2] = (UINT8)AccessAttribute; > + Object->Data[3] = AccessLength; > + Object->DataSize = 4; > + > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates an AccessAs Field Unit > + > + AccessAs (AccessType, AccessAttribute) > + AccessAs (AccessType, AccessAttribute (AccessLength)) > + > + AccessField := 0x01 AccessType AccessAttrib > + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. > + // Bits 4:5 - Reserved > + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes > + // 1 = AccessAttrib = AttribBytes (x) > + // 2 = AccessAttrib = AttribRawBytes (x) > + // 3 = AccessAttrib = AttribRawProcessBytes (x) > + > + // x' is encoded as bits 0:7 of the AccessAttrib byte. > + The description of bits 7:6 is incorrect and if AttribBytes, > + AttribRawBytes, or AttribRawProcessBytes are used here, an > + ExtendedAccessField is used with the following definitions > + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib > AccessLength > + ExtendedAccessAttrib := ByteData // 0x0B AttribBytes > + // 0x0E AttribRawBytes > + // 0x0F AttribRawProcess > + > + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or > + // GPIO OpRegions, AccessAttrib can be one of > + // the following values: > + // 0x02 AttribQuick > + // 0x04 AttribSendReceive > + // 0x06 AttribByte > + // 0x08 AttribWord > + // 0x0A AttribBlock > + // 0x0C AttribProcessCall > + // 0x0D AttribBlockProcessCall > + > + @param[in] AccessType - Access type for field member > + @param[in] AccessAttribute - Access attribute for field member > + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, > + AttribRawBytes, or AttribRawProcessBytes. > + Specifies the access length for the field member > + Otherwise, ignored. > + @param[in,out] ListHead - Linked list containing AML objects > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPAccessAs ( > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, > + IN UINT8 AccessLength, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + // AcessType parameter check > + if (AccessType > BufferAcc) { > + return EFI_INVALID_PARAMETER; > + } > + > + // AccessAttrib parameter checking > + if ((AccessAttribute >= AttribNormal) && (AccessAttribute <= AttribBlock)) { > + if ((AccessAttribute & 1) == 1) { > + return EFI_INVALID_PARAMETER; > + } > + } else if (AccessAttribute > AttribRawProcessBytes) { > + return EFI_INVALID_PARAMETER; > + } > + > + // if AccessAttrib requires a length parameter, then an > ExtendedAccessField is used > + switch (AccessAttribute) { > + case AttribBytes: > + case AttribRawBytes: > + case AttribRawProcessBytes: > + Status = InternalAmlExtendedAccessField (AccessType, AccessAttribute, > AccessLength, ListHead); > + break; > + default: > + Status = InternalAmlAccessField (AccessType, AccessAttribute, ListHead); > + break; > + } > + > + return Status; > +} > + > +/** > + Creates an External Object > + > + External (ObjectName, ObjectType, ReturnType, ParameterTypes) > + > + Note: ReturnType is not used for AML encoding and is therefore not passed > in > + to this function. > + ParameterTypes is only used if the ObjectType is a MethodObj. It > + specifies MethodObj's argument types in a list. For the purposes of > + this library, we are passing in the the number of input parameters for > + that MethodObj. > + > + DefExternal := ExternalOp NameString ObjectType ArgumentCount > + ExternalOp := 0x15 > + ObjectType := ByteData > + ArgumentCount := ByteData (0 - 7) > + > + @param[in] Name - Object name > + @param[in] ObjectType - Type of object declared > + @param[in] NumArgs - Only used if ObjectType is MethodObj. > + Specifies the number of input parameters for > + that MethodObj. > + Otherwise, ignored. > + @param[in,out] ListHead - Linked list that has completed External Object > + after AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPExternal ( > + IN CHAR8 *Name, > + IN UINT8 ObjectType, > + IN UINT8 NumArgs, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Name == NULL) || > + (NumArgs > METHOD_ARGS_MAX) || > + (ObjectType >= InvalidObj) || > + (ListHead == NULL)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + // Start EXTERNAL object > + Status = InternalAppendNewAmlObject (&Object, "EXTERNAL", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > Name)); > + goto Done; > + } > + > + // Insert required NameString > + Status = AmlOPNameString (Name, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a NameString object\n", > __func__, Name)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, "EXTERNAL", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > Name)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, > Name)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (ChildObject->DataSize + 3); > + // AML_EXTERNAL_OP + Name + ObjectType + ArgumentCount > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, Name)); > + goto Done; > + } > + > + Object->DataSize = 0; > + Object->Data[0] = AML_EXTERNAL_OP; > + Object->DataSize++; > + CopyMem ( > + &Object->Data[Object->DataSize], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + Object->DataSize += ChildObject->DataSize; > + Object->Data[Object->DataSize] = ObjectType; > + Object->DataSize++; > + Object->Data[Object->DataSize] = NumArgs; > + Object->DataSize++; > + > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Locates the AML object that holds the cumulative offset term. > + This is the node directly after the node designated by > + GENERIC_FIELD_IDENTIFIER in Object->Data. > + > + @param[out] ReturnObject - Object that contains the offset term > + @param[in,out] ListHead - Linked list that contains the > GENERIC_FIELD_IDENTIFIER > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlLocateOffsetTerm ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + LIST_ENTRY *Node; > + AML_OBJECT_INSTANCE *Object; > + UINTN IdentifierSize; > + CHAR8 *Identifier; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Object = NULL; > + *ReturnObject = NULL; > + Identifier = GENERIC_FIELD_IDENTIFIER; > + IdentifierSize = AsciiStrLen (Identifier) + 1; > + // Look Backwards and find Node for this Object > + Node = ListHead; > + do { > + Node = GetPreviousNode (ListHead, Node); > + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + if ((Object->DataSize != 0) && > + (Object->DataSize == IdentifierSize) && > + (CompareMem ( > + Object->Data, > + Identifier, > + MAX (Object->DataSize, IdentifierSize) > + ) == 0)) > + { > + break; > + } > + } while (Node != ListHead); > + > + // Check to make sure FIELD is found, otherwise error > + if ((Object->DataSize == 0) || > + (Object->DataSize != IdentifierSize) || > + CompareMem ( > + Object->Data, > + Identifier, > + (MAX (Object->DataSize, IdentifierSize) != 0) > + )) > + { > + return EFI_DEVICE_ERROR; > + } > + > + // Have found FIELD > + Node = GetNextNode (ListHead, Node); > + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + *ReturnObject = Object; > + return EFI_SUCCESS; > +} > + > +/** > + Offset (ByteOffset) > + > + Creates a ReservedField if the passed ByteOffset is larger than > + the previous bit length value optionally specified by an AmlOPFieldListItem, > + or another Offset call. All offsets are defined starting from zero, based at > + the starting address of the parent Operation Region. > + > + ReservedField := 0x00 PkgLength > + > + @param[in] ByteLength -Byte offset of the next defined field within > + the parent Operation Region > + @param[in,out] ListHead - Linked list has completed Offset object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPOffset ( > + IN UINT32 ByteOffset, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *OffsetObject; > + UINT8 *PkgLength; > + UINTN DataLength; > + EFI_STATUS Status; > + UINT64 InternalOffsetData; > + UINT64 BitCount; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + InternalOffsetData = 0; > + BitCount = LShiftU64 (ByteOffset, 3); > + Object = NULL; > + OffsetObject = NULL; > + PkgLength = NULL; > + > + // Find and read internal offset data > + Status = InternalAmlLocateOffsetTerm (&OffsetObject, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term\n", > __func__)); > + goto Done; > + } > + > + InternalOffsetData = *(UINT64 *)OffsetObject->Data; > + > + if (InternalOffsetData > BitCount) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid backwards offset\n", > __func__)); > + Status = EFI_INVALID_PARAMETER; > + goto Done; > + } else if (InternalOffsetData == BitCount) { > + // Do not need to append any reserved fields > + Status = EFI_SUCCESS; > + goto Done; > + } > + > + // update internal offset value to new offset > + *(UINT64 *)OffsetObject->Data = BitCount; > + > + // take difference to find how many bits to reserve > + BitCount = BitCount - InternalOffsetData; > + > + // Create new object for the offset data, add pkglength encoding > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: appending new AML object\n", > __func__)); > + goto Done; > + } > + > + Status = InternalAmlBitPkgLength ((UINT32)BitCount, &PkgLength, > &DataLength); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: internal AML PkgLength\n", > __func__)); > + goto Done; > + } > + > + Object->DataSize = DataLength + 1; // add one for Reserved Field Indicator > + Object->Data = AllocateZeroPool (Object->DataSize); > + > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Offset\n", > __func__)); > + goto Done; > + } > + > + Object->Data[0] = 0; > + CopyMem (&Object->Data[1], PkgLength, DataLength); // read internal > offset data > + Object->Completed = TRUE; > + FreePool (PkgLength); > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&OffsetObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a NamedField or a ReservedField, depending on the > + parameters. > + > + To create a NamedField item pass in the NameSeg and Bitlength > + as in ASL. To create a ReservedField pass "" as the Name. > + Must be used inside a Field or IndexField TermList. > + > + NamedField := NameSeg PkgLength > + ReservedField := 0x00 PkgLength > + > + @param[in] Name - Field NameSeg > + @param[in] BitLength - Length of field item in bits > + @param[in,out] ListHead - Linked list has completed FieldUnitItem > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPFieldUnit ( > + IN CHAR8 *Name, > + IN UINT32 BitLength, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *OffsetObject; > + EFI_STATUS Status; > + > + if ((ListHead == NULL) || (Name == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + OffsetObject = NULL; > + > + if (AsciiStrLen (Name) == 0) { > + if (BitLength > 0) { > + // Prepend a 0 to the list > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", > __func__)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (1); > + Object->DataSize = 1; > + Object->Completed = TRUE; > + } else { > + Status = EFI_SUCCESS; > + goto Done; > + } > + } else { > + // add NameSeg to List > + Status = InternalAmlNameSeg (Name, ListHead); > + } > + > + if (EFI_ERROR (Status)) { > + goto Done; > + } > + > + // Locate and update internal Offset term > + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating offset term for %a > object\n", __func__, Name)); > + goto Done; > + } > + > + *(UINT64 *)Object->Data += BitLength; // write > + > + // Add BitLength as a PkgLength term > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a > object\n", __func__, Name)); > + goto Done; > + } > + > + Status = InternalAmlBitPkgLength (BitLength, &Object->Data, &Object- > >DataSize); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a > object\n", __func__, Name)); > + goto Done; > + } > + > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&OffsetObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Field > + > + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} > + > + FieldUnitList must be added between AmlStart and AmlClose phase > + > + DefField := FieldOp PkgLength NameString FieldFlags FieldList > + FieldOp := ExtOpPrefix 0x81 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] Name - Field NameString > + @param[in] AccessType - Access Type for field > + @param[in] LockRule - Lock rule for field > + @param[in] UpdateRule - Update rule for field > + @param[in,out] ListHead - Linked list has completed Field Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlField ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *Name, > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, > + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINT8 FieldFlags; > + UINTN ChildCount; > + > + if ((ListHead == NULL) || (Name == NULL) || (AsciiStrLen (Name) == 0)) { > + return EFI_INVALID_PARAMETER; > + } > + > + // parameter validation > + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || > (UpdateRule > WriteAsZeros)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, > GENERIC_FIELD_IDENTIFIER, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Insert internal offset counter > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", > __func__)); > + goto Done; > + } > + > + Object->DataSize = sizeof (UINT64); > + Object->Data = AllocateZeroPool (Object->DataSize); > + Object->Completed = TRUE; > + if (EFI_ERROR (Status) || (Object->Data == NULL)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field internal offset %a > object\n", __func__, Name)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Insert required NameString > + Status = AmlOPNameString (Name, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Add Field Flags > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a > object\n", __func__, Name)); > + goto Done; > + } > + > + // Field Flags is one byte > + Object->DataSize = 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, Name)); > + goto Done; > + } > + > + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); > + > + Object->Data[0] = FieldFlags; > + Object->Completed = TRUE; > + > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + > + // Required NameString completed in one phase call > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Remove internal offset counter > + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", > __func__, Name)); > + goto Done; > + } > + > + Status = InternalFreeAmlObject (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", > __func__, Name)); > + goto Done; > + } > + > + // remove original field identifier data > + Status = InternalAmlLocateObjectByIdentifier (&Object, > GENERIC_FIELD_IDENTIFIER, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > Name)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, Name)); > + goto Done; > + } > + > + // Field Op is two bytes > + Object->DataSize = ChildObject->DataSize + 2; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, Name)); > + goto Done; > + } > + > + Object->Data[0] = AML_EXT_OP; > + Object->Data[1] = AML_EXT_FIELD_OP; > + CopyMem ( > + &Object->Data[2], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a BankField > + > + BankField (RegionName, BankName, BankValue, AccessType, LockRule, > UpdateRule) {FieldUnitList} > + FieldUnitList must be added between AmlStart and AmlClose phase > + > + DefBankField := BankFieldOp PkgLength NameString NameString BankValue > FieldFlags FieldList > + BankFieldOp := ExtOpPrefix 0x87 > + BankValue := TermArg => Integer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] RegionName - Name of host Operation Region > + @param[in] BankName - Name of bank selection register > + @param[in] BankValue - Bank Selection ID > + @param[in] AccessType - Access Type as in Field > + @param[in] LockRule - Lock rule as in Field > + @param[in] UpdateRule - Update rule as in Field > + @param[in,out] ListHead - Linked list has completed BankField Object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlBankField ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *RegionName, > + IN CHAR8 *BankName, > + IN UINT64 BankValue, > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, > + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINT8 FieldFlags; > + UINTN ChildCount; > + > + if ((ListHead == NULL) || (RegionName == NULL) || (AsciiStrLen > (RegionName) == 0) || > + (BankName == NULL) || (AsciiStrLen (BankName) == 0)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + // parameter validation > + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || > (UpdateRule > WriteAsZeros)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, > GENERIC_FIELD_IDENTIFIER, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField for %a object\n", > __func__, BankName)); > + goto Done; > + } > + > + // Insert internal offset counter > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + Object->DataSize = sizeof (UINT64); > + Object->Data = AllocateZeroPool (Object->DataSize); > + Object->Completed = TRUE; > + if (EFI_ERROR (Status) || (Object->Data == NULL)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField internal offset %a > object\n", __func__, BankName)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", > __func__, BankName)); > + goto Done; > + } > + > + // Insert required Region NameString > + Status = AmlOPNameString (RegionName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, RegionName)); > + goto Done; > + } > + > + // Insert required Bank NameString > + Status = AmlOPNameString (BankName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, BankName)); > + goto Done; > + } > + > + // Insert required BankValue integer > + Status = AmlOPDataInteger (BankValue, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Adding BankValue Integer for %a > object\n", __func__, BankName)); > + goto Done; > + } > + > + // Add Field Flags > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a > object\n", __func__, BankName)); > + goto Done; > + } > + > + // Field Flags is one byte > + Object->DataSize = 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, BankName)); > + goto Done; > + } > + > + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); > + > + Object->Data[0] = FieldFlags; > + Object->Completed = TRUE; > + > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + > + // Required NameStrings completed in one phase call > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", > __func__, BankName)); > + goto Done; > + } > + > + // Remove internal offset counter > + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", > __func__, BankName)); > + goto Done; > + } > + > + Status = InternalFreeAmlObject (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", > __func__, BankName)); > + goto Done; > + } > + > + // remove original field identifier data > + Status = InternalAmlLocateObjectByIdentifier (&Object, > GENERIC_FIELD_IDENTIFIER, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > BankName)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, BankName)); > + goto Done; > + } > + > + // Field Op is two bytes > + Object->DataSize = ChildObject->DataSize + 2; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, BankName)); > + goto Done; > + } > + > + Object->Data[0] = AML_EXT_OP; > + Object->Data[1] = AML_EXT_BANK_FIELD_OP; > + CopyMem ( > + &Object->Data[2], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates an IndexField > + > + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) > {FieldUnitList} > + > + FieldUnitList must be added between AmlStart and AmlClose phase > + > + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags > FieldList > + IndexFieldOp := ExtOpPrefix 0x86 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] IndexName - Name of Index FieldUnit > + @param[in] DataName - Name of Data FieldUnit > + @param[in] AccessType - Access Type for the FieldUnit > + @param[in] LockRule - Lock rule for the FieldUnit > + @param[in] UpdateRule - Update rule for the FieldUnit > + @param[in,out] ListHead - Linked list has completed IndexField Object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlIndexField ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *IndexName, > + IN CHAR8 *DataName, > + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, > + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, > + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINT8 FieldFlags; > + UINTN ChildCount; > + > + if ((ListHead == NULL) || (IndexName == NULL) || (AsciiStrLen (IndexName) > == 0) || > + (DataName == NULL) || (AsciiStrLen (DataName) == 0)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + // parameter validation > + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || > (UpdateRule > WriteAsZeros)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, > GENERIC_FIELD_IDENTIFIER, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField for %a object\n", > __func__, IndexName)); > + goto Done; > + } > + > + // Insert internal offset counter > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + Object->DataSize = sizeof (UINT64); > + Object->Data = AllocateZeroPool (Object->DataSize); > + Object->Completed = TRUE; > + if (EFI_ERROR (Status) || (Object->Data == NULL)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField internal offset %a > object\n", __func__, IndexName)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", > __func__, IndexName)); > + goto Done; > + } > + > + // Insert required Index NameString > + Status = AmlOPNameString (IndexName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, IndexName)); > + goto Done; > + } > + > + // Insert required Data NameString > + Status = AmlOPNameString (DataName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, DataName)); > + goto Done; > + } > + > + // Add Field Flags > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a > object\n", __func__, IndexName)); > + goto Done; > + } > + > + // Field Flags is one byte > + Object->DataSize = 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, IndexName)); > + goto Done; > + } > + > + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); > + > + Object->Data[0] = FieldFlags; > + Object->Completed = TRUE; > + > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + > + // Required NameString completed in one phase call > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", > __func__, IndexName)); > + goto Done; > + } > + > + // Remove internal offset counter > + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", > __func__, IndexName)); > + goto Done; > + } > + > + Status = InternalFreeAmlObject (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", > __func__, IndexName)); > + goto Done; > + } > + > + // remove original field identifier data > + Status = InternalAmlLocateObjectByIdentifier (&Object, > GENERIC_FIELD_IDENTIFIER, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > IndexName)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, IndexName)); > + goto Done; > + } > + > + // Field Op is two bytes > + Object->DataSize = ChildObject->DataSize + 2; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, IndexName)); > + goto Done; > + } > + > + Object->Data[0] = AML_EXT_OP; > + Object->Data[1] = AML_EXT_INDEX_FIELD_OP; > + CopyMem ( > + &Object->Data[2], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + OperationRegion (RegionName, RegionSpace, Offset, Length) > + > + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset > RegionLen > + OpRegionOp := ExtOpPrefix 0x80 > + RegionSpace := > + ByteData // 0x00 SystemMemory > + // 0x01 SystemIO > + // 0x02 PCI_Config > + // 0x03 EmbeddedControl > + // 0x04 SMBus > + // 0x05 System CMOS > + // 0x06 PciBarTarget > + // 0x07 IPMI > + // 0x08 GeneralPurposeIO > + // 0x09 GenericSerialBus > + // 0x0A PCC > + // 0x80-0xFF: OEM Defined > + RegionOffset := TermArg => Integer > + RegionLen := TermArg => Integer > + > + @param[in] RegionName - Name for the Operation Region > + @param[in] RegionSpace - Region Space type > + @param[in] Offset - Offset within the selected RegionSpace at which > the > + region starts (byte-granular) > + @param[in] Length - Length of the region in bytes. > + @param[in,out] ListHead - Linked list head > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPOperationRegion ( > + IN CHAR8 *RegionName, > + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, > + IN UINT64 Offset, > + IN UINT64 Length, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + EFI_STATUS Status; > + > + // Input parameter validation > + if ((RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || (ListHead > == NULL) || > + ((RegionSpace > PCC) && (RegionSpace < 0x80)) || (RegionSpace > 0xFF)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + Object = NULL; > + ChildObject = NULL; > + Status = EFI_DEVICE_ERROR; > + > + Status = InternalAppendNewAmlObject (&Object, "OPREGION", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start OpRegion for %a object\n", > __func__, RegionName)); > + goto Done; > + } > + > + Status = AmlOPNameString (RegionName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Name String for %a object\n", > __func__, RegionName)); > + goto Done; > + } > + > + Status = AmlOPByteData ((UINT8)RegionSpace, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Region space byte data for %a > object\n", __func__, RegionName)); > + goto Done; > + } > + > + Status = AmlOPDataInteger (Offset, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Offset data integer for %a object\n", > __func__, RegionName)); > + goto Done; > + } > + > + Status = AmlOPDataInteger (Length, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Length data integer for %a object\n", > __func__, RegionName)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, "OPREGION", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > RegionName)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, RegionName)); > + goto Done; > + } > + > + // OpRegion Opcode is two bytes > + Object->DataSize = ChildObject->DataSize + 2; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, RegionName)); > + goto Done; > + } > + > + Object->Data[0] = AML_EXT_OP; > + Object->Data[1] = AML_EXT_REGION_OP; > + CopyMem ( > + &Object->Data[2], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a CreateField AML Object and inserts it into the linked list > + > + Syntax: > + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) > + > + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString > + CreateFieldOp := ExtOpPrefix 0x13 > + ExtOpPrefix := 0x5B > + SourceBuff := TermArg => Buffer > + BitIndex := TermArg => Integer > + NumBits := TermArg -> Integer > + > + @param[in] SourceBuffer, - Buffer to house the new buffer field object > + @param[in] BitIndex, - Starting bit index place the new buffer > + @param[in] NumBits, - Number of bits to reserve > + @param[in] FieldName, - The new buffer field object to be created in > SourceBuffer > + @param[in,out] ListHead - Linked list has completed CreateField object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 BitIndex, > + IN UINT64 NumBits, > + IN CHAR8 *FieldName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + ChildObject = NULL; > + Object = NULL; > + > + if ((SourceBuffer == NULL) || (FieldName == NULL) || (ListHead == NULL) || > + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FieldName) == 0)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + ChildObject = NULL; > + Status = InternalAppendNewAmlObject (&Object, "CreateField", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", > __func__, FieldName)); > + goto Done; > + } > + > + Status = AmlOPNameString (SourceBuffer, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", > __func__, FieldName)); > + goto Done; > + } > + > + Status = AmlOPDataInteger (BitIndex, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: BitIndex for %a object\n", __func__, > FieldName)); > + goto Done; > + } > + > + Status = AmlOPDataInteger (NumBits, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumBits for %a object\n", __func__, > FieldName)); > + goto Done; > + } > + > + Status = AmlOPNameString (FieldName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", > __func__, FieldName)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateField", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > FieldName)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, FieldName)); > + goto Done; > + } > + > + // CreateFieldOp is two bytes > + Object->DataSize = ChildObject->DataSize + 2; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, FieldName)); > + goto Done; > + } > + > + Object->Data[0] = AML_EXT_OP; > + Object->Data[1] = AML_EXT_CREATE_FIELD_OP; > + CopyMem ( > + &Object->Data[2], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Internal function used to create a > CreateBit|Byte|Word|DWord|QWordField objects > + and insert them into the linked list > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer fixed field > object > + @param[in] Index, - Starting index to place the new buffer > + @param[in] FixedFieldName, - Name of the FixedField > + @param[in] OpCode, - AML opcode for the Create_Field encoding > + @param[in,out] ListHead - Linked list has completed CreateFixedField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlCreateFixedField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 Index, > + IN CHAR8 *FixedFieldName, > + IN UINT8 OpCode, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + ChildObject = NULL; > + > + if ((SourceBuffer == NULL) || (FixedFieldName == NULL) || (ListHead == > NULL) || > + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FixedFieldName) == 0)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAppendNewAmlObject (&Object, "CreateFixedField", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", > __func__, FixedFieldName)); > + goto Done; > + } > + > + // Check if Localx Buffer > + if (AsciiStrnCmp (SourceBuffer, "Local", 5) == 0) { > + if ((SourceBuffer[5] >= '0') && (SourceBuffer[5] <= '9')) { > + Status = AmlOPLocalN ((UINT8)AsciiStrDecimalToUintn > (&SourceBuffer[5]), ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: LocalN for %a object\n", __func__, > FixedFieldName)); > + goto Done; > + } > + } > + > + // Check if Argx Buffer > + } else if (AsciiStrnCmp (SourceBuffer, "Arg", 3) == 0) { > + if ((SourceBuffer[3] >= '0') && (SourceBuffer[3] <= '9')) { > + Status = AmlOpArgN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[3]), > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ArgN for %a object\n", __func__, > FixedFieldName)); > + goto Done; > + } > + } > + } else { > + Status = AmlOPNameString (SourceBuffer, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", > __func__, FixedFieldName)); > + goto Done; > + } > + } > + > + Status = AmlOPDataInteger (Index, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Index for %a object\n", __func__, > FixedFieldName)); > + goto Done; > + } > + > + Status = AmlOPNameString (FixedFieldName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", > __func__, FixedFieldName)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateFixedField", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > FixedFieldName)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, FixedFieldName)); > + goto Done; > + } > + > + // CreateWordFieldOp is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, FixedFieldName)); > + goto Done; > + } > + > + Object->Data[0] = OpCode; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a CreateBitField AML Object and inserts it into the linked list > + > + Syntax: > + CreateBitField (SourceBuffer, BitIndex, BitFieldName) > + > + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString > + CreateBitFieldOp := 0x8D > + SourceBuff := TermArg => Buffer > + BitIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field > object > + @param[in] BitIndex, - Starting bit index to place the new buffer > + @param[in] BitFieldName, - Name of the BitField > + @param[in,out] ListHead - Linked list has completed CreateBitField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateBitField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 BitIndex, > + IN CHAR8 *BitFieldName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlCreateFixedField (SourceBuffer, BitIndex, BitFieldName, > AML_CREATE_BIT_FIELD_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a CreateByteField AML Object and inserts it into the linked list > + > + Syntax: > + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) > + > + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex > NameString > + CreateByteFieldOp := 0x8C > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field > object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] ByteFieldName, - Name of the ByteField > + @param[in,out] ListHead - Linked list has completed CreateByteField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateByteField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *ByteFieldName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, > ByteFieldName, AML_CREATE_BYTE_FIELD_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a CreateDWordField AML Object and inserts it into the linked list > + > + Syntax: > + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) > + > + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex > NameString > + CreateDWordFieldOp := 0x8A > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord > field object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] DWordFieldName, - Name of the DWordField > + @param[in,out] ListHead - Linked list has completed > CreateDWordField object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateDWordField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *DWordFieldName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, > DWordFieldName, AML_CREATE_DWORD_FIELD_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a CreateQWordField AML Object and inserts it into the linked list > + > + Syntax: > + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) > + > + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex > NameString > + CreateQWordFieldOp := 0x8F > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord > field object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] QWordFieldName, - Name of the QWordField > + @param[in,out] ListHead - Linked list has completed > CreateQWordField object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateQWordField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *QWordFieldName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, > QWordFieldName, AML_CREATE_QWORD_FIELD_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a CreateWordField AML Object and inserts it into the linked list > + > + Syntax: > + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) > + > + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex > NameString > + CreateWordFieldOp := 0x8B > + SourceBuff := TermArg => Buffer > + ByteIndex := TermArg => Integer > + > + @param[in] SourceBuffer, - Buffer to house the new buffer word field > object > + @param[in] ByteIndex, - Starting byte index to place the new buffer > + @param[in] WordFieldName, - Name of the WordField > + @param[in,out] ListHead - Linked list has completed CreateWordField > object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPCreateWordField ( > + IN CHAR8 *SourceBuffer, > + IN UINT64 ByteIndex, > + IN CHAR8 *WordFieldName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, > WordFieldName, AML_CREATE_WORD_FIELD_OP, ListHead); > + return Status; > +} > + > +/** > + Creates a Method > + > + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, > + ParameterTypes) {TermList} > + > + TermList must be created between AmlStart and AmlClose Phase > + > + Note: ReturnType and ParameterTypes are not used for AML encoding > + and are therefore not passed in to this function. > + > + DefMethod := MethodOp PkgLength NameString MethodFlags TermList > + MethodOp := 0x14 > + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) > + // bit 3: SerializeFlag > + // 0 NotSerialized > + // 1 Serialized > + // bit 4-7: SyncLevel (0x00-0x0f) > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] Name - Method name > + @param[in] NumArgs - Number of arguments passed in to method > + @param[in] SerializeRule - Flag indicating whether method is serialized > + or not > + @param[in] SyncLevel - synchronization level for the method (0 - 15), > + use zero for default sync level. > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlMethod ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *Name, > + IN UINT8 NumArgs, > + IN METHOD_SERIALIZE_FLAG SerializeRule, > + IN UINT8 SyncLevel, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINT8 MethodFlags; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || > + (Name == NULL) || > + (NumArgs > METHOD_ARGS_MAX) || > + (SyncLevel > MAX_SYNC_LEVEL) || > + (SerializeRule >= FlagInvalid) || > + (ListHead == NULL)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, "Method", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Method for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Insert required NameString > + Status = AmlOPNameString (Name, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + // Add Method Flags > + Status = InternalAppendNewAmlObject (&Object, "METHOD_FLAGS", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start METHOD_FLAGS for %a > object\n", __func__, Name)); > + goto Done; > + } > + > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // TermList should be closed already > + // Add Method Flags > + Status = InternalAmlLocateObjectByIdentifier (&Object, > "METHOD_FLAGS", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate METHOD_FLAGS for %a > object\n", __func__, Name)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a METHOD_FLAGS child data > collection.\n", __func__, Name)); > + goto Done; > + } > + > + // Method Flags is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, Name)); > + goto Done; > + } > + > + MethodFlags = NumArgs & 0x07; > + if (SerializeRule) { > + MethodFlags |= BIT3; > + } > + > + MethodFlags |= (SyncLevel & 0x0F) << 4; > + Object->Data[0] = MethodFlags; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + // Required NameString completed in one phase call > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", > __func__, Name)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, "Method", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > Name)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", > __func__, Name)); > + goto Done; > + } > + > + // Method Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, Name)); > + goto Done; > + } > + > + Object->Data[0] = AML_METHOD_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&ChildObject, ListHead); > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNames > paceModifierObjects.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNames > paceModifierObjects.c > new file mode 100644 > index 0000000000..afe51cdcf2 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNames > paceModifierObjects.c > @@ -0,0 +1,360 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESPACEMODIFIEROBJECTS_FILEC > ODE > + > +/** > + Creates a Scope (ObjectName, Object) > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefScope := ScopeOp PkgLength NameString TermList > + ScopeOp := 0x10 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] String - Location > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlScope ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > String)); > + goto Done; > + } > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", > __func__, String)); > + goto Done; > + } > + > + // Insert required NameString > + Status = AmlOPNameString (String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a > object\n", __func__, String)); > + goto Done; > + } > + > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // TermList should be closed already > + > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", > __func__, String)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > String)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, > String)); > + goto Done; > + } > + > + // Scope Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, String)); > + goto Done; > + } > + > + Object->Data[0] = AML_SCOPE_OP; > + CopyMem (&Object->Data[1], ChildObject->Data, ChildObject->DataSize); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Name (ObjectName, Object) > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefName := NameOp NameString ChildObjectData > + NameOp := 0x08 > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] String - Object name > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlName ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *String, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > String)); > + goto Done; > + } > + > + // Insert required NameString > + Status = AmlOPNameString (String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", > __func__, String)); > + goto Done; > + } > + > + break; > + case AmlClose: > + // DataRefObject should be closed already > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > String)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, > String)); > + goto Done; > + } > + > + Object->Data = AllocatePool (ChildObject->DataSize + 1); > + // Name Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, String)); > + goto Done; > + } > + > + Object->Data[0] = AML_NAME_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates an Alias (SourceObject, AliasObject) > + > + DefAlias := AliasOp NameString NameString > + AliasOp := 0x06 > + > + @param[in] SourceName - Any named Source Object NameString > + @param[in] AliasName - Alias Object NameString > + @param[in,out] ListHead - Linked list has completed the Alias Object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPAlias ( > + IN CHAR8 *SourceName, > + IN CHAR8 *AliasName, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((SourceName == NULL) || (AliasName == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + // Start ALIAS object > + Status = InternalAppendNewAmlObject (&Object, "ALIAS", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append ALIAS object\n", > __func__)); > + goto Done; > + } > + > + // Insert required Object (to be aliased) NameString > + Status = AmlOPNameString (SourceName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", > __func__, SourceName)); > + goto Done; > + } > + > + // Insert required Alias NameString > + Status = AmlOPNameString (AliasName, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", > __func__, AliasName)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, "ALIAS", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot locate ALIAS object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, > SourceName)); > + goto Done; > + } > + > + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); > + // Alias Op is one byte > + Object->DataSize = ChildObject->DataSize + 1; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, SourceName)); > + goto Done; > + } > + > + Object->Data[0] = AML_ALIAS_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjects > Debug.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObject > sDebug.c > new file mode 100644 > index 0000000000..279bfc782d > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObject > sDebug.c > @@ -0,0 +1,144 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLOBJECTSDEBUG_FILECODE > + > +/** > + DEBUG print a (VOID *)buffer in an array of HEX bytes > + > + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F > + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE > + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 > + > + @param[in] Buffer - Buffer containing buffer > + @param[in] BufferSize - Number of bytes to print > + > + @retval EFI_SUCCESS > +**/ > +EFI_STATUS > +EFIAPI > +AmlDebugPrintBuffer ( > + IN VOID *Buffer, > + IN UINTN BufferSize > + ) > +{ > + UINTN Column; > + UINTN Index; > + UINTN NumberOfColumns; > + UINT8 *Data; > + > + Data = Buffer; > + NumberOfColumns = 16; > + // Header > + DEBUG ((DEBUG_VERBOSE, " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D > 0E 0F\n")); > + for (Index = 0; Index < BufferSize;) { > + // Row Counter > + DEBUG ((DEBUG_VERBOSE, "%4X ", Index)); > + > + // Hex ouput > + for (Column = 0; Column < NumberOfColumns; Column++) { > + if (Index + Column < BufferSize) { > + DEBUG ((DEBUG_VERBOSE, " %02X", Data[Index + Column])); > + } else { > + DEBUG ((DEBUG_VERBOSE, " ")); > + } > + } > + > + DEBUG ((DEBUG_VERBOSE, " ")); > + // Ascii ouput > + for (Column = 0; Column < NumberOfColumns; Column++) { > + if (Index + Column < BufferSize) { > + // Only print ACPI acceptable characters > + if (((Data[Index + Column] >= 0x30) && // '0' - '9' > + (Data[Index + Column] <= 0x39)) || > + ((Data[Index + Column] >= 0x41) && // 'A' - 'Z' > + (Data[Index + Column] <= 0x5A)) || > + (Data[Index + Column] == 0x5C) || // '\' > + (Data[Index + Column] == 0x5F) || // '_' > + (Data[Index + Column] == 0x5E) // '^' > + ) > + { > + DEBUG ((DEBUG_VERBOSE, "%c", Data[Index + Column])); > + } else { > + DEBUG ((DEBUG_VERBOSE, ".")); > + } > + } > + } > + > + Index += NumberOfColumns; > + DEBUG ((DEBUG_VERBOSE, "\n")); > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + DEBUG print an AML Object including an array of HEX bytes for the data > + > + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F > + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE > + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 > + Completed=(TRUE|FALSE) > + > + @param[in] Object - AML_OBJECT_INSTANCE > + > + @retval EFI_SUCCESS, EFI_INVALID_PARAMETER > +**/ > +EFI_STATUS > +EFIAPI > +AmlDebugPrintObject ( > + IN AML_OBJECT_INSTANCE *Object > + ) > +{ > + if ((Object == NULL) || (Object->Signature != > AML_OBJECT_INSTANCE_SIGNATURE)) { > + return EFI_INVALID_PARAMETER; > + } > + > + DEBUG (( > + DEBUG_VERBOSE, > + "Object=0x%X, Size=0x%d\n", > + (UINTN)Object, > + Object->DataSize > + )); > + AmlDebugPrintBuffer (Object->Data, Object->DataSize); > + DEBUG ((DEBUG_VERBOSE, "Completed=%a\n", Object->Completed ? > "TRUE" : "FALSE")); > + DEBUG ((DEBUG_VERBOSE, "\n")); > + return EFI_SUCCESS; > +} > + > +/** > + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes > + > + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List > +**/ > +EFI_STATUS > +EFIAPI > +AmlDebugPrintLinkedObjects ( > + IN LIST_ENTRY *ListHead > + ) > +{ > + LIST_ENTRY *Node; > + AML_OBJECT_INSTANCE *Object; > + > + if (ListHead == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + DEBUG ((DEBUG_VERBOSE, "Printing AML_OBJECT_INSTANCE Linked > List\n")); > + Node = GetNextNode (ListHead, ListHead); > + while (Node != ListHead) { > + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + AmlDebugPrintObject (Object); > + Node = GetNextNode (ListHead, Node); > + } > + > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLen > gth.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLen > gth.c > new file mode 100644 > index 0000000000..85d184b759 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLen > gth.c > @@ -0,0 +1,267 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLPKGLENGTH_FILECODE > + > +#define MAX_ONE_BYTE_PKG_LENGTH 63 > +#define ONE_BYTE_PKG_LENGTH_ENCODING 0x00 > +#define ONE_BYTE_NIBBLE_MASK 0x3F > + > +#define MAX_TWO_BYTE_PKG_LENGTH 4095 > +#define TWO_BYTE_PKG_LENGTH_ENCODING 0x40 > +#define PKG_LENGTH_NIBBLE_MASK 0x0F > + > +#define MAX_THREE_BYTE_PKG_LENGTH 1048575 > +#define THREE_BYTE_PKG_LENGTH_ENCODING 0x80 > + > +#define MAX_FOUR_BYTE_PKG_LENGTH 268435455 > +#define FOUR_BYTE_PKG_LENGTH_ENCODING 0xC0 > + > +/** > + Creates a Package Length encoding and places it in the return buffer, > + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not > + include the length of its own encoding. > + > + @param[in] DataSize - The size of data to be encoded as a pkglength > + @param[out] PkgLengthEncoding - Return buffer containing the AML > encoding > + @param[out] ReturnDataLength - Size of the return buffer > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > + **/ > +EFI_STATUS > +EFIAPI > +InternalAmlBitPkgLength ( > + IN UINT32 DataSize, > + OUT UINT8 **PkgLengthEncoding, > + OUT UINTN *ReturnDataLength > + ) > +{ > + UINTN DataLength; > + UINT8 PkgLeadByte; > + UINTN PkgLengthRemainder; > + EFI_STATUS Status; > + > + Status = EFI_INVALID_PARAMETER; > + DataLength = 0; > + // Calculate Length of PkgLength Data and fill out least > + // significant nibble > + if ((DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { > + DataLength = 1; > + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; > + PkgLeadByte |= ((DataSize) & ONE_BYTE_NIBBLE_MASK); > + } else { > + if ((DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { > + DataLength = 2; > + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; > + } else if ((DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { > + DataLength = 3; > + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; > + } else if ((DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { > + DataLength = 4; > + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; > + } else { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: PkgLength data size > 0x%X\n", > + __func__, > + MAX_FOUR_BYTE_PKG_LENGTH - 4 > + )); > + goto Done; > + } > + > + PkgLeadByte |= ((DataSize) & PKG_LENGTH_NIBBLE_MASK); > + } > + > + // Allocate new data buffer > + // DataSize = DataLength + DataSize; > + *PkgLengthEncoding = AllocatePool (DataLength); > + if (*PkgLengthEncoding == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed > Object=PkgLength\n", __func__)); > + goto Done; > + } > + > + // Populate PkgLeadByte > + *PkgLengthEncoding[0] = PkgLeadByte; > + > + // Populate remainder of PkgLength bytes > + PkgLengthRemainder = (DataSize) >> 4; > + if (PkgLengthRemainder != 0) { > + CopyMem (&PkgLengthEncoding[0][1], &PkgLengthRemainder, > DataLength - 1); > + } > + > + *ReturnDataLength = DataLength; > + > +Done: > + return Status; > +} > + > +/** > + Creates a Package Length AML Object and inserts it into the linked list > + > + PkgLength := PkgLeadByte | > + <PkgLeadByte ByteData> | > + <PkgLeadByte ByteData ByteData> | > + <PkgLeadByte ByteData ByteData ByteData> > + > + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> > + <bit 5-4: Only used if PkgLength < 63> > + <bit 3-0: Least significant package length nybble> > + > + Note: The high 2 bits of the first byte reveal how many follow bytes are in > + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used > + to encode the package length (in other words, values 0-63). If the package > + length value is more than 63, more than one byte must be used for the > encoding > + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. > + > + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become > + the least significant 4 bits of the resulting package length value. The next > + ByteData will become the next least significant 8 bits of the resulting value > + and so on, up to 3 ByteData bytes. Thus, the maximum package length is > 2**28. > + > + @param[in] Phase - Example: AmlStart, AmlClose > + @param[in,out] ListHead - Head of Linked List of all AML Objects > + > + @return EFI_SUCCESS - Success > + @return all others - Fail > + **/ > +EFI_STATUS > +EFIAPI > +AmlPkgLength ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + UINTN DataLength; > + UINT8 PkgLeadByte; > + UINTN PkgLengthRemainder; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, "LENGTH", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Length object\n", __func__)); > + goto Done; > + } > + > + break; > + case AmlClose: > + Status = InternalAmlLocateObjectByIdentifier (&Object, "LENGTH", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Length object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, > "Length")); > + goto Done; > + } > + > + DataLength = 0; > + // Calculate Length of PkgLength Data and fill out least > + // significant nibble > + if ((ChildObject->DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { > + DataLength = 1; > + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; > + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & > ONE_BYTE_NIBBLE_MASK); > + } else { > + if ((ChildObject->DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { > + DataLength = 2; > + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; > + } else if ((ChildObject->DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) > { > + DataLength = 3; > + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; > + } else if ((ChildObject->DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) > { > + DataLength = 4; > + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; > + } else { > + Status = EFI_DEVICE_ERROR; > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: PkgLength data size > 0x%X\n", > + __func__, > + MAX_FOUR_BYTE_PKG_LENGTH - 4 > + )); > + goto Done; > + } > + > + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & > PKG_LENGTH_NIBBLE_MASK); > + } > + > + // Allocate new data buffer > + Object->DataSize = DataLength + ChildObject->DataSize; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed > Object=PkgLength\n", __func__)); > + goto Done; > + } > + > + // Populate PkgLeadByte > + Object->Data[0] = PkgLeadByte; > + > + // Populate remainder of PkgLength bytes > + PkgLengthRemainder = (ChildObject->DataSize + DataLength) >> 4; > + if (PkgLengthRemainder != 0) { > + CopyMem (&Object->Data[1], &PkgLengthRemainder, DataLength - 1); > + } > + > + CopyMem ( > + &Object->Data[DataLength], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResour > ceDescriptor.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResour > ceDescriptor.c > new file mode 100644 > index 0000000000..4ef746327b > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResour > ceDescriptor.c > @@ -0,0 +1,1989 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLRESOURCEDESCRIPTOR_FILECODE > + > +/** > + ResourceTemplate (Resource To Buffer Conversion Macro) > + > + Syntax: > + ResourceTemplate () {ResourceMacroList} => Buffer > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed ResourceTemplate > Object > + after AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlResourceTemplate ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + EFI_ACPI_END_TAG_DESCRIPTOR *EndTag; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = AmlBuffer (AmlStart, 0, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "ResourceTemplate")); > + goto Done; > + } > + > + // Start EndTag object to be completed in Close > + // ACPI 6.3: 6.4.2.9 End Tag: ...The End Tag is automatically generated by > + // the ASL compiler at the end of the ResourceTemplate statement. > + Status = InternalAppendNewAmlObject (&Object, "END_TAG", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "END_TAG")); > + goto Done; > + } > + > + // ResourceMacroList is too complicated and must be added outside > + break; > + case AmlClose: > + // ResourceMacroList should be closed already > + > + // Locate and complete End Tag > + Status = InternalAmlLocateObjectByIdentifier (&Object, "END_TAG", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, > "END_TAG")); > + goto Done; > + } > + > + // Release Object->Data Identifier > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", > __func__)); > + goto Done; > + } > + > + Object->DataSize = ChildObject->DataSize + sizeof > (EFI_ACPI_END_TAG_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: EndTag Alloc Failed\n", __func__)); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + // ChildObject Data goes before End Tag > + if ((ChildObject->Data != NULL) && (ChildObject->DataSize > 0)) { > + CopyMem (Object->Data, ChildObject->Data, ChildObject->DataSize); > + } > + > + EndTag = (EFI_ACPI_END_TAG_DESCRIPTOR *)&Object- > >Data[ChildObject->DataSize]; > + EndTag->Desc = ACPI_END_TAG_DESCRIPTOR; > + // Spec says the byte is a checksum, but I have never seen a value other > + // than zero in the field compiled from ASL. > + // EndTag->Checksum already = 0; > + > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + > + Status = AmlBuffer (AmlClose, 0, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close %a object\n", __func__, > "ResourceTemplate")); > + goto Done; > + } > + > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + InternalAmlAddressSpaceCheck > + > + Checks Address space parameters for Word, DWord, or QWord size > Address space > + Descriptor. Size will be constrained by the Resource Descriptor input > + parameters being of the correct size. > + > + @param[in] IsMinFixed > + @param[in] IsMaxFixed > + @param[in] AddressGranularity > + @param[in] AddressMinimum > + @param[in] AddressMaximum > + @param[in] RangeLength > + > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlAddressSpaceCheck ( > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 RangeLength > + ) > +{ > + // Max must be greater than Min > + if (AddressMaximum < AddressMinimum) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum greater than > AddressMaximum\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + // Address Granularity must be (2^n)-1 > + if (((AddressGranularity + 1) & AddressGranularity) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity must be (a > power of 2)-1\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (RangeLength == 0) { > + // LEN _MIF _MAF Definition > + // 0 0 0 > + // 0 0 1 > + // 0 1 0 > + // Variable size, variable location resource descriptor for _PRS. > + // If _MIF is set, _MIN must be a multiple of (_GRA+1). If _MAF > + // is set, _MAX must be (a multiple of (_GRA+1))-1. > + // OS can pick the resource range that satisfies following conditions: > + // If _MIF is not set, start address is a multiple of (_GRA+1) > + // and greater or equal to _MIN. Otherwise, start address is _MIN. > + // If _MAF is not set, end address is (a multiple of (_GRA+1))-1 > + // and less or equal to _MAX. Otherwise, end address is _MAX. > + // 0 1 1 (Invalid combination) > + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && > + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) > + { > + // 0 1 1 (Invalid combination) > + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsMinFixed and IsMaxFixed cannot > both be set\n", __func__)); > + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX\n", > __func__, RangeLength)); > + return EFI_INVALID_PARAMETER; > + } else if (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED) { > + // 0 0 1 > + if ((AddressMaximum & AddressGranularity) != AddressGranularity) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMaximum=0x%lX + 1) is > not a multiple of\n", __func__, AddressMaximum)); > + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", > __func__, AddressGranularity)); > + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (AddressMaximum == 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMaximum can not be 0\n", > __func__)); > + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + } else if (IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) { > + // 0 1 0 > + if ((AddressMinimum & AddressGranularity) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum=0x%lX is not a > multiple of\n", __func__, AddressMinimum)); > + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", > __func__, AddressGranularity)); > + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 1\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) > && > + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED) && > + (AddressMinimum == 0) && > + (AddressMaximum == 0) && > + (AddressGranularity == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Maximum, Minimum, Granularity all > 0\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + } else { > + // LEN _MIF _MAF Definition > + // >0 0 0 Fixed size, variable location resource descriptor for _PRS. > + // _LEN must be a multiple of (_GRA+1). > + // OS can pick the resource range that satisfies following > conditions: > + // Start address is a multiple of (_GRA+1) and greater or equal to > _MIN. > + // End address is (start address+_LEN-1) and less or equal to > _MAX. > + // >0 0 1 (Invalid combination) > + // >0 1 0 (Invalid combination) > + // >0 1 1 Fixed size, fixed location resource descriptor. > + // _GRA must be 0 and _LEN must be (_MAX - _MIN +1). > + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && > + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED)) > + { > + // >0 0 0 > + if ((RangeLength & AddressGranularity) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX is not a > multiple of\n", __func__, RangeLength)); > + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", > __func__, AddressGranularity)); > + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 0, IsMaxFixed = > 0\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } else if (RangeLength > (AddressMaximum - AddressMinimum + 1)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX > > (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, > RangeLength, AddressMaximum, AddressMinimum)); > + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 0, IsMaxFixed = 0\n", > __func__, RangeLength)); > + return EFI_INVALID_PARAMETER; > + } > + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && > + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) > + { > + // >0 1 1 > + if (AddressGranularity != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity=0x%lX != 0\n", > __func__, AddressGranularity)); > + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX > 0, > IsMinFixed = 1, and IsMaxFixed = 1\n", __func__, RangeLength)); > + return EFI_INVALID_PARAMETER; > + } else if (RangeLength != (AddressMaximum - AddressMinimum + 1)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX != > (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, > RangeLength, AddressMaximum, AddressMinimum)); > + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 1, IsMaxFixed = 1\n", > __func__, RangeLength)); > + return EFI_INVALID_PARAMETER; > + } > + } else { > + // >0 0 1 (Invalid combination) > + // >0 1 0 (Invalid combination) > + DEBUG ((DEBUG_ERROR, "%a: ERROR: When RangeLength=0x%lX > 0,\n", > __func__, RangeLength)); > + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed and IsMaxFixed must both > be either 1 or 0\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + } > + > + return EFI_SUCCESS; > +} > + > +/* > + Internal function to create DWord Address Space Descriptors > + > + This function only requires a single call and therefore no Phases > + Generates: > + 6.4.3.5.2 DWord Address Space Descriptor > + Type 1, Large Item Value 0x7 > + The DWORD address space descriptor is used to report resource usage in a > + 32-bit address space (like memory and I/O). > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlOPDWordAddressSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; > + > + // Vaidate General Flags Input > + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid ResourceUsage > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid Decode Parameter\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMinFixed > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMaxFixed > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlAddressSpaceCheck ( > + IsMinFixed, > + IsMaxFixed, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + RangeLength > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: DWord Address Space Check > FAILED\n", __func__)); > + return Status; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "DWORD_ADDRESS")); > + goto Done; > + } > + > + Object->DataSize = sizeof > (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "DWORD_ADDRESS")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR > *)Object->Data; > + Descriptor->Header.Header.Byte = > ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR; > + Descriptor->Header.Length = sizeof > (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR) - > + sizeof (ACPI_LARGE_RESOURCE_HEADER); > + Descriptor->ResType = ResourceType; > + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; > + Descriptor->SpecificFlag = TypeSpecificFlags; > + Descriptor->AddrSpaceGranularity = AddressGranularity; > + Descriptor->AddrRangeMin = AddressMinimum; > + Descriptor->AddrRangeMax = AddressMaximum; > + Descriptor->AddrTranslationOffset = AddressTranslation; > + Descriptor->AddrLen = RangeLength; > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.32 DMA (DMA Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) > {DmaChannelList} => Buffer (BitMask) > + > + Generates: 6.4.2.2 DMA Descriptor > + > + @param[in] DmaType - DMA channel speed supported > + @param[in] IsBusMaster - Logical device bus master status > + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16- > bit, both) > + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - > 7), _DMA > + Bit [0] is channel 0, etc. > + // DescriptorName - Optional - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordIO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDma ( > + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, > + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, > + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, > + IN UINT8 DmaChannelList, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_DMA_DESCRIPTOR *Descriptor; > + > + if ((DmaType & (UINT8) ~EFI_ACPI_DMA_SPEED_TYPE_MASK) != 0) { > + // Invalid DmaType value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaType '%x' is not valid.\n", > __func__, DmaType)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsBusMaster & ~EFI_ACPI_DMA_BUS_MASTER_MASK) != 0) { > + // Invalid IsBusMaster value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsBusMaster '%x' is not valid.\n", > __func__, DmaType)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (((DmaTransferSize & ~EFI_ACPI_DMA_TRANSFER_TYPE_MASK) != 0) || > + (DmaTransferSize == 0x3)) > + { > + // Invalid DmaTransferSize value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaTransferSize '%x' is not valid.\n", > __func__, DmaType)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (ListHead == NULL) { > + // Invalid > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot > == NULL.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", > __func__, "DMA_RESOURCE")); > + goto Done; > + } > + > + Object->DataSize = sizeof (EFI_ACPI_DMA_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "DMA_RESOURCE")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_DMA_DESCRIPTOR *)Object->Data; > + Descriptor->Header.Byte = ACPI_DMA_DESCRIPTOR; > + Descriptor->ChannelMask = DmaChannelList; > + // > + // Descriptor->Information bit mask: > + // Bit [7] Reserved (must be 0) > + // Bits [6:5] DMA channel speed supported, _TYP > + // 00 Indicates compatibility mode > + // 01 Indicates Type A DMA as described in the EISA > + // 10 Indicates Type B DMA > + // 11 Indicates Type F > + // Bits [4:3] Ignored > + // Bit [2] Logical device bus master status, _BM > + // 0 Logical device is not a bus master > + // 1 Logical device is a bus master > + // Bits [1:0] DMA transfer type preference, _SIZ > + // 00 8-bit only > + // 01 8- and 16-bit > + // 10 16-bit only > + Descriptor->Information = (UINT8)(DmaType + > + IsBusMaster + > + DmaTransferSize); > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, > IsMaxFixed, > + TypeSpecificFlags, AddressGranularity, AddressMinimum, > + AddressMaximum, AddressTranslation, RangeLength, > + ResourceSourceIndex, ResourceSource, DescriptorName) > + > + Generates: > + 6.4.3.5.2 DWord Address Space Descriptor > + Type 1, Large Item Value 0x7 > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. > + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPDWordAddressSpace ( > + ResourceType, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + TypeSpecificFlags, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/** > + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, TranslationType, > + TranslationDensity) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] ISARanges, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + TranslationDensity - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordIO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordIO ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT8 ISARanges, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + // TranslationDensity - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + if (ISARanges == 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } else if (ISARanges > 3) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 are Invalid\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPDWordAddressSpace ( > + ACPI_ADDRESS_SPACE_TYPE_IO, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + (ISARanges), > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/** > + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, > Cacheable, > + ReadAndWrite, AddressGranularity, AddressMinimum, > AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, MemoryRangeType, > TranslationType) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Cacheable, > + @param[in] ReadAndWrite, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + MemoryRangeType - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed DWordMemory > buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPDWordMemory ( > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Cacheable, > + IN UINT8 ReadAndWrite, > + IN UINT32 AddressGranularity, > + IN UINT32 AddressMinimum, > + IN UINT32 AddressMaximum, > + IN UINT32 AddressTranslation, > + IN UINT32 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // MemoryRangeType - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + // Validate Type Specific Parameters > + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != > 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter > 0x%X\n", __func__, (Cacheable & > ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((ReadAndWrite & > ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPDWordAddressSpace ( > + ACPI_ADDRESS_SPACE_TYPE_MEM, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + (Cacheable | ReadAndWrite), > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/* > + Internal function to create QWord Address Space Descriptors > + > + This function only requires a single call and therefore no Phases > + Generates: > + 6.4.3.5.1 QWord Address Space Descriptor > + Type 1, Large Item Value 0xA > + The QWORD address space descriptor is used to report resource usage in a > + 64-bit address space (like memory and I/O). > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlOPQWordAddressSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; > + > + // Vaidate General Flags Input > + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid ResourceUsage > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid Decode Parameter\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMinFixed > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMaxFixed > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlAddressSpaceCheck ( > + IsMinFixed, > + IsMaxFixed, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + RangeLength > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: QWord Address Space Check > FAILED\n", __func__)); > + return Status; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "QWORD_ADDRESS")); > + goto Done; > + } > + > + Object->DataSize = sizeof > (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "QWORD_ADDRESS")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR > *)Object->Data; > + Descriptor->Header.Header.Byte = > ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR; > + Descriptor->Header.Length = sizeof > (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR) - > + sizeof (ACPI_LARGE_RESOURCE_HEADER); > + Descriptor->ResType = ResourceType; > + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; > + Descriptor->SpecificFlag = TypeSpecificFlags; > + Descriptor->AddrSpaceGranularity = AddressGranularity; > + Descriptor->AddrRangeMin = AddressMinimum; > + Descriptor->AddrRangeMax = AddressMaximum; > + Descriptor->AddrTranslationOffset = AddressTranslation; > + Descriptor->AddrLen = RangeLength; > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) > + > + Syntax: > + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => > Buffer > + > + Arguments: > + EdgeLevel: > + Describes whether the interrupt is edge triggered (Edge) or level > triggered > + (Level). The field DescriptorName. _HE is automatically created to refer > to > + this portion of the resource descriptor, where '1' is Edge and ActiveHigh > + and '0' is Level and ActiveLow. > + > + ActiveLevel: > + Describes whether the interrupt is active-high (ActiveHigh) or active-low > + (ActiveLow). The field DescriptorName. _LL is automatically created to > refer > + to this portion of the resource descriptor, where '1' is Edge and > ActiveHigh > + and '0' is Level and ActiveLow. > + > + Shared: > + Describes whether the interrupt can be shared with other devices > (Shared) or > + not (Exclusive), and whether it is capable of waking the system from a > + low-power idle or system sleep state (SharedAndWake or > ExclusiveAndWake). > + The field DescriptorName. _SHR is automatically created to refer to this > portion > + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If > nothing > + is specified, then Exclusive is assumed. > + > + InterruptList: > + IRQ mask bits [15:0] > + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. > + > + DescriptorName: > + Is an optional argument that specifies a name for an integer constant that > + will be created in the current scope that contains the offset of this > resource > + descriptor within the current resource template buffer. The predefined > + descriptor field names may be appended to this name to access > individual > + fields within the descriptor via the Buffer Field operators. > + > + Description: > + The IRQ macro evaluates to a buffer that contains an IRQ resource > descriptor. > + The format of the IRQ descriptor can be found in "IRQ Descriptor". The > macro > + produces the three-byte form of the descriptor. The macro is designed to > be > + used inside of a ResourceTemplate. > + > + Generates: 6.4.2.1 IRQ Descriptor > + > + @param[in] EdgeLevel - trigger level supported > + @param[in] ActiveLevel - interrupt polarity > + @param[in] Shared - interrupt exclusivity > + @param[in] InterruptList - IRQ mask bits[7:0], _INT > + Bit [0] represents IRQ0, > + bit[1] is IRQ1, and so on. > + IRQ mask bits[15:8], _INT > + Bit [0] represents IRQ8, > + bit[1] is IRQ9, and so on. > + // DescriptorName - Optional - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed IRQ buffer > + > + @retval EFI_SUCCESS > + @retval Error status > + > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPIRQ ( > + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, > + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, > + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, > + IN UINT16 InterruptList, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_IRQ_DESCRIPTOR *Descriptor; > + > + if ((EdgeLevel & (UINT8) ~EFI_ACPI_IRQ_MODE_MASK) != 0) { > + // Invalid Decode value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: EdgeLevel '%x' is not valid.\n", > __func__, EdgeLevel)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((ActiveLevel & (UINT8) ~EFI_ACPI_IRQ_POLARITY_MASK) != 0) { > + // Invalid Decode value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ActiveLevel '%x' is not valid.\n", > __func__, ActiveLevel)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((Shared & (UINT8) ~(EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | > EFI_ACPI_IRQ_SHARABLE_MASK)) != 0) { > + // Invalid Decode value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Shared '%x' is not valid.\n", > __func__, Shared)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (ListHead == NULL) { > + // Invalid > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot > == NULL.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create %a object.", __func__, > "IRQ_RESOURCE")); > + goto Done; > + } > + > + Object->DataSize = sizeof (EFI_ACPI_IRQ_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Alloc for %a failed\n", __func__, > "IRQ_RESOURCE")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_IRQ_DESCRIPTOR *)Object->Data; > + Descriptor->Header.Byte = ACPI_IRQ_DESCRIPTOR; > + Descriptor->Mask = InterruptList; > + // > + // Ref 6.4.2.1 IRQ Descriptor - IRQ Information > + // Descriptor->Information bit mask: > + // IRQ Information. Each bit, when set, indicates this device is capable of > + // driving a certain type of interrupt. (Optional-if not included then assume > + // edge sensitive, high true interrupts.) These bits can be used both for > + // reporting and setting IRQ resources. > + // Note: This descriptor is meant for describing interrupts that are > connected > + // to PIC-compatible interrupt controllers, which can only be programmed > + // for Active-High-Edge-Triggered or Active-Low-LevelTriggered > interrupts. > + // Any other combination is invalid. The Extended Interrupt Descriptor > can > + // be used to describe other combinations. > + // > + // Bit [7:6] Reserved (must be 0) > + // Bit [5] Wake Capability, _WKC > + // 0x0 = Not Wake Capable: This interrupt is not capable of waking the > system. > + // 0x1 = Wake Capable: This interrupt is capable of waking the system > from a > + // low-power idle state or a system sleep state. > + // Bit [4] Interrupt Sharing, _SHR > + // 0x0 = Exclusive: This interrupt is not shared with other devices. > + // 0x1 = Shared: This interrupt is shared with other devices. > + // Bit [3] Interrupt Polarity, _LL > + // 0 Active-High - This interrupt is sampled when the signal is high, or true > + // 1 Active-Low - This interrupt is sampled when the signal is low, or false. > + // Bit [2:1] Ignored > + // Bit [0] Interrupt Mode, _HE > + // 0 Level-Triggered - Interrupt is triggered in response to signal in a low > state. > + // 1 Edge-Triggered - Interrupt is triggered in response to a change in > signal state from > + // low to high. > + // > + Descriptor->Information = (UINT8)((EFI_ACPI_IRQ_WAKE_CAPABLE_MASK > | > + EFI_ACPI_IRQ_SHARABLE_MASK | > + EFI_ACPI_IRQ_POLARITY_MASK | > + EFI_ACPI_IRQ_MODE_MASK) & > + (Shared | > + ActiveLevel | > + EdgeLevel)); > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.64 IO (IO Resource Descriptor Macro) > + > + Syntax: > + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, > DescriptorName) => Buffer > + > + Arguments: > + Decode: > + Describes whether the I/O range uses 10-bit decode (Decode10) or 16- > bit > + decode (Decode16). The field DescriptorName. _DEC is automatically > created > + to refer to this portion of the resource descriptor, where '1' is Decode16 > + and '0' is Decode10. > + > + AddressMin: > + Evaluates to a 16-bit integer that specifies the minimum acceptable > starting > + address for the I/O range. It must be an even multiple of > AddressAlignment. > + The field DescriptorName._MIN is automatically created to refer to this > + portion of the resource descriptor. > + > + AddressMax: > + Evaluates to a 16-bit integer that specifies the maximum acceptable > starting > + address for the I/O range. It must be an even multiple of > AddressAlignment. > + The field DescriptorName._MAX is automatically created to refer to this > + portion of the resource descriptor. > + > + AddressAlignment: > + Evaluates to an 8-bit integer that specifies the alignment granularity > + for the I/O address assigned. The field DescriptorName. _ALN is > automatically > + created to refer to this portion of the resource descriptor. > + > + RangeLength: > + Evaluates to an 8-bit integer that specifies the number of bytes in the > + I/O range. The field DescriptorName. _LEN is automatically created to > refer > + to this portion of the resource descriptor. > + > + DescriptorName: > + An optional argument that specifies a name for an integer constant that > + will be created in the current scope that contains the offset of this > + resource descriptor within the current resource template buffer. The > + predefined descriptor field names may be appended to this name to > access > + individual fields within the descriptor via the Buffer Field operators. > + > + Description: > + The IO macro evaluates to a buffer which contains an IO resource > descriptor. > + The format of the IO descriptor can be found in the ACPI Specification > section > + "I/O Port Descriptor". The macro is designed to be used inside of a > ResourceTemplate. > + > + Generates: > + 6.4.2.5 I/O Port Descriptor > + Type 0, Small Item Name 0x8, Length = 7 > + > + @param[in] Decode, > + @param[in] AddressMin, > + @param[in] AddressMax, > + @param[in] AddressAlignment, > + @param[in] RangeLength, > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed IO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPIO ( > + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, > + IN UINT16 AddressMin, > + IN UINT16 AddressMax, > + IN UINT8 AddressAlignment, > + IN UINT8 RangeLength, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_IO_PORT_DESCRIPTOR *Descriptor; > + UINT64 Remainder; > + > + if ((Decode & (UINT8) ~EFI_ACPI_IO_DECODE_MASK) != 0) { > + // Invalid Decode value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Decode '%x' is not valid.\n", > __func__, Decode)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (ListHead == NULL) { > + // Invalid > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot > == NULL.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (AddressAlignment != 0) { > + DivU64x64Remainder (AddressMin, AddressAlignment, &Remainder); > + if (Remainder != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMin=0x%X) is not a > multiple of\n", __func__, AddressMin)); > + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", > __func__, AddressAlignment)); > + return EFI_INVALID_PARAMETER; > + } > + > + DivU64x64Remainder (AddressMax, AddressAlignment, &Remainder); > + if (Remainder != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMax=0x%X) is not a > multiple of\n", __func__, AddressMax)); > + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", > __func__, AddressAlignment)); > + return EFI_INVALID_PARAMETER; > + } > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", > __func__, "IO_RESOURCE")); > + goto Done; > + } > + > + Object->DataSize = sizeof (EFI_ACPI_IO_PORT_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "IO_RESOURCE")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_IO_PORT_DESCRIPTOR *)Object->Data; > + > + /* > + * According to ACPI spec for > + * ACPI_IO_PORT_DESCRIPTOR = 0x47 contains the informaion about > + * Name, Type and Length, hence no need to calculate the length. > + * Below is description from ACPI spec > + * Byte 0 I/O Port Descriptor Value = 0x47 (01000111B) - Type = 0, Small > item name = > + * 0x8, Length = 7 > + */ > + Descriptor->Header.Byte = ACPI_IO_PORT_DESCRIPTOR; > + // > + // Descriptor->Information bit mask: > + // Bit [7:1] Reserved, must be 0 > + // Bit [0] (_DEC) > + // 1 The logical device decodes 16-bit addresses > + // 0 The logical device decodes 10-bit addresses > + Descriptor->Information = (UINT8)(EFI_ACPI_IO_DECODE_MASK & > Decode); > + Descriptor->BaseAddressMin = AddressMin; > + Descriptor->BaseAddressMax = AddressMax; > + Descriptor->Alignment = AddressAlignment; > + Descriptor->Length = RangeLength; > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/* > + 19.6.114 Register (Generic Register Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, > + RegisterAddress, AccessSize, DescriptorName) > + > + Generates: > + 6.4.3.7 Generic Register Descriptor > + Type 1, Large Item Value 0x2 > + The generic register descriptor describes the location of a fixed width > + register within any of the ACPI-defined address spaces. See Generic > Register > + Descriptor for details. > + > + > + @param[in] AddressSpaceKeyword, > + @param[in] RegisterBitWidth, > + @param[in] RegisterBitOffset, > + @param[in] RegisterAddress, > + @param[in] AccessSize, > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +AmlOPRegister ( > + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, > + IN UINT8 RegisterBitWidth, > + IN UINT8 RegisterBitOffset, > + IN UINT64 RegisterAddress, > + IN UINT8 AccessSize, > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *Descriptor; > + > + if ((AddressSpaceKeyword < EFI_ACPI_6_4_SYSTEM_MEMORY) || > + (AddressSpaceKeyword > > EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid > AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((AddressSpaceKeyword > > EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL) && > + (AddressSpaceKeyword < > EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid > AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (AccessSize > EFI_ACPI_6_4_QWORD) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AccessSize=0x%02X\n", > __func__, AccessSize)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", > __func__, "IO_RESOURCE")); > + goto Done; > + } > + > + Object->DataSize = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "IO_RESOURCE")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *)Object->Data; > + > + Descriptor->Header.Header.Byte = ACPI_GENERIC_REGISTER_DESCRIPTOR; > + Descriptor->Header.Length = sizeof > (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) - > + sizeof (ACPI_LARGE_RESOURCE_HEADER); > + Descriptor->AddressSpaceId = AddressSpaceKeyword; > + Descriptor->RegisterBitWidth = RegisterBitWidth; > + Descriptor->RegisterBitOffset = RegisterBitOffset; > + Descriptor->AddressSize = AccessSize; > + Descriptor->RegisterAddress = RegisterAddress; > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/* > + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, > IsMaxFixed, > + TypeSpecificFlags, AddressGranularity, AddressMinimum, > + AddressMaximum, AddressTranslation, RangeLength, > + ResourceSourceIndex, ResourceSource, DescriptorName) > + > + Generates: > + 6.4.3.5.1 QWord Address Space Descriptor > + Type 1, Large Item Value 0xA > + The QWORD address space descriptor is used to report resource usage in a > + 64-bit address space (like memory and I/O). > + > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordSpace buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. > + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPQWordAddressSpace ( > + ResourceType, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + TypeSpecificFlags, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/** > + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) > + > + Syntax: > + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, > DescriptorName) > + > + Arguments: > + ReadAndWrite: Specifies whether or not the memory region is read-only > (ReadOnly) > + or read/write (ReadWrite). If nothing is specified, then ReadWrite is > assumed. > + The 1-bit field DescriptorName._RW is automatically created to refer to > this > + portion of the resource descriptor, where '1' is ReadWrite and '0' is > ReadOnly. > + > + AddressBase: Evaluates to a 32-bit integer that specifies the base address > + of the memory range. The 32-bit field DescriptorName. _BAS is > automatically > + created to refer to this portion of the resource descriptor. > + > + RangeLength: Evaluates to a 32-bit integer that specifies the total number > of > + bytes decoded in the memory range. The 32-bit field DescriptorName. > _LEN is > + automatically created to refer to this portion of the resource descriptor. > + > + DescriptorName: Is an optional argument that specifies a name for an > integer > + constant that will be created in the current scope that contains the offset > + of this resource descriptor within the current resource template buffer. > The > + predefined descriptor field names may be appended to this name to > access > + individual fields within the descriptor via the Buffer Field operators. > + > + Description: > + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit > memory > + descriptor, which describes a fixed range of memory addresses. The > format of > + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory > Range > + Descriptor. The macro is designed to be used inside of a > ResourceTemplate. > + > + Generates: > + 6.4.3.4 32-Bit Fixed Memory Range Descriptor > + Type 1, Large Item Value 0x6 > + This memory range descriptor describes a device's memory resources > within a > + 32-bit address space. > + > + @param[in] ReadAndWrite, > + @param[in] AddressBase, > + @param[in] RangeLength, > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed memory resource > descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPMemory32Fixed ( > + IN READ_WRITE_FLAG ReadAndWrite, > + IN UINT32 AddressBase, > + IN UINT32 RangeLength, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *Descriptor; > + > + if ((ReadAndWrite & (UINT8) > ~EFI_ACPI_MEMORY_WRITE_STATUS_MASK) != 0) { > + // Invalid ReadAndWrite value > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ReadAndWrite '%x' is not valid.\n", > __func__, ReadAndWrite)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (ListHead == NULL) { > + // Invalid > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot > == NULL.\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", > __func__, "MEMORY_32_FIXED_RESOURCE")); > + goto Done; > + } > + > + Object->DataSize = sizeof > (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "MEMORY_32_FIXED_RESOURCE")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = > (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *)Object->Data; > + Descriptor->Header.Header.Byte = > ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR; > + Descriptor->Header.Length = sizeof > (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR) - > + sizeof (ACPI_LARGE_RESOURCE_HEADER); > + Descriptor->Information = ReadAndWrite; > + Descriptor->BaseAddress = AddressBase; > + Descriptor->Length = RangeLength; > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, TranslationType, > + TranslationDensity) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] ISARanges, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + TranslationDensity - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordIO buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordIO ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT8 ISARanges, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + // TranslationDensity - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + if (ISARanges == 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } else if (ISARanges > 3) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPQWordAddressSpace ( > + ACPI_ADDRESS_SPACE_TYPE_IO, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + (ISARanges), > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/** > + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, > Cacheable, > + ReadAndWrite, AddressGranularity, AddressMinimum, > AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, MemoryRangeType, > TranslationType) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Cacheable, > + @param[in] ReadAndWrite, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + MemoryRangeType - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed QWordMemory > buffer > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPQWordMemory ( > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Cacheable, > + IN UINT8 ReadAndWrite, > + IN UINT64 AddressGranularity, > + IN UINT64 AddressMinimum, > + IN UINT64 AddressMaximum, > + IN UINT64 AddressTranslation, > + IN UINT64 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // MemoryRangeType - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + // Validate Type Specific Parameters > + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != > 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter > 0x%X\n", __func__, (Cacheable & > ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((ReadAndWrite & > ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPQWordAddressSpace ( > + ACPI_ADDRESS_SPACE_TYPE_MEM, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + (Cacheable | ReadAndWrite), > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/* > + Internal function to create DWord Address Space Descriptors > + > + This function only requires a single call and therefore no Phases > + Generates: > + 6.4.3.5.3 Word Address Space Descriptor > + Type 1, Large Item Value 0x8 > + The WORD address space descriptor is used to report resource usage in a > + 16-bit address space (like memory and I/O, Bus Number). > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordSpace > Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +*/ > +EFI_STATUS > +EFIAPI > +InternalAmlOPWordAddressSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; > + > + // Vaidate General Flags Input > + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid ResourceUsage > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid Decode Parameter\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMinFixed > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMaxFixed > Parameter\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlAddressSpaceCheck ( > + IsMinFixed, > + IsMaxFixed, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + RangeLength > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Address Space Check > FAILED\n", __func__)); > + return Status; > + } > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, > "WORD_ADDRESS")); > + goto Done; > + } > + > + Object->DataSize = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, > "DWORD_ADDRESS")); > + Status = EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + Descriptor = (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR > *)Object->Data; > + Descriptor->Header.Header.Byte = > ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR; > + Descriptor->Header.Length = sizeof > (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR) - > + sizeof (ACPI_LARGE_RESOURCE_HEADER); > + Descriptor->ResType = ResourceType; > + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; > + Descriptor->SpecificFlag = TypeSpecificFlags; > + Descriptor->AddrSpaceGranularity = AddressGranularity; > + Descriptor->AddrRangeMin = AddressMinimum; > + Descriptor->AddrRangeMax = AddressMaximum; > + Descriptor->AddrTranslationOffset = AddressTranslation; > + Descriptor->AddrLen = RangeLength; > + Object->Completed = TRUE; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + } > + > + return Status; > +} > + > +/** > + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) > + > + This function only requires a single call and therefore no Phases > + Syntax > + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, > IsMaxFixed, > + TypeSpecificFlags, AddressGranularity, AddressMinimum, > + AddressMaximum, AddressTranslation, RangeLength, > + ResourceSourceIndex, ResourceSource, DescriptorName) > + > + Generates: > + 6.4.3.5.3 Word Address Space Descriptor > + Type 1, Large Item Value 0x8 > + > + @param[in] ResourceType > + @param[in] ResourceUsage, > + @param[in] Decode, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] TypeSpecificFlags, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordSpace > Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordSpace ( > + IN UINT8 ResourceType, > + IN UINT8 ResourceUsage, > + IN UINT8 Decode, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 TypeSpecificFlags, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. > + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPWordAddressSpace ( > + ResourceType, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + TypeSpecificFlags, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/** > + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordBusNumber > + Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordBusNumber ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + Status = InternalAmlOPWordAddressSpace ( > + ACPI_ADDRESS_SPACE_TYPE_BUS, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + 0, > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > + > +/** > + 19.6.151 WordIO (Word IO Resource Descriptor Macro) > + > + This function only requires a single call and therefore no Phases > + Syntax > + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, > + AddressGranularity, AddressMinimum, AddressMaximum, > + AddressTranslation, RangeLength, ResourceSourceIndex, > + ResourceSource, DescriptorName, TranslationType, TranslationDensity) > + > + defines for pass in parameters can be found in: > + MdePkg/Include/IndustryStandard/Acpi10.h > + > + @param[in] ResourceUsage, > + @param[in] IsMinFixed, > + @param[in] IsMaxFixed, > + @param[in] Decode, > + @param[in] ISARanges, > + @param[in] AddressGranularity, > + @param[in] AddressMinimum, > + @param[in] AddressMaximum, > + @param[in] AddressTranslation, > + @param[in] RangeLength, > + ResourceSourceIndex - NOT IMPLEMENTED > + ResourceSource - NOT IMPLEMENTED > + DescriptorName - NOT IMPLEMENTED > + TranslationType - NOT IMPLEMENTED > + TranslationDensity - NOT IMPLEMENTED > + @param[in,out] ListHead - Linked list has completed WordIO Descriptor > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPWordIO ( > + IN UINT8 ResourceUsage, > + IN UINT8 IsMinFixed, > + IN UINT8 IsMaxFixed, > + IN UINT8 Decode, > + IN UINT8 ISARanges, > + IN UINT16 AddressGranularity, > + IN UINT16 AddressMinimum, > + IN UINT16 AddressMaximum, > + IN UINT16 AddressTranslation, > + IN UINT16 RangeLength, > + // ResourceSourceIndex - NOT IMPLEMENTED > + // ResourceSource - NOT IMPLEMENTED > + // DescriptorName - NOT IMPLEMENTED > + // TranslationType - NOT IMPLEMENTED > + // TranslationDensity - NOT IMPLEMENTED > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + > + if (ISARanges == 0) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } else if (ISARanges > 3) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", > __func__)); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalAmlOPWordAddressSpace ( > + ACPI_ADDRESS_SPACE_TYPE_IO, > + ResourceUsage, > + Decode, > + IsMinFixed, > + IsMaxFixed, > + (ISARanges), > + AddressGranularity, > + AddressMinimum, > + AddressMaximum, > + AddressTranslation, > + RangeLength, > + ListHead > + ); > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatem > entOpcodes.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatem > entOpcodes.c > new file mode 100644 > index 0000000000..03201d0109 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatem > entOpcodes.c > @@ -0,0 +1,515 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_AMLSTATEMENTOPCODES_FILECODE > + > +/** > + Creates an Else object > + > + TermList must be created between AmlStart and AmlClose Phase > + > + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be > + supported and must be created with Else and If. > + > + DefElse := Nothing | <elseop pkglength termlist> > + ElseOp := 0xA1 > + > + EXAMPLE: > + AmlIf (AmlStart, ListHead); > + { > + { // Predicate > + AmlOpDataInteger (1, ListHead); > + } // Predicate > + { // TermList > + ... > + } // TermList > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + { > + AmlIf (AmlStart, ListHead); > + { > + {} // Predicate > + {} // Termlist > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + {} // TermList > + AmlElse (AmlClose, ListHead); > + } > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed AmlElse Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlElse ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, "Else", ListHead); > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); > + goto Done; > + } > + > + // DataRefObject is outside the scope of this object > + break; > + case AmlClose: > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", > __func__)); > + goto Done; > + } > + > + // DataRefObject should be closed already > + Status = InternalAmlLocateObjectByIdentifier (&Object, "Else", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", > __func__)); > + goto Done; > + } > + > + // Handle Return with no arguments > + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { > + Status = EFI_DEVICE_ERROR; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a > Predicate\n", __func__)); > + goto Done; > + } > + > + // Allocate buffer for Return object > + Object->Data = AllocatePool (ChildObject->DataSize + 1); > + Object->DataSize = ChildObject->DataSize + 1; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", > __func__)); > + goto Done; > + } > + > + // Fill out Return object > + Object->Data[0] = AML_ELSE_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a If object > + > + Predicate and TermList must be created between AmlStart and AmlClose > Phase > + > + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be > + supported and must be created with Else and If. > + > + DefIfElse := IfOp PkgLength Predicate TermList DefElse > + IfOp := 0xA0 > + Predicate := TermArg => Integer > + > + EXAMPLE: > + AmlIf (AmlStart, ListHead); > + { > + { // Predicate > + AmlOpDataInteger (1, ListHead); > + } // Predicate > + { // TermList > + ... > + } // TermList > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + { > + AmlIf (AmlStart, ListHead); > + { > + {} // Predicate > + {} // Termlist > + } > + AmlIf (AmlClose, ListHead); > + AmlElse (AmlStart, ListHead); > + {} // TermList > + AmlElse (AmlClose, ListHead); > + } > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed AmlIf Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlIf ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, "If", ListHead); > + > + // Start required PkgLength > + Status = AmlPkgLength (AmlStart, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); > + goto Done; > + } > + > + // DataRefObject is outside the scope of this object > + break; > + case AmlClose: > + // Close required PkgLength before finishing Object > + Status = AmlPkgLength (AmlClose, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", > __func__)); > + goto Done; > + } > + > + // DataRefObject should be closed already > + Status = InternalAmlLocateObjectByIdentifier (&Object, "If", ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", > __func__)); > + goto Done; > + } > + > + // Handle Return with no arguments > + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { > + Status = EFI_DEVICE_ERROR; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a > Predicate\n", __func__)); > + goto Done; > + } > + > + // Allocate buffer for Return object > + Object->Data = AllocatePool (ChildObject->DataSize + 1); > + Object->DataSize = ChildObject->DataSize + 1; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", > __func__)); > + goto Done; > + } > + > + // Fill out Return object > + Object->Data[0] = AML_IF_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Notify object > + > + DefNotify := NotifyOp NotifyObject NotifyValue > + NotifyOp := 0x86 > + NotifyObject := SuperName => ThermalZone | Processor | Device > + NotifyValue := TermArg => Integer > + > + @param[in] NotifyObject - String of Namestring to a device > + @param[in] NotifyValue - Integer Notify value > + @param[in,out] ListHead - Linked list updated with Notify object > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlOPNotify ( > + IN CHAR8 *NotifyObject, > + IN UINT64 NotifyValue, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + Status = InternalAppendNewAmlObject (&Object, NotifyObject, ListHead); > + Status = AmlOPNameString (NotifyObject, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyObject > NameString\n", __func__)); > + goto Done; > + } > + > + Status = AmlOPDataInteger (NotifyValue, ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyValue > Integer\n", __func__)); > + goto Done; > + } > + > + Status = InternalAmlLocateObjectByIdentifier (&Object, NotifyObject, > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); > + goto Done; > + } > + > + // Allocate buffer for Return object > + Object->Data = AllocatePool (ChildObject->DataSize + 1); > + Object->DataSize = ChildObject->DataSize + 1; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", > __func__)); > + goto Done; > + } > + > + // Fill out Return object > + Object->Data[0] = AML_NOTIFY_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > + > +/** > + Creates a Return object > + > + Object must be created between AmlStart and AmlClose Phase > + > + DefReturn := ReturnOp ArgObject > + ReturnOp := 0xA4 > + ArgObject := TermArg => DataRefObject > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlReturn ( > + IN AML_FUNCTION_PHASE Phase, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, "Return", ListHead); > + // DataRefObject is outside the scope of this object > + break; > + case AmlClose: > + // DataRefObject should be closed already > + Status = InternalAmlLocateObjectByIdentifier (&Object, "Return", > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", > __func__)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", > __func__)); > + goto Done; > + } > + > + // Handle Return with no arguments > + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { > + // Return without arguments is treated like Return(0) > + // Zeroed byte = ZeroOp > + ChildObject->Data = AllocateZeroPool (sizeof (UINT8)); > + if (ChildObject->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Zero Child for Return\n", > __func__)); > + goto Done; > + } > + > + ChildObject->DataSize = 1; > + } > + > + // Allocate buffer for Return object > + Object->Data = AllocatePool (ChildObject->DataSize + 1); > + Object->DataSize = ChildObject->DataSize + 1; > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", > __func__)); > + goto Done; > + } > + > + // Fill out Return object > + Object->Data[0] = AML_RETURN_OP; > + CopyMem ( > + &Object->Data[1], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c > new file mode 100644 > index 0000000000..c9a4399764 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c > @@ -0,0 +1,213 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLTABLE_FILECODE > + > +// String Length Constants > +#define OEM_ID_LENGTH 6 > +#define OEM_TABLE_ID_LENGTH 8 > +#define SIGNATURE_LENGTH 4 > +#define CREATOR_ID_LENGTH 4 > + > +/** > + Creates an AML Encoded Table > + Object must be created between AmlStart and AmlClose Phase > + > + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum > OemID > + OemTableID OemRevision CreatorID CreatorRevision > + > + TableSignature := DWordData // As defined in section 5.2.3. > + TableLength := DWordData // Length of the table in bytes including > the > + // block header > + SpecCompliance := ByteData // The revision of the structure. > + CheckSum := ByteData // Byte checksum of the entire table. > + OemID := ByteData(6) // OEM ID of up to 6 characters. > + // If the OEM ID is shorter than 6 > + // characters, it can be terminated with a > + // NULL character. > + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. > + // If the OEM Table ID is shorter than > + // 8 characters, it can be terminated with > + // a NULL character. > + OemRevision := DWordData // OEM Table Revision. > + CreatorID := DWordData // Vendor ID of the ASL compiler. > + CreatorRevision := DWordData // Revision of the ASL compiler. > + > + @param[in] Phase - Either AmlStart or AmlClose > + @param[in] TableNameString - Table Name > + @param[in] ComplianceRev - Compliance Revision > + @param[in] OemId - OEM ID > + @param[in] OemTableId - OEM ID of table > + @param[in] OemRevision - OEM Revision number > + @param[in] CreatorId - Vendor ID of the ASL compiler > + @param[in] CreatorRevision - Vendor Revision of the ASL compiler > + @param[in,out] ListHead - Linked list has completed String Object after > + AmlClose. > + > + @retval EFI_SUCCESS > + @retval Error status > +**/ > +EFI_STATUS > +EFIAPI > +AmlDefinitionBlock ( > + IN AML_FUNCTION_PHASE Phase, > + IN CHAR8 *TableNameString, > + IN UINT8 ComplianceRev, > + IN CHAR8 *OemId, > + IN CHAR8 *OemTableId, > + IN UINT32 OemRevision, > + IN CHAR8 *CreatorId, > + IN UINT32 CreatorRevision, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINTN ChildCount; > + > + if ((Phase >= AmlInvalid) || > + (ListHead == NULL) || > + (TableNameString == NULL) || > + (OemId == NULL) || > + (OemTableId == NULL) || > + (CreatorId == NULL) || > + (AsciiStrLen (TableNameString) != SIGNATURE_LENGTH) || > + (AsciiStrLen (OemId) > OEM_ID_LENGTH) || > + (AsciiStrLen (OemTableId) > OEM_TABLE_ID_LENGTH) || > + (AsciiStrLen (CreatorId) != CREATOR_ID_LENGTH)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_DEVICE_ERROR; > + Object = NULL; > + ChildObject = NULL; > + > + switch (Phase) { > + case AmlStart: > + Status = InternalAppendNewAmlObject (&Object, TableNameString, > ListHead); > + // TermList is too complicated and must be added outside > + break; > + > + case AmlClose: > + // TermList should be closed already > + Status = InternalAmlLocateObjectByIdentifier (&Object, TableNameString, > ListHead); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate %a object\n", __func__, > TableNameString)); > + goto Done; > + } > + > + // Get rid of original Identifier data > + InternalFreeAmlObjectData (Object); > + > + // Collect child data and delete children > + Status = InternalAmlCollapseAndReleaseChildren ( > + &ChildObject, > + &ChildCount, > + &Object->Link, > + ListHead > + ); > + if (EFI_ERROR (Status) || > + (ChildObject->Data == NULL) || > + (ChildObject->DataSize == 0)) > + { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, > TableNameString)); > + goto Done; > + } > + > + Object->DataSize = ChildObject->DataSize + sizeof > (EFI_ACPI_DESCRIPTION_HEADER); > + Object->Data = AllocateZeroPool (Object->DataSize); > + if (Object->Data == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", > __func__, TableNameString)); > + goto Done; > + } > + > + // Fill table header with data > + // Signature > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, > Signature)], > + TableNameString, > + AsciiStrLen (TableNameString) > + ); > + > + // Table Length > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Length)], > + (UINT32 *)&Object->DataSize, > + sizeof (UINT32) > + ); > + > + // ACPI Table Version > + Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Revision)] = > ComplianceRev; > + > + // OEM ID > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemId)], > + OemId, > + AsciiStrLen (OemId) > + ); > + > + // OEM Table ID > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, > OemTableId)], > + OemTableId, > + AsciiStrLen (OemTableId) > + ); > + > + // OEM Table Version > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, > OemRevision)], > + (UINT8 *)&OemRevision, > + sizeof (UINT32) > + ); > + > + // Creator ID > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, > CreatorId)], > + CreatorId, > + AsciiStrLen (CreatorId) > + ); > + > + // Creator Version > + CopyMem ( > + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, > CreatorRevision)], > + (UINT8 *)&CreatorRevision, > + sizeof (UINT32) > + ); > + > + // Copy rest of data into Object > + CopyMem ( > + &Object->Data[sizeof (EFI_ACPI_DESCRIPTION_HEADER)], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + > + // Checksum Set on Table Install > + InternalFreeAmlObject (&ChildObject, ListHead); > + Object->Completed = TRUE; > + Status = EFI_SUCCESS; > + break; > + > + default: > + Status = EFI_DEVICE_ERROR; > + break; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + InternalFreeAmlObject (&ChildObject, ListHead); > + } > + > + return Status; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlO > bjects.c > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlO > bjects.c > new file mode 100644 > index 0000000000..b1ad9b7037 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlO > bjects.c > @@ -0,0 +1,364 @@ > +/** @file > + > + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "LocalAmlLib.h" > +#include <Filecode.h> > + > +#define FILECODE > LIBRARY_DXEAMLGENERATIONLIB_LOCALAMLOBJECTS_FILECODE > + > +/** > + Free Object->Data > + > + Frees Object->Data, Nulls pointer, zeros size and marks > + Object->Completed = FALSE > + > + @param [in] Object - Pointer to Object to have Data freed > + > + @return EFI_SUCCESS - Object Freed > + @return <all others> - Object free failed > +**/ > +EFI_STATUS > +EFIAPI > +InternalFreeAmlObjectData ( > + IN AML_OBJECT_INSTANCE *Object > + ) > +{ > + if (Object == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (Object->Data != NULL) { > + FreePool (Object->Data); > + Object->Data = NULL; > + Object->DataSize = 0; > + Object->Completed = FALSE; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Free an Object > + > + Removes Object from it's linked list. > + Frees Object->Data > + Frees Object > + > + @param [in] Object - Pointer to Object to be freed > + @param [in,out] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object Freed > + @return <all others> - Object free failed > +**/ > +EFI_STATUS > +EFIAPI > +InternalFreeAmlObject ( > + IN AML_OBJECT_INSTANCE **FreeObject, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + AML_OBJECT_INSTANCE *Object; > + > + if ((FreeObject == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Object = *FreeObject; > + if (Object != NULL) { > + InternalFreeAmlObjectData (Object); > + if (IsNodeInList (ListHead, &Object->Link)) { > + RemoveEntryList (&Object->Link); > + } > + > + FreePool (Object); > + } > + > + *FreeObject = NULL; > + return EFI_SUCCESS; > +} > + > +/** > + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and > + Object->DataSize will be 0 > + > + Allocates AML_OBJECT_INSTANCE which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object > + > + @return EFI_SUCCESS - Object created and appended to linked list > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalNewAmlObjectNoData ( > + OUT AML_OBJECT_INSTANCE **ReturnObject > + ) > +{ > + AML_OBJECT_INSTANCE *Object; > + > + if (ReturnObject == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + *ReturnObject = NULL; > + > + // Allocate AML Object > + Object = AllocateZeroPool (sizeof (AML_OBJECT_INSTANCE)); > + if (Object == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Object Failed\n", > __func__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + Object->DataSize = 0; > + Object->Data = NULL; > + Object->Signature = AML_OBJECT_INSTANCE_SIGNATURE; > + > + *ReturnObject = Object; > + return EFI_SUCCESS; > +} > + > +/** > + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object- > >Data > + will be NULL and Object->DataSize will be 0 > + > + Allocates AML_OBJECT_INSTANCE which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object > + @param [in,out] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object created and appended to linked list > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAppendNewAmlObjectNoData ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if ((ListHead == NULL) || (ReturnObject == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = InternalNewAmlObjectNoData (&Object); > + if (!EFI_ERROR (Status)) { > + InsertTailList (ListHead, &Object->Link); > + *ReturnObject = Object; > + } > + > + return Status; > +} > + > +/** > + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a > + string Identifier for comparison purposes > + > + Allocates AML_OBJECT_INSTANCE which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object > + @param [in] Identifier - String Identifier to create object with > + @param [in,out] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object created and appended to linked list > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAppendNewAmlObject ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN CHAR8 *Identifier, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_INSTANCE *Object; > + > + if ((Identifier == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Object = NULL; > + > + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); > + if (EFI_ERROR (Status)) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // Allocate Identifier Data + NULL termination > + Object->DataSize = AsciiStrLen (Identifier) + 1; > + Object->Data = AllocatePool (Object->DataSize); > + if (Object->Data == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Data Identifier=%a\n", > __func__, Identifier)); > + InternalFreeAmlObject (&Object, ListHead); > + return EFI_OUT_OF_RESOURCES; > + } > + > + CopyMem (Object->Data, Identifier, Object->DataSize); > + > + *ReturnObject = Object; > + return EFI_SUCCESS; > +} > + > +/** > + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in > the > + AML_OBJECT_INSTANCE linked list > + > + @param [out] ReturnObject - Pointer to an Object > + @param [in] Identifier - String Identifier to create object with > + @param [in] ListHead - Head of AML Object linked list > + > + @return EFI_SUCCESS - Object located and returned > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlLocateObjectByIdentifier ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + IN CHAR8 *Identifier, > + IN LIST_ENTRY *ListHead > + ) > +{ > + LIST_ENTRY *Node; > + AML_OBJECT_INSTANCE *Object; > + UINTN IdentifierSize; > + > + if ((Identifier == NULL) || (ListHead == NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Object = NULL; > + *ReturnObject = NULL; > + > + IdentifierSize = AsciiStrLen (Identifier) + 1; > + // Look Backwards and find Node for this Object > + Node = ListHead; > + do { > + Node = GetPreviousNode (ListHead, Node); > + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + > + if (Object->Completed) { > + // Object to be found cannot be completed yet > + continue; > + } else { > + if ((Object->DataSize != 0) && > + (Object->DataSize == IdentifierSize) && > + (CompareMem ( > + Object->Data, > + Identifier, > + MAX (Object->DataSize, IdentifierSize) > + ) == 0)) > + { > + *ReturnObject = Object; > + return EFI_SUCCESS; > + } else { > + DEBUG (( > + DEBUG_ERROR, > + "%a: ERROR: First incomplete Object is not %a.\n", > + __func__, > + Identifier > + )); > + // Object looking for should be the first uncompleted Object. > + return EFI_NOT_FOUND; > + } > + } > + } while (Node != ListHead); > + > + *ReturnObject = NULL; > + return EFI_NOT_FOUND; > +} > + > +/** > + Finds all children of the Link and appends them into a single ObjectData > + buffer of ObjectDataSize > + > + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller > + > + @param [out] ReturnObject - Pointer to an Object pointer > + @param [out] ChildCount - Count of Child Objects collapsed > + @param [in] Link - Linked List Object entry to collect children > + @param [in,out] ListHead - Head of Object Linked List > + > + @return EFI_SUCCESS - ChildObject created and returned > + @return <all others> - Object creation failed, Object = NULL > +**/ > +EFI_STATUS > +EFIAPI > +InternalAmlCollapseAndReleaseChildren ( > + OUT AML_OBJECT_INSTANCE **ReturnObject, > + OUT UINTN *ChildCount, > + IN LIST_ENTRY *Link, > + IN OUT LIST_ENTRY *ListHead > + ) > +{ > + EFI_STATUS Status; > + LIST_ENTRY *Node; > + AML_OBJECT_INSTANCE *Object; > + AML_OBJECT_INSTANCE *ChildObject; > + UINT8 *TempBuffer; > + > + Status = EFI_SUCCESS; > + if ((ReturnObject == NULL) || > + (ChildCount == NULL) || > + (Link == NULL) || > + (ListHead == NULL)) > + { > + return EFI_INVALID_PARAMETER; > + } > + > + *ChildCount = 0; > + > + Status = InternalNewAmlObjectNoData (&Object); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocating Object Data\n", > __func__)); > + goto Done; > + } > + > + // Get first Child Node > + Node = GetNextNode (ListHead, Link); > + while (Node != ListHead) { > + ChildObject = AML_OBJECT_INSTANCE_FROM_LINK (Node); > + // Expand data buffer to fit existing data + new data > + TempBuffer = ReallocatePool ( > + Object->DataSize, > + Object->DataSize + ChildObject->DataSize, > + Object->Data > + ); > + if (TempBuffer == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + FreePool (Object->Data); > + Object->Data = NULL; > + DEBUG ((DEBUG_ERROR, "%a: ERROR: reallocating Object Data\n", > __func__)); > + goto Done; > + } > + > + Object->Data = TempBuffer; > + // Copy new data at end of buffer > + CopyMem ( > + &Object->Data[Object->DataSize], > + ChildObject->Data, > + ChildObject->DataSize > + ); > + Object->DataSize += ChildObject->DataSize; > + // Get Next ChildObject Node, then free ChildObject from list > + Node = GetNextNode (ListHead, Node); > + InternalFreeAmlObject (&ChildObject, ListHead); > + *ChildCount = *ChildCount + 1; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + InternalFreeAmlObject (&Object, ListHead); > + Object = NULL; > + } > + > + *ReturnObject = Object; > + return Status; > +} > diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c > b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c > new file mode 100644 > index 0000000000..2f4f676adb > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c > @@ -0,0 +1,13 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +/*---------------------------------------------------------------------------------------- > + * M O D U L E S U S E D > + *---------------------------------------------------------------------------------------- > + */ > +#include <Filecode.h> > diff --git > a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseR > esetSystemLib.c > b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseR > esetSystemLib.c > new file mode 100644 > index 0000000000..60305ee4a6 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseR > esetSystemLib.c > @@ -0,0 +1,90 @@ > +/** @file > + Library to support reset library, inheritted from Agesa Cf9Reset module. > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > +#include <Library/IoLib.h> > +#include <Library/DebugLib.h> > +#include <Library/PcdLib.h> > + > +/** > + This function causes a system-wide reset (cold reset), in which > + all circuitry within the system returns to its initial state. This type of reset > + is asynchronous to system operation and operates without regard to > + cycle boundaries. > + > + If this function returns, it means that the system does not support cold reset. > +**/ > +VOID > +EFIAPI > +ResetCold ( > + VOID > + ) > +{ > +} > + > +/** > + This function causes a system-wide initialization (warm reset), in which all > processors > + are set to their initial state. Pending cycles are not corrupted. > + > + If this function returns, it means that the system does not support warm > reset. > +**/ > +VOID > +EFIAPI > +ResetWarm ( > + VOID > + ) > +{ > +} > + > +/** > + This function causes the system to enter a power state equivalent > + to the ACPI G2/S5 or G3 states. > + > + If this function returns, it means that the system does not support shutdown > reset. > +**/ > +VOID > +EFIAPI > +ResetShutdown ( > + VOID > + ) > +{ > +} > + > +/** > + This function causes the system to enter S3 and then wake up immediately. > + > + If this function returns, it means that the system does not support S3 > feature. > +**/ > +VOID > +EFIAPI > +EnterS3WithImmediateWake ( > + VOID > + ) > +{ > +} > + > +/** > + This function causes a systemwide reset. The exact type of the reset is > + defined by the EFI_GUID that follows the Null-terminated Unicode string > passed > + into ResetData. If the platform does not recognize the EFI_GUID in > ResetData > + the platform must pick a supported reset type to perform.The platform may > + optionally log the parameters from any non-normal reset that occurs. > + > + @param[in] DataSize The size, in bytes, of ResetData. > + @param[in] ResetData The data buffer starts with a Null-terminated string, > + followed by the EFI_GUID. > +**/ > +VOID > +EFIAPI > +ResetPlatformSpecific ( > + IN UINTN DataSize, > + IN VOID *ResetData > + ) > +{ > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c > b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c > new file mode 100644 > index 0000000000..d10e676668 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c > @@ -0,0 +1,87 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <Filecode.h> > +#include <Uefi.h> > +/*----------------------------------------------------------------------------------------*/ > + > +/** > + * @param[in] EspiBase Espi MMIO base > + * @param[in] RegAddr Slave register address > + * > + * @retval Register Value > + */ > +UINT32 > +FchEspiCmd_GetConfiguration ( > + IN UINT32 EspiBase, > + IN UINT32 RegAddr > + ) > +{ > + return 0; > +} > + > +/*----------------------------------------------------------------------------------------*/ > + > +/** > + * > + * @param[in] EspiBase Espi MMIO base > + * @param[in] Address Address to read > + * @param[in] Length Length in byte to read > + * @param[in] Buffer Pointer to the data read to > + * > + */ > +EFI_STATUS > +FchEspiCmd_SafsFlashRead ( > + IN UINT32 EspiBase, > + IN UINT32 Address, > + IN UINT32 Length, > + OUT UINT8 *Buffer > + ) > +{ > + return EFI_SUCCESS; > +} > + > +/*----------------------------------------------------------------------------------------*/ > + > +/** > + * > + * @param[in] EspiBase Espi MMIO base > + * @param[in] Address Address to write > + * @param[in] Length Length in byte to write > + * @param[in] Value Pointer to the data to write > + * > + */ > +EFI_STATUS > +FchEspiCmd_SafsFlashWrite ( > + IN UINT32 EspiBase, > + IN UINT32 Address, > + IN UINT32 Length, > + IN UINT8 *Value > + ) > +{ > + return EFI_SUCCESS; > +} > + > +/*----------------------------------------------------------------------------------------*/ > + > +/** > + * > + * @param[in] EspiBase Espi MMIO base > + * @param[in] Address Address to erase > + * @param[in] Length Block Size to erase > + * > + * > + */ > +EFI_STATUS > +FchEspiCmd_SafsFlashErase ( > + IN UINT32 EspiBase, > + IN UINT32 Address, > + IN UINT32 Length > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c > b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c > new file mode 100755 > index 0000000000..9044d3d497 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c > @@ -0,0 +1,68 @@ > +/** @file > + GNB function to create/locate PCIe configuration data area, Contain code > + that create/locate/manages GNB/PCIe configuration > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <GnbDxio.h> > +#include <Library/NbioHandleLib.h> > +#include <Library/AmdBaseLib.h> > + > +/** > + Get GNB handle > + > + @param[in] Pcie Pointer to global PCIe configuration > + > +**/ > +GNB_HANDLE * > +NbioGetHandle ( > + IN PCIE_PLATFORM_CONFIG *Pcie > + ) > +{ > + return NULL; > +} > + > +/** > + Get GNB handle of alternate host bridge (e.g. MI200) > + > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +GNB_HANDLE * > +NbioGetAltHandle ( > + IN PCIE_PLATFORM_CONFIG *Pcie > + ) > +{ > + return NULL; > +} > + > +/** > + Get GNB handle of next socket > + > + @param[in] NbioHandle Pointer to current GnbHandle > +**/ > +GNB_HANDLE * > +NbioGetNextSocket ( > + IN GNB_HANDLE *NbioHandle > + ) > +{ > + return NULL; > +} > + > +/** > + Get PCI_ADDR of GNB > + > + @param[in] Handle Pointer to GNB_HANDLE > +**/ > +PCI_ADDR > +NbioGetHostPciAddress ( > + IN GNB_HANDLE *Handle > + ) > +{ > + PCI_ADDR PciAddr; > + > + PciAddr.AddressValue = 0; > + return PciAddr; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c > b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c > new file mode 100755 > index 0000000000..d5fbe98d22 > --- /dev/null > +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c > @@ -0,0 +1,276 @@ > +/** @file > + GNB function to create/locate PCIe configuration data area > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <GnbDxio.h> > +#include <Library/AmdBaseLib.h> > +#include <Library/GnbPcieConfigLib.h> > + > +/** > + Check Port Status > + > + @param[in] Engine Pointer to engine config descriptor > + @param[in] PortStatus Check if status asserted for port > + @retval TRUE if status asserted > +**/ > +BOOLEAN > +PcieConfigCheckPortStatus ( > + IN PCIE_ENGINE_CONFIG *Engine, > + IN UINT32 PortStatus > + ) > +{ > + return FALSE; > +} > + > +/** > + Set/Reset port status > + > + @param[in] Engine Pointer to engine config descriptor > + @param[in] SetStatus SetStatus > + @param[in] ResetStatus ResetStatus > + > +**/ > +UINT16 > +PcieConfigUpdatePortStatus ( > + IN PCIE_ENGINE_CONFIG *Engine, > + IN PCIE_ENGINE_INIT_STATUS SetStatus, > + IN PCIE_ENGINE_INIT_STATUS ResetStatus > + ) > +{ > + return 0; > +} > + > +/** > + Execute callback on all descriptor of specific type > + > + @param[in] InDescriptorFlags Include descriptor flags > + @param[in] OutDescriptorFlags Exclude descriptor flags > + @param[in] TerminationFlags Termination flags > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +AGESA_STATUS > +PcieConfigRunProcForAllDescriptors ( > + IN UINT32 InDescriptorFlags, > + IN UINT32 OutDescriptorFlags, > + IN UINT32 TerminationFlags, > + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ) > +{ > + return AGESA_UNSUPPORTED; > +} > + > +/** > + Execute callback on all wrappers in topology > + > + @param[in] DescriptorFlags Wrapper Flags > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +AGESA_STATUS > +PcieConfigRunProcForAllWrappers ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ) > +{ > + return AGESA_UNSUPPORTED; > +} > + > +/** > + Execute callback on all wrappers in NBIO > + > + > + @param[in] DescriptorFlags Wrapper Flags > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigRunProcForAllWrappersInNbio ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, > + IN OUT VOID *Buffer, > + IN GNB_HANDLE *GnbHandle > + ) > +{ > +} > + > +/** > + Execute callback on all engine in topology > + > + @param[in] DescriptorFlags Engine flags. > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigRunProcForAllEngines ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, > + IN OUT VOID *Buffer, > + IN PCIE_PLATFORM_CONFIG *Pcie > + ) > +{ > +} > + > +/** > + Execute callback on all engine in wrapper > + > + @param[in] DescriptorFlags Engine flags. > + @param[in] Callback Pointer to callback function > + @param[in, out] Buffer Pointer to buffer to pass information to > callback > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigRunProcForAllEnginesInWrapper ( > + IN UINT32 DescriptorFlags, > + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, > + IN OUT VOID *Buffer, > + IN PCIE_WRAPPER_CONFIG *Wrapper > + ) > +{ > +} > + > +/** > + Get parent descriptor of specific type > + > + @param[in] Type Descriptor type > + @param[in] Descriptor Pointer to buffer to pass information to > callback > +**/ > +PCIE_DESCRIPTOR_HEADER * > +PcieConfigGetParent ( > + IN UINT32 Type, > + IN PCIE_DESCRIPTOR_HEADER *Descriptor > + ) > +{ > + return NULL; > +} > + > +/** > + Get child descriptor of specific type > + > + @param[in] Type Descriptor type > + @param[in] Descriptor Pointer to buffer to pass information to > callback > +**/ > +PCIE_DESCRIPTOR_HEADER * > +PcieConfigGetChild ( > + IN UINT32 Type, > + IN PCIE_DESCRIPTOR_HEADER *Descriptor > + ) > +{ > + return NULL; > +} > + > +/** > + Get peer descriptor of specific type > + > + @param[in] Type Descriptor type > + @param[in] Descriptor Pointer to buffer to pass information to > callback > +**/ > +PCIE_DESCRIPTOR_HEADER * > +PcieConfigGetPeer ( > + IN UINT32 Type, > + IN PCIE_DESCRIPTOR_HEADER *Descriptor > + ) > +{ > + return NULL; > +} > + > +/** > + Check is engine is active or potentially active > + > + @param[in] Engine Pointer to engine descriptor > + @retval TRUE - engine active > + @retval FALSE - engine not active > +**/ > +BOOLEAN > +PcieConfigIsActivePcieEngine ( > + IN PCIE_ENGINE_CONFIG *Engine > + ) > +{ > + return FALSE; > +} > + > +/** > + Locate SB engine on wrapper > + > + @param[in] Wrapper Pointer to wrapper config descriptor > + @retval SB engine pointer or NULL > +**/ > +PCIE_ENGINE_CONFIG * > +PcieConfigLocateSbEngine ( > + IN PCIE_WRAPPER_CONFIG *Wrapper > + ) > +{ > + return NULL; > +} > + > +/** > + Helper function to dump engine configuration > + > + @param[in] EngineList Engine Configuration > +**/ > +VOID > +PcieConfigEngineDebugDump ( > + IN PCIE_ENGINE_CONFIG *EngineList > + ) > +{ > +} > + > +/** > + Helper function to dump wrapper configuration > + > + @param[in] WrapperList Wrapper Configuration > +**/ > +VOID > +PcieConfigWrapperDebugDump ( > + IN PCIE_WRAPPER_CONFIG *WrapperList > + ) > +{ > +} > + > +/** > + Helper function to dump configuration to debug out > + > + @param[in] Pcie Pointer to global PCIe configuration > +**/ > +VOID > +PcieConfigDebugDump ( > + IN PCIE_PLATFORM_CONFIG *Pcie > + ) > +{ > +} > + > +/** > + Helper function to dump input configuration to user engine descriptor > + > + @param[in] EngineDescriptor Pointer to engine descriptor > +**/ > +VOID > +PcieUserDescriptorConfigDump ( > + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor > + ) > +{ > +} > + > +/** > + Helper function to dump input configuration to debug out > + > + @param[in] ComplexDescriptor Pointer to user defined complex > descriptor > +**/ > +VOID > +PcieUserConfigConfigDump ( > + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor > + ) > +{ > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib. > c > b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib. > c > new file mode 100755 > index 0000000000..5c6be22ee4 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib. > c > @@ -0,0 +1,117 @@ > +/** @file > + Procedure to parse PCIe input configuration data > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <GnbDxio.h> > + > +/** > + Get number of complexes in platform topology configuration > + > + @param[in] ComplexList First complex configuration in complex > configuration array > + @retval Number of Complexes > + > +**/ > +UINTN > +PcieInputParserGetNumberOfComplexes ( > + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList > + ) > +{ > + return 0; > +} > + > +/** > + Get number of PCIe engines in given complex > + > + @param[in] Complex Complex configuration > + @retval Number of Engines > +**/ > +UINTN > +PcieInputParserGetLengthOfPcieEnginesList ( > + IN PCIE_COMPLEX_DESCRIPTOR *Complex > + ) > +{ > + return 0; > +} > + > +/** > + Get number of DDI engines in given complex > + > + @param[in] Complex Complex configuration > + @retval Number of Engines > +**/ > +UINTN > +PcieInputParserGetLengthOfDdiEnginesList ( > + IN PCIE_COMPLEX_DESCRIPTOR *Complex > + ) > +{ > + return 0; > +} > + > +/** > + Get number of engines in given complex > + > + > + > + @param[in] Complex Complex configuration header > + @retval Number of Engines > +**/ > +UINTN > +PcieInputParserGetNumberOfEngines ( > + IN PCIE_COMPLEX_DESCRIPTOR *Complex > + ) > +{ > + return 0; > +} > + > +/** > + Get Complex descriptor by index from given Platform configuration > + > + @param[in] ComplexList Platform topology configuration > + @param[in] Index Complex descriptor Index > + @retval Pointer to Complex Descriptor > +**/ > +PCIE_COMPLEX_DESCRIPTOR * > +PcieInputParserGetComplexDescriptor ( > + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, > + IN UINTN Index > + ) > +{ > + return NULL; > +} > + > +/** > + Get Complex descriptor by index from given Platform configuration > + > + @param[in] ComplexList Platform topology configuration > + @param[in] SocketId Socket Id > + @retval Pointer to Complex Descriptor > +**/ > +PCIE_COMPLEX_DESCRIPTOR * > +PcieInputParserGetComplexDescriptorOfSocket ( > + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, > + IN UINT32 SocketId > + ) > +{ > + return NULL; > +} > + > +/** > + Get Engine descriptor from given complex by index > + > + @param[in] Complex Complex descriptor > + @param[in] Index Engine descriptor index > + @retval Pointer to Engine Descriptor > +**/ > +PCIE_ENGINE_DESCRIPTOR * > +PcieInputParserGetEngineDescriptor ( > + IN PCIE_COMPLEX_DESCRIPTOR *Complex, > + IN UINTN Index > + ) > +{ > + return NULL; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c > b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c > new file mode 100644 > index 0000000000..e6be32b071 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c > @@ -0,0 +1,10 @@ > +/** @file > + SMN Register Access Methods > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Library/SmnAccessLib.h> > diff --git > a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctio > ns.c > b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctio > ns.c > new file mode 100644 > index 0000000000..1dc13900c7 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctio > ns.c > @@ -0,0 +1,42 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <PiDxe.h> > +#include <GnbDxio.h> > +#include <Library/AmdBaseLib.h> > +#include <Library/PcieConfigLib.h> > +#include <Library/NbioCommonLibDxe.h> > + > +/** > + Function to retrieve SOC_LOGICAL_ID > + > + @param[out] LogicalId Pointer to SOC_LOGICAL_ID > + @retval EFI_UNSUPPORTED > + > +**/ > +EFI_STATUS > +PcieGetLogicalId ( > + OUT SOC_LOGICAL_ID *LogicalId > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Function to retrieve PCIE_PLATFORM_CONFIG > + > + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer > + @retval EFI_UNSUPPORTED > + > +**/ > +EFI_STATUS > +PcieGetPcieDxe ( > + OUT PCIE_PLATFORM_CONFIG **Pcie > + ) > +{ > + return EFI_UNSUPPORTED; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c > new file mode 100644 > index 0000000000..fbd3ddcf37 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c > @@ -0,0 +1,23 @@ > +/** @file > + APCB DXE Driver > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/PcdLib.h> > + > +EFI_STATUS > +EFIAPI > +AmdApcbV3DxeDriverEntry ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c > new file mode 100644 > index 0000000000..23d1a8fee0 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c > @@ -0,0 +1,29 @@ > +/** @file > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiPei.h> > + > +/** > + * @brief Amd Apcb V3 Pei Driver Entry > + * > + * @param[in] FileHandle File Handie > + * @param[in] PeiServices Pei Services > + * > + * @retval EFI_SUCCESS Set APCB value successfully > + * Non-EFI_SUCCESS Function Error > + * > + **/ > +EFI_STATUS > +EFIAPI > +AmdApcbV3PeiDriverEntry ( > + IN EFI_PEI_FILE_HANDLE FileHandle, > + IN CONST EFI_PEI_SERVICES **PeiServices > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oe > mAgesaCcxPlatformLibNull.c > b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oe > mAgesaCcxPlatformLibNull.c > new file mode 100644 > index 0000000000..74b129931b > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/Oe > mAgesaCcxPlatformLibNull.c > @@ -0,0 +1,39 @@ > +/** @file > + Required OEM hooks for CCX initialization > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > + > +/** > + Hook to store the vector that all APs should jump to out of reset to a non- > volatile, > + shared location. > + > + @param[in] ApInitAddress Address of the code that AP should jump to > + @param[in,out] ContentToRestore The current value in the non-volatile > storage > + > +**/ > +VOID > +SaveApInitVector ( > + IN UINT32 ApInitAddress, > + IN OUT UINT32 *ContentToRestore > + ) > +{ > +} > + > +/** > + Hook to restore the initial content of the non-volatile storage location. > + > + @param[in] ContentToRestore The value to restore > + > +**/ > +VOID > +RestoreContentVector ( > + IN UINT32 ContentToRestore > + ) > +{ > +} > diff --git > a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciEx > pressPciCfg2.c > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciEx > pressPciCfg2.c > new file mode 100644 > index 0000000000..54ce202cb1 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciEx > pressPciCfg2.c > @@ -0,0 +1,33 @@ > +/** @file > + > + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiPei.h> > +#include <Ppi/PciCfg2.h> > +#include <Library/BaseLib.h> > +#include <Library/PcdLib.h> > +#include <Library/DebugLib.h> > +#include <Library/IoLib.h> > + > +/** > + Module's entry function. > + This routine will install EFI_PEI_PCI_CFG2_PPI. > + > + @param FileHandle Handle of the file being invoked. > + @param PeiServices Describes the list of possible PEI Services. > + > + @return Whether success to install service. > +**/ > +EFI_STATUS > +EFIAPI > +PeimInitializePciCfg ( > + IN EFI_PEI_FILE_HANDLE FileHandle, > + IN CONST EFI_PEI_SERVICES **PeiServices > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentIn > foLib/PciSegmentInfoLib.c > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentIn > foLib/PciSegmentInfoLib.c > new file mode 100644 > index 0000000000..643174d7b9 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentIn > foLib/PciSegmentInfoLib.c > @@ -0,0 +1,30 @@ > +/** @file > + > + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Base.h> > +#include <Library/PciSegmentInfoLib.h> > +#include <Library/DebugLib.h> > +#include <Library/BaseLib.h> > + > +/** > + Return an array of PCI_SEGMENT_INFO holding the segment information. > + > + Note: The returned array/buffer is owned by callee. > + > + @param Count Return the count of segments. > + > + @retval A callee owned array holding the segment information. > +**/ > +PCI_SEGMENT_INFO * > +EFIAPI > +GetPciSegmentInfo ( > + UINTN *Count > + ) > +{ > + return (PCI_SEGMENT_INFO *)NULL; > +} > diff --git > a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/A > mdPspFlashAccSpiNorLibSmm.c > b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/ > AmdPspFlashAccSpiNorLibSmm.c > new file mode 100644 > index 0000000000..d83bb6c2d8 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/ > AmdPspFlashAccSpiNorLibSmm.c > @@ -0,0 +1,15 @@ > +/** @file > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <PiSmm.h> > +#include <Register/Cpuid.h> > +#include <Library/BaseLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/SmmServicesTableLib.h> > +#include <Library/DebugLib.h> > +#include <Protocol/SmmBase2.h> > +#include <Library/IoLib.h> > diff --git > a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRo > mArmorWhitelistLib.c > b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRo > mArmorWhitelistLib.c > new file mode 100644 > index 0000000000..a264eb9294 > --- /dev/null > +++ > b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRo > mArmorWhitelistLib.c > @@ -0,0 +1,12 @@ > +/** @file > + Platform ROM Armor Whitelist table > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <Library/DebugLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/PcdLib.h> > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c > new file mode 100644 > index 0000000000..e379538e3a > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c > @@ -0,0 +1,36 @@ > +/** @file > + OEM OOB PPR DXE Driver. > + > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <PiDxe.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <Protocol/PciIo.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/TimerLib.h> > +#include <IndustryStandard/Pci22.h> > + > +/** > +* This function installs a protocol used by platform BIOS to provide the > hotplug descriptor. > +* > +* @param[in] ImageHandle Image handler > +* @param[in] SystemTable Pointer to the system table > +* > +* @retval EFI_SUCCESS The thread was successfully launched. > +* > +**/ > +EFI_STATUS > +EFIAPI > +OobPprEntry ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriv > er/PspPlatformDriver.c > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriv > er/PspPlatformDriver.c > new file mode 100644 > index 0000000000..5242e6261a > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriv > er/PspPlatformDriver.c > @@ -0,0 +1,20 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <Library/BaseLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DebugLib.h> > + > +EFI_STATUS > +EFIAPI > +PspPlatformEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugD > xe/ServerHotplugDxe.c > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugD > xe/ServerHotplugDxe.c > new file mode 100644 > index 0000000000..530bd9d4b6 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugD > xe/ServerHotplugDxe.c > @@ -0,0 +1,22 @@ > +/** @file > + > + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <PiPei.h> > +#include <Library/BaseLib.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiLib.h> > +#include <Library/UefiBootServicesTableLib.h> > + > +EFI_STATUS > +EFIAPI > +HotplugDescEntry ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > DynamicCommand.c > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > DynamicCommand.c > new file mode 100644 > index 0000000000..fbc372586b > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > DynamicCommand.c > @@ -0,0 +1,44 @@ > +/** @file > + > + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +/** > + Entry point of Act Dynamic Command. > + > + Produce the DynamicCommand protocol to handle "act" command. > + > + @param ImageHandle The image handle of the process. > + @param SystemTable The EFI System Table pointer. > + > + @retval EFI_SUCCESS Act command is executed sucessfully. > + @retval EFI_ABORTED HII package was failed to initialize. > + @retval others Other errors when executing act command. > +**/ > +EFI_STATUS > +EFIAPI > +ActCommandInitialize ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > + > +/** > + Destructor for the library. free any resources. > + > + @param ImageHandle The image handle of the process. > + @param SystemTable The EFI System Table pointer. > +**/ > +EFI_STATUS > +EFIAPI > +ActLibraryUnregisterActCommand ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > ToolApp.c > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > ToolApp.c > new file mode 100644 > index 0000000000..0a5f4a7e81 > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAuto > ToolApp.c > @@ -0,0 +1,36 @@ > +/** @file > + String token ID of help message text. > + Shell supports to find help message in the resource section of an > + application image if * .MAN file is not found. > + This global variable is added to make build tool recognizes > + that the help string is consumed by user and then build tool will > + add the string into the resource section. > + Thus the application can use '-?' option to show help message in Shell. > + > + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +/** > + Entry point of Act Dynamic Command. > + > + Produce the DynamicCommand protocol to handle "act" command. > + > + @param ImageHandle The image handle of the process. > + @param SystemTable The EFI System Table pointer. > + > + @retval EFI_SUCCESS Act command is executed sucessfully. > + @retval EFI_ABORTED HII package was failed to initialize. > + @retval others Other errors when executing act command. > +**/ > +EFI_STATUS > +EFIAPI > +ActCommandInitialize ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmd > FchUart/BasePlatformHookLibAmdFchUart.c > b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmd > FchUart/BasePlatformHookLibAmdFchUart.c > new file mode 100644 > index 0000000000..47eb700f8f > --- /dev/null > +++ > b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmd > FchUart/BasePlatformHookLibAmdFchUart.c > @@ -0,0 +1,29 @@ > +/** @file > + > + Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Library/IoLib.h> > + > +/** > + Performs platform specific initialization required for the CPU to access > + the hardware associated with a SerialPortLib instance. This function does > + not intiailzie the serial port hardware itself. Instead, it initializes > + hardware devices that are required for the CPU to access the serial port > + hardware. This function may be called more than once. > + > + @retval RETURN_SUCCESS The platform specific initialization succeeded. > + @retval RETURN_DEVICE_ERROR The platform specific initialization could > not be completed. > + > +**/ > +RETURN_STATUS > +EFIAPI > +PlatformHookSerialPortInitialize ( > + VOID > + ) > +{ > + return RETURN_SUCCESS; > +} > diff --git > a/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongs > hanI2C_I3C.asl > b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongs > hanI2C_I3C.asl > new file mode 100644 > index 0000000000..72b9a87639 > --- /dev/null > +++ > b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongs > hanI2C_I3C.asl > @@ -0,0 +1,9 @@ > +/** @file > + > + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > + > diff --git a/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc > b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc > new file mode 100644 > index 0000000000..2dfb3190d4 > --- /dev/null > +++ b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc > @@ -0,0 +1,13 @@ > +; @file > +; > +; AMD Generic Encapsulated Software Architecture > +; Code to setup temporary memory access for stack usage. This code > +; is to be used on memory present systems that do not need CAR. > +; > +; Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights > reserved.<BR> > +; > +; SPDX-License-Identifier: BSD-2-Clause-Patent > +; > +%macro AMD_ENABLE_UEFI_STACK2 2-3 > + > +%endmacro > diff --git a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi > b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi > index a731c7e369..937caee083 160000 > --- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi > +++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi > @@ -1 +1 @@ > -Subproject commit a731c7e36988c3308e1978ecde491f2f6182d490 > +Subproject commit 937caee0833115f69d697ca190001ba0aa5c7368 > -- > 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119132): https://edk2.groups.io/g/devel/message/119132 Mute This Topic: https://groups.io/mt/106257082/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces 2024-05-23 4:12 [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Chang, Abner via groups.io ` (2 preceding siblings ...) 2024-05-23 7:26 ` [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Xing, Eric via groups.io @ 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 2024-05-23 8:31 ` Yao, Ken via groups.io 3 siblings, 1 reply; 16+ messages in thread From: Zhai, MingXin (Duke) via groups.io @ 2024-05-23 7:47 UTC (permalink / raw) To: Chang, Abner, devel@edk2.groups.io Cc: Grimes, Paul, Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Yao, Ken, Xing, Eric [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. -----Original Message----- From: Chang, Abner <Abner.Chang@amd.com> Sent: Thursday, May 23, 2024 12:12 PM To: devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin (Duke) <duke.zhai@amd.com> Subject: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces From: Abner Chang <abner.chang@amd.com> BZ#: 4777 Initial commit of AMD cross platform/board generic encapsulated software architecture. This provides the basic definitions and protocols for the follow-up AMD open board project. Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- .../AgesaModulePkg/AgesaCommonModulePkg.dec | 39 + Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec | 18 + .../AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec | 20 + .../AMD/AgesaModulePkg/AgesaModuleDfPkg.dec | 25 + .../AMD/AgesaModulePkg/AgesaModuleFchPkg.dec | 62 + .../AMD/AgesaModulePkg/AgesaModuleMemPkg.dec | 26 + .../AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec | 34 + .../AMD/AgesaModulePkg/AgesaModulePspPkg.dec | 29 + Platform/AMD/AgesaPkg/AgesaPkg.dec | 435 +++ Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec | 41 + .../AgesaEdk2PlatformPkg.inc.dsc | 18 + .../AgesaSp5RsModulePkg.inc.dsc | 48 + .../CbsInstanceNull/CbsInstanceNull.inc.dsc | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.inc.dsc | 11 + .../AgesaSp5RsModulePkg.dxe.inc.fdf | 11 + .../AgesaSp5RsModulePkg.pei.inc.fdf | 9 + .../CbsInstanceNull.dxe.inc.fdf | 7 + .../CbsInstanceNull.pei.inc.fdf | 7 + .../0x19/RS/External/CbsStones.dxe.inc.fdf | 8 + .../0x19/RS/External/CbsStones.pei.inc.fdf | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf | 7 + .../Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf | 10 + .../Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf | 7 + .../Library/AmdCalloutLib/AmdCalloutLib.inf | 29 + .../AmdPspMboxLibV2/AmdPspMboxLibV2.inf | 30 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.inf | 27 + .../AmdPspRomArmorLibNull.inf | 26 + .../Library/ApcbLibV3/ApcbLibV3.inf | 37 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.inf | 32 + .../BaseFabricTopologyRsLib.inf | 28 + .../CcxTscTimerLib/BaseTscTimerLib.inf | 35 + .../Library/CcxTscTimerLib/DxeTscTimerLib.inf | 42 + .../Library/CcxTscTimerLib/PeiTscTimerLib.inf | 37 + .../PciHostBridgeLib.inf | 42 + .../DxeAmlGenerationLib/AmlGenerationLib.inf | 47 + .../Library/FchBaseLib/FchBaseLib.inf | 26 + .../FchBaseResetSystemLib.inf | 35 + .../Library/FchEspiCmdLib/FchEspiCmdLib.inf | 33 + .../Library/NbioHandleLib/NbioHandleLib.inf | 24 + .../Library/PcieConfigLib/PcieConfigLib.inf | 25 + .../Library/SmnAccessLib/SmnAccessLib.inf | 33 + .../Library/CommonDxe/NbioCommonDxeLib.inf | 29 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf | 45 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf | 33 + .../OemAgesaCcxPlatformLibNull.inf | 27 + .../PciExpressPciCfg2/PciExpressPciCfg2.inf | 61 + .../PciExpressPciSegmentInfoLib.inf | 32 + .../AmdPspFlashAccSpiNorLibSmm.inf | 45 + .../PspRomArmorWhitelistLib.inf | 32 + .../Addendum/Oem/OobPprDxe/OobPprDxe.inf | 42 + .../Dxe/PspPlatformDriver/PspPlatform.inf | 32 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.inf | 29 + .../AmdAutoDynamicCommand.inf | 53 + .../AmdAutoDynamicCommand/AmdAutoToolApp.inf | 50 + .../BasePlatformHookLibAmdFchUart.inf | 33 + Platform/AMD/AgesaModulePkg/Include/AGESA.h | 158 + Platform/AMD/AgesaModulePkg/Include/AMD.h | 91 + .../Include/AmdEdk2/CpuRegisters.h | 15 + .../AgesaModulePkg/Include/AmdPspDirectory.h | 61 + .../AgesaModulePkg/Include/CpuRegistersDef.h | 156 + .../Include/FchRegistersCommon.h | 85 + .../AMD/AgesaModulePkg/Include/Filecode.h | 31 + Platform/AMD/AgesaModulePkg/Include/Gnb.h | 14 + Platform/AMD/AgesaModulePkg/Include/GnbDxio.h | 521 ++++ .../AgesaModulePkg/Include/GnbRegistersRS.h | 18 + .../Include/GnbRegistersRS/IOHC.h | 22 + .../Include/Guid/GnbPcieInfoHob.h | 31 + .../Include/Library/AmdBaseLib.h | 16 + .../Include/Library/AmdPspMboxLibV2.h | 43 + .../Include/Library/BaseFabricTopologyLib.h | 22 + .../Include/Library/FchBaseLib.h | 16 + .../Include/Library/FchEspiCmdLib.h | 413 +++ .../Include/Library/GnbPcieConfigLib.h | 16 + .../Include/Library/NbioCommonLibDxe.h | 37 + .../Include/Library/NbioHandleLib.h | 62 + .../Include/Library/PcieConfigLib.h | 283 ++ .../Include/Library/SmnAccessLib.h | 30 + .../Protocol/AmdNbioPcieServicesProtocol.h | 47 + .../Include/Protocol/AmdOemOobPprProtocol.h | 14 + .../Include/Protocol/FabricNumaServices2.h | 155 + .../Protocol/FabricTopologyServices2.h | 14 + .../AMD/AgesaModulePkg/Include/SocLogicalId.h | 23 + .../Library/DxeAmlGenerationLib/LocalAmlLib.h | 100 + .../DxeAmlGenerationLib/LocalAmlObjects.h | 150 + .../AMD/AgesaPkg/Include/AmdPcieComplex.h | 432 +++ Platform/AMD/AgesaPkg/Include/AmdSoc.h | 17 + .../Include/FabricResourceManagerCmn.h | 42 + .../AgesaPkg/Include/Guid/AmdMemoryInfoHob.h | 96 + .../Include/Library/AmdPspBaseLibV2.h | 51 + .../AgesaPkg/Include/Library/AmdPspFtpmLib.h | 83 + .../Include/Library/AmdPspRomArmorLib.h | 231 ++ .../Include/Library/AmlGenerationLib.h | 2722 +++++++++++++++++ .../Library/PlatformPspRomArmorWhitelistLib.h | 25 + .../AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h | 134 + .../Include/Protocol/AmdCxlServicesProtocol.h | 183 ++ .../Protocol/AmdPciResourcesProtocol.h | 110 + .../Include/Protocol/AmdPspFtpmProtocol.h | 187 ++ .../FabricResourceManagerServicesProtocol.h | 14 + Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h | 19 + Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h | 78 + Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h | 17 + .../AMD/AmdCpmPkg/Include/AmdCpmFunction.h | 32 + .../AmdCpmTableProtocol/AmdCpmTableProtocol.h | 39 + .../Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c | 31 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.c | 12 + .../AmdPspRomArmorLibNull.c | 79 + .../Library/ApcbLibV3/ApcbLibV3.c | 12 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.c | 14 + .../BaseFabricTopologyRsLib.c | 37 + .../Library/CcxTscTimerLib/BaseTscTimerLib.c | 8 + .../Library/CcxTscTimerLib/DxeTscTimerLib.c | 35 + .../Library/CcxTscTimerLib/PeiTscTimerLib.c | 11 + .../Library/CcxTscTimerLib/TscTimerLibShare.c | 103 + .../DxeAmdPciHostBridgeLib/PciHostBridgeLib.c | 95 + .../DxeAmlGenerationLib/AmlArgObjects.c | 154 + .../DxeAmlGenerationLib/AmlAssistFunctions.c | 151 + .../DxeAmlGenerationLib/AmlDataObjects.c | 640 ++++ .../AmlExpressionOpcodes.c | 1294 ++++++++ .../DxeAmlGenerationLib/AmlLocalObjects.c | 158 + .../DxeAmlGenerationLib/AmlNameString.c | 576 ++++ .../DxeAmlGenerationLib/AmlNamedObject.c | 2138 +++++++++++++ .../AmlNamespaceModifierObjects.c | 360 +++ .../DxeAmlGenerationLib/AmlObjectsDebug.c | 144 + .../DxeAmlGenerationLib/AmlPkgLength.c | 267 ++ .../AmlResourceDescriptor.c | 1989 ++++++++++++ .../DxeAmlGenerationLib/AmlStatementOpcodes.c | 515 ++++ .../Library/DxeAmlGenerationLib/AmlTable.c | 213 ++ .../DxeAmlGenerationLib/LocalAmlObjects.c | 364 +++ .../Library/FchBaseLib/FchStallLib.c | 13 + .../FchBaseResetSystemLib.c | 90 + .../Library/FchEspiCmdLib/FchEspiCmdLib.c | 87 + .../Library/NbioHandleLib/NbioHandleLib.c | 68 + .../Library/PcieConfigLib/PcieConfigLib.c | 276 ++ .../PcieConfigLib/PcieInputParserLib.c | 117 + .../Library/SmnAccessLib/SmnAccessLib.c | 10 + .../Nbio/Library/CommonDxe/DxeLibFunctions.c | 42 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c | 23 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c | 29 + .../OemAgesaCcxPlatformLibNull.c | 39 + .../PciExpressPciCfg2/PciExpressPciCfg2.c | 33 + .../PciSegmentInfoLib.c | 30 + .../AmdPspFlashAccSpiNorLibSmm.c | 15 + .../PspRomArmorWhitelistLib.c | 12 + .../Addendum/Oem/OobPprDxe/OobPprDxe.c | 36 + .../Dxe/PspPlatformDriver/PspPlatformDriver.c | 20 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.c | 22 + .../AmdAutoDynamicCommand.c | 44 + .../AmdAutoDynamicCommand/AmdAutoToolApp.c | 36 + .../BasePlatformHookLibAmdFchUart.c | 29 + .../FchSongshanDxe/FchSongshanI2C_I3C.asl | 9 + .../AMD/AgesaPkg/Include/AmdUefiStackNasm.inc | 13 + .../Library/RiscVOpensbiLib/opensbi | 2 +- 152 files changed, 19669 insertions(+), 1 deletion(-) create mode 100644 Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec create mode 100644 Platform/AMD/AgesaPkg/AgesaPkg.dec create mode 100755 Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf create mode 100755 Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf create mode 100755 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf create mode 100644 Platform/AMD/AgesaModulePkg/Include/AGESA.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AMD.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Filecode.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Gnb.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbDxio.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h create mode 100755 Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h create mode 100644 Platform/AMD/AgesaPkg/Include/AmdSoc.h create mode 100644 Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h create mode 100644 Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h create mode 100644 Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c create mode 100644 Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl create mode 100644 Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc diff --git a/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec new file mode 100644 index 0000000000..d35a1f27b4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec @@ -0,0 +1,39 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Common Module Package DEC +# file. +# This file provides the minimum AMD SoC/Mircoporcessor definitions for building +# AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCommonPkg + PACKAGE_GUID = 6CBE6566-0D3F-4E35-8358-9602354E9F09 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = {0x7788adf0, 0x9788, 0x4a3f, {0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd}} + gAgesaConfigDbPointerVariableGuid = {0x21229d24, 0xc71d, 0x4bc0, {0xb6, 0x3e, 0x67, 0x2f, 0x6d, 0xbf, 0x5f, 0xf7}} + gAmdMemoryInfoHobGuid = {0x1bce3d14, 0xa5fe, 0x4a0b, {0x9a, 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}} + +[Protocols] + ## Soc Protocols + gAmdSocLogicalIdProtocolGuid = {0x72f8e409, 0x0d2a, 0x4b91, {0x88, 0x6f, 0xba, 0x13, 0x44, 0x9f, 0xd7, 0x78}} + gAmdOemOobPprDxeProtocolGuid = {0x78031be3, 0x54a2, 0x4819, {0xb5, 0xba, 0x32, 0x79, 0x04, 0xf3, 0xa8, 0x41}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxSocketSupportedV2|2|UINT8|0x00002002 # 2 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDiePerSocketV2|1|UINT8|0x00002003 # 1 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxChannelPerDieV2|8|UINT8|0x00002004 # 8 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDimmPerChannelV2|2|UINT8|0x00002005 # 2 by default + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdS3LibTableSize|0x4000|UINT64|0x00027003 + diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec new file mode 100644 index 0000000000..1637068432 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec @@ -0,0 +1,18 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaEdk2Pkg + PACKAGE_GUID = E866104F-D458-41B1-AB26-FA5951618A8C + PACKAGE_VERSION = 0.1 + +[Includes] + Include/AmdEdk2 + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec new file mode 100755 index 0000000000..b84fe5b738 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec @@ -0,0 +1,20 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Core Complex package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCcxPkg + PACKAGE_GUID = df325429-029e-40f0-82db-0e69be7f6560 + PACKAGE_VERSION = 0.1 + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdCcxSingleBitErrLogging|FALSE|BOOLEAN|0x000CC029 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec new file mode 100755 index 0000000000..57db15e663 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec @@ -0,0 +1,25 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Data Fabric package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaDfPkg + PACKAGE_GUID = 81e51ee3-c347-4563-92fe-790ba953bf0f + PACKAGE_VERSION = 0.1 + +[Guids] + gAmdTotalNumberOfRootBridgesGuid = {0xfb5703f5, 0xf8a7, 0xf401, {0x18, 0xb4, 0x3f, 0x10, 0x8d, 0xeb, 0x26, 0x12}} + gAmdResourceSizeForEachRbGuid = {0x542b8f2f, 0xbd52, 0x4233, {0x8c, 0x3d, 0x66, 0x53, 0x0d, 0xe8, 0xa3, 0x69}} + +[Protocols] + gAmdFabricNumaServices2ProtocolGuid = {0xa8ff2e64, 0xf319, 0x4af1, {0x9e, 0xc8, 0x18, 0x89, 0x89, 0xc3, 0x1e, 0x4a}} + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec new file mode 100644 index 0000000000..521957e809 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec @@ -0,0 +1,62 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Fusion Control Hub package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 1.5 + PACKAGE_NAME = AgesaFchPkg + PACKAGE_GUID = e47c8ed9-3000-4e6e-b1c6-875b365b3849 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = { 0x7788adf0, 0x9788, 0x4a3f, { 0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd } } + +[Protocols] + gFchInitDonePolicyProtocolGuid = { 0xc63c0c73, 0xf612, 0x4c02, { 0x84, 0xa3, 0xc6, 0x40, 0xad, 0x0b, 0xa6, 0x22 } } + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLegacyFree|FALSE|BOOLEAN|0x0003F001 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetEnable|TRUE|BOOLEAN|0x0003F002 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetMsiDis|TRUE|BOOLEAN|0x0003F003 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdResetMode|0x00|UINT8|0x0003F00D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdNoneSioKbcSupport|FALSE|BOOLEAN|0x0003F021 + + ### @brief This item allows the customer to change OC signal polarity to be active low. This is universal and applies to all OC pins. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE)At present, this control applies to Family17h Model 00h-2Fh. + ### @li TRUE - OC pin is low when OC occurs. + ### @li FALSE - OC pin is high when OC occurs. + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciOcPolarityCfgLow|FALSE|BOOLEAN|0x0003F309 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb20OcPinSelect|0xFFFFFFFFFFFFFFFF|UINT64|0x0003F340 + #Die 0 + #[7:0] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 2.0 ports on XHCI controller 1 + #[23:0] MTS -- 6 USB 2.0 ports on XHCI controller 0 + #Die 1 + #[39:32] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[47:40] SSP -- 2 USB 2.0 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb31OcPinSelect|0xFFFFFFFF|UINT32|0x0003F341 + #Die 0 + #[7:0] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 3.1 ports on XHCI controller 1 + #[15:0] MTS -- 4 USB 3.1 ports on XHCI controller 0 + #Die 1 + #[23:16] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[31:24] SSP -- 2 USB 3.1 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLpcEnable|TRUE|BOOLEAN|0x0003F400 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdUsbRSOemConfigurationTable|{0x0}|VOID*|0x0003F40A + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciSsid|0x00000000|UINT32|0x0003FF07 + gEfiAmdAgesaModulePkgTokenSpaceGuid.FchRTDeviceEnableMap|0x00000000|UINT32|0x0003FF81 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec new file mode 100644 index 0000000000..721d3ea73b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec @@ -0,0 +1,26 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Memory package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaMemPkg + PACKAGE_GUID = 445f7303-3171-428c-ad0b-32df4474a7ad + PACKAGE_VERSION = 0.1 + +[Includes] + Include/ + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries|64|UINT32|0x00029001 + + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec new file mode 100755 index 0000000000..0501774c9b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec @@ -0,0 +1,34 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD North Bridge I/O package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaNbioPkg + PACKAGE_GUID = 1486f0fe-39ee-4856-a39f-222ff2404f26 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Protocols] + gAmdNbioPcieServicesProtocolGuid = {0x756db75c, 0xbb9d, 0x4289, {0x81, 0x3a, 0xdf, 0x21, 0x5, 0xc4, 0xf8, 0xe}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIommuMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021100 #///< 1: Enable Iommu MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021101 #///< 1: Enable Ioapic MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdPreDefineEn|FALSE|BOOLEAN|0x00021102 #///< TRUE: Enable assign IOAPIC ID at PEI phase + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdBase|0xF1|UINT8|0x00021103 #///< Base NBIO IOAPIC ID. ID assigned start from this value + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgGnbIoapicId|0|UINT8|0x0004101D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgFchIoapicId|0|UINT8|0x0004101E + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdSmuFeatureControlDefinesExt|0x0|UINT32|0x00041200 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec new file mode 100644 index 0000000000..41cf320c76 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec @@ -0,0 +1,29 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Platform Security Processor package definitions +# for building AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPspPkg + PACKAGE_GUID = 5c48f900-a98c-431f-8be5-19c09c65bb05 + PACKAGE_VERSION = 0.1 + +[Guids] + gApSyncFlagNvVariableGuid = { 0xad3f6761, 0xf0a3, 0x46c8, { 0xa4, 0xcb, 0x19, 0xb7, 0x0f, 0xfd, 0xb3, 0x05 } } + gAmdPspApobHobGuid = { 0x30b174f3, 0x7712, 0x4cca, { 0xbd, 0x13, 0xd0, 0xb8, 0xa8, 0x80, 0x19, 0x97 } } + +[Protocols] + gPspFlashAccSmmCommReadyProtocolGuid = { 0x9f373486, 0xda76, 0x4c9f, { 0x81, 0x55, 0x6c, 0xcd, 0xdb, 0x0b, 0x0b, 0x04 } } + gAmdPspFtpmProtocolGuid = { 0xac234e04, 0xb036, 0x476c, { 0x91, 0x66, 0xbe, 0x47, 0x52, 0xa0, 0x95, 0x09 } } + +[Ppis] + gAmdPspFtpmPpiGuid = { 0x91774185, 0xf72d, 0x467e, { 0x93, 0x39, 0xe0, 0x08, 0xdb, 0xae, 0x0e, 0x14 } } + gAmdPspFtpmFactoryResetPpiGuid = { 0x9c98130a, 0x8921, 0x45eb, { 0x86, 0xf3, 0x16, 0x04, 0x35, 0xc7, 0xc6, 0x40 } } diff --git a/Platform/AMD/AgesaPkg/AgesaPkg.dec b/Platform/AMD/AgesaPkg/AgesaPkg.dec new file mode 100644 index 0000000000..9377c64cc3 --- /dev/null +++ b/Platform/AMD/AgesaPkg/AgesaPkg.dec @@ -0,0 +1,435 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Package DEC +# file. +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPkg + PACKAGE_GUID = DABFEFC6-5A79-444b-862A-1F6FE9F561FE + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaPkgTokenSpaceGuid = { 0xd4d8435f, 0xfffb, 0x4acb, { 0xa0, 0x4d, 0xff, 0x0f, 0xad, 0x67, 0x7f, 0xe9 } } + +[Protocols] + gAmdNbioCxlServicesProtocolGuid = {0x125CCFCE, 0x34AF, 0x422C, {0xB3, 0xB3, 0x71, 0x23, 0xA3, 0x1E, 0xC8, 0x61}} + gAmdPciResourceProtocolGuid = {0x663d4897, 0xed94, 0x4f0f, {0x86, 0x64, 0xfe, 0xdc, 0x70, 0x30, 0x7f, 0x19}} + gAmdCapsuleSmmHookProtocolGuid = {0x4fc43bbe, 0x1433, 0x4951, {0xac, 0x2d, 0x0d, 0x01, 0xfe, 0xc0, 0x0e, 0xb1}} + gAmdFspSetupTableInitDoneGuid = {0xef5394c6, 0x566d, 0x440f, {0x9d, 0x05, 0xc0, 0xa3, 0x2c, 0xb9, 0x33, 0x58}} + +[Ppis] + gAmdMemoryInfoHobPpiGuid = {0xba16e587, 0x1d66, 0x41b7, {0x9b, 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}} + gCapsuleUpdateDetectedPpiGuid = {0x745dfc73, 0xc401, 0x4ced, {0x8d, 0x3b, 0x1a, 0x82, 0xf3, 0xda, 0xdc, 0xf8}} + +[PcdsFixedAtBuild] + + ### @brief Enable EDK-II Protocols + ### @details This item enables support for EDKII implementation of ACPI Protocols when set to TRUE + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCompliantEdkIIAcpiSdtProtocol|TRUE|BOOLEAN|0x00020006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize |0x1000|UINT32|0x00020007 + + ### @brief assign non volatile storage base address + ### @details This assigns the base address to map to flash deivce. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress|0xFF000000|UINT32|0x00020017 + +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH.h" +#---------------------------------------------------------------------------- + + ### @name General FCH Controls + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1 register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0400) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1EvtBlkAddr|0x400|UINT16|0x0002F004 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1Cnt register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0404) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1CntBlkAddr|0x404|UINT16|0x0002F005 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM Timer as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0408) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPmTmrBlkAddr|0x408|UINT16|0x0002F006 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI CPU Control block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0410) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgCpuControlBlkAddr|0x410|UINT16|0x0002F007 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI GPE0 register block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0420) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiGpe0BlkAddr|0x420|UINT16|0x0002F008 + + ### @brief This item defines the SMI command value sent by the host BIOS during the S3 resume sequence, to re-initialize the + ### FCH registers. This must be issued before the platform driver restore function is started. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD3) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemBeforePciRestoreSwSmi|0xD3|UINT8|0x0002F010 + + ### @brief This item defines the SMI command used by the host BIOS to signal the FCH driver that the platform driver has + ### completed its restore function. This allows the FCH driver to perform some final FCH settings. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD4) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemAfterPciRestoreSwSmi|0xD4|UINT8|0x0002F011 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to activate ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemEnableAcpiSwSmi|0xA0|UINT8|0x0002F012 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to turn off ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA1) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemDisableAcpiSwSmi|0xA1|UINT8|0x0002F013 + + ### @brief SMI command used for releasing the SPI controller lock mode. All devices on the SPI bus will be writable. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAA) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiUnlockSwSmi|0xAA|UINT8|0x0002F014 + + ### @brief SMI command for setting the lock mode in the SPI controller. This will effectively provide a write protection to the + ### SPI Flash ROM; however, write access to secondary SPI devices will also be blocked. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAB) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiLockSwSmi|0xAB|UINT8|0x0002F015 +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH-IRQ.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart0Irq|0x03|UINT8|0x0002F01A + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart1Irq|0x0E|UINT8|0x0002F01B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart2Irq|0x05|UINT8|0x0002F01C + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart3Irq|0x0F|UINT8|0x0002F01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart4Irq|0x10|UINT8|0x0002F01E + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c0Irq|0x0A|UINT8|0x0002F01F + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c1Irq|0x0B|UINT8|0x0002F020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c2Irq|0x04|UINT8|0x0002F021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c3Irq|0x06|UINT8|0x0002F022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c4Irq|0x16|UINT8|0x0002F023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c5Irq|0x17|UINT8|0x0002F024 +#- DF Fixed PCDs +#- +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + #Fabric + + ### @name General DF Controls + + ### @brief This item informs the SMBios generation code as to how many physical processor sockets exist in the system and + ### therefore how many Type 4 SMBios records to produce. + ### @brief Permitted Choices: (Type: Value)(Default: 0x01) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdNumberOfPhysicalSocket|1|UINT8|0x000CC103 +#---------------------------------------------------------------------------- +#- CCX Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-MTRR.h" +#---------------------------------------------------------------------------- + + + ### @brief The base address of temporary page table for accessing PCIE MMIO base address above 4G in PEI phase. + ### @brief Permitted Choices: 0x0 - 0xFFFFFFFF (Type: Value)(Default: 0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPeiTempPageTableBaseAddress|0|UINT32|0x000CC11B + +#---------------------------------------------------------------------------- +#- CCX ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-ACPI.h" +#---------------------------------------------------------------------------- + #ACPI + # Cpu SSDT + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName0|0x43|UINT8|0x000AC001 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName1|0x30|UINT8|0x000AC002 + ### @brief This element specifies whether the ACPI _PSS objects are defined in the system bus or processor scope. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li TRUE - The objects will be under the \_SB scope. + ### @li FALSE - The objects will be under the \_PR scope + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeInSb|FALSE|BOOLEAN|0x000AC003 + + ### @brief Set the OEM ID field in ACPI table outputs to this string. The string must conform to the ACPI rules for the OEM ID field. + ### @brief Permitted Choices: (Type: Value)(Default: "AMD") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiTableHeaderOemId|"AMD"|VOID*|0x000AC004 + +#---------------------------------------------------------------------------- +#- CCX SMBIOS Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-SMBIOS.h" +#---------------------------------------------------------------------------- + + ### @name CCX SMBIOS Controls + + ### @brief When creating the SMBios table entry, use this as the label for the processor socket. This should match the + ### silkscreen label on the motherboard. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket0|"Unknown"|VOID*|0x00001001 + + ### @brief When creating the SMBios table entry, use this as the value for the 'serial number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket0|"Unknown"|VOID*|0x00001002 + + + ### @brief When creating the SMBios table entry, use this as the value for the 'Asset Tag' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket0|"Unknown"|VOID*|0x00001003 + + ### @brief When creating the SMBios table entry, use this as the value for the 'Part Number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket0|"Unknown"|VOID*|0x00001004 + + ### @brief SMBios socket 1 Label. + ### @details When creating the SMBios table entry, use this as the label for the + ### processor socket. This should match the silkscreen label on the motherboard. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket1|"Unknown"|VOID*|0x00001005 + + ### @brief SMBIOS socket 1 Serial Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'serial number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket1|"Unknown"|VOID*|0x00001006 + + ### @brief SMBios socket 1 Asset Tag. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Asset Tag' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket1|"Unknown"|VOID*|0x00001007 + + ### @brief Socket 1 Part Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Part Number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket1|"Unknown"|VOID*|0x00001008 + +#---------------------------------------------------------------------------- +#- ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-ACPI.h" +#---------------------------------------------------------------------------- + + ### @name General ACPI Controls + + ### @brief PCD supporting maximum capacity for Type 16 table + ### @details This PCD represents maximum memory capacity in KB + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT16MaximumCapacity|0x04000000|UINT32|0x00001009 # 4G - 0x00400000 + # 8G - 0x00800000 + # 16G - 0x01000000 + # 32G - 0x02000000 + # 64G - 0x04000000 + # 128G - 0x08000000 + # 256G - 0x10000000 + # 512G - 0x20000000 +[PcdsDynamic] +#---------------------------------------------------------------------------- +# System level Dynamic PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCStateIoBaseAddress|0x413|UINT16|0x000CC002 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdt|TRUE|BOOLEAN|0x000CC00B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdApicMode|0xFF|UINT8|0x000CC01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCpuWdtEn|TRUE|BOOLEAN|0x000CC200 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerInSb|FALSE|BOOLEAN|0x000CC50B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerName|"PLTF"|VOID*|0x000CC50C + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCcxCfgPFEHEnable|FALSE|BOOLEAN|0x000CC601 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT4CpuMaxSpeed|0|UINT16|0x000CC900 +#---------------------------------------------------------------------------- +#- DF Dynamic PCDs +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + + ### @cond (FF3||RN||BA||ZP||RMB||RPL||RS||SSP||MI3||BRH) + ### @brief Specifies the top address to be used for MMIO space allocations. No MMIO space will be used above this limit. Some devices have limits on the address space they + ### are able to access. For example a device with a 40-bit address limitation can not use MMIO space above 1TeraByte (1T). By setting this PCD to 0x10000000000 (1T), MMIO + ### space would not be allocated above 1T. The default is to use all of the space above the end of physical memory. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMmioAbove4GLimit|0xFFFFFFFFFFFFFFFF|UINT64|0x0003FFC2 + ### @endcond + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFabricResourceDefaultSizePtr|0|UINT64|0x00DF0000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgSmiCmdPortAddr|0xB0|UINT16|0x0003FFC0 + + ### I2C-0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c0SdaHold|0x00000035|UINT32|0x000FC000 + ### I2C-1 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c1SdaHold|0x00000035|UINT32|0x000FC001 + ### I2C-2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c2SdaHold|0x00000035|UINT32|0x000FC002 + ### I2C-3 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c3SdaHold|0x00000035|UINT32|0x000FC003 + ### I2C-4 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c4SdaHold|0x00000035|UINT32|0x000FC004 + ### I2C-5 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c5SdaHold|0x00000035|UINT32|0x000FC005 + ### @} end of I2C hold times + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-UART.h" +#---------------------------------------------------------------------------- + ### @name UART Legacy IO Assignments + ### @{ + ### @brief These controls allow the platform to specify the legacy IO ranges that are to be used by the UART ports in the processor. Permitted Choices: (Type: value)(Default: Disabled) + ### @li 0 - Disabled + ### @li 1 - IO range 0x02E8 - 0x02EF + ### @li 2 - IO range 0x02F8 - 0x02FF + ### @li 3 - IO range 0x03E8 - 0x03EF + ### @li 4 - IO range 0x03F8 - 0x03FF + + + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart0LegacyEnable|0x00|UINT8|0x000FC010 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart1LegacyEnable|0x00|UINT8|0x000FC011 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart2LegacyEnable|0x00|UINT8|0x000FC012 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart3LegacyEnable|0x00|UINT8|0x000FC013 + ### @} end UART Legacy IO assignments + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-USB.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci0Enable|TRUE|BOOLEAN|0x000FC020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci1Enable|TRUE|BOOLEAN|0x000FC021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci2Enable|TRUE|BOOLEAN|0x000FC022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci3Enable|TRUE|BOOLEAN|0x000FC023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhciECCDedErrRptEn|FALSE|BOOLEAN|0x000FC024 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataEnable|TRUE|BOOLEAN|0x000FC030 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataStaggeredSpinup|FALSE|BOOLEAN|0x000FC039 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdNvdimmEnable|FALSE|BOOLEAN|0x000A6024 + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO-BMC.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkTraining|FALSE|BOOLEAN|0x0004F004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkSocket|0xFF|UINT8|0x0004F005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkDie|0xFF|UINT8|0x0004F006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkLaneNum|0|UINT8|0x0004F03E + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgIommuSupport|TRUE|BOOLEAN|0x0004F027 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdIvInfoDmaReMap|FALSE|BOOLEAN|0x0004F028 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrVddfull_Scale_Current|0x00|UINT32|0x0004F0A0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrSocfull_Scale_Current|0x00|UINT32|0x0004F0A2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityLo|0x4|UINT32|0x0004F210 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityHi|0x30011|UINT32|0x0004F211 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlProtocolErrorReporting|0|UINT8|0x0004F362 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlComponentErrorReporting|0|UINT8|0x0004F363 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs DYNAMIC + + ### @brief This feature selects the APCB recovery support on x86 side. If or when an instance of a writable APCB is determined to be invalid, the PSP driver will + ### attempt a 'recovery' by copying the recovery instance of the APCB (default values as indicated in the APCB descriptor files). Upon boot up, the ABL reads CMOS + ### bytes 06/07 at index/data port of 0x72/0x73. If the CMOS flag reads anything else other than 0xA55A or 0x5555, the system boots in APCB recovery mode, in which + ### ABL consumes the recovery instances of APCB. Otherwise it boots in normal/non-recovery mode. + ### @brief Permitted Choices: (Type: Boolean)(Default: TRUE) + ### @brief This feature is affected by the platform CMOS power design. Please see Platform CMOS power . + ### @li TRUE - the AGESA PSP driver restores the APCB instances from the recovery instance, writes 0xA55A to the CMOS location and triggers a reset . The next time + ### the system powers up, ABL runs in normal/non-recovery mode. + ### @li FALSE - the AGESA PSP driver writes 0x5555 to the CMOS location without restoring the APCB instances or triggering a reset. In this mode the additional reset + ### is avoided at the potential risk of the writeable APCB instance being left corrupted forever. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspApcbRecoveryEnable|TRUE|BOOLEAN|0x95940008 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspAntiRollbackLateSplFuse|FALSE|BOOLEAN|0x95940018 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemPostPackageRepair|TRUE|BOOLEAN|0x00030004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemBootTimePostPackageRepair|TRUE|BOOLEAN|0x00030005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemRuntimePostPackageRepair|FALSE|BOOLEAN|0x00030006 +[PcdsDynamicEx] + +[PcdsFixedAtBuild, PcdsDynamic] +#---------------------------------------------------------------------------- +#- System control PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + ### @brief Switch for Debug Print function + ### @details Switch for Debug Print function to enable or not. + ### @li TRUE: Enable IdsDebugPrint output + ### @li FALSE: Disable IdsDebugPrint output + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEnable|FALSE|BOOLEAN|0x00020004 + ### @brief Specify the filter for IdsDebugPrint + ### @details When the filter values are matched, the AmdIdsDebugPrint can start to print debug message. + ### Refer Library/IdsLib.h for details, and the Master token is PcdAmdIdsDebugPrintEnable. + ### @li 0x100401008A30042C: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | MEM_STATUS | MEM_PMU | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + ### @li 0x100401008A300408: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintFilter|0x100401030A300408|UINT64|0x00020005 + ### @brief Switch for Serial port support of AGESA debug print + ### @details Switch for Serial port support of AGESA debug print, NOTE, AGESA will not init the serial port, + ### serial port should be initialized before call AGESA debug print. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortEnable|FALSE|BOOLEAN|0x00020009 + ### @brief The serial port used for debug output can be either 2-wire (Rx/Tx) or 4-wire (adding DSR/CTS). Waiting for CTS on a + ### 2-wire port would cause a hang. This control is added to check the cable connection. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li FALSE - Presume a 2-wire port and do not wait for CTS. + ### @li TRUE - Wait for both DSR and CTS to be set. DSR is set if a cable is connected. CTS is set if it is ok to transmit data. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortDetectCableConnection|FALSE|BOOLEAN|0x0002000A + + ### @brief Selection of UART and UART Legacy IO Serial port for AGESA debug print + ### @details Selection of UART and UART Legacy IO Serial port for AGESA debug print and invisible in ACPI name space. + ### @li Bit[0]: Select UART0 for AGESA debug print + ### @li Bit[1]: Select UART1 for AGESA debug print + ### @li Bit[2]: Select UART2 for AGESA debug print + ### @li Bit[3]: Select UART3 for AGESA debug print + ### @li Bit[4]: Select UART4 for AGESA debug print + ### @li Bit[8]: Select UART0 Legacy IO for AGESA debug print + ### @li Bit[9]: Select UART1 Legacy IO for AGESA debug print + ### @li Bit[10]: Select UART2 Legacy IO for AGESA debug print + ### @li Bit[11]: Select UART3 Legacy IO for AGESA debug print + ### @li Bit[15]: Set debug print serial port to invisible in ACPI name space at OS runtime + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortSelect|0x0000|UINT16|0x0002718A + + ### @brief Specify the IO port for serial out + ### @details ESPI or LPC COM1: 0x3F8, COM2: 0x2F8, COM3: 0x3E8, COM4: 0x2E8, + ### UART0: 0xFEDC9000, UART1: 0xFEDCA000, UART2: 0xFEDCE000, UART3: 0xFEDCF000, UART4: 0xFEDD1000. + ### @li If it's IO port: it must < 0x10000 + ### @li If it's Memory: it must >= 0x10000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPort|0x3F8|UINT64|0x0002000B + + ### @brief Debug Print Emulation Auto Detect + ### @details Auto detect emulation platform to instead of PcdAmdIdsDebugPrintRedirectIOEnable and + ### PcdAmdIdsDebugPrintSerialPortEnable. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEmulationAutoDetect|FALSE|BOOLEAN|0x00020016 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgPlatformPPT|0|UINT32|0x0004F111 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs + + ### @brief Rom Armor selection + ### @details Rom Armor selection + ### @li 0: Rom Armor is disabled + ### @li 1: Rom Armor 1 is enabled (VMR/MTS/CPK) + ### @li 2: Rom Armor 2 is enabled (RN/CZN) + ### @li 3: Rom Armor 3 is enabled (CGL, RMB and later) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspRomArmorSelection|0|UINT8|0x95940054 + + + + ### @brief System TPM config Value + ### @details System TPM config Value, SBIOS needs to set the value in PEI phase. + ### @li 0x0: dTPM + ### @li 0x1: PSP fTPM + ### @li 0x2: HSP fTPM + ### @li 0xFF: no TPM + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmConfig|0xFF|UINT8|0x95940024 + + ### @cond !BRH + ### @brief TPM SMx algorithm flag + ### @details TPM SMx algorithm flag, SBIOS needs to set the value in PEI phase. + ### @li 0: SM2, SM3 or SM4 crypto algorithms not supported + ### @li 1: SM2, SM3 or SM4 crypto algorithms supported + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmAlgSmx|0|UINT8|0x95940025 + ### @endcond diff --git a/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec new file mode 100755 index 0000000000..c8c474637f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec @@ -0,0 +1,41 @@ +## @file +# AMD Common Platform Module (CPM) Module Package DEC. +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = CpmPkg + PACKAGE_GUID = ABE128BA-1061-4A53-A1B8-D07329AA7A67 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + Library + +[Guids] + gAmdCpmPkgTokenSpaceGuid = {0x916e0ddd, 0x2bd2, 0x4704, {0x93, 0xb9, 0x59, 0x4b, 0x01, 0xa5, 0xfa, 0x9f}} + gShellActHiiGuid = {0x340EBE97, 0x3C1C, 0x4272, {0x9C, 0xCE, 0xC1, 0xFF, 0x86, 0x6F, 0x73, 0x3C}} + gAmdPbsSystemConfigurationGuid = {0xa339d746, 0xf678, 0x49b3, {0x9f, 0xc7, 0x54, 0xce, 0x0f, 0x9d, 0xf2, 0x26}} + +[Protocols] + gAmdCpmTableProtocolGuid = { 0x3724cf01, 0x00c2, 0x9762, {0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 }} + gAmdCpmAllPciIoProtocolsInstalledProtocolGuid = { 0x676D7012, 0x139B, 0x485A, {0x96, 0xF1, 0x98, 0x6F, 0xC4, 0x8A, 0x86, 0x4B }} + +[Ppis] + gAmdCpmTablePpiGuid = { 0xd71cf893, 0xa8b5, 0x49d3, { 0xa2, 0x1b, 0x31, 0xe2, 0xf5, 0xc4, 0xa7, 0x47 } } + +[PcdsFixedAtBuild] + gAmdCpmPkgTokenSpaceGuid.PcdFchUartPort|2|UINT8|0x00000052 + + #ACPI + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiHestTableHeaderOemTableId|"AMD HEST"|VOID*|0x000AC001 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiBertTableHeaderOemTableId|"AMD BERT"|VOID*|0x000AC002 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiEinjTableHeaderOemTableId|"AMD EINJ"|VOID*|0x000AC003 + + gAmdCpmPkgTokenSpaceGuid.UsePciXAslName|FALSE|BOOLEAN|0x12000003 + gAmdCpmPkgTokenSpaceGuid.AcpiRestoreSwSmi|0xE3|UINT8|0x00000040 diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc new file mode 100644 index 0000000000..37b8d15cb1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc @@ -0,0 +1,18 @@ +## @file +# +# The DSC include file for edk2 package to pull in the necessary AGESA modules +# into build process. +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses] + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc new file mode 100644 index 0000000000..e7e05fd2d8 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc @@ -0,0 +1,48 @@ +## @file +# The AGESA DSC file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses.Common.PEIM] + + ## APCB + ApcbLibV3Pei|AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf + +[LibraryClasses.Common.DXE_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses.Common.DXE_SMM_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses] + # + # Agesa specific common libraries + # + + ## PSP Libs + AmdPspMboxLibV2|AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf + + ## DF Lib + BaseFabricTopologyLib|AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + SmnAccessLib|AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Fch Lib + FchBaseLib|AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf + +[Components.IA32] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf + +[Components.X64] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc new file mode 100644 index 0000000000..1f1e04c414 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc new file mode 100644 index 0000000000..2916fecb26 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc @@ -0,0 +1,11 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEFINE AGESA_PKG_PATH = AgesaModulePkg + DEFINE AGESA_PKG_DEC = AgesaCommonModulePkg diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf new file mode 100644 index 0000000000..9303d1fac4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf @@ -0,0 +1,11 @@ +## @file +# The AGESA DXE FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +## APCB V3 Dxe Drivers + INF AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf new file mode 100644 index 0000000000..0ef5a2a806 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf @@ -0,0 +1,9 @@ +## @file +# The AGESA PEI FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf new file mode 100644 index 0000000000..b790e4ead5 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf @@ -0,0 +1,10 @@ +## @file +# +# Platform Package Flash Description File +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf new file mode 100755 index 0000000000..8d3357bf56 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdCalloutLib + FILE_GUID = A8FEA621-B381-4c06-9E9D-0897EF78BD78 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdCalloutLib + + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf new file mode 100644 index 0000000000..1594a99265 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf @@ -0,0 +1,30 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspMboxLibV2 + FILE_GUID = B9E57A31-CAB0-4CEE-9D50-9D43E2EEAA44 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspMboxLibV2 + +[Sources.common] + AmdPspMboxLibV2.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PciLib + SmnAccessLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf new file mode 100644 index 0000000000..c685a26604 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLib + FILE_GUID = 55871F80-4658-6EF3-A8AC-15B34FF8C2CE + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLib + +[Sources.common] + AmdPspRomArmorLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf new file mode 100644 index 0000000000..a3906dc13e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLibNull + FILE_GUID = 7351EAC0-4587-FED8-2788-BF9DA2ADCA6E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLibNull + +[Sources.common] + AmdPspRomArmorLibNull.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf new file mode 100644 index 0000000000..09d5bd38ac --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf @@ -0,0 +1,37 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3 + FILE_GUID = C7932467-DF16-4C7A-A32A-3E6F50213E68 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3 | DXE_DRIVER DXE_SMM_DRIVER DXE_RUNTIME_DRIVER DXE_CORE SMM_CORE UEFI_DRIVER + +[Sources.common] + ApcbLibV3.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSmmReadyToLockProtocolGuid + +[Pcd] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf new file mode 100644 index 0000000000..c031d00d79 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3Pei + FILE_GUID = EEA4E007-E408-4daa-82BD-4C52E7058753 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3Pei|PEIM + +[Sources.common] + ApcbLibV3Pei.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PcdLib + BaseMemoryLib + PeiServicesLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf new file mode 100644 index 0000000000..38a72e26b7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf @@ -0,0 +1,28 @@ +## @file +# +# For EDKII use Only +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseFabricTopologyRsLib + FILE_GUID = D0A070DD-630A-43F8-9D76-EAAABDDE5FB9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseFabricTopologyLib + CONSTRUCTOR = BaseFabricTopologyLibConstructor + +[Sources] + BaseFabricTopologyRsLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + +[LibraryClasses] + BaseLib diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf new file mode 100644 index 0000000000..d15d8169fe --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf @@ -0,0 +1,35 @@ +## @file +# Base Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseTscTimerLib + FILE_GUID = D29338B9-50FE-4e4f-B7D4-A150A2C1F4FB + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + BaseTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf new file mode 100644 index 0000000000..1e52768a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf @@ -0,0 +1,42 @@ +## @file +# Dxe Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeTscTimerLib + FILE_GUID = 95ab030f-b4fd-4ee4-92a5-9e04e87634d9 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE + + CONSTRUCTOR = DxeTscTimerLibConstructor + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + DxeTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + PcdLib + BaseLib + UefiLib + DebugLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf new file mode 100644 index 0000000000..b1eaefd282 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf @@ -0,0 +1,37 @@ +## @file +# Pei Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiTscTimerLib + FILE_GUID = 342C36C0-15DF-43b4-9EC9-FBF748BFB3D1 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|PEIM PEI_CORE + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + PeiTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + HobLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf new file mode 100644 index 0000000000..f60f97905a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf @@ -0,0 +1,42 @@ +## @file +# Library instance of PciHostBridgeLib library class for coreboot. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciHostBridgeLib + FILE_GUID = 74967FD7-A9A4-4B16-8B41-B26BC3230D0A + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciHostBridgeLib + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + PciHostBridgeLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseMemoryLib + PciHostBridgeLib + DevicePathLib + MemoryAllocationLib + DebugLib + UefiBootServicesTableLib diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf new file mode 100644 index 0000000000..2a72fa8117 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf @@ -0,0 +1,47 @@ +## @file +# +# Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmlGenerationLib + FILE_GUID = 8F62C8D1-B67F-4AFB-9179-54384F1A6163 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmlGenerationLib | DXE_DRIVER UEFI_DRIVER HOST_APPLICATION + +[Sources.common] + LocalAmlObjects.h + LocalAmlObjects.c + LocalAmlLib.h + AmlAssistFunctions.c + AmlObjectsDebug.c + AmlNameString.c + AmlDataObjects.c + AmlNamespaceModifierObjects.c + AmlPkgLength.c + AmlNamedObject.c + AmlTable.c + AmlStatementOpcodes.c + AmlResourceDescriptor.c + AmlExpressionOpcodes.c + AmlArgObjects.c + AmlLocalObjects.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf new file mode 100644 index 0000000000..e63a70e849 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchBaseLib + FILE_GUID = 4108287a-c864-4427-b2c3-bd0e91a83abd + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchBaseLib + +[Sources.common] + FchStallLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + PciSegmentLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf new file mode 100644 index 0000000000..e422cb69a4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf @@ -0,0 +1,35 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = BaseResetSystemLib + FILE_GUID = e669c365-2df2-4540-a343-afec4e85b198 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseResetSystemLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + FchBaseResetSystemLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PrintLib + IoLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf new file mode 100644 index 0000000000..d7f49c40de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchEspiCmdLib + FILE_GUID = 89671327-a620-43e9-93b1-d1da79a50392 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchEspiCmdLib + +[Sources.common] + FchEspiCmdLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + IoLib + FchBaseLib + + + + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf new file mode 100755 index 0000000000..f32bbc9ff2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf @@ -0,0 +1,24 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioHandleLib + FILE_GUID = DC4639D3-DB75-486B-AC38-C84AA49601E3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioHandleLib + +[Sources] + NbioHandleLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf new file mode 100755 index 0000000000..0d6ba605f5 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf @@ -0,0 +1,25 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PcieConfigLib + FILE_GUID = C1205AD2-FE67-4502-A0A7-FB1704A3F9AE + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PcieConfigLib + +[Sources] + PcieConfigLib.c + PcieInputParserLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf new file mode 100644 index 0000000000..ae1dd6cd83 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = SmnAccessLib + FILE_GUID = 9B7FF4FA-9DB5-4fec-BF71-B13D8A14A51E + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmnAccessLib + +[Sources] + SmnAccessLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + PrintLib + BaseLib + DebugPrintErrorLevelLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf new file mode 100644 index 0000000000..da7f5c185d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioCommonDxeLib + FILE_GUID = 1BF93335-5D55-46D9-99D9-5D962F039829 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioCommonDxeLib + +[Sources] + DxeLibFunctions.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + BaseLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf new file mode 100644 index 0000000000..54c3514020 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbDxeV3 + FILE_GUID = 4D3708A0-6D9B-47D3-AD87-E80C781BC0A7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3DxeDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + DxeServicesTableLib + MemoryAllocationLib + ApcbLibV3 + +[Sources] + ApcbV3Dxe.c + +[Protocols] + gEfiDxeSmmReadyToLockProtocolGuid + gEfiSmmCommunicationProtocolGuid + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf new file mode 100644 index 0000000000..7f90aa6ea0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbPeiV3 + FILE_GUID = E1B8CF4A-FE7B-4676-B4F7-50C7228282A4 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3PeiDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PeimEntryPoint + ApcbLibV3Pei + +[sources] + ApcbV3Pei.c + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf new file mode 100755 index 0000000000..0f115c362e --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = OemAgesaCcxPlatformLibNull + FILE_GUID = B1F58B07-0146-4804-B701-A56CB5716529 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = OemAgesaCcxPlatformLib + +[Sources.common] + OemAgesaCcxPlatformLibNull.c + +[Packages] + MdePkg/MdePkg.dec + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf new file mode 100644 index 0000000000..ba551e5c14 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf @@ -0,0 +1,61 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciCfg2 + FILE_GUID = 7A6DF3DB-1C0A-45C2-8251-AFE794D7D6B3 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = PeimInitializePciCfg + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC (EBC is for build only) +# + +[Sources] + PciExpressPciCfg2.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + + +[LibraryClasses] + PeimEntryPoint + BaseLib + PcdLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + HobLib + IoLib + +[Ppis] + gEfiPciCfg2PpiGuid ## PRODUCES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress + +[Pcd.IA32,Pcd.X64] + gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable ## SOMETIMES_CONSUMES + +[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64] + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES + +[Depex] + TRUE diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf new file mode 100644 index 0000000000..e712a80886 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciSegmentInfoLib + FILE_GUID = FA8B1082-88DF-4744-85A3-7F87A9EBF8DC + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciSegmentInfoLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + PciSegmentInfoLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + DebugLib + BaseLib diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf new file mode 100644 index 0000000000..f4b9d0d789 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspFlashAccLibSmm + FILE_GUID = 3BBDC3A5-A0E2-4E8A-8240-9E594920F040 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspFlashAccLib | DXE_SMM_DRIVER + +[Sources.common] + AmdPspFlashAccSpiNorLibSmm.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + AmdPspBaseLibV2 + BaseLib + DebugLib + SmmServicesTableLib + UefiBootServicesTableLib + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSpiSmmNorFlashProtocolGuid + +[Pcd] + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize ## CONSUMES + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress ## CONSUMES + +[Depex] + gEfiSmmBase2ProtocolGuid AND + gEfiSpiSmmNorFlashProtocolGuid + diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf new file mode 100644 index 0000000000..57bb0d9e25 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = PspRomArmorWhitelistLib + FILE_GUID = B6F8507A-C96B-4036-A8C0-26BAD6AC5F34 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformPspRomArmorWhitelistLib + +[Sources] + PspRomArmorWhitelistLib.c + +[Packages] + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseMemoryLib + MemoryAllocationLib + PcdLib + DebugLib + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf new file mode 100644 index 0000000000..64fd2913ad --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf @@ -0,0 +1,42 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = OobPprDxe + FILE_GUID = F91DCAB4-3639-11EE-BE56-0242AC120002 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = OobPprEntry + +[Sources] + OobPprDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DebugLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + MemoryAllocationLib + TimerLib + +[Protocols] + gEfiPciIoProtocolGuid #CONSUMES + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf new file mode 100644 index 0000000000..f4d7638c1a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PspPlatform + FILE_GUID = 28374747-76FF-41B3-9740-381EFAEF13BC + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = PspPlatformEntryPoint + +[Sources] + PspPlatformDriver.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + DebugLib + BaseLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf new file mode 100644 index 0000000000..973ace8632 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ServerHotplugDxe + FILE_GUID = FAFF8CA9-E515-44ed-B5F9-E2F6E5D902E3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = HotplugDescEntry + +[Sources] + ServerHotplugDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf new file mode 100644 index 0000000000..2d9dbeb715 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf @@ -0,0 +1,53 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoDynamicCommand + FILE_GUID = CCD8FEC8-1E30-45BD-8632-DB83A255FAC3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.1 + ENTRY_POINT = ActCommandInitialize + UNLOAD_IMAGE = ActLibraryUnregisterActCommand + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoDynamicCommand.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + UefiLib + FileHandleLib + HiiLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + +[Guids] + gShellActHiiGuid ## SOMETIMES_CONSUMES ## HII + gAgesaConfigDbPointerVariableGuid + +[Protocols] + gEfiShellDynamicCommandProtocolGuid + gEfiHiiPackageListProtocolGuid + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[DEPEX] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf new file mode 100644 index 0000000000..98c8755ab8 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf @@ -0,0 +1,50 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoToolApp + FILE_GUID = 470E1741-2DFE-43EF-861E-505CB3226DC0 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + ENTRY_POINT = ActCommandInitialize +# +# This flag specifies whether HII resource section is generated into PE image. +# + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoToolApp.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + FileHandleLib + HiiLib + MemoryAllocationLib + UefiApplicationEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + UefiLib + UefiRuntimeServicesTableLib + +[Protocols] + gEfiHiiPackageListProtocolGuid ## CONSUMES + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[Guids] + diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf new file mode 100644 index 0000000000..9c3c0dd0a9 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BasePlatformHookLibAmdFchUart + FILE_GUID = BF2F3F3F-4BE6-4B97-850D-D5D4941D391C + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformHookLib + +[Sources] + BasePlatformHookLibAmdFchUart.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + IoLib + PlatformHookLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Include/AGESA.h b/Platform/AMD/AgesaModulePkg/Include/AGESA.h new file mode 100644 index 0000000000..3ec03aafd3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AGESA.h @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AGESA_H_ +#define AGESA_H_ + +#include "AMD.h" +#include "SocLogicalId.h" + +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull +#define DESCRIPTOR_INITIALIZE_LIST 0x20000000ull + +/// PCIe link initialization +typedef enum { + EndpointDetect = 0, ///< Detect endpoint presence + EndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} PCIE_ENDPOINT_STATUS; + +/// PCIe port misc extended controls +typedef struct { + IN UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + IN UINT8 LinkSafeMode : 2; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through PCIe_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertise maximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 2; ///< Unused space +} PCIE_PORT_MISC_CONTROL; + +/// The IO APIC Interrupt Mapping Info +typedef struct { + IN UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + IN UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< - ABCD + ///< - BCDA + ///< - CDAB + ///< - DABC + IN UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< - Entry 0 of IO APIC redirection table + ///< - Entry 1 of IO APIC redirection table + ///< - Entry 31 of IO APIC redirection table +} APIC_DEVICE_INFO; + +/// GEN3 RxAdaptMode Configuration Structure +typedef struct { + IN BOOLEAN InitOffsetCancellation; ///< Initial Offset Cancellation Enable + IN UINT8 DFEControl; ///< DFE Control + IN UINT8 LEQControl; ///< LEQ Control + IN BOOLEAN DynamicOffsetCalibration; ///< Dynamic Offset Calibration Enable + IN BOOLEAN FOMCalculation; ///< FOM Calculation Enable + IN BOOLEAN PIOffsetCalibration; ///< PI Offset Calibratino Enable +} RX_ADAPT_MODE; + +/// PCIe port configuration data +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 ChannelType; ///< Channel type. + ///< 0 - "lowLoss", + ///< 1 - "highLoss", + ///< 2 - "mob0db", + ///< 3 - "mob3db", + ///< 4 - "extnd6db" + ///< 5 - "extnd8db" + IN UINT8 DeviceNumber; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 FunctionNumber; ///< Reserved for future use + IN UINT8 LinkSpeedCapability; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT8 ResetId; ///< Arbitrary number greater than 0 assigned by platform firmware for GPIO + ///< identification which control reset for given port. + ///< Each port with unique GPIO should have unique ResetId assigned. + ///< All ports use same GPIO to control reset should have same ResetId assigned. + ///< see AgesaPcieSlotResetContol. + IN UINT16 SlotNum; ///< Physical Slot Number + IN PCIE_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + IN PCIE_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + IN RX_ADAPT_MODE RxAdaptMode; ///< Gen3 RxAdaptMode configuration +} PCIE_PORT_DATA; + +/// PCIe Complex descriptor +typedef struct { + IN UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + IN UINT32 SocketId; ///< Socket Id + IN VOID *Reserved; ///< Reserved for future use +} PCIE_COMPLEX_DESCRIPTOR; + +/// VBIOS image info +typedef struct { + IN AMD_CONFIG_PARAMS StdHeader; ///< Standard configuration header + OUT VOID *ImagePtr; ///< Pointer to VBIOS image + IN PCI_ADDR GfxPciAddress; ///< PCI address of integrated graphics controller + IN UINT32 Flags; ///< BIT[0] - special repost requred +} GFX_VBIOS_IMAGE_INFO; + +// +// CPU MSR Register definitions +// +#define SYS_CFG 0xC0010010ul ///< Refer to AMD64 Architecture Programming manual. +#define TOP_MEM 0xC001001Aul ///< Refer to AMD64 Architecture Programming manual. +#define HWCR 0xC0010015ul ///< Refer to AMD64 Architecture Programming manual. + +/// +/// VDDP_VDDR Voltage Info for Low Power DIMM +/// +typedef struct _VDDP_VDDR_VOLTAGE { + IN BOOLEAN IsValid; ///< Indicates if daata is valid + IN UINT8 Voltage; ///< VDDP VDDR Voltage Value +} VDDP_VDDR_VOLTAGE; + +// CPU Build Configuration structures and definitions + +#define AMD_AP_MTRR_FIX64k_00000 0x00000250ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_80000 0x00000258ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_A0000 0x00000259ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C0000 0x00000268ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C8000 0x00000269ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_D0000 0x0000026Aul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_D8000 0x0000026Bul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E0000 0x0000026Cul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E8000 0x0000026Dul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F0000 0x0000026Eul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F8000 0x0000026Ful ///< Refer to AMD64 Architecture Programming manual + +#endif // AGESA_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AMD.h b/Platform/AMD/AgesaModulePkg/Include/AMD.h new file mode 100755 index 0000000000..062d9e1e1a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AMD.h @@ -0,0 +1,91 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_H_ +#define AMD_H_ + +/// The return status for all AGESA public services. +/// +/// Services return the most severe status of any logged event. Status other than SUCCESS, UNSUPPORTED, and BOUNDS_CHK +/// will have log entries with more detail. +/// +typedef enum { + AGESA_SUCCESS = 0, ///< 0 - The service completed normally. Info may be logged. + AGESA_UNSUPPORTED, ///< 1 - The dispatcher or create struct had an unimplemented function requested. + ///< Not logged. + AGESA_BOUNDS_CHK, ///< 2 - A dynamic parameter was out of range and the service was not provided. + ///< Example, memory address not installed, heap buffer handle not found. + ///< Not Logged. + AGESA_SYNC_MORE_DATA, ///< 3 - More data is available from PSP communications (used in ABL) + AGESA_SYNC_SLAVE_ASSERT, ///< 4 - Slave is at an ASSERT (used in ABL) + + // AGESA_STATUS of greater severity (the ones below this line), always have a log entry available. + AGESA_ALERT, ///< 5 - An observed condition, but no loss of function. See Log. + AGESA_WARNING, ///< 6 - Possible or minor loss of function. See Log. + AGESA_ERROR, ///< 7 - Significant loss of function, boot may be possible. See Log. + AGESA_CRITICAL, ///< 8 - Continue boot only to notify user. See Log. + AGESA_FATAL, ///< 9 - Halt booting. See Log, however Fatal errors pertaining to heap problems + ///< may not be able to reliably produce log events. + AGESA_OC_FATAL, ///< 10 - Halt booting. Critical Memory Overclock failure. (used in ABL) + AGESA_SKIP_ERROR, ///< 11 - Error, Skip init steps. (used in ABL) + AgesaStatusMax ///< Not a status, for limit checking. +} AGESA_STATUS; + +/** + Callout method to the host environment. + + Callout using a dispatch with appropriate thunk layer, which is determined by the host environment. + + @param[in] Function The specific callout function being invoked. + @param[in] FcnData Function specific data item. + @param[in,out] ConfigPtr Reference to Callout params. +**/ +typedef AGESA_STATUS (*CALLOUT_ENTRY) ( + IN UINT32 Function, + IN UINTN FcnData, + IN OUT VOID *ConfigPtr + ); + +/// AGESA Structures + +/// Extended PCI address format +typedef struct { + IN OUT UINT32 Register : 12; ///< Register offset + IN OUT UINT32 Function : 3; ///< Function number + IN OUT UINT32 Device : 5; ///< Device number + IN OUT UINT32 Bus : 8; ///< Bus number + IN OUT UINT32 Segment : 4; ///< Segment +} EXT_PCI_ADDR; + +/// Union type for PCI address +typedef union _PCI_ADDR { + IN UINT32 AddressValue; ///< Formal address + IN EXT_PCI_ADDR Address; ///< Extended address +} PCI_ADDR; + +/// +/// The standard header for all AGESA services. +/// +typedef struct { + IN UINT32 ImageBasePtr; ///< The AGESA Image base address. + IN UINT32 Func; ///< The service desired + IN UINT32 AltImageBasePtr; ///< Alternate Image location + IN CALLOUT_ENTRY CalloutPtr; ///< For Callout from AGESA + IN UINT8 HeapStatus; ///< For heap status from boot time slide. + IN UINT64 HeapBasePtr; ///< Location of the heap + IN OUT UINT8 Reserved[7]; ///< This space is reserved for future use. +} AMD_CONFIG_PARAMS; + +/// CPUID data received registers format +typedef struct { + OUT UINT32 EAX_Reg; ///< CPUID instruction result in EAX + OUT UINT32 EBX_Reg; ///< CPUID instruction result in EBX + OUT UINT32 ECX_Reg; ///< CPUID instruction result in ECX + OUT UINT32 EDX_Reg; ///< CPUID instruction result in EDX +} CPUID_DATA; +#endif // AMD_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h new file mode 100755 index 0000000000..534b03d4a7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h @@ -0,0 +1,15 @@ +/** @file + AMD CPU Register Table Related Functions. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_H_ +#define CPU_REGISTERS_H_ + +#include <CpuRegistersDef.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h new file mode 100644 index 0000000000..e086a4c9b1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h @@ -0,0 +1,61 @@ +/** @file + AMD Psp Directory header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_DIR_H_ +#define AMD_PSP_DIR_H_ + +#pragma pack (push, 1) +#define PSP_DIRECTORY_HEADER_SIGNATURE 0x50535024ul ///< $PSP +#define PSP_LV2_DIRECTORY_HEADER_SIGNATURE 0x324C5024ul ///< $PL2 + +/// Enum define various enum type for PSP entry type +enum _PSP_DIRECTORY_ENTRY_TYPE { + PSP_REGION_A_DIR = 0x48, ///< PSP entry points to PSP DIR in Region A + PSP_REGION_B_DIR = 0x4A, ///< PSP entry points to PSP DIR in Region B +}; + +/// Define structure for PSP directory +typedef struct { + UINT32 Cookie; ///< "$PSP" + UINT32 Checksum; ///< 32 bit CRC of header items below and the entire table + UINT32 TotalEntries; ///< Number of PSP Entries + UINT32 Reserved; ///< Unused +} PSP_DIRECTORY_HEADER; + +/// Define structure for 32 bits Entry type field +typedef struct { + UINT32 Type : 8; ///< Type of PSP Directory entry + UINT32 SubProgram : 8; ///< Specify the SubProgram + UINT32 RomId : 2; ///< Specify the ROM ID + UINT32 Reserved : 14; ///< Reserved +} PSP_DIRECTORY_ENTRY_TYPE_FIELD; + +/// Define union type for 32 bits Entry type field +typedef union { + PSP_DIRECTORY_ENTRY_TYPE_FIELD Field; ///< Definition of each filed + UINT32 Value; ///< Group it as 32bits Int +} PSP_DIRECTORY_ENTRY_TYPE; + +/// Structure for PSP Entry +typedef struct { + PSP_DIRECTORY_ENTRY_TYPE Type; ///< Type of PSP entry; 32 bit long + UINT32 Size; ///< Size of PSP Entry in bytes + UINT64 Location; ///< Location of PSP Entry (byte offset from start of SPI-ROM) +} PSP_DIRECTORY_ENTRY; + +/// Structure for PSP directory +typedef struct { + PSP_DIRECTORY_HEADER Header; ///< PSP directory header + PSP_DIRECTORY_ENTRY PspEntry[1]; ///< Array of PSP entries each pointing to a binary in SPI flash + ///< The actual size of this array comes from the + ///< header (PSP_DIRECTORY.Header.TotalEntries) +} PSP_DIRECTORY; + +#pragma pack (pop) +#endif //AMD_PSP_DIR_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h new file mode 100755 index 0000000000..faa8d35b1b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h @@ -0,0 +1,156 @@ +/** @file + AMD CPU Register Table Related Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_DEF_H_ +#define CPU_REGISTERS_DEF_H_ + +#undef BIT0 +#undef BIT1 +#undef BIT2 +#undef BIT3 +#undef BIT4 +#undef BIT5 +#undef BIT6 +#undef BIT7 +#undef BIT8 +#undef BIT9 +#undef BIT10 +#undef BIT10 +#undef BIT11 +#undef BIT12 +#undef BIT13 +#undef BIT14 +#undef BIT15 +#undef BIT16 +#undef BIT17 +#undef BIT18 +#undef BIT19 +#undef BIT20 +#undef BIT21 +#undef BIT22 +#undef BIT23 +#undef BIT24 +#undef BIT25 +#undef BIT26 +#undef BIT27 +#undef BIT28 +#undef BIT29 +#undef BIT30 +#undef BIT31 +#undef BIT32 +#undef BIT33 +#undef BIT34 +#undef BIT35 +#undef BIT36 +#undef BIT37 +#undef BIT38 +#undef BIT39 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT50 +#undef BIT51 +#undef BIT52 +#undef BIT53 +#undef BIT54 +#undef BIT55 +#undef BIT56 +#undef BIT57 +#undef BIT58 +#undef BIT59 +#undef BIT60 +#undef BIT61 +#undef BIT62 +#undef BIT63 + +#define BIT0 0x0000000000000001ull +#define BIT1 0x0000000000000002ull +#define BIT2 0x0000000000000004ull +#define BIT3 0x0000000000000008ull +#define BIT4 0x0000000000000010ull +#define BIT5 0x0000000000000020ull +#define BIT6 0x0000000000000040ull +#define BIT7 0x0000000000000080ull +#define BIT8 0x0000000000000100ull +#define BIT9 0x0000000000000200ull +#define BIT10 0x0000000000000400ull +#define BIT11 0x0000000000000800ull +#define BIT12 0x0000000000001000ull +#define BIT13 0x0000000000002000ull +#define BIT14 0x0000000000004000ull +#define BIT15 0x0000000000008000ull +#define BIT16 0x0000000000010000ull +#define BIT17 0x0000000000020000ull +#define BIT18 0x0000000000040000ull +#define BIT19 0x0000000000080000ull +#define BIT20 0x0000000000100000ull +#define BIT21 0x0000000000200000ull +#define BIT22 0x0000000000400000ull +#define BIT23 0x0000000000800000ull +#define BIT24 0x0000000001000000ull +#define BIT25 0x0000000002000000ull +#define BIT26 0x0000000004000000ull +#define BIT27 0x0000000008000000ull +#define BIT28 0x0000000010000000ull +#define BIT29 0x0000000020000000ull +#define BIT30 0x0000000040000000ull +#define BIT31 0x0000000080000000ull +#define BIT32 0x0000000100000000ull +#define BIT33 0x0000000200000000ull +#define BIT34 0x0000000400000000ull +#define BIT35 0x0000000800000000ull +#define BIT36 0x0000001000000000ull +#define BIT37 0x0000002000000000ull +#define BIT38 0x0000004000000000ull +#define BIT39 0x0000008000000000ull +#define BIT40 0x0000010000000000ull +#define BIT41 0x0000020000000000ull +#define BIT42 0x0000040000000000ull +#define BIT43 0x0000080000000000ull +#define BIT44 0x0000100000000000ull +#define BIT45 0x0000200000000000ull +#define BIT46 0x0000400000000000ull +#define BIT47 0x0000800000000000ull +#define BIT48 0x0001000000000000ull +#define BIT49 0x0002000000000000ull +#define BIT50 0x0004000000000000ull +#define BIT51 0x0008000000000000ull +#define BIT52 0x0010000000000000ull +#define BIT53 0x0020000000000000ull +#define BIT54 0x0040000000000000ull +#define BIT55 0x0080000000000000ull +#define BIT56 0x0100000000000000ull +#define BIT57 0x0200000000000000ull +#define BIT58 0x0400000000000000ull +#define BIT59 0x0800000000000000ull +#define BIT60 0x1000000000000000ull +#define BIT61 0x2000000000000000ull +#define BIT62 0x4000000000000000ull +#define BIT63 0x8000000000000000ull + +#define MSR_MMIO_CFG_BASE 0xC0010058ul // MMIO Configuration Base Address Register + +#endif // CPU_REGISTERS_DEF_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h new file mode 100644 index 0000000000..8ede1be838 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h @@ -0,0 +1,85 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FCH_REGISTER_COMMON_H_ +#define FCH_REGISTER_COMMON_H_ + +// Misc +#define R_FCH_ACPI_PM1_STATUS 0x00 +#define R_FCH_ACPI_PM1_ENABLE 0x02 +#define R_FCH_ACPI_PM_CONTROL 0x04 + +#define FCH_LPC_BUS 0 +#define FCH_LPC_DEV 20 +#define FCH_LPC_FUNC 3 + +#define ACPI_MMIO_BASE 0xFED80000ul +#define SMI_BASE 0x200 // DWORD +#define IOMUX_BASE 0xD00 // BYTE +#define MISC_BASE 0xE00 +#define PMIO_BASE 0x300 // DWORD + +// +// FCH LPC Device 0x780E +// Device 20 (0x14) Func 3 +// +#define FCH_LPC_REG48 0x48 // IO/Mem Port Decode Enable Register 5- RW +#define FCH_LPC_REG74 0x74 // Alternative Wide IO Range Enable- W/R +#define FCH_LPC_REG7C 0x7C // TPM (trusted plant form module) reg- W/R +#define FCH_LPC_REGA0 0x0A0 // SPI base address +#define FCH_LPC_REGB8 0x0B8 + +// +// FCH MMIO Base (SMI) +// offset : 0x200 +// +#define FCH_SMI_REG80 0x80 // SmiStatus0 +#define FCH_SMI_REG84 0x84 // SmiStatus1 +#define FCH_SMI_REG88 0x88 // SmiStatus2 +#define FCH_SMI_REG8C 0x8C // SmiStatus3 +#define FCH_SMI_REG90 0x90 // SmiStatus4 +#define FCH_SMI_REG98 0x98 // SmiTrig +#define FCH_SMI_REGA0 0xA0 +#define FCH_SMI_REGB0 0xB0 +#define FCH_SMI_REGC4 0xC4 + +// +// FCH MMIO Base (PMIO) +// offset : 0x300 +// +#define FCH_PMIOA_REG60 0x60 // AcpiPm1EvtBlk + +// +// +#define FCH_MISC_REG80 0x80 +// FCH SPI +// + +#define FCH_SPI_BASE_ADDRESS 0xFEC10000 + +#define FCH_SPI_MMIO_REG00 0x00 +#define FCH_SPI_FIFO_PTR_CRL 0x00100000l // +#define FCH_SPI_BUSY 0x80000000l // +#define FCH_SPI_MMIO_REG1D 0x1D // +#define FCH_SPI_MMIO_REG20 0x20 +#define FCH_SPI_MMIO_REG22 0x22 // +#define FCH_SPI_MMIO_REG30 0x30 // +#define FCH_SPI_R2VAL24 0x00000001l // +#define FCH_SPI_R2VAL25 0x00000002l // +#define FCH_SPI_R2MSK24 0x00000004l // +#define FCH_SPI_R2MSK25 0x00000008l // +#define FCH_SPI_MMIO_REG45_CMDCODE 0x45 // +#define FCH_SPI_MMIO_REG47_CMDTRIGGER 0x47 // +#define FCH_SPI_MMIO_REG48_TXBYTECOUNT 0x48 // +#define FCH_SPI_MMIO_REG4B_RXBYTECOUNT 0x4B // +#define FCH_SPI_MMIO_REG4C_SPISTATUS 0x4C // +#define FCH_SPI_MMIO_REG5C_Addr32_Ctrl3 0x5C // +#define FCH_SPI_SPIROM_PAGE_MASK 0xFF // +#define FCH_SPI_MMIO_REG80_FIFO 0x80 // + +#endif /* FCH_REGISTER_COMMON_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Filecode.h b/Platform/AMD/AgesaModulePkg/Include/Filecode.h new file mode 100644 index 0000000000..726479d79f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Filecode.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * Collectively assign unique filecodes for assert and debug to each source file. + * + * Publish values for decorated filenames, which can be used for + * ASSERT and debug support using a preprocessor define like: + * @n <tt> _#define FILECODE MY_C_FILENAME_FILECODE </tt> @n + * This file serves as a reference for debugging to associate the code and filename. + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: Include + * @e _$Revision: 312538 $ @e \$Date: 2015-02-09 16:53:54 +0800 (Mon, 09 Feb 2015) $ + */ + +#ifndef _FILECODE_H_ +#define _FILECODE_H_ + +#define UNASSIGNED_FILE_FILECODE (0xFFFF) + +#endif // _FILECODE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Gnb.h b/Platform/AMD/AgesaModulePkg/Include/Gnb.h new file mode 100755 index 0000000000..ddc9309d3d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Gnb.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_H_ +#define GNB_H_ + +#define PVOID UINT64 + +#endif // GNB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h new file mode 100644 index 0000000000..192e0d6a8b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h @@ -0,0 +1,521 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBDXIO_H_ +#define GNBDXIO_H_ + +#pragma pack (push, 1) + +#include <AGESA.h> +#include <Gnb.h> + +#define MAX_NUMBER_OF_COMPLEXES 16 + +#define DESCRIPTOR_TERMINATE_GNB 0x40000000ull +#define DESCRIPTOR_TERMINATE_TOPOLOGY 0x20000000ull +#define DESCRIPTOR_ALLOCATED 0x10000000ull +#define DESCRIPTOR_PLATFORM 0x08000000ull +#define DESCRIPTOR_COMPLEX 0x04000000ull +#define DESCRIPTOR_SILICON 0x02000000ull +#define DESCRIPTOR_PCIE_WRAPPER 0x01000000ull +#define DESCRIPTOR_PCIE_ENGINE 0x00800000ull +#define DESCRIPTOR_CXL_ENGINE 0x00200000ull + +#define SILICON_CXL_CAPABLE 0x00008000ull + +#define DESCRIPTOR_ALL_WRAPPERS (DESCRIPTOR_PCIE_WRAPPER) +#define DESCRIPTOR_ALL_ENGINES (DESCRIPTOR_PCIE_ENGINE | DESCRIPTOR_CXL_ENGINE) + +#define DESCRIPTOR_ALL_TYPES (DESCRIPTOR_ALL_WRAPPERS | DESCRIPTOR_ALL_ENGINES | DESCRIPTOR_SILICON | DESCRIPTOR_PLATFORM) +#define PcieLibGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) + +typedef UINT16 PCIE_ENGINE_INIT_STATUS; + +/// +/// Engine Configuration +/// +typedef struct { + IN UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + IN UINT16 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + IN UINT16 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG +} PCIE_ENGINE; + +/// +/// PCIe port misc extended controls +/// +typedef struct { + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 5; ///< Unused space +} PORT_MISC_CONTROL; + +/// +/// PCIe port configuration data +/// +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 FunctionNumber : 3; ///< Reserved for future use + IN UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 LinkSpeedCapability : 4; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm : 4; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT16 SlotNum; ///< Physical Slot Number + IN PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN UINT8 Reserved1; ///< Reserved for future use +} PORT_DATA; + +typedef struct { + UINT8 LinkSpeed; + UINT8 MaxPayloadSupport; + UINT8 AspmCapability; + UINT8 PciPmL1_1; + UINT8 PciPmL1_2; + UINT8 AspmL1_1; + UINT8 AspmL1_2; + UINT8 EsmSupport; + UINT8 LtrSupport; + UINT8 SurpriseDownErrorReport; + UINT8 TenBitTagSupport; + UINT8 AriForwarding; + UINT8 AcsSupport; + UINT8 AcsSourceValidation; + UINT8 AcsTranslationBlocking; + UINT8 AcsP2pRequestRedirect; + UINT8 AcsP2pCompletionRedirect; + UINT8 AcsUpstreamForwarding; + UINT8 AcsP2pEgressControl; + UINT8 AcsDirectTranslatedP2p; + UINT8 LaneMargining; + UINT8 DataLinkFeature; + UINT8 DownstreamPortContainment; + UINT8 AdvancedErrorReporting; + UINT8 ECRCSupport; + UINT8 MulticastEnable; + UINT8 NativePCIeEnclosureManagement; + UINT8 Capability1Address; + UINT8 Capability1Data; + UINT8 Capability2Address; + UINT8 Capability2Data; + UINT8 Capability3Address; + UINT8 Capability3Data; + UINT8 Capability4Address; + UINT8 Capability4Data; +} PORT_CAPABILITIES; + +/// +/// PCIe PORT_FEATURES +/// +typedef struct { + UINT8 LinkSpeedControl; + UINT8 MaxPayloadSizeControl; + UINT8 ESMControl; + UINT8 LTRControl; + UINT8 DataLinkFeatureExchangeControl; + UINT8 TenBitTagControl; + UINT8 ARIControl; + UINT8 ACSControl; + UINT8 RxLaneMarginingControl; + UINT8 DynLanesPwrState; + UINT8 L1PowerDown; + UINT8 L11PowerDown; + UINT8 L12PowerDown; + UINT8 AutoSpdChngEn; + UINT8 TurnOffUnusedLanes; +} PORT_FEATURES; + +typedef struct { + UINT8 SpcGen1 : 1; ///< SPC Mode 2P5GT + UINT8 SpcGen2 : 1; ///< SPC Mode 5GT + UINT8 SpcGen3 : 2; ///< SPC Mode 8GT + UINT8 SpcGen4 : 2; ///< SPC Mode 16GT + UINT8 SpcGen5 : 2; ///< SPC Mode 32GT +} SPC_MODE; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT32 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT32 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT32 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT32 LcPresetMask8Gt : 10; ///< Gen3 Preset Mask + UINT32 LcFapeEnable8GT : 1; ///< Gen3 FapeEnable + UINT32 UNUSED2 : 7; ///< Currently unassigned - for alignment +} GEN3_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT32 LcPresetMask16Gt : 10; ///< Gen4 Preset Mask + UINT32 LcFapeEnable16GT : 1; ///< Gen4 FapeEnable + UINT32 UNUSED3 : 13; ///< Currently unassigned - for alignment +} GEN4_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT32 LcPresetMask32Gt : 10; ///< Gen5 Preset Mask + UINT32 LcFapeEnable32GT : 1; ///< Gen5 FapeEnable + UINT32 PrecodeRequest : 1; ///< Precoding Request + UINT32 AdvertiseEqToHiRate : 1; ///< Advertise EQ To High Rate Support + UINT32 UNUSED4 : 11; ///< Currently unassigned - for alignment +} GEN5_LANE_CNTL; + +typedef struct { + UINT32 LcFapeReqPostCursor0 : 5; ///< PostCursor0 + UINT32 LcFapeReqPreCursor0 : 4; ///< PreCursor0 + UINT32 LcFapeReqPostCursor1 : 5; ///< PostCursor1 + UINT32 LcFapeReqPreCursor1 : 4; ///< PreCursor1 + UINT32 LcFapeReqPostCursor2 : 5; ///< PostCursor2 + UINT32 LcFapeReqPreCursor2 : 4; ///< PreCursor2 + UINT32 UNUSED6 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_0; + +typedef struct { + UINT32 LcFapeReqPostCursor3 : 5; ///< PostCursor3 + UINT32 LcFapeReqPreCursor3 : 4; ///< PreCursor3 + UINT32 LcFapeReqPostCursor4 : 5; ///< PostCursor4 + UINT32 LcFapeReqPreCursor4 : 4; ///< PreCursor4 + UINT32 LcFapeReqPostCursor5 : 5; ///< PostCursor5 + UINT32 LcFapeReqPreCursor5 : 4; ///< PreCursor5 + UINT32 UNUSED7 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_1; + +typedef struct { + UINT32 LcFapeReqPostCursor6 : 5; ///< PostCursor6 + UINT32 LcFapeReqPreCursor6 : 4; ///< PreCursor6 + UINT32 LcFapeReqPostCursor7 : 5; ///< PostCursor7 + UINT32 LcFapeReqPreCursor7 : 4; ///< PreCursor7 + UINT32 LcFapeReqPostCursor8 : 5; ///< PostCursor8 + UINT32 LcFapeReqPreCursor8 : 4; ///< PreCursor8 + UINT32 UNUSED8 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_2; + +typedef struct { + UINT32 LcFapeReqPostCursor9 : 5; ///< PostCursor9 + UINT32 LcFapeReqPreCursor9 : 4; ///< PreCursor9 + UINT32 LcFapeReqPostCursor10 : 5; ///< PostCursor10 + UINT32 LcFapeReqPreCursor10 : 4; ///< PreCursor10 + UINT32 LcFapeReqPostCursor11 : 5; ///< PostCursor11 + UINT32 LcFapeReqPreCursor11 : 4; ///< PreCursor11 + UINT32 UNUSED9 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_3; + +typedef struct { + UINT32 LcFapeReqPostCursor12 : 5; ///< PostCursor12 + UINT32 LcFapeReqPreCursor12 : 4; ///< PreCursor12 + UINT32 LcFapeReqPostCursor13 : 5; ///< PostCursor13 + UINT32 LcFapeReqPreCursor13 : 4; ///< PreCursor13 + UINT32 LcFapeReqPostCursor14 : 5; ///< PostCursor14 + UINT32 LcFapeReqPreCursor14 : 4; ///< PreCursor14 + UINT32 UNUSED10 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_4; + +typedef struct { + UINT32 LcFapeReqPostCursor15 : 5; ///< PostCursor15 + UINT32 LcFapeReqPreCursor15 : 4; ///< PreCursor15 + UINT32 LcFapeReqPostCursor16 : 5; ///< PostCursor16 + UINT32 LcFapeReqPreCursor16 : 4; ///< PreCursor16 + UINT32 LcFapeReqPostCursor17 : 5; ///< PostCursor17 + UINT32 LcFapeReqPreCursor17 : 4; ///< PreCursor17 + UINT32 UNUSED11 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_5; + +typedef struct { + UINT32 LcFapeReqPostCursor18 : 5; ///< PostCursor18 + UINT32 LcFapeReqPreCursor18 : 4; ///< PreCursor18 + UINT32 LcFapeReqPostCursor19 : 5; ///< PostCursor19 + UINT32 LcFapeReqPreCursor19 : 4; ///< PreCursor19 + UINT32 LcFapeReqPostCursor20 : 5; ///< PostCursor20 + UINT32 LcFapeReqPreCursor20 : 4; ///< PreCursor20 + UINT32 UNUSED12 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_6; + +/// +/// PCIe port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 IsBmcLocation : 1; ///< Port Location of BMC + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 TXDeEmphasis : 4; ///< TX De-emphasis + UINT8 TXMargin : 3; ///< TX Margin + UINT8 UNUSED1 : 1; ///< Currently unassigned - for alignment + + PORT_CAPABILITIES PortCapabilities; ///< Port Capabilities CBS + + SPC_MODE SpcMode; + + GEN3_LANE_CNTL LaneEqualizationCntl; + GEN4_LANE_CNTL Gen4LaneEqualizationCntl; + GEN5_LANE_CNTL Gen5LaneEqualizationCntl; + + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 UNUSED4 : 1; ///< Currently unassigned - for alignment + UINT8 SRIS_SRNS : 1; ///< SRIS SRNS + UINT8 SRIS_LowerSKPSupport : 1; ///< SRIS Lower SKP Support + UINT8 CcixControl : 1; ///< Bit to enable/disable ESM + UINT8 CxlControl : 1; ///< Bit to enable CXL Capability + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 SlotPowerLimitScale : 2; ///< Slot Power Limit Scale + UINT8 UNUSED5 : 1; ///< Currently unassigned - for alignment + + UINT8 RxMarginPersistence : 1; ///< Bit to enable/disable Rx Margin persistence mode + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 TxVetting : 1; ///< Gen4 Tx Vetting + UINT8 RxVetting : 1; ///< Gen4 Rx Vetting + UINT8 TxVettingGen5 : 1; ///< Gen5 Tx Vetting + UINT8 RxVettingGen5 : 1; ///< Gen5 Rx Vetting + + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 DlfCapDisable : 1; ///< DLF Capability 1:Disable 0:Enable + UINT8 DlfExchangeDisable : 1; ///< DLF Exchange 1:Disable 0:Enable + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + + UINT8 EqSearchMode : 2; ///< Equalization Search Mode + UINT8 BypassGen3EQ : 1; ///< BypassGen3EQ + UINT8 DisGen3EQPhase : 1; ///< Disable Gen3 EQ Phase2/3 + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset value + + UINT8 EqSearchModeGen4 : 2; ///< Equalization Search Mode for Gen4 + UINT8 BypassGen4EQ : 1; ///< Gen4 Bypass phase3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset value + UINT8 EqSearchModeGen5 : 2; ///< Equalization Search Mode for Gen5 + UINT8 BypassGen5EQ : 1; ///< Gen5 Bypass phase3 EQ + UINT8 DisGen5EQPhase : 1; ///< Gen5 Bypass phase2/3 EQ + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset value + + UINT16 PsppPolicyDC; ///< Pspp Policy DC + UINT16 PsppPolicyAC; ///< Pspp Policy AC + UINT8 PsppDeviceType; ///< Pspp Device Type + + LC_FAPE_GROUP_0 LcFapeSettingsGroup0; + LC_FAPE_GROUP_1 LcFapeSettingsGroup1; + LC_FAPE_GROUP_2 LcFapeSettingsGroup2; + LC_FAPE_GROUP_3 LcFapeSettingsGroup3; + LC_FAPE_GROUP_4 LcFapeSettingsGroup4; + LC_FAPE_GROUP_5 LcFapeSettingsGroup5; + LC_FAPE_GROUP_6 LcFapeSettingsGroup6; + + UINT8 ForceSteering : 1; ///< Steering is forced + UINT8 EsmUsTxPreset : 4; ///< ESM Upstream Tx Preset + UINT8 UNUSED13 : 3; ///< Currently unassigned - for alignment + + // Used by DXE + PORT_FEATURES PortFeatures; ///< Port Features CBS + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 I2CMuxInfo; ///< First I2c Mux on Bus + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:SRIS 2:SRNS 3:SRNS in SRIS 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 ClkReq : 4; ///< ClkReq:[0:3] + UINT8 EqPreset : 4; ///< EqPreset:[4:7] + UINT8 LinkAspmL1_1 : 1; ///< Enable PM L1 SS L1.1 + UINT8 LinkAspmL1_2 : 1; ///< Enable PM L1 SS L1.2 + UINT8 EsmControl : 1; ///< Bit to enable/disable ESM + UINT8 EsmDsTxPreset : 4; ///< ESM Downstream Tx Preset + UINT8 ClkReqFilterEn : 1; ///< Controls filtering of CLKREQb signal in LC in order to avoid false L1 substate entries/exits. +} PCIE_PORT_CONFIG; + +/// +/// CXL port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 UNUSED0 : 1; ///< Currently unassigned - for alignment + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 CxlIndex; + UINT8 CxlDeviceType : 2; ///< Type of CXL device connected + UINT8 CxlVersion : 2; ///< Version of CXL device connected (1=CXL1.1, 2=CXL2.0) + UINT8 IsCxlScanned : 1; ///< Indicates if the CXL device has been scanned + UINT8 ReportToMpioinDxe : 1; ///< Indicates if the CXL info needs to be reported to MPIO in DXE + UINT8 UNUSED1 : 2; ///< Currently unassigned - for alignment + + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT32 Mmio32Base; + UINT32 Mmio32Size; + UINT64 Mmio64Base; + UINT64 Mmio64Size; + UINT32 Mmio32Gran; +} PCIE_CXL_CONFIG; + +/// +/// Descriptor header +/// +typedef struct { + UINT32 DescriptorFlags; ///< Descriptor flags + UINT16 Parent; ///< Offset of parent descriptor + UINT16 Peer; ///< Offset of the peer descriptor + UINT16 Child; ///< Offset of the list of child descriptors +} PCIE_DESCRIPTOR_HEADER; + +/// +/// Engine configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor header + PCIE_ENGINE EngineData; ///< Engine Data + PCIE_ENGINE_INIT_STATUS InitStatus; ///< Initialization Status + UINT8 Scratch; ///< Scratch pad + union { + PCIE_PORT_CONFIG Port; ///< PCIe port configuration data + PCIE_CXL_CONFIG Cxl; ///< CXL Configuration data + } Type; +} PCIE_ENGINE_CONFIG; + +/// +/// Wrapper configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 WrapId; ///< Wrapper ID + UINT8 CcixCoreConfig; ///< Ccix CORE Configuration + UINT8 StartPhyLane; ///< Start PHY Lane + UINT8 EndPhyLane; ///< End PHY Lane + UINT8 StartDxioLane; ///< Start Dxio Lane (Translated) + UINT8 EndDxioLane; ///< End Dxio Lane (Translated) + struct { + UINT8 PowerOffUnusedLanes : 1; ///< Power Off unused lanes + UINT8 PowerOffUnusedPlls : 1; ///< Power Off unused Plls + UINT8 ClkGating : 1; ///< TXCLK gating + UINT8 LclkGating : 1; ///< LCLK gating + UINT8 TxclkGatingPllPowerDown : 1; ///< TXCLK clock gating PLL power down + UINT8 PllOffInL1 : 1; ///< PLL off in L1 + UINT8 AccessEncoding : 1; ///< Reg access encoding + UINT8 CoreReversed : 1; ///< Indicates lanes are reversed in package connection + } Features; + UINT8 MasterPll; ///< Bitmap of master PLL + UINT32 AcsSupport : 1; ///< Acs Support + UINT32 LtrSupport : 1; ///< LTR Support + UINT32 AriForwarding : 1; ///< ARI Forwarding + UINT32 LaneMargining : 1; ///< Lane Margining + UINT32 NativePCIeEnclosureManagement : 1; ///< NPEM + UINT32 DownstreamPortContainment : 1; ///< Downstream port containment + UINT32 AdvancedErrorReporting : 1; ///< Advacned Error Reporting + UINT32 ECRCSupport : 2; ///< ECRC Capability + UINT32 Reserved : 23; ///< Reserved bits +} PCIE_WRAPPER_CONFIG; + +/// +/// Silicon configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 SocketId; ///< Socket ID + UINT8 DieNumber; ///< Module ID + UINT8 RBIndex; ///< Physical Root Bridge + UINT8 InstanceId; ///< Logical Instance Identifier + PCI_ADDR Address; ///< PCI address of GNB host bridge + UINT16 StartLane; ///< Start Lane of this node + UINT16 EndLane; ///< End Lane of this node + UINT8 BusNumberLimit; ///< Last Bus Number assigned to this node + UINT8 SbPresent : 1; ///< Set to 1 if FCH connected to this NBIO + UINT8 SmuPresent : 1; ///< Set to 1 if SMU connected to this NBIO + UINT8 MP_Instance : 6; ///< MP Instance + UINT8 LogicalRBIndex; ///< Logical Root Bridge + UINT8 NumEngineDesc; ///< Total number of lane bifurcation descriptors +} PCIE_SILICON_CONFIG; + +typedef PCIE_SILICON_CONFIG GNB_HANDLE; + +/// +/// Complex configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 NodeId; ///< Processor Node ID + UINT8 Reserved; ///< For alignment +} PCIE_COMPLEX_CONFIG; + +/// +/// PCIe platform configuration info +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + PVOID Reserved1; ///< Reserved + UINT32 Reserved2; ///< Reserved + UINT32 PhyConfigData; ///< Phy Configuration Data + UINT32 Reserved3; ///< Reserved + UINT32 Reserved4; ///< Reserved + UINT32 PsppTuningParams; ///< Tuning parameters for PSPP + UINT32 PsppTuningParams2; ///< Tuning parameters 2 for PSPP + UINT8 Reserved5; ///< Reserved + UINT8 PsppPolicy; ///< PSPP policy + UINT8 Reserved6; ///< Reserved + UINT8 RootBridgesPerSocket; ///< Number of root bridges per socket + PCIE_COMPLEX_CONFIG ComplexList[MAX_NUMBER_OF_COMPLEXES]; ///< Complex +} PCIE_PLATFORM_CONFIG; + +/// +/// PCIe Engine Description +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor on wrapper + ///< Bit30 - Descriptor allocated for PCIe port + PCIE_ENGINE EngineData; ///< Engine Data +} PCIE_ENGINE_DESCRIPTOR; +#pragma pack (pop) + +#endif // GNBDXIO_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h new file mode 100644 index 0000000000..90f52cca7b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h @@ -0,0 +1,18 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _GNBREGISTERSRS_H_ +#define _GNBREGISTERSRS_H_ + +#include "GnbRegistersRS/IOHC.h" + +#ifndef NBIO_SPACE +#define NBIO_SPACE(HANDLE, ADDRESS) (ADDRESS + (HANDLE->RBIndex << 20)) +#endif + +#endif /*_GNBREGISTERSRS_H_*/ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h new file mode 100644 index 0000000000..b1a95237de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _IOHC_H_ +#define _IOHC_H_ + +// Bitfield Description : DBG MMIO enable. +#define DBG_BASE_ADDR_LO_DBG_MMIO_EN_OFFSET 0 + +// Bitfield Description : Locks the DBG MMIO address range and enable until the next warm reset. +#define DBG_BASE_ADDR_LO_DBG_MMIO_LOCK_OFFSET 1 + +#define SMN_IOHUB0NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13b102f0UL +#define IOAPIC_BASE_ADDR_LO_IOAPIC_BASE_ADDR_LO_MASK 0xffffff00 +#define SMN_IOHUB1NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13c102f0UL + +#endif /* _IOHC_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h new file mode 100644 index 0000000000..f5cc5e2228 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_PCIE_HOB_INFO_H_ +#define GNB_PCIE_HOB_INFO_H_ + +#define _GNB_PCIE_HOB_INFO_GUID \ +{ \ + 0x3eb1d90, 0xce14, 0x40d8, 0xa6, 0xba, 0x10, 0x3a, 0x8d, 0x7b, 0xd3, 0x2d \ +} +extern EFI_GUID gGnbPcieHobInfoGuid; + +#pragma pack (push, 1) +#define MAX_NUMBER_OF_CORES_PER_COMPLEX 3 +#define MAX_NUMBER_OF_PORTS_PER_COMPLEX 22 + +/// PCIe information HOB data +typedef struct _GNB_PCIE_INFORMATION_DATA_HOB { + EFI_HOB_GUID_TYPE EfiHobGuidType; ///< GUID Hob type structure + PCIE_PLATFORM_CONFIG PciePlatformConfigHob; ///< Platform Config Structure + UINT32 ComplexConfigs; ///< Allocation for Max Complex Structure suported +} GNB_PCIE_INFORMATION_DATA_HOB; + +#pragma pack (pop) + +#endif /* GNB_PCIE_HOB_INFO_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h new file mode 100644 index 0000000000..dc773737b9 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h @@ -0,0 +1,16 @@ +/** @file + Contains interface to the AMD AGESA library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_BASE_LIB_H_ +#define AMD_BASE_LIB_H_ + +#include "Uefi.h" +#include "AMD.h" + +#endif // AMD_BASE_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h new file mode 100644 index 0000000000..9d9892aa30 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h @@ -0,0 +1,43 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * PSP Mailbox related functions Prototype definition + * + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: PSP + * @e \$Revision: 312133 $ @e \$Date: 2015-02-03 02:47:45 +0800 (Tue, 03 Feb 2015) $ + */ + +#ifndef _PSP_MBOX_H_ +#define _PSP_MBOX_H_ + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ); + +#endif //_PSP_MBOX_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h new file mode 100644 index 0000000000..51935f413a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef BASE_FABRIC_TOPOLOGY_LIB_H_ +#define BASE_FABRIC_TOPOLOGY_LIB_H_ + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ); + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ); + +#endif // BASE_FABRIC_TOPOLOGY_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h new file mode 100644 index 0000000000..cae3aff9b3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h @@ -0,0 +1,16 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_BASE_LIB_H_ +#define _FCH_BASE_LIB_H_ + +#include <Library/IoLib.h> +#include <Library/PciLib.h> +#include <Library/BaseLib.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h new file mode 100644 index 0000000000..345e39adce --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h @@ -0,0 +1,413 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_ESPI_CMD_LIB_H_ +#define _FCH_ESPI_CMD_LIB_H_ + +#include <Uefi/UefiBaseType.h> + +#define MAX_ESPI_RETRY 100000ul +// +// Cycle Type +// +#define CYCLE_TYPE_FLASH_READ 0 +#define CYCLE_TYPE_FLASH_WRITE 1 +#define CYCLE_TYPE_FLASH_ERASE 2 +#define CYCLE_TYPE_RPMC_OP1 3 +#define CYCLE_TYPE_RPMC_OP2 4 + +// RPMC OP1/OP2 Command Payload Max Length (512 Bits) +#define RPMC_CMD_PAYLOAD_MAX_LEN 0x40 + +// +// Master Registers +// +#define SET_CONFIGURATION 0 +#define GET_CONFIGURATION 1 +#define IN_BAND_RESET 2 +#define PC_MSG_DOWN_STREAM 4 +#define VM_DOWN_STREAM 5 +#define OOB_DOWN_STREAM 6 +#define FA_DOWN_STREAM 7 + +// ESPIx00 +#define DNCMD_STATUS BIT3 + +// ESPIx2C Master Capability +#define MASTER_FA_SUPPORT BIT0 +#define MASTER_OOB_SUPPORT BIT1 +#define MASTER_VW_SUPPORT BIT2 +#define MASTER_PERIPHERAL_SUPPORT BIT3 + +// ESPIx68 Slave0 Configuration +#define SLAVE_FA_ENABLE BIT0 +#define SLAVE_OOB_ENABLE BIT1 +#define SLAVE_VW_ENABLE BIT2 +#define SLAVE_PC_ENABLE BIT3 + +/// eSPIx00 eSPI Software Specific Register 0 +#define ESPI_DN_TXHDR_0 0x00 +typedef union { + struct { + UINT32 SWCommandType : 3; + UINT32 CommandStatus : 1; + UINT32 PutFlashNpTranActive : 1; + UINT32 Reserved : 3; + UINT32 DnCmdHdata0 : 8; + UINT32 DnCmdHdata1 : 8; + UINT32 DnCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx00_DN_TXHDR0; + +/// eSPIx04 eSPI Software Specific Register 1 +#define ESPI_DN_TXHDR_1 0x04 +typedef union { + struct { + UINT32 DnCmdHdata3 : 8; + UINT32 DnCmdHdata4 : 8; + UINT32 DnCmdHdata5 : 8; + UINT32 DnCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx04_DN_TXHDR1; + +#define ESPI_DN_TXHDR_2 0x08 +typedef union { + struct { + UINT32 DnCmdHdata7 : 8; + UINT32 Reserved : 24; + } Field; + UINT32 Value; +} ESPIx08_DN_TXHDR2; + +#define ESPI_DN_TXDATA_PORT 0x0C +typedef union { + struct { + UINT32 DnTxData0 : 8; + UINT32 DnTxData1 : 8; + UINT32 DnTxData2 : 8; + UINT32 DnTxData3 : 8; + } Field; + UINT32 Value; +} ESPIx0C_DN_TXDATA_PORT; + +#define ESPI_UP_RXHDR_0 0x10 +typedef union { + struct { + UINT32 UpCommandType : 3; + UINT32 UpCommandStatus : 1; + UINT32 SlaveSel : 2; + UINT32 Reserved : 2; + UINT32 UpCmdHdata0 : 8; + UINT32 UpCmdHdata1 : 8; + UINT32 UpCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx10_UP_RXHDR0; + +#define ESPI_UP_RXHDR_1 0x14 +typedef union { + struct { + UINT32 UpCmdHdata3 : 8; + UINT32 UpCmdHdata4 : 8; + UINT32 UpCmdHdata5 : 8; + UINT32 UpCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx14_UP_RXHDR1; + +#define ESPI_UP_RXDATA_PORT 0x18 + +/// eSPIx2C eSPI Master Capability +#define ESPI_MASTER_CAP 0x2C +typedef union { + struct { + UINT32 FlashAccessChannelSupport : 1; + UINT32 OOBMessageChannelSupport : 1; + UINT32 VWChannelSupport : 1; + UINT32 PChannelSupport : 1; + UINT32 MasterVersion : 3; + UINT32 FlashAccessChannelMaxPayload : 3; + UINT32 OOBMessageChannelMaxPayload : 3; + UINT32 OperatingMaxVWCount : 6; + UINT32 PChannelMaxPayloadSize : 3; + UINT32 NumberOfSlave : 3; + UINT32 OperatingSupportFreq : 3; + UINT32 IOMode : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheck : 1; + } Field; + UINT32 Value; +} ESPIx2C_MASTER_CAP; + +/// eSPIx30 eSPI Global Control 0 +#define ESPI_GLOBAL_CTRL0 0x30 +typedef union { + struct { + UINT32 WdgEn : 1; + UINT32 WaitChkEn : 1; + UINT32 PrClkgatEn : 1; + UINT32 AlStopEn : 1; + UINT32 AlIdleTimer : 3; + UINT32 RgDbgclkGatingEn : 1; + UINT32 WdgCnt : 16; + UINT32 WaitCnt : 6; + UINT32 PrRstEnPltrst : 1; + UINT32 SafsClkGateEn : 1; + } Field; + UINT32 Value; +} ESPIx30_GLOBAL_CTRL0; + +/// eSPIx68 eSPI Slave0 Configuration +#define ESPI_SLAVE0_CONFIG 0x68 +typedef union { + struct { + UINT32 FlashAccessChannelEnable : 1; + UINT32 OOBMessageChannelEnable : 1; + UINT32 VWChannelEnable : 1; + UINT32 PChannelEnable : 1; + UINT32 FlashSharingMode : 1; + UINT32 FlashMaxPayloadSize : 3; + UINT32 PutFlashNpHeaderDataEn : 1; + UINT32 PutFlashNpHeaderEn : 1; + UINT32 SafsDeferValidEn : 1; + UINT32 FlashModifierEn : 1; + UINT32 Reserved_24_12 : 13; + UINT32 OperatingFreq : 3; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheckingEnable : 1; + } Field; + UINT32 Value; +} ESPIx68_SLAVE0_CONFIG; + +/// eSPIx70 eSPI Slave0 Interrupt Status +#define ESPI_SLAVE0_INT_STS 0x70 +typedef union { + struct { + UINT32 BusErrInt : 1; + UINT32 WaitTimeoutInt : 1; + UINT32 CrcErrInt : 1; + UINT32 Reserved_3 : 1; + UINT32 NoRspInt : 1; + UINT32 FatalErrInt : 1; + UINT32 NonFatalErrInt : 1; + UINT32 UnknownRspInt : 1; + UINT32 UnknownCtInt : 1; + UINT32 UnsucssCplInt : 1; + UINT32 IllegalTagInt : 1; + UINT32 IllegalLenInt : 1; + UINT32 RxOobOverflowInt : 1; + UINT32 RxMsgOverflowInt : 1; + UINT32 RxFlashOverflowInt : 1; + UINT32 ProtocolErrInt : 1; + UINT32 Reserved_16 : 1; + UINT32 UpFifoWdgTo : 1; + UINT32 MstAbortInt : 1; + UINT32 WdgTimeoutInt : 1; + UINT32 Reserved_23_20 : 4; + UINT32 RxVwGrp0Int : 1; + UINT32 RxVwGrp1Int : 1; + UINT32 RxVwGrp2Int : 1; + UINT32 RxVwGrp3Int : 1; + UINT32 DnCmdInt : 1; + UINT32 RxMsgInt : 1; + UINT32 RxOobInt : 1; + UINT32 FlashReqInt : 1; + } Field; + UINT32 Value; +} ESPIx70_SLAVE0_INT_STS; + +/// +/// Slave Registers +/// +#define SLAVE_REG_ID 0x04 +#define SLAVE_GENERAL_CAPCFG 0x08 +#define SLAVE_PC_CAPCFG 0x10 +#define SLAVE_VW_CAPCFG 0x20 +#define SLAVE_OOB_CAPCFG 0x30 +#define SLAVE_FA_CAPCFG 0x40 +#define SLAVE_FA_CAPCFG2 0x44 + +/// Offset 04h: Device Identification +typedef union { + struct { + UINT32 RO_VersionID : 8; + UINT32 Reserved_31_8 : 24; + } Field; + UINT32 Value; +} ESPI_SL04_DEVICE_ID; + +// SLAVE offset 0x08 SLAVE_GENERAL_CAPCFG +#define SLAVE_FA_SUPPORT BIT3 +#define SLAVE_OOB_SUPPORT BIT2 +#define SLAVE_VW_SUPPORT BIT1 +#define SLAVE_PERIPHERAL_SUPPORT BIT0 +/// Offset 08h: General Capabilities and Configurations +typedef union { + struct { + UINT32 RO_PCSupported : 1; + UINT32 RO_VWSupported : 1; + UINT32 RO_OOBMsgSupported : 1; + UINT32 RO_FASupported : 1; + UINT32 Reserved_7_3 : 4; + UINT32 Reserved_11_8 : 4; + UINT32 RO_MaxWaitStateAllowed : 4; + UINT32 RO_MaxFreqSupported : 3; + UINT32 RO_OpenDrainAlertSupported : 1; + UINT32 OperatingFreq : 3; + UINT32 OpenDrainAlertSelect : 1; + UINT32 RO_IOModeSupported : 2; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 Reserved_29 : 1; + UINT32 ResponseModifierEn : 1; + UINT32 CRCCheckingEn : 1; + } Field; + UINT32 Value; +} ESPI_SL08_SLAVE_GENERAL_CAPCFG; + +/// Offset 10h: Channel 0 Capabilities and Configurations +typedef union { + struct { + UINT32 PCEn : 1; + UINT32 RO_PCReady : 1; + UINT32 BusMasterEn : 1; + UINT32 Reserved_3 : 1; + UINT32 RO_PCMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 PCMaxPayloadSizeSelected : 3; + UINT32 Reserved_11 : 1; + UINT32 PCMaxReadRequestSize : 3; + UINT32 Reserved_31_15 : 17; + } Field; + UINT32 Value; +} ESPI_SL10_SLAVE_PC_CAPCFG; + +/// Offset 20h: Channel 1 Capabilities and Configurations +typedef union { + struct { + UINT32 VWEn : 1; + UINT32 RO_VWReady : 1; + UINT32 Reserved_7_2 : 6; + UINT32 RO_MaxVWCntSupported : 6; + UINT32 Reserved_15_14 : 2; + UINT32 OpMaxVWCnt : 6; + UINT32 Reserved_31_22 : 10; + } Field; + UINT32 Value; +} ESPI_SL20_SLAVE_VW_CAPCFG; + +/// Offset 30h: Channel 2 Capabilities and Configurations +typedef union { + struct { + UINT32 OOBEn : 1; + UINT32 RO_OOBReady : 1; + UINT32 Reserved_3_2 : 2; + UINT32 RO_MsgChMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 MsgChMaxPayloadSizeSelected : 3; + UINT32 Reserved_31_11 : 21; + } Field; + UINT32 Value; +} ESPI_SL30_SLAVE_OOB_CAPCFG; + +/// Offset 40h: Channel 3 Capabilities and Configurations +typedef union { + struct { + UINT32 FAEn : 1; + UINT32 RO_FAReady : 1; + UINT32 FlashBlockEraseSize : 3; + UINT32 RO_ChMaxPayloadSizeSupported : 3; + UINT32 ChMaxPayloadSizeSelected : 3; + UINT32 RO_FlashSharingMode : 1; + UINT32 ChMaxReadReqSize : 3; + UINT32 Reserved_15 : 1; + UINT32 RO_FlashSharingCapabilitySupported : 2; + UINT32 Reserved_19_18 : 2; + UINT32 RO_RPMCCounterOn1stDevice : 4; + UINT32 RO_RPMCOp1On1stDevice : 8; + } Field; + UINT32 Value; +} ESPI_SL40_SLAVE_FA_CAPCFG; + +/// Offset 44h: Channel 3 Capabilities and Configurations2 +typedef union { + struct { + UINT32 RO_TargetMaxReadReqSizeSupported : 3; + UINT32 Reserved_7_3 : 5; + UINT32 RO_TargetFlashEraseBlockSize : 8; + UINT32 RO_TargetRPMCSupported : 6; + UINT32 RO_NumOfRPMCdevices : 2; + UINT32 Reserved_31_24 : 8; + } Field; + UINT32 Value; +} ESPI_SL44_SLAVE_FA_CAPCFG2; + +// +// eSPI Command functions +// +VOID +FchEspiCmd_InBandRst ( + IN UINT32 EspiBase + ); + +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ); + +VOID +FchEspiCmd_SetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr, + IN UINT32 Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp1 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + IN UINT8 *Data + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp2 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h new file mode 100755 index 0000000000..19688e2548 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h @@ -0,0 +1,16 @@ +/** @file + GNB PCIe Library definition. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBPCIECONFIG_LIB_H_ +#define GNBPCIECONFIG_LIB_H_ + +#include <GnbDxio.h> +#include <Library/PcieConfigLib.h> + +#endif // GNBPCIECONFIG_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h new file mode 100644 index 0000000000..df88274530 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h @@ -0,0 +1,37 @@ +/** @file + Header file of AMD NBIO Common DXE library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOCOMMONLIBDXE_H_ +#define NBIOCOMMONLIBDXE_H_ + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ); + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ); + +#endif // NBIOCOMMONLIBDXE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h new file mode 100755 index 0000000000..4fec578a9f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h @@ -0,0 +1,62 @@ +/** @file + GNB function to GetHostPciAddress and GetHandle. + Contain code that create/locate and rebase configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOHANDLELIB_LIB_H_ +#define NBIOHANDLELIB_LIB_H_ + +#include <GnbDxio.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ); + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ); + +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define GnbGetSocketId(Handle) (Handle != NULL ? (Handle)->SocketId : 0) +#define GnbGetDieNumber(Handle) (Handle != NULL ? (Handle)->DieNumber : 0) +#define GnbGetRBIndex(Handle) (Handle != NULL ? (Handle)->RBIndex : 0) + +#endif // NBIOHANDLELIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h new file mode 100644 index 0000000000..9f53746814 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h @@ -0,0 +1,283 @@ +/** @file + Helper functions to access PCIe configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PCIECONFIGLIB_LIB_H_ +#define PCIECONFIGLIB_LIB_H_ + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_WRAPPER_CALLBACK) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK2) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +typedef VOID (*PCIE_RUN_ON_WRAPPER_CALLBACK2) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_DESCRIPTOR_CALLBACK) ( + IN PCIE_DESCRIPTOR_HEADER *Descriptor, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ); + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ); + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ); + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ); + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ); + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ); + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ); + +#define PcieConfigGetParentWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetParent (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetParentSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetParent (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetParentComplex(Descriptor) ((PCIE_COMPLEX_CONFIG *) PcieConfigGetParent (DESCRIPTOR_COMPLEX, &((Descriptor)->Header))) +#define PcieConfigGetPlatform(Descriptor) ((PCIE_PLATFORM_CONFIG *) PcieConfigGetParent (DESCRIPTOR_PLATFORM, &((Descriptor)->Header))) +#define PcieConfigGetChildWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetChildEngine(Descriptor) ((PCIE_ENGINE_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_ENGINES, &((Descriptor)->Header))) +#define PcieConfigGetChildSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetChild (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetNextDescriptor(Descriptor) ((((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : ((Descriptor + 1)))) +#define PcieConfigIsPcieEngine(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_ENGINE) != 0) : FALSE) +#define PcieConfigIsSbPcieEngine(Engine) ((Engine != NULL) ? ((BOOLEAN) (Engine->Type.Port.PortData.MiscControls.SbLink)) : FALSE) +#define PcieConfigIsEngineAllocated(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_ALLOCATED) != 0) : FALSE) +#define PcieConfigSetDescriptorFlags(Descriptor, SetDescriptorFlags) if (Descriptor != NULL) (Descriptor)->Header.DescriptorFlags |= SetDescriptorFlags +#define PcieConfigResetDescriptorFlags(Descriptor, ResetDescriptorFlags) if (Descriptor != NULL) ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags &= (~(ResetDescriptorFlags)) +#define PcieInputParsetGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) +#define PcieConfigGetNextTopologyDescriptor(Descriptor, Termination) ((Descriptor == NULL) ? NULL : ((((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags & Termination) != 0) ? NULL : ((UINT8 *) Descriptor + ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->Peer)) +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define PcieConfigGetNextDataDescriptor(Descriptor) ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0 ? NULL : (Descriptor + 1)) + +#endif // PCIECONFIGLIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h new file mode 100644 index 0000000000..f0c6d1ccbb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _SMNACCESSLIB_H_ +#define _SMNACCESSLIB_H_ + +VOID +SmnRegisterReadS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + OUT VOID *Value + ); + +VOID +SmnRegisterRMWS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + IN UINT32 AndMask, + IN UINT32 OrValue, + IN UINT32 Flags + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h new file mode 100644 index 0000000000..0e08e64b24 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h @@ -0,0 +1,47 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_PCIE_SERVICES_PROTOCOL_H_ +#define NBIO_PCIE_SERVICES_PROTOCOL_H_ + +// Current PROTOCOL revision +#define AMD_NBIO_PCIE_SERVICES_REVISION 0x00 + +/// +/// Forward declaration for the NBIO_PCIE_SERVICES_PROTOCOL +/// +typedef struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL; + +// +// Protocol Definitions +// + +/** + Returns the NBIO debug options configuration structure + This + A pointer to the DXE_AMD_NBIO_SMU_SERVICES_PROTOCOL instance. + DebugOptions + A pointer to a pointer to store the address of the PCIe topology structure +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT)( + IN DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL *This, + OUT UINT32 **DebugOptions + ); + +/// +/// The Dxe of PCIE Services +/// +struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL { + AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT PcieGetTopology; ///< +}; + +extern EFI_GUID gAmdNbioPcieServicesProtocolGuid; + +#endif /* NBIO_PCIE_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h new file mode 100644 index 0000000000..10d3b730a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_OEM_OOB_PPR_PROTOCOL_H_ +#define _AMD_OEM_OOB_PPR_PROTOCOL_H_ + +extern EFI_GUID gAmdOemOobPprDxeProtocolGuid; + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h new file mode 100644 index 0000000000..a15995188b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h @@ -0,0 +1,155 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_NUMA_SERVICES2_H_ +#define FABRIC_NUMA_SERVICES2_H_ +#include "AMD.h" + +#pragma pack (push, 1) + +#define MAX_PXM_VALUES_PER_QUADRANT 16 + +/// Domain type +typedef enum { + NumaDram, + NumaSLink, + NumaCxl, + MaxNumaDomainType2 +} DOMAIN_TYPE2; + +/// Reported Domain Info +typedef struct { + DOMAIN_TYPE2 Type; ///< Type + UINT32 SocketMap; ///< Bitmap indicating physical socket location + UINT32 PhysicalDomain; ///< Physical domain number +} DOMAIN_INFO2; + +/// Physical Dram Info +typedef struct { + UINT32 NormalizedCsMap; ///< Bitmap of CSs comprising this physical domain + UINT32 SharingEntityCount; ///< Number of virtual domains sharing this physical domain + UINT32 SharingEntityMap; ///< Bitmap of reported domains that share this physical domain + UINT32 Reserved; ///< Reserved +} PHYS_DOMAIN_INFO; + +/// Proximity Domain Info +typedef struct { + UINTN Count; ///< Entries in Domain array + UINTN Domain[MAX_PXM_VALUES_PER_QUADRANT]; ///< Domains in Quadrant +} PXM_DOMAIN_INFO; + +/// +/// Forward declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL +/// +typedef struct _FABRIC_NUMA_SERVICES2_PROTOCOL FABRIC_NUMA_SERVICES2_PROTOCOL; + +/** + * @brief Get the numa domain information. + * + * @details Get the numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfDomainsInSystem Number of unique NUMA domains + * @param[out] DomainInfo An array with information about each domain + * @param[out] CcxAsNumaDomain TRUE: each core complex is its own domain + * FALSE: physical mapping is employed + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfDomainsInSystem, + OUT DOMAIN_INFO2 **DomainInfo, + OUT BOOLEAN *CcxAsNumaDomain + ); + +/** + * @brief Translates a core's physical location to the appropriate NUMA domain. + * + * @details Translates a core's physical location to the appropriate NUMA domain. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] Socket Zero based socket that the core is attached to + * @param[in] Die DF die on socket that the core is attached to + * @param[in] Ccd Logical CCD the core is on + * @param[in] Ccx Logical core complex + * @param[out] Domain Domain the core belongs to + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_DOMAIN_XLAT)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN UINTN Socket, + IN UINTN Die, + IN UINTN Ccd, + IN UINTN Ccx, + OUT UINT32 *Domain + ); + +/** + * @brief Get physical numa domain information. + * + * @details Get physical numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfPhysDomainsInSystem Number of valid domains in the system + * @param[out] PhysDomainInfo An array with information about each physical domain + * @param[out] PhysNodesPerSocket Actual NPS as determined by ABL (not including SLink) + * @param[out] NumberOfSystemSLinkDomains Number of domains describing SLink connected memory + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfPhysDomainsInSystem, + OUT PHYS_DOMAIN_INFO **PhysDomainInfo, + OUT UINT32 *PhysNodesPerSocket, + OUT UINT32 *NumberOfSystemSLinkDomains + ); + +/** + * @brief Get the proximity domain information about a PCIe root-port bridge + * + * @details Get the proximity domain information about a PCIe root-port bridge + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] RootPortBDF BDF for root-port bridge in PCI_ADDR format. + * @param[out] PxmDomainInfo Pointer to a structure returning associated NUMA node(s). + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN PCI_ADDR RootPortBDF, + OUT PXM_DOMAIN_INFO *PxmDomainInfo + ); + +/// +/// When installed, the Fabric NUMA Services 2 Protocol produces a collection of +/// services that return various information associated with non-uniform memory +/// architecture. +/// +struct _FABRIC_NUMA_SERVICES2_PROTOCOL { + UINTN Revision; ///< Revision Number + FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO GetDomainInfo; ///< Get Domain Info + FABRIC_NUMA_SERVICES2_DOMAIN_XLAT DomainXlat; ///< Domain Translation + FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO GetPhysDomainInfo; ///< Get Physical Domain Info + FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO GetPxmDomainInfo; ///< Get Proximity Domain Info +}; + +/// +/// Guid declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL. +/// +extern EFI_GUID gAmdFabricNumaServices2ProtocolGuid; + +#pragma pack (pop) +#endif // _FABRIC_NUMA_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h new file mode 100644 index 0000000000..485240c0fb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_TOPOLOGY_SERVICES2_H_ +#define FABRIC_TOPOLOGY_SERVICES2_H_ + +#include <Library/BaseFabricTopologyLib.h> + +#endif // FABRIC_TOPOLOGY_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h new file mode 100755 index 0000000000..44093e4097 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h @@ -0,0 +1,23 @@ +/** @file + SoC Logical ID Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SOC_LOGICAL_ID_H_ +#define SOC_LOGICAL_ID_H_ +#pragma pack (push, 1) + +/// +/// SOC logical ID structure +/// +typedef struct _SOC_LOGICAL_ID { + IN OUT UINT32 Family; ///< Indicates logical ID Family + IN OUT UINT16 Revision; ///< Indicates logical ID Revision +} SOC_LOGICAL_ID; + +#pragma pack (pop) +#endif // SOC_LOGICAL_ID_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h new file mode 100644 index 0000000000..a60ae20d33 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h @@ -0,0 +1,100 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_LIB_H_ +#define _INTERNAL_AML_LIB_H_ + +#include <Uefi.h> +#include <Library/AmlGenerationLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <IndustryStandard/Acpi.h> + +#include "LocalAmlObjects.h" + +// EDK2 open source MdePkg/Include/IndustryStandard/AcpiAml.h does not have +// these and should. +#define AML_DIGIT_CHAR_0 0x30 +#define AML_DIGIT_CHAR_9 0x39 + +// The max string size for a QWord is 8 bytes = 16 characters plus NULL Terminator +#define MAX_AML_DATA_INTEGER_SIZE 17 + +// Defines similar to ctype.h functions isalpha() and isdigit() +#define IS_ASCII_UPPER_ALPHA(c) ( ((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_Z) ) +#define IS_ASCII_HEX_DIGIT(c) ( (((c) >= AML_DIGIT_CHAR_0) && ((c) <= AML_DIGIT_CHAR_9)) ||\ + (((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_F)) ) + +// Swap bytes of upper and lower WORDs within a DWORD +#define Swap4Bytes(val) \ + ( (((val) >> 8) & 0x000000FF) | (((val) << 8) & 0x0000FF00) | \ + (((val) >> 8) & 0x00FF0000) | (((val) << 8) & 0xFF000000) ) + +/* + Calculates the optimized integer value used by AmlDataInteger and others + + Not a public function so no doxygen comment identifiers. + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ); + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ); + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - Field NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h new file mode 100644 index 0000000000..b19b6fe867 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h @@ -0,0 +1,150 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_OBJECTS_H_ +#define _INTERNAL_AML_OBJECTS_H_ + +// #include "LocalAmlLib.h" + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **Object, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ); + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ); + +#endif // _INTERNAL_AML_OBJECTS_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h new file mode 100755 index 0000000000..3a628ed0b2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h @@ -0,0 +1,432 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCIE_COMPLEX_H_ +#define AMD_PCIE_COMPLEX_H_ + +// +// GNB PCIe configuration info +// +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull + +// +// Port parameter count +// +#define PCIE_PORT_PARAMETER_COUNT 64 + +/// +/// PCIe link initialization +/// DXIO endpoint status +/// +typedef enum { + DxioEndpointDetect = 0, ///< Detect endpoint presence + DxioEndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} DXIO_ENDPOINT_STATUS; + +#pragma pack(push,1) +typedef struct { + UINT16 ParamType; ///< This identifies a specific port parameter to set. + UINT16 ParamValue; ///< Specifies the value to be assigned to port parameter. +} PORT_PARAM; + +typedef struct { + PORT_PARAM PhyParam[PCIE_PORT_PARAMETER_COUNT]; ///< PHY port parameter +} PORT_PARAMS; + +/// +/// Ancillary data struct with table size and address +/// +typedef struct { + IN UINT32 Count; ///< Total count in this Ancillary data table + IN UINT32 Ovrd; ///< Ancillary data table address point to ANC_DATA_PARAM[] +} ANC_DATA; + +typedef struct { + UINT16 ParamType; ///< This identifies a specific PHY parameter + UINT16 ParamValue; ///< This specifies the value to be assigned to indicated PHY parameter +} DXIO_PHY_PARAM; + +typedef struct { + DXIO_PHY_PARAM PhyParam[44]; ///< physical parameter +} PHY_DATA; + +/// +/// PCIe specific data structures +/// PCIe port misc extended controls +/// +typedef struct { + UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + UINT8 LinkSafeMode : 1; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through DXIO_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertize muximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + UINT8 ChannelType : 3; ///< Channel Type + ///< 0 - Channel Type Not Specified + ///< - Channel Type Short Trace + ///< 2 - Channel Type Long Trace + UINT8 TurnOffUnusedLanes : 1; ///< Turn Off Unused Lanes + ///< 0 - Turn on + ///< 1 - Turn off +} DXIO_PORT_MISC_CONTROL; + +/// +/// The IO APIC Interrupt Mapping Info +/// +typedef struct { + UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< 0 - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< 1 - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< 2 - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< ... + ///< 8 - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< 0 - ABCD + ///< 1 - BCDA + ///< 2 - CDAB + ///< 3 - DABC + UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< 0 - Entry 0 of IO APIC redirection table + ///< 1 - Entry 1 of IO APIC redirection table + ///< ... + ///< 31 - Entry 31 of IO APIC redirection table +} DXIO_APIC_DEVICE_INFO; +/// +/// PCIe port configuration data +/// +typedef struct { + UINT8 PortPresent : 1; ///< Enable PCIe port for initialization. + UINT8 Reserved1 : 2; ///< Reserved + UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + UINT8 FunctionNumber : 3; ///< Reserved for future use + UINT8 LinkSpeedCapability : 3; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + ///< 4 - Gen4 + ///< 5 - Gen5 + UINT8 AutoSpdChng : 2; ///< Upstread Auto Speed Change Allowed/ + ///< 0 - Use default implementation (Disabled for Gen1, Enabled for Gen2/3) + ///< 1 - Always Disabled + ///< 2 - Always Enabled + ///< 3 - Reserved + UINT8 EqPreset : 4; ///< Gen3 Equalization Preset */ + UINT8 LinkAspm : 2; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + UINT8 LinkAspmL1_1 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 LinkAspmL1_2 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 ClkReq : 4; ///< ASPM Reserved Field + ///< 0 - NONE + ///< 1 - CLKREQ0 signal + ///< 2 - CLKREQ1 signal + ///< 3 - CLKREQ2 signal + ///< 4 - CLKREQ3 signal + ///< 5 - CLKREQG signal + UINT8 LinkHotplug : 4; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + UINT8 SlotPowerLimit; ///< PCIe slot power limit. + UINT8 SlotPowerLimitScale : 2; ///< PCIe slot power limit Scale. + ///< 00b = 1.0x + ///< 01b = 0.1x + ///< 10b = 0.01x + ///< 11b = 0.001x + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 Gen4Features : 5; ///< Unused bits + ///< BIT0(DLF_Exchange) 1 - Disable, 0 - Enable + ///< IT1(DLF_Capability) 1 - Disable, 0 - Enable + UINT16 SlotNum : 13; ///< PHYSICAL_SLOT_NUM + UINT16 CsLink : 3; ///< Reserved + DXIO_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + DXIO_APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + DXIO_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 EsmControl : 1; ///< Enhanced speed mode control + UINT8 CcixControl : 1; ///< Ccix/Cxl control + UINT8 TxVetting : 1; ///< Tx Vetting + UINT8 RxVetting : 1; ///< Rx Vetting + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + UINT8 NtbHotplug : 1; ///< NTB Hotplug flag + ///< 0b = Disabled + ///< 1b = Enabled + UINT8 Reserved2 : 1; ///< Reserved + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 Reserved3 : 5; ///< Reserved + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset + UINT8 Reserved4 : 4; ///< Reserved + UINT16 PsppPolicyDC; ///< Pspp DC control + UINT16 PsppPolicyAC; ///< PSPP AC control + UINT8 PsppDeviceType; ///< Pspp Device Type + UINT8 DisGen3EQPhase : 1; ///< Gen3 Bypass phase2/3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 TXDeEmphasisOride : 1; ///< Override Gen2 DXIO deemphasis default + UINT8 TXDeEmphasis : 2; ///< Gen2 DXIO deemphasis setting + UINT8 Reserved5 : 3; ///< Reserved + struct { + UINT16 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT16 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT16 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT16 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT16 Reserved1 : 2; ///< Unused bits + UINT8 SetDsTxPreset : 1; ///< Gen3 Set Downstream Tx Preset + UINT8 SetDsRxPresetHint : 1; ///< Gen3 Set Downstream Rx Preset Hint + UINT8 SetUsTxPreset : 1; ///< Gen3 Set Upstream Tx Preset + UINT8 SetUsRxPresetHint : 1; ///< Gen3 Set Upstream Rx Preset Hint + UINT8 Reserved2 : 4; ///< Unused bits + } LaneEqualizationCntl; ///< Lane equalization control structure used for Gen3 values + struct { + UINT8 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen4 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen4 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen4LaneEqualizationCntl; ///< Lane equalization control structure used for Gen4 values + struct { + UINT8 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen5 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen5 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen5LaneEqualizationCntl; ///< Lane equalization control structure used for Gen5 values + struct { + UINT32 PresetMask8Gt : 10; ///< Preset Mask 8GT. + UINT32 PresetMask16Gt : 10; ///< Preset Mask 16GT. + UINT32 PresetMask32Gt : 10; ///< Preset Mask 32GT. + UINT32 Reserved1 : 2; ///< Unused bits + UINT8 SetPresetMask8Gt : 1; ///< Preset Mask 8GT Set + UINT8 SetPresetMask16Gt : 1; ///< Preset Mask 16GT Set + UINT8 SetPresetMask32Gt : 1; ///< Preset Mask 32GT Set + UINT8 Reserved2 : 5; ///< Unused bits + } PresetMaskCntl; ///< Preset Mask control structure used for Gen3/Gen4/Gen5 values + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 BypassGen3EQ : 1; ///< Bypass Gen3 equalization + UINT8 BypassGen4EQ : 1; ///< Bypass Gen4 equalization + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:Enable 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 IsBmcLocation : 1; ///< IsBmcLocation + UINT8 SetEsmControl : 1; ///< Set ESM Control + UINT8 SetEsmSpeedBump : 1; ///< Set Speed bump for ESM + UINT8 Reserved6 : 1; ///< Unused bits + UINT8 I2CMuxInfo : 6; ///< Legacy I2c switch + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 Reserved7 : 1; ///< Unused bits + UINT16 NpemEnable : 12; ///< Controls NPEM Enable + UINT16 Reserved8 : 4; ///< Unused bits + UINT16 NpemCapability : 12; ///< Controls NPEM Capability + UINT8 SwingMode : 3; ///< PCIe Swing Mode + UINT16 Reserved9 : 1; ///< Unused bits + UINT16 MpioAncDataIdx; ///< Reserved for internal use only + UINT8 Reserved10; ///< Reserved bits +} DXIO_PORT_DATA; + +/// +/// EtherNet specific data structures +/// +typedef struct { + UINT32 PortNum : 8; ///< Port Number + UINT32 PlatConf : 4; ///< Platform Config + ///< 0 = Reserved + ///< 1 = 10G/1G BackPlane + ///< 2 = 2.5G BackPlane + ///< 3= Soldered down 1000Base-T + ///< 4 = Soldered down 1000Base-X + ///< 5 = Soldered down NBase-T + ///< 6 = Soldered down 10GBase-T + ///< 7 = Soldered down 10GBase-r + ///< 8 = SFP+ Connector + UINT32 Reserved1 : 4; ///< Unused 12-15 + UINT32 MdioId : 5; ///< MDIO ID when MDIO Side band is used + UINT32 Reserved2 : 2; ///< Unused 21-22 + UINT32 SuppSpeed : 4; ///< Supported Speeds by Platform + ///< 1 = 100M Supported + ///< 2 = 1G Supported + ///< 4 = 2.5G Supported + ///< 8 = 10G Supported + UINT32 Reserved3 : 1; ///< Unused 27 + UINT32 ConnType : 3; ///< Supported Speeds by Platform + ///< 0 = Port not Used + ///< 1 = SFP+ Connection I2C interface + ///< 2 = MDIO PHY + ///< 4 = Backplane Connection + UINT32 Reserved4 : 1; ///< Unused 31 +} ETH_PORT_PROPERTY0; + +typedef struct { + UINT32 MdioReset : 2; ///< MDIO Reset Type + ///< 0 = None + ///< 1 = I2C GPIO + ///< 2 = Integrated GPIO + ///< 3 = Reserved + UINT32 Reserved1 : 2; ///< Unused 2-3 + UINT32 MdioGpioResetNum : 2; ///< Integrated GPIO number for reset + UINT32 Reserved2 : 2; ///< Unused 6-7 + UINT32 SfpGpioAdd : 3; ///< Lower I2C address of GPIO Expander PCA9535 + UINT32 Reserved3 : 1; ///< Unused 11 + UINT32 TxFault : 4; ///< TX FAULT + UINT32 Rs : 4; ///< RS Signal + UINT32 ModAbs : 4; ///< MOD_ABS signal + UINT32 RxLoss : 4; ///< Rx_LOS signal + UINT32 SfpGpioMask : 4; ///< SFP+ sideband signals that are not supported by platform +} ETH_PORT_PROPERTY3; + +typedef struct { + UINT32 SfpMux : 3; ///< Lower address of Mux PCA 9545 + UINT32 Reserved1 : 1; ///< Unused 3 + UINT32 SfpBusSeg : 3; ///< SFP BUS Segment. Downstream channels of PCA9545 + UINT32 Reserved2 : 1; ///< Unused 7 + UINT32 SfpMuxUpAdd : 5; ///< Upper address of Mux PCA 9545 + UINT32 Reserved3 : 3; ///< Unused 13-15 + UINT32 RedriverAddress : 7; ///< Address of ReDriver + UINT32 RedriverInterface : 1; ///< ReDriver Interface Descriptor + UINT32 RedriverLane : 3; ///< ReDriver Lane number + UINT32 Reserved4 : 1; ///< Unused 27 + UINT32 RedriverModel : 3; ///< ReDriver Model + UINT32 RedriverPresent : 1; ///< Redriver Present +} ETH_PORT_PROPERTY4; + +typedef struct { + UINT32 TxEqPre : 6; ///< TX EQ PRE + UINT32 Reserved1 : 2; ///< Unused 7-6 + UINT32 TxEqMain : 6; ///< TX EQ MAIN + UINT32 Reserved2 : 2; ///< Unused 15-14 + UINT32 TxEqPost : 6; ///< TX EQ POST + UINT32 Reserved3 : 10; ///< Unused 31-23 +} ETH_PORT_TXEQ; +/// Ethernet PCIe port configuration data +/// +typedef struct { + ETH_PORT_PROPERTY0 EthPortProp0; ///< XGBE_PORT_PROPERTY_0 + ETH_PORT_PROPERTY3 EthPortProp3; ///< XGBE_PORT_PROPERTY_3 + ETH_PORT_PROPERTY4 EthPortProp4; ///< XGBE_PORT_PROPERTY_4 + UINT32 PadMux0; ///< PadMux0 Setting (8 bits) + UINT32 PadMux1; ///< PadMux1 Setting (8 bits) + UINT32 MacAddressLo; ///< Lower 32 bits of MAC Address + UINT32 MacAddressHi; ///< Upper 32 bits of MAC Address + ETH_PORT_TXEQ EthPortTxEq; ///< TX EQ Settings +} ETHERNET_PORT_DATA; + +/// +/// High level data structures for passing topology from platform to AGESA +/// +typedef struct { + UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + UINT8 HotPluggable : 1; ///< HotPluggable + ///< 0 - Link is NOT Hot-Switchable + ///< 1 - Link IS Hot-Switchable + UINT8 Reserved1 : 7; ///< Unused field, leave as 0 + UINT8 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 GpioGroupId; ///< Unique identifier for the GPIO or GPIO group associated with + ///< this engine. GPIOs are used for hotplug notification and link + ///< type (e.g SATA Express or PCIe) + UINT8 DxioStartLane; ///< Internal coding of start lane + UINT8 DxioEndLane; ///< Internal coding of end lane + UINT8 SearchDepth; ///< SearchDepth only uses 1 bit - always initialize to 0 will be updated dynamically +} DXIO_ENGINE_DATA; + +/// +/// PCIe port descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in complex + DXIO_ENGINE_DATA EngineData; ///< Engine data + DXIO_PORT_DATA Port; ///< PCIe port specific configuration info + ETHERNET_PORT_DATA EtherNet; ///< Ancillary data for EtherNet + PHY_DATA Phy; ///< Ancillary data for PHY programming customization + PORT_PARAMS PortParams; ///< Extensible port parameter list for simplified topology structure + ANC_DATA AncData; ///< Ancillary data override +} DXIO_PORT_DESCRIPTOR; + +#pragma pack(pop) + +/// +/// +/// PCIe Complex descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR *PciePortList; ///< Pointer to array of PCIe port descriptors or NULL (Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST). + VOID *Reserved2; ///< Reserved for future use + UINT8 BmcLinkLocation; ///< Identifies the socket/die location of a BMC link (Used by AGESA, input not required) + UINT8 BmcLinkLaneNum; ///< Identifies the socket/die location of a BMC Lane number + UINT8 Reserved3[2]; ///< Reserved for future +} DXIO_COMPLEX_DESCRIPTOR; + +/// +/// Engine descriptor type +/// +typedef enum { + DxioUnusedEngine = 0, ///< Unused descriptor Excluded from configuration + DxioPcieEngine = 1, ///< PCIe port + DxioUSBEngine = 2, ///< USB port + ///< __Deprecated__ + DxioSATAEngine = 3, ///< SATA + DxioUSB_OVER_PCIE = 4, ///< USB4 PCIe (internal use only) + DxioUBMHFCEngine = 5, ///< New for Genoa UBM HFC Connector for auto-discovery + DxioOCP3Engine = 6, ///< New for Genoa OCP3 Bifurcatable Connector + DxioUdot3Engine = 7, ///< New for Genoa U.3 Multiprotocol Connector + DxioDPEngine = 8, ///< Digital Display __For APU display connector list__ + DxioEthernetEngine = 0x10, ///< Ethernet (GBe, XGBe) + ///< __Deprecated__ + DxioGOPEngine = 0x20, ///< GOP + ///< __Deprecated__ + DxioNTBDevice = 0x60, ///< For NBIF NTB Enable (internal use only) + DxioHDaudioEngine, ///< For NBIF HDaudtio Enable (internal use only) + DxioACPEngine, ///< For NBIF ACP Enable (internal use only) + DxioMP2Engine, ///< For NBIF MP2 Enable (internal use only) + DxioMaxPcieEngine ///< Max engine type for boundary check. +} DXIO_ENGINE_TYPE; + +/// +/// PCIe link speeds +/// +typedef enum { + DxioGenMaxSupported, ///< Maximum supported + DxioGen1 = 1, ///< Gen1 + DxioGen2, ///< Gen2 + DxioGen3, ///< Gen3 + DxioGen4, ///< Gen4 + DxioGen5, ///< Gen5 + MaxDxioGen ///< Max Gen for boundary check +} DXIO_LINK_SPEEDS; +#endif // AMD_PCIE_COMPLEX_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdSoc.h b/Platform/AMD/AgesaPkg/Include/AmdSoc.h new file mode 100644 index 0000000000..d62f260235 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdSoc.h @@ -0,0 +1,17 @@ +/** @file + + Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_SOC_H_ +#define _AMD_SOC_H_ + +#define F1A_BRH_A0_RAW_ID 0x00B00F00ul +#define F1A_BRH_B0_RAW_ID 0x00B00F10ul +#define F1A_BRH_B1_RAW_ID 0x00B00F11ul +#define F1A_BRHD_A0_RAW_ID 0x00B10F00ul +#define F1A_BRHD_B0_RAW_ID 0x00B10F10ul +#endif // _AMD_SOC_H_ diff --git a/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h new file mode 100644 index 0000000000..2291f7dc83 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h @@ -0,0 +1,42 @@ +/** @file + Fabric resource manager common definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_CMN_H_ +#define FABRIC_RESOURCE_MANAGER_CMN_H_ +#pragma pack (push, 1) + +#define MAX_SOCKETS_SUPPORTED 2 ///< Max number of sockets in system. +#define MAX_RBS_PER_SOCKET 20 ///< Max number of root bridges per socket. + +/** + * @brief DF address aperture structure. + * @details This contains information used to define an MMIO region. + */ +typedef struct _FABRIC_ADDR_APERTURE { + UINT64 Base; ///< Aperture base Address. + UINT64 Size; ///< Aperture size. + UINT64 Alignment; ///< Alignment bit map. 0xFFFFF means 1MB align. +} FABRIC_ADDR_APERTURE; + +/** + * @brief DF Resource for each RootBridge structure. + * @details This contains information used to define the MMIO region for each RootBridge. + */ +typedef struct _FABRIC_RESOURCE_FOR_EACH_RB { + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondNonPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second nonprefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second prefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE IO[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< IO resource(s) @see FABRIC_ADDR_APERTURE + UINT16 PciBusNumber[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< PCI bus number(s). +} FABRIC_RESOURCE_FOR_EACH_RB; +#pragma pack (pop) +#endif // FABRIC_RESOURCE_MANAGER_CMN_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h new file mode 100644 index 0000000000..9e58f299b4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h @@ -0,0 +1,96 @@ +/** @file + AMD Memory Info Hob Definition + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_MEMORY_INFO_HOB_H_ +#define AMD_MEMORY_INFO_HOB_H_ + +/** + * @brief 128 bit Buffer containing UID Unique Identifier value for Memory Info HOB. + * EFI_GUID defined in UefiBaseType.h + */ +extern EFI_GUID gAmdMemoryInfoHobGuid; + +#pragma pack (push, 1) + +/** + * @brief Memory descriptor structure for each memory range + */ +typedef struct { + UINT64 Base; ///< Base address of memory rang + UINT64 Size; ///< Size of memory rang + UINT32 Attribute; ///< Attribute of memory rang + UINT32 Reserved; ///< For alignment purpose +} AMD_MEMORY_RANGE_DESCRIPTOR; + +/** + * @brief Memory attribute in the memory range descriptor = AVAILABLE + */ +#define AMD_MEMORY_ATTRIBUTE_AVAILABLE 0x1 + +/** + * @brief Memory attribute in the memory range descriptor = UMA + */ +#define AMD_MEMORY_ATTRIBUTE_UMA 0x2 + +/** + * @brief Memory attribute in the memory range descriptor = MMIO + */ +#define AMD_MEMORY_ATTRIBUTE_MMIO 0x3 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_RESERVED 0x4 + +/** + * @brief Memory attribute in the memory range descriptor = GPUMEM + */ +#define AMD_MEMORY_ATTRIBUTE_GPUMEM 0x5 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_SP + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_SP 0x6 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED 0x7 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED_TMR + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED_TMR 0x8 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED_SMUFEATURES + */ +#define AMD_MEMORY_ATTRIBUTE_Reserved_SmuFeatures 0x9 + +/// Memory info HOB structure +typedef struct { + UINT32 Version; ///< Version of HOB structure + BOOLEAN AmdMemoryVddioValid; ///< This field determines if Vddio is valid + UINT16 AmdMemoryVddio; ///< Vddio Voltage + BOOLEAN AmdMemoryVddpVddrValid; ///< This field determines if VddpVddr is valid + UINT8 AmdMemoryVddpVddr; ///< VddpVddr voltage + BOOLEAN AmdMemoryFrequencyValid; ///< Memory Frequency Valid + UINT32 AmdMemoryFrequency; ///< Memory Frquency + UINT32 AmdMemoryDdrMaxRate; ///< Memory DdrMaxRate + UINT32 NumberOfDescriptor; ///< Number of memory range descriptor + AMD_MEMORY_RANGE_DESCRIPTOR Ranges[1]; ///< Memory ranges array +} AMD_MEMORY_INFO_HOB; + +#pragma pack (pop) + +/** + * @brief Macro that defines the Memory Info HOB version + */ +#define AMD_MEMORY_INFO_HOB_VERISION 0x00000110ul // Ver: 00.00.01.10 + +#endif // AMD_MEMORY_INFO_HOB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h new file mode 100644 index 0000000000..d144a4ad20 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h @@ -0,0 +1,51 @@ +/** @file + AMD Psp Base Lib + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_BASELIB_V2_H_ +#define AMD_PSP_BASELIB_V2_H_ + +#include <AmdPspDirectory.h> + +#define MAX_IMAGE_SLOT_COUNT 32 + +#define ALIGNMENT_4K BASE_4KB +#define ALIGN_CHECK(addr, alignment) ((((UINTN)(addr)) & ((alignment) - 1)) == 0) +#define ALIGN_4K_CHECK(addr) ALIGN_CHECK((addr), ALIGNMENT_4K) + +#define IS_VALID_ADDR32(addr) (((UINT32)(addr) != 0) && (UINT32)(addr) != 0xFFFFFFFF) + +#pragma pack (push, 1) + +#define FIRMWARE_TABLE_SIGNATURE 0x55AA55AAul + +/// Define the structure OEM signature table +typedef struct _FIRMWARE_ENTRY_TABLEV2 { + UINT32 Signature; ///< 0x00 Signature should be 0x55AA55AAul + UINT32 ImcRomBase; ///< 0x04 Base Address for Imc Firmware + UINT32 GecRomBase; ///< 0x08 Base Address for Gmc Firmware + UINT32 XHCRomBase; ///< 0x0C Base Address for XHCI Firmware + UINT32 LegacyPspDirBase; ///< 0x10 Base Address of PSP directory + UINT32 PspDirBase; ///< 0x14 Base Address for PSP directory + UINT32 Reserved1; ///< 0x18 Base Address for Reserved BIOS directory + UINT32 Reserved2; ///< 0x1C Base Address for Reserved BIOS directory + UINT32 Reserved3; ///< 0x20 Base Address for Reserved BIOS directory + UINT32 Config; ///< 0x24 reserved for EFS Configuration + UINT32 NewBiosDirBase; ///< 0x28 Generic Base address for all program + UINT32 PspDirBackupBase; ///< 0x2C Backup PSP directory address for all programs +} FIRMWARE_ENTRY_TABLEV2; + +/// It also used as structure to store ISH generic information across programs +typedef struct { + UINT32 Priority; + UINT32 UpdateRetries; + UINT32 GlitchRetries; + UINT32 ImageSlotAddr; +} IMAGE_SLOT_HEADER; + +#pragma pack (pop) + +#endif // AMD_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h new file mode 100644 index 0000000000..23c90b65c2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h @@ -0,0 +1,83 @@ +/** @file + AMD Psp Ftpm Library header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_LIB_H_ +#define PSP_FTPM_LIB_H_ +#include <IndustryStandard/Acpi30.h> + +/* SYSTEM_TPM_CONFIG_VAL + * Value range for APCB_TOKEN_UID_PSP_SYSTEM_TPM_CONFIG + */ +typedef enum { + SYSTEM_TPM_CONFIG_DTPM = 0x00, ///< dTPM + SYSTEM_TPM_CONFIG_PSP_FTPM = 0x01, ///< PSP FTPM + SYSTEM_TPM_CONFIG_HSP_FTPM = 0x02, ///< HSP FTPM + SYSTEM_TPM_CONFIG_NONE = 0xFF, ///< None of TPM +} SYSTEM_TPM_CONFIG_VAL; + +#pragma pack (push, 1) +/// Define TPM_2_CONTROL_AREA +typedef struct { + // Interface Identifier + volatile UINT64 InterfaceIdentifier; ///< Interface Identifier + // TPM2 Control Area Extension + volatile UINT32 Clear; ///< Clear + volatile UINT32 RemainingBytes; ///< RemainingBytes + volatile UINT32 StatusReserved; ///< StatusReserved + volatile UINT32 StatusError; ///< StatusError + volatile UINT32 StatusCancel; ///< StatusCancel + volatile UINT32 StatusStart; ///< StatusStart + UINT64 InterruptControl; ///< InterruptControl + UINT32 CommandSize; ///< CommandSize + EFI_PHYSICAL_ADDRESS CommandAddress; ///< CommandAddress + UINT32 ResponseSize; ///< ResponseSize + EFI_PHYSICAL_ADDRESS ResponseAddress; ///< ResponseAddress + // Memory Absent command/response buffer + volatile UINT32 CmdRespHWBuffer; ///< Cmd/Rsp HW Buffer +} TPM2_CONTROL_AREA; + +#pragma pack (pop) + +/** + GET TPM related Info + + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +EFI_STATUS +FtpmGetInfo ( + IN OUT UINTN *FtpmStatus + ); + +/** + Execute a TPM command + + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +EFI_STATUS +FtpmExecuteCommand ( + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +#endif //PSP_FTPM_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h new file mode 100644 index 0000000000..4ad4020f95 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h @@ -0,0 +1,231 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _PSP_ROM_ARMOR_LIB_H_ +#define _PSP_ROM_ARMOR_LIB_H_ + +#include "Uefi.h" + +#define PSP_MAX_SPI_CMD_SUPPORT (4) ///< Max number of SPI command support +#define PSP_MAX_SPI_DATA_BUFFER_SIZE (72) ///< Max SPI Command Data Buffer Size +#define PSP_MAX_WHITE_LIST_CMD_NUM (32) ///< Max White list allowed command array number support +#define PSP_MAX_WHITE_LIST_REGION_NUM (16) ///< Max White list allowed region array number support + +#define SPI_CHIP_SELECT_ALL (0) ///< Allowed on all chip selects +#define SPI_CHIP_SELECT_1 (1) ///< Chip Select 1 +#define SPI_CHIP_SELECT_2 (2) ///< Chip Select 2 + +#define SPI_COMMAND_FREQUENCY_66_66MHZ (0) ///< 0=66.66MHz +#define SPI_COMMAND_FREQUENCY_33_33MHZ (1) ///< 1=33.33MHz +#define SPI_COMMAND_FREQUENCY_22_22MHZ (2) ///< 2=22.22MHz +#define SPI_COMMAND_FREQUENCY_16_66MHZ (3) ///< 3=16.66MHz +#define SPI_COMMAND_FREQUENCY_100MHZ (4) ///< 4=100MHz +#define SPI_COMMAND_FREQUENCY_800KHZ (5) ///< 5=800KHz + +#define SPI_COMMAND_NOT_PROCEDDED (0) ///< 0 = Command not examined/processed +#define SPI_COMMAND_COMPLETED (1) ///< 1 = Command completed successfully +#define SPI_COMMAND_EXECUTION_ERROR (2) ///< 2 = Execution Error (i.e. timeout) +#define SPI_COMMAND_NOT_ALLOWED (3) ///< 3 = Command not allowed by Whitelist +#define SPI_COMMAND_MALFORMED (4) ///< 4 = Command malformed + +#pragma pack (push, 1) + +typedef struct { + UINT8 ChipSelect; ///< 1 = CS1, 2 = CS2, all other values illegal + + UINT8 Frequency; ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 BytesToTx; ///< Bytes to Transmit, valid range is 0-72. Does not include the + ///< SPI Opcode byte, but does include the address, dummy bytes, and + ///< data. + + UINT8 BytesToRx; ///< Bytes to Receive from device, BytesToTx + BytesToRx <= 72 + + UINT8 OpCode; ///< The SPI Command OpCode (the first byte sent by the SPI controller) + + UINT8 Reserved[3]; ///< Reserved for future expansion + + UINT8 Buffer[PSP_MAX_SPI_DATA_BUFFER_SIZE]; ///< The remaining 0-72 bytes sent/received by the SPI controller. + ///< + ///< The SPI Controller will + ///< 1. Assert the ChipSelect + ///< 2. Send the one byte OpCode + ///< 3. Send Buffer[0] to Buffer[BytesToTx-1] to the SPI device + ///< 4. Read BytesToRx bytes from the device into Buffer[BytesToTx] to + ///< Buffer[BytesToTx+BytesToRx-1] + ///< 5. Deassert the ChipSelect line + ///< + ///< SPI ROM Commands that include a target address send the address + ///< immediately after the OpCode (i.e. Buffer[0..2] or Buffer[0..3] + ///< depending if 24 or 32bit addresses are associated with the OpCode). + ///< See the SPI ROM Device's datasheet for full details on your + ///< devices commands and formats. +} SPI_COMMAND; ///< The struct of Spi Command + +typedef union { + struct { + ///< SPI_COMMUNICATION_RESULT + UINT16 Command0Result : 4; ///< Result[ 3: 0] The result of Command[0] + UINT16 Command1Result : 4; ///< Result[ 7: 4] The result of Command[1] + UINT16 Command2Result : 4; ///< Result[11: 8] The result of Command[2] + UINT16 Command3Result : 4; ///< Result[15:12] The result of Command[3] + } Field; ///< the struct type of Command0 ~ Command4 + UINT16 Value; ///< 16 bit value of Command0 ~ Command4 +} SPI_COMMUNICATION_RESULT; ///< The union struct type of Spi Communication Result + +typedef struct { + UINT8 ReadyToRun; ///< Set to FALSE by x86 while the buffer is being constructed. Set to + ///< TRUE by x86 as the last step in building the communication buffer, + ///< just before x86 rings the PSP doorbell. + ///< + ///< Set to FALSE by PSP after the PSP copies the buffer from DRAM to + ///< private SRAM. + + UINT8 CommandCount; ///< Number of commands to execute, Valid Values 1-4 + + SPI_COMMUNICATION_RESULT SpiCommunicationResult; ///< Set to zero by x86 when the buffer is built. Atomically set to a + ///< non-zero value by the PSP to indicate the PSP has finished + ///< processing the requests in the communication buffer. The specific + ///< value written by the PSP provides per command results + ///< + ///< Result values with special meaning: + ///< 0x0000 = (written by x86) PSP has not finished handling the request + ///< 0x1000 = PSP determined the request is malformed (invalid + ///< CommandCount, chipselect, BytesToRx/Tx, etc) + ///< 0x2000, 0x3000, 0x4000, ... , 0xF000 = Reserved for future errors + ///< + ///< Generic Result values: + ///< SpiCommunicationResult[ 3: 0] The result of Command[0] + ///< SpiCommunicationResult[ 7: 4] The result of Command[1] + ///< SpiCommunicationResult[11: 8] The result of Command[2] + ///< SpiCommunicationResult[15:12] The result of Command[3] + ///< 0 = Command not examined/processed + ///< 1 = Command completed successfully + ///< 2 = Execution Error (i.e. timeout) + ///< 3 = Command not allowed by Whitelist + ///< 4 = Command malformed + ///< 5-15 = reserved for future use + ///< + ///< Examples of Generic Results: + ///< 0x0000 - PSP has not finished the request + ///< 0x0001 - PSP ran Command0 successfully, and is now idle + ///< 0x0111 - PSP ran Command0/1/2 successfully and is now idle + ///< 0x0031 - PSP ran Command0, but Command1 was blocked by whitelist + + SPI_COMMAND SpiCommand[PSP_MAX_SPI_CMD_SUPPORT]; ///< Spi command array +} SPI_COMMUNICATION_BUFFER; ///< The struct type of Spi Communication Buffer + +typedef struct { + UINT8 ChipSelect; ///< 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + + UINT8 Frequency; ///< The allowed frequency for the command + ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 OpCode; ///< The allowed commands opcode + + UINT8 MinTx; ///< The minimum range of allowed transmit byte counts for this command + ///< (does not include opcode) + UINT8 MaxTx; ///< The maximum range of allowed transmit byte counts for this command + ///< (does not include opcode) + + UINT8 MinRx; ///< The minimum range of allowed Rx byte counts + UINT8 MaxRx; ///< The maximum range of allowed Rx byte counts + + UINT8 AddrChkMethod; ///< 0=No address verification performed + ///< 1=Treat Buffer[0-2] as a 24-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + ///< 2=Treat Buffer[0-3] as a 32-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + + UINT32 ImpactSize; ///< The Impact Zone is the naturally aligned power of two sized block + ///< of addresses that may be impacted by a given SPI Command. For + ///< example, a sector erase command targeted at an address within a + ///< 64K block will impact every byte within that 64K block. Likewise + ///< a page program SPI command (i.e. write) may impact many bytes + ///< within the targeted 256/512 byte page due to page wrap-around, but + ///< no bytes outside the page. The ImapctSize field specifies the power + ///< of two size of the ImpactZone for this command. If VerifyAddress is + ///< zero (no checking) this field must also be zero, otherwise this + ///< field must be a power of two between 256 and 64MB (256, 512, ..., + ///< 67108864). NOTE: When setting this field, carefully examine your + ///< device's datasheet. + ///< +} WHITE_LIST_ALLOWED_COMMAND; ///< The struct type of White List Allowed Command + +typedef struct { + // 8 bytes + UINT32 StartAddress; ///< LSB must be 0x00, bit31 identifies a chipselect: 0=CS1, 1=CS2 + UINT32 EndAddress; ///< LSB must be 0xFF, StartAddress must be less than EndAddress +} WHITE_LIST_ALLOWED_REGION; ///< The struct type of White List Allowed Region + +typedef struct { + UINT8 AllowedCmdCount; ///< Allow Command Count + UINT8 AllowedRegionCount; ///< Allow Region Count + WHITE_LIST_ALLOWED_COMMAND WhitelistAllowedCommands[PSP_MAX_WHITE_LIST_CMD_NUM]; ///< White List Allowed Command Table + WHITE_LIST_ALLOWED_REGION WhitelistAllowedRegions[PSP_MAX_WHITE_LIST_REGION_NUM]; ///< White List Allowed Region Table +} SPI_WHITE_LIST; ///< The struct type of Spi White List + +#pragma pack (pop) + +/** + * @brief Request secures the SPI Controller + * + * @param[in,out] SpiCommunicationBuffer Spi Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN OUT SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ); + +/** + * @brief Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI white list structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ); + +/** + * @brief Request execute SPI command provide in TSEG comm buffer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ); + +/** + * @brief Request PSP firmware switch SPI controller chip select. + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ); + +#endif //_PSP_ROM_ARMOR_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h new file mode 100644 index 0000000000..0189910bd1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h @@ -0,0 +1,2722 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AML_LIB_H_ +#define AML_LIB_H_ + +#include <Uefi.h> +#include <IndustryStandard/Acpi.h> + +typedef enum { + AmlStart, + AmlClose, + AmlInvalid +} AML_FUNCTION_PHASE; + +#define AML_OBJECT_INSTANCE_SIGNATURE SIGNATURE_32 ('a', 'm', 'l', 'o') + +// +// Device Status Bitmap (Section 6.3.7 ACPI version 6.3) +// Bit [0] - Set if the device is present. +// Bit [1] - Set if the device is enabled and decoding its resources. +// Bit [2] - Set if the device should be shown in the UI. +// Bit [3] - Set if the device is functioning properly (cleared if device +// failed its diagnostics). +// Bit [4] - Set if the battery is present. +// Bits [31:5] - Reserved (must be cleared). +// +#define DEVICE_PRESENT_BIT 0x0001 +#define DEVICE_ENABLED_BIT 0x0002 +#define DEVICE_IN_UI_BIT 0x0004 +#define DEVICE_HEALTH_BIT 0x0008 +#define DEVICE_BATTERY_BIT 0x0010 // Control Method Battery Device Only + +typedef enum { + UnknownObj, + IntObj, + StrObj, + BuffObj, + PkgObj, + FieldUnitObj, + DeviceObj, + EventObj, + MethodObj, + MutexObj, + OpRegionObj, + PowerResObj, + ProcessorObj, + ThermalZoneObj, + BuffFieldObj, + DDBHandlObj, + InvalidObj +} OBJECT_TYPE_KEYWORD; + +typedef struct { + UINT32 Signature; + BOOLEAN Completed; + UINTN DataSize; + UINT8 *Data; + LIST_ENTRY Link; +} AML_OBJECT_INSTANCE; + +// *************************************************************************** +// AML defines to be consistent with already existing +// MdePkg/Include/IndustryStandard/Acpi*.h defines. +// *** These could be upstreamed at some point. +// *************************************************************************** +// Limits of (DWord|Word|QWord)Space ResourceType +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MIN 0xC0 +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MAX 0xFF + +// General Flags: Flags that are common to all resource types +// Bits[7:4] Reserved(must be 0) +// Bit[3] Max Address Fixed, _MAF: +// 1 The specified maximum address is fixed +// 0 The specified maximum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED (1 << 3) +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED (0 << 3) +#define EFI_ACPI_GENERAL_FLAG_MASK_MAF EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +// Bit[2] Min Address Fixed, _MIF: +// 1 The specified minimum address is fixed +// 0 The specified minimum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED (1 << 2) +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED (0 << 2) +#define EFI_ACPI_GENERAL_FLAG_MASK_MIF EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +// Bit[1] Decode Type, _DEC: +// 1 This bridge subtractively decodes this address(top level bridges only) +// 0 This bridge positively decodes this address +#define EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE (1 << 1) +#define EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE (0 << 1) +#define EFI_ACPI_GENERAL_FLAG_MASK_DEC EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +// Bit[0] Consumer / Producer: +// 1 This device consumes this resource +// 0 This device produces and consumes this resource +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER (1 << 0) +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER (0 << 0) +#define EFI_ACPI_GENERAL_FLAG_MASK_USAGE EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER + +// Memory Resource Flag (Resource Type = 0) DefinitionsBits +// Memory Resource Flag Masks +// Bits[7:6] Reserved(must be 0) +// Bit[5] Memory to I/O Translation, _TTP: +// 0 TypeStatic +// 1 Type Translation +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_TTP (1 << 5) +// Bit[4:3] Memory Attributes, _MTP: +// 0 AddressRangeMemory +// 1 AddressRangeReserved +// 2 AddressRangeACPI +// 3 AddressRangeNVS +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MTP (3 << 3) +// Bit[2:1] Memory Attributes, _MEM: +// 0 The memory is non-cacheable +// 1 The memory is cacheable +// 2 The memory is cacheable and supports write-combining +// 3 The memory is cacheable and prefetchable +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM (3 << 1) +// Bit[0] Write Status, _RW: +// 0 This memory range is read-only +// 1 This memory is read-write +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW (1 << 0) + +// I/O Resource Flag (Resource Type = 1) DefinitionsBits +// I/O Resource Flags +// Bit [7:6] Reserved (must be 0) +// Bit [5] Sparse Translation, _TRS. This bit is only meaningful if Bit [4] is set. +// 1 SparseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = (((port & 0xFFFc) << 10) || (port & 0xFFF)) + _TRA In the address +// used to access the I/O port, bits[11:2] must be identical to bits[21:12], +// this gives four bytes of I/O ports on each 4 KB page. +// 0 DenseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = port + _TRA +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_SPARSE_TRANSLATION (1 << 5) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_DENSE_TRANSLATION (0 << 5) +// Bit [4] I/O to Memory Translation, _TTP +// 1 TypeTranslation: This resource, which is I/O on the secondary side of the +// bridge, is memory on the primary side of the bridge. +// 0 TypeStatic: This resource, which is I/O on the secondary side of the +// bridge, is also I/O on the primary side of the bridge. +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_TRANSLATION (1 << 4) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_STATIC (0 << 4) +// Bit [3:2] Reserved (must be 0) +// Bit [1:0] _RNG +// 3 Memory window covers the entire range +// 2 ISARangesOnly. This flag is for bridges on systems with multiple bridges. +// Setting this bit means the memory window specified in this descriptor is +// limited to the ISA I/O addresses that fall within the specified window. The +// ISA I/O ranges are: n000-n0FF, n400-n4FF, n800-n8FF, nC00-nCFF. This bit can +// only be set for bridges entirely configured throughACPI namespace. +// 1 NonISARangesOnly. This flag is for bridges on systems with multiple +// bridges. Setting this bit means the memory window specified in this +// descriptor is limited to the non-ISA I/O addresses that fall within the +// specified window. The non-ISA I/O ranges are: n100-n3FF, n500-n7FF, +// n900-nBFF, nD00-nFFF. This bit can only be set for bridges entirely +// configured through ACPI namespace. +// 0 Reserved +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE (3 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY (2 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY (1 << 0) + +#define AML_OBJECT_INSTANCE_FROM_LINK(a) BASE_CR (a, AML_OBJECT_INSTANCE, Link) + +// Method Serialize Flag Values +typedef enum { + NotSerialized, + Serialized, + FlagInvalid +} METHOD_SERIALIZE_FLAG; +// AccessField Access Attrib Flags. +// Ref ACPI spec 6.3 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL 0x00 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK 0x02 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE 0x04 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE 0x06 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD 0x08 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK 0x0A +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES 0x0B +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL 0x0C +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL 0x0D +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES 0x0E +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES 0X0F + +// AccessField access types +typedef enum { + AnyAcc, + ByteAcc, + WordAcc, + DWordAcc, + QWordAcc, + BufferAcc, +} EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS; + +// Field lock rules +typedef enum { + NoLock, + Lock +} EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS; + +// Field update rules +typedef enum { + Preserve, + WriteAsOnes, + WriteAsZeros +} EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS; + +// Field access attributes. for AttribBytes, AttribRawBytes and AttribRawProcessBytes +// the ExtendedAccessField definition is used, as this is what iASL compiles into, rather +// than the AccessField that is specified in the ACPI spec. +typedef enum { + AttribNormal = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL, + AttribQuick = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK, + AttribSendReceive = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE, + AttribByte = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE, + AttribWord = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD, + AttribBlock = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK, + AttribBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES, + AttribProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL, + AttribBlockProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL, + AttribRawBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES, + AttribRawProcessBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES +} EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS; + +// +// Resource Type Specific Flags +// Ref ACPI specification 6.4.3.5.5 +// +// +// DMA Information +// Ref ACPI specification 6.4.2.2 +// +// DmaType values +typedef enum { + Compatibility = EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY, + TypeA = EFI_ACPI_DMA_SPEED_TYPE_A, + TypeB = EFI_ACPI_DMA_SPEED_TYPE_B, + TypeF = EFI_ACPI_DMA_SPEED_TYPE_F +} EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS; + +// IsBusMaster values +typedef enum { + NotBusMaster = 0, + BusMaster = EFI_ACPI_DMA_BUS_MASTER +} EFI_ACPI_DMA_BUS_MASTER_KEYWORDS; + +// DmaTransferSize values +typedef enum { + Transfer8 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT, + Transfer8_16 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT, + Transfer16 = EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT +} EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS; + +// +// Interrupt Resource Descriptor Information +// Ref ACPI specification 6.4.2.1 +// +// IRQ Information - Wake Capability +// +#define EFI_ACPI_IRQ_WAKE_CAPABLE_MASK 0x20 +#define EFI_ACPI_IRQ_NOT_WAKE_CAPABLE 0x0 +#define EFI_ACPI_IRQ_WAKE_CAPABLE 0x20 + +typedef enum { + NotWakeCapable = EFI_ACPI_IRQ_NOT_WAKE_CAPABLE, + WakeCapable = EFI_ACPI_IRQ_WAKE_CAPABLE +} EFI_ACPI_IRQ_WAKE_CAPABILITY_KEYWORDS; + +// +// IRQ Information - Interrupt Sharing +// +#define EFI_ACPI_IRQ_EXCLUSIVE 0x0 + +typedef enum { + Exclusive = EFI_ACPI_IRQ_EXCLUSIVE, + Shared = EFI_ACPI_IRQ_SHARABLE, + ExclusiveAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_EXCLUSIVE, + SharedAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_SHARABLE +} EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS; + +// +// IRQ Information - Interrupt Polarity +// +typedef enum { + ActiveHigh = EFI_ACPI_IRQ_HIGH_TRUE, + ActiveLow = EFI_ACPI_IRQ_LOW_FALSE +} EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS; + +// +// IRQ Information - Interrupt Mode +// +#define EFI_ACPI_IRQ_MODE_MASK 0x1 +typedef enum { + LevelTriggered = EFI_ACPI_IRQ_LEVEL_TRIGGERED, + EdgeTriggered = EFI_ACPI_IRQ_EDGE_TRIGGERED +} EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS; + +// IO Port Descriptor Information +// Ref ACPI specification 6.4.2.5 +// +typedef enum { + Decode16 = EFI_ACPI_IO_DECODE_16_BIT, + Decode10 = EFI_ACPI_IO_DECODE_10_BIT +} EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION; + +// +// Memory Resource Information +// Ref ACPI specification 6.4.3.5 +// +// Consumer/Producer Bit[0] +typedef enum { + ResourceProducer = EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER, + ResourceConsumer = EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER +} RESOURCE_USAGE_FLAG; + +// Decode Type (_DEC) Bit[1] +typedef enum { + PosDecode = EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE, + SubDecode = EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +} MEM_DECODE_FLAG; + +// Min Address Fixed (_MIF) Bit[2] +typedef enum { + MinNotFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED, + MinFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +} MIN_FIXED_FLAG; + +// Max Address Fixed (_MAF) Bit[3] +typedef enum { + MaxNotFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED, + MaxFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +} MAX_FIXED_FLAG; + +// Memory Attributes (_MEM) Bits[2:1] +typedef enum { + NonCacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_NON_CACHEABLE, + Cacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE, + WriteCombining = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_WRITE_COMBINING, + Prefetchable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE +} CACHEABLE_FLAG; + +// Write Status (_RW) Bit[0] +typedef enum { + ReadOnly = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_ONLY, + ReadWrite = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_WRITE +} READ_WRITE_FLAG; + +// Memory Attributes (_MTP) Bits[4:3] +typedef enum { + AddressRangeMemory = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_MEMORY, + AddressRangeReserved = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_RESERVED, + AddressRangeACPI = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_ACPI, + AddressRangeNVS = EFI_APCI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_NVS +} MEMORY_RANGE_TYPE; + +// Memory to IO Translation (_TTP) Bit[5] +// Note: IO and Memory Resources use different bits for this. +// Value must be handled at function level when implemented. +typedef enum { + TypeStatic = 0, + TypeTranslation = 1 +} MEMORY_TRANSLATION_TYPE; + +// Memory Window Attributes (_RNG) Bits[1:0] +typedef enum { + Reserved = 0, + NonISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY, + ISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY, + EntireRange = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE, + ISARangeMax +} IO_ISA_RANGES; + +// Generic Address Space Address IDs +typedef enum { + SystemMemory = EFI_ACPI_6_4_SYSTEM_MEMORY, + SystemIO = EFI_ACPI_6_4_SYSTEM_IO, + PCI_Config = EFI_ACPI_6_4_PCI_CONFIGURATION_SPACE, + EmbeddedControl = EFI_ACPI_6_4_EMBEDDED_CONTROLLER, + SMBus = EFI_ACPI_6_4_SMBUS, + SystemCMOS = EFI_ACPI_6_4_SYSTEM_CMOS, + PciBarTarget = EFI_ACPI_6_4_PCI_BAR_TARGET, + IPMI = EFI_ACPI_6_4_IPMI, + GeneralPurposeIO = EFI_ACPI_6_4_GENERAL_PURPOSE_IO, + GenericSerialBus = EFI_ACPI_6_4_GENERIC_SERIAL_BUS, + PCC = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + PlatformCommChannel = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + FFixedHW = EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE +} GENERIC_ADDRESS_SPACE_ID; + +typedef enum { + UndefinedSize = EFI_ACPI_6_4_UNDEFINED, + ByteSize = EFI_ACPI_6_4_BYTE, + WordSize = EFI_ACPI_6_4_WORD, + DWordSize = EFI_ACPI_6_4_DWORD, + QWordSize = EFI_ACPI_6_4_QWORD +} ACPI_DATA_SIZE; + +typedef ACPI_DATA_SIZE GENERIC_ADDRESS_ACCESS_SIZE; + +// *************************************************************************** +// AML Objects +// *************************************************************************** + +// --------------------------------------------------------------------------- +// Table and Table Header Encoding +// --------------------------------------------------------------------------- + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Name Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Namestring AML Object and inserts it into the linked list + + Completes NameString in one call as "one phase" + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Data Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an optimized integer object + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Package Length Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Term Objects Encoding +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Namespace Modifier Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString DataRefObject + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Named Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be created between AmlStart and AmlClose Phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ); + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + // + // x' is encoded as bits 0:7 of the AccessAttrib byte. + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed AccessAs Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj since AML does not store + ArgTypes here. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 1 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 2 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Resource Descriptor Objects Encoding +// --------------------------------------------------------------------------- + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlDWordSpace () + + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. RangeLength + evaluates to a 32-bit integer that specifies the total number of bytes decoded + in the memory range. The 32-bit field DescriptorName. _LEN is automatically + created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlQWordSpace () + + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Expression Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Miscellaneous Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op |Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ + +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// *************************************************************************** +// AML Assistance Functions +// *************************************************************************** + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ); + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ); + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +// *************************************************************************** +// AML Debug Functions +// *************************************************************************** + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ); + +/** + DEBUG print a buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS.IS.A.SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ); + +#endif // AML_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h new file mode 100644 index 0000000000..d48ca1a90a --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h @@ -0,0 +1,25 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/AmdPspRomArmorLib.h> + +/* + * Return allocated and filled AMD PSP ROM Armor White list Table + * + * + * @param[in] PlatformSpiWhitelist Pointer to white list table + * + * @return EFI_SUCCESS + * @return EFI_OUT_OF_RESOURCES Buffer to return couldn't be allocated + */ +EFI_STATUS +EFIAPI +GetPspRomArmorWhitelist ( + IN SPI_WHITE_LIST **PlatformSpiWhitelist + ); diff --git a/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h new file mode 100644 index 0000000000..6c854651cc --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h @@ -0,0 +1,134 @@ +/** @file + AMD Psp Ftpm Ppi Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_PPI_H_ +#define PSP_FTPM_PPI_H_ +#include <Uefi.h> + +typedef struct _PSP_FTPM_PPI PSP_FTPM_PPI; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: GET TPM related Info + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PPI *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + **/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs. + + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @retval EFI_STATUS 0: Success, Non-Zero Error +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + PSP_FTPM_PPI prototype + + Defines PSP_FTPM_PPI. This PPI is used to get Ftpm info. + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PPI { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs +} PSP_FTPM_PPI; + +extern EFI_GUID gAmdPspFtpmPpiGuid; +extern EFI_GUID gAmdPspFtpmFactoryResetPpiGuid; + +#endif diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h new file mode 100644 index 0000000000..715cbbcf78 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h @@ -0,0 +1,183 @@ +/** @file + CXL Configuration Services Protocol prototype definition + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_CXL_SERVICES_PROTOCOL_H_ +#define NBIO_CXL_SERVICES_PROTOCOL_H_ + +#include "AMD.h" +#include <Protocol/FabricTopologyServices2.h> +#include <Protocol/FabricResourceManagerServicesProtocol.h> + +#define AMD_NBIO_CXL_SERVICES_REVISION 0x00 + +/// Forward declaration for the AMD_NBIO_CXL_SERVICES_PROTOCOL +typedef struct _AMD_NBIO_CXL_SERVICES_PROTOCOL AMD_NBIO_CXL_SERVICES_PROTOCOL; + +extern EFI_GUID gAmdNbioCxlServicesProtocolGuid; ///< CXL services protocol calling + +#pragma pack (push, 1) +/// Port Information Structure +typedef struct _AMD_CXL_PORT_INFO_STRUCT { + PCI_ADDR EndPointBDF; ///< Bus/Device/Function of Root Port in PCI_ADDR format + UINT8 LogicalNbioInstance; ///< Logical Instance ID of NBIO + UINT8 PhysicalNbioInstance; ///< Physical Instance ID of NBIO where this port is located + UINT8 SocketID; ///< Socket ID for this port + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT8 PortId; ///< Physical port location + UINT8 PortWidth; ///< Lane width of the port + UINT32 CxlPortAddress; ///< CXL root port address (CXL 2.0 root port or CXL 1.1 RCiEP) + BOOLEAN IsSwitch; ///< CXL Switch flag +} AMD_CXL_PORT_INFO_STRUCT; + +/// Port MMIO32 Resources Information Structure +typedef struct _AMD_CXL_RESOURCES_INFO_STRUCT { + UINT32 Mmio32Base[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Size[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Gran; +} AMD_CXL_RESOURCES_INFO_STRUCT; +#pragma pack (pop) + +// Protocol Definitions + +/** + This function gets information about a specific PCIe root port. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortInformation + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_ROOT_PORT_INFORMATION)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr + IN UINTN PortIndex, ///< port index + OUT AMD_CXL_PORT_INFO_STRUCT *PortInformation ///< port information ptr + ); + +/** + This function configures a specific PCIe root port for CXL capabilities. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port. + PortInformation OPTIONAL (can be NULL) + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_CONFIGURE_ROOT_PORT)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< this ptr + IN PCI_ADDR EndpointBDF ///< end pt bdf + ); + +/** + This function configures a specific PCIe root port for CXL presence + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port such as Socket id,rbindex,port id,segment,bus base,limit or presence. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_AVAILABLE)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT FABRIC_RESOURCE_FOR_EACH_RB *ResourceForEachRb ///< + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_PORT_RB_LOCATION)( + ///< get port rb location + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN UINT8 Segment, ///< + IN UINT8 BusBase, ///< + OUT UINT8 *SocketId, ///< + OUT UINT8 *RbIndex ///< + ); + +/** + This function gets the CXL MMIO32 values to be used by the fabric resource manager + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + CxlMmio32ResourceForEachRb + A pointer to the structure that will hold the MMIO32 base and size values for each root bridge +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_INFORMATION)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT AMD_CXL_RESOURCES_INFO_STRUCT *CxlMmio32Resources ///< + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_REPORT_TO_MPIO)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This ///< ptr to protocol + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_FIND_2P0_DEVICES)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN UINTN PortIndex ///< port index + ); + +/** + * @brief + * + */ +typedef +VOID +(EFIAPI *AMD_CXL_ENABLE_SCM_PMEM)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN PCI_ADDR CxlPciAddress ///< PCI address + ); + +/// The Protocol Definition for CXL Services +struct _AMD_NBIO_CXL_SERVICES_PROTOCOL { + UINT32 Revision; ///< revision + UINTN CxlCount; ///< CXL count + AMD_CXL_GET_ROOT_PORT_INFORMATION CxlGetRootPortInformation; ///< CXL root port information + AMD_CXL_CONFIGURE_ROOT_PORT CxlConfigureRootPort; ///< configuring the root port + AMD_CXL_GET_PORT_RB_LOCATION GetCxlPortRBLocation; ///< CXL port RB location + AMD_CXL_RESOURCES_AVAILABLE GetCxlAvailableResources; ///< Get resources allocated for CXL RCiEP + AMD_CXL_RESOURCES_INFORMATION GetCxlMmio32Resources; ///< Get CXL MMIO resources for CXL RCiEP + AMD_CXL_REPORT_TO_MPIO CxlReportToMpio; ///< Sends the CXL info to MPIO + AMD_CXL_FIND_2P0_DEVICES CxlFind2p0Devices; ///< Finds CXL 2.0 devices after PCIe enumeration + AMD_CXL_ENABLE_SCM_PMEM CxlEnableScmForPersistentMemory; ///< Notifies SMU that CXL persistent memory is present +}; + +#endif /* NBIO_CXL_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h new file mode 100644 index 0000000000..7bcff65dc9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h @@ -0,0 +1,110 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCI_RESOURCES_PROTOCOL_H_ +#define AMD_PCI_RESOURCES_PROTOCOL_H_ + +typedef struct { + UINTN Index; + UINT8 SocketId; + UINTN Segment; + UINTN BaseBusNumber; +} PCI_ROOT_BRIDGE_OBJECT; + +typedef struct { + UINTN Index; + BOOLEAN Enabled; + UINT8 PortPresent; + UINTN Device; + UINTN Function; + UINTN SlotNum; + // Interrupts are relative to IOAPIC 0->n + UINTN BridgeInterrupt; // Redirection table entry for mapped bridge interrupt + UINTN EndpointInterruptArray[4]; // Redirection table entries for mapped INT A/B/C/D +} PCI_ROOT_PORT_OBJECT; + +typedef enum { + IOMMU = 0, + IOAPIC +} FIXED_RESOURCE_TYPE; + +typedef struct { + UINTN Index; + FIXED_RESOURCE_TYPE ResourceType; + UINTN Address; + UINTN Limit; +} FIXED_RESOURCES_OBJECT; + +/// Forward declaration for the AMD_PCI_RESOURCES_PROTOCOL. +typedef struct _AMD_PCI_RESOURCES_PROTOCOL AMD_PCI_RESOURCES_PROTOCOL; + +/** + * @brief System information through EFI call + * @details + */ +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + OUT UINTN *NumberOfRootBridges + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT PCI_ROOT_BRIDGE_OBJECT **RootBridgeInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfRootPorts + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN RootPortIndex, + OUT PCI_ROOT_PORT_OBJECT **RootPortInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfFixedResources + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN FixedResourceIndex, + OUT FIXED_RESOURCES_OBJECT **FixedResourceInfo + ); + +struct _AMD_PCI_RESOURCES_PROTOCOL { + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES AmdPciResourcesGetNumberOfRootBridges; + AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO AmdPciResourcesGetRootBridgeInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS AmdPciResourcesGetNumberOfRootPorts; + AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO AmdPciResourcesGetRootPortInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES AmdPciResourcesGetNumberOfFixedResources; + AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO AmdPciResourcesGetFixedResourceInfo; +}; + +extern EFI_GUID gAmdPciResourceProtocolGuid; ///< Guid for calling + +#endif // AMD_PCI_RESOURCES_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h new file mode 100644 index 0000000000..ebc7812b18 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h @@ -0,0 +1,187 @@ +/** @file + AMD Psp Ftpm Protocol Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FTPM_PROTOCOL_H_ +#define FTPM_PROTOCOL_H_ + +#include <Uefi.h> +// +// GUID definition +// +extern EFI_GUID gAmdPspFtpmProtocolGuid; + +/** + structure definition for HSP mailbox + +**/ +typedef struct { + // C2H_TPM_L0 + UINT64 TPM_L0_Address; /// Mailbox address + UINT64 TPM_L0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 TPM_L0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L0(VLT0) + UINT64 VLT0_Address; /// Mailbox address + UINT64 VLT0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L1(VLT1) + UINT64 VLT1_Address; /// Mailbox address + UINT64 VLT1_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT1_HSC_MSG_Address; /// Doorbell address HSP->CPU + + // Interrupt Information + UINT8 Gsi[4]; /// Gsi[0] is for HSP Channel 0 TPM + /// Gsi[1] is for HSP Channel 1 VTL0 + /// Gsi[2] is for HSP Channel 2 VTL1 + /// Gsi[3] is reserved +} HSP_MAILBOX_ADDRESS, *PHSP_MAILBOX_ADDRESS; + +typedef union { + HSP_MAILBOX_ADDRESS HSP_info; +} FTPM_INFO; + +typedef struct _PSP_FTPM_PROTOCOL PSP_FTPM_PROTOCOL; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: GET TPM related Information + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Function prototype for GetHspfTPMInfo. Return Pluton mailbox base address to SBIOS. + SBIOS should call this procedure after PCI Enumeration Complete. + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmInfo Point to Pluton mailbox base address + + @return EFI_SUCCESS - Success + @return EFI_INVALID_PARAMETER - Input parameter is invalid + @return EFI_NOT_READY - Pluton-fTPM device BAR0 MMIO is not ready. +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TPM_INFO)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *FtpmInfo + ); + +/** + PSP_FTPM_PROTOCOL prototype + + Defines PSP_FTPM_PROTOCOL. This protocol is used to get Ftpm info + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PROTOCOL { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs + FTPM_GET_TPM_INFO GetInfo; ///< Get TPM info +} PSP_FTPM_PROTOCOL; + +#endif //FTPM_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h new file mode 100644 index 0000000000..7f57facf88 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h @@ -0,0 +1,14 @@ +/** @file + Fabric MMIO map manager Protocol prototype definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#define FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#include <FabricResourceManagerCmn.h> + +#endif // FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h new file mode 100644 index 0000000000..a7fef5a35c --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h @@ -0,0 +1,19 @@ +/** @file + AMD CPM Base Definitions. + + Copyright (C) 2014-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_BASE_H_ +#define AMD_CPM_BASE_H_ + +#include <Base.h> +#include <Uefi.h> +#include <PiPei.h> +#include <AmdCpmCommon.h> +#include <Library/DebugLib.h> + +#endif // AMD_CPM_BASE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h new file mode 100644 index 0000000000..af192fcf03 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h @@ -0,0 +1,78 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_COMMON_H_ +#define AMD_CPM_COMMON_H_ + +#pragma pack(push) + +#include <AGESA.h> +#include <AmdPcieComplex.h> +#include <AmdCpmDefine.h> +#include <AmdCpmFunction.h> + +/// The signatures of CPM table + +typedef enum { + CPM_SIGNATURE_DXIO_TOPOLOGY = SIGNATURE_32 ('$', 'A', '2', '6'), ///< The signature of Socket 0 AMD_CPM_DXIO_TOPOLOGY_TABLE + CPM_SIGNATURE_DXIO_TOPOLOGY_S1 = SIGNATURE_32 ('$', 'A', '2', '7') ///< The signature of Socket 1 AMD_CPM_DXIO_TOPOLOGY_TABLE +} AMD_CPM_TABLE_SIGNATURE; + +/// CPM table header +typedef struct { + UINT32 TableSignature; ///< Signature of CPM table + UINT16 TableSize; ///< Table size + UINT8 FormatRevision; ///< Revision of table format + UINT8 ContentRevision; ///< Revision of table content + UINT32 PlatformMask; ///< The mask of platform table supports + UINT32 Attribute; ///< Table attribute +} AMD_CPM_TABLE_COMMON_HEADER; + +/// Table pointer +typedef union { + VOID *Pointer; ///< Table pointer + UINT64 Raw; ///< Table pointer value +} AMD_CPM_POINTER; + +/// DXIO Topology Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR Port[AMD_DXIO_PORT_DESCRIPTOR_SIZE]; ///< DXIO Port Descriptor List +} AMD_CPM_DXIO_TOPOLOGY_TABLE; + +/// AMD CPM Main Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT8 PlatformName[32]; ///< Platform name + UINT8 BiosType; ///< BIOS type + UINT16 CurrentPlatformId; ///< Current Platform Id + UINT32 PcieMemIoBaseAddr; ///< PcieMemIoBaseAddr + UINT32 AcpiMemIoBaseAddr; ///< AcpiMemIoBaseAddr + AMD_CPM_POINTER Service; ///< Reserved for internal use + AMD_CPM_POINTER TableInRomList; ///< Reserved for internal use + AMD_CPM_POINTER TableInRamList; ///< Reserved for internal use + AMD_CPM_POINTER TableInHobList; ///< Reserved for internal use + AMD_CPM_POINTER HobTablePtr; ///< Reserved for internal use + + UINT8 ExtClkGen; ///< External ClkGen Config. 0x00~0x7F + UINT8 UnusedGppClkOffEn; ///< Config to turn off unused GPP clock + UINT8 LpcUartEn; ///< LpcUartEn + UINT64 AltAcpiMemIoBaseAddr; ///< Alternate AcpiMemIoBaseAddr for Slave FCH +} AMD_CPM_MAIN_TABLE; + +/// Structure for Chip Id +typedef struct { + UINT8 Cpu; ///< CPU/APU Chip Id + UINT8 Sb; ///< SB Chip Id + UINT8 Reserved[6]; +} AMD_CPM_CHIP_ID; +#pragma pack (pop) + +#endif //AMD_CPM_COMMON_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h new file mode 100644 index 0000000000..4fc3f97a80 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h @@ -0,0 +1,17 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_DEFINE_H_ +#define AMD_CPM_DEFINE_H_ + +#ifndef AMD_DXIO_PORT_DESCRIPTOR_SIZE +#define AMD_DXIO_PORT_DESCRIPTOR_SIZE 0x30 +#endif + +#endif // AMD_CPM_DEFINE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h new file mode 100644 index 0000000000..7dce238135 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h @@ -0,0 +1,32 @@ +/** @file + AMD CPM Common Functions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_FUNCTION_H_ +#define AMD_CPM_FUNCTION_H_ + +typedef VOID *(EFIAPI *AMD_CPM_GETTABLEPTR_FN)( + IN VOID *This, + IN UINT32 TableId + ); + +typedef AGESA_STATUS (EFIAPI *AMD_CPM_GETPOSTEDVBIOSIMAGE_FN)( + IN GFX_VBIOS_IMAGE_INFO *VbiosImageInfo + ); + +/// Common Functions for CPM Drivers +typedef struct _AMD_CPM_COMMON_FUNCTION { + AMD_CPM_GETTABLEPTR_FN GetTablePtr2; ///< Get CPM Table Pointer. The table can be re-writable +} AMD_CPM_COMMON_FUNCTION; + +/// CPM Public Functions for platform DXE Driver to use +typedef struct _AMD_CPM_DXE_PUBLIC_FUNCTION { + AMD_CPM_GETPOSTEDVBIOSIMAGE_FN GetPostedVbiosImage; ///< Get posted VBIOS image +} AMD_CPM_DXE_PUBLIC_FUNCTION; + +#endif //AMD_CPM_FUNCTION_H_ diff --git a/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h new file mode 100644 index 0000000000..4a90aa3d8b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h @@ -0,0 +1,39 @@ +/** @file + AMD CPM Table Protocol. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_TABLE_PROTOCOL_H_ +#define AMD_CPM_TABLE_PROTOCOL_H_ + +#include <AmdCpmBase.h> + +// +// GUID definition +// +#define AMD_CPM_TABLE_PROTOCOL_GUID \ + { 0x3724cf01, 0x00c2, 0x9762, 0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 } + +#define AMD_CPM_TABLE_SMM_PROTOCOL_GUID \ + { 0xaf6efacf, 0x7a13, 0x45a3, 0xb1, 0xa5, 0xaa, 0xfc, 0x06, 0x1c, 0x4b, 0x79 } + +extern EFI_GUID gAmdCpmTableProtocolGuid; +extern EFI_GUID gAmdCpmTableSmmProtocolGuid; + +/// DXE Protocol Structure +typedef struct _AMD_CPM_TABLE_PROTOCOL { + UINTN Revision; ///< Protocol Revision + AMD_CPM_MAIN_TABLE *MainTablePtr; ///< Pointer to CPM Main Table + AMD_CPM_CHIP_ID ChipId; ///< Id of SB Chip + AMD_CPM_COMMON_FUNCTION CommonFunction; ///< Private Common Functions + AMD_CPM_DXE_PUBLIC_FUNCTION DxePublicFunction; ///< Public Function of Protocol +} AMD_CPM_TABLE_PROTOCOL; + +// Current Protocol Revision +#define AMD_CPM_TABLE_PROTOCOL_REV 0x00 + +#endif // AMD_CPM_TABLE_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c new file mode 100644 index 0000000000..fa83888e95 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c @@ -0,0 +1,31 @@ +/** @file + PSP Mailbox related functions + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c new file mode 100644 index 0000000000..0e9baad955 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c new file mode 100644 index 0000000000..a04bc1f992 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c @@ -0,0 +1,79 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/AmdPspRomArmorLib.h> + +/** + * Request secures the SPI Controller + * + * @param[in, out] SpiCommunicationBuffer SPI Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI White List structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request execute SPI command provide in TSEG comm buffer. + * + * @param[in] NONE + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request PSP firmware switch SPI controller chip select. + * + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c new file mode 100644 index 0000000000..fce82d75b0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/PcdLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c new file mode 100644 index 0000000000..f8b9eb0bcf --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <PiPei.h> +#include <Base.h> +#include <Library/PcdLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PeiServicesLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c new file mode 100644 index 0000000000..cff678d76b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c @@ -0,0 +1,37 @@ +** @file + Fabric Topology Base Lib implementation + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ) +{ + return 0; +} + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ) +{ + return 0; +} + +RETURN_STATUS +EFIAPI +BaseFabricTopologyLibConstructor ( + VOID + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c new file mode 100644 index 0000000000..f72cbe7dff --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c @@ -0,0 +1,8 @@ +/** @file + A Base Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c new file mode 100644 index 0000000000..a155978a5d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c @@ -0,0 +1,35 @@ +/** @file + A Dxe Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> + +/** The constructor function determines the actual TSC frequency. + + First, Get TSC frequency from system configuration table with TSC frequency GUID, + if the table is not found, install it. + This function will always return EFI_SUCCESS. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +DxeTscTimerLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c new file mode 100644 index 0000000000..f70aa3de0e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c @@ -0,0 +1,11 @@ +/** @file + A Pei Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Library/HobLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c new file mode 100644 index 0000000000..7d14d62e60 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c @@ -0,0 +1,103 @@ +/** @file + The Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** Stalls the CPU for at least the specified number of MicroSeconds. + + @param[in] MicroSeconds The minimum number of microseconds to delay. + + @return The value of MicroSeconds input. + +**/ +UINTN +EFIAPI +MicroSecondDelay ( + IN UINTN MicroSeconds + ) +{ + return 0; +} + +/** Stalls the CPU for at least the specified number of NanoSeconds. + + @param[in] NanoSeconds The minimum number of nanoseconds to delay. + + @return The value of NanoSeconds input. + +**/ +UINTN +EFIAPI +NanoSecondDelay ( + IN UINTN NanoSeconds + ) +{ + return 0; +} + +/** Retrieves the current value of the 64-bit free running Time-Stamp counter. + + The properties of the counter can be retrieved by the + GetPerformanceCounterProperties() function. + + @return The current value of the free running performance counter. + +**/ +UINT64 +EFIAPI +GetPerformanceCounter ( + VOID + ) +{ + return 0; +} + +/** Retrieves the 64-bit frequency in Hz and the range of performance counter + values. + + If StartValue is not NULL, then the value that the performance counter starts + with, 0x0, is returned in StartValue. If EndValue is not NULL, then the value + that the performance counter end with, 0xFFFFFFFFFFFFFFFF, is returned in + EndValue. + + The 64-bit frequency of the performance counter, in Hz, is always returned. + + @param[out] StartValue Pointer to where the performance counter's starting value is saved, or NULL. + @param[out] EndValue Pointer to where the performance counter's ending value is saved, or NULL. + + @return The frequency in Hz. + +**/ +UINT64 +EFIAPI +GetPerformanceCounterProperties ( + OUT UINT64 *StartValue, OPTIONAL + OUT UINT64 *EndValue OPTIONAL + ) +{ + return 0; +} + +/** + Converts elapsed ticks of performance counter to time in nanoseconds. + + This function converts the elapsed ticks of running performance counter to + time value in unit of nanoseconds. + + @param Ticks The number of elapsed ticks of running performance counter. + + @return The elapsed time in nanoseconds. + +**/ +UINT64 +EFIAPI +GetTimeInNanoSecond ( + IN UINT64 Ticks + ) +{ + return 0; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c new file mode 100644 index 0000000000..44e23df62f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c @@ -0,0 +1,95 @@ +/** @file + AMD instance of the PCI Host Bridge Library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/PciHostBridgeLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciRootBridgeIo.h> +#include <Protocol/PciHostBridgeResourceAllocation.h> + +/** + Sort all root bridges in bus ascending order and set DevicePath UIDs + continuous and ascending from zero + + @param[in,out] RootBridgeList Array of root bridges. + @param[in] Count Count of root bridges in RootBridgeList + + @return All the root bridge instances in an array are sorted in bus order. + DevicePath UID updated to continuous and ascending numbers starting + with 0. +**/ +VOID +EFIAPI +PciHostBridgeSortRootBridges ( + IN PCI_ROOT_BRIDGE *RootBridgeList, + IN UINTN Count + ) +{ +} + +/** + Return all the root bridge instances in an array. + + @param Count Return the count of root bridge instances. + + @return All the root bridge instances in an array. + The array should be passed into PciHostBridgeFreeRootBridges() + when it's not used. +**/ +PCI_ROOT_BRIDGE * +EFIAPI +PciHostBridgeGetRootBridges ( + UINTN *Count + ) +{ + return (PCI_ROOT_BRIDGE *)NULL; +} + +/** + Free the root bridge instances array returned from PciHostBridgeGetRootBridges(). + + @param Bridges The root bridge instances array. + @param Count The count of the array. +**/ +VOID +EFIAPI +PciHostBridgeFreeRootBridges ( + PCI_ROOT_BRIDGE *Bridges, + UINTN Count + ) +{ +} + +/** + Inform the platform that the resource conflict happens. + + @param HostBridgeHandle Handle of the Host Bridge. + @param Configuration Pointer to PCI I/O and PCI memory resource + descriptors. The Configuration contains the resources + for all the root bridges. The resource for each root + bridge is terminated with END descriptor and an + additional END is appended indicating the end of the + entire resources. The resource descriptor field + values follow the description in + EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL + .SubmitResources(). +**/ +VOID +EFIAPI +PciHostBridgeResourceConflict ( + EFI_HANDLE HostBridgeHandle, + VOID *Configuration + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c new file mode 100644 index 0000000000..318f8e5ad7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c @@ -0,0 +1,154 @@ +/** @file + + Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLARGOBJECTS_FILECODE + +/* + Fill the DataBuffer with correct Arg Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 argument, i.e., Arg1, Arg2 ... Arg6. + + @param[in] ArgN - Argument Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid ArgN provided. +*/ +EFI_STATUS +EFIAPI +InternalAmlArgBuffer ( + IN OUT UINT8 ArgN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (ArgN) { + case 0: + Data[0] = AML_ARG0; + break; + case 1: + Data[0] = AML_ARG1; + break; + case 2: + Data[0] = AML_ARG2; + break; + case 3: + Data[0] = AML_ARG3; + break; + case 4: + Data[0] = AML_ARG4; + break; + case 5: + Data[0] = AML_ARG5; + break; + case 6: + Data[0] = AML_ARG6; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "ARGN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlArgBuffer ( + ArgN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + ArgN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c new file mode 100644 index 0000000000..371537c9aa --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c @@ -0,0 +1,151 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLASSISTFUNCTIONS_FILECODE + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Get next node before freeing current Object + Node = GetNextNode (ListHead, Node); + // Free Object + InternalFreeAmlObject (&Object, ListHead); + } + + return EFI_SUCCESS; +} + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead cannot be NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + *TableSize = 0; + Node = GetFirstNode (ListHead); + if (!IsNodeAtEnd (ListHead, Node)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Multiple nodes remain, Likely missed an 'AmlClose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } else { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if (!Object->Completed) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Final node not completed: Likely missed an 'AmlCLose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } + + *Table = Object->Data; + *TableSize = Object->DataSize; + } + + return EFI_SUCCESS; +} + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead = NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *ListHead = AllocatePool (sizeof (LIST_ENTRY)); + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to allocate Table List Head\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + InitializeListHead (*ListHead); + + return EFI_SUCCESS; +} + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NULL ListHead passed in\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + AmlFreeObjectList (*ListHead); + FreePool (*ListHead); + *ListHead = NULL; + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c new file mode 100644 index 0000000000..b7d4f4c9d7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c @@ -0,0 +1,640 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLDATAOBJECTS_FILECODE + +/* + Creates an allocated buffer with sized data and no Op Code + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] // 0x0000000000000000- 0xFFFFFFFFFFFFFFFF + + Forces max integer size UINT64 + + Caller is responsible for freeing returned buffer. + + @param[in] Integer - Integer value to encode + @param[in] IntegerSize - Size of integer in bytes + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlSizedDataBuffer ( + IN UINT64 Integer, + IN UINTN IntegerSize, + OUT VOID **ReturnData + ) +{ + UINT8 *Data; + + if ((IntegerSize != sizeof (UINT8)) && + (IntegerSize != sizeof (UINT16)) && + (IntegerSize != sizeof (UINT32)) && + (IntegerSize != sizeof (UINT64))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Incorrect integer size=%d requested.\n", __func__, IntegerSize)); + return EFI_INVALID_PARAMETER; + } + + if ((IntegerSize < sizeof (UINT64)) && (Integer >= LShiftU64 (1, IntegerSize * 8))) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer is larger than requestd size.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Max Data Size is 64 bit. Plus one Opcode byte + Data = AllocateZeroPool (sizeof (UINT64)); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + // Already established we only have supported sizes above + switch (IntegerSize) { + case sizeof (UINT8): + *(UINT8 *)Data = (UINT8)Integer; + break; + case sizeof (UINT16): + *(UINT16 *)Data = (UINT16)Integer; + break; + case sizeof (UINT32): + *(UINT32 *)Data = (UINT32)Integer; + break; + case sizeof (UINT64): + *(UINT64 *)Data = (UINT64)Integer; + break; + } + + *ReturnData = (VOID *)Data; + return EFI_SUCCESS; +} + +/* + Calculates the optimized integer value used by AmlOPDataInteger and others + + Forces max integer size UINT64 + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *IntegerData; + UINTN IntegerDataSize; + UINT8 *Data = NULL; + UINTN DataSize; + + // Max Data Size is 64 bit. Plus one Opcode byte + IntegerData = AllocateZeroPool (sizeof (UINT64) + 1); + if (IntegerData == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + if (Integer == 0) { + // ZeroOp + IntegerDataSize = 1; + IntegerData[0] = AML_ZERO_OP; + } else if (Integer == 1) { + // OneOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONE_OP; + } else if (Integer == (UINT64) ~0x0) { + // OnesOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONES_OP; + } else { + if (Integer >= 0x100000000) { + // QWordConst + IntegerDataSize = sizeof (UINT64) + 1; + IntegerData[0] = AML_QWORD_PREFIX; + } else if (Integer >= 0x10000) { + // DWordConst + IntegerDataSize = sizeof (UINT32) + 1; + IntegerData[0] = AML_DWORD_PREFIX; + } else if (Integer >= 0x100) { + // WordConst + IntegerDataSize = sizeof (UINT16) + 1; + IntegerData[0] = AML_WORD_PREFIX; + } else { + // ByteConst + IntegerDataSize = sizeof (UINT8) + 1; + IntegerData[0] = AML_BYTE_PREFIX; + } + + DataSize = IntegerDataSize - 1; + InternalAmlSizedDataBuffer (Integer, DataSize, (VOID **)&Data); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Data Space Alloc Failed\n", __func__)); + FreePool (IntegerData); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (&IntegerData[1], Data, DataSize); + FreePool (Data); + } + + // Reallocate the pool so size is exact + *ReturnData = (VOID *)IntegerData; + *ReturnDataSize = IntegerDataSize; + + return EFI_SUCCESS; +} + +/** + Creates an optimized integer object + + Forces max integer size UINT64 + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DATA_INTEGER")); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + Integer, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an Sized Data integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +InternalAmlOPSizedData ( + IN UINT64 Integer, + IN UINTN IntegerSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "SIZED_DATA_INTEGER")); + goto Done; + } + + Object->DataSize = IntegerSize; + Status = InternalAmlSizedDataBuffer ( + Integer, + Object->DataSize, + (VOID **)&(Object->Data) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT8), ListHead); +} + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT16), ListHead); +} + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT32), ListHead); +} + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT64), ListHead); +} + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + UINT8 *Data; + UINTN DataSize; + UINTN Index; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Validate all characters + DataSize = AsciiStrLen (String); + for (Index = 0; Index < DataSize; Index++) { + if (String[Index] < 0x01) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid character String[%d] : %a\n", + __func__, + Index, + String + )); + return Status; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // AML_STRING_PREFIX + String + NULL Terminator + DataSize += 2; + Data = AllocatePool (DataSize); + if (Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: String Space Allocation %a\n", + __func__, + String + )); + goto Done; + } + + Data[0] = AML_STRING_PREFIX; + CopyMem (&Data[1], String, DataSize - 1); + + // DataString Complete, Put into Object + Object->Data = Data; + Object->DataSize = DataSize; + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Buffer == NULL) || (BufferSize == 0) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Data Buffer object\n", __func__)); + goto Done; + } + + Object->Data = AllocatePool (BufferSize); + Object->DataSize = BufferSize; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Data Buffer allocate failed\n", __func__)); + goto Done; + } + + CopyMem (Object->Data, Buffer, BufferSize); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + UINT32 EncodedEisaId; + UINT8 i; + + EncodedEisaId = 0; + + if ((String == NULL) || (ListHead == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, inputs cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AsciiStrLen (String) != 0x7) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid length for 'String' parameter.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // + // Verify String is formatted as "UUUNNNN". + // + for (i = 0; i <= 0x6; i++) { + // + // If first 3 characters are not uppercase alpha or last 4 characters are not hexadecimal + // + if (((i <= 0x2) && (!IS_ASCII_UPPER_ALPHA (String[i]))) || + ((i >= 0x3) && (!IS_ASCII_HEX_DIGIT (String[i])))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid EISA ID string format!\n", __func__)); + DEBUG ((DEBUG_ERROR, " Input String must be formatted as 'UUUNNNN'.\n")); + return EFI_INVALID_PARAMETER; + } + } + + // + // Convert string to 4-byte EISA ID encoding. + // Ex: 'PNP0A03' encodes to '0x30AD041' + // + EncodedEisaId = ((((String[0] - AML_NAME_CHAR_A + 1) & 0x1f) << 10) + + (((String[1] - AML_NAME_CHAR_A + 1) & 0x1f) << 5) + + (((String[2] - AML_NAME_CHAR_A + 1) & 0x1f) << 0) + + (UINT32)(AsciiStrHexToUint64 (&String[3]) << 16)); + + // + // Swap bytes of upper and lower WORD to format EISA ID with proper endian-ness. + // + EncodedEisaId = Swap4Bytes (EncodedEisaId); + + // + // Insert DWordPrefix into list. + // Note: EncodedEisaId will always be 32-bits, resulting in DWordConst. + // + Status = AmlOPDataInteger (EncodedEisaId, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to create ACPI DWordConst from Encoded EISA ID.\n", __func__)); + return Status; + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c new file mode 100644 index 0000000000..e8ea9d8e84 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c @@ -0,0 +1,1294 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLEXPRESSIONOPCODES_FILECODE + +// ---------------------------------------------------------------------------- +// Expression Opcodes Encoding +// ---------------------------------------------------------------------------- +// ExpressionOpcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat | +// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement | +// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit | +// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual | +// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid | +// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod | +// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr | +// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight | +// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer | +// DefToDecimalString | DefToHexString | DefToInteger | DefToString | +// DefWait | DefXOr | MethodInvocation +// ---------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN InternalBufferSize; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. Have a message with this to be + // very specific + if (BufferSize >= SIZE_4GB) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BufferSize=0x%X >= 4GB\n", __func__, BufferSize)); + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Buffer Object + Status = InternalAppendNewAmlObject (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFER object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer PkgLength object\n", __func__)); + goto Done; + } + + // Start BufferSize + Status = InternalAppendNewAmlObject (&Object, "BUFFERSIZE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFERSIZE object\n", __func__)); + goto Done; + } + + // ByteList is too complicated and must be added outside + break; + + case AmlClose: + // ByteList items should be closed already + + // Close BufferSize + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "BUFFERSIZE", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate BufferSize object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect BufferSize children\n", __func__)); + goto Done; + } + + // Set BufferSize Object to correct value and size. + // BufferSize should be from zero (no Child Data) to MAX of requested + // BufferSize or size required for ChildObject->Data. + InternalBufferSize = MAX (BufferSize, ChildObject->DataSize); + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. + if (InternalBufferSize >= SIZE_4GB) { + Status = EFI_BAD_BUFFER_SIZE; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: BufferSize 0x%X >= 4GB\n", + __func__, + InternalBufferSize + )); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + InternalBufferSize, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc BufferSize\n", __func__)); + goto Done; + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate BufferSize\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Buffer object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Buffer object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // Buffer must have at least PkgLength BufferSize + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Buffer Data\n", __func__)); + goto Done; + } + + // BufferOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_BUFFER_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the LEqual Object + Status = InternalAppendNewAmlObject (&Object, "LEQUAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start LEQUAL object\n", __func__)); + goto Done; + } + + // Operands are too complicated and must be added outside + break; + + case AmlClose: + + // Close LEqual + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "LEQUAL", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate LEqual object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // LEqual must have at least two operands + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No LEqual Args\n", __func__)); + goto Done; + } + + // LequalOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_LEQUAL_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + Creates (NumElements) section of a Package: {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + Internal only function no public reference or documentation needed. + + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlNumElements ( + IN AML_FUNCTION_PHASE Phase, + IN OUT UINTN *NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + ChildCount = 0; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Number of Elements Object + Status = InternalAppendNewAmlObject (&Object, "NUM_ELEMENTS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "NUM_ELEMENTS", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect NUM_ELEMENTS children\n", __func__)); + goto Done; + } + + // We do not have to change anything for NumElements >= Child Count + if (*NumElements == 0) { + *NumElements = ChildCount; + } else if (*NumElements < ChildCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements < ChildCount.\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } + + if (*NumElements <= MAX_UINT8) { + Object->DataSize = 1; + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = (UINT8)*NumElements; + } else { + Status = InternalAmlDataIntegerBuffer ( + *NumElements, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc NumElements\n", __func__)); + goto Done; + } + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate NumElements\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINT8 OpCode; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Package Object + Status = InternalAppendNewAmlObject (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PACKAGE object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package PkgLength object\n", __func__)); + goto Done; + } + + // Start Number of Elements Object + Status = InternalAmlNumElements (AmlStart, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlNumElements (AmlClose, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + if (NumElements <= MAX_UINT8) { + OpCode = AML_PACKAGE_OP; + } else { + OpCode = AML_VAR_PACKAGE_OP; + } + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Package object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate PACKAGE object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + // Package must have at least PkgLength NumElements + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Package Data\n", __func__)); + goto Done; + } + + // PackageOp and VarPackageOp are both one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append STORE object\n", __func__)); + goto Done; + } + + // TermArg and SuperName are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlStore(AmlStart,..) and + // AmlStore(AmlClose,...) - when creating the Store expression. + break; + + case AmlClose: + // TermArg and SuperName must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating STORE Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = AML_STORE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left or Right expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftOp Operand ShiftCount Target + ShiftOp := 0x79 or 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] ShiftOp - Specifies whether to shift left or shift + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlShift ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 ShiftOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append SHIFT object\n", __func__)); + goto Done; + } + + // Operand, ShiftCount, and Target are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlShift(AmlStart,..) and + // AmlShift(AmlClose,...) - when creating the Shift expression. + + break; + + case AmlClose: + // Operand, ShiftCount, and Target must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating SHIFT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = ShiftOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Result) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_LEFT_OP, ListHead); + return Status; +} + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_RIGHT_OP, ListHead); + return Status; +} + +/** + Creates a Find First Set Bit AML object for + both right and left searches. + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetRightBit (Source, Result) => Integer + + Bit Fields must be created between AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + DefFindSetRightBit := FindSetRightBitOp Operand Target + FindSetRightBitOp := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] FindSetOp - Specifies whether to search left or search + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlFindSetBit ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 FindSetOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append FIND_SET object\n", __func__)); + goto Done; + } + + // Source and Result are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlFindSet(AmlStart,..) and + // AmlFindSet(AmlClose,...) - when creating the FindSetBit expression. + + break; + + case AmlClose: + // Source and Result must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating FIND_SET Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = FindSetOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_LEFT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_RIGHT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start decrement expression + Status = InternalAppendNewAmlObject (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append DECREMENT object\n", __func__)); + goto Done; + } + + // Minuend is outside the scope of this object. It must be + // defined as part of a multi-tier call - in between AmlDecrement(AmlStart,..) and + // AmlDecrement(AmlClose,...) - when creating the Decrement expression. + + break; + + case AmlClose: + // Minuend must created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating DECREMENT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Decrement Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Decrement object + Object->Data[0] = AML_DECREMENT_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c new file mode 100644 index 0000000000..21deb200e3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLLOCALOBJECTS_FILECODE + +/** + Fill the DataBuffer with correct Local Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 Local variables, i.e., Local1, Local2 ... Local6. + + @param[in] LocalN - Local variable Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid LocalN provided. +**/ +EFI_STATUS +EFIAPI +InternalAmlLocalBuffer ( + IN OUT UINT8 LocalN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (LocalN) { + case 0: + Data[0] = AML_LOCAL0; + break; + case 1: + Data[0] = AML_LOCAL1; + break; + case 2: + Data[0] = AML_LOCAL2; + break; + case 3: + Data[0] = AML_LOCAL3; + break; + case 4: + Data[0] = AML_LOCAL4; + break; + case 5: + Data[0] = AML_LOCAL5; + break; + case 6: + Data[0] = AML_LOCAL6; + break; + case 7: + Data[0] = AML_LOCAL7; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "LOCALN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlLocalBuffer ( + LocalN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + LocalN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c new file mode 100644 index 0000000000..0502547a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c @@ -0,0 +1,576 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESTRING_FILECODE + +#define MAX_NAME_SEG_COUNT 255 + +/* + Is character a RootChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a RootChar + @return FALSE - Character is not a RootChar + */ +BOOLEAN +InternalIsRootChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_ROOT_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a ParentPrefixChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a ParentPrefixChar + @return FALSE - Character is not a ParentPrefixChar + */ +BOOLEAN +InternalIsParentPrefixChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_PARENT_PREFIX_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a LeadNameChar = '_', 'A' - 'Z' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a LeadNameChar + @return FALSE - Character is not a LeadNameChar + */ +BOOLEAN +InternalIsLeadNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChars '_', 'A'-'Z' + (TestChar == AML_NAME_CHAR__) || + ((TestChar >= AML_NAME_CHAR_A) && + (TestChar <= AML_NAME_CHAR_Z)) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a DigitChar = '0' - '9' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a DigitChar + @return FALSE - Character is not a DigitChar + */ +BOOLEAN +InternalIsDigitChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed DigitChars '0'-'9' + (TestChar >= AML_DIGIT_CHAR_0) && + (TestChar <= AML_DIGIT_CHAR_9) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameChar = LeadNameChar | DigitChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChar and DigitChars + InternalIsDigitChar (TestChar) || + InternalIsLeadNameChar (TestChar) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameSeg separator + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameSegSeparator ( + IN CHAR8 TestChar + ) +{ + if (TestChar == '.') { + return TRUE; + } + + return FALSE; +} + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + UINT8 *NameSeg; + UINTN NameLen; + EFI_STATUS Status; + + if (Name == NULL) { + return EFI_INVALID_PARAMETER; + } + + NameLen = AsciiStrLen (Name); + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameSeg = NULL; + // parameter validation + if ((NameLen == 0) || (NameLen > 4)) { + return EFI_INVALID_PARAMETER; + } + + if (!InternalIsLeadNameChar (Name[0])) { + return EFI_INVALID_PARAMETER; + } + + for (UINT8 i = 1; NameLen > 1 && i < NameLen; i++) { + if (!InternalIsNameChar (Name[i])) { + return EFI_INVALID_PARAMETER; + } + } + + NameSeg = AllocateZeroPool (4); + if (NameSeg == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (NameSeg, Name, NameLen); + + if (NameLen < 4) { + SetMem (&NameSeg[NameLen], 4 - NameLen, '_'); + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (Object != NULL) { + if (!EFI_ERROR (Status)) { + Object->Data = NameSeg; + Object->DataSize = 4; + Object->Completed = TRUE; + } else { + InternalFreeAmlObject (&Object, ListHead); + FreePool (NameSeg); + } + } + + return Status; +} + +/** + Creates a Namestring AML Object and inserts it into the linked list + + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + CHAR8 *NameString; + CHAR8 *NameStringPrefix; + UINTN NameStringBufferSize; + UINTN NameStringSize; + UINTN NameStringPrefixSize; + UINTN NameSegCount; + UINTN StringIndex; + UINTN StringLength; + UINTN NameSegIndex; + BOOLEAN FoundRootChar; + BOOLEAN FoundParentPrefixChar; + BOOLEAN FoundParenthesisOpenChar; + BOOLEAN FoundParenthesisCloseChar; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameString = NULL; + FoundRootChar = FALSE; + FoundParentPrefixChar = FALSE; + NameStringBufferSize = 0; + FoundParenthesisOpenChar = FALSE; + FoundParenthesisCloseChar = FALSE; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString %a object\n", __func__, String)); + goto Done; + } + + // Create a buffer to fit NameSeg [4] * max NameSegCount [255] + NameStringBufferSize = 4 * MAX_NAME_SEG_COUNT; + NameString = AllocateZeroPool (NameStringBufferSize); + // Create arbitrarily large RootChar\ParentPrefixChar buffer + NameStringPrefix = AllocateZeroPool (NameStringBufferSize); + + // Calculate length of required space + StringLength = AsciiStrLen (String); + NameStringSize = 0; + NameStringPrefixSize = 0; + NameSegIndex = 0; + NameSegCount = 0; + for (StringIndex = 0; StringIndex < StringLength; StringIndex++) { + if (NameStringPrefixSize >= NameStringBufferSize) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Exceeded ParentPrefixChar support at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (InternalIsRootChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: RootChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains more than 1 RootChar.\n", __func__, String)); + goto Done; + } + + if (FoundParentPrefixChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // RootChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundRootChar = TRUE; + } else if (InternalIsParentPrefixChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: ParentPrefixChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // ParentPrefixChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundParentPrefixChar = TRUE; + } else if (!InternalIsNameChar (String[StringIndex])) { + if (InternalIsNameSegSeparator (String[StringIndex])) { + if (NameSegIndex == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid NameSeg separator at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + NameSegIndex = 0; + } + } else if (String[StringIndex] == '(') { + if (FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisOpenChar = TRUE; + } else if (String[StringIndex] == ')') { + if (FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if (!FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: No Open Parenthesis before offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisCloseChar = TRUE; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Unsupported character at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + } else { + // Must be NameChar + if (FoundParenthesisOpenChar || FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameChar after Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if ((NameSegIndex == 0) && InternalIsDigitChar (String[StringIndex])) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: must be LeadNameChar at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (NameSegIndex >= 4) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameSeg > 4 characters at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + if (NameSegIndex == 0) { + NameSegCount++; + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Max NameSegCount=%d reached at offset=%d of String=%a'\n", + __func__, + MAX_NAME_SEG_COUNT, + StringIndex, + String + )); + goto Done; + } + } + + NameString[NameStringSize] = String[StringIndex]; + NameStringSize++; + NameSegIndex++; + if ((StringIndex + 1 >= StringLength) || + !InternalIsNameChar (String[StringIndex + 1])) + { + // Extend in progress NameSeg with '_'s + if (NameSegIndex < 4) { + SetMem (&NameString[NameStringSize], 4 - NameSegIndex, '_'); + NameStringSize += 4 - NameSegIndex; + } + } + } + } + } + + // Create AML Record with NameString contents from above + // Copy in RootChar or ParentPrefixChar(s) + if (NameStringPrefixSize != 0) { + Object->Data = ReallocatePool ( + Object->DataSize, + NameStringPrefixSize, + Object->Data + ); + CopyMem ( + &Object->Data[Object->DataSize], + NameStringPrefix, + NameStringPrefixSize + ); + Object->DataSize += NameStringPrefixSize; + FreePool (NameStringPrefix); + } + + // Set up for Dual/MultiName Prefix + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Exceeded MaxNameSegCount in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Must be at least one NameSeg in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 1) { + // Single NameSeg + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize, + Object->Data + ); + } else if (NameSegCount == 2) { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 1, + Object->Data + ); + Object->Data[Object->DataSize] = AML_DUAL_NAME_PREFIX; + Object->DataSize += 1; + } else { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 2, + Object->Data + ); + Object->Data[Object->DataSize] = AML_MULTI_NAME_PREFIX; + Object->Data[Object->DataSize + 1] = NameSegCount & 0xFF; + Object->DataSize += 2; + } + + // Copy NameString data over. From above must be at least one NameSeg + CopyMem (&Object->Data[Object->DataSize], NameString, NameStringSize); + Object->DataSize += NameStringSize; + FreePool (NameString); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + if (NameString != NULL) { + FreePool (NameString); + } + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c new file mode 100644 index 0000000000..37ae9319be --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c @@ -0,0 +1,2138 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMEDOBJECT_FILECODE + +#define METHOD_ARGS_MAX 7 +#define MAX_SYNC_LEVEL 0x0F +#define GENERIC_FIELD_IDENTIFIER "FIELD" + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Device for %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, String)); + goto Done; + } + + // Device Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_DEVICE_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an AccessField + + AccessField := 0x01 AccessType AccessAttrib + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start ACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (3); + // AML_ACCESSFIELD_OP + AccessType + AccessAttrib + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for ACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->DataSize = 3; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an ExtendedAccessField + + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Specifies the access length for the field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlExtendedAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start EXTENDEDACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (4); + // AML_EXTACCESSFIELD_OP + AccessType + AccessAttrib + AccessLength + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for EXTENDEDACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_EXT_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->Data[3] = AccessLength; + Object->DataSize = 4; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + + // x' is encoded as bits 0:7 of the AccessAttrib byte. + The description of bits 7:6 is incorrect and if AttribBytes, + AttribRawBytes, or AttribRawProcessBytes are used here, an + ExtendedAccessField is used with the following definitions + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + ExtendedAccessAttrib := ByteData // 0x0B AttribBytes + // 0x0E AttribRawBytes + // 0x0F AttribRawProcess + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // AcessType parameter check + if (AccessType > BufferAcc) { + return EFI_INVALID_PARAMETER; + } + + // AccessAttrib parameter checking + if ((AccessAttribute >= AttribNormal) && (AccessAttribute <= AttribBlock)) { + if ((AccessAttribute & 1) == 1) { + return EFI_INVALID_PARAMETER; + } + } else if (AccessAttribute > AttribRawProcessBytes) { + return EFI_INVALID_PARAMETER; + } + + // if AccessAttrib requires a length parameter, then an ExtendedAccessField is used + switch (AccessAttribute) { + case AttribBytes: + case AttribRawBytes: + case AttribRawProcessBytes: + Status = InternalAmlExtendedAccessField (AccessType, AccessAttribute, AccessLength, ListHead); + break; + default: + Status = InternalAmlAccessField (AccessType, AccessAttribute, ListHead); + break; + } + + return Status; +} + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (ObjectType >= InvalidObj) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start EXTERNAL object + Status = InternalAppendNewAmlObject (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a NameString object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, Name)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 3); + // AML_EXTERNAL_OP + Name + ObjectType + ArgumentCount + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->DataSize = 0; + Object->Data[0] = AML_EXTERNAL_OP; + Object->DataSize++; + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + Object->Data[Object->DataSize] = ObjectType; + Object->DataSize++; + Object->Data[Object->DataSize] = NumArgs; + Object->DataSize++; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Locates the AML object that holds the cumulative offset term. + This is the node directly after the node designated by + GENERIC_FIELD_IDENTIFIER in Object->Data. + + @param[out] ReturnObject - Object that contains the offset term + @param[in,out] ListHead - Linked list that contains the GENERIC_FIELD_IDENTIFIER + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateOffsetTerm ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + CHAR8 *Identifier; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + Identifier = GENERIC_FIELD_IDENTIFIER; + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + break; + } + } while (Node != ListHead); + + // Check to make sure FIELD is found, otherwise error + if ((Object->DataSize == 0) || + (Object->DataSize != IdentifierSize) || + CompareMem ( + Object->Data, + Identifier, + (MAX (Object->DataSize, IdentifierSize) != 0) + )) + { + return EFI_DEVICE_ERROR; + } + + // Have found FIELD + Node = GetNextNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + UINT8 *PkgLength; + UINTN DataLength; + EFI_STATUS Status; + UINT64 InternalOffsetData; + UINT64 BitCount; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + InternalOffsetData = 0; + BitCount = LShiftU64 (ByteOffset, 3); + Object = NULL; + OffsetObject = NULL; + PkgLength = NULL; + + // Find and read internal offset data + Status = InternalAmlLocateOffsetTerm (&OffsetObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term\n", __func__)); + goto Done; + } + + InternalOffsetData = *(UINT64 *)OffsetObject->Data; + + if (InternalOffsetData > BitCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid backwards offset\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } else if (InternalOffsetData == BitCount) { + // Do not need to append any reserved fields + Status = EFI_SUCCESS; + goto Done; + } + + // update internal offset value to new offset + *(UINT64 *)OffsetObject->Data = BitCount; + + // take difference to find how many bits to reserve + BitCount = BitCount - InternalOffsetData; + + // Create new object for the offset data, add pkglength encoding + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: appending new AML object\n", __func__)); + goto Done; + } + + Status = InternalAmlBitPkgLength ((UINT32)BitCount, &PkgLength, &DataLength); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: internal AML PkgLength\n", __func__)); + goto Done; + } + + Object->DataSize = DataLength + 1; // add one for Reserved Field Indicator + Object->Data = AllocateZeroPool (Object->DataSize); + + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Offset\n", __func__)); + goto Done; + } + + Object->Data[0] = 0; + CopyMem (&Object->Data[1], PkgLength, DataLength); // read internal offset data + Object->Completed = TRUE; + FreePool (PkgLength); + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + EFI_STATUS Status; + + if ((ListHead == NULL) || (Name == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + OffsetObject = NULL; + + if (AsciiStrLen (Name) == 0) { + if (BitLength > 0) { + // Prepend a 0 to the list + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (1); + Object->DataSize = 1; + Object->Completed = TRUE; + } else { + Status = EFI_SUCCESS; + goto Done; + } + } else { + // add NameSeg to List + Status = InternalAmlNameSeg (Name, ListHead); + } + + if (EFI_ERROR (Status)) { + goto Done; + } + + // Locate and update internal Offset term + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating offset term for %a object\n", __func__, Name)); + goto Done; + } + + *(UINT64 *)Object->Data += BitLength; // write + + // Add BitLength as a PkgLength term + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlBitPkgLength (BitLength, &Object->Data, &Object->DataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (Name == NULL) || (AsciiStrLen (Name) == 0)) { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field for %a object\n", __func__, Name)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field internal offset %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, Name)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, Name)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || + (BankName == NULL) || (AsciiStrLen (BankName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField internal offset %a object\n", __func__, BankName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required Region NameString + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, RegionName)); + goto Done; + } + + // Insert required Bank NameString + Status = AmlOPNameString (BankName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required BankValue integer + Status = AmlOPDataInteger (BankValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Adding BankValue Integer for %a object\n", __func__, BankName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, BankName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameStrings completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, BankName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, BankName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, BankName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, BankName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_BANK_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (IndexName == NULL) || (AsciiStrLen (IndexName) == 0) || + (DataName == NULL) || (AsciiStrLen (DataName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField internal offset %a object\n", __func__, IndexName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Index NameString + Status = AmlOPNameString (IndexName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Data NameString + Status = AmlOPNameString (DataName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, DataName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, IndexName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, IndexName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, IndexName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, IndexName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, IndexName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_INDEX_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_STATUS Status; + + // Input parameter validation + if ((RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || (ListHead == NULL) || + ((RegionSpace > PCC) && (RegionSpace < 0x80)) || (RegionSpace > 0xFF)) + { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + ChildObject = NULL; + Status = EFI_DEVICE_ERROR; + + Status = InternalAppendNewAmlObject (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start OpRegion for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Name String for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPByteData ((UINT8)RegionSpace, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Region space byte data for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Offset, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Offset data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Length, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Length data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, RegionName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, RegionName)); + goto Done; + } + + // OpRegion Opcode is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, RegionName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_REGION_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + Object = NULL; + + if ((SourceBuffer == NULL) || (FieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + ChildObject = NULL; + Status = InternalAppendNewAmlObject (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (BitIndex, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BitIndex for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (NumBits, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumBits for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (FieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FieldName)); + goto Done; + } + + // CreateFieldOp is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FieldName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_CREATE_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Internal function used to create a CreateBit|Byte|Word|DWord|QWordField objects + and insert them into the linked list + + @param[in] SourceBuffer, - Buffer to insert the new buffer fixed field object + @param[in] Index, - Starting index to place the new buffer + @param[in] FixedFieldName, - Name of the FixedField + @param[in] OpCode, - AML opcode for the Create_Field encoding + @param[in,out] ListHead - Linked list has completed CreateFixedField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlCreateFixedField ( + IN CHAR8 *SourceBuffer, + IN UINT64 Index, + IN CHAR8 *FixedFieldName, + IN UINT8 OpCode, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + + if ((SourceBuffer == NULL) || (FixedFieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FixedFieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObject (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Check if Localx Buffer + if (AsciiStrnCmp (SourceBuffer, "Local", 5) == 0) { + if ((SourceBuffer[5] >= '0') && (SourceBuffer[5] <= '9')) { + Status = AmlOPLocalN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[5]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: LocalN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + // Check if Argx Buffer + } else if (AsciiStrnCmp (SourceBuffer, "Arg", 3) == 0) { + if ((SourceBuffer[3] >= '0') && (SourceBuffer[3] <= '9')) { + Status = AmlOpArgN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[3]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ArgN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + } else { + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + Status = AmlOPDataInteger (Index, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Index for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = AmlOPNameString (FixedFieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FixedFieldName)); + goto Done; + } + + // CreateWordFieldOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FixedFieldName)); + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, BitIndex, BitFieldName, AML_CREATE_BIT_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, ByteFieldName, AML_CREATE_BYTE_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, DWordFieldName, AML_CREATE_DWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, QWordFieldName, AML_CREATE_QWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, WordFieldName, AML_CREATE_WORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 MethodFlags; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (SyncLevel > MAX_SYNC_LEVEL) || + (SerializeRule >= FlagInvalid) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Method for %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Method Flags + Status = InternalAppendNewAmlObject (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + // Add Method Flags + Status = InternalAmlLocateObjectByIdentifier (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a METHOD_FLAGS child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Flags is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + MethodFlags = NumArgs & 0x07; + if (SerializeRule) { + MethodFlags |= BIT3; + } + + MethodFlags |= (SyncLevel & 0x0F) << 4; + Object->Data[0] = MethodFlags; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_METHOD_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c new file mode 100644 index 0000000000..afe51cdcf2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c @@ -0,0 +1,360 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESPACEMODIFIEROBJECTS_FILECODE + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + // Scope Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_SCOPE_OP; + CopyMem (&Object->Data[1], ChildObject->Data, ChildObject->DataSize); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString ChildObjectData + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, String)); + goto Done; + } + + break; + case AmlClose: + // DataRefObject should be closed already + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + Object->Data = AllocatePool (ChildObject->DataSize + 1); + // Name Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_NAME_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((SourceName == NULL) || (AliasName == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start ALIAS object + Status = InternalAppendNewAmlObject (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append ALIAS object\n", __func__)); + goto Done; + } + + // Insert required Object (to be aliased) NameString + Status = AmlOPNameString (SourceName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, SourceName)); + goto Done; + } + + // Insert required Alias NameString + Status = AmlOPNameString (AliasName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, AliasName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot locate ALIAS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, SourceName)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + // Alias Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, SourceName)); + goto Done; + } + + Object->Data[0] = AML_ALIAS_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c new file mode 100644 index 0000000000..279bfc782d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c @@ -0,0 +1,144 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLOBJECTSDEBUG_FILECODE + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ) +{ + UINTN Column; + UINTN Index; + UINTN NumberOfColumns; + UINT8 *Data; + + Data = Buffer; + NumberOfColumns = 16; + // Header + DEBUG ((DEBUG_VERBOSE, " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n")); + for (Index = 0; Index < BufferSize;) { + // Row Counter + DEBUG ((DEBUG_VERBOSE, "%4X ", Index)); + + // Hex ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + DEBUG ((DEBUG_VERBOSE, " %02X", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, " ")); + } + } + + DEBUG ((DEBUG_VERBOSE, " ")); + // Ascii ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + // Only print ACPI acceptable characters + if (((Data[Index + Column] >= 0x30) && // '0' - '9' + (Data[Index + Column] <= 0x39)) || + ((Data[Index + Column] >= 0x41) && // 'A' - 'Z' + (Data[Index + Column] <= 0x5A)) || + (Data[Index + Column] == 0x5C) || // '\' + (Data[Index + Column] == 0x5F) || // '_' + (Data[Index + Column] == 0x5E) // '^' + ) + { + DEBUG ((DEBUG_VERBOSE, "%c", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, ".")); + } + } + } + + Index += NumberOfColumns; + DEBUG ((DEBUG_VERBOSE, "\n")); + } + + return EFI_SUCCESS; +} + +/** + DEBUG print an AML Object including an array of HEX bytes for the data + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS, EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if ((Object == NULL) || (Object->Signature != AML_OBJECT_INSTANCE_SIGNATURE)) { + return EFI_INVALID_PARAMETER; + } + + DEBUG (( + DEBUG_VERBOSE, + "Object=0x%X, Size=0x%d\n", + (UINTN)Object, + Object->DataSize + )); + AmlDebugPrintBuffer (Object->Data, Object->DataSize); + DEBUG ((DEBUG_VERBOSE, "Completed=%a\n", Object->Completed ? "TRUE" : "FALSE")); + DEBUG ((DEBUG_VERBOSE, "\n")); + return EFI_SUCCESS; +} + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + DEBUG ((DEBUG_VERBOSE, "Printing AML_OBJECT_INSTANCE Linked List\n")); + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + AmlDebugPrintObject (Object); + Node = GetNextNode (ListHead, Node); + } + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c new file mode 100644 index 0000000000..85d184b759 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c @@ -0,0 +1,267 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLPKGLENGTH_FILECODE + +#define MAX_ONE_BYTE_PKG_LENGTH 63 +#define ONE_BYTE_PKG_LENGTH_ENCODING 0x00 +#define ONE_BYTE_NIBBLE_MASK 0x3F + +#define MAX_TWO_BYTE_PKG_LENGTH 4095 +#define TWO_BYTE_PKG_LENGTH_ENCODING 0x40 +#define PKG_LENGTH_NIBBLE_MASK 0x0F + +#define MAX_THREE_BYTE_PKG_LENGTH 1048575 +#define THREE_BYTE_PKG_LENGTH_ENCODING 0x80 + +#define MAX_FOUR_BYTE_PKG_LENGTH 268435455 +#define FOUR_BYTE_PKG_LENGTH_ENCODING 0xC0 + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ) +{ + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + EFI_STATUS Status; + + Status = EFI_INVALID_PARAMETER; + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((DataSize) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((DataSize) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + // DataSize = DataLength + DataSize; + *PkgLengthEncoding = AllocatePool (DataLength); + if (*PkgLengthEncoding == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + *PkgLengthEncoding[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (DataSize) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&PkgLengthEncoding[0][1], &PkgLengthRemainder, DataLength - 1); + } + + *ReturnDataLength = DataLength; + +Done: + return Status; +} + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Length object\n", __func__)); + goto Done; + } + + break; + case AmlClose: + Status = InternalAmlLocateObjectByIdentifier (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Length object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, "Length")); + goto Done; + } + + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((ChildObject->DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((ChildObject->DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_DEVICE_ERROR; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + Object->DataSize = DataLength + ChildObject->DataSize; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + Object->Data[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (ChildObject->DataSize + DataLength) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&Object->Data[1], &PkgLengthRemainder, DataLength - 1); + } + + CopyMem ( + &Object->Data[DataLength], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c new file mode 100644 index 0000000000..4ef746327b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c @@ -0,0 +1,1989 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLRESOURCEDESCRIPTOR_FILECODE + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_ACPI_END_TAG_DESCRIPTOR *EndTag; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = AmlBuffer (AmlStart, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + // Start EndTag object to be completed in Close + // ACPI 6.3: 6.4.2.9 End Tag: ...The End Tag is automatically generated by + // the ASL compiler at the end of the ResourceTemplate statement. + Status = InternalAppendNewAmlObject (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "END_TAG")); + goto Done; + } + + // ResourceMacroList is too complicated and must be added outside + break; + case AmlClose: + // ResourceMacroList should be closed already + + // Locate and complete End Tag + Status = InternalAmlLocateObjectByIdentifier (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, "END_TAG")); + goto Done; + } + + // Release Object->Data Identifier + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: EndTag Alloc Failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + // ChildObject Data goes before End Tag + if ((ChildObject->Data != NULL) && (ChildObject->DataSize > 0)) { + CopyMem (Object->Data, ChildObject->Data, ChildObject->DataSize); + } + + EndTag = (EFI_ACPI_END_TAG_DESCRIPTOR *)&Object->Data[ChildObject->DataSize]; + EndTag->Desc = ACPI_END_TAG_DESCRIPTOR; + // Spec says the byte is a checksum, but I have never seen a value other + // than zero in the field compiled from ASL. + // EndTag->Checksum already = 0; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = AmlBuffer (AmlClose, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + InternalAmlAddressSpaceCheck + + Checks Address space parameters for Word, DWord, or QWord size Address space + Descriptor. Size will be constrained by the Resource Descriptor input + parameters being of the correct size. + + @param[in] IsMinFixed + @param[in] IsMaxFixed + @param[in] AddressGranularity + @param[in] AddressMinimum + @param[in] AddressMaximum + @param[in] RangeLength + +**/ +EFI_STATUS +EFIAPI +InternalAmlAddressSpaceCheck ( + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 RangeLength + ) +{ + // Max must be greater than Min + if (AddressMaximum < AddressMinimum) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum greater than AddressMaximum\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Address Granularity must be (2^n)-1 + if (((AddressGranularity + 1) & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity must be (a power of 2)-1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (RangeLength == 0) { + // LEN _MIF _MAF Definition + // 0 0 0 + // 0 0 1 + // 0 1 0 + // Variable size, variable location resource descriptor for _PRS. + // If _MIF is set, _MIN must be a multiple of (_GRA+1). If _MAF + // is set, _MAX must be (a multiple of (_GRA+1))-1. + // OS can pick the resource range that satisfies following conditions: + // If _MIF is not set, start address is a multiple of (_GRA+1) + // and greater or equal to _MIN. Otherwise, start address is _MIN. + // If _MAF is not set, end address is (a multiple of (_GRA+1))-1 + // and less or equal to _MAX. Otherwise, end address is _MAX. + // 0 1 1 (Invalid combination) + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // 0 1 1 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsMinFixed and IsMaxFixed cannot both be set\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED) { + // 0 0 1 + if ((AddressMaximum & AddressGranularity) != AddressGranularity) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMaximum=0x%lX + 1) is not a multiple of\n", __func__, AddressMaximum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressMaximum == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMaximum can not be 0\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if (IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) { + // 0 1 0 + if ((AddressMinimum & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum=0x%lX is not a multiple of\n", __func__, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED) && + (AddressMinimum == 0) && + (AddressMaximum == 0) && + (AddressGranularity == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Maximum, Minimum, Granularity all 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else { + // LEN _MIF _MAF Definition + // >0 0 0 Fixed size, variable location resource descriptor for _PRS. + // _LEN must be a multiple of (_GRA+1). + // OS can pick the resource range that satisfies following conditions: + // Start address is a multiple of (_GRA+1) and greater or equal to _MIN. + // End address is (start address+_LEN-1) and less or equal to _MAX. + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + // >0 1 1 Fixed size, fixed location resource descriptor. + // _GRA must be 0 and _LEN must be (_MAX - _MIN +1). + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED)) + { + // >0 0 0 + if ((RangeLength & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX is not a multiple of\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 0, IsMaxFixed = 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength > (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX > (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 0, IsMaxFixed = 0\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // >0 1 1 + if (AddressGranularity != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity=0x%lX != 0\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX > 0, IsMinFixed = 1, and IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength != (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX != (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 1, IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else { + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: When RangeLength=0x%lX > 0,\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed and IsMaxFixed must both be either 1 or 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } + + return EFI_SUCCESS; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + The DWORD address space descriptor is used to report resource usage in a + 32-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPDWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: DWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DMA_DESCRIPTOR *Descriptor; + + if ((DmaType & (UINT8) ~EFI_ACPI_DMA_SPEED_TYPE_MASK) != 0) { + // Invalid DmaType value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaType '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if ((IsBusMaster & ~EFI_ACPI_DMA_BUS_MASTER_MASK) != 0) { + // Invalid IsBusMaster value + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsBusMaster '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (((DmaTransferSize & ~EFI_ACPI_DMA_TRANSFER_TYPE_MASK) != 0) || + (DmaTransferSize == 0x3)) + { + // Invalid DmaTransferSize value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaTransferSize '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "DMA_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DMA_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DMA_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DMA_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_DMA_DESCRIPTOR; + Descriptor->ChannelMask = DmaChannelList; + // + // Descriptor->Information bit mask: + // Bit [7] Reserved (must be 0) + // Bits [6:5] DMA channel speed supported, _TYP + // 00 Indicates compatibility mode + // 01 Indicates Type A DMA as described in the EISA + // 10 Indicates Type B DMA + // 11 Indicates Type F + // Bits [4:3] Ignored + // Bit [2] Logical device bus master status, _BM + // 0 Logical device is not a bus master + // 1 Logical device is a bus master + // Bits [1:0] DMA transfer type preference, _SIZ + // 00 8-bit only + // 01 8- and 16-bit + // 10 16-bit only + Descriptor->Information = (UINT8)(DmaType + + IsBusMaster + + DmaTransferSize); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 are Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create QWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPQWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: QWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "QWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "QWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IRQ_DESCRIPTOR *Descriptor; + + if ((EdgeLevel & (UINT8) ~EFI_ACPI_IRQ_MODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: EdgeLevel '%x' is not valid.\n", __func__, EdgeLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((ActiveLevel & (UINT8) ~EFI_ACPI_IRQ_POLARITY_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ActiveLevel '%x' is not valid.\n", __func__, ActiveLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((Shared & (UINT8) ~(EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | EFI_ACPI_IRQ_SHARABLE_MASK)) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Shared '%x' is not valid.\n", __func__, Shared)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create %a object.", __func__, "IRQ_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IRQ_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Alloc for %a failed\n", __func__, "IRQ_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IRQ_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_IRQ_DESCRIPTOR; + Descriptor->Mask = InterruptList; + // + // Ref 6.4.2.1 IRQ Descriptor - IRQ Information + // Descriptor->Information bit mask: + // IRQ Information. Each bit, when set, indicates this device is capable of + // driving a certain type of interrupt. (Optional-if not included then assume + // edge sensitive, high true interrupts.) These bits can be used both for + // reporting and setting IRQ resources. + // Note: This descriptor is meant for describing interrupts that are connected + // to PIC-compatible interrupt controllers, which can only be programmed + // for Active-High-Edge-Triggered or Active-Low-LevelTriggered interrupts. + // Any other combination is invalid. The Extended Interrupt Descriptor can + // be used to describe other combinations. + // + // Bit [7:6] Reserved (must be 0) + // Bit [5] Wake Capability, _WKC + // 0x0 = Not Wake Capable: This interrupt is not capable of waking the system. + // 0x1 = Wake Capable: This interrupt is capable of waking the system from a + // low-power idle state or a system sleep state. + // Bit [4] Interrupt Sharing, _SHR + // 0x0 = Exclusive: This interrupt is not shared with other devices. + // 0x1 = Shared: This interrupt is shared with other devices. + // Bit [3] Interrupt Polarity, _LL + // 0 Active-High - This interrupt is sampled when the signal is high, or true + // 1 Active-Low - This interrupt is sampled when the signal is low, or false. + // Bit [2:1] Ignored + // Bit [0] Interrupt Mode, _HE + // 0 Level-Triggered - Interrupt is triggered in response to signal in a low state. + // 1 Edge-Triggered - Interrupt is triggered in response to a change in signal state from + // low to high. + // + Descriptor->Information = (UINT8)((EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | + EFI_ACPI_IRQ_SHARABLE_MASK | + EFI_ACPI_IRQ_POLARITY_MASK | + EFI_ACPI_IRQ_MODE_MASK) & + (Shared | + ActiveLevel | + EdgeLevel)); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IO_PORT_DESCRIPTOR *Descriptor; + UINT64 Remainder; + + if ((Decode & (UINT8) ~EFI_ACPI_IO_DECODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Decode '%x' is not valid.\n", __func__, Decode)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressAlignment != 0) { + DivU64x64Remainder (AddressMin, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMin=0x%X) is not a multiple of\n", __func__, AddressMin)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + + DivU64x64Remainder (AddressMax, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMax=0x%X) is not a multiple of\n", __func__, AddressMax)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IO_PORT_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IO_PORT_DESCRIPTOR *)Object->Data; + + /* + * According to ACPI spec for + * ACPI_IO_PORT_DESCRIPTOR = 0x47 contains the informaion about + * Name, Type and Length, hence no need to calculate the length. + * Below is description from ACPI spec + * Byte 0 I/O Port Descriptor Value = 0x47 (01000111B) - Type = 0, Small item name = + * 0x8, Length = 7 + */ + Descriptor->Header.Byte = ACPI_IO_PORT_DESCRIPTOR; + // + // Descriptor->Information bit mask: + // Bit [7:1] Reserved, must be 0 + // Bit [0] (_DEC) + // 1 The logical device decodes 16-bit addresses + // 0 The logical device decodes 10-bit addresses + Descriptor->Information = (UINT8)(EFI_ACPI_IO_DECODE_MASK & Decode); + Descriptor->BaseAddressMin = AddressMin; + Descriptor->BaseAddressMax = AddressMax; + Descriptor->Alignment = AddressAlignment; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *Descriptor; + + if ((AddressSpaceKeyword < EFI_ACPI_6_4_SYSTEM_MEMORY) || + (AddressSpaceKeyword > EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if ((AddressSpaceKeyword > EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL) && + (AddressSpaceKeyword < EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if (AccessSize > EFI_ACPI_6_4_QWORD) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AccessSize=0x%02X\n", __func__, AccessSize)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *)Object->Data; + + Descriptor->Header.Header.Byte = ACPI_GENERIC_REGISTER_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->AddressSpaceId = AddressSpaceKeyword; + Descriptor->RegisterBitWidth = RegisterBitWidth; + Descriptor->RegisterBitOffset = RegisterBitOffset; + Descriptor->AddressSize = AccessSize; + Descriptor->RegisterAddress = RegisterAddress; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: Evaluates to a 32-bit integer that specifies the total number of + bytes decoded in the memory range. The 32-bit field DescriptorName. _LEN is + automatically created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *Descriptor; + + if ((ReadAndWrite & (UINT8) ~EFI_ACPI_MEMORY_WRITE_STATUS_MASK) != 0) { + // Invalid ReadAndWrite value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ReadAndWrite '%x' is not valid.\n", __func__, ReadAndWrite)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "MEMORY_32_FIXED_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "MEMORY_32_FIXED_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->Information = ReadAndWrite; + Descriptor->BaseAddress = AddressBase; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + The WORD address space descriptor is used to report resource usage in a + 16-bit address space (like memory and I/O, Bus Number). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "WORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + + This function only requires a single call and therefore no Phases + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_BUS, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + 0, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c new file mode 100644 index 0000000000..03201d0109 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c @@ -0,0 +1,515 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLSTATEMENTOPCODES_FILECODE + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Else", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Else", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_ELSE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "If", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "If", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_IF_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + Status = InternalAppendNewAmlObject (&Object, NotifyObject, ListHead); + Status = AmlOPNameString (NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyObject NameString\n", __func__)); + goto Done; + } + + Status = AmlOPDataInteger (NotifyValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyValue Integer\n", __func__)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_NOTIFY_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Return", ListHead); + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Return", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + // Return without arguments is treated like Return(0) + // Zeroed byte = ZeroOp + ChildObject->Data = AllocateZeroPool (sizeof (UINT8)); + if (ChildObject->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Zero Child for Return\n", __func__)); + goto Done; + } + + ChildObject->DataSize = 1; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_RETURN_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c new file mode 100644 index 0000000000..c9a4399764 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c @@ -0,0 +1,213 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLTABLE_FILECODE + +// String Length Constants +#define OEM_ID_LENGTH 6 +#define OEM_TABLE_ID_LENGTH 8 +#define SIGNATURE_LENGTH 4 +#define CREATOR_ID_LENGTH 4 + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (ListHead == NULL) || + (TableNameString == NULL) || + (OemId == NULL) || + (OemTableId == NULL) || + (CreatorId == NULL) || + (AsciiStrLen (TableNameString) != SIGNATURE_LENGTH) || + (AsciiStrLen (OemId) > OEM_ID_LENGTH) || + (AsciiStrLen (OemTableId) > OEM_TABLE_ID_LENGTH) || + (AsciiStrLen (CreatorId) != CREATOR_ID_LENGTH)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, TableNameString, ListHead); + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, TableNameString, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate %a object\n", __func__, TableNameString)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, TableNameString)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_DESCRIPTION_HEADER); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, TableNameString)); + goto Done; + } + + // Fill table header with data + // Signature + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Signature)], + TableNameString, + AsciiStrLen (TableNameString) + ); + + // Table Length + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Length)], + (UINT32 *)&Object->DataSize, + sizeof (UINT32) + ); + + // ACPI Table Version + Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Revision)] = ComplianceRev; + + // OEM ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemId)], + OemId, + AsciiStrLen (OemId) + ); + + // OEM Table ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemTableId)], + OemTableId, + AsciiStrLen (OemTableId) + ); + + // OEM Table Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemRevision)], + (UINT8 *)&OemRevision, + sizeof (UINT32) + ); + + // Creator ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorId)], + CreatorId, + AsciiStrLen (CreatorId) + ); + + // Creator Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorRevision)], + (UINT8 *)&CreatorRevision, + sizeof (UINT32) + ); + + // Copy rest of data into Object + CopyMem ( + &Object->Data[sizeof (EFI_ACPI_DESCRIPTION_HEADER)], + ChildObject->Data, + ChildObject->DataSize + ); + + // Checksum Set on Table Install + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c new file mode 100644 index 0000000000..b1ad9b7037 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c @@ -0,0 +1,364 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_LOCALAMLOBJECTS_FILECODE + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if (Object == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (Object->Data != NULL) { + FreePool (Object->Data); + Object->Data = NULL; + Object->DataSize = 0; + Object->Completed = FALSE; + } + + return EFI_SUCCESS; +} + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **FreeObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + + if ((FreeObject == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = *FreeObject; + if (Object != NULL) { + InternalFreeAmlObjectData (Object); + if (IsNodeInList (ListHead, &Object->Link)) { + RemoveEntryList (&Object->Link); + } + + FreePool (Object); + } + + *FreeObject = NULL; + return EFI_SUCCESS; +} + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ) +{ + AML_OBJECT_INSTANCE *Object; + + if (ReturnObject == NULL) { + return EFI_INVALID_PARAMETER; + } + + *ReturnObject = NULL; + + // Allocate AML Object + Object = AllocateZeroPool (sizeof (AML_OBJECT_INSTANCE)); + if (Object == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Object Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + Object->DataSize = 0; + Object->Data = NULL; + Object->Signature = AML_OBJECT_INSTANCE_SIGNATURE; + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((ListHead == NULL) || (ReturnObject == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = InternalNewAmlObjectNoData (&Object); + if (!EFI_ERROR (Status)) { + InsertTailList (ListHead, &Object->Link); + *ReturnObject = Object; + } + + return Status; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + // Allocate Identifier Data + NULL termination + Object->DataSize = AsciiStrLen (Identifier) + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Data Identifier=%a\n", __func__, Identifier)); + InternalFreeAmlObject (&Object, ListHead); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (Object->Data, Identifier, Object->DataSize); + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + + if (Object->Completed) { + // Object to be found cannot be completed yet + continue; + } else { + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + *ReturnObject = Object; + return EFI_SUCCESS; + } else { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: First incomplete Object is not %a.\n", + __func__, + Identifier + )); + // Object looking for should be the first uncompleted Object. + return EFI_NOT_FOUND; + } + } + } while (Node != ListHead); + + *ReturnObject = NULL; + return EFI_NOT_FOUND; +} + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 *TempBuffer; + + Status = EFI_SUCCESS; + if ((ReturnObject == NULL) || + (ChildCount == NULL) || + (Link == NULL) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + *ChildCount = 0; + + Status = InternalNewAmlObjectNoData (&Object); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocating Object Data\n", __func__)); + goto Done; + } + + // Get first Child Node + Node = GetNextNode (ListHead, Link); + while (Node != ListHead) { + ChildObject = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Expand data buffer to fit existing data + new data + TempBuffer = ReallocatePool ( + Object->DataSize, + Object->DataSize + ChildObject->DataSize, + Object->Data + ); + if (TempBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + FreePool (Object->Data); + Object->Data = NULL; + DEBUG ((DEBUG_ERROR, "%a: ERROR: reallocating Object Data\n", __func__)); + goto Done; + } + + Object->Data = TempBuffer; + // Copy new data at end of buffer + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + // Get Next ChildObject Node, then free ChildObject from list + Node = GetNextNode (ListHead, Node); + InternalFreeAmlObject (&ChildObject, ListHead); + *ChildCount = *ChildCount + 1; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + Object = NULL; + } + + *ReturnObject = Object; + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c new file mode 100644 index 0000000000..2f4f676adb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c @@ -0,0 +1,13 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/*---------------------------------------------------------------------------------------- + * M O D U L E S U S E D + *---------------------------------------------------------------------------------------- + */ +#include <Filecode.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c new file mode 100644 index 0000000000..60305ee4a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c @@ -0,0 +1,90 @@ +/** @file + Library to support reset library, inheritted from Agesa Cf9Reset module. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> + +/** + This function causes a system-wide reset (cold reset), in which + all circuitry within the system returns to its initial state. This type of reset + is asynchronous to system operation and operates without regard to + cycle boundaries. + + If this function returns, it means that the system does not support cold reset. +**/ +VOID +EFIAPI +ResetCold ( + VOID + ) +{ +} + +/** + This function causes a system-wide initialization (warm reset), in which all processors + are set to their initial state. Pending cycles are not corrupted. + + If this function returns, it means that the system does not support warm reset. +**/ +VOID +EFIAPI +ResetWarm ( + VOID + ) +{ +} + +/** + This function causes the system to enter a power state equivalent + to the ACPI G2/S5 or G3 states. + + If this function returns, it means that the system does not support shutdown reset. +**/ +VOID +EFIAPI +ResetShutdown ( + VOID + ) +{ +} + +/** + This function causes the system to enter S3 and then wake up immediately. + + If this function returns, it means that the system does not support S3 feature. +**/ +VOID +EFIAPI +EnterS3WithImmediateWake ( + VOID + ) +{ +} + +/** + This function causes a systemwide reset. The exact type of the reset is + defined by the EFI_GUID that follows the Null-terminated Unicode string passed + into ResetData. If the platform does not recognize the EFI_GUID in ResetData + the platform must pick a supported reset type to perform.The platform may + optionally log the parameters from any non-normal reset that occurs. + + @param[in] DataSize The size, in bytes, of ResetData. + @param[in] ResetData The data buffer starts with a Null-terminated string, + followed by the EFI_GUID. +**/ +VOID +EFIAPI +ResetPlatformSpecific ( + IN UINTN DataSize, + IN VOID *ResetData + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c new file mode 100644 index 0000000000..d10e676668 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c @@ -0,0 +1,87 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Filecode.h> +#include <Uefi.h> +/*----------------------------------------------------------------------------------------*/ + +/** + * @param[in] EspiBase Espi MMIO base + * @param[in] RegAddr Slave register address + * + * @retval Register Value + */ +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ) +{ + return 0; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to read + * @param[in] Length Length in byte to read + * @param[in] Buffer Pointer to the data read to + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to write + * @param[in] Length Length in byte to write + * @param[in] Value Pointer to the data to write + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to erase + * @param[in] Length Block Size to erase + * + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c new file mode 100755 index 0000000000..9044d3d497 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c @@ -0,0 +1,68 @@ +/** @file + GNB function to create/locate PCIe configuration data area, Contain code + that create/locate/manages GNB/PCIe configuration + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/NbioHandleLib.h> +#include <Library/AmdBaseLib.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ) +{ + return NULL; +} + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ) +{ + PCI_ADDR PciAddr; + + PciAddr.AddressValue = 0; + return PciAddr; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c new file mode 100755 index 0000000000..d5fbe98d22 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c @@ -0,0 +1,276 @@ +/** @file + GNB function to create/locate PCIe configuration data area + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/GnbPcieConfigLib.h> + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ) +{ + return FALSE; +} + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ) +{ + return 0; +} + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ) +{ +} + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ +} + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ) +{ + return FALSE; +} + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ + return NULL; +} + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ) +{ +} + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ) +{ +} + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ) +{ +} + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c new file mode 100755 index 0000000000..5c6be22ee4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c @@ -0,0 +1,117 @@ +/** @file + Procedure to parse PCIe input configuration data + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <GnbDxio.h> + +/** + Get number of complexes in platform topology configuration + + @param[in] ComplexList First complex configuration in complex configuration array + @retval Number of Complexes + +**/ +UINTN +PcieInputParserGetNumberOfComplexes ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList + ) +{ + return 0; +} + +/** + Get number of PCIe engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfPcieEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of DDI engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfDdiEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of engines in given complex + + + + @param[in] Complex Complex configuration header + @retval Number of Engines +**/ +UINTN +PcieInputParserGetNumberOfEngines ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] Index Complex descriptor Index + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINTN Index + ) +{ + return NULL; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] SocketId Socket Id + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptorOfSocket ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINT32 SocketId + ) +{ + return NULL; +} + +/** + Get Engine descriptor from given complex by index + + @param[in] Complex Complex descriptor + @param[in] Index Engine descriptor index + @retval Pointer to Engine Descriptor +**/ +PCIE_ENGINE_DESCRIPTOR * +PcieInputParserGetEngineDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex, + IN UINTN Index + ) +{ + return NULL; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c new file mode 100644 index 0000000000..e6be32b071 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c @@ -0,0 +1,10 @@ +/** @file + SMN Register Access Methods + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/SmnAccessLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c new file mode 100644 index 0000000000..1dc13900c7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c @@ -0,0 +1,42 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/PcieConfigLib.h> +#include <Library/NbioCommonLibDxe.h> + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c new file mode 100644 index 0000000000..fbd3ddcf37 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c @@ -0,0 +1,23 @@ +/** @file + APCB DXE Driver + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PcdLib.h> + +EFI_STATUS +EFIAPI +AmdApcbV3DxeDriverEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c new file mode 100644 index 0000000000..23d1a8fee0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> + +/** + * @brief Amd Apcb V3 Pei Driver Entry + * + * @param[in] FileHandle File Handie + * @param[in] PeiServices Pei Services + * + * @retval EFI_SUCCESS Set APCB value successfully + * Non-EFI_SUCCESS Function Error + * + **/ +EFI_STATUS +EFIAPI +AmdApcbV3PeiDriverEntry ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c new file mode 100644 index 0000000000..74b129931b --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c @@ -0,0 +1,39 @@ +/** @file + Required OEM hooks for CCX initialization + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + Hook to store the vector that all APs should jump to out of reset to a non-volatile, + shared location. + + @param[in] ApInitAddress Address of the code that AP should jump to + @param[in,out] ContentToRestore The current value in the non-volatile storage + +**/ +VOID +SaveApInitVector ( + IN UINT32 ApInitAddress, + IN OUT UINT32 *ContentToRestore + ) +{ +} + +/** + Hook to restore the initial content of the non-volatile storage location. + + @param[in] ContentToRestore The value to restore + +**/ +VOID +RestoreContentVector ( + IN UINT32 ContentToRestore + ) +{ +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c new file mode 100644 index 0000000000..54ce202cb1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c @@ -0,0 +1,33 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Ppi/PciCfg2.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> + +/** + Module's entry function. + This routine will install EFI_PEI_PCI_CFG2_PPI. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @return Whether success to install service. +**/ +EFI_STATUS +EFIAPI +PeimInitializePciCfg ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c new file mode 100644 index 0000000000..643174d7b9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/PciSegmentInfoLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> + +/** + Return an array of PCI_SEGMENT_INFO holding the segment information. + + Note: The returned array/buffer is owned by callee. + + @param Count Return the count of segments. + + @retval A callee owned array holding the segment information. +**/ +PCI_SEGMENT_INFO * +EFIAPI +GetPciSegmentInfo ( + UINTN *Count + ) +{ + return (PCI_SEGMENT_INFO *)NULL; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c new file mode 100644 index 0000000000..d83bb6c2d8 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c @@ -0,0 +1,15 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiSmm.h> +#include <Register/Cpuid.h> +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Library/DebugLib.h> +#include <Protocol/SmmBase2.h> +#include <Library/IoLib.h> diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c new file mode 100644 index 0000000000..a264eb9294 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c @@ -0,0 +1,12 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/PcdLib.h> diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c new file mode 100644 index 0000000000..e379538e3a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c @@ -0,0 +1,36 @@ +/** @file + OEM OOB PPR DXE Driver. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <Library/DebugLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciIo.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TimerLib.h> +#include <IndustryStandard/Pci22.h> + +/** +* This function installs a protocol used by platform BIOS to provide the hotplug descriptor. +* +* @param[in] ImageHandle Image handler +* @param[in] SystemTable Pointer to the system table +* +* @retval EFI_SUCCESS The thread was successfully launched. +* +**/ +EFI_STATUS +EFIAPI +OobPprEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c new file mode 100644 index 0000000000..5242e6261a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c @@ -0,0 +1,20 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DebugLib.h> + +EFI_STATUS +EFIAPI +PspPlatformEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c new file mode 100644 index 0000000000..530bd9d4b6 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiPei.h> +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> + +EFI_STATUS +EFIAPI +HotplugDescEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c new file mode 100644 index 0000000000..fbc372586b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c @@ -0,0 +1,44 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} + +/** + Destructor for the library. free any resources. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. +**/ +EFI_STATUS +EFIAPI +ActLibraryUnregisterActCommand ( + IN EFI_HANDLE ImageHandle + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c new file mode 100644 index 0000000000..0a5f4a7e81 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c @@ -0,0 +1,36 @@ +/** @file + String token ID of help message text. + Shell supports to find help message in the resource section of an + application image if * .MAN file is not found. + This global variable is added to make build tool recognizes + that the help string is consumed by user and then build tool will + add the string into the resource section. + Thus the application can use '-?' option to show help message in Shell. + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c new file mode 100644 index 0000000000..47eb700f8f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/IoLib.h> + +/** + Performs platform specific initialization required for the CPU to access + the hardware associated with a SerialPortLib instance. This function does + not intiailzie the serial port hardware itself. Instead, it initializes + hardware devices that are required for the CPU to access the serial port + hardware. This function may be called more than once. + + @retval RETURN_SUCCESS The platform specific initialization succeeded. + @retval RETURN_DEVICE_ERROR The platform specific initialization could not be completed. + +**/ +RETURN_STATUS +EFIAPI +PlatformHookSerialPortInitialize ( + VOID + ) +{ + return RETURN_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl new file mode 100644 index 0000000000..72b9a87639 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl @@ -0,0 +1,9 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + diff --git a/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc new file mode 100644 index 0000000000..2dfb3190d4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc @@ -0,0 +1,13 @@ +; @file +; +; AMD Generic Encapsulated Software Architecture +; Code to setup temporary memory access for stack usage. This code +; is to be used on memory present systems that do not need CAR. +; +; Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +; +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +%macro AMD_ENABLE_UEFI_STACK2 2-3 + +%endmacro diff --git a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi index a731c7e369..937caee083 160000 --- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi +++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi @@ -1 +1 @@ -Subproject commit a731c7e36988c3308e1978ecde491f2f6182d490 +Subproject commit 937caee0833115f69d697ca190001ba0aa5c7368 -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119135): https://edk2.groups.io/g/devel/message/119135 Mute This Topic: https://groups.io/mt/106257082/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io @ 2024-05-23 8:31 ` Yao, Ken via groups.io 2024-05-24 4:39 ` Paul via groups.io 0 siblings, 1 reply; 16+ messages in thread From: Yao, Ken via groups.io @ 2024-05-23 8:31 UTC (permalink / raw) To: Zhai, MingXin (Duke), Chang, Abner, devel@edk2.groups.io Cc: Grimes, Paul, Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Xing, Eric [AMD Official Use Only - AMD Internal Distribution Only] [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. Reviewed-by: Ken Yao <Ken.Yao@amd.com> -----Original Message----- From: Zhai, MingXin (Duke) <duke.zhai@amd.com> Sent: Thursday, May 23, 2024 3:48 PM To: Chang, Abner <Abner.Chang@amd.com>; devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com> Subject: RE: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. -----Original Message----- From: Chang, Abner <Abner.Chang@amd.com> Sent: Thursday, May 23, 2024 12:12 PM To: devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin (Duke) <duke.zhai@amd.com> Subject: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces From: Abner Chang <abner.chang@amd.com> BZ#: 4777 Initial commit of AMD cross platform/board generic encapsulated software architecture. This provides the basic definitions and protocols for the follow-up AMD open board project. Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- .../AgesaModulePkg/AgesaCommonModulePkg.dec | 39 + Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec | 18 + .../AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec | 20 + .../AMD/AgesaModulePkg/AgesaModuleDfPkg.dec | 25 + .../AMD/AgesaModulePkg/AgesaModuleFchPkg.dec | 62 + .../AMD/AgesaModulePkg/AgesaModuleMemPkg.dec | 26 + .../AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec | 34 + .../AMD/AgesaModulePkg/AgesaModulePspPkg.dec | 29 + Platform/AMD/AgesaPkg/AgesaPkg.dec | 435 +++ Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec | 41 + .../AgesaEdk2PlatformPkg.inc.dsc | 18 + .../AgesaSp5RsModulePkg.inc.dsc | 48 + .../CbsInstanceNull/CbsInstanceNull.inc.dsc | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.inc.dsc | 11 + .../AgesaSp5RsModulePkg.dxe.inc.fdf | 11 + .../AgesaSp5RsModulePkg.pei.inc.fdf | 9 + .../CbsInstanceNull.dxe.inc.fdf | 7 + .../CbsInstanceNull.pei.inc.fdf | 7 + .../0x19/RS/External/CbsStones.dxe.inc.fdf | 8 + .../0x19/RS/External/CbsStones.pei.inc.fdf | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf | 7 + .../Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf | 10 + .../Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf | 7 + .../Library/AmdCalloutLib/AmdCalloutLib.inf | 29 + .../AmdPspMboxLibV2/AmdPspMboxLibV2.inf | 30 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.inf | 27 + .../AmdPspRomArmorLibNull.inf | 26 + .../Library/ApcbLibV3/ApcbLibV3.inf | 37 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.inf | 32 + .../BaseFabricTopologyRsLib.inf | 28 + .../CcxTscTimerLib/BaseTscTimerLib.inf | 35 + .../Library/CcxTscTimerLib/DxeTscTimerLib.inf | 42 + .../Library/CcxTscTimerLib/PeiTscTimerLib.inf | 37 + .../PciHostBridgeLib.inf | 42 + .../DxeAmlGenerationLib/AmlGenerationLib.inf | 47 + .../Library/FchBaseLib/FchBaseLib.inf | 26 + .../FchBaseResetSystemLib.inf | 35 + .../Library/FchEspiCmdLib/FchEspiCmdLib.inf | 33 + .../Library/NbioHandleLib/NbioHandleLib.inf | 24 + .../Library/PcieConfigLib/PcieConfigLib.inf | 25 + .../Library/SmnAccessLib/SmnAccessLib.inf | 33 + .../Library/CommonDxe/NbioCommonDxeLib.inf | 29 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf | 45 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf | 33 + .../OemAgesaCcxPlatformLibNull.inf | 27 + .../PciExpressPciCfg2/PciExpressPciCfg2.inf | 61 + .../PciExpressPciSegmentInfoLib.inf | 32 + .../AmdPspFlashAccSpiNorLibSmm.inf | 45 + .../PspRomArmorWhitelistLib.inf | 32 + .../Addendum/Oem/OobPprDxe/OobPprDxe.inf | 42 + .../Dxe/PspPlatformDriver/PspPlatform.inf | 32 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.inf | 29 + .../AmdAutoDynamicCommand.inf | 53 + .../AmdAutoDynamicCommand/AmdAutoToolApp.inf | 50 + .../BasePlatformHookLibAmdFchUart.inf | 33 + Platform/AMD/AgesaModulePkg/Include/AGESA.h | 158 + Platform/AMD/AgesaModulePkg/Include/AMD.h | 91 + .../Include/AmdEdk2/CpuRegisters.h | 15 + .../AgesaModulePkg/Include/AmdPspDirectory.h | 61 + .../AgesaModulePkg/Include/CpuRegistersDef.h | 156 + .../Include/FchRegistersCommon.h | 85 + .../AMD/AgesaModulePkg/Include/Filecode.h | 31 + Platform/AMD/AgesaModulePkg/Include/Gnb.h | 14 + Platform/AMD/AgesaModulePkg/Include/GnbDxio.h | 521 ++++ .../AgesaModulePkg/Include/GnbRegistersRS.h | 18 + .../Include/GnbRegistersRS/IOHC.h | 22 + .../Include/Guid/GnbPcieInfoHob.h | 31 + .../Include/Library/AmdBaseLib.h | 16 + .../Include/Library/AmdPspMboxLibV2.h | 43 + .../Include/Library/BaseFabricTopologyLib.h | 22 + .../Include/Library/FchBaseLib.h | 16 + .../Include/Library/FchEspiCmdLib.h | 413 +++ .../Include/Library/GnbPcieConfigLib.h | 16 + .../Include/Library/NbioCommonLibDxe.h | 37 + .../Include/Library/NbioHandleLib.h | 62 + .../Include/Library/PcieConfigLib.h | 283 ++ .../Include/Library/SmnAccessLib.h | 30 + .../Protocol/AmdNbioPcieServicesProtocol.h | 47 + .../Include/Protocol/AmdOemOobPprProtocol.h | 14 + .../Include/Protocol/FabricNumaServices2.h | 155 + .../Protocol/FabricTopologyServices2.h | 14 + .../AMD/AgesaModulePkg/Include/SocLogicalId.h | 23 + .../Library/DxeAmlGenerationLib/LocalAmlLib.h | 100 + .../DxeAmlGenerationLib/LocalAmlObjects.h | 150 + .../AMD/AgesaPkg/Include/AmdPcieComplex.h | 432 +++ Platform/AMD/AgesaPkg/Include/AmdSoc.h | 17 + .../Include/FabricResourceManagerCmn.h | 42 + .../AgesaPkg/Include/Guid/AmdMemoryInfoHob.h | 96 + .../Include/Library/AmdPspBaseLibV2.h | 51 + .../AgesaPkg/Include/Library/AmdPspFtpmLib.h | 83 + .../Include/Library/AmdPspRomArmorLib.h | 231 ++ .../Include/Library/AmlGenerationLib.h | 2722 +++++++++++++++++ .../Library/PlatformPspRomArmorWhitelistLib.h | 25 + .../AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h | 134 + .../Include/Protocol/AmdCxlServicesProtocol.h | 183 ++ .../Protocol/AmdPciResourcesProtocol.h | 110 + .../Include/Protocol/AmdPspFtpmProtocol.h | 187 ++ .../FabricResourceManagerServicesProtocol.h | 14 + Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h | 19 + Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h | 78 + Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h | 17 + .../AMD/AmdCpmPkg/Include/AmdCpmFunction.h | 32 + .../AmdCpmTableProtocol/AmdCpmTableProtocol.h | 39 + .../Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c | 31 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.c | 12 + .../AmdPspRomArmorLibNull.c | 79 + .../Library/ApcbLibV3/ApcbLibV3.c | 12 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.c | 14 + .../BaseFabricTopologyRsLib.c | 37 + .../Library/CcxTscTimerLib/BaseTscTimerLib.c | 8 + .../Library/CcxTscTimerLib/DxeTscTimerLib.c | 35 + .../Library/CcxTscTimerLib/PeiTscTimerLib.c | 11 + .../Library/CcxTscTimerLib/TscTimerLibShare.c | 103 + .../DxeAmdPciHostBridgeLib/PciHostBridgeLib.c | 95 + .../DxeAmlGenerationLib/AmlArgObjects.c | 154 + .../DxeAmlGenerationLib/AmlAssistFunctions.c | 151 + .../DxeAmlGenerationLib/AmlDataObjects.c | 640 ++++ .../AmlExpressionOpcodes.c | 1294 ++++++++ .../DxeAmlGenerationLib/AmlLocalObjects.c | 158 + .../DxeAmlGenerationLib/AmlNameString.c | 576 ++++ .../DxeAmlGenerationLib/AmlNamedObject.c | 2138 +++++++++++++ .../AmlNamespaceModifierObjects.c | 360 +++ .../DxeAmlGenerationLib/AmlObjectsDebug.c | 144 + .../DxeAmlGenerationLib/AmlPkgLength.c | 267 ++ .../AmlResourceDescriptor.c | 1989 ++++++++++++ .../DxeAmlGenerationLib/AmlStatementOpcodes.c | 515 ++++ .../Library/DxeAmlGenerationLib/AmlTable.c | 213 ++ .../DxeAmlGenerationLib/LocalAmlObjects.c | 364 +++ .../Library/FchBaseLib/FchStallLib.c | 13 + .../FchBaseResetSystemLib.c | 90 + .../Library/FchEspiCmdLib/FchEspiCmdLib.c | 87 + .../Library/NbioHandleLib/NbioHandleLib.c | 68 + .../Library/PcieConfigLib/PcieConfigLib.c | 276 ++ .../PcieConfigLib/PcieInputParserLib.c | 117 + .../Library/SmnAccessLib/SmnAccessLib.c | 10 + .../Nbio/Library/CommonDxe/DxeLibFunctions.c | 42 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c | 23 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c | 29 + .../OemAgesaCcxPlatformLibNull.c | 39 + .../PciExpressPciCfg2/PciExpressPciCfg2.c | 33 + .../PciSegmentInfoLib.c | 30 + .../AmdPspFlashAccSpiNorLibSmm.c | 15 + .../PspRomArmorWhitelistLib.c | 12 + .../Addendum/Oem/OobPprDxe/OobPprDxe.c | 36 + .../Dxe/PspPlatformDriver/PspPlatformDriver.c | 20 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.c | 22 + .../AmdAutoDynamicCommand.c | 44 + .../AmdAutoDynamicCommand/AmdAutoToolApp.c | 36 + .../BasePlatformHookLibAmdFchUart.c | 29 + .../FchSongshanDxe/FchSongshanI2C_I3C.asl | 9 + .../AMD/AgesaPkg/Include/AmdUefiStackNasm.inc | 13 + .../Library/RiscVOpensbiLib/opensbi | 2 +- 152 files changed, 19669 insertions(+), 1 deletion(-) create mode 100644 Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec create mode 100644 Platform/AMD/AgesaPkg/AgesaPkg.dec create mode 100755 Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf create mode 100755 Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf create mode 100755 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf create mode 100644 Platform/AMD/AgesaModulePkg/Include/AGESA.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AMD.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Filecode.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Gnb.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbDxio.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h create mode 100755 Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h create mode 100644 Platform/AMD/AgesaPkg/Include/AmdSoc.h create mode 100644 Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h create mode 100644 Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h create mode 100644 Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c create mode 100644 Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl create mode 100644 Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc diff --git a/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec new file mode 100644 index 0000000000..d35a1f27b4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec @@ -0,0 +1,39 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Common Module Package DEC +# file. +# This file provides the minimum AMD SoC/Mircoporcessor definitions for building +# AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCommonPkg + PACKAGE_GUID = 6CBE6566-0D3F-4E35-8358-9602354E9F09 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = {0x7788adf0, 0x9788, 0x4a3f, {0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd}} + gAgesaConfigDbPointerVariableGuid = {0x21229d24, 0xc71d, 0x4bc0, {0xb6, 0x3e, 0x67, 0x2f, 0x6d, 0xbf, 0x5f, 0xf7}} + gAmdMemoryInfoHobGuid = {0x1bce3d14, 0xa5fe, 0x4a0b, {0x9a, 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}} + +[Protocols] + ## Soc Protocols + gAmdSocLogicalIdProtocolGuid = {0x72f8e409, 0x0d2a, 0x4b91, {0x88, 0x6f, 0xba, 0x13, 0x44, 0x9f, 0xd7, 0x78}} + gAmdOemOobPprDxeProtocolGuid = {0x78031be3, 0x54a2, 0x4819, {0xb5, 0xba, 0x32, 0x79, 0x04, 0xf3, 0xa8, 0x41}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxSocketSupportedV2|2|UINT8|0x00002002 # 2 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDiePerSocketV2|1|UINT8|0x00002003 # 1 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxChannelPerDieV2|8|UINT8|0x00002004 # 8 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDimmPerChannelV2|2|UINT8|0x00002005 # 2 by default + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdS3LibTableSize|0x4000|UINT64|0x00027003 + diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec new file mode 100644 index 0000000000..1637068432 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec @@ -0,0 +1,18 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaEdk2Pkg + PACKAGE_GUID = E866104F-D458-41B1-AB26-FA5951618A8C + PACKAGE_VERSION = 0.1 + +[Includes] + Include/AmdEdk2 + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec new file mode 100755 index 0000000000..b84fe5b738 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec @@ -0,0 +1,20 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Core Complex package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCcxPkg + PACKAGE_GUID = df325429-029e-40f0-82db-0e69be7f6560 + PACKAGE_VERSION = 0.1 + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdCcxSingleBitErrLogging|FALSE|BOOLEAN|0x000CC029 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec new file mode 100755 index 0000000000..57db15e663 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec @@ -0,0 +1,25 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Data Fabric package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaDfPkg + PACKAGE_GUID = 81e51ee3-c347-4563-92fe-790ba953bf0f + PACKAGE_VERSION = 0.1 + +[Guids] + gAmdTotalNumberOfRootBridgesGuid = {0xfb5703f5, 0xf8a7, 0xf401, {0x18, 0xb4, 0x3f, 0x10, 0x8d, 0xeb, 0x26, 0x12}} + gAmdResourceSizeForEachRbGuid = {0x542b8f2f, 0xbd52, 0x4233, {0x8c, 0x3d, 0x66, 0x53, 0x0d, 0xe8, 0xa3, 0x69}} + +[Protocols] + gAmdFabricNumaServices2ProtocolGuid = {0xa8ff2e64, 0xf319, 0x4af1, {0x9e, 0xc8, 0x18, 0x89, 0x89, 0xc3, 0x1e, 0x4a}} + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec new file mode 100644 index 0000000000..521957e809 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec @@ -0,0 +1,62 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Fusion Control Hub package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 1.5 + PACKAGE_NAME = AgesaFchPkg + PACKAGE_GUID = e47c8ed9-3000-4e6e-b1c6-875b365b3849 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = { 0x7788adf0, 0x9788, 0x4a3f, { 0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd } } + +[Protocols] + gFchInitDonePolicyProtocolGuid = { 0xc63c0c73, 0xf612, 0x4c02, { 0x84, 0xa3, 0xc6, 0x40, 0xad, 0x0b, 0xa6, 0x22 } } + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLegacyFree|FALSE|BOOLEAN|0x0003F001 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetEnable|TRUE|BOOLEAN|0x0003F002 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetMsiDis|TRUE|BOOLEAN|0x0003F003 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdResetMode|0x00|UINT8|0x0003F00D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdNoneSioKbcSupport|FALSE|BOOLEAN|0x0003F021 + + ### @brief This item allows the customer to change OC signal polarity to be active low. This is universal and applies to all OC pins. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE)At present, this control applies to Family17h Model 00h-2Fh. + ### @li TRUE - OC pin is low when OC occurs. + ### @li FALSE - OC pin is high when OC occurs. + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciOcPolarityCfgLow|FALSE|BOOLEAN|0x0003F309 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb20OcPinSelect|0xFFFFFFFFFFFFFFFF|UINT64|0x0003F340 + #Die 0 + #[7:0] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 2.0 ports on XHCI controller 1 + #[23:0] MTS -- 6 USB 2.0 ports on XHCI controller 0 + #Die 1 + #[39:32] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[47:40] SSP -- 2 USB 2.0 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb31OcPinSelect|0xFFFFFFFF|UINT32|0x0003F341 + #Die 0 + #[7:0] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 3.1 ports on XHCI controller 1 + #[15:0] MTS -- 4 USB 3.1 ports on XHCI controller 0 + #Die 1 + #[23:16] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[31:24] SSP -- 2 USB 3.1 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLpcEnable|TRUE|BOOLEAN|0x0003F400 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdUsbRSOemConfigurationTable|{0x0}|VOID*|0x0003F40A + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciSsid|0x00000000|UINT32|0x0003FF07 + gEfiAmdAgesaModulePkgTokenSpaceGuid.FchRTDeviceEnableMap|0x00000000|UINT32|0x0003FF81 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec new file mode 100644 index 0000000000..721d3ea73b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec @@ -0,0 +1,26 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Memory package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaMemPkg + PACKAGE_GUID = 445f7303-3171-428c-ad0b-32df4474a7ad + PACKAGE_VERSION = 0.1 + +[Includes] + Include/ + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries|64|UINT32|0x00029001 + + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec new file mode 100755 index 0000000000..0501774c9b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec @@ -0,0 +1,34 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD North Bridge I/O package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaNbioPkg + PACKAGE_GUID = 1486f0fe-39ee-4856-a39f-222ff2404f26 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Protocols] + gAmdNbioPcieServicesProtocolGuid = {0x756db75c, 0xbb9d, 0x4289, {0x81, 0x3a, 0xdf, 0x21, 0x5, 0xc4, 0xf8, 0xe}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIommuMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021100 #///< 1: Enable Iommu MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021101 #///< 1: Enable Ioapic MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdPreDefineEn|FALSE|BOOLEAN|0x00021102 #///< TRUE: Enable assign IOAPIC ID at PEI phase + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdBase|0xF1|UINT8|0x00021103 #///< Base NBIO IOAPIC ID. ID assigned start from this value + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgGnbIoapicId|0|UINT8|0x0004101D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgFchIoapicId|0|UINT8|0x0004101E + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdSmuFeatureControlDefinesExt|0x0|UINT32|0x00041200 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec new file mode 100644 index 0000000000..41cf320c76 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec @@ -0,0 +1,29 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Platform Security Processor package definitions +# for building AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPspPkg + PACKAGE_GUID = 5c48f900-a98c-431f-8be5-19c09c65bb05 + PACKAGE_VERSION = 0.1 + +[Guids] + gApSyncFlagNvVariableGuid = { 0xad3f6761, 0xf0a3, 0x46c8, { 0xa4, 0xcb, 0x19, 0xb7, 0x0f, 0xfd, 0xb3, 0x05 } } + gAmdPspApobHobGuid = { 0x30b174f3, 0x7712, 0x4cca, { 0xbd, 0x13, 0xd0, 0xb8, 0xa8, 0x80, 0x19, 0x97 } } + +[Protocols] + gPspFlashAccSmmCommReadyProtocolGuid = { 0x9f373486, 0xda76, 0x4c9f, { 0x81, 0x55, 0x6c, 0xcd, 0xdb, 0x0b, 0x0b, 0x04 } } + gAmdPspFtpmProtocolGuid = { 0xac234e04, 0xb036, 0x476c, { 0x91, 0x66, 0xbe, 0x47, 0x52, 0xa0, 0x95, 0x09 } } + +[Ppis] + gAmdPspFtpmPpiGuid = { 0x91774185, 0xf72d, 0x467e, { 0x93, 0x39, 0xe0, 0x08, 0xdb, 0xae, 0x0e, 0x14 } } + gAmdPspFtpmFactoryResetPpiGuid = { 0x9c98130a, 0x8921, 0x45eb, { 0x86, 0xf3, 0x16, 0x04, 0x35, 0xc7, 0xc6, 0x40 } } diff --git a/Platform/AMD/AgesaPkg/AgesaPkg.dec b/Platform/AMD/AgesaPkg/AgesaPkg.dec new file mode 100644 index 0000000000..9377c64cc3 --- /dev/null +++ b/Platform/AMD/AgesaPkg/AgesaPkg.dec @@ -0,0 +1,435 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Package DEC +# file. +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPkg + PACKAGE_GUID = DABFEFC6-5A79-444b-862A-1F6FE9F561FE + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaPkgTokenSpaceGuid = { 0xd4d8435f, 0xfffb, 0x4acb, { 0xa0, 0x4d, 0xff, 0x0f, 0xad, 0x67, 0x7f, 0xe9 } } + +[Protocols] + gAmdNbioCxlServicesProtocolGuid = {0x125CCFCE, 0x34AF, 0x422C, {0xB3, 0xB3, 0x71, 0x23, 0xA3, 0x1E, 0xC8, 0x61}} + gAmdPciResourceProtocolGuid = {0x663d4897, 0xed94, 0x4f0f, {0x86, 0x64, 0xfe, 0xdc, 0x70, 0x30, 0x7f, 0x19}} + gAmdCapsuleSmmHookProtocolGuid = {0x4fc43bbe, 0x1433, 0x4951, {0xac, 0x2d, 0x0d, 0x01, 0xfe, 0xc0, 0x0e, 0xb1}} + gAmdFspSetupTableInitDoneGuid = {0xef5394c6, 0x566d, 0x440f, {0x9d, 0x05, 0xc0, 0xa3, 0x2c, 0xb9, 0x33, 0x58}} + +[Ppis] + gAmdMemoryInfoHobPpiGuid = {0xba16e587, 0x1d66, 0x41b7, {0x9b, 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}} + gCapsuleUpdateDetectedPpiGuid = {0x745dfc73, 0xc401, 0x4ced, {0x8d, 0x3b, 0x1a, 0x82, 0xf3, 0xda, 0xdc, 0xf8}} + +[PcdsFixedAtBuild] + + ### @brief Enable EDK-II Protocols + ### @details This item enables support for EDKII implementation of ACPI Protocols when set to TRUE + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCompliantEdkIIAcpiSdtProtocol|TRUE|BOOLEAN|0x00020006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize |0x1000|UINT32|0x00020007 + + ### @brief assign non volatile storage base address + ### @details This assigns the base address to map to flash deivce. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress|0xFF000000|UINT32|0x00020017 + +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH.h" +#---------------------------------------------------------------------------- + + ### @name General FCH Controls + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1 register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0400) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1EvtBlkAddr|0x400|UINT16|0x0002F004 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1Cnt register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0404) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1CntBlkAddr|0x404|UINT16|0x0002F005 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM Timer as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0408) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPmTmrBlkAddr|0x408|UINT16|0x0002F006 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI CPU Control block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0410) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgCpuControlBlkAddr|0x410|UINT16|0x0002F007 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI GPE0 register block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0420) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiGpe0BlkAddr|0x420|UINT16|0x0002F008 + + ### @brief This item defines the SMI command value sent by the host BIOS during the S3 resume sequence, to re-initialize the + ### FCH registers. This must be issued before the platform driver restore function is started. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD3) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemBeforePciRestoreSwSmi|0xD3|UINT8|0x0002F010 + + ### @brief This item defines the SMI command used by the host BIOS to signal the FCH driver that the platform driver has + ### completed its restore function. This allows the FCH driver to perform some final FCH settings. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD4) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemAfterPciRestoreSwSmi|0xD4|UINT8|0x0002F011 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to activate ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemEnableAcpiSwSmi|0xA0|UINT8|0x0002F012 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to turn off ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA1) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemDisableAcpiSwSmi|0xA1|UINT8|0x0002F013 + + ### @brief SMI command used for releasing the SPI controller lock mode. All devices on the SPI bus will be writable. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAA) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiUnlockSwSmi|0xAA|UINT8|0x0002F014 + + ### @brief SMI command for setting the lock mode in the SPI controller. This will effectively provide a write protection to the + ### SPI Flash ROM; however, write access to secondary SPI devices will also be blocked. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAB) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiLockSwSmi|0xAB|UINT8|0x0002F015 +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH-IRQ.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart0Irq|0x03|UINT8|0x0002F01A + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart1Irq|0x0E|UINT8|0x0002F01B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart2Irq|0x05|UINT8|0x0002F01C + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart3Irq|0x0F|UINT8|0x0002F01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart4Irq|0x10|UINT8|0x0002F01E + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c0Irq|0x0A|UINT8|0x0002F01F + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c1Irq|0x0B|UINT8|0x0002F020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c2Irq|0x04|UINT8|0x0002F021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c3Irq|0x06|UINT8|0x0002F022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c4Irq|0x16|UINT8|0x0002F023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c5Irq|0x17|UINT8|0x0002F024 +#- DF Fixed PCDs +#- +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + #Fabric + + ### @name General DF Controls + + ### @brief This item informs the SMBios generation code as to how many physical processor sockets exist in the system and + ### therefore how many Type 4 SMBios records to produce. + ### @brief Permitted Choices: (Type: Value)(Default: 0x01) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdNumberOfPhysicalSocket|1|UINT8|0x000CC103 +#---------------------------------------------------------------------------- +#- CCX Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-MTRR.h" +#---------------------------------------------------------------------------- + + + ### @brief The base address of temporary page table for accessing PCIE MMIO base address above 4G in PEI phase. + ### @brief Permitted Choices: 0x0 - 0xFFFFFFFF (Type: Value)(Default: 0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPeiTempPageTableBaseAddress|0|UINT32|0x000CC11B + +#---------------------------------------------------------------------------- +#- CCX ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-ACPI.h" +#---------------------------------------------------------------------------- + #ACPI + # Cpu SSDT + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName0|0x43|UINT8|0x000AC001 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName1|0x30|UINT8|0x000AC002 + ### @brief This element specifies whether the ACPI _PSS objects are defined in the system bus or processor scope. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li TRUE - The objects will be under the \_SB scope. + ### @li FALSE - The objects will be under the \_PR scope + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeInSb|FALSE|BOOLEAN|0x000AC003 + + ### @brief Set the OEM ID field in ACPI table outputs to this string. The string must conform to the ACPI rules for the OEM ID field. + ### @brief Permitted Choices: (Type: Value)(Default: "AMD") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiTableHeaderOemId|"AMD"|VOID*|0x000AC004 + +#---------------------------------------------------------------------------- +#- CCX SMBIOS Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-SMBIOS.h" +#---------------------------------------------------------------------------- + + ### @name CCX SMBIOS Controls + + ### @brief When creating the SMBios table entry, use this as the label for the processor socket. This should match the + ### silkscreen label on the motherboard. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket0|"Unknown"|VOID*|0x00001001 + + ### @brief When creating the SMBios table entry, use this as the value for the 'serial number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket0|"Unknown"|VOID*|0x00001002 + + + ### @brief When creating the SMBios table entry, use this as the value for the 'Asset Tag' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket0|"Unknown"|VOID*|0x00001003 + + ### @brief When creating the SMBios table entry, use this as the value for the 'Part Number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket0|"Unknown"|VOID*|0x00001004 + + ### @brief SMBios socket 1 Label. + ### @details When creating the SMBios table entry, use this as the label for the + ### processor socket. This should match the silkscreen label on the motherboard. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket1|"Unknown"|VOID*|0x00001005 + + ### @brief SMBIOS socket 1 Serial Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'serial number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket1|"Unknown"|VOID*|0x00001006 + + ### @brief SMBios socket 1 Asset Tag. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Asset Tag' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket1|"Unknown"|VOID*|0x00001007 + + ### @brief Socket 1 Part Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Part Number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket1|"Unknown"|VOID*|0x00001008 + +#---------------------------------------------------------------------------- +#- ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-ACPI.h" +#---------------------------------------------------------------------------- + + ### @name General ACPI Controls + + ### @brief PCD supporting maximum capacity for Type 16 table + ### @details This PCD represents maximum memory capacity in KB + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT16MaximumCapacity|0x04000000|UINT32|0x00001009 # 4G - 0x00400000 + # 8G - 0x00800000 + # 16G - 0x01000000 + # 32G - 0x02000000 + # 64G - 0x04000000 + # 128G - 0x08000000 + # 256G - 0x10000000 + # 512G - 0x20000000 +[PcdsDynamic] +#---------------------------------------------------------------------------- +# System level Dynamic PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCStateIoBaseAddress|0x413|UINT16|0x000CC002 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdt|TRUE|BOOLEAN|0x000CC00B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdApicMode|0xFF|UINT8|0x000CC01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCpuWdtEn|TRUE|BOOLEAN|0x000CC200 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerInSb|FALSE|BOOLEAN|0x000CC50B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerName|"PLTF"|VOID*|0x000CC50C + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCcxCfgPFEHEnable|FALSE|BOOLEAN|0x000CC601 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT4CpuMaxSpeed|0|UINT16|0x000CC900 +#---------------------------------------------------------------------------- +#- DF Dynamic PCDs +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + + ### @cond (FF3||RN||BA||ZP||RMB||RPL||RS||SSP||MI3||BRH) + ### @brief Specifies the top address to be used for MMIO space allocations. No MMIO space will be used above this limit. Some devices have limits on the address space they + ### are able to access. For example a device with a 40-bit address limitation can not use MMIO space above 1TeraByte (1T). By setting this PCD to 0x10000000000 (1T), MMIO + ### space would not be allocated above 1T. The default is to use all of the space above the end of physical memory. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMmioAbove4GLimit|0xFFFFFFFFFFFFFFFF|UINT64|0x0003FFC2 + ### @endcond + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFabricResourceDefaultSizePtr|0|UINT64|0x00DF0000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgSmiCmdPortAddr|0xB0|UINT16|0x0003FFC0 + + ### I2C-0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c0SdaHold|0x00000035|UINT32|0x000FC000 + ### I2C-1 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c1SdaHold|0x00000035|UINT32|0x000FC001 + ### I2C-2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c2SdaHold|0x00000035|UINT32|0x000FC002 + ### I2C-3 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c3SdaHold|0x00000035|UINT32|0x000FC003 + ### I2C-4 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c4SdaHold|0x00000035|UINT32|0x000FC004 + ### I2C-5 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c5SdaHold|0x00000035|UINT32|0x000FC005 + ### @} end of I2C hold times + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-UART.h" +#---------------------------------------------------------------------------- + ### @name UART Legacy IO Assignments + ### @{ + ### @brief These controls allow the platform to specify the legacy IO ranges that are to be used by the UART ports in the processor. Permitted Choices: (Type: value)(Default: Disabled) + ### @li 0 - Disabled + ### @li 1 - IO range 0x02E8 - 0x02EF + ### @li 2 - IO range 0x02F8 - 0x02FF + ### @li 3 - IO range 0x03E8 - 0x03EF + ### @li 4 - IO range 0x03F8 - 0x03FF + + + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart0LegacyEnable|0x00|UINT8|0x000FC010 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart1LegacyEnable|0x00|UINT8|0x000FC011 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart2LegacyEnable|0x00|UINT8|0x000FC012 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart3LegacyEnable|0x00|UINT8|0x000FC013 + ### @} end UART Legacy IO assignments + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-USB.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci0Enable|TRUE|BOOLEAN|0x000FC020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci1Enable|TRUE|BOOLEAN|0x000FC021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci2Enable|TRUE|BOOLEAN|0x000FC022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci3Enable|TRUE|BOOLEAN|0x000FC023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhciECCDedErrRptEn|FALSE|BOOLEAN|0x000FC024 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataEnable|TRUE|BOOLEAN|0x000FC030 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataStaggeredSpinup|FALSE|BOOLEAN|0x000FC039 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdNvdimmEnable|FALSE|BOOLEAN|0x000A6024 + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO-BMC.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkTraining|FALSE|BOOLEAN|0x0004F004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkSocket|0xFF|UINT8|0x0004F005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkDie|0xFF|UINT8|0x0004F006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkLaneNum|0|UINT8|0x0004F03E + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgIommuSupport|TRUE|BOOLEAN|0x0004F027 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdIvInfoDmaReMap|FALSE|BOOLEAN|0x0004F028 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrVddfull_Scale_Current|0x00|UINT32|0x0004F0A0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrSocfull_Scale_Current|0x00|UINT32|0x0004F0A2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityLo|0x4|UINT32|0x0004F210 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityHi|0x30011|UINT32|0x0004F211 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlProtocolErrorReporting|0|UINT8|0x0004F362 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlComponentErrorReporting|0|UINT8|0x0004F363 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs DYNAMIC + + ### @brief This feature selects the APCB recovery support on x86 side. If or when an instance of a writable APCB is determined to be invalid, the PSP driver will + ### attempt a 'recovery' by copying the recovery instance of the APCB (default values as indicated in the APCB descriptor files). Upon boot up, the ABL reads CMOS + ### bytes 06/07 at index/data port of 0x72/0x73. If the CMOS flag reads anything else other than 0xA55A or 0x5555, the system boots in APCB recovery mode, in which + ### ABL consumes the recovery instances of APCB. Otherwise it boots in normal/non-recovery mode. + ### @brief Permitted Choices: (Type: Boolean)(Default: TRUE) + ### @brief This feature is affected by the platform CMOS power design. Please see Platform CMOS power . + ### @li TRUE - the AGESA PSP driver restores the APCB instances from the recovery instance, writes 0xA55A to the CMOS location and triggers a reset . The next time + ### the system powers up, ABL runs in normal/non-recovery mode. + ### @li FALSE - the AGESA PSP driver writes 0x5555 to the CMOS location without restoring the APCB instances or triggering a reset. In this mode the additional reset + ### is avoided at the potential risk of the writeable APCB instance being left corrupted forever. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspApcbRecoveryEnable|TRUE|BOOLEAN|0x95940008 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspAntiRollbackLateSplFuse|FALSE|BOOLEAN|0x95940018 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemPostPackageRepair|TRUE|BOOLEAN|0x00030004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemBootTimePostPackageRepair|TRUE|BOOLEAN|0x00030005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemRuntimePostPackageRepair|FALSE|BOOLEAN|0x00030006 +[PcdsDynamicEx] + +[PcdsFixedAtBuild, PcdsDynamic] +#---------------------------------------------------------------------------- +#- System control PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + ### @brief Switch for Debug Print function + ### @details Switch for Debug Print function to enable or not. + ### @li TRUE: Enable IdsDebugPrint output + ### @li FALSE: Disable IdsDebugPrint output + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEnable|FALSE|BOOLEAN|0x00020004 + ### @brief Specify the filter for IdsDebugPrint + ### @details When the filter values are matched, the AmdIdsDebugPrint can start to print debug message. + ### Refer Library/IdsLib.h for details, and the Master token is PcdAmdIdsDebugPrintEnable. + ### @li 0x100401008A30042C: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | MEM_STATUS | MEM_PMU | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + ### @li 0x100401008A300408: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintFilter|0x100401030A300408|UINT64|0x00020005 + ### @brief Switch for Serial port support of AGESA debug print + ### @details Switch for Serial port support of AGESA debug print, NOTE, AGESA will not init the serial port, + ### serial port should be initialized before call AGESA debug print. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortEnable|FALSE|BOOLEAN|0x00020009 + ### @brief The serial port used for debug output can be either 2-wire (Rx/Tx) or 4-wire (adding DSR/CTS). Waiting for CTS on a + ### 2-wire port would cause a hang. This control is added to check the cable connection. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li FALSE - Presume a 2-wire port and do not wait for CTS. + ### @li TRUE - Wait for both DSR and CTS to be set. DSR is set if a cable is connected. CTS is set if it is ok to transmit data. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortDetectCableConnection|FALSE|BOOLEAN|0x0002000A + + ### @brief Selection of UART and UART Legacy IO Serial port for AGESA debug print + ### @details Selection of UART and UART Legacy IO Serial port for AGESA debug print and invisible in ACPI name space. + ### @li Bit[0]: Select UART0 for AGESA debug print + ### @li Bit[1]: Select UART1 for AGESA debug print + ### @li Bit[2]: Select UART2 for AGESA debug print + ### @li Bit[3]: Select UART3 for AGESA debug print + ### @li Bit[4]: Select UART4 for AGESA debug print + ### @li Bit[8]: Select UART0 Legacy IO for AGESA debug print + ### @li Bit[9]: Select UART1 Legacy IO for AGESA debug print + ### @li Bit[10]: Select UART2 Legacy IO for AGESA debug print + ### @li Bit[11]: Select UART3 Legacy IO for AGESA debug print + ### @li Bit[15]: Set debug print serial port to invisible in ACPI name space at OS runtime + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortSelect|0x0000|UINT16|0x0002718A + + ### @brief Specify the IO port for serial out + ### @details ESPI or LPC COM1: 0x3F8, COM2: 0x2F8, COM3: 0x3E8, COM4: 0x2E8, + ### UART0: 0xFEDC9000, UART1: 0xFEDCA000, UART2: 0xFEDCE000, UART3: 0xFEDCF000, UART4: 0xFEDD1000. + ### @li If it's IO port: it must < 0x10000 + ### @li If it's Memory: it must >= 0x10000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPort|0x3F8|UINT64|0x0002000B + + ### @brief Debug Print Emulation Auto Detect + ### @details Auto detect emulation platform to instead of PcdAmdIdsDebugPrintRedirectIOEnable and + ### PcdAmdIdsDebugPrintSerialPortEnable. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEmulationAutoDetect|FALSE|BOOLEAN|0x00020016 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgPlatformPPT|0|UINT32|0x0004F111 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs + + ### @brief Rom Armor selection + ### @details Rom Armor selection + ### @li 0: Rom Armor is disabled + ### @li 1: Rom Armor 1 is enabled (VMR/MTS/CPK) + ### @li 2: Rom Armor 2 is enabled (RN/CZN) + ### @li 3: Rom Armor 3 is enabled (CGL, RMB and later) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspRomArmorSelection|0|UINT8|0x95940054 + + + + ### @brief System TPM config Value + ### @details System TPM config Value, SBIOS needs to set the value in PEI phase. + ### @li 0x0: dTPM + ### @li 0x1: PSP fTPM + ### @li 0x2: HSP fTPM + ### @li 0xFF: no TPM + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmConfig|0xFF|UINT8|0x95940024 + + ### @cond !BRH + ### @brief TPM SMx algorithm flag + ### @details TPM SMx algorithm flag, SBIOS needs to set the value in PEI phase. + ### @li 0: SM2, SM3 or SM4 crypto algorithms not supported + ### @li 1: SM2, SM3 or SM4 crypto algorithms supported + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmAlgSmx|0|UINT8|0x95940025 + ### @endcond diff --git a/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec new file mode 100755 index 0000000000..c8c474637f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec @@ -0,0 +1,41 @@ +## @file +# AMD Common Platform Module (CPM) Module Package DEC. +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = CpmPkg + PACKAGE_GUID = ABE128BA-1061-4A53-A1B8-D07329AA7A67 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + Library + +[Guids] + gAmdCpmPkgTokenSpaceGuid = {0x916e0ddd, 0x2bd2, 0x4704, {0x93, 0xb9, 0x59, 0x4b, 0x01, 0xa5, 0xfa, 0x9f}} + gShellActHiiGuid = {0x340EBE97, 0x3C1C, 0x4272, {0x9C, 0xCE, 0xC1, 0xFF, 0x86, 0x6F, 0x73, 0x3C}} + gAmdPbsSystemConfigurationGuid = {0xa339d746, 0xf678, 0x49b3, {0x9f, 0xc7, 0x54, 0xce, 0x0f, 0x9d, 0xf2, 0x26}} + +[Protocols] + gAmdCpmTableProtocolGuid = { 0x3724cf01, 0x00c2, 0x9762, {0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 }} + gAmdCpmAllPciIoProtocolsInstalledProtocolGuid = { 0x676D7012, 0x139B, 0x485A, {0x96, 0xF1, 0x98, 0x6F, 0xC4, 0x8A, 0x86, 0x4B }} + +[Ppis] + gAmdCpmTablePpiGuid = { 0xd71cf893, 0xa8b5, 0x49d3, { 0xa2, 0x1b, 0x31, 0xe2, 0xf5, 0xc4, 0xa7, 0x47 } } + +[PcdsFixedAtBuild] + gAmdCpmPkgTokenSpaceGuid.PcdFchUartPort|2|UINT8|0x00000052 + + #ACPI + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiHestTableHeaderOemTableId|"AMD HEST"|VOID*|0x000AC001 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiBertTableHeaderOemTableId|"AMD BERT"|VOID*|0x000AC002 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiEinjTableHeaderOemTableId|"AMD EINJ"|VOID*|0x000AC003 + + gAmdCpmPkgTokenSpaceGuid.UsePciXAslName|FALSE|BOOLEAN|0x12000003 + gAmdCpmPkgTokenSpaceGuid.AcpiRestoreSwSmi|0xE3|UINT8|0x00000040 diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc new file mode 100644 index 0000000000..37b8d15cb1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc @@ -0,0 +1,18 @@ +## @file +# +# The DSC include file for edk2 package to pull in the necessary AGESA modules +# into build process. +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses] + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc new file mode 100644 index 0000000000..e7e05fd2d8 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc @@ -0,0 +1,48 @@ +## @file +# The AGESA DSC file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses.Common.PEIM] + + ## APCB + ApcbLibV3Pei|AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf + +[LibraryClasses.Common.DXE_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses.Common.DXE_SMM_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses] + # + # Agesa specific common libraries + # + + ## PSP Libs + AmdPspMboxLibV2|AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf + + ## DF Lib + BaseFabricTopologyLib|AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + SmnAccessLib|AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Fch Lib + FchBaseLib|AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf + +[Components.IA32] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf + +[Components.X64] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc new file mode 100644 index 0000000000..1f1e04c414 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc new file mode 100644 index 0000000000..2916fecb26 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc @@ -0,0 +1,11 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEFINE AGESA_PKG_PATH = AgesaModulePkg + DEFINE AGESA_PKG_DEC = AgesaCommonModulePkg diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf new file mode 100644 index 0000000000..9303d1fac4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf @@ -0,0 +1,11 @@ +## @file +# The AGESA DXE FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +## APCB V3 Dxe Drivers + INF AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf new file mode 100644 index 0000000000..0ef5a2a806 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf @@ -0,0 +1,9 @@ +## @file +# The AGESA PEI FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf new file mode 100644 index 0000000000..b790e4ead5 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf @@ -0,0 +1,10 @@ +## @file +# +# Platform Package Flash Description File +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf new file mode 100755 index 0000000000..8d3357bf56 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdCalloutLib + FILE_GUID = A8FEA621-B381-4c06-9E9D-0897EF78BD78 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdCalloutLib + + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf new file mode 100644 index 0000000000..1594a99265 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf @@ -0,0 +1,30 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspMboxLibV2 + FILE_GUID = B9E57A31-CAB0-4CEE-9D50-9D43E2EEAA44 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspMboxLibV2 + +[Sources.common] + AmdPspMboxLibV2.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PciLib + SmnAccessLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf new file mode 100644 index 0000000000..c685a26604 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLib + FILE_GUID = 55871F80-4658-6EF3-A8AC-15B34FF8C2CE + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLib + +[Sources.common] + AmdPspRomArmorLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf new file mode 100644 index 0000000000..a3906dc13e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLibNull + FILE_GUID = 7351EAC0-4587-FED8-2788-BF9DA2ADCA6E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLibNull + +[Sources.common] + AmdPspRomArmorLibNull.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf new file mode 100644 index 0000000000..09d5bd38ac --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf @@ -0,0 +1,37 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3 + FILE_GUID = C7932467-DF16-4C7A-A32A-3E6F50213E68 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3 | DXE_DRIVER DXE_SMM_DRIVER DXE_RUNTIME_DRIVER DXE_CORE SMM_CORE UEFI_DRIVER + +[Sources.common] + ApcbLibV3.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSmmReadyToLockProtocolGuid + +[Pcd] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf new file mode 100644 index 0000000000..c031d00d79 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3Pei + FILE_GUID = EEA4E007-E408-4daa-82BD-4C52E7058753 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3Pei|PEIM + +[Sources.common] + ApcbLibV3Pei.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PcdLib + BaseMemoryLib + PeiServicesLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf new file mode 100644 index 0000000000..38a72e26b7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf @@ -0,0 +1,28 @@ +## @file +# +# For EDKII use Only +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseFabricTopologyRsLib + FILE_GUID = D0A070DD-630A-43F8-9D76-EAAABDDE5FB9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseFabricTopologyLib + CONSTRUCTOR = BaseFabricTopologyLibConstructor + +[Sources] + BaseFabricTopologyRsLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + +[LibraryClasses] + BaseLib diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf new file mode 100644 index 0000000000..d15d8169fe --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf @@ -0,0 +1,35 @@ +## @file +# Base Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseTscTimerLib + FILE_GUID = D29338B9-50FE-4e4f-B7D4-A150A2C1F4FB + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + BaseTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf new file mode 100644 index 0000000000..1e52768a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf @@ -0,0 +1,42 @@ +## @file +# Dxe Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeTscTimerLib + FILE_GUID = 95ab030f-b4fd-4ee4-92a5-9e04e87634d9 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE + + CONSTRUCTOR = DxeTscTimerLibConstructor + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + DxeTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + PcdLib + BaseLib + UefiLib + DebugLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf new file mode 100644 index 0000000000..b1eaefd282 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf @@ -0,0 +1,37 @@ +## @file +# Pei Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiTscTimerLib + FILE_GUID = 342C36C0-15DF-43b4-9EC9-FBF748BFB3D1 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|PEIM PEI_CORE + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + PeiTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + HobLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf new file mode 100644 index 0000000000..f60f97905a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf @@ -0,0 +1,42 @@ +## @file +# Library instance of PciHostBridgeLib library class for coreboot. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciHostBridgeLib + FILE_GUID = 74967FD7-A9A4-4B16-8B41-B26BC3230D0A + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciHostBridgeLib + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + PciHostBridgeLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseMemoryLib + PciHostBridgeLib + DevicePathLib + MemoryAllocationLib + DebugLib + UefiBootServicesTableLib diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf new file mode 100644 index 0000000000..2a72fa8117 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf @@ -0,0 +1,47 @@ +## @file +# +# Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmlGenerationLib + FILE_GUID = 8F62C8D1-B67F-4AFB-9179-54384F1A6163 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmlGenerationLib | DXE_DRIVER UEFI_DRIVER HOST_APPLICATION + +[Sources.common] + LocalAmlObjects.h + LocalAmlObjects.c + LocalAmlLib.h + AmlAssistFunctions.c + AmlObjectsDebug.c + AmlNameString.c + AmlDataObjects.c + AmlNamespaceModifierObjects.c + AmlPkgLength.c + AmlNamedObject.c + AmlTable.c + AmlStatementOpcodes.c + AmlResourceDescriptor.c + AmlExpressionOpcodes.c + AmlArgObjects.c + AmlLocalObjects.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf new file mode 100644 index 0000000000..e63a70e849 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchBaseLib + FILE_GUID = 4108287a-c864-4427-b2c3-bd0e91a83abd + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchBaseLib + +[Sources.common] + FchStallLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + PciSegmentLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf new file mode 100644 index 0000000000..e422cb69a4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf @@ -0,0 +1,35 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = BaseResetSystemLib + FILE_GUID = e669c365-2df2-4540-a343-afec4e85b198 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseResetSystemLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + FchBaseResetSystemLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PrintLib + IoLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf new file mode 100644 index 0000000000..d7f49c40de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchEspiCmdLib + FILE_GUID = 89671327-a620-43e9-93b1-d1da79a50392 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchEspiCmdLib + +[Sources.common] + FchEspiCmdLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + IoLib + FchBaseLib + + + + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf new file mode 100755 index 0000000000..f32bbc9ff2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf @@ -0,0 +1,24 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioHandleLib + FILE_GUID = DC4639D3-DB75-486B-AC38-C84AA49601E3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioHandleLib + +[Sources] + NbioHandleLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf new file mode 100755 index 0000000000..0d6ba605f5 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf @@ -0,0 +1,25 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PcieConfigLib + FILE_GUID = C1205AD2-FE67-4502-A0A7-FB1704A3F9AE + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PcieConfigLib + +[Sources] + PcieConfigLib.c + PcieInputParserLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf new file mode 100644 index 0000000000..ae1dd6cd83 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = SmnAccessLib + FILE_GUID = 9B7FF4FA-9DB5-4fec-BF71-B13D8A14A51E + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmnAccessLib + +[Sources] + SmnAccessLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + PrintLib + BaseLib + DebugPrintErrorLevelLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf new file mode 100644 index 0000000000..da7f5c185d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioCommonDxeLib + FILE_GUID = 1BF93335-5D55-46D9-99D9-5D962F039829 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioCommonDxeLib + +[Sources] + DxeLibFunctions.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + BaseLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf new file mode 100644 index 0000000000..54c3514020 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbDxeV3 + FILE_GUID = 4D3708A0-6D9B-47D3-AD87-E80C781BC0A7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3DxeDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + DxeServicesTableLib + MemoryAllocationLib + ApcbLibV3 + +[Sources] + ApcbV3Dxe.c + +[Protocols] + gEfiDxeSmmReadyToLockProtocolGuid + gEfiSmmCommunicationProtocolGuid + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf new file mode 100644 index 0000000000..7f90aa6ea0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbPeiV3 + FILE_GUID = E1B8CF4A-FE7B-4676-B4F7-50C7228282A4 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3PeiDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PeimEntryPoint + ApcbLibV3Pei + +[sources] + ApcbV3Pei.c + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf new file mode 100755 index 0000000000..0f115c362e --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = OemAgesaCcxPlatformLibNull + FILE_GUID = B1F58B07-0146-4804-B701-A56CB5716529 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = OemAgesaCcxPlatformLib + +[Sources.common] + OemAgesaCcxPlatformLibNull.c + +[Packages] + MdePkg/MdePkg.dec + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf new file mode 100644 index 0000000000..ba551e5c14 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf @@ -0,0 +1,61 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciCfg2 + FILE_GUID = 7A6DF3DB-1C0A-45C2-8251-AFE794D7D6B3 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = PeimInitializePciCfg + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC (EBC is for build only) +# + +[Sources] + PciExpressPciCfg2.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + + +[LibraryClasses] + PeimEntryPoint + BaseLib + PcdLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + HobLib + IoLib + +[Ppis] + gEfiPciCfg2PpiGuid ## PRODUCES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress + +[Pcd.IA32,Pcd.X64] + gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable ## SOMETIMES_CONSUMES + +[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64] + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES + +[Depex] + TRUE diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf new file mode 100644 index 0000000000..e712a80886 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciSegmentInfoLib + FILE_GUID = FA8B1082-88DF-4744-85A3-7F87A9EBF8DC + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciSegmentInfoLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + PciSegmentInfoLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + DebugLib + BaseLib diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf new file mode 100644 index 0000000000..f4b9d0d789 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspFlashAccLibSmm + FILE_GUID = 3BBDC3A5-A0E2-4E8A-8240-9E594920F040 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspFlashAccLib | DXE_SMM_DRIVER + +[Sources.common] + AmdPspFlashAccSpiNorLibSmm.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + AmdPspBaseLibV2 + BaseLib + DebugLib + SmmServicesTableLib + UefiBootServicesTableLib + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSpiSmmNorFlashProtocolGuid + +[Pcd] + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize ## CONSUMES + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress ## CONSUMES + +[Depex] + gEfiSmmBase2ProtocolGuid AND + gEfiSpiSmmNorFlashProtocolGuid + diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf new file mode 100644 index 0000000000..57bb0d9e25 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = PspRomArmorWhitelistLib + FILE_GUID = B6F8507A-C96B-4036-A8C0-26BAD6AC5F34 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformPspRomArmorWhitelistLib + +[Sources] + PspRomArmorWhitelistLib.c + +[Packages] + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseMemoryLib + MemoryAllocationLib + PcdLib + DebugLib + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf new file mode 100644 index 0000000000..64fd2913ad --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf @@ -0,0 +1,42 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = OobPprDxe + FILE_GUID = F91DCAB4-3639-11EE-BE56-0242AC120002 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = OobPprEntry + +[Sources] + OobPprDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DebugLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + MemoryAllocationLib + TimerLib + +[Protocols] + gEfiPciIoProtocolGuid #CONSUMES + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf new file mode 100644 index 0000000000..f4d7638c1a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PspPlatform + FILE_GUID = 28374747-76FF-41B3-9740-381EFAEF13BC + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = PspPlatformEntryPoint + +[Sources] + PspPlatformDriver.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + DebugLib + BaseLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf new file mode 100644 index 0000000000..973ace8632 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ServerHotplugDxe + FILE_GUID = FAFF8CA9-E515-44ed-B5F9-E2F6E5D902E3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = HotplugDescEntry + +[Sources] + ServerHotplugDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf new file mode 100644 index 0000000000..2d9dbeb715 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf @@ -0,0 +1,53 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoDynamicCommand + FILE_GUID = CCD8FEC8-1E30-45BD-8632-DB83A255FAC3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.1 + ENTRY_POINT = ActCommandInitialize + UNLOAD_IMAGE = ActLibraryUnregisterActCommand + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoDynamicCommand.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + UefiLib + FileHandleLib + HiiLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + +[Guids] + gShellActHiiGuid ## SOMETIMES_CONSUMES ## HII + gAgesaConfigDbPointerVariableGuid + +[Protocols] + gEfiShellDynamicCommandProtocolGuid + gEfiHiiPackageListProtocolGuid + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[DEPEX] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf new file mode 100644 index 0000000000..98c8755ab8 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf @@ -0,0 +1,50 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoToolApp + FILE_GUID = 470E1741-2DFE-43EF-861E-505CB3226DC0 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + ENTRY_POINT = ActCommandInitialize +# +# This flag specifies whether HII resource section is generated into PE image. +# + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoToolApp.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + FileHandleLib + HiiLib + MemoryAllocationLib + UefiApplicationEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + UefiLib + UefiRuntimeServicesTableLib + +[Protocols] + gEfiHiiPackageListProtocolGuid ## CONSUMES + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[Guids] + diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf new file mode 100644 index 0000000000..9c3c0dd0a9 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BasePlatformHookLibAmdFchUart + FILE_GUID = BF2F3F3F-4BE6-4B97-850D-D5D4941D391C + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformHookLib + +[Sources] + BasePlatformHookLibAmdFchUart.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + IoLib + PlatformHookLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Include/AGESA.h b/Platform/AMD/AgesaModulePkg/Include/AGESA.h new file mode 100644 index 0000000000..3ec03aafd3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AGESA.h @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AGESA_H_ +#define AGESA_H_ + +#include "AMD.h" +#include "SocLogicalId.h" + +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull +#define DESCRIPTOR_INITIALIZE_LIST 0x20000000ull + +/// PCIe link initialization +typedef enum { + EndpointDetect = 0, ///< Detect endpoint presence + EndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} PCIE_ENDPOINT_STATUS; + +/// PCIe port misc extended controls +typedef struct { + IN UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + IN UINT8 LinkSafeMode : 2; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through PCIe_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertise maximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 2; ///< Unused space +} PCIE_PORT_MISC_CONTROL; + +/// The IO APIC Interrupt Mapping Info +typedef struct { + IN UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + IN UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< - ABCD + ///< - BCDA + ///< - CDAB + ///< - DABC + IN UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< - Entry 0 of IO APIC redirection table + ///< - Entry 1 of IO APIC redirection table + ///< - Entry 31 of IO APIC redirection table +} APIC_DEVICE_INFO; + +/// GEN3 RxAdaptMode Configuration Structure +typedef struct { + IN BOOLEAN InitOffsetCancellation; ///< Initial Offset Cancellation Enable + IN UINT8 DFEControl; ///< DFE Control + IN UINT8 LEQControl; ///< LEQ Control + IN BOOLEAN DynamicOffsetCalibration; ///< Dynamic Offset Calibration Enable + IN BOOLEAN FOMCalculation; ///< FOM Calculation Enable + IN BOOLEAN PIOffsetCalibration; ///< PI Offset Calibratino Enable +} RX_ADAPT_MODE; + +/// PCIe port configuration data +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 ChannelType; ///< Channel type. + ///< 0 - "lowLoss", + ///< 1 - "highLoss", + ///< 2 - "mob0db", + ///< 3 - "mob3db", + ///< 4 - "extnd6db" + ///< 5 - "extnd8db" + IN UINT8 DeviceNumber; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 FunctionNumber; ///< Reserved for future use + IN UINT8 LinkSpeedCapability; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT8 ResetId; ///< Arbitrary number greater than 0 assigned by platform firmware for GPIO + ///< identification which control reset for given port. + ///< Each port with unique GPIO should have unique ResetId assigned. + ///< All ports use same GPIO to control reset should have same ResetId assigned. + ///< see AgesaPcieSlotResetContol. + IN UINT16 SlotNum; ///< Physical Slot Number + IN PCIE_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + IN PCIE_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + IN RX_ADAPT_MODE RxAdaptMode; ///< Gen3 RxAdaptMode configuration +} PCIE_PORT_DATA; + +/// PCIe Complex descriptor +typedef struct { + IN UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + IN UINT32 SocketId; ///< Socket Id + IN VOID *Reserved; ///< Reserved for future use +} PCIE_COMPLEX_DESCRIPTOR; + +/// VBIOS image info +typedef struct { + IN AMD_CONFIG_PARAMS StdHeader; ///< Standard configuration header + OUT VOID *ImagePtr; ///< Pointer to VBIOS image + IN PCI_ADDR GfxPciAddress; ///< PCI address of integrated graphics controller + IN UINT32 Flags; ///< BIT[0] - special repost requred +} GFX_VBIOS_IMAGE_INFO; + +// +// CPU MSR Register definitions +// +#define SYS_CFG 0xC0010010ul ///< Refer to AMD64 Architecture Programming manual. +#define TOP_MEM 0xC001001Aul ///< Refer to AMD64 Architecture Programming manual. +#define HWCR 0xC0010015ul ///< Refer to AMD64 Architecture Programming manual. + +/// +/// VDDP_VDDR Voltage Info for Low Power DIMM +/// +typedef struct _VDDP_VDDR_VOLTAGE { + IN BOOLEAN IsValid; ///< Indicates if daata is valid + IN UINT8 Voltage; ///< VDDP VDDR Voltage Value +} VDDP_VDDR_VOLTAGE; + +// CPU Build Configuration structures and definitions + +#define AMD_AP_MTRR_FIX64k_00000 0x00000250ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_80000 0x00000258ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_A0000 0x00000259ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C0000 0x00000268ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C8000 0x00000269ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_D0000 0x0000026Aul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_D8000 0x0000026Bul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E0000 0x0000026Cul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E8000 0x0000026Dul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F0000 0x0000026Eul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F8000 0x0000026Ful ///< Refer to AMD64 Architecture Programming manual + +#endif // AGESA_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AMD.h b/Platform/AMD/AgesaModulePkg/Include/AMD.h new file mode 100755 index 0000000000..062d9e1e1a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AMD.h @@ -0,0 +1,91 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_H_ +#define AMD_H_ + +/// The return status for all AGESA public services. +/// +/// Services return the most severe status of any logged event. Status other than SUCCESS, UNSUPPORTED, and BOUNDS_CHK +/// will have log entries with more detail. +/// +typedef enum { + AGESA_SUCCESS = 0, ///< 0 - The service completed normally. Info may be logged. + AGESA_UNSUPPORTED, ///< 1 - The dispatcher or create struct had an unimplemented function requested. + ///< Not logged. + AGESA_BOUNDS_CHK, ///< 2 - A dynamic parameter was out of range and the service was not provided. + ///< Example, memory address not installed, heap buffer handle not found. + ///< Not Logged. + AGESA_SYNC_MORE_DATA, ///< 3 - More data is available from PSP communications (used in ABL) + AGESA_SYNC_SLAVE_ASSERT, ///< 4 - Slave is at an ASSERT (used in ABL) + + // AGESA_STATUS of greater severity (the ones below this line), always have a log entry available. + AGESA_ALERT, ///< 5 - An observed condition, but no loss of function. See Log. + AGESA_WARNING, ///< 6 - Possible or minor loss of function. See Log. + AGESA_ERROR, ///< 7 - Significant loss of function, boot may be possible. See Log. + AGESA_CRITICAL, ///< 8 - Continue boot only to notify user. See Log. + AGESA_FATAL, ///< 9 - Halt booting. See Log, however Fatal errors pertaining to heap problems + ///< may not be able to reliably produce log events. + AGESA_OC_FATAL, ///< 10 - Halt booting. Critical Memory Overclock failure. (used in ABL) + AGESA_SKIP_ERROR, ///< 11 - Error, Skip init steps. (used in ABL) + AgesaStatusMax ///< Not a status, for limit checking. +} AGESA_STATUS; + +/** + Callout method to the host environment. + + Callout using a dispatch with appropriate thunk layer, which is determined by the host environment. + + @param[in] Function The specific callout function being invoked. + @param[in] FcnData Function specific data item. + @param[in,out] ConfigPtr Reference to Callout params. +**/ +typedef AGESA_STATUS (*CALLOUT_ENTRY) ( + IN UINT32 Function, + IN UINTN FcnData, + IN OUT VOID *ConfigPtr + ); + +/// AGESA Structures + +/// Extended PCI address format +typedef struct { + IN OUT UINT32 Register : 12; ///< Register offset + IN OUT UINT32 Function : 3; ///< Function number + IN OUT UINT32 Device : 5; ///< Device number + IN OUT UINT32 Bus : 8; ///< Bus number + IN OUT UINT32 Segment : 4; ///< Segment +} EXT_PCI_ADDR; + +/// Union type for PCI address +typedef union _PCI_ADDR { + IN UINT32 AddressValue; ///< Formal address + IN EXT_PCI_ADDR Address; ///< Extended address +} PCI_ADDR; + +/// +/// The standard header for all AGESA services. +/// +typedef struct { + IN UINT32 ImageBasePtr; ///< The AGESA Image base address. + IN UINT32 Func; ///< The service desired + IN UINT32 AltImageBasePtr; ///< Alternate Image location + IN CALLOUT_ENTRY CalloutPtr; ///< For Callout from AGESA + IN UINT8 HeapStatus; ///< For heap status from boot time slide. + IN UINT64 HeapBasePtr; ///< Location of the heap + IN OUT UINT8 Reserved[7]; ///< This space is reserved for future use. +} AMD_CONFIG_PARAMS; + +/// CPUID data received registers format +typedef struct { + OUT UINT32 EAX_Reg; ///< CPUID instruction result in EAX + OUT UINT32 EBX_Reg; ///< CPUID instruction result in EBX + OUT UINT32 ECX_Reg; ///< CPUID instruction result in ECX + OUT UINT32 EDX_Reg; ///< CPUID instruction result in EDX +} CPUID_DATA; +#endif // AMD_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h new file mode 100755 index 0000000000..534b03d4a7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h @@ -0,0 +1,15 @@ +/** @file + AMD CPU Register Table Related Functions. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_H_ +#define CPU_REGISTERS_H_ + +#include <CpuRegistersDef.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h new file mode 100644 index 0000000000..e086a4c9b1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h @@ -0,0 +1,61 @@ +/** @file + AMD Psp Directory header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_DIR_H_ +#define AMD_PSP_DIR_H_ + +#pragma pack (push, 1) +#define PSP_DIRECTORY_HEADER_SIGNATURE 0x50535024ul ///< $PSP +#define PSP_LV2_DIRECTORY_HEADER_SIGNATURE 0x324C5024ul ///< $PL2 + +/// Enum define various enum type for PSP entry type +enum _PSP_DIRECTORY_ENTRY_TYPE { + PSP_REGION_A_DIR = 0x48, ///< PSP entry points to PSP DIR in Region A + PSP_REGION_B_DIR = 0x4A, ///< PSP entry points to PSP DIR in Region B +}; + +/// Define structure for PSP directory +typedef struct { + UINT32 Cookie; ///< "$PSP" + UINT32 Checksum; ///< 32 bit CRC of header items below and the entire table + UINT32 TotalEntries; ///< Number of PSP Entries + UINT32 Reserved; ///< Unused +} PSP_DIRECTORY_HEADER; + +/// Define structure for 32 bits Entry type field +typedef struct { + UINT32 Type : 8; ///< Type of PSP Directory entry + UINT32 SubProgram : 8; ///< Specify the SubProgram + UINT32 RomId : 2; ///< Specify the ROM ID + UINT32 Reserved : 14; ///< Reserved +} PSP_DIRECTORY_ENTRY_TYPE_FIELD; + +/// Define union type for 32 bits Entry type field +typedef union { + PSP_DIRECTORY_ENTRY_TYPE_FIELD Field; ///< Definition of each filed + UINT32 Value; ///< Group it as 32bits Int +} PSP_DIRECTORY_ENTRY_TYPE; + +/// Structure for PSP Entry +typedef struct { + PSP_DIRECTORY_ENTRY_TYPE Type; ///< Type of PSP entry; 32 bit long + UINT32 Size; ///< Size of PSP Entry in bytes + UINT64 Location; ///< Location of PSP Entry (byte offset from start of SPI-ROM) +} PSP_DIRECTORY_ENTRY; + +/// Structure for PSP directory +typedef struct { + PSP_DIRECTORY_HEADER Header; ///< PSP directory header + PSP_DIRECTORY_ENTRY PspEntry[1]; ///< Array of PSP entries each pointing to a binary in SPI flash + ///< The actual size of this array comes from the + ///< header (PSP_DIRECTORY.Header.TotalEntries) +} PSP_DIRECTORY; + +#pragma pack (pop) +#endif //AMD_PSP_DIR_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h new file mode 100755 index 0000000000..faa8d35b1b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h @@ -0,0 +1,156 @@ +/** @file + AMD CPU Register Table Related Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_DEF_H_ +#define CPU_REGISTERS_DEF_H_ + +#undef BIT0 +#undef BIT1 +#undef BIT2 +#undef BIT3 +#undef BIT4 +#undef BIT5 +#undef BIT6 +#undef BIT7 +#undef BIT8 +#undef BIT9 +#undef BIT10 +#undef BIT10 +#undef BIT11 +#undef BIT12 +#undef BIT13 +#undef BIT14 +#undef BIT15 +#undef BIT16 +#undef BIT17 +#undef BIT18 +#undef BIT19 +#undef BIT20 +#undef BIT21 +#undef BIT22 +#undef BIT23 +#undef BIT24 +#undef BIT25 +#undef BIT26 +#undef BIT27 +#undef BIT28 +#undef BIT29 +#undef BIT30 +#undef BIT31 +#undef BIT32 +#undef BIT33 +#undef BIT34 +#undef BIT35 +#undef BIT36 +#undef BIT37 +#undef BIT38 +#undef BIT39 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT50 +#undef BIT51 +#undef BIT52 +#undef BIT53 +#undef BIT54 +#undef BIT55 +#undef BIT56 +#undef BIT57 +#undef BIT58 +#undef BIT59 +#undef BIT60 +#undef BIT61 +#undef BIT62 +#undef BIT63 + +#define BIT0 0x0000000000000001ull +#define BIT1 0x0000000000000002ull +#define BIT2 0x0000000000000004ull +#define BIT3 0x0000000000000008ull +#define BIT4 0x0000000000000010ull +#define BIT5 0x0000000000000020ull +#define BIT6 0x0000000000000040ull +#define BIT7 0x0000000000000080ull +#define BIT8 0x0000000000000100ull +#define BIT9 0x0000000000000200ull +#define BIT10 0x0000000000000400ull +#define BIT11 0x0000000000000800ull +#define BIT12 0x0000000000001000ull +#define BIT13 0x0000000000002000ull +#define BIT14 0x0000000000004000ull +#define BIT15 0x0000000000008000ull +#define BIT16 0x0000000000010000ull +#define BIT17 0x0000000000020000ull +#define BIT18 0x0000000000040000ull +#define BIT19 0x0000000000080000ull +#define BIT20 0x0000000000100000ull +#define BIT21 0x0000000000200000ull +#define BIT22 0x0000000000400000ull +#define BIT23 0x0000000000800000ull +#define BIT24 0x0000000001000000ull +#define BIT25 0x0000000002000000ull +#define BIT26 0x0000000004000000ull +#define BIT27 0x0000000008000000ull +#define BIT28 0x0000000010000000ull +#define BIT29 0x0000000020000000ull +#define BIT30 0x0000000040000000ull +#define BIT31 0x0000000080000000ull +#define BIT32 0x0000000100000000ull +#define BIT33 0x0000000200000000ull +#define BIT34 0x0000000400000000ull +#define BIT35 0x0000000800000000ull +#define BIT36 0x0000001000000000ull +#define BIT37 0x0000002000000000ull +#define BIT38 0x0000004000000000ull +#define BIT39 0x0000008000000000ull +#define BIT40 0x0000010000000000ull +#define BIT41 0x0000020000000000ull +#define BIT42 0x0000040000000000ull +#define BIT43 0x0000080000000000ull +#define BIT44 0x0000100000000000ull +#define BIT45 0x0000200000000000ull +#define BIT46 0x0000400000000000ull +#define BIT47 0x0000800000000000ull +#define BIT48 0x0001000000000000ull +#define BIT49 0x0002000000000000ull +#define BIT50 0x0004000000000000ull +#define BIT51 0x0008000000000000ull +#define BIT52 0x0010000000000000ull +#define BIT53 0x0020000000000000ull +#define BIT54 0x0040000000000000ull +#define BIT55 0x0080000000000000ull +#define BIT56 0x0100000000000000ull +#define BIT57 0x0200000000000000ull +#define BIT58 0x0400000000000000ull +#define BIT59 0x0800000000000000ull +#define BIT60 0x1000000000000000ull +#define BIT61 0x2000000000000000ull +#define BIT62 0x4000000000000000ull +#define BIT63 0x8000000000000000ull + +#define MSR_MMIO_CFG_BASE 0xC0010058ul // MMIO Configuration Base Address Register + +#endif // CPU_REGISTERS_DEF_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h new file mode 100644 index 0000000000..8ede1be838 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h @@ -0,0 +1,85 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FCH_REGISTER_COMMON_H_ +#define FCH_REGISTER_COMMON_H_ + +// Misc +#define R_FCH_ACPI_PM1_STATUS 0x00 +#define R_FCH_ACPI_PM1_ENABLE 0x02 +#define R_FCH_ACPI_PM_CONTROL 0x04 + +#define FCH_LPC_BUS 0 +#define FCH_LPC_DEV 20 +#define FCH_LPC_FUNC 3 + +#define ACPI_MMIO_BASE 0xFED80000ul +#define SMI_BASE 0x200 // DWORD +#define IOMUX_BASE 0xD00 // BYTE +#define MISC_BASE 0xE00 +#define PMIO_BASE 0x300 // DWORD + +// +// FCH LPC Device 0x780E +// Device 20 (0x14) Func 3 +// +#define FCH_LPC_REG48 0x48 // IO/Mem Port Decode Enable Register 5- RW +#define FCH_LPC_REG74 0x74 // Alternative Wide IO Range Enable- W/R +#define FCH_LPC_REG7C 0x7C // TPM (trusted plant form module) reg- W/R +#define FCH_LPC_REGA0 0x0A0 // SPI base address +#define FCH_LPC_REGB8 0x0B8 + +// +// FCH MMIO Base (SMI) +// offset : 0x200 +// +#define FCH_SMI_REG80 0x80 // SmiStatus0 +#define FCH_SMI_REG84 0x84 // SmiStatus1 +#define FCH_SMI_REG88 0x88 // SmiStatus2 +#define FCH_SMI_REG8C 0x8C // SmiStatus3 +#define FCH_SMI_REG90 0x90 // SmiStatus4 +#define FCH_SMI_REG98 0x98 // SmiTrig +#define FCH_SMI_REGA0 0xA0 +#define FCH_SMI_REGB0 0xB0 +#define FCH_SMI_REGC4 0xC4 + +// +// FCH MMIO Base (PMIO) +// offset : 0x300 +// +#define FCH_PMIOA_REG60 0x60 // AcpiPm1EvtBlk + +// +// +#define FCH_MISC_REG80 0x80 +// FCH SPI +// + +#define FCH_SPI_BASE_ADDRESS 0xFEC10000 + +#define FCH_SPI_MMIO_REG00 0x00 +#define FCH_SPI_FIFO_PTR_CRL 0x00100000l // +#define FCH_SPI_BUSY 0x80000000l // +#define FCH_SPI_MMIO_REG1D 0x1D // +#define FCH_SPI_MMIO_REG20 0x20 +#define FCH_SPI_MMIO_REG22 0x22 // +#define FCH_SPI_MMIO_REG30 0x30 // +#define FCH_SPI_R2VAL24 0x00000001l // +#define FCH_SPI_R2VAL25 0x00000002l // +#define FCH_SPI_R2MSK24 0x00000004l // +#define FCH_SPI_R2MSK25 0x00000008l // +#define FCH_SPI_MMIO_REG45_CMDCODE 0x45 // +#define FCH_SPI_MMIO_REG47_CMDTRIGGER 0x47 // +#define FCH_SPI_MMIO_REG48_TXBYTECOUNT 0x48 // +#define FCH_SPI_MMIO_REG4B_RXBYTECOUNT 0x4B // +#define FCH_SPI_MMIO_REG4C_SPISTATUS 0x4C // +#define FCH_SPI_MMIO_REG5C_Addr32_Ctrl3 0x5C // +#define FCH_SPI_SPIROM_PAGE_MASK 0xFF // +#define FCH_SPI_MMIO_REG80_FIFO 0x80 // + +#endif /* FCH_REGISTER_COMMON_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Filecode.h b/Platform/AMD/AgesaModulePkg/Include/Filecode.h new file mode 100644 index 0000000000..726479d79f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Filecode.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * Collectively assign unique filecodes for assert and debug to each source file. + * + * Publish values for decorated filenames, which can be used for + * ASSERT and debug support using a preprocessor define like: + * @n <tt> _#define FILECODE MY_C_FILENAME_FILECODE </tt> @n + * This file serves as a reference for debugging to associate the code and filename. + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: Include + * @e _$Revision: 312538 $ @e \$Date: 2015-02-09 16:53:54 +0800 (Mon, 09 Feb 2015) $ + */ + +#ifndef _FILECODE_H_ +#define _FILECODE_H_ + +#define UNASSIGNED_FILE_FILECODE (0xFFFF) + +#endif // _FILECODE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Gnb.h b/Platform/AMD/AgesaModulePkg/Include/Gnb.h new file mode 100755 index 0000000000..ddc9309d3d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Gnb.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_H_ +#define GNB_H_ + +#define PVOID UINT64 + +#endif // GNB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h new file mode 100644 index 0000000000..192e0d6a8b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h @@ -0,0 +1,521 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBDXIO_H_ +#define GNBDXIO_H_ + +#pragma pack (push, 1) + +#include <AGESA.h> +#include <Gnb.h> + +#define MAX_NUMBER_OF_COMPLEXES 16 + +#define DESCRIPTOR_TERMINATE_GNB 0x40000000ull +#define DESCRIPTOR_TERMINATE_TOPOLOGY 0x20000000ull +#define DESCRIPTOR_ALLOCATED 0x10000000ull +#define DESCRIPTOR_PLATFORM 0x08000000ull +#define DESCRIPTOR_COMPLEX 0x04000000ull +#define DESCRIPTOR_SILICON 0x02000000ull +#define DESCRIPTOR_PCIE_WRAPPER 0x01000000ull +#define DESCRIPTOR_PCIE_ENGINE 0x00800000ull +#define DESCRIPTOR_CXL_ENGINE 0x00200000ull + +#define SILICON_CXL_CAPABLE 0x00008000ull + +#define DESCRIPTOR_ALL_WRAPPERS (DESCRIPTOR_PCIE_WRAPPER) +#define DESCRIPTOR_ALL_ENGINES (DESCRIPTOR_PCIE_ENGINE | DESCRIPTOR_CXL_ENGINE) + +#define DESCRIPTOR_ALL_TYPES (DESCRIPTOR_ALL_WRAPPERS | DESCRIPTOR_ALL_ENGINES | DESCRIPTOR_SILICON | DESCRIPTOR_PLATFORM) +#define PcieLibGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) + +typedef UINT16 PCIE_ENGINE_INIT_STATUS; + +/// +/// Engine Configuration +/// +typedef struct { + IN UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + IN UINT16 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + IN UINT16 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG +} PCIE_ENGINE; + +/// +/// PCIe port misc extended controls +/// +typedef struct { + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 5; ///< Unused space +} PORT_MISC_CONTROL; + +/// +/// PCIe port configuration data +/// +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 FunctionNumber : 3; ///< Reserved for future use + IN UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 LinkSpeedCapability : 4; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm : 4; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT16 SlotNum; ///< Physical Slot Number + IN PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN UINT8 Reserved1; ///< Reserved for future use +} PORT_DATA; + +typedef struct { + UINT8 LinkSpeed; + UINT8 MaxPayloadSupport; + UINT8 AspmCapability; + UINT8 PciPmL1_1; + UINT8 PciPmL1_2; + UINT8 AspmL1_1; + UINT8 AspmL1_2; + UINT8 EsmSupport; + UINT8 LtrSupport; + UINT8 SurpriseDownErrorReport; + UINT8 TenBitTagSupport; + UINT8 AriForwarding; + UINT8 AcsSupport; + UINT8 AcsSourceValidation; + UINT8 AcsTranslationBlocking; + UINT8 AcsP2pRequestRedirect; + UINT8 AcsP2pCompletionRedirect; + UINT8 AcsUpstreamForwarding; + UINT8 AcsP2pEgressControl; + UINT8 AcsDirectTranslatedP2p; + UINT8 LaneMargining; + UINT8 DataLinkFeature; + UINT8 DownstreamPortContainment; + UINT8 AdvancedErrorReporting; + UINT8 ECRCSupport; + UINT8 MulticastEnable; + UINT8 NativePCIeEnclosureManagement; + UINT8 Capability1Address; + UINT8 Capability1Data; + UINT8 Capability2Address; + UINT8 Capability2Data; + UINT8 Capability3Address; + UINT8 Capability3Data; + UINT8 Capability4Address; + UINT8 Capability4Data; +} PORT_CAPABILITIES; + +/// +/// PCIe PORT_FEATURES +/// +typedef struct { + UINT8 LinkSpeedControl; + UINT8 MaxPayloadSizeControl; + UINT8 ESMControl; + UINT8 LTRControl; + UINT8 DataLinkFeatureExchangeControl; + UINT8 TenBitTagControl; + UINT8 ARIControl; + UINT8 ACSControl; + UINT8 RxLaneMarginingControl; + UINT8 DynLanesPwrState; + UINT8 L1PowerDown; + UINT8 L11PowerDown; + UINT8 L12PowerDown; + UINT8 AutoSpdChngEn; + UINT8 TurnOffUnusedLanes; +} PORT_FEATURES; + +typedef struct { + UINT8 SpcGen1 : 1; ///< SPC Mode 2P5GT + UINT8 SpcGen2 : 1; ///< SPC Mode 5GT + UINT8 SpcGen3 : 2; ///< SPC Mode 8GT + UINT8 SpcGen4 : 2; ///< SPC Mode 16GT + UINT8 SpcGen5 : 2; ///< SPC Mode 32GT +} SPC_MODE; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT32 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT32 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT32 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT32 LcPresetMask8Gt : 10; ///< Gen3 Preset Mask + UINT32 LcFapeEnable8GT : 1; ///< Gen3 FapeEnable + UINT32 UNUSED2 : 7; ///< Currently unassigned - for alignment +} GEN3_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT32 LcPresetMask16Gt : 10; ///< Gen4 Preset Mask + UINT32 LcFapeEnable16GT : 1; ///< Gen4 FapeEnable + UINT32 UNUSED3 : 13; ///< Currently unassigned - for alignment +} GEN4_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT32 LcPresetMask32Gt : 10; ///< Gen5 Preset Mask + UINT32 LcFapeEnable32GT : 1; ///< Gen5 FapeEnable + UINT32 PrecodeRequest : 1; ///< Precoding Request + UINT32 AdvertiseEqToHiRate : 1; ///< Advertise EQ To High Rate Support + UINT32 UNUSED4 : 11; ///< Currently unassigned - for alignment +} GEN5_LANE_CNTL; + +typedef struct { + UINT32 LcFapeReqPostCursor0 : 5; ///< PostCursor0 + UINT32 LcFapeReqPreCursor0 : 4; ///< PreCursor0 + UINT32 LcFapeReqPostCursor1 : 5; ///< PostCursor1 + UINT32 LcFapeReqPreCursor1 : 4; ///< PreCursor1 + UINT32 LcFapeReqPostCursor2 : 5; ///< PostCursor2 + UINT32 LcFapeReqPreCursor2 : 4; ///< PreCursor2 + UINT32 UNUSED6 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_0; + +typedef struct { + UINT32 LcFapeReqPostCursor3 : 5; ///< PostCursor3 + UINT32 LcFapeReqPreCursor3 : 4; ///< PreCursor3 + UINT32 LcFapeReqPostCursor4 : 5; ///< PostCursor4 + UINT32 LcFapeReqPreCursor4 : 4; ///< PreCursor4 + UINT32 LcFapeReqPostCursor5 : 5; ///< PostCursor5 + UINT32 LcFapeReqPreCursor5 : 4; ///< PreCursor5 + UINT32 UNUSED7 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_1; + +typedef struct { + UINT32 LcFapeReqPostCursor6 : 5; ///< PostCursor6 + UINT32 LcFapeReqPreCursor6 : 4; ///< PreCursor6 + UINT32 LcFapeReqPostCursor7 : 5; ///< PostCursor7 + UINT32 LcFapeReqPreCursor7 : 4; ///< PreCursor7 + UINT32 LcFapeReqPostCursor8 : 5; ///< PostCursor8 + UINT32 LcFapeReqPreCursor8 : 4; ///< PreCursor8 + UINT32 UNUSED8 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_2; + +typedef struct { + UINT32 LcFapeReqPostCursor9 : 5; ///< PostCursor9 + UINT32 LcFapeReqPreCursor9 : 4; ///< PreCursor9 + UINT32 LcFapeReqPostCursor10 : 5; ///< PostCursor10 + UINT32 LcFapeReqPreCursor10 : 4; ///< PreCursor10 + UINT32 LcFapeReqPostCursor11 : 5; ///< PostCursor11 + UINT32 LcFapeReqPreCursor11 : 4; ///< PreCursor11 + UINT32 UNUSED9 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_3; + +typedef struct { + UINT32 LcFapeReqPostCursor12 : 5; ///< PostCursor12 + UINT32 LcFapeReqPreCursor12 : 4; ///< PreCursor12 + UINT32 LcFapeReqPostCursor13 : 5; ///< PostCursor13 + UINT32 LcFapeReqPreCursor13 : 4; ///< PreCursor13 + UINT32 LcFapeReqPostCursor14 : 5; ///< PostCursor14 + UINT32 LcFapeReqPreCursor14 : 4; ///< PreCursor14 + UINT32 UNUSED10 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_4; + +typedef struct { + UINT32 LcFapeReqPostCursor15 : 5; ///< PostCursor15 + UINT32 LcFapeReqPreCursor15 : 4; ///< PreCursor15 + UINT32 LcFapeReqPostCursor16 : 5; ///< PostCursor16 + UINT32 LcFapeReqPreCursor16 : 4; ///< PreCursor16 + UINT32 LcFapeReqPostCursor17 : 5; ///< PostCursor17 + UINT32 LcFapeReqPreCursor17 : 4; ///< PreCursor17 + UINT32 UNUSED11 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_5; + +typedef struct { + UINT32 LcFapeReqPostCursor18 : 5; ///< PostCursor18 + UINT32 LcFapeReqPreCursor18 : 4; ///< PreCursor18 + UINT32 LcFapeReqPostCursor19 : 5; ///< PostCursor19 + UINT32 LcFapeReqPreCursor19 : 4; ///< PreCursor19 + UINT32 LcFapeReqPostCursor20 : 5; ///< PostCursor20 + UINT32 LcFapeReqPreCursor20 : 4; ///< PreCursor20 + UINT32 UNUSED12 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_6; + +/// +/// PCIe port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 IsBmcLocation : 1; ///< Port Location of BMC + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 TXDeEmphasis : 4; ///< TX De-emphasis + UINT8 TXMargin : 3; ///< TX Margin + UINT8 UNUSED1 : 1; ///< Currently unassigned - for alignment + + PORT_CAPABILITIES PortCapabilities; ///< Port Capabilities CBS + + SPC_MODE SpcMode; + + GEN3_LANE_CNTL LaneEqualizationCntl; + GEN4_LANE_CNTL Gen4LaneEqualizationCntl; + GEN5_LANE_CNTL Gen5LaneEqualizationCntl; + + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 UNUSED4 : 1; ///< Currently unassigned - for alignment + UINT8 SRIS_SRNS : 1; ///< SRIS SRNS + UINT8 SRIS_LowerSKPSupport : 1; ///< SRIS Lower SKP Support + UINT8 CcixControl : 1; ///< Bit to enable/disable ESM + UINT8 CxlControl : 1; ///< Bit to enable CXL Capability + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 SlotPowerLimitScale : 2; ///< Slot Power Limit Scale + UINT8 UNUSED5 : 1; ///< Currently unassigned - for alignment + + UINT8 RxMarginPersistence : 1; ///< Bit to enable/disable Rx Margin persistence mode + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 TxVetting : 1; ///< Gen4 Tx Vetting + UINT8 RxVetting : 1; ///< Gen4 Rx Vetting + UINT8 TxVettingGen5 : 1; ///< Gen5 Tx Vetting + UINT8 RxVettingGen5 : 1; ///< Gen5 Rx Vetting + + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 DlfCapDisable : 1; ///< DLF Capability 1:Disable 0:Enable + UINT8 DlfExchangeDisable : 1; ///< DLF Exchange 1:Disable 0:Enable + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + + UINT8 EqSearchMode : 2; ///< Equalization Search Mode + UINT8 BypassGen3EQ : 1; ///< BypassGen3EQ + UINT8 DisGen3EQPhase : 1; ///< Disable Gen3 EQ Phase2/3 + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset value + + UINT8 EqSearchModeGen4 : 2; ///< Equalization Search Mode for Gen4 + UINT8 BypassGen4EQ : 1; ///< Gen4 Bypass phase3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset value + UINT8 EqSearchModeGen5 : 2; ///< Equalization Search Mode for Gen5 + UINT8 BypassGen5EQ : 1; ///< Gen5 Bypass phase3 EQ + UINT8 DisGen5EQPhase : 1; ///< Gen5 Bypass phase2/3 EQ + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset value + + UINT16 PsppPolicyDC; ///< Pspp Policy DC + UINT16 PsppPolicyAC; ///< Pspp Policy AC + UINT8 PsppDeviceType; ///< Pspp Device Type + + LC_FAPE_GROUP_0 LcFapeSettingsGroup0; + LC_FAPE_GROUP_1 LcFapeSettingsGroup1; + LC_FAPE_GROUP_2 LcFapeSettingsGroup2; + LC_FAPE_GROUP_3 LcFapeSettingsGroup3; + LC_FAPE_GROUP_4 LcFapeSettingsGroup4; + LC_FAPE_GROUP_5 LcFapeSettingsGroup5; + LC_FAPE_GROUP_6 LcFapeSettingsGroup6; + + UINT8 ForceSteering : 1; ///< Steering is forced + UINT8 EsmUsTxPreset : 4; ///< ESM Upstream Tx Preset + UINT8 UNUSED13 : 3; ///< Currently unassigned - for alignment + + // Used by DXE + PORT_FEATURES PortFeatures; ///< Port Features CBS + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 I2CMuxInfo; ///< First I2c Mux on Bus + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:SRIS 2:SRNS 3:SRNS in SRIS 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 ClkReq : 4; ///< ClkReq:[0:3] + UINT8 EqPreset : 4; ///< EqPreset:[4:7] + UINT8 LinkAspmL1_1 : 1; ///< Enable PM L1 SS L1.1 + UINT8 LinkAspmL1_2 : 1; ///< Enable PM L1 SS L1.2 + UINT8 EsmControl : 1; ///< Bit to enable/disable ESM + UINT8 EsmDsTxPreset : 4; ///< ESM Downstream Tx Preset + UINT8 ClkReqFilterEn : 1; ///< Controls filtering of CLKREQb signal in LC in order to avoid false L1 substate entries/exits. +} PCIE_PORT_CONFIG; + +/// +/// CXL port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 UNUSED0 : 1; ///< Currently unassigned - for alignment + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 CxlIndex; + UINT8 CxlDeviceType : 2; ///< Type of CXL device connected + UINT8 CxlVersion : 2; ///< Version of CXL device connected (1=CXL1.1, 2=CXL2.0) + UINT8 IsCxlScanned : 1; ///< Indicates if the CXL device has been scanned + UINT8 ReportToMpioinDxe : 1; ///< Indicates if the CXL info needs to be reported to MPIO in DXE + UINT8 UNUSED1 : 2; ///< Currently unassigned - for alignment + + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT32 Mmio32Base; + UINT32 Mmio32Size; + UINT64 Mmio64Base; + UINT64 Mmio64Size; + UINT32 Mmio32Gran; +} PCIE_CXL_CONFIG; + +/// +/// Descriptor header +/// +typedef struct { + UINT32 DescriptorFlags; ///< Descriptor flags + UINT16 Parent; ///< Offset of parent descriptor + UINT16 Peer; ///< Offset of the peer descriptor + UINT16 Child; ///< Offset of the list of child descriptors +} PCIE_DESCRIPTOR_HEADER; + +/// +/// Engine configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor header + PCIE_ENGINE EngineData; ///< Engine Data + PCIE_ENGINE_INIT_STATUS InitStatus; ///< Initialization Status + UINT8 Scratch; ///< Scratch pad + union { + PCIE_PORT_CONFIG Port; ///< PCIe port configuration data + PCIE_CXL_CONFIG Cxl; ///< CXL Configuration data + } Type; +} PCIE_ENGINE_CONFIG; + +/// +/// Wrapper configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 WrapId; ///< Wrapper ID + UINT8 CcixCoreConfig; ///< Ccix CORE Configuration + UINT8 StartPhyLane; ///< Start PHY Lane + UINT8 EndPhyLane; ///< End PHY Lane + UINT8 StartDxioLane; ///< Start Dxio Lane (Translated) + UINT8 EndDxioLane; ///< End Dxio Lane (Translated) + struct { + UINT8 PowerOffUnusedLanes : 1; ///< Power Off unused lanes + UINT8 PowerOffUnusedPlls : 1; ///< Power Off unused Plls + UINT8 ClkGating : 1; ///< TXCLK gating + UINT8 LclkGating : 1; ///< LCLK gating + UINT8 TxclkGatingPllPowerDown : 1; ///< TXCLK clock gating PLL power down + UINT8 PllOffInL1 : 1; ///< PLL off in L1 + UINT8 AccessEncoding : 1; ///< Reg access encoding + UINT8 CoreReversed : 1; ///< Indicates lanes are reversed in package connection + } Features; + UINT8 MasterPll; ///< Bitmap of master PLL + UINT32 AcsSupport : 1; ///< Acs Support + UINT32 LtrSupport : 1; ///< LTR Support + UINT32 AriForwarding : 1; ///< ARI Forwarding + UINT32 LaneMargining : 1; ///< Lane Margining + UINT32 NativePCIeEnclosureManagement : 1; ///< NPEM + UINT32 DownstreamPortContainment : 1; ///< Downstream port containment + UINT32 AdvancedErrorReporting : 1; ///< Advacned Error Reporting + UINT32 ECRCSupport : 2; ///< ECRC Capability + UINT32 Reserved : 23; ///< Reserved bits +} PCIE_WRAPPER_CONFIG; + +/// +/// Silicon configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 SocketId; ///< Socket ID + UINT8 DieNumber; ///< Module ID + UINT8 RBIndex; ///< Physical Root Bridge + UINT8 InstanceId; ///< Logical Instance Identifier + PCI_ADDR Address; ///< PCI address of GNB host bridge + UINT16 StartLane; ///< Start Lane of this node + UINT16 EndLane; ///< End Lane of this node + UINT8 BusNumberLimit; ///< Last Bus Number assigned to this node + UINT8 SbPresent : 1; ///< Set to 1 if FCH connected to this NBIO + UINT8 SmuPresent : 1; ///< Set to 1 if SMU connected to this NBIO + UINT8 MP_Instance : 6; ///< MP Instance + UINT8 LogicalRBIndex; ///< Logical Root Bridge + UINT8 NumEngineDesc; ///< Total number of lane bifurcation descriptors +} PCIE_SILICON_CONFIG; + +typedef PCIE_SILICON_CONFIG GNB_HANDLE; + +/// +/// Complex configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 NodeId; ///< Processor Node ID + UINT8 Reserved; ///< For alignment +} PCIE_COMPLEX_CONFIG; + +/// +/// PCIe platform configuration info +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + PVOID Reserved1; ///< Reserved + UINT32 Reserved2; ///< Reserved + UINT32 PhyConfigData; ///< Phy Configuration Data + UINT32 Reserved3; ///< Reserved + UINT32 Reserved4; ///< Reserved + UINT32 PsppTuningParams; ///< Tuning parameters for PSPP + UINT32 PsppTuningParams2; ///< Tuning parameters 2 for PSPP + UINT8 Reserved5; ///< Reserved + UINT8 PsppPolicy; ///< PSPP policy + UINT8 Reserved6; ///< Reserved + UINT8 RootBridgesPerSocket; ///< Number of root bridges per socket + PCIE_COMPLEX_CONFIG ComplexList[MAX_NUMBER_OF_COMPLEXES]; ///< Complex +} PCIE_PLATFORM_CONFIG; + +/// +/// PCIe Engine Description +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor on wrapper + ///< Bit30 - Descriptor allocated for PCIe port + PCIE_ENGINE EngineData; ///< Engine Data +} PCIE_ENGINE_DESCRIPTOR; +#pragma pack (pop) + +#endif // GNBDXIO_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h new file mode 100644 index 0000000000..90f52cca7b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h @@ -0,0 +1,18 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _GNBREGISTERSRS_H_ +#define _GNBREGISTERSRS_H_ + +#include "GnbRegistersRS/IOHC.h" + +#ifndef NBIO_SPACE +#define NBIO_SPACE(HANDLE, ADDRESS) (ADDRESS + (HANDLE->RBIndex << 20)) +#endif + +#endif /*_GNBREGISTERSRS_H_*/ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h new file mode 100644 index 0000000000..b1a95237de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _IOHC_H_ +#define _IOHC_H_ + +// Bitfield Description : DBG MMIO enable. +#define DBG_BASE_ADDR_LO_DBG_MMIO_EN_OFFSET 0 + +// Bitfield Description : Locks the DBG MMIO address range and enable until the next warm reset. +#define DBG_BASE_ADDR_LO_DBG_MMIO_LOCK_OFFSET 1 + +#define SMN_IOHUB0NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13b102f0UL +#define IOAPIC_BASE_ADDR_LO_IOAPIC_BASE_ADDR_LO_MASK 0xffffff00 +#define SMN_IOHUB1NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13c102f0UL + +#endif /* _IOHC_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h new file mode 100644 index 0000000000..f5cc5e2228 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_PCIE_HOB_INFO_H_ +#define GNB_PCIE_HOB_INFO_H_ + +#define _GNB_PCIE_HOB_INFO_GUID \ +{ \ + 0x3eb1d90, 0xce14, 0x40d8, 0xa6, 0xba, 0x10, 0x3a, 0x8d, 0x7b, 0xd3, 0x2d \ +} +extern EFI_GUID gGnbPcieHobInfoGuid; + +#pragma pack (push, 1) +#define MAX_NUMBER_OF_CORES_PER_COMPLEX 3 +#define MAX_NUMBER_OF_PORTS_PER_COMPLEX 22 + +/// PCIe information HOB data +typedef struct _GNB_PCIE_INFORMATION_DATA_HOB { + EFI_HOB_GUID_TYPE EfiHobGuidType; ///< GUID Hob type structure + PCIE_PLATFORM_CONFIG PciePlatformConfigHob; ///< Platform Config Structure + UINT32 ComplexConfigs; ///< Allocation for Max Complex Structure suported +} GNB_PCIE_INFORMATION_DATA_HOB; + +#pragma pack (pop) + +#endif /* GNB_PCIE_HOB_INFO_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h new file mode 100644 index 0000000000..dc773737b9 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h @@ -0,0 +1,16 @@ +/** @file + Contains interface to the AMD AGESA library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_BASE_LIB_H_ +#define AMD_BASE_LIB_H_ + +#include "Uefi.h" +#include "AMD.h" + +#endif // AMD_BASE_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h new file mode 100644 index 0000000000..9d9892aa30 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h @@ -0,0 +1,43 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * PSP Mailbox related functions Prototype definition + * + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: PSP + * @e \$Revision: 312133 $ @e \$Date: 2015-02-03 02:47:45 +0800 (Tue, 03 Feb 2015) $ + */ + +#ifndef _PSP_MBOX_H_ +#define _PSP_MBOX_H_ + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ); + +#endif //_PSP_MBOX_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h new file mode 100644 index 0000000000..51935f413a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef BASE_FABRIC_TOPOLOGY_LIB_H_ +#define BASE_FABRIC_TOPOLOGY_LIB_H_ + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ); + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ); + +#endif // BASE_FABRIC_TOPOLOGY_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h new file mode 100644 index 0000000000..cae3aff9b3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h @@ -0,0 +1,16 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_BASE_LIB_H_ +#define _FCH_BASE_LIB_H_ + +#include <Library/IoLib.h> +#include <Library/PciLib.h> +#include <Library/BaseLib.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h new file mode 100644 index 0000000000..345e39adce --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h @@ -0,0 +1,413 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_ESPI_CMD_LIB_H_ +#define _FCH_ESPI_CMD_LIB_H_ + +#include <Uefi/UefiBaseType.h> + +#define MAX_ESPI_RETRY 100000ul +// +// Cycle Type +// +#define CYCLE_TYPE_FLASH_READ 0 +#define CYCLE_TYPE_FLASH_WRITE 1 +#define CYCLE_TYPE_FLASH_ERASE 2 +#define CYCLE_TYPE_RPMC_OP1 3 +#define CYCLE_TYPE_RPMC_OP2 4 + +// RPMC OP1/OP2 Command Payload Max Length (512 Bits) +#define RPMC_CMD_PAYLOAD_MAX_LEN 0x40 + +// +// Master Registers +// +#define SET_CONFIGURATION 0 +#define GET_CONFIGURATION 1 +#define IN_BAND_RESET 2 +#define PC_MSG_DOWN_STREAM 4 +#define VM_DOWN_STREAM 5 +#define OOB_DOWN_STREAM 6 +#define FA_DOWN_STREAM 7 + +// ESPIx00 +#define DNCMD_STATUS BIT3 + +// ESPIx2C Master Capability +#define MASTER_FA_SUPPORT BIT0 +#define MASTER_OOB_SUPPORT BIT1 +#define MASTER_VW_SUPPORT BIT2 +#define MASTER_PERIPHERAL_SUPPORT BIT3 + +// ESPIx68 Slave0 Configuration +#define SLAVE_FA_ENABLE BIT0 +#define SLAVE_OOB_ENABLE BIT1 +#define SLAVE_VW_ENABLE BIT2 +#define SLAVE_PC_ENABLE BIT3 + +/// eSPIx00 eSPI Software Specific Register 0 +#define ESPI_DN_TXHDR_0 0x00 +typedef union { + struct { + UINT32 SWCommandType : 3; + UINT32 CommandStatus : 1; + UINT32 PutFlashNpTranActive : 1; + UINT32 Reserved : 3; + UINT32 DnCmdHdata0 : 8; + UINT32 DnCmdHdata1 : 8; + UINT32 DnCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx00_DN_TXHDR0; + +/// eSPIx04 eSPI Software Specific Register 1 +#define ESPI_DN_TXHDR_1 0x04 +typedef union { + struct { + UINT32 DnCmdHdata3 : 8; + UINT32 DnCmdHdata4 : 8; + UINT32 DnCmdHdata5 : 8; + UINT32 DnCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx04_DN_TXHDR1; + +#define ESPI_DN_TXHDR_2 0x08 +typedef union { + struct { + UINT32 DnCmdHdata7 : 8; + UINT32 Reserved : 24; + } Field; + UINT32 Value; +} ESPIx08_DN_TXHDR2; + +#define ESPI_DN_TXDATA_PORT 0x0C +typedef union { + struct { + UINT32 DnTxData0 : 8; + UINT32 DnTxData1 : 8; + UINT32 DnTxData2 : 8; + UINT32 DnTxData3 : 8; + } Field; + UINT32 Value; +} ESPIx0C_DN_TXDATA_PORT; + +#define ESPI_UP_RXHDR_0 0x10 +typedef union { + struct { + UINT32 UpCommandType : 3; + UINT32 UpCommandStatus : 1; + UINT32 SlaveSel : 2; + UINT32 Reserved : 2; + UINT32 UpCmdHdata0 : 8; + UINT32 UpCmdHdata1 : 8; + UINT32 UpCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx10_UP_RXHDR0; + +#define ESPI_UP_RXHDR_1 0x14 +typedef union { + struct { + UINT32 UpCmdHdata3 : 8; + UINT32 UpCmdHdata4 : 8; + UINT32 UpCmdHdata5 : 8; + UINT32 UpCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx14_UP_RXHDR1; + +#define ESPI_UP_RXDATA_PORT 0x18 + +/// eSPIx2C eSPI Master Capability +#define ESPI_MASTER_CAP 0x2C +typedef union { + struct { + UINT32 FlashAccessChannelSupport : 1; + UINT32 OOBMessageChannelSupport : 1; + UINT32 VWChannelSupport : 1; + UINT32 PChannelSupport : 1; + UINT32 MasterVersion : 3; + UINT32 FlashAccessChannelMaxPayload : 3; + UINT32 OOBMessageChannelMaxPayload : 3; + UINT32 OperatingMaxVWCount : 6; + UINT32 PChannelMaxPayloadSize : 3; + UINT32 NumberOfSlave : 3; + UINT32 OperatingSupportFreq : 3; + UINT32 IOMode : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheck : 1; + } Field; + UINT32 Value; +} ESPIx2C_MASTER_CAP; + +/// eSPIx30 eSPI Global Control 0 +#define ESPI_GLOBAL_CTRL0 0x30 +typedef union { + struct { + UINT32 WdgEn : 1; + UINT32 WaitChkEn : 1; + UINT32 PrClkgatEn : 1; + UINT32 AlStopEn : 1; + UINT32 AlIdleTimer : 3; + UINT32 RgDbgclkGatingEn : 1; + UINT32 WdgCnt : 16; + UINT32 WaitCnt : 6; + UINT32 PrRstEnPltrst : 1; + UINT32 SafsClkGateEn : 1; + } Field; + UINT32 Value; +} ESPIx30_GLOBAL_CTRL0; + +/// eSPIx68 eSPI Slave0 Configuration +#define ESPI_SLAVE0_CONFIG 0x68 +typedef union { + struct { + UINT32 FlashAccessChannelEnable : 1; + UINT32 OOBMessageChannelEnable : 1; + UINT32 VWChannelEnable : 1; + UINT32 PChannelEnable : 1; + UINT32 FlashSharingMode : 1; + UINT32 FlashMaxPayloadSize : 3; + UINT32 PutFlashNpHeaderDataEn : 1; + UINT32 PutFlashNpHeaderEn : 1; + UINT32 SafsDeferValidEn : 1; + UINT32 FlashModifierEn : 1; + UINT32 Reserved_24_12 : 13; + UINT32 OperatingFreq : 3; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheckingEnable : 1; + } Field; + UINT32 Value; +} ESPIx68_SLAVE0_CONFIG; + +/// eSPIx70 eSPI Slave0 Interrupt Status +#define ESPI_SLAVE0_INT_STS 0x70 +typedef union { + struct { + UINT32 BusErrInt : 1; + UINT32 WaitTimeoutInt : 1; + UINT32 CrcErrInt : 1; + UINT32 Reserved_3 : 1; + UINT32 NoRspInt : 1; + UINT32 FatalErrInt : 1; + UINT32 NonFatalErrInt : 1; + UINT32 UnknownRspInt : 1; + UINT32 UnknownCtInt : 1; + UINT32 UnsucssCplInt : 1; + UINT32 IllegalTagInt : 1; + UINT32 IllegalLenInt : 1; + UINT32 RxOobOverflowInt : 1; + UINT32 RxMsgOverflowInt : 1; + UINT32 RxFlashOverflowInt : 1; + UINT32 ProtocolErrInt : 1; + UINT32 Reserved_16 : 1; + UINT32 UpFifoWdgTo : 1; + UINT32 MstAbortInt : 1; + UINT32 WdgTimeoutInt : 1; + UINT32 Reserved_23_20 : 4; + UINT32 RxVwGrp0Int : 1; + UINT32 RxVwGrp1Int : 1; + UINT32 RxVwGrp2Int : 1; + UINT32 RxVwGrp3Int : 1; + UINT32 DnCmdInt : 1; + UINT32 RxMsgInt : 1; + UINT32 RxOobInt : 1; + UINT32 FlashReqInt : 1; + } Field; + UINT32 Value; +} ESPIx70_SLAVE0_INT_STS; + +/// +/// Slave Registers +/// +#define SLAVE_REG_ID 0x04 +#define SLAVE_GENERAL_CAPCFG 0x08 +#define SLAVE_PC_CAPCFG 0x10 +#define SLAVE_VW_CAPCFG 0x20 +#define SLAVE_OOB_CAPCFG 0x30 +#define SLAVE_FA_CAPCFG 0x40 +#define SLAVE_FA_CAPCFG2 0x44 + +/// Offset 04h: Device Identification +typedef union { + struct { + UINT32 RO_VersionID : 8; + UINT32 Reserved_31_8 : 24; + } Field; + UINT32 Value; +} ESPI_SL04_DEVICE_ID; + +// SLAVE offset 0x08 SLAVE_GENERAL_CAPCFG +#define SLAVE_FA_SUPPORT BIT3 +#define SLAVE_OOB_SUPPORT BIT2 +#define SLAVE_VW_SUPPORT BIT1 +#define SLAVE_PERIPHERAL_SUPPORT BIT0 +/// Offset 08h: General Capabilities and Configurations +typedef union { + struct { + UINT32 RO_PCSupported : 1; + UINT32 RO_VWSupported : 1; + UINT32 RO_OOBMsgSupported : 1; + UINT32 RO_FASupported : 1; + UINT32 Reserved_7_3 : 4; + UINT32 Reserved_11_8 : 4; + UINT32 RO_MaxWaitStateAllowed : 4; + UINT32 RO_MaxFreqSupported : 3; + UINT32 RO_OpenDrainAlertSupported : 1; + UINT32 OperatingFreq : 3; + UINT32 OpenDrainAlertSelect : 1; + UINT32 RO_IOModeSupported : 2; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 Reserved_29 : 1; + UINT32 ResponseModifierEn : 1; + UINT32 CRCCheckingEn : 1; + } Field; + UINT32 Value; +} ESPI_SL08_SLAVE_GENERAL_CAPCFG; + +/// Offset 10h: Channel 0 Capabilities and Configurations +typedef union { + struct { + UINT32 PCEn : 1; + UINT32 RO_PCReady : 1; + UINT32 BusMasterEn : 1; + UINT32 Reserved_3 : 1; + UINT32 RO_PCMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 PCMaxPayloadSizeSelected : 3; + UINT32 Reserved_11 : 1; + UINT32 PCMaxReadRequestSize : 3; + UINT32 Reserved_31_15 : 17; + } Field; + UINT32 Value; +} ESPI_SL10_SLAVE_PC_CAPCFG; + +/// Offset 20h: Channel 1 Capabilities and Configurations +typedef union { + struct { + UINT32 VWEn : 1; + UINT32 RO_VWReady : 1; + UINT32 Reserved_7_2 : 6; + UINT32 RO_MaxVWCntSupported : 6; + UINT32 Reserved_15_14 : 2; + UINT32 OpMaxVWCnt : 6; + UINT32 Reserved_31_22 : 10; + } Field; + UINT32 Value; +} ESPI_SL20_SLAVE_VW_CAPCFG; + +/// Offset 30h: Channel 2 Capabilities and Configurations +typedef union { + struct { + UINT32 OOBEn : 1; + UINT32 RO_OOBReady : 1; + UINT32 Reserved_3_2 : 2; + UINT32 RO_MsgChMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 MsgChMaxPayloadSizeSelected : 3; + UINT32 Reserved_31_11 : 21; + } Field; + UINT32 Value; +} ESPI_SL30_SLAVE_OOB_CAPCFG; + +/// Offset 40h: Channel 3 Capabilities and Configurations +typedef union { + struct { + UINT32 FAEn : 1; + UINT32 RO_FAReady : 1; + UINT32 FlashBlockEraseSize : 3; + UINT32 RO_ChMaxPayloadSizeSupported : 3; + UINT32 ChMaxPayloadSizeSelected : 3; + UINT32 RO_FlashSharingMode : 1; + UINT32 ChMaxReadReqSize : 3; + UINT32 Reserved_15 : 1; + UINT32 RO_FlashSharingCapabilitySupported : 2; + UINT32 Reserved_19_18 : 2; + UINT32 RO_RPMCCounterOn1stDevice : 4; + UINT32 RO_RPMCOp1On1stDevice : 8; + } Field; + UINT32 Value; +} ESPI_SL40_SLAVE_FA_CAPCFG; + +/// Offset 44h: Channel 3 Capabilities and Configurations2 +typedef union { + struct { + UINT32 RO_TargetMaxReadReqSizeSupported : 3; + UINT32 Reserved_7_3 : 5; + UINT32 RO_TargetFlashEraseBlockSize : 8; + UINT32 RO_TargetRPMCSupported : 6; + UINT32 RO_NumOfRPMCdevices : 2; + UINT32 Reserved_31_24 : 8; + } Field; + UINT32 Value; +} ESPI_SL44_SLAVE_FA_CAPCFG2; + +// +// eSPI Command functions +// +VOID +FchEspiCmd_InBandRst ( + IN UINT32 EspiBase + ); + +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ); + +VOID +FchEspiCmd_SetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr, + IN UINT32 Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp1 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + IN UINT8 *Data + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp2 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h new file mode 100755 index 0000000000..19688e2548 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h @@ -0,0 +1,16 @@ +/** @file + GNB PCIe Library definition. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBPCIECONFIG_LIB_H_ +#define GNBPCIECONFIG_LIB_H_ + +#include <GnbDxio.h> +#include <Library/PcieConfigLib.h> + +#endif // GNBPCIECONFIG_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h new file mode 100644 index 0000000000..df88274530 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h @@ -0,0 +1,37 @@ +/** @file + Header file of AMD NBIO Common DXE library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOCOMMONLIBDXE_H_ +#define NBIOCOMMONLIBDXE_H_ + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ); + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ); + +#endif // NBIOCOMMONLIBDXE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h new file mode 100755 index 0000000000..4fec578a9f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h @@ -0,0 +1,62 @@ +/** @file + GNB function to GetHostPciAddress and GetHandle. + Contain code that create/locate and rebase configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOHANDLELIB_LIB_H_ +#define NBIOHANDLELIB_LIB_H_ + +#include <GnbDxio.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ); + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ); + +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define GnbGetSocketId(Handle) (Handle != NULL ? (Handle)->SocketId : 0) +#define GnbGetDieNumber(Handle) (Handle != NULL ? (Handle)->DieNumber : 0) +#define GnbGetRBIndex(Handle) (Handle != NULL ? (Handle)->RBIndex : 0) + +#endif // NBIOHANDLELIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h new file mode 100644 index 0000000000..9f53746814 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h @@ -0,0 +1,283 @@ +/** @file + Helper functions to access PCIe configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PCIECONFIGLIB_LIB_H_ +#define PCIECONFIGLIB_LIB_H_ + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_WRAPPER_CALLBACK) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK2) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +typedef VOID (*PCIE_RUN_ON_WRAPPER_CALLBACK2) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_DESCRIPTOR_CALLBACK) ( + IN PCIE_DESCRIPTOR_HEADER *Descriptor, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ); + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ); + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ); + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ); + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ); + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ); + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ); + +#define PcieConfigGetParentWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetParent (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetParentSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetParent (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetParentComplex(Descriptor) ((PCIE_COMPLEX_CONFIG *) PcieConfigGetParent (DESCRIPTOR_COMPLEX, &((Descriptor)->Header))) +#define PcieConfigGetPlatform(Descriptor) ((PCIE_PLATFORM_CONFIG *) PcieConfigGetParent (DESCRIPTOR_PLATFORM, &((Descriptor)->Header))) +#define PcieConfigGetChildWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetChildEngine(Descriptor) ((PCIE_ENGINE_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_ENGINES, &((Descriptor)->Header))) +#define PcieConfigGetChildSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetChild (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetNextDescriptor(Descriptor) ((((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : ((Descriptor + 1)))) +#define PcieConfigIsPcieEngine(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_ENGINE) != 0) : FALSE) +#define PcieConfigIsSbPcieEngine(Engine) ((Engine != NULL) ? ((BOOLEAN) (Engine->Type.Port.PortData.MiscControls.SbLink)) : FALSE) +#define PcieConfigIsEngineAllocated(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_ALLOCATED) != 0) : FALSE) +#define PcieConfigSetDescriptorFlags(Descriptor, SetDescriptorFlags) if (Descriptor != NULL) (Descriptor)->Header.DescriptorFlags |= SetDescriptorFlags +#define PcieConfigResetDescriptorFlags(Descriptor, ResetDescriptorFlags) if (Descriptor != NULL) ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags &= (~(ResetDescriptorFlags)) +#define PcieInputParsetGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) +#define PcieConfigGetNextTopologyDescriptor(Descriptor, Termination) ((Descriptor == NULL) ? NULL : ((((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags & Termination) != 0) ? NULL : ((UINT8 *) Descriptor + ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->Peer)) +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define PcieConfigGetNextDataDescriptor(Descriptor) ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0 ? NULL : (Descriptor + 1)) + +#endif // PCIECONFIGLIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h new file mode 100644 index 0000000000..f0c6d1ccbb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _SMNACCESSLIB_H_ +#define _SMNACCESSLIB_H_ + +VOID +SmnRegisterReadS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + OUT VOID *Value + ); + +VOID +SmnRegisterRMWS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + IN UINT32 AndMask, + IN UINT32 OrValue, + IN UINT32 Flags + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h new file mode 100644 index 0000000000..0e08e64b24 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h @@ -0,0 +1,47 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_PCIE_SERVICES_PROTOCOL_H_ +#define NBIO_PCIE_SERVICES_PROTOCOL_H_ + +// Current PROTOCOL revision +#define AMD_NBIO_PCIE_SERVICES_REVISION 0x00 + +/// +/// Forward declaration for the NBIO_PCIE_SERVICES_PROTOCOL +/// +typedef struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL; + +// +// Protocol Definitions +// + +/** + Returns the NBIO debug options configuration structure + This + A pointer to the DXE_AMD_NBIO_SMU_SERVICES_PROTOCOL instance. + DebugOptions + A pointer to a pointer to store the address of the PCIe topology structure +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT)( + IN DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL *This, + OUT UINT32 **DebugOptions + ); + +/// +/// The Dxe of PCIE Services +/// +struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL { + AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT PcieGetTopology; ///< +}; + +extern EFI_GUID gAmdNbioPcieServicesProtocolGuid; + +#endif /* NBIO_PCIE_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h new file mode 100644 index 0000000000..10d3b730a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_OEM_OOB_PPR_PROTOCOL_H_ +#define _AMD_OEM_OOB_PPR_PROTOCOL_H_ + +extern EFI_GUID gAmdOemOobPprDxeProtocolGuid; + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h new file mode 100644 index 0000000000..a15995188b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h @@ -0,0 +1,155 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_NUMA_SERVICES2_H_ +#define FABRIC_NUMA_SERVICES2_H_ +#include "AMD.h" + +#pragma pack (push, 1) + +#define MAX_PXM_VALUES_PER_QUADRANT 16 + +/// Domain type +typedef enum { + NumaDram, + NumaSLink, + NumaCxl, + MaxNumaDomainType2 +} DOMAIN_TYPE2; + +/// Reported Domain Info +typedef struct { + DOMAIN_TYPE2 Type; ///< Type + UINT32 SocketMap; ///< Bitmap indicating physical socket location + UINT32 PhysicalDomain; ///< Physical domain number +} DOMAIN_INFO2; + +/// Physical Dram Info +typedef struct { + UINT32 NormalizedCsMap; ///< Bitmap of CSs comprising this physical domain + UINT32 SharingEntityCount; ///< Number of virtual domains sharing this physical domain + UINT32 SharingEntityMap; ///< Bitmap of reported domains that share this physical domain + UINT32 Reserved; ///< Reserved +} PHYS_DOMAIN_INFO; + +/// Proximity Domain Info +typedef struct { + UINTN Count; ///< Entries in Domain array + UINTN Domain[MAX_PXM_VALUES_PER_QUADRANT]; ///< Domains in Quadrant +} PXM_DOMAIN_INFO; + +/// +/// Forward declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL +/// +typedef struct _FABRIC_NUMA_SERVICES2_PROTOCOL FABRIC_NUMA_SERVICES2_PROTOCOL; + +/** + * @brief Get the numa domain information. + * + * @details Get the numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfDomainsInSystem Number of unique NUMA domains + * @param[out] DomainInfo An array with information about each domain + * @param[out] CcxAsNumaDomain TRUE: each core complex is its own domain + * FALSE: physical mapping is employed + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfDomainsInSystem, + OUT DOMAIN_INFO2 **DomainInfo, + OUT BOOLEAN *CcxAsNumaDomain + ); + +/** + * @brief Translates a core's physical location to the appropriate NUMA domain. + * + * @details Translates a core's physical location to the appropriate NUMA domain. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] Socket Zero based socket that the core is attached to + * @param[in] Die DF die on socket that the core is attached to + * @param[in] Ccd Logical CCD the core is on + * @param[in] Ccx Logical core complex + * @param[out] Domain Domain the core belongs to + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_DOMAIN_XLAT)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN UINTN Socket, + IN UINTN Die, + IN UINTN Ccd, + IN UINTN Ccx, + OUT UINT32 *Domain + ); + +/** + * @brief Get physical numa domain information. + * + * @details Get physical numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfPhysDomainsInSystem Number of valid domains in the system + * @param[out] PhysDomainInfo An array with information about each physical domain + * @param[out] PhysNodesPerSocket Actual NPS as determined by ABL (not including SLink) + * @param[out] NumberOfSystemSLinkDomains Number of domains describing SLink connected memory + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfPhysDomainsInSystem, + OUT PHYS_DOMAIN_INFO **PhysDomainInfo, + OUT UINT32 *PhysNodesPerSocket, + OUT UINT32 *NumberOfSystemSLinkDomains + ); + +/** + * @brief Get the proximity domain information about a PCIe root-port bridge + * + * @details Get the proximity domain information about a PCIe root-port bridge + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] RootPortBDF BDF for root-port bridge in PCI_ADDR format. + * @param[out] PxmDomainInfo Pointer to a structure returning associated NUMA node(s). + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN PCI_ADDR RootPortBDF, + OUT PXM_DOMAIN_INFO *PxmDomainInfo + ); + +/// +/// When installed, the Fabric NUMA Services 2 Protocol produces a collection of +/// services that return various information associated with non-uniform memory +/// architecture. +/// +struct _FABRIC_NUMA_SERVICES2_PROTOCOL { + UINTN Revision; ///< Revision Number + FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO GetDomainInfo; ///< Get Domain Info + FABRIC_NUMA_SERVICES2_DOMAIN_XLAT DomainXlat; ///< Domain Translation + FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO GetPhysDomainInfo; ///< Get Physical Domain Info + FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO GetPxmDomainInfo; ///< Get Proximity Domain Info +}; + +/// +/// Guid declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL. +/// +extern EFI_GUID gAmdFabricNumaServices2ProtocolGuid; + +#pragma pack (pop) +#endif // _FABRIC_NUMA_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h new file mode 100644 index 0000000000..485240c0fb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_TOPOLOGY_SERVICES2_H_ +#define FABRIC_TOPOLOGY_SERVICES2_H_ + +#include <Library/BaseFabricTopologyLib.h> + +#endif // FABRIC_TOPOLOGY_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h new file mode 100755 index 0000000000..44093e4097 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h @@ -0,0 +1,23 @@ +/** @file + SoC Logical ID Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SOC_LOGICAL_ID_H_ +#define SOC_LOGICAL_ID_H_ +#pragma pack (push, 1) + +/// +/// SOC logical ID structure +/// +typedef struct _SOC_LOGICAL_ID { + IN OUT UINT32 Family; ///< Indicates logical ID Family + IN OUT UINT16 Revision; ///< Indicates logical ID Revision +} SOC_LOGICAL_ID; + +#pragma pack (pop) +#endif // SOC_LOGICAL_ID_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h new file mode 100644 index 0000000000..a60ae20d33 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h @@ -0,0 +1,100 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_LIB_H_ +#define _INTERNAL_AML_LIB_H_ + +#include <Uefi.h> +#include <Library/AmlGenerationLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <IndustryStandard/Acpi.h> + +#include "LocalAmlObjects.h" + +// EDK2 open source MdePkg/Include/IndustryStandard/AcpiAml.h does not have +// these and should. +#define AML_DIGIT_CHAR_0 0x30 +#define AML_DIGIT_CHAR_9 0x39 + +// The max string size for a QWord is 8 bytes = 16 characters plus NULL Terminator +#define MAX_AML_DATA_INTEGER_SIZE 17 + +// Defines similar to ctype.h functions isalpha() and isdigit() +#define IS_ASCII_UPPER_ALPHA(c) ( ((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_Z) ) +#define IS_ASCII_HEX_DIGIT(c) ( (((c) >= AML_DIGIT_CHAR_0) && ((c) <= AML_DIGIT_CHAR_9)) ||\ + (((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_F)) ) + +// Swap bytes of upper and lower WORDs within a DWORD +#define Swap4Bytes(val) \ + ( (((val) >> 8) & 0x000000FF) | (((val) << 8) & 0x0000FF00) | \ + (((val) >> 8) & 0x00FF0000) | (((val) << 8) & 0xFF000000) ) + +/* + Calculates the optimized integer value used by AmlDataInteger and others + + Not a public function so no doxygen comment identifiers. + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ); + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ); + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - Field NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h new file mode 100644 index 0000000000..b19b6fe867 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h @@ -0,0 +1,150 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_OBJECTS_H_ +#define _INTERNAL_AML_OBJECTS_H_ + +// #include "LocalAmlLib.h" + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **Object, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ); + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ); + +#endif // _INTERNAL_AML_OBJECTS_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h new file mode 100755 index 0000000000..3a628ed0b2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h @@ -0,0 +1,432 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCIE_COMPLEX_H_ +#define AMD_PCIE_COMPLEX_H_ + +// +// GNB PCIe configuration info +// +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull + +// +// Port parameter count +// +#define PCIE_PORT_PARAMETER_COUNT 64 + +/// +/// PCIe link initialization +/// DXIO endpoint status +/// +typedef enum { + DxioEndpointDetect = 0, ///< Detect endpoint presence + DxioEndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} DXIO_ENDPOINT_STATUS; + +#pragma pack(push,1) +typedef struct { + UINT16 ParamType; ///< This identifies a specific port parameter to set. + UINT16 ParamValue; ///< Specifies the value to be assigned to port parameter. +} PORT_PARAM; + +typedef struct { + PORT_PARAM PhyParam[PCIE_PORT_PARAMETER_COUNT]; ///< PHY port parameter +} PORT_PARAMS; + +/// +/// Ancillary data struct with table size and address +/// +typedef struct { + IN UINT32 Count; ///< Total count in this Ancillary data table + IN UINT32 Ovrd; ///< Ancillary data table address point to ANC_DATA_PARAM[] +} ANC_DATA; + +typedef struct { + UINT16 ParamType; ///< This identifies a specific PHY parameter + UINT16 ParamValue; ///< This specifies the value to be assigned to indicated PHY parameter +} DXIO_PHY_PARAM; + +typedef struct { + DXIO_PHY_PARAM PhyParam[44]; ///< physical parameter +} PHY_DATA; + +/// +/// PCIe specific data structures +/// PCIe port misc extended controls +/// +typedef struct { + UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + UINT8 LinkSafeMode : 1; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through DXIO_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertize muximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + UINT8 ChannelType : 3; ///< Channel Type + ///< 0 - Channel Type Not Specified + ///< - Channel Type Short Trace + ///< 2 - Channel Type Long Trace + UINT8 TurnOffUnusedLanes : 1; ///< Turn Off Unused Lanes + ///< 0 - Turn on + ///< 1 - Turn off +} DXIO_PORT_MISC_CONTROL; + +/// +/// The IO APIC Interrupt Mapping Info +/// +typedef struct { + UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< 0 - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< 1 - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< 2 - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< ... + ///< 8 - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< 0 - ABCD + ///< 1 - BCDA + ///< 2 - CDAB + ///< 3 - DABC + UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< 0 - Entry 0 of IO APIC redirection table + ///< 1 - Entry 1 of IO APIC redirection table + ///< ... + ///< 31 - Entry 31 of IO APIC redirection table +} DXIO_APIC_DEVICE_INFO; +/// +/// PCIe port configuration data +/// +typedef struct { + UINT8 PortPresent : 1; ///< Enable PCIe port for initialization. + UINT8 Reserved1 : 2; ///< Reserved + UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + UINT8 FunctionNumber : 3; ///< Reserved for future use + UINT8 LinkSpeedCapability : 3; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + ///< 4 - Gen4 + ///< 5 - Gen5 + UINT8 AutoSpdChng : 2; ///< Upstread Auto Speed Change Allowed/ + ///< 0 - Use default implementation (Disabled for Gen1, Enabled for Gen2/3) + ///< 1 - Always Disabled + ///< 2 - Always Enabled + ///< 3 - Reserved + UINT8 EqPreset : 4; ///< Gen3 Equalization Preset */ + UINT8 LinkAspm : 2; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + UINT8 LinkAspmL1_1 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 LinkAspmL1_2 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 ClkReq : 4; ///< ASPM Reserved Field + ///< 0 - NONE + ///< 1 - CLKREQ0 signal + ///< 2 - CLKREQ1 signal + ///< 3 - CLKREQ2 signal + ///< 4 - CLKREQ3 signal + ///< 5 - CLKREQG signal + UINT8 LinkHotplug : 4; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + UINT8 SlotPowerLimit; ///< PCIe slot power limit. + UINT8 SlotPowerLimitScale : 2; ///< PCIe slot power limit Scale. + ///< 00b = 1.0x + ///< 01b = 0.1x + ///< 10b = 0.01x + ///< 11b = 0.001x + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 Gen4Features : 5; ///< Unused bits + ///< BIT0(DLF_Exchange) 1 - Disable, 0 - Enable + ///< IT1(DLF_Capability) 1 - Disable, 0 - Enable + UINT16 SlotNum : 13; ///< PHYSICAL_SLOT_NUM + UINT16 CsLink : 3; ///< Reserved + DXIO_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + DXIO_APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + DXIO_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 EsmControl : 1; ///< Enhanced speed mode control + UINT8 CcixControl : 1; ///< Ccix/Cxl control + UINT8 TxVetting : 1; ///< Tx Vetting + UINT8 RxVetting : 1; ///< Rx Vetting + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + UINT8 NtbHotplug : 1; ///< NTB Hotplug flag + ///< 0b = Disabled + ///< 1b = Enabled + UINT8 Reserved2 : 1; ///< Reserved + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 Reserved3 : 5; ///< Reserved + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset + UINT8 Reserved4 : 4; ///< Reserved + UINT16 PsppPolicyDC; ///< Pspp DC control + UINT16 PsppPolicyAC; ///< PSPP AC control + UINT8 PsppDeviceType; ///< Pspp Device Type + UINT8 DisGen3EQPhase : 1; ///< Gen3 Bypass phase2/3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 TXDeEmphasisOride : 1; ///< Override Gen2 DXIO deemphasis default + UINT8 TXDeEmphasis : 2; ///< Gen2 DXIO deemphasis setting + UINT8 Reserved5 : 3; ///< Reserved + struct { + UINT16 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT16 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT16 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT16 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT16 Reserved1 : 2; ///< Unused bits + UINT8 SetDsTxPreset : 1; ///< Gen3 Set Downstream Tx Preset + UINT8 SetDsRxPresetHint : 1; ///< Gen3 Set Downstream Rx Preset Hint + UINT8 SetUsTxPreset : 1; ///< Gen3 Set Upstream Tx Preset + UINT8 SetUsRxPresetHint : 1; ///< Gen3 Set Upstream Rx Preset Hint + UINT8 Reserved2 : 4; ///< Unused bits + } LaneEqualizationCntl; ///< Lane equalization control structure used for Gen3 values + struct { + UINT8 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen4 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen4 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen4LaneEqualizationCntl; ///< Lane equalization control structure used for Gen4 values + struct { + UINT8 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen5 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen5 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen5LaneEqualizationCntl; ///< Lane equalization control structure used for Gen5 values + struct { + UINT32 PresetMask8Gt : 10; ///< Preset Mask 8GT. + UINT32 PresetMask16Gt : 10; ///< Preset Mask 16GT. + UINT32 PresetMask32Gt : 10; ///< Preset Mask 32GT. + UINT32 Reserved1 : 2; ///< Unused bits + UINT8 SetPresetMask8Gt : 1; ///< Preset Mask 8GT Set + UINT8 SetPresetMask16Gt : 1; ///< Preset Mask 16GT Set + UINT8 SetPresetMask32Gt : 1; ///< Preset Mask 32GT Set + UINT8 Reserved2 : 5; ///< Unused bits + } PresetMaskCntl; ///< Preset Mask control structure used for Gen3/Gen4/Gen5 values + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 BypassGen3EQ : 1; ///< Bypass Gen3 equalization + UINT8 BypassGen4EQ : 1; ///< Bypass Gen4 equalization + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:Enable 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 IsBmcLocation : 1; ///< IsBmcLocation + UINT8 SetEsmControl : 1; ///< Set ESM Control + UINT8 SetEsmSpeedBump : 1; ///< Set Speed bump for ESM + UINT8 Reserved6 : 1; ///< Unused bits + UINT8 I2CMuxInfo : 6; ///< Legacy I2c switch + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 Reserved7 : 1; ///< Unused bits + UINT16 NpemEnable : 12; ///< Controls NPEM Enable + UINT16 Reserved8 : 4; ///< Unused bits + UINT16 NpemCapability : 12; ///< Controls NPEM Capability + UINT8 SwingMode : 3; ///< PCIe Swing Mode + UINT16 Reserved9 : 1; ///< Unused bits + UINT16 MpioAncDataIdx; ///< Reserved for internal use only + UINT8 Reserved10; ///< Reserved bits +} DXIO_PORT_DATA; + +/// +/// EtherNet specific data structures +/// +typedef struct { + UINT32 PortNum : 8; ///< Port Number + UINT32 PlatConf : 4; ///< Platform Config + ///< 0 = Reserved + ///< 1 = 10G/1G BackPlane + ///< 2 = 2.5G BackPlane + ///< 3= Soldered down 1000Base-T + ///< 4 = Soldered down 1000Base-X + ///< 5 = Soldered down NBase-T + ///< 6 = Soldered down 10GBase-T + ///< 7 = Soldered down 10GBase-r + ///< 8 = SFP+ Connector + UINT32 Reserved1 : 4; ///< Unused 12-15 + UINT32 MdioId : 5; ///< MDIO ID when MDIO Side band is used + UINT32 Reserved2 : 2; ///< Unused 21-22 + UINT32 SuppSpeed : 4; ///< Supported Speeds by Platform + ///< 1 = 100M Supported + ///< 2 = 1G Supported + ///< 4 = 2.5G Supported + ///< 8 = 10G Supported + UINT32 Reserved3 : 1; ///< Unused 27 + UINT32 ConnType : 3; ///< Supported Speeds by Platform + ///< 0 = Port not Used + ///< 1 = SFP+ Connection I2C interface + ///< 2 = MDIO PHY + ///< 4 = Backplane Connection + UINT32 Reserved4 : 1; ///< Unused 31 +} ETH_PORT_PROPERTY0; + +typedef struct { + UINT32 MdioReset : 2; ///< MDIO Reset Type + ///< 0 = None + ///< 1 = I2C GPIO + ///< 2 = Integrated GPIO + ///< 3 = Reserved + UINT32 Reserved1 : 2; ///< Unused 2-3 + UINT32 MdioGpioResetNum : 2; ///< Integrated GPIO number for reset + UINT32 Reserved2 : 2; ///< Unused 6-7 + UINT32 SfpGpioAdd : 3; ///< Lower I2C address of GPIO Expander PCA9535 + UINT32 Reserved3 : 1; ///< Unused 11 + UINT32 TxFault : 4; ///< TX FAULT + UINT32 Rs : 4; ///< RS Signal + UINT32 ModAbs : 4; ///< MOD_ABS signal + UINT32 RxLoss : 4; ///< Rx_LOS signal + UINT32 SfpGpioMask : 4; ///< SFP+ sideband signals that are not supported by platform +} ETH_PORT_PROPERTY3; + +typedef struct { + UINT32 SfpMux : 3; ///< Lower address of Mux PCA 9545 + UINT32 Reserved1 : 1; ///< Unused 3 + UINT32 SfpBusSeg : 3; ///< SFP BUS Segment. Downstream channels of PCA9545 + UINT32 Reserved2 : 1; ///< Unused 7 + UINT32 SfpMuxUpAdd : 5; ///< Upper address of Mux PCA 9545 + UINT32 Reserved3 : 3; ///< Unused 13-15 + UINT32 RedriverAddress : 7; ///< Address of ReDriver + UINT32 RedriverInterface : 1; ///< ReDriver Interface Descriptor + UINT32 RedriverLane : 3; ///< ReDriver Lane number + UINT32 Reserved4 : 1; ///< Unused 27 + UINT32 RedriverModel : 3; ///< ReDriver Model + UINT32 RedriverPresent : 1; ///< Redriver Present +} ETH_PORT_PROPERTY4; + +typedef struct { + UINT32 TxEqPre : 6; ///< TX EQ PRE + UINT32 Reserved1 : 2; ///< Unused 7-6 + UINT32 TxEqMain : 6; ///< TX EQ MAIN + UINT32 Reserved2 : 2; ///< Unused 15-14 + UINT32 TxEqPost : 6; ///< TX EQ POST + UINT32 Reserved3 : 10; ///< Unused 31-23 +} ETH_PORT_TXEQ; +/// Ethernet PCIe port configuration data +/// +typedef struct { + ETH_PORT_PROPERTY0 EthPortProp0; ///< XGBE_PORT_PROPERTY_0 + ETH_PORT_PROPERTY3 EthPortProp3; ///< XGBE_PORT_PROPERTY_3 + ETH_PORT_PROPERTY4 EthPortProp4; ///< XGBE_PORT_PROPERTY_4 + UINT32 PadMux0; ///< PadMux0 Setting (8 bits) + UINT32 PadMux1; ///< PadMux1 Setting (8 bits) + UINT32 MacAddressLo; ///< Lower 32 bits of MAC Address + UINT32 MacAddressHi; ///< Upper 32 bits of MAC Address + ETH_PORT_TXEQ EthPortTxEq; ///< TX EQ Settings +} ETHERNET_PORT_DATA; + +/// +/// High level data structures for passing topology from platform to AGESA +/// +typedef struct { + UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + UINT8 HotPluggable : 1; ///< HotPluggable + ///< 0 - Link is NOT Hot-Switchable + ///< 1 - Link IS Hot-Switchable + UINT8 Reserved1 : 7; ///< Unused field, leave as 0 + UINT8 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 GpioGroupId; ///< Unique identifier for the GPIO or GPIO group associated with + ///< this engine. GPIOs are used for hotplug notification and link + ///< type (e.g SATA Express or PCIe) + UINT8 DxioStartLane; ///< Internal coding of start lane + UINT8 DxioEndLane; ///< Internal coding of end lane + UINT8 SearchDepth; ///< SearchDepth only uses 1 bit - always initialize to 0 will be updated dynamically +} DXIO_ENGINE_DATA; + +/// +/// PCIe port descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in complex + DXIO_ENGINE_DATA EngineData; ///< Engine data + DXIO_PORT_DATA Port; ///< PCIe port specific configuration info + ETHERNET_PORT_DATA EtherNet; ///< Ancillary data for EtherNet + PHY_DATA Phy; ///< Ancillary data for PHY programming customization + PORT_PARAMS PortParams; ///< Extensible port parameter list for simplified topology structure + ANC_DATA AncData; ///< Ancillary data override +} DXIO_PORT_DESCRIPTOR; + +#pragma pack(pop) + +/// +/// +/// PCIe Complex descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR *PciePortList; ///< Pointer to array of PCIe port descriptors or NULL (Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST). + VOID *Reserved2; ///< Reserved for future use + UINT8 BmcLinkLocation; ///< Identifies the socket/die location of a BMC link (Used by AGESA, input not required) + UINT8 BmcLinkLaneNum; ///< Identifies the socket/die location of a BMC Lane number + UINT8 Reserved3[2]; ///< Reserved for future +} DXIO_COMPLEX_DESCRIPTOR; + +/// +/// Engine descriptor type +/// +typedef enum { + DxioUnusedEngine = 0, ///< Unused descriptor Excluded from configuration + DxioPcieEngine = 1, ///< PCIe port + DxioUSBEngine = 2, ///< USB port + ///< __Deprecated__ + DxioSATAEngine = 3, ///< SATA + DxioUSB_OVER_PCIE = 4, ///< USB4 PCIe (internal use only) + DxioUBMHFCEngine = 5, ///< New for Genoa UBM HFC Connector for auto-discovery + DxioOCP3Engine = 6, ///< New for Genoa OCP3 Bifurcatable Connector + DxioUdot3Engine = 7, ///< New for Genoa U.3 Multiprotocol Connector + DxioDPEngine = 8, ///< Digital Display __For APU display connector list__ + DxioEthernetEngine = 0x10, ///< Ethernet (GBe, XGBe) + ///< __Deprecated__ + DxioGOPEngine = 0x20, ///< GOP + ///< __Deprecated__ + DxioNTBDevice = 0x60, ///< For NBIF NTB Enable (internal use only) + DxioHDaudioEngine, ///< For NBIF HDaudtio Enable (internal use only) + DxioACPEngine, ///< For NBIF ACP Enable (internal use only) + DxioMP2Engine, ///< For NBIF MP2 Enable (internal use only) + DxioMaxPcieEngine ///< Max engine type for boundary check. +} DXIO_ENGINE_TYPE; + +/// +/// PCIe link speeds +/// +typedef enum { + DxioGenMaxSupported, ///< Maximum supported + DxioGen1 = 1, ///< Gen1 + DxioGen2, ///< Gen2 + DxioGen3, ///< Gen3 + DxioGen4, ///< Gen4 + DxioGen5, ///< Gen5 + MaxDxioGen ///< Max Gen for boundary check +} DXIO_LINK_SPEEDS; +#endif // AMD_PCIE_COMPLEX_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdSoc.h b/Platform/AMD/AgesaPkg/Include/AmdSoc.h new file mode 100644 index 0000000000..d62f260235 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdSoc.h @@ -0,0 +1,17 @@ +/** @file + + Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_SOC_H_ +#define _AMD_SOC_H_ + +#define F1A_BRH_A0_RAW_ID 0x00B00F00ul +#define F1A_BRH_B0_RAW_ID 0x00B00F10ul +#define F1A_BRH_B1_RAW_ID 0x00B00F11ul +#define F1A_BRHD_A0_RAW_ID 0x00B10F00ul +#define F1A_BRHD_B0_RAW_ID 0x00B10F10ul +#endif // _AMD_SOC_H_ diff --git a/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h new file mode 100644 index 0000000000..2291f7dc83 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h @@ -0,0 +1,42 @@ +/** @file + Fabric resource manager common definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_CMN_H_ +#define FABRIC_RESOURCE_MANAGER_CMN_H_ +#pragma pack (push, 1) + +#define MAX_SOCKETS_SUPPORTED 2 ///< Max number of sockets in system. +#define MAX_RBS_PER_SOCKET 20 ///< Max number of root bridges per socket. + +/** + * @brief DF address aperture structure. + * @details This contains information used to define an MMIO region. + */ +typedef struct _FABRIC_ADDR_APERTURE { + UINT64 Base; ///< Aperture base Address. + UINT64 Size; ///< Aperture size. + UINT64 Alignment; ///< Alignment bit map. 0xFFFFF means 1MB align. +} FABRIC_ADDR_APERTURE; + +/** + * @brief DF Resource for each RootBridge structure. + * @details This contains information used to define the MMIO region for each RootBridge. + */ +typedef struct _FABRIC_RESOURCE_FOR_EACH_RB { + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondNonPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second nonprefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second prefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE IO[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< IO resource(s) @see FABRIC_ADDR_APERTURE + UINT16 PciBusNumber[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< PCI bus number(s). +} FABRIC_RESOURCE_FOR_EACH_RB; +#pragma pack (pop) +#endif // FABRIC_RESOURCE_MANAGER_CMN_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h new file mode 100644 index 0000000000..9e58f299b4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h @@ -0,0 +1,96 @@ +/** @file + AMD Memory Info Hob Definition + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_MEMORY_INFO_HOB_H_ +#define AMD_MEMORY_INFO_HOB_H_ + +/** + * @brief 128 bit Buffer containing UID Unique Identifier value for Memory Info HOB. + * EFI_GUID defined in UefiBaseType.h + */ +extern EFI_GUID gAmdMemoryInfoHobGuid; + +#pragma pack (push, 1) + +/** + * @brief Memory descriptor structure for each memory range + */ +typedef struct { + UINT64 Base; ///< Base address of memory rang + UINT64 Size; ///< Size of memory rang + UINT32 Attribute; ///< Attribute of memory rang + UINT32 Reserved; ///< For alignment purpose +} AMD_MEMORY_RANGE_DESCRIPTOR; + +/** + * @brief Memory attribute in the memory range descriptor = AVAILABLE + */ +#define AMD_MEMORY_ATTRIBUTE_AVAILABLE 0x1 + +/** + * @brief Memory attribute in the memory range descriptor = UMA + */ +#define AMD_MEMORY_ATTRIBUTE_UMA 0x2 + +/** + * @brief Memory attribute in the memory range descriptor = MMIO + */ +#define AMD_MEMORY_ATTRIBUTE_MMIO 0x3 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_RESERVED 0x4 + +/** + * @brief Memory attribute in the memory range descriptor = GPUMEM + */ +#define AMD_MEMORY_ATTRIBUTE_GPUMEM 0x5 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_SP + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_SP 0x6 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED 0x7 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED_TMR + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED_TMR 0x8 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED_SMUFEATURES + */ +#define AMD_MEMORY_ATTRIBUTE_Reserved_SmuFeatures 0x9 + +/// Memory info HOB structure +typedef struct { + UINT32 Version; ///< Version of HOB structure + BOOLEAN AmdMemoryVddioValid; ///< This field determines if Vddio is valid + UINT16 AmdMemoryVddio; ///< Vddio Voltage + BOOLEAN AmdMemoryVddpVddrValid; ///< This field determines if VddpVddr is valid + UINT8 AmdMemoryVddpVddr; ///< VddpVddr voltage + BOOLEAN AmdMemoryFrequencyValid; ///< Memory Frequency Valid + UINT32 AmdMemoryFrequency; ///< Memory Frquency + UINT32 AmdMemoryDdrMaxRate; ///< Memory DdrMaxRate + UINT32 NumberOfDescriptor; ///< Number of memory range descriptor + AMD_MEMORY_RANGE_DESCRIPTOR Ranges[1]; ///< Memory ranges array +} AMD_MEMORY_INFO_HOB; + +#pragma pack (pop) + +/** + * @brief Macro that defines the Memory Info HOB version + */ +#define AMD_MEMORY_INFO_HOB_VERISION 0x00000110ul // Ver: 00.00.01.10 + +#endif // AMD_MEMORY_INFO_HOB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h new file mode 100644 index 0000000000..d144a4ad20 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h @@ -0,0 +1,51 @@ +/** @file + AMD Psp Base Lib + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_BASELIB_V2_H_ +#define AMD_PSP_BASELIB_V2_H_ + +#include <AmdPspDirectory.h> + +#define MAX_IMAGE_SLOT_COUNT 32 + +#define ALIGNMENT_4K BASE_4KB +#define ALIGN_CHECK(addr, alignment) ((((UINTN)(addr)) & ((alignment) - 1)) == 0) +#define ALIGN_4K_CHECK(addr) ALIGN_CHECK((addr), ALIGNMENT_4K) + +#define IS_VALID_ADDR32(addr) (((UINT32)(addr) != 0) && (UINT32)(addr) != 0xFFFFFFFF) + +#pragma pack (push, 1) + +#define FIRMWARE_TABLE_SIGNATURE 0x55AA55AAul + +/// Define the structure OEM signature table +typedef struct _FIRMWARE_ENTRY_TABLEV2 { + UINT32 Signature; ///< 0x00 Signature should be 0x55AA55AAul + UINT32 ImcRomBase; ///< 0x04 Base Address for Imc Firmware + UINT32 GecRomBase; ///< 0x08 Base Address for Gmc Firmware + UINT32 XHCRomBase; ///< 0x0C Base Address for XHCI Firmware + UINT32 LegacyPspDirBase; ///< 0x10 Base Address of PSP directory + UINT32 PspDirBase; ///< 0x14 Base Address for PSP directory + UINT32 Reserved1; ///< 0x18 Base Address for Reserved BIOS directory + UINT32 Reserved2; ///< 0x1C Base Address for Reserved BIOS directory + UINT32 Reserved3; ///< 0x20 Base Address for Reserved BIOS directory + UINT32 Config; ///< 0x24 reserved for EFS Configuration + UINT32 NewBiosDirBase; ///< 0x28 Generic Base address for all program + UINT32 PspDirBackupBase; ///< 0x2C Backup PSP directory address for all programs +} FIRMWARE_ENTRY_TABLEV2; + +/// It also used as structure to store ISH generic information across programs +typedef struct { + UINT32 Priority; + UINT32 UpdateRetries; + UINT32 GlitchRetries; + UINT32 ImageSlotAddr; +} IMAGE_SLOT_HEADER; + +#pragma pack (pop) + +#endif // AMD_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h new file mode 100644 index 0000000000..23c90b65c2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h @@ -0,0 +1,83 @@ +/** @file + AMD Psp Ftpm Library header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_LIB_H_ +#define PSP_FTPM_LIB_H_ +#include <IndustryStandard/Acpi30.h> + +/* SYSTEM_TPM_CONFIG_VAL + * Value range for APCB_TOKEN_UID_PSP_SYSTEM_TPM_CONFIG + */ +typedef enum { + SYSTEM_TPM_CONFIG_DTPM = 0x00, ///< dTPM + SYSTEM_TPM_CONFIG_PSP_FTPM = 0x01, ///< PSP FTPM + SYSTEM_TPM_CONFIG_HSP_FTPM = 0x02, ///< HSP FTPM + SYSTEM_TPM_CONFIG_NONE = 0xFF, ///< None of TPM +} SYSTEM_TPM_CONFIG_VAL; + +#pragma pack (push, 1) +/// Define TPM_2_CONTROL_AREA +typedef struct { + // Interface Identifier + volatile UINT64 InterfaceIdentifier; ///< Interface Identifier + // TPM2 Control Area Extension + volatile UINT32 Clear; ///< Clear + volatile UINT32 RemainingBytes; ///< RemainingBytes + volatile UINT32 StatusReserved; ///< StatusReserved + volatile UINT32 StatusError; ///< StatusError + volatile UINT32 StatusCancel; ///< StatusCancel + volatile UINT32 StatusStart; ///< StatusStart + UINT64 InterruptControl; ///< InterruptControl + UINT32 CommandSize; ///< CommandSize + EFI_PHYSICAL_ADDRESS CommandAddress; ///< CommandAddress + UINT32 ResponseSize; ///< ResponseSize + EFI_PHYSICAL_ADDRESS ResponseAddress; ///< ResponseAddress + // Memory Absent command/response buffer + volatile UINT32 CmdRespHWBuffer; ///< Cmd/Rsp HW Buffer +} TPM2_CONTROL_AREA; + +#pragma pack (pop) + +/** + GET TPM related Info + + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +EFI_STATUS +FtpmGetInfo ( + IN OUT UINTN *FtpmStatus + ); + +/** + Execute a TPM command + + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +EFI_STATUS +FtpmExecuteCommand ( + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +#endif //PSP_FTPM_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h new file mode 100644 index 0000000000..4ad4020f95 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h @@ -0,0 +1,231 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _PSP_ROM_ARMOR_LIB_H_ +#define _PSP_ROM_ARMOR_LIB_H_ + +#include "Uefi.h" + +#define PSP_MAX_SPI_CMD_SUPPORT (4) ///< Max number of SPI command support +#define PSP_MAX_SPI_DATA_BUFFER_SIZE (72) ///< Max SPI Command Data Buffer Size +#define PSP_MAX_WHITE_LIST_CMD_NUM (32) ///< Max White list allowed command array number support +#define PSP_MAX_WHITE_LIST_REGION_NUM (16) ///< Max White list allowed region array number support + +#define SPI_CHIP_SELECT_ALL (0) ///< Allowed on all chip selects +#define SPI_CHIP_SELECT_1 (1) ///< Chip Select 1 +#define SPI_CHIP_SELECT_2 (2) ///< Chip Select 2 + +#define SPI_COMMAND_FREQUENCY_66_66MHZ (0) ///< 0=66.66MHz +#define SPI_COMMAND_FREQUENCY_33_33MHZ (1) ///< 1=33.33MHz +#define SPI_COMMAND_FREQUENCY_22_22MHZ (2) ///< 2=22.22MHz +#define SPI_COMMAND_FREQUENCY_16_66MHZ (3) ///< 3=16.66MHz +#define SPI_COMMAND_FREQUENCY_100MHZ (4) ///< 4=100MHz +#define SPI_COMMAND_FREQUENCY_800KHZ (5) ///< 5=800KHz + +#define SPI_COMMAND_NOT_PROCEDDED (0) ///< 0 = Command not examined/processed +#define SPI_COMMAND_COMPLETED (1) ///< 1 = Command completed successfully +#define SPI_COMMAND_EXECUTION_ERROR (2) ///< 2 = Execution Error (i.e. timeout) +#define SPI_COMMAND_NOT_ALLOWED (3) ///< 3 = Command not allowed by Whitelist +#define SPI_COMMAND_MALFORMED (4) ///< 4 = Command malformed + +#pragma pack (push, 1) + +typedef struct { + UINT8 ChipSelect; ///< 1 = CS1, 2 = CS2, all other values illegal + + UINT8 Frequency; ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 BytesToTx; ///< Bytes to Transmit, valid range is 0-72. Does not include the + ///< SPI Opcode byte, but does include the address, dummy bytes, and + ///< data. + + UINT8 BytesToRx; ///< Bytes to Receive from device, BytesToTx + BytesToRx <= 72 + + UINT8 OpCode; ///< The SPI Command OpCode (the first byte sent by the SPI controller) + + UINT8 Reserved[3]; ///< Reserved for future expansion + + UINT8 Buffer[PSP_MAX_SPI_DATA_BUFFER_SIZE]; ///< The remaining 0-72 bytes sent/received by the SPI controller. + ///< + ///< The SPI Controller will + ///< 1. Assert the ChipSelect + ///< 2. Send the one byte OpCode + ///< 3. Send Buffer[0] to Buffer[BytesToTx-1] to the SPI device + ///< 4. Read BytesToRx bytes from the device into Buffer[BytesToTx] to + ///< Buffer[BytesToTx+BytesToRx-1] + ///< 5. Deassert the ChipSelect line + ///< + ///< SPI ROM Commands that include a target address send the address + ///< immediately after the OpCode (i.e. Buffer[0..2] or Buffer[0..3] + ///< depending if 24 or 32bit addresses are associated with the OpCode). + ///< See the SPI ROM Device's datasheet for full details on your + ///< devices commands and formats. +} SPI_COMMAND; ///< The struct of Spi Command + +typedef union { + struct { + ///< SPI_COMMUNICATION_RESULT + UINT16 Command0Result : 4; ///< Result[ 3: 0] The result of Command[0] + UINT16 Command1Result : 4; ///< Result[ 7: 4] The result of Command[1] + UINT16 Command2Result : 4; ///< Result[11: 8] The result of Command[2] + UINT16 Command3Result : 4; ///< Result[15:12] The result of Command[3] + } Field; ///< the struct type of Command0 ~ Command4 + UINT16 Value; ///< 16 bit value of Command0 ~ Command4 +} SPI_COMMUNICATION_RESULT; ///< The union struct type of Spi Communication Result + +typedef struct { + UINT8 ReadyToRun; ///< Set to FALSE by x86 while the buffer is being constructed. Set to + ///< TRUE by x86 as the last step in building the communication buffer, + ///< just before x86 rings the PSP doorbell. + ///< + ///< Set to FALSE by PSP after the PSP copies the buffer from DRAM to + ///< private SRAM. + + UINT8 CommandCount; ///< Number of commands to execute, Valid Values 1-4 + + SPI_COMMUNICATION_RESULT SpiCommunicationResult; ///< Set to zero by x86 when the buffer is built. Atomically set to a + ///< non-zero value by the PSP to indicate the PSP has finished + ///< processing the requests in the communication buffer. The specific + ///< value written by the PSP provides per command results + ///< + ///< Result values with special meaning: + ///< 0x0000 = (written by x86) PSP has not finished handling the request + ///< 0x1000 = PSP determined the request is malformed (invalid + ///< CommandCount, chipselect, BytesToRx/Tx, etc) + ///< 0x2000, 0x3000, 0x4000, ... , 0xF000 = Reserved for future errors + ///< + ///< Generic Result values: + ///< SpiCommunicationResult[ 3: 0] The result of Command[0] + ///< SpiCommunicationResult[ 7: 4] The result of Command[1] + ///< SpiCommunicationResult[11: 8] The result of Command[2] + ///< SpiCommunicationResult[15:12] The result of Command[3] + ///< 0 = Command not examined/processed + ///< 1 = Command completed successfully + ///< 2 = Execution Error (i.e. timeout) + ///< 3 = Command not allowed by Whitelist + ///< 4 = Command malformed + ///< 5-15 = reserved for future use + ///< + ///< Examples of Generic Results: + ///< 0x0000 - PSP has not finished the request + ///< 0x0001 - PSP ran Command0 successfully, and is now idle + ///< 0x0111 - PSP ran Command0/1/2 successfully and is now idle + ///< 0x0031 - PSP ran Command0, but Command1 was blocked by whitelist + + SPI_COMMAND SpiCommand[PSP_MAX_SPI_CMD_SUPPORT]; ///< Spi command array +} SPI_COMMUNICATION_BUFFER; ///< The struct type of Spi Communication Buffer + +typedef struct { + UINT8 ChipSelect; ///< 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + + UINT8 Frequency; ///< The allowed frequency for the command + ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 OpCode; ///< The allowed commands opcode + + UINT8 MinTx; ///< The minimum range of allowed transmit byte counts for this command + ///< (does not include opcode) + UINT8 MaxTx; ///< The maximum range of allowed transmit byte counts for this command + ///< (does not include opcode) + + UINT8 MinRx; ///< The minimum range of allowed Rx byte counts + UINT8 MaxRx; ///< The maximum range of allowed Rx byte counts + + UINT8 AddrChkMethod; ///< 0=No address verification performed + ///< 1=Treat Buffer[0-2] as a 24-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + ///< 2=Treat Buffer[0-3] as a 32-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + + UINT32 ImpactSize; ///< The Impact Zone is the naturally aligned power of two sized block + ///< of addresses that may be impacted by a given SPI Command. For + ///< example, a sector erase command targeted at an address within a + ///< 64K block will impact every byte within that 64K block. Likewise + ///< a page program SPI command (i.e. write) may impact many bytes + ///< within the targeted 256/512 byte page due to page wrap-around, but + ///< no bytes outside the page. The ImapctSize field specifies the power + ///< of two size of the ImpactZone for this command. If VerifyAddress is + ///< zero (no checking) this field must also be zero, otherwise this + ///< field must be a power of two between 256 and 64MB (256, 512, ..., + ///< 67108864). NOTE: When setting this field, carefully examine your + ///< device's datasheet. + ///< +} WHITE_LIST_ALLOWED_COMMAND; ///< The struct type of White List Allowed Command + +typedef struct { + // 8 bytes + UINT32 StartAddress; ///< LSB must be 0x00, bit31 identifies a chipselect: 0=CS1, 1=CS2 + UINT32 EndAddress; ///< LSB must be 0xFF, StartAddress must be less than EndAddress +} WHITE_LIST_ALLOWED_REGION; ///< The struct type of White List Allowed Region + +typedef struct { + UINT8 AllowedCmdCount; ///< Allow Command Count + UINT8 AllowedRegionCount; ///< Allow Region Count + WHITE_LIST_ALLOWED_COMMAND WhitelistAllowedCommands[PSP_MAX_WHITE_LIST_CMD_NUM]; ///< White List Allowed Command Table + WHITE_LIST_ALLOWED_REGION WhitelistAllowedRegions[PSP_MAX_WHITE_LIST_REGION_NUM]; ///< White List Allowed Region Table +} SPI_WHITE_LIST; ///< The struct type of Spi White List + +#pragma pack (pop) + +/** + * @brief Request secures the SPI Controller + * + * @param[in,out] SpiCommunicationBuffer Spi Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN OUT SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ); + +/** + * @brief Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI white list structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ); + +/** + * @brief Request execute SPI command provide in TSEG comm buffer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ); + +/** + * @brief Request PSP firmware switch SPI controller chip select. + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ); + +#endif //_PSP_ROM_ARMOR_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h new file mode 100644 index 0000000000..0189910bd1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h @@ -0,0 +1,2722 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AML_LIB_H_ +#define AML_LIB_H_ + +#include <Uefi.h> +#include <IndustryStandard/Acpi.h> + +typedef enum { + AmlStart, + AmlClose, + AmlInvalid +} AML_FUNCTION_PHASE; + +#define AML_OBJECT_INSTANCE_SIGNATURE SIGNATURE_32 ('a', 'm', 'l', 'o') + +// +// Device Status Bitmap (Section 6.3.7 ACPI version 6.3) +// Bit [0] - Set if the device is present. +// Bit [1] - Set if the device is enabled and decoding its resources. +// Bit [2] - Set if the device should be shown in the UI. +// Bit [3] - Set if the device is functioning properly (cleared if device +// failed its diagnostics). +// Bit [4] - Set if the battery is present. +// Bits [31:5] - Reserved (must be cleared). +// +#define DEVICE_PRESENT_BIT 0x0001 +#define DEVICE_ENABLED_BIT 0x0002 +#define DEVICE_IN_UI_BIT 0x0004 +#define DEVICE_HEALTH_BIT 0x0008 +#define DEVICE_BATTERY_BIT 0x0010 // Control Method Battery Device Only + +typedef enum { + UnknownObj, + IntObj, + StrObj, + BuffObj, + PkgObj, + FieldUnitObj, + DeviceObj, + EventObj, + MethodObj, + MutexObj, + OpRegionObj, + PowerResObj, + ProcessorObj, + ThermalZoneObj, + BuffFieldObj, + DDBHandlObj, + InvalidObj +} OBJECT_TYPE_KEYWORD; + +typedef struct { + UINT32 Signature; + BOOLEAN Completed; + UINTN DataSize; + UINT8 *Data; + LIST_ENTRY Link; +} AML_OBJECT_INSTANCE; + +// *************************************************************************** +// AML defines to be consistent with already existing +// MdePkg/Include/IndustryStandard/Acpi*.h defines. +// *** These could be upstreamed at some point. +// *************************************************************************** +// Limits of (DWord|Word|QWord)Space ResourceType +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MIN 0xC0 +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MAX 0xFF + +// General Flags: Flags that are common to all resource types +// Bits[7:4] Reserved(must be 0) +// Bit[3] Max Address Fixed, _MAF: +// 1 The specified maximum address is fixed +// 0 The specified maximum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED (1 << 3) +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED (0 << 3) +#define EFI_ACPI_GENERAL_FLAG_MASK_MAF EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +// Bit[2] Min Address Fixed, _MIF: +// 1 The specified minimum address is fixed +// 0 The specified minimum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED (1 << 2) +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED (0 << 2) +#define EFI_ACPI_GENERAL_FLAG_MASK_MIF EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +// Bit[1] Decode Type, _DEC: +// 1 This bridge subtractively decodes this address(top level bridges only) +// 0 This bridge positively decodes this address +#define EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE (1 << 1) +#define EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE (0 << 1) +#define EFI_ACPI_GENERAL_FLAG_MASK_DEC EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +// Bit[0] Consumer / Producer: +// 1 This device consumes this resource +// 0 This device produces and consumes this resource +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER (1 << 0) +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER (0 << 0) +#define EFI_ACPI_GENERAL_FLAG_MASK_USAGE EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER + +// Memory Resource Flag (Resource Type = 0) DefinitionsBits +// Memory Resource Flag Masks +// Bits[7:6] Reserved(must be 0) +// Bit[5] Memory to I/O Translation, _TTP: +// 0 TypeStatic +// 1 Type Translation +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_TTP (1 << 5) +// Bit[4:3] Memory Attributes, _MTP: +// 0 AddressRangeMemory +// 1 AddressRangeReserved +// 2 AddressRangeACPI +// 3 AddressRangeNVS +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MTP (3 << 3) +// Bit[2:1] Memory Attributes, _MEM: +// 0 The memory is non-cacheable +// 1 The memory is cacheable +// 2 The memory is cacheable and supports write-combining +// 3 The memory is cacheable and prefetchable +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM (3 << 1) +// Bit[0] Write Status, _RW: +// 0 This memory range is read-only +// 1 This memory is read-write +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW (1 << 0) + +// I/O Resource Flag (Resource Type = 1) DefinitionsBits +// I/O Resource Flags +// Bit [7:6] Reserved (must be 0) +// Bit [5] Sparse Translation, _TRS. This bit is only meaningful if Bit [4] is set. +// 1 SparseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = (((port & 0xFFFc) << 10) || (port & 0xFFF)) + _TRA In the address +// used to access the I/O port, bits[11:2] must be identical to bits[21:12], +// this gives four bytes of I/O ports on each 4 KB page. +// 0 DenseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = port + _TRA +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_SPARSE_TRANSLATION (1 << 5) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_DENSE_TRANSLATION (0 << 5) +// Bit [4] I/O to Memory Translation, _TTP +// 1 TypeTranslation: This resource, which is I/O on the secondary side of the +// bridge, is memory on the primary side of the bridge. +// 0 TypeStatic: This resource, which is I/O on the secondary side of the +// bridge, is also I/O on the primary side of the bridge. +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_TRANSLATION (1 << 4) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_STATIC (0 << 4) +// Bit [3:2] Reserved (must be 0) +// Bit [1:0] _RNG +// 3 Memory window covers the entire range +// 2 ISARangesOnly. This flag is for bridges on systems with multiple bridges. +// Setting this bit means the memory window specified in this descriptor is +// limited to the ISA I/O addresses that fall within the specified window. The +// ISA I/O ranges are: n000-n0FF, n400-n4FF, n800-n8FF, nC00-nCFF. This bit can +// only be set for bridges entirely configured throughACPI namespace. +// 1 NonISARangesOnly. This flag is for bridges on systems with multiple +// bridges. Setting this bit means the memory window specified in this +// descriptor is limited to the non-ISA I/O addresses that fall within the +// specified window. The non-ISA I/O ranges are: n100-n3FF, n500-n7FF, +// n900-nBFF, nD00-nFFF. This bit can only be set for bridges entirely +// configured through ACPI namespace. +// 0 Reserved +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE (3 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY (2 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY (1 << 0) + +#define AML_OBJECT_INSTANCE_FROM_LINK(a) BASE_CR (a, AML_OBJECT_INSTANCE, Link) + +// Method Serialize Flag Values +typedef enum { + NotSerialized, + Serialized, + FlagInvalid +} METHOD_SERIALIZE_FLAG; +// AccessField Access Attrib Flags. +// Ref ACPI spec 6.3 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL 0x00 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK 0x02 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE 0x04 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE 0x06 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD 0x08 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK 0x0A +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES 0x0B +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL 0x0C +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL 0x0D +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES 0x0E +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES 0X0F + +// AccessField access types +typedef enum { + AnyAcc, + ByteAcc, + WordAcc, + DWordAcc, + QWordAcc, + BufferAcc, +} EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS; + +// Field lock rules +typedef enum { + NoLock, + Lock +} EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS; + +// Field update rules +typedef enum { + Preserve, + WriteAsOnes, + WriteAsZeros +} EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS; + +// Field access attributes. for AttribBytes, AttribRawBytes and AttribRawProcessBytes +// the ExtendedAccessField definition is used, as this is what iASL compiles into, rather +// than the AccessField that is specified in the ACPI spec. +typedef enum { + AttribNormal = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL, + AttribQuick = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK, + AttribSendReceive = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE, + AttribByte = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE, + AttribWord = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD, + AttribBlock = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK, + AttribBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES, + AttribProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL, + AttribBlockProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL, + AttribRawBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES, + AttribRawProcessBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES +} EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS; + +// +// Resource Type Specific Flags +// Ref ACPI specification 6.4.3.5.5 +// +// +// DMA Information +// Ref ACPI specification 6.4.2.2 +// +// DmaType values +typedef enum { + Compatibility = EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY, + TypeA = EFI_ACPI_DMA_SPEED_TYPE_A, + TypeB = EFI_ACPI_DMA_SPEED_TYPE_B, + TypeF = EFI_ACPI_DMA_SPEED_TYPE_F +} EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS; + +// IsBusMaster values +typedef enum { + NotBusMaster = 0, + BusMaster = EFI_ACPI_DMA_BUS_MASTER +} EFI_ACPI_DMA_BUS_MASTER_KEYWORDS; + +// DmaTransferSize values +typedef enum { + Transfer8 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT, + Transfer8_16 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT, + Transfer16 = EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT +} EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS; + +// +// Interrupt Resource Descriptor Information +// Ref ACPI specification 6.4.2.1 +// +// IRQ Information - Wake Capability +// +#define EFI_ACPI_IRQ_WAKE_CAPABLE_MASK 0x20 +#define EFI_ACPI_IRQ_NOT_WAKE_CAPABLE 0x0 +#define EFI_ACPI_IRQ_WAKE_CAPABLE 0x20 + +typedef enum { + NotWakeCapable = EFI_ACPI_IRQ_NOT_WAKE_CAPABLE, + WakeCapable = EFI_ACPI_IRQ_WAKE_CAPABLE +} EFI_ACPI_IRQ_WAKE_CAPABILITY_KEYWORDS; + +// +// IRQ Information - Interrupt Sharing +// +#define EFI_ACPI_IRQ_EXCLUSIVE 0x0 + +typedef enum { + Exclusive = EFI_ACPI_IRQ_EXCLUSIVE, + Shared = EFI_ACPI_IRQ_SHARABLE, + ExclusiveAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_EXCLUSIVE, + SharedAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_SHARABLE +} EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS; + +// +// IRQ Information - Interrupt Polarity +// +typedef enum { + ActiveHigh = EFI_ACPI_IRQ_HIGH_TRUE, + ActiveLow = EFI_ACPI_IRQ_LOW_FALSE +} EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS; + +// +// IRQ Information - Interrupt Mode +// +#define EFI_ACPI_IRQ_MODE_MASK 0x1 +typedef enum { + LevelTriggered = EFI_ACPI_IRQ_LEVEL_TRIGGERED, + EdgeTriggered = EFI_ACPI_IRQ_EDGE_TRIGGERED +} EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS; + +// IO Port Descriptor Information +// Ref ACPI specification 6.4.2.5 +// +typedef enum { + Decode16 = EFI_ACPI_IO_DECODE_16_BIT, + Decode10 = EFI_ACPI_IO_DECODE_10_BIT +} EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION; + +// +// Memory Resource Information +// Ref ACPI specification 6.4.3.5 +// +// Consumer/Producer Bit[0] +typedef enum { + ResourceProducer = EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER, + ResourceConsumer = EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER +} RESOURCE_USAGE_FLAG; + +// Decode Type (_DEC) Bit[1] +typedef enum { + PosDecode = EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE, + SubDecode = EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +} MEM_DECODE_FLAG; + +// Min Address Fixed (_MIF) Bit[2] +typedef enum { + MinNotFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED, + MinFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +} MIN_FIXED_FLAG; + +// Max Address Fixed (_MAF) Bit[3] +typedef enum { + MaxNotFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED, + MaxFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +} MAX_FIXED_FLAG; + +// Memory Attributes (_MEM) Bits[2:1] +typedef enum { + NonCacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_NON_CACHEABLE, + Cacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE, + WriteCombining = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_WRITE_COMBINING, + Prefetchable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE +} CACHEABLE_FLAG; + +// Write Status (_RW) Bit[0] +typedef enum { + ReadOnly = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_ONLY, + ReadWrite = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_WRITE +} READ_WRITE_FLAG; + +// Memory Attributes (_MTP) Bits[4:3] +typedef enum { + AddressRangeMemory = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_MEMORY, + AddressRangeReserved = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_RESERVED, + AddressRangeACPI = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_ACPI, + AddressRangeNVS = EFI_APCI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_NVS +} MEMORY_RANGE_TYPE; + +// Memory to IO Translation (_TTP) Bit[5] +// Note: IO and Memory Resources use different bits for this. +// Value must be handled at function level when implemented. +typedef enum { + TypeStatic = 0, + TypeTranslation = 1 +} MEMORY_TRANSLATION_TYPE; + +// Memory Window Attributes (_RNG) Bits[1:0] +typedef enum { + Reserved = 0, + NonISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY, + ISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY, + EntireRange = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE, + ISARangeMax +} IO_ISA_RANGES; + +// Generic Address Space Address IDs +typedef enum { + SystemMemory = EFI_ACPI_6_4_SYSTEM_MEMORY, + SystemIO = EFI_ACPI_6_4_SYSTEM_IO, + PCI_Config = EFI_ACPI_6_4_PCI_CONFIGURATION_SPACE, + EmbeddedControl = EFI_ACPI_6_4_EMBEDDED_CONTROLLER, + SMBus = EFI_ACPI_6_4_SMBUS, + SystemCMOS = EFI_ACPI_6_4_SYSTEM_CMOS, + PciBarTarget = EFI_ACPI_6_4_PCI_BAR_TARGET, + IPMI = EFI_ACPI_6_4_IPMI, + GeneralPurposeIO = EFI_ACPI_6_4_GENERAL_PURPOSE_IO, + GenericSerialBus = EFI_ACPI_6_4_GENERIC_SERIAL_BUS, + PCC = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + PlatformCommChannel = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + FFixedHW = EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE +} GENERIC_ADDRESS_SPACE_ID; + +typedef enum { + UndefinedSize = EFI_ACPI_6_4_UNDEFINED, + ByteSize = EFI_ACPI_6_4_BYTE, + WordSize = EFI_ACPI_6_4_WORD, + DWordSize = EFI_ACPI_6_4_DWORD, + QWordSize = EFI_ACPI_6_4_QWORD +} ACPI_DATA_SIZE; + +typedef ACPI_DATA_SIZE GENERIC_ADDRESS_ACCESS_SIZE; + +// *************************************************************************** +// AML Objects +// *************************************************************************** + +// --------------------------------------------------------------------------- +// Table and Table Header Encoding +// --------------------------------------------------------------------------- + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Name Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Namestring AML Object and inserts it into the linked list + + Completes NameString in one call as "one phase" + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Data Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an optimized integer object + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Package Length Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Term Objects Encoding +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Namespace Modifier Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString DataRefObject + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Named Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be created between AmlStart and AmlClose Phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ); + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + // + // x' is encoded as bits 0:7 of the AccessAttrib byte. + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed AccessAs Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj since AML does not store + ArgTypes here. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 1 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 2 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Resource Descriptor Objects Encoding +// --------------------------------------------------------------------------- + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlDWordSpace () + + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. RangeLength + evaluates to a 32-bit integer that specifies the total number of bytes decoded + in the memory range. The 32-bit field DescriptorName. _LEN is automatically + created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlQWordSpace () + + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Expression Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Miscellaneous Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op |Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ + +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// *************************************************************************** +// AML Assistance Functions +// *************************************************************************** + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ); + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ); + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +// *************************************************************************** +// AML Debug Functions +// *************************************************************************** + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ); + +/** + DEBUG print a buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS.IS.A.SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ); + +#endif // AML_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h new file mode 100644 index 0000000000..d48ca1a90a --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h @@ -0,0 +1,25 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/AmdPspRomArmorLib.h> + +/* + * Return allocated and filled AMD PSP ROM Armor White list Table + * + * + * @param[in] PlatformSpiWhitelist Pointer to white list table + * + * @return EFI_SUCCESS + * @return EFI_OUT_OF_RESOURCES Buffer to return couldn't be allocated + */ +EFI_STATUS +EFIAPI +GetPspRomArmorWhitelist ( + IN SPI_WHITE_LIST **PlatformSpiWhitelist + ); diff --git a/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h new file mode 100644 index 0000000000..6c854651cc --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h @@ -0,0 +1,134 @@ +/** @file + AMD Psp Ftpm Ppi Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_PPI_H_ +#define PSP_FTPM_PPI_H_ +#include <Uefi.h> + +typedef struct _PSP_FTPM_PPI PSP_FTPM_PPI; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: GET TPM related Info + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PPI *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + **/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs. + + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @retval EFI_STATUS 0: Success, Non-Zero Error +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + PSP_FTPM_PPI prototype + + Defines PSP_FTPM_PPI. This PPI is used to get Ftpm info. + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PPI { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs +} PSP_FTPM_PPI; + +extern EFI_GUID gAmdPspFtpmPpiGuid; +extern EFI_GUID gAmdPspFtpmFactoryResetPpiGuid; + +#endif diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h new file mode 100644 index 0000000000..715cbbcf78 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h @@ -0,0 +1,183 @@ +/** @file + CXL Configuration Services Protocol prototype definition + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_CXL_SERVICES_PROTOCOL_H_ +#define NBIO_CXL_SERVICES_PROTOCOL_H_ + +#include "AMD.h" +#include <Protocol/FabricTopologyServices2.h> +#include <Protocol/FabricResourceManagerServicesProtocol.h> + +#define AMD_NBIO_CXL_SERVICES_REVISION 0x00 + +/// Forward declaration for the AMD_NBIO_CXL_SERVICES_PROTOCOL +typedef struct _AMD_NBIO_CXL_SERVICES_PROTOCOL AMD_NBIO_CXL_SERVICES_PROTOCOL; + +extern EFI_GUID gAmdNbioCxlServicesProtocolGuid; ///< CXL services protocol calling + +#pragma pack (push, 1) +/// Port Information Structure +typedef struct _AMD_CXL_PORT_INFO_STRUCT { + PCI_ADDR EndPointBDF; ///< Bus/Device/Function of Root Port in PCI_ADDR format + UINT8 LogicalNbioInstance; ///< Logical Instance ID of NBIO + UINT8 PhysicalNbioInstance; ///< Physical Instance ID of NBIO where this port is located + UINT8 SocketID; ///< Socket ID for this port + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT8 PortId; ///< Physical port location + UINT8 PortWidth; ///< Lane width of the port + UINT32 CxlPortAddress; ///< CXL root port address (CXL 2.0 root port or CXL 1.1 RCiEP) + BOOLEAN IsSwitch; ///< CXL Switch flag +} AMD_CXL_PORT_INFO_STRUCT; + +/// Port MMIO32 Resources Information Structure +typedef struct _AMD_CXL_RESOURCES_INFO_STRUCT { + UINT32 Mmio32Base[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Size[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Gran; +} AMD_CXL_RESOURCES_INFO_STRUCT; +#pragma pack (pop) + +// Protocol Definitions + +/** + This function gets information about a specific PCIe root port. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortInformation + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_ROOT_PORT_INFORMATION)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr + IN UINTN PortIndex, ///< port index + OUT AMD_CXL_PORT_INFO_STRUCT *PortInformation ///< port information ptr + ); + +/** + This function configures a specific PCIe root port for CXL capabilities. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port. + PortInformation OPTIONAL (can be NULL) + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_CONFIGURE_ROOT_PORT)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< this ptr + IN PCI_ADDR EndpointBDF ///< end pt bdf + ); + +/** + This function configures a specific PCIe root port for CXL presence + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port such as Socket id,rbindex,port id,segment,bus base,limit or presence. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_AVAILABLE)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT FABRIC_RESOURCE_FOR_EACH_RB *ResourceForEachRb ///< + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_PORT_RB_LOCATION)( + ///< get port rb location + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN UINT8 Segment, ///< + IN UINT8 BusBase, ///< + OUT UINT8 *SocketId, ///< + OUT UINT8 *RbIndex ///< + ); + +/** + This function gets the CXL MMIO32 values to be used by the fabric resource manager + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + CxlMmio32ResourceForEachRb + A pointer to the structure that will hold the MMIO32 base and size values for each root bridge +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_INFORMATION)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT AMD_CXL_RESOURCES_INFO_STRUCT *CxlMmio32Resources ///< + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_REPORT_TO_MPIO)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This ///< ptr to protocol + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_FIND_2P0_DEVICES)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN UINTN PortIndex ///< port index + ); + +/** + * @brief + * + */ +typedef +VOID +(EFIAPI *AMD_CXL_ENABLE_SCM_PMEM)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN PCI_ADDR CxlPciAddress ///< PCI address + ); + +/// The Protocol Definition for CXL Services +struct _AMD_NBIO_CXL_SERVICES_PROTOCOL { + UINT32 Revision; ///< revision + UINTN CxlCount; ///< CXL count + AMD_CXL_GET_ROOT_PORT_INFORMATION CxlGetRootPortInformation; ///< CXL root port information + AMD_CXL_CONFIGURE_ROOT_PORT CxlConfigureRootPort; ///< configuring the root port + AMD_CXL_GET_PORT_RB_LOCATION GetCxlPortRBLocation; ///< CXL port RB location + AMD_CXL_RESOURCES_AVAILABLE GetCxlAvailableResources; ///< Get resources allocated for CXL RCiEP + AMD_CXL_RESOURCES_INFORMATION GetCxlMmio32Resources; ///< Get CXL MMIO resources for CXL RCiEP + AMD_CXL_REPORT_TO_MPIO CxlReportToMpio; ///< Sends the CXL info to MPIO + AMD_CXL_FIND_2P0_DEVICES CxlFind2p0Devices; ///< Finds CXL 2.0 devices after PCIe enumeration + AMD_CXL_ENABLE_SCM_PMEM CxlEnableScmForPersistentMemory; ///< Notifies SMU that CXL persistent memory is present +}; + +#endif /* NBIO_CXL_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h new file mode 100644 index 0000000000..7bcff65dc9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h @@ -0,0 +1,110 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCI_RESOURCES_PROTOCOL_H_ +#define AMD_PCI_RESOURCES_PROTOCOL_H_ + +typedef struct { + UINTN Index; + UINT8 SocketId; + UINTN Segment; + UINTN BaseBusNumber; +} PCI_ROOT_BRIDGE_OBJECT; + +typedef struct { + UINTN Index; + BOOLEAN Enabled; + UINT8 PortPresent; + UINTN Device; + UINTN Function; + UINTN SlotNum; + // Interrupts are relative to IOAPIC 0->n + UINTN BridgeInterrupt; // Redirection table entry for mapped bridge interrupt + UINTN EndpointInterruptArray[4]; // Redirection table entries for mapped INT A/B/C/D +} PCI_ROOT_PORT_OBJECT; + +typedef enum { + IOMMU = 0, + IOAPIC +} FIXED_RESOURCE_TYPE; + +typedef struct { + UINTN Index; + FIXED_RESOURCE_TYPE ResourceType; + UINTN Address; + UINTN Limit; +} FIXED_RESOURCES_OBJECT; + +/// Forward declaration for the AMD_PCI_RESOURCES_PROTOCOL. +typedef struct _AMD_PCI_RESOURCES_PROTOCOL AMD_PCI_RESOURCES_PROTOCOL; + +/** + * @brief System information through EFI call + * @details + */ +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + OUT UINTN *NumberOfRootBridges + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT PCI_ROOT_BRIDGE_OBJECT **RootBridgeInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfRootPorts + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN RootPortIndex, + OUT PCI_ROOT_PORT_OBJECT **RootPortInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfFixedResources + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN FixedResourceIndex, + OUT FIXED_RESOURCES_OBJECT **FixedResourceInfo + ); + +struct _AMD_PCI_RESOURCES_PROTOCOL { + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES AmdPciResourcesGetNumberOfRootBridges; + AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO AmdPciResourcesGetRootBridgeInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS AmdPciResourcesGetNumberOfRootPorts; + AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO AmdPciResourcesGetRootPortInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES AmdPciResourcesGetNumberOfFixedResources; + AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO AmdPciResourcesGetFixedResourceInfo; +}; + +extern EFI_GUID gAmdPciResourceProtocolGuid; ///< Guid for calling + +#endif // AMD_PCI_RESOURCES_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h new file mode 100644 index 0000000000..ebc7812b18 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h @@ -0,0 +1,187 @@ +/** @file + AMD Psp Ftpm Protocol Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FTPM_PROTOCOL_H_ +#define FTPM_PROTOCOL_H_ + +#include <Uefi.h> +// +// GUID definition +// +extern EFI_GUID gAmdPspFtpmProtocolGuid; + +/** + structure definition for HSP mailbox + +**/ +typedef struct { + // C2H_TPM_L0 + UINT64 TPM_L0_Address; /// Mailbox address + UINT64 TPM_L0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 TPM_L0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L0(VLT0) + UINT64 VLT0_Address; /// Mailbox address + UINT64 VLT0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L1(VLT1) + UINT64 VLT1_Address; /// Mailbox address + UINT64 VLT1_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT1_HSC_MSG_Address; /// Doorbell address HSP->CPU + + // Interrupt Information + UINT8 Gsi[4]; /// Gsi[0] is for HSP Channel 0 TPM + /// Gsi[1] is for HSP Channel 1 VTL0 + /// Gsi[2] is for HSP Channel 2 VTL1 + /// Gsi[3] is reserved +} HSP_MAILBOX_ADDRESS, *PHSP_MAILBOX_ADDRESS; + +typedef union { + HSP_MAILBOX_ADDRESS HSP_info; +} FTPM_INFO; + +typedef struct _PSP_FTPM_PROTOCOL PSP_FTPM_PROTOCOL; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: GET TPM related Information + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Function prototype for GetHspfTPMInfo. Return Pluton mailbox base address to SBIOS. + SBIOS should call this procedure after PCI Enumeration Complete. + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmInfo Point to Pluton mailbox base address + + @return EFI_SUCCESS - Success + @return EFI_INVALID_PARAMETER - Input parameter is invalid + @return EFI_NOT_READY - Pluton-fTPM device BAR0 MMIO is not ready. +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TPM_INFO)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *FtpmInfo + ); + +/** + PSP_FTPM_PROTOCOL prototype + + Defines PSP_FTPM_PROTOCOL. This protocol is used to get Ftpm info + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PROTOCOL { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs + FTPM_GET_TPM_INFO GetInfo; ///< Get TPM info +} PSP_FTPM_PROTOCOL; + +#endif //FTPM_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h new file mode 100644 index 0000000000..7f57facf88 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h @@ -0,0 +1,14 @@ +/** @file + Fabric MMIO map manager Protocol prototype definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#define FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#include <FabricResourceManagerCmn.h> + +#endif // FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h new file mode 100644 index 0000000000..a7fef5a35c --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h @@ -0,0 +1,19 @@ +/** @file + AMD CPM Base Definitions. + + Copyright (C) 2014-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_BASE_H_ +#define AMD_CPM_BASE_H_ + +#include <Base.h> +#include <Uefi.h> +#include <PiPei.h> +#include <AmdCpmCommon.h> +#include <Library/DebugLib.h> + +#endif // AMD_CPM_BASE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h new file mode 100644 index 0000000000..af192fcf03 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h @@ -0,0 +1,78 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_COMMON_H_ +#define AMD_CPM_COMMON_H_ + +#pragma pack(push) + +#include <AGESA.h> +#include <AmdPcieComplex.h> +#include <AmdCpmDefine.h> +#include <AmdCpmFunction.h> + +/// The signatures of CPM table + +typedef enum { + CPM_SIGNATURE_DXIO_TOPOLOGY = SIGNATURE_32 ('$', 'A', '2', '6'), ///< The signature of Socket 0 AMD_CPM_DXIO_TOPOLOGY_TABLE + CPM_SIGNATURE_DXIO_TOPOLOGY_S1 = SIGNATURE_32 ('$', 'A', '2', '7') ///< The signature of Socket 1 AMD_CPM_DXIO_TOPOLOGY_TABLE +} AMD_CPM_TABLE_SIGNATURE; + +/// CPM table header +typedef struct { + UINT32 TableSignature; ///< Signature of CPM table + UINT16 TableSize; ///< Table size + UINT8 FormatRevision; ///< Revision of table format + UINT8 ContentRevision; ///< Revision of table content + UINT32 PlatformMask; ///< The mask of platform table supports + UINT32 Attribute; ///< Table attribute +} AMD_CPM_TABLE_COMMON_HEADER; + +/// Table pointer +typedef union { + VOID *Pointer; ///< Table pointer + UINT64 Raw; ///< Table pointer value +} AMD_CPM_POINTER; + +/// DXIO Topology Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR Port[AMD_DXIO_PORT_DESCRIPTOR_SIZE]; ///< DXIO Port Descriptor List +} AMD_CPM_DXIO_TOPOLOGY_TABLE; + +/// AMD CPM Main Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT8 PlatformName[32]; ///< Platform name + UINT8 BiosType; ///< BIOS type + UINT16 CurrentPlatformId; ///< Current Platform Id + UINT32 PcieMemIoBaseAddr; ///< PcieMemIoBaseAddr + UINT32 AcpiMemIoBaseAddr; ///< AcpiMemIoBaseAddr + AMD_CPM_POINTER Service; ///< Reserved for internal use + AMD_CPM_POINTER TableInRomList; ///< Reserved for internal use + AMD_CPM_POINTER TableInRamList; ///< Reserved for internal use + AMD_CPM_POINTER TableInHobList; ///< Reserved for internal use + AMD_CPM_POINTER HobTablePtr; ///< Reserved for internal use + + UINT8 ExtClkGen; ///< External ClkGen Config. 0x00~0x7F + UINT8 UnusedGppClkOffEn; ///< Config to turn off unused GPP clock + UINT8 LpcUartEn; ///< LpcUartEn + UINT64 AltAcpiMemIoBaseAddr; ///< Alternate AcpiMemIoBaseAddr for Slave FCH +} AMD_CPM_MAIN_TABLE; + +/// Structure for Chip Id +typedef struct { + UINT8 Cpu; ///< CPU/APU Chip Id + UINT8 Sb; ///< SB Chip Id + UINT8 Reserved[6]; +} AMD_CPM_CHIP_ID; +#pragma pack (pop) + +#endif //AMD_CPM_COMMON_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h new file mode 100644 index 0000000000..4fc3f97a80 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h @@ -0,0 +1,17 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_DEFINE_H_ +#define AMD_CPM_DEFINE_H_ + +#ifndef AMD_DXIO_PORT_DESCRIPTOR_SIZE +#define AMD_DXIO_PORT_DESCRIPTOR_SIZE 0x30 +#endif + +#endif // AMD_CPM_DEFINE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h new file mode 100644 index 0000000000..7dce238135 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h @@ -0,0 +1,32 @@ +/** @file + AMD CPM Common Functions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_FUNCTION_H_ +#define AMD_CPM_FUNCTION_H_ + +typedef VOID *(EFIAPI *AMD_CPM_GETTABLEPTR_FN)( + IN VOID *This, + IN UINT32 TableId + ); + +typedef AGESA_STATUS (EFIAPI *AMD_CPM_GETPOSTEDVBIOSIMAGE_FN)( + IN GFX_VBIOS_IMAGE_INFO *VbiosImageInfo + ); + +/// Common Functions for CPM Drivers +typedef struct _AMD_CPM_COMMON_FUNCTION { + AMD_CPM_GETTABLEPTR_FN GetTablePtr2; ///< Get CPM Table Pointer. The table can be re-writable +} AMD_CPM_COMMON_FUNCTION; + +/// CPM Public Functions for platform DXE Driver to use +typedef struct _AMD_CPM_DXE_PUBLIC_FUNCTION { + AMD_CPM_GETPOSTEDVBIOSIMAGE_FN GetPostedVbiosImage; ///< Get posted VBIOS image +} AMD_CPM_DXE_PUBLIC_FUNCTION; + +#endif //AMD_CPM_FUNCTION_H_ diff --git a/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h new file mode 100644 index 0000000000..4a90aa3d8b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h @@ -0,0 +1,39 @@ +/** @file + AMD CPM Table Protocol. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_TABLE_PROTOCOL_H_ +#define AMD_CPM_TABLE_PROTOCOL_H_ + +#include <AmdCpmBase.h> + +// +// GUID definition +// +#define AMD_CPM_TABLE_PROTOCOL_GUID \ + { 0x3724cf01, 0x00c2, 0x9762, 0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 } + +#define AMD_CPM_TABLE_SMM_PROTOCOL_GUID \ + { 0xaf6efacf, 0x7a13, 0x45a3, 0xb1, 0xa5, 0xaa, 0xfc, 0x06, 0x1c, 0x4b, 0x79 } + +extern EFI_GUID gAmdCpmTableProtocolGuid; +extern EFI_GUID gAmdCpmTableSmmProtocolGuid; + +/// DXE Protocol Structure +typedef struct _AMD_CPM_TABLE_PROTOCOL { + UINTN Revision; ///< Protocol Revision + AMD_CPM_MAIN_TABLE *MainTablePtr; ///< Pointer to CPM Main Table + AMD_CPM_CHIP_ID ChipId; ///< Id of SB Chip + AMD_CPM_COMMON_FUNCTION CommonFunction; ///< Private Common Functions + AMD_CPM_DXE_PUBLIC_FUNCTION DxePublicFunction; ///< Public Function of Protocol +} AMD_CPM_TABLE_PROTOCOL; + +// Current Protocol Revision +#define AMD_CPM_TABLE_PROTOCOL_REV 0x00 + +#endif // AMD_CPM_TABLE_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c new file mode 100644 index 0000000000..fa83888e95 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c @@ -0,0 +1,31 @@ +/** @file + PSP Mailbox related functions + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c new file mode 100644 index 0000000000..0e9baad955 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c new file mode 100644 index 0000000000..a04bc1f992 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c @@ -0,0 +1,79 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/AmdPspRomArmorLib.h> + +/** + * Request secures the SPI Controller + * + * @param[in, out] SpiCommunicationBuffer SPI Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI White List structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request execute SPI command provide in TSEG comm buffer. + * + * @param[in] NONE + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request PSP firmware switch SPI controller chip select. + * + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c new file mode 100644 index 0000000000..fce82d75b0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/PcdLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c new file mode 100644 index 0000000000..f8b9eb0bcf --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <PiPei.h> +#include <Base.h> +#include <Library/PcdLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PeiServicesLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c new file mode 100644 index 0000000000..cff678d76b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c @@ -0,0 +1,37 @@ +** @file + Fabric Topology Base Lib implementation + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ) +{ + return 0; +} + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ) +{ + return 0; +} + +RETURN_STATUS +EFIAPI +BaseFabricTopologyLibConstructor ( + VOID + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c new file mode 100644 index 0000000000..f72cbe7dff --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c @@ -0,0 +1,8 @@ +/** @file + A Base Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c new file mode 100644 index 0000000000..a155978a5d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c @@ -0,0 +1,35 @@ +/** @file + A Dxe Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> + +/** The constructor function determines the actual TSC frequency. + + First, Get TSC frequency from system configuration table with TSC frequency GUID, + if the table is not found, install it. + This function will always return EFI_SUCCESS. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +DxeTscTimerLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c new file mode 100644 index 0000000000..f70aa3de0e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c @@ -0,0 +1,11 @@ +/** @file + A Pei Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Library/HobLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c new file mode 100644 index 0000000000..7d14d62e60 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c @@ -0,0 +1,103 @@ +/** @file + The Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** Stalls the CPU for at least the specified number of MicroSeconds. + + @param[in] MicroSeconds The minimum number of microseconds to delay. + + @return The value of MicroSeconds input. + +**/ +UINTN +EFIAPI +MicroSecondDelay ( + IN UINTN MicroSeconds + ) +{ + return 0; +} + +/** Stalls the CPU for at least the specified number of NanoSeconds. + + @param[in] NanoSeconds The minimum number of nanoseconds to delay. + + @return The value of NanoSeconds input. + +**/ +UINTN +EFIAPI +NanoSecondDelay ( + IN UINTN NanoSeconds + ) +{ + return 0; +} + +/** Retrieves the current value of the 64-bit free running Time-Stamp counter. + + The properties of the counter can be retrieved by the + GetPerformanceCounterProperties() function. + + @return The current value of the free running performance counter. + +**/ +UINT64 +EFIAPI +GetPerformanceCounter ( + VOID + ) +{ + return 0; +} + +/** Retrieves the 64-bit frequency in Hz and the range of performance counter + values. + + If StartValue is not NULL, then the value that the performance counter starts + with, 0x0, is returned in StartValue. If EndValue is not NULL, then the value + that the performance counter end with, 0xFFFFFFFFFFFFFFFF, is returned in + EndValue. + + The 64-bit frequency of the performance counter, in Hz, is always returned. + + @param[out] StartValue Pointer to where the performance counter's starting value is saved, or NULL. + @param[out] EndValue Pointer to where the performance counter's ending value is saved, or NULL. + + @return The frequency in Hz. + +**/ +UINT64 +EFIAPI +GetPerformanceCounterProperties ( + OUT UINT64 *StartValue, OPTIONAL + OUT UINT64 *EndValue OPTIONAL + ) +{ + return 0; +} + +/** + Converts elapsed ticks of performance counter to time in nanoseconds. + + This function converts the elapsed ticks of running performance counter to + time value in unit of nanoseconds. + + @param Ticks The number of elapsed ticks of running performance counter. + + @return The elapsed time in nanoseconds. + +**/ +UINT64 +EFIAPI +GetTimeInNanoSecond ( + IN UINT64 Ticks + ) +{ + return 0; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c new file mode 100644 index 0000000000..44e23df62f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c @@ -0,0 +1,95 @@ +/** @file + AMD instance of the PCI Host Bridge Library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/PciHostBridgeLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciRootBridgeIo.h> +#include <Protocol/PciHostBridgeResourceAllocation.h> + +/** + Sort all root bridges in bus ascending order and set DevicePath UIDs + continuous and ascending from zero + + @param[in,out] RootBridgeList Array of root bridges. + @param[in] Count Count of root bridges in RootBridgeList + + @return All the root bridge instances in an array are sorted in bus order. + DevicePath UID updated to continuous and ascending numbers starting + with 0. +**/ +VOID +EFIAPI +PciHostBridgeSortRootBridges ( + IN PCI_ROOT_BRIDGE *RootBridgeList, + IN UINTN Count + ) +{ +} + +/** + Return all the root bridge instances in an array. + + @param Count Return the count of root bridge instances. + + @return All the root bridge instances in an array. + The array should be passed into PciHostBridgeFreeRootBridges() + when it's not used. +**/ +PCI_ROOT_BRIDGE * +EFIAPI +PciHostBridgeGetRootBridges ( + UINTN *Count + ) +{ + return (PCI_ROOT_BRIDGE *)NULL; +} + +/** + Free the root bridge instances array returned from PciHostBridgeGetRootBridges(). + + @param Bridges The root bridge instances array. + @param Count The count of the array. +**/ +VOID +EFIAPI +PciHostBridgeFreeRootBridges ( + PCI_ROOT_BRIDGE *Bridges, + UINTN Count + ) +{ +} + +/** + Inform the platform that the resource conflict happens. + + @param HostBridgeHandle Handle of the Host Bridge. + @param Configuration Pointer to PCI I/O and PCI memory resource + descriptors. The Configuration contains the resources + for all the root bridges. The resource for each root + bridge is terminated with END descriptor and an + additional END is appended indicating the end of the + entire resources. The resource descriptor field + values follow the description in + EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL + .SubmitResources(). +**/ +VOID +EFIAPI +PciHostBridgeResourceConflict ( + EFI_HANDLE HostBridgeHandle, + VOID *Configuration + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c new file mode 100644 index 0000000000..318f8e5ad7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c @@ -0,0 +1,154 @@ +/** @file + + Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLARGOBJECTS_FILECODE + +/* + Fill the DataBuffer with correct Arg Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 argument, i.e., Arg1, Arg2 ... Arg6. + + @param[in] ArgN - Argument Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid ArgN provided. +*/ +EFI_STATUS +EFIAPI +InternalAmlArgBuffer ( + IN OUT UINT8 ArgN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (ArgN) { + case 0: + Data[0] = AML_ARG0; + break; + case 1: + Data[0] = AML_ARG1; + break; + case 2: + Data[0] = AML_ARG2; + break; + case 3: + Data[0] = AML_ARG3; + break; + case 4: + Data[0] = AML_ARG4; + break; + case 5: + Data[0] = AML_ARG5; + break; + case 6: + Data[0] = AML_ARG6; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "ARGN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlArgBuffer ( + ArgN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + ArgN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c new file mode 100644 index 0000000000..371537c9aa --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c @@ -0,0 +1,151 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLASSISTFUNCTIONS_FILECODE + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Get next node before freeing current Object + Node = GetNextNode (ListHead, Node); + // Free Object + InternalFreeAmlObject (&Object, ListHead); + } + + return EFI_SUCCESS; +} + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead cannot be NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + *TableSize = 0; + Node = GetFirstNode (ListHead); + if (!IsNodeAtEnd (ListHead, Node)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Multiple nodes remain, Likely missed an 'AmlClose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } else { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if (!Object->Completed) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Final node not completed: Likely missed an 'AmlCLose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } + + *Table = Object->Data; + *TableSize = Object->DataSize; + } + + return EFI_SUCCESS; +} + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead = NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *ListHead = AllocatePool (sizeof (LIST_ENTRY)); + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to allocate Table List Head\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + InitializeListHead (*ListHead); + + return EFI_SUCCESS; +} + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NULL ListHead passed in\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + AmlFreeObjectList (*ListHead); + FreePool (*ListHead); + *ListHead = NULL; + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c new file mode 100644 index 0000000000..b7d4f4c9d7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c @@ -0,0 +1,640 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLDATAOBJECTS_FILECODE + +/* + Creates an allocated buffer with sized data and no Op Code + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] // 0x0000000000000000- 0xFFFFFFFFFFFFFFFF + + Forces max integer size UINT64 + + Caller is responsible for freeing returned buffer. + + @param[in] Integer - Integer value to encode + @param[in] IntegerSize - Size of integer in bytes + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlSizedDataBuffer ( + IN UINT64 Integer, + IN UINTN IntegerSize, + OUT VOID **ReturnData + ) +{ + UINT8 *Data; + + if ((IntegerSize != sizeof (UINT8)) && + (IntegerSize != sizeof (UINT16)) && + (IntegerSize != sizeof (UINT32)) && + (IntegerSize != sizeof (UINT64))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Incorrect integer size=%d requested.\n", __func__, IntegerSize)); + return EFI_INVALID_PARAMETER; + } + + if ((IntegerSize < sizeof (UINT64)) && (Integer >= LShiftU64 (1, IntegerSize * 8))) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer is larger than requestd size.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Max Data Size is 64 bit. Plus one Opcode byte + Data = AllocateZeroPool (sizeof (UINT64)); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + // Already established we only have supported sizes above + switch (IntegerSize) { + case sizeof (UINT8): + *(UINT8 *)Data = (UINT8)Integer; + break; + case sizeof (UINT16): + *(UINT16 *)Data = (UINT16)Integer; + break; + case sizeof (UINT32): + *(UINT32 *)Data = (UINT32)Integer; + break; + case sizeof (UINT64): + *(UINT64 *)Data = (UINT64)Integer; + break; + } + + *ReturnData = (VOID *)Data; + return EFI_SUCCESS; +} + +/* + Calculates the optimized integer value used by AmlOPDataInteger and others + + Forces max integer size UINT64 + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *IntegerData; + UINTN IntegerDataSize; + UINT8 *Data = NULL; + UINTN DataSize; + + // Max Data Size is 64 bit. Plus one Opcode byte + IntegerData = AllocateZeroPool (sizeof (UINT64) + 1); + if (IntegerData == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + if (Integer == 0) { + // ZeroOp + IntegerDataSize = 1; + IntegerData[0] = AML_ZERO_OP; + } else if (Integer == 1) { + // OneOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONE_OP; + } else if (Integer == (UINT64) ~0x0) { + // OnesOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONES_OP; + } else { + if (Integer >= 0x100000000) { + // QWordConst + IntegerDataSize = sizeof (UINT64) + 1; + IntegerData[0] = AML_QWORD_PREFIX; + } else if (Integer >= 0x10000) { + // DWordConst + IntegerDataSize = sizeof (UINT32) + 1; + IntegerData[0] = AML_DWORD_PREFIX; + } else if (Integer >= 0x100) { + // WordConst + IntegerDataSize = sizeof (UINT16) + 1; + IntegerData[0] = AML_WORD_PREFIX; + } else { + // ByteConst + IntegerDataSize = sizeof (UINT8) + 1; + IntegerData[0] = AML_BYTE_PREFIX; + } + + DataSize = IntegerDataSize - 1; + InternalAmlSizedDataBuffer (Integer, DataSize, (VOID **)&Data); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Data Space Alloc Failed\n", __func__)); + FreePool (IntegerData); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (&IntegerData[1], Data, DataSize); + FreePool (Data); + } + + // Reallocate the pool so size is exact + *ReturnData = (VOID *)IntegerData; + *ReturnDataSize = IntegerDataSize; + + return EFI_SUCCESS; +} + +/** + Creates an optimized integer object + + Forces max integer size UINT64 + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DATA_INTEGER")); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + Integer, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an Sized Data integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +InternalAmlOPSizedData ( + IN UINT64 Integer, + IN UINTN IntegerSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "SIZED_DATA_INTEGER")); + goto Done; + } + + Object->DataSize = IntegerSize; + Status = InternalAmlSizedDataBuffer ( + Integer, + Object->DataSize, + (VOID **)&(Object->Data) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT8), ListHead); +} + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT16), ListHead); +} + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT32), ListHead); +} + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT64), ListHead); +} + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + UINT8 *Data; + UINTN DataSize; + UINTN Index; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Validate all characters + DataSize = AsciiStrLen (String); + for (Index = 0; Index < DataSize; Index++) { + if (String[Index] < 0x01) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid character String[%d] : %a\n", + __func__, + Index, + String + )); + return Status; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // AML_STRING_PREFIX + String + NULL Terminator + DataSize += 2; + Data = AllocatePool (DataSize); + if (Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: String Space Allocation %a\n", + __func__, + String + )); + goto Done; + } + + Data[0] = AML_STRING_PREFIX; + CopyMem (&Data[1], String, DataSize - 1); + + // DataString Complete, Put into Object + Object->Data = Data; + Object->DataSize = DataSize; + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Buffer == NULL) || (BufferSize == 0) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Data Buffer object\n", __func__)); + goto Done; + } + + Object->Data = AllocatePool (BufferSize); + Object->DataSize = BufferSize; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Data Buffer allocate failed\n", __func__)); + goto Done; + } + + CopyMem (Object->Data, Buffer, BufferSize); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + UINT32 EncodedEisaId; + UINT8 i; + + EncodedEisaId = 0; + + if ((String == NULL) || (ListHead == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, inputs cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AsciiStrLen (String) != 0x7) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid length for 'String' parameter.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // + // Verify String is formatted as "UUUNNNN". + // + for (i = 0; i <= 0x6; i++) { + // + // If first 3 characters are not uppercase alpha or last 4 characters are not hexadecimal + // + if (((i <= 0x2) && (!IS_ASCII_UPPER_ALPHA (String[i]))) || + ((i >= 0x3) && (!IS_ASCII_HEX_DIGIT (String[i])))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid EISA ID string format!\n", __func__)); + DEBUG ((DEBUG_ERROR, " Input String must be formatted as 'UUUNNNN'.\n")); + return EFI_INVALID_PARAMETER; + } + } + + // + // Convert string to 4-byte EISA ID encoding. + // Ex: 'PNP0A03' encodes to '0x30AD041' + // + EncodedEisaId = ((((String[0] - AML_NAME_CHAR_A + 1) & 0x1f) << 10) + + (((String[1] - AML_NAME_CHAR_A + 1) & 0x1f) << 5) + + (((String[2] - AML_NAME_CHAR_A + 1) & 0x1f) << 0) + + (UINT32)(AsciiStrHexToUint64 (&String[3]) << 16)); + + // + // Swap bytes of upper and lower WORD to format EISA ID with proper endian-ness. + // + EncodedEisaId = Swap4Bytes (EncodedEisaId); + + // + // Insert DWordPrefix into list. + // Note: EncodedEisaId will always be 32-bits, resulting in DWordConst. + // + Status = AmlOPDataInteger (EncodedEisaId, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to create ACPI DWordConst from Encoded EISA ID.\n", __func__)); + return Status; + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c new file mode 100644 index 0000000000..e8ea9d8e84 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c @@ -0,0 +1,1294 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLEXPRESSIONOPCODES_FILECODE + +// ---------------------------------------------------------------------------- +// Expression Opcodes Encoding +// ---------------------------------------------------------------------------- +// ExpressionOpcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat | +// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement | +// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit | +// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual | +// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid | +// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod | +// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr | +// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight | +// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer | +// DefToDecimalString | DefToHexString | DefToInteger | DefToString | +// DefWait | DefXOr | MethodInvocation +// ---------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN InternalBufferSize; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. Have a message with this to be + // very specific + if (BufferSize >= SIZE_4GB) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BufferSize=0x%X >= 4GB\n", __func__, BufferSize)); + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Buffer Object + Status = InternalAppendNewAmlObject (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFER object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer PkgLength object\n", __func__)); + goto Done; + } + + // Start BufferSize + Status = InternalAppendNewAmlObject (&Object, "BUFFERSIZE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFERSIZE object\n", __func__)); + goto Done; + } + + // ByteList is too complicated and must be added outside + break; + + case AmlClose: + // ByteList items should be closed already + + // Close BufferSize + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "BUFFERSIZE", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate BufferSize object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect BufferSize children\n", __func__)); + goto Done; + } + + // Set BufferSize Object to correct value and size. + // BufferSize should be from zero (no Child Data) to MAX of requested + // BufferSize or size required for ChildObject->Data. + InternalBufferSize = MAX (BufferSize, ChildObject->DataSize); + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. + if (InternalBufferSize >= SIZE_4GB) { + Status = EFI_BAD_BUFFER_SIZE; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: BufferSize 0x%X >= 4GB\n", + __func__, + InternalBufferSize + )); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + InternalBufferSize, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc BufferSize\n", __func__)); + goto Done; + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate BufferSize\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Buffer object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Buffer object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // Buffer must have at least PkgLength BufferSize + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Buffer Data\n", __func__)); + goto Done; + } + + // BufferOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_BUFFER_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the LEqual Object + Status = InternalAppendNewAmlObject (&Object, "LEQUAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start LEQUAL object\n", __func__)); + goto Done; + } + + // Operands are too complicated and must be added outside + break; + + case AmlClose: + + // Close LEqual + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "LEQUAL", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate LEqual object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // LEqual must have at least two operands + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No LEqual Args\n", __func__)); + goto Done; + } + + // LequalOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_LEQUAL_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + Creates (NumElements) section of a Package: {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + Internal only function no public reference or documentation needed. + + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlNumElements ( + IN AML_FUNCTION_PHASE Phase, + IN OUT UINTN *NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + ChildCount = 0; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Number of Elements Object + Status = InternalAppendNewAmlObject (&Object, "NUM_ELEMENTS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "NUM_ELEMENTS", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect NUM_ELEMENTS children\n", __func__)); + goto Done; + } + + // We do not have to change anything for NumElements >= Child Count + if (*NumElements == 0) { + *NumElements = ChildCount; + } else if (*NumElements < ChildCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements < ChildCount.\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } + + if (*NumElements <= MAX_UINT8) { + Object->DataSize = 1; + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = (UINT8)*NumElements; + } else { + Status = InternalAmlDataIntegerBuffer ( + *NumElements, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc NumElements\n", __func__)); + goto Done; + } + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate NumElements\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINT8 OpCode; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Package Object + Status = InternalAppendNewAmlObject (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PACKAGE object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package PkgLength object\n", __func__)); + goto Done; + } + + // Start Number of Elements Object + Status = InternalAmlNumElements (AmlStart, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlNumElements (AmlClose, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + if (NumElements <= MAX_UINT8) { + OpCode = AML_PACKAGE_OP; + } else { + OpCode = AML_VAR_PACKAGE_OP; + } + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Package object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate PACKAGE object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + // Package must have at least PkgLength NumElements + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Package Data\n", __func__)); + goto Done; + } + + // PackageOp and VarPackageOp are both one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append STORE object\n", __func__)); + goto Done; + } + + // TermArg and SuperName are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlStore(AmlStart,..) and + // AmlStore(AmlClose,...) - when creating the Store expression. + break; + + case AmlClose: + // TermArg and SuperName must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating STORE Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = AML_STORE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left or Right expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftOp Operand ShiftCount Target + ShiftOp := 0x79 or 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] ShiftOp - Specifies whether to shift left or shift + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlShift ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 ShiftOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append SHIFT object\n", __func__)); + goto Done; + } + + // Operand, ShiftCount, and Target are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlShift(AmlStart,..) and + // AmlShift(AmlClose,...) - when creating the Shift expression. + + break; + + case AmlClose: + // Operand, ShiftCount, and Target must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating SHIFT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = ShiftOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Result) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_LEFT_OP, ListHead); + return Status; +} + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_RIGHT_OP, ListHead); + return Status; +} + +/** + Creates a Find First Set Bit AML object for + both right and left searches. + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetRightBit (Source, Result) => Integer + + Bit Fields must be created between AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + DefFindSetRightBit := FindSetRightBitOp Operand Target + FindSetRightBitOp := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] FindSetOp - Specifies whether to search left or search + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlFindSetBit ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 FindSetOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append FIND_SET object\n", __func__)); + goto Done; + } + + // Source and Result are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlFindSet(AmlStart,..) and + // AmlFindSet(AmlClose,...) - when creating the FindSetBit expression. + + break; + + case AmlClose: + // Source and Result must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating FIND_SET Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = FindSetOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_LEFT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_RIGHT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start decrement expression + Status = InternalAppendNewAmlObject (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append DECREMENT object\n", __func__)); + goto Done; + } + + // Minuend is outside the scope of this object. It must be + // defined as part of a multi-tier call - in between AmlDecrement(AmlStart,..) and + // AmlDecrement(AmlClose,...) - when creating the Decrement expression. + + break; + + case AmlClose: + // Minuend must created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating DECREMENT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Decrement Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Decrement object + Object->Data[0] = AML_DECREMENT_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c new file mode 100644 index 0000000000..21deb200e3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLLOCALOBJECTS_FILECODE + +/** + Fill the DataBuffer with correct Local Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 Local variables, i.e., Local1, Local2 ... Local6. + + @param[in] LocalN - Local variable Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid LocalN provided. +**/ +EFI_STATUS +EFIAPI +InternalAmlLocalBuffer ( + IN OUT UINT8 LocalN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (LocalN) { + case 0: + Data[0] = AML_LOCAL0; + break; + case 1: + Data[0] = AML_LOCAL1; + break; + case 2: + Data[0] = AML_LOCAL2; + break; + case 3: + Data[0] = AML_LOCAL3; + break; + case 4: + Data[0] = AML_LOCAL4; + break; + case 5: + Data[0] = AML_LOCAL5; + break; + case 6: + Data[0] = AML_LOCAL6; + break; + case 7: + Data[0] = AML_LOCAL7; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "LOCALN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlLocalBuffer ( + LocalN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + LocalN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c new file mode 100644 index 0000000000..0502547a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c @@ -0,0 +1,576 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESTRING_FILECODE + +#define MAX_NAME_SEG_COUNT 255 + +/* + Is character a RootChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a RootChar + @return FALSE - Character is not a RootChar + */ +BOOLEAN +InternalIsRootChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_ROOT_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a ParentPrefixChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a ParentPrefixChar + @return FALSE - Character is not a ParentPrefixChar + */ +BOOLEAN +InternalIsParentPrefixChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_PARENT_PREFIX_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a LeadNameChar = '_', 'A' - 'Z' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a LeadNameChar + @return FALSE - Character is not a LeadNameChar + */ +BOOLEAN +InternalIsLeadNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChars '_', 'A'-'Z' + (TestChar == AML_NAME_CHAR__) || + ((TestChar >= AML_NAME_CHAR_A) && + (TestChar <= AML_NAME_CHAR_Z)) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a DigitChar = '0' - '9' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a DigitChar + @return FALSE - Character is not a DigitChar + */ +BOOLEAN +InternalIsDigitChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed DigitChars '0'-'9' + (TestChar >= AML_DIGIT_CHAR_0) && + (TestChar <= AML_DIGIT_CHAR_9) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameChar = LeadNameChar | DigitChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChar and DigitChars + InternalIsDigitChar (TestChar) || + InternalIsLeadNameChar (TestChar) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameSeg separator + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameSegSeparator ( + IN CHAR8 TestChar + ) +{ + if (TestChar == '.') { + return TRUE; + } + + return FALSE; +} + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + UINT8 *NameSeg; + UINTN NameLen; + EFI_STATUS Status; + + if (Name == NULL) { + return EFI_INVALID_PARAMETER; + } + + NameLen = AsciiStrLen (Name); + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameSeg = NULL; + // parameter validation + if ((NameLen == 0) || (NameLen > 4)) { + return EFI_INVALID_PARAMETER; + } + + if (!InternalIsLeadNameChar (Name[0])) { + return EFI_INVALID_PARAMETER; + } + + for (UINT8 i = 1; NameLen > 1 && i < NameLen; i++) { + if (!InternalIsNameChar (Name[i])) { + return EFI_INVALID_PARAMETER; + } + } + + NameSeg = AllocateZeroPool (4); + if (NameSeg == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (NameSeg, Name, NameLen); + + if (NameLen < 4) { + SetMem (&NameSeg[NameLen], 4 - NameLen, '_'); + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (Object != NULL) { + if (!EFI_ERROR (Status)) { + Object->Data = NameSeg; + Object->DataSize = 4; + Object->Completed = TRUE; + } else { + InternalFreeAmlObject (&Object, ListHead); + FreePool (NameSeg); + } + } + + return Status; +} + +/** + Creates a Namestring AML Object and inserts it into the linked list + + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + CHAR8 *NameString; + CHAR8 *NameStringPrefix; + UINTN NameStringBufferSize; + UINTN NameStringSize; + UINTN NameStringPrefixSize; + UINTN NameSegCount; + UINTN StringIndex; + UINTN StringLength; + UINTN NameSegIndex; + BOOLEAN FoundRootChar; + BOOLEAN FoundParentPrefixChar; + BOOLEAN FoundParenthesisOpenChar; + BOOLEAN FoundParenthesisCloseChar; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameString = NULL; + FoundRootChar = FALSE; + FoundParentPrefixChar = FALSE; + NameStringBufferSize = 0; + FoundParenthesisOpenChar = FALSE; + FoundParenthesisCloseChar = FALSE; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString %a object\n", __func__, String)); + goto Done; + } + + // Create a buffer to fit NameSeg [4] * max NameSegCount [255] + NameStringBufferSize = 4 * MAX_NAME_SEG_COUNT; + NameString = AllocateZeroPool (NameStringBufferSize); + // Create arbitrarily large RootChar\ParentPrefixChar buffer + NameStringPrefix = AllocateZeroPool (NameStringBufferSize); + + // Calculate length of required space + StringLength = AsciiStrLen (String); + NameStringSize = 0; + NameStringPrefixSize = 0; + NameSegIndex = 0; + NameSegCount = 0; + for (StringIndex = 0; StringIndex < StringLength; StringIndex++) { + if (NameStringPrefixSize >= NameStringBufferSize) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Exceeded ParentPrefixChar support at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (InternalIsRootChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: RootChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains more than 1 RootChar.\n", __func__, String)); + goto Done; + } + + if (FoundParentPrefixChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // RootChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundRootChar = TRUE; + } else if (InternalIsParentPrefixChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: ParentPrefixChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // ParentPrefixChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundParentPrefixChar = TRUE; + } else if (!InternalIsNameChar (String[StringIndex])) { + if (InternalIsNameSegSeparator (String[StringIndex])) { + if (NameSegIndex == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid NameSeg separator at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + NameSegIndex = 0; + } + } else if (String[StringIndex] == '(') { + if (FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisOpenChar = TRUE; + } else if (String[StringIndex] == ')') { + if (FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if (!FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: No Open Parenthesis before offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisCloseChar = TRUE; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Unsupported character at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + } else { + // Must be NameChar + if (FoundParenthesisOpenChar || FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameChar after Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if ((NameSegIndex == 0) && InternalIsDigitChar (String[StringIndex])) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: must be LeadNameChar at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (NameSegIndex >= 4) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameSeg > 4 characters at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + if (NameSegIndex == 0) { + NameSegCount++; + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Max NameSegCount=%d reached at offset=%d of String=%a'\n", + __func__, + MAX_NAME_SEG_COUNT, + StringIndex, + String + )); + goto Done; + } + } + + NameString[NameStringSize] = String[StringIndex]; + NameStringSize++; + NameSegIndex++; + if ((StringIndex + 1 >= StringLength) || + !InternalIsNameChar (String[StringIndex + 1])) + { + // Extend in progress NameSeg with '_'s + if (NameSegIndex < 4) { + SetMem (&NameString[NameStringSize], 4 - NameSegIndex, '_'); + NameStringSize += 4 - NameSegIndex; + } + } + } + } + } + + // Create AML Record with NameString contents from above + // Copy in RootChar or ParentPrefixChar(s) + if (NameStringPrefixSize != 0) { + Object->Data = ReallocatePool ( + Object->DataSize, + NameStringPrefixSize, + Object->Data + ); + CopyMem ( + &Object->Data[Object->DataSize], + NameStringPrefix, + NameStringPrefixSize + ); + Object->DataSize += NameStringPrefixSize; + FreePool (NameStringPrefix); + } + + // Set up for Dual/MultiName Prefix + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Exceeded MaxNameSegCount in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Must be at least one NameSeg in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 1) { + // Single NameSeg + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize, + Object->Data + ); + } else if (NameSegCount == 2) { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 1, + Object->Data + ); + Object->Data[Object->DataSize] = AML_DUAL_NAME_PREFIX; + Object->DataSize += 1; + } else { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 2, + Object->Data + ); + Object->Data[Object->DataSize] = AML_MULTI_NAME_PREFIX; + Object->Data[Object->DataSize + 1] = NameSegCount & 0xFF; + Object->DataSize += 2; + } + + // Copy NameString data over. From above must be at least one NameSeg + CopyMem (&Object->Data[Object->DataSize], NameString, NameStringSize); + Object->DataSize += NameStringSize; + FreePool (NameString); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + if (NameString != NULL) { + FreePool (NameString); + } + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c new file mode 100644 index 0000000000..37ae9319be --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c @@ -0,0 +1,2138 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMEDOBJECT_FILECODE + +#define METHOD_ARGS_MAX 7 +#define MAX_SYNC_LEVEL 0x0F +#define GENERIC_FIELD_IDENTIFIER "FIELD" + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Device for %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, String)); + goto Done; + } + + // Device Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_DEVICE_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an AccessField + + AccessField := 0x01 AccessType AccessAttrib + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start ACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (3); + // AML_ACCESSFIELD_OP + AccessType + AccessAttrib + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for ACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->DataSize = 3; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an ExtendedAccessField + + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Specifies the access length for the field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlExtendedAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start EXTENDEDACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (4); + // AML_EXTACCESSFIELD_OP + AccessType + AccessAttrib + AccessLength + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for EXTENDEDACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_EXT_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->Data[3] = AccessLength; + Object->DataSize = 4; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + + // x' is encoded as bits 0:7 of the AccessAttrib byte. + The description of bits 7:6 is incorrect and if AttribBytes, + AttribRawBytes, or AttribRawProcessBytes are used here, an + ExtendedAccessField is used with the following definitions + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + ExtendedAccessAttrib := ByteData // 0x0B AttribBytes + // 0x0E AttribRawBytes + // 0x0F AttribRawProcess + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // AcessType parameter check + if (AccessType > BufferAcc) { + return EFI_INVALID_PARAMETER; + } + + // AccessAttrib parameter checking + if ((AccessAttribute >= AttribNormal) && (AccessAttribute <= AttribBlock)) { + if ((AccessAttribute & 1) == 1) { + return EFI_INVALID_PARAMETER; + } + } else if (AccessAttribute > AttribRawProcessBytes) { + return EFI_INVALID_PARAMETER; + } + + // if AccessAttrib requires a length parameter, then an ExtendedAccessField is used + switch (AccessAttribute) { + case AttribBytes: + case AttribRawBytes: + case AttribRawProcessBytes: + Status = InternalAmlExtendedAccessField (AccessType, AccessAttribute, AccessLength, ListHead); + break; + default: + Status = InternalAmlAccessField (AccessType, AccessAttribute, ListHead); + break; + } + + return Status; +} + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (ObjectType >= InvalidObj) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start EXTERNAL object + Status = InternalAppendNewAmlObject (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a NameString object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, Name)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 3); + // AML_EXTERNAL_OP + Name + ObjectType + ArgumentCount + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->DataSize = 0; + Object->Data[0] = AML_EXTERNAL_OP; + Object->DataSize++; + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + Object->Data[Object->DataSize] = ObjectType; + Object->DataSize++; + Object->Data[Object->DataSize] = NumArgs; + Object->DataSize++; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Locates the AML object that holds the cumulative offset term. + This is the node directly after the node designated by + GENERIC_FIELD_IDENTIFIER in Object->Data. + + @param[out] ReturnObject - Object that contains the offset term + @param[in,out] ListHead - Linked list that contains the GENERIC_FIELD_IDENTIFIER + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateOffsetTerm ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + CHAR8 *Identifier; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + Identifier = GENERIC_FIELD_IDENTIFIER; + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + break; + } + } while (Node != ListHead); + + // Check to make sure FIELD is found, otherwise error + if ((Object->DataSize == 0) || + (Object->DataSize != IdentifierSize) || + CompareMem ( + Object->Data, + Identifier, + (MAX (Object->DataSize, IdentifierSize) != 0) + )) + { + return EFI_DEVICE_ERROR; + } + + // Have found FIELD + Node = GetNextNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + UINT8 *PkgLength; + UINTN DataLength; + EFI_STATUS Status; + UINT64 InternalOffsetData; + UINT64 BitCount; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + InternalOffsetData = 0; + BitCount = LShiftU64 (ByteOffset, 3); + Object = NULL; + OffsetObject = NULL; + PkgLength = NULL; + + // Find and read internal offset data + Status = InternalAmlLocateOffsetTerm (&OffsetObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term\n", __func__)); + goto Done; + } + + InternalOffsetData = *(UINT64 *)OffsetObject->Data; + + if (InternalOffsetData > BitCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid backwards offset\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } else if (InternalOffsetData == BitCount) { + // Do not need to append any reserved fields + Status = EFI_SUCCESS; + goto Done; + } + + // update internal offset value to new offset + *(UINT64 *)OffsetObject->Data = BitCount; + + // take difference to find how many bits to reserve + BitCount = BitCount - InternalOffsetData; + + // Create new object for the offset data, add pkglength encoding + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: appending new AML object\n", __func__)); + goto Done; + } + + Status = InternalAmlBitPkgLength ((UINT32)BitCount, &PkgLength, &DataLength); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: internal AML PkgLength\n", __func__)); + goto Done; + } + + Object->DataSize = DataLength + 1; // add one for Reserved Field Indicator + Object->Data = AllocateZeroPool (Object->DataSize); + + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Offset\n", __func__)); + goto Done; + } + + Object->Data[0] = 0; + CopyMem (&Object->Data[1], PkgLength, DataLength); // read internal offset data + Object->Completed = TRUE; + FreePool (PkgLength); + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + EFI_STATUS Status; + + if ((ListHead == NULL) || (Name == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + OffsetObject = NULL; + + if (AsciiStrLen (Name) == 0) { + if (BitLength > 0) { + // Prepend a 0 to the list + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (1); + Object->DataSize = 1; + Object->Completed = TRUE; + } else { + Status = EFI_SUCCESS; + goto Done; + } + } else { + // add NameSeg to List + Status = InternalAmlNameSeg (Name, ListHead); + } + + if (EFI_ERROR (Status)) { + goto Done; + } + + // Locate and update internal Offset term + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating offset term for %a object\n", __func__, Name)); + goto Done; + } + + *(UINT64 *)Object->Data += BitLength; // write + + // Add BitLength as a PkgLength term + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlBitPkgLength (BitLength, &Object->Data, &Object->DataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (Name == NULL) || (AsciiStrLen (Name) == 0)) { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field for %a object\n", __func__, Name)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field internal offset %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, Name)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, Name)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || + (BankName == NULL) || (AsciiStrLen (BankName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField internal offset %a object\n", __func__, BankName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required Region NameString + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, RegionName)); + goto Done; + } + + // Insert required Bank NameString + Status = AmlOPNameString (BankName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required BankValue integer + Status = AmlOPDataInteger (BankValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Adding BankValue Integer for %a object\n", __func__, BankName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, BankName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameStrings completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, BankName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, BankName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, BankName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, BankName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_BANK_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (IndexName == NULL) || (AsciiStrLen (IndexName) == 0) || + (DataName == NULL) || (AsciiStrLen (DataName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField internal offset %a object\n", __func__, IndexName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Index NameString + Status = AmlOPNameString (IndexName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Data NameString + Status = AmlOPNameString (DataName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, DataName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, IndexName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, IndexName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, IndexName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, IndexName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, IndexName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_INDEX_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_STATUS Status; + + // Input parameter validation + if ((RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || (ListHead == NULL) || + ((RegionSpace > PCC) && (RegionSpace < 0x80)) || (RegionSpace > 0xFF)) + { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + ChildObject = NULL; + Status = EFI_DEVICE_ERROR; + + Status = InternalAppendNewAmlObject (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start OpRegion for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Name String for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPByteData ((UINT8)RegionSpace, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Region space byte data for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Offset, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Offset data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Length, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Length data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, RegionName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, RegionName)); + goto Done; + } + + // OpRegion Opcode is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, RegionName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_REGION_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + Object = NULL; + + if ((SourceBuffer == NULL) || (FieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + ChildObject = NULL; + Status = InternalAppendNewAmlObject (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (BitIndex, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BitIndex for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (NumBits, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumBits for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (FieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FieldName)); + goto Done; + } + + // CreateFieldOp is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FieldName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_CREATE_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Internal function used to create a CreateBit|Byte|Word|DWord|QWordField objects + and insert them into the linked list + + @param[in] SourceBuffer, - Buffer to insert the new buffer fixed field object + @param[in] Index, - Starting index to place the new buffer + @param[in] FixedFieldName, - Name of the FixedField + @param[in] OpCode, - AML opcode for the Create_Field encoding + @param[in,out] ListHead - Linked list has completed CreateFixedField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlCreateFixedField ( + IN CHAR8 *SourceBuffer, + IN UINT64 Index, + IN CHAR8 *FixedFieldName, + IN UINT8 OpCode, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + + if ((SourceBuffer == NULL) || (FixedFieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FixedFieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObject (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Check if Localx Buffer + if (AsciiStrnCmp (SourceBuffer, "Local", 5) == 0) { + if ((SourceBuffer[5] >= '0') && (SourceBuffer[5] <= '9')) { + Status = AmlOPLocalN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[5]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: LocalN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + // Check if Argx Buffer + } else if (AsciiStrnCmp (SourceBuffer, "Arg", 3) == 0) { + if ((SourceBuffer[3] >= '0') && (SourceBuffer[3] <= '9')) { + Status = AmlOpArgN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[3]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ArgN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + } else { + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + Status = AmlOPDataInteger (Index, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Index for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = AmlOPNameString (FixedFieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FixedFieldName)); + goto Done; + } + + // CreateWordFieldOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FixedFieldName)); + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, BitIndex, BitFieldName, AML_CREATE_BIT_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, ByteFieldName, AML_CREATE_BYTE_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, DWordFieldName, AML_CREATE_DWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, QWordFieldName, AML_CREATE_QWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, WordFieldName, AML_CREATE_WORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 MethodFlags; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (SyncLevel > MAX_SYNC_LEVEL) || + (SerializeRule >= FlagInvalid) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Method for %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Method Flags + Status = InternalAppendNewAmlObject (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + // Add Method Flags + Status = InternalAmlLocateObjectByIdentifier (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a METHOD_FLAGS child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Flags is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + MethodFlags = NumArgs & 0x07; + if (SerializeRule) { + MethodFlags |= BIT3; + } + + MethodFlags |= (SyncLevel & 0x0F) << 4; + Object->Data[0] = MethodFlags; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_METHOD_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c new file mode 100644 index 0000000000..afe51cdcf2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c @@ -0,0 +1,360 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESPACEMODIFIEROBJECTS_FILECODE + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + // Scope Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_SCOPE_OP; + CopyMem (&Object->Data[1], ChildObject->Data, ChildObject->DataSize); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString ChildObjectData + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, String)); + goto Done; + } + + break; + case AmlClose: + // DataRefObject should be closed already + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + Object->Data = AllocatePool (ChildObject->DataSize + 1); + // Name Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_NAME_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((SourceName == NULL) || (AliasName == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start ALIAS object + Status = InternalAppendNewAmlObject (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append ALIAS object\n", __func__)); + goto Done; + } + + // Insert required Object (to be aliased) NameString + Status = AmlOPNameString (SourceName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, SourceName)); + goto Done; + } + + // Insert required Alias NameString + Status = AmlOPNameString (AliasName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, AliasName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot locate ALIAS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, SourceName)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + // Alias Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, SourceName)); + goto Done; + } + + Object->Data[0] = AML_ALIAS_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c new file mode 100644 index 0000000000..279bfc782d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c @@ -0,0 +1,144 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLOBJECTSDEBUG_FILECODE + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ) +{ + UINTN Column; + UINTN Index; + UINTN NumberOfColumns; + UINT8 *Data; + + Data = Buffer; + NumberOfColumns = 16; + // Header + DEBUG ((DEBUG_VERBOSE, " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n")); + for (Index = 0; Index < BufferSize;) { + // Row Counter + DEBUG ((DEBUG_VERBOSE, "%4X ", Index)); + + // Hex ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + DEBUG ((DEBUG_VERBOSE, " %02X", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, " ")); + } + } + + DEBUG ((DEBUG_VERBOSE, " ")); + // Ascii ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + // Only print ACPI acceptable characters + if (((Data[Index + Column] >= 0x30) && // '0' - '9' + (Data[Index + Column] <= 0x39)) || + ((Data[Index + Column] >= 0x41) && // 'A' - 'Z' + (Data[Index + Column] <= 0x5A)) || + (Data[Index + Column] == 0x5C) || // '\' + (Data[Index + Column] == 0x5F) || // '_' + (Data[Index + Column] == 0x5E) // '^' + ) + { + DEBUG ((DEBUG_VERBOSE, "%c", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, ".")); + } + } + } + + Index += NumberOfColumns; + DEBUG ((DEBUG_VERBOSE, "\n")); + } + + return EFI_SUCCESS; +} + +/** + DEBUG print an AML Object including an array of HEX bytes for the data + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS, EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if ((Object == NULL) || (Object->Signature != AML_OBJECT_INSTANCE_SIGNATURE)) { + return EFI_INVALID_PARAMETER; + } + + DEBUG (( + DEBUG_VERBOSE, + "Object=0x%X, Size=0x%d\n", + (UINTN)Object, + Object->DataSize + )); + AmlDebugPrintBuffer (Object->Data, Object->DataSize); + DEBUG ((DEBUG_VERBOSE, "Completed=%a\n", Object->Completed ? "TRUE" : "FALSE")); + DEBUG ((DEBUG_VERBOSE, "\n")); + return EFI_SUCCESS; +} + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + DEBUG ((DEBUG_VERBOSE, "Printing AML_OBJECT_INSTANCE Linked List\n")); + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + AmlDebugPrintObject (Object); + Node = GetNextNode (ListHead, Node); + } + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c new file mode 100644 index 0000000000..85d184b759 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c @@ -0,0 +1,267 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLPKGLENGTH_FILECODE + +#define MAX_ONE_BYTE_PKG_LENGTH 63 +#define ONE_BYTE_PKG_LENGTH_ENCODING 0x00 +#define ONE_BYTE_NIBBLE_MASK 0x3F + +#define MAX_TWO_BYTE_PKG_LENGTH 4095 +#define TWO_BYTE_PKG_LENGTH_ENCODING 0x40 +#define PKG_LENGTH_NIBBLE_MASK 0x0F + +#define MAX_THREE_BYTE_PKG_LENGTH 1048575 +#define THREE_BYTE_PKG_LENGTH_ENCODING 0x80 + +#define MAX_FOUR_BYTE_PKG_LENGTH 268435455 +#define FOUR_BYTE_PKG_LENGTH_ENCODING 0xC0 + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ) +{ + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + EFI_STATUS Status; + + Status = EFI_INVALID_PARAMETER; + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((DataSize) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((DataSize) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + // DataSize = DataLength + DataSize; + *PkgLengthEncoding = AllocatePool (DataLength); + if (*PkgLengthEncoding == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + *PkgLengthEncoding[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (DataSize) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&PkgLengthEncoding[0][1], &PkgLengthRemainder, DataLength - 1); + } + + *ReturnDataLength = DataLength; + +Done: + return Status; +} + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Length object\n", __func__)); + goto Done; + } + + break; + case AmlClose: + Status = InternalAmlLocateObjectByIdentifier (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Length object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, "Length")); + goto Done; + } + + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((ChildObject->DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((ChildObject->DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_DEVICE_ERROR; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + Object->DataSize = DataLength + ChildObject->DataSize; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + Object->Data[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (ChildObject->DataSize + DataLength) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&Object->Data[1], &PkgLengthRemainder, DataLength - 1); + } + + CopyMem ( + &Object->Data[DataLength], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c new file mode 100644 index 0000000000..4ef746327b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c @@ -0,0 +1,1989 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLRESOURCEDESCRIPTOR_FILECODE + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_ACPI_END_TAG_DESCRIPTOR *EndTag; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = AmlBuffer (AmlStart, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + // Start EndTag object to be completed in Close + // ACPI 6.3: 6.4.2.9 End Tag: ...The End Tag is automatically generated by + // the ASL compiler at the end of the ResourceTemplate statement. + Status = InternalAppendNewAmlObject (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "END_TAG")); + goto Done; + } + + // ResourceMacroList is too complicated and must be added outside + break; + case AmlClose: + // ResourceMacroList should be closed already + + // Locate and complete End Tag + Status = InternalAmlLocateObjectByIdentifier (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, "END_TAG")); + goto Done; + } + + // Release Object->Data Identifier + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: EndTag Alloc Failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + // ChildObject Data goes before End Tag + if ((ChildObject->Data != NULL) && (ChildObject->DataSize > 0)) { + CopyMem (Object->Data, ChildObject->Data, ChildObject->DataSize); + } + + EndTag = (EFI_ACPI_END_TAG_DESCRIPTOR *)&Object->Data[ChildObject->DataSize]; + EndTag->Desc = ACPI_END_TAG_DESCRIPTOR; + // Spec says the byte is a checksum, but I have never seen a value other + // than zero in the field compiled from ASL. + // EndTag->Checksum already = 0; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = AmlBuffer (AmlClose, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + InternalAmlAddressSpaceCheck + + Checks Address space parameters for Word, DWord, or QWord size Address space + Descriptor. Size will be constrained by the Resource Descriptor input + parameters being of the correct size. + + @param[in] IsMinFixed + @param[in] IsMaxFixed + @param[in] AddressGranularity + @param[in] AddressMinimum + @param[in] AddressMaximum + @param[in] RangeLength + +**/ +EFI_STATUS +EFIAPI +InternalAmlAddressSpaceCheck ( + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 RangeLength + ) +{ + // Max must be greater than Min + if (AddressMaximum < AddressMinimum) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum greater than AddressMaximum\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Address Granularity must be (2^n)-1 + if (((AddressGranularity + 1) & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity must be (a power of 2)-1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (RangeLength == 0) { + // LEN _MIF _MAF Definition + // 0 0 0 + // 0 0 1 + // 0 1 0 + // Variable size, variable location resource descriptor for _PRS. + // If _MIF is set, _MIN must be a multiple of (_GRA+1). If _MAF + // is set, _MAX must be (a multiple of (_GRA+1))-1. + // OS can pick the resource range that satisfies following conditions: + // If _MIF is not set, start address is a multiple of (_GRA+1) + // and greater or equal to _MIN. Otherwise, start address is _MIN. + // If _MAF is not set, end address is (a multiple of (_GRA+1))-1 + // and less or equal to _MAX. Otherwise, end address is _MAX. + // 0 1 1 (Invalid combination) + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // 0 1 1 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsMinFixed and IsMaxFixed cannot both be set\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED) { + // 0 0 1 + if ((AddressMaximum & AddressGranularity) != AddressGranularity) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMaximum=0x%lX + 1) is not a multiple of\n", __func__, AddressMaximum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressMaximum == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMaximum can not be 0\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if (IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) { + // 0 1 0 + if ((AddressMinimum & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum=0x%lX is not a multiple of\n", __func__, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED) && + (AddressMinimum == 0) && + (AddressMaximum == 0) && + (AddressGranularity == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Maximum, Minimum, Granularity all 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else { + // LEN _MIF _MAF Definition + // >0 0 0 Fixed size, variable location resource descriptor for _PRS. + // _LEN must be a multiple of (_GRA+1). + // OS can pick the resource range that satisfies following conditions: + // Start address is a multiple of (_GRA+1) and greater or equal to _MIN. + // End address is (start address+_LEN-1) and less or equal to _MAX. + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + // >0 1 1 Fixed size, fixed location resource descriptor. + // _GRA must be 0 and _LEN must be (_MAX - _MIN +1). + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED)) + { + // >0 0 0 + if ((RangeLength & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX is not a multiple of\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 0, IsMaxFixed = 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength > (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX > (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 0, IsMaxFixed = 0\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // >0 1 1 + if (AddressGranularity != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity=0x%lX != 0\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX > 0, IsMinFixed = 1, and IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength != (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX != (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 1, IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else { + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: When RangeLength=0x%lX > 0,\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed and IsMaxFixed must both be either 1 or 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } + + return EFI_SUCCESS; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + The DWORD address space descriptor is used to report resource usage in a + 32-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPDWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: DWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DMA_DESCRIPTOR *Descriptor; + + if ((DmaType & (UINT8) ~EFI_ACPI_DMA_SPEED_TYPE_MASK) != 0) { + // Invalid DmaType value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaType '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if ((IsBusMaster & ~EFI_ACPI_DMA_BUS_MASTER_MASK) != 0) { + // Invalid IsBusMaster value + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsBusMaster '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (((DmaTransferSize & ~EFI_ACPI_DMA_TRANSFER_TYPE_MASK) != 0) || + (DmaTransferSize == 0x3)) + { + // Invalid DmaTransferSize value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaTransferSize '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "DMA_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DMA_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DMA_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DMA_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_DMA_DESCRIPTOR; + Descriptor->ChannelMask = DmaChannelList; + // + // Descriptor->Information bit mask: + // Bit [7] Reserved (must be 0) + // Bits [6:5] DMA channel speed supported, _TYP + // 00 Indicates compatibility mode + // 01 Indicates Type A DMA as described in the EISA + // 10 Indicates Type B DMA + // 11 Indicates Type F + // Bits [4:3] Ignored + // Bit [2] Logical device bus master status, _BM + // 0 Logical device is not a bus master + // 1 Logical device is a bus master + // Bits [1:0] DMA transfer type preference, _SIZ + // 00 8-bit only + // 01 8- and 16-bit + // 10 16-bit only + Descriptor->Information = (UINT8)(DmaType + + IsBusMaster + + DmaTransferSize); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 are Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create QWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPQWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: QWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "QWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "QWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IRQ_DESCRIPTOR *Descriptor; + + if ((EdgeLevel & (UINT8) ~EFI_ACPI_IRQ_MODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: EdgeLevel '%x' is not valid.\n", __func__, EdgeLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((ActiveLevel & (UINT8) ~EFI_ACPI_IRQ_POLARITY_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ActiveLevel '%x' is not valid.\n", __func__, ActiveLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((Shared & (UINT8) ~(EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | EFI_ACPI_IRQ_SHARABLE_MASK)) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Shared '%x' is not valid.\n", __func__, Shared)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create %a object.", __func__, "IRQ_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IRQ_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Alloc for %a failed\n", __func__, "IRQ_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IRQ_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_IRQ_DESCRIPTOR; + Descriptor->Mask = InterruptList; + // + // Ref 6.4.2.1 IRQ Descriptor - IRQ Information + // Descriptor->Information bit mask: + // IRQ Information. Each bit, when set, indicates this device is capable of + // driving a certain type of interrupt. (Optional-if not included then assume + // edge sensitive, high true interrupts.) These bits can be used both for + // reporting and setting IRQ resources. + // Note: This descriptor is meant for describing interrupts that are connected + // to PIC-compatible interrupt controllers, which can only be programmed + // for Active-High-Edge-Triggered or Active-Low-LevelTriggered interrupts. + // Any other combination is invalid. The Extended Interrupt Descriptor can + // be used to describe other combinations. + // + // Bit [7:6] Reserved (must be 0) + // Bit [5] Wake Capability, _WKC + // 0x0 = Not Wake Capable: This interrupt is not capable of waking the system. + // 0x1 = Wake Capable: This interrupt is capable of waking the system from a + // low-power idle state or a system sleep state. + // Bit [4] Interrupt Sharing, _SHR + // 0x0 = Exclusive: This interrupt is not shared with other devices. + // 0x1 = Shared: This interrupt is shared with other devices. + // Bit [3] Interrupt Polarity, _LL + // 0 Active-High - This interrupt is sampled when the signal is high, or true + // 1 Active-Low - This interrupt is sampled when the signal is low, or false. + // Bit [2:1] Ignored + // Bit [0] Interrupt Mode, _HE + // 0 Level-Triggered - Interrupt is triggered in response to signal in a low state. + // 1 Edge-Triggered - Interrupt is triggered in response to a change in signal state from + // low to high. + // + Descriptor->Information = (UINT8)((EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | + EFI_ACPI_IRQ_SHARABLE_MASK | + EFI_ACPI_IRQ_POLARITY_MASK | + EFI_ACPI_IRQ_MODE_MASK) & + (Shared | + ActiveLevel | + EdgeLevel)); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IO_PORT_DESCRIPTOR *Descriptor; + UINT64 Remainder; + + if ((Decode & (UINT8) ~EFI_ACPI_IO_DECODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Decode '%x' is not valid.\n", __func__, Decode)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressAlignment != 0) { + DivU64x64Remainder (AddressMin, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMin=0x%X) is not a multiple of\n", __func__, AddressMin)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + + DivU64x64Remainder (AddressMax, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMax=0x%X) is not a multiple of\n", __func__, AddressMax)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IO_PORT_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IO_PORT_DESCRIPTOR *)Object->Data; + + /* + * According to ACPI spec for + * ACPI_IO_PORT_DESCRIPTOR = 0x47 contains the informaion about + * Name, Type and Length, hence no need to calculate the length. + * Below is description from ACPI spec + * Byte 0 I/O Port Descriptor Value = 0x47 (01000111B) - Type = 0, Small item name = + * 0x8, Length = 7 + */ + Descriptor->Header.Byte = ACPI_IO_PORT_DESCRIPTOR; + // + // Descriptor->Information bit mask: + // Bit [7:1] Reserved, must be 0 + // Bit [0] (_DEC) + // 1 The logical device decodes 16-bit addresses + // 0 The logical device decodes 10-bit addresses + Descriptor->Information = (UINT8)(EFI_ACPI_IO_DECODE_MASK & Decode); + Descriptor->BaseAddressMin = AddressMin; + Descriptor->BaseAddressMax = AddressMax; + Descriptor->Alignment = AddressAlignment; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *Descriptor; + + if ((AddressSpaceKeyword < EFI_ACPI_6_4_SYSTEM_MEMORY) || + (AddressSpaceKeyword > EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if ((AddressSpaceKeyword > EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL) && + (AddressSpaceKeyword < EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if (AccessSize > EFI_ACPI_6_4_QWORD) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AccessSize=0x%02X\n", __func__, AccessSize)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *)Object->Data; + + Descriptor->Header.Header.Byte = ACPI_GENERIC_REGISTER_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->AddressSpaceId = AddressSpaceKeyword; + Descriptor->RegisterBitWidth = RegisterBitWidth; + Descriptor->RegisterBitOffset = RegisterBitOffset; + Descriptor->AddressSize = AccessSize; + Descriptor->RegisterAddress = RegisterAddress; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: Evaluates to a 32-bit integer that specifies the total number of + bytes decoded in the memory range. The 32-bit field DescriptorName. _LEN is + automatically created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *Descriptor; + + if ((ReadAndWrite & (UINT8) ~EFI_ACPI_MEMORY_WRITE_STATUS_MASK) != 0) { + // Invalid ReadAndWrite value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ReadAndWrite '%x' is not valid.\n", __func__, ReadAndWrite)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "MEMORY_32_FIXED_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "MEMORY_32_FIXED_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->Information = ReadAndWrite; + Descriptor->BaseAddress = AddressBase; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + The WORD address space descriptor is used to report resource usage in a + 16-bit address space (like memory and I/O, Bus Number). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "WORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + + This function only requires a single call and therefore no Phases + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_BUS, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + 0, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c new file mode 100644 index 0000000000..03201d0109 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c @@ -0,0 +1,515 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLSTATEMENTOPCODES_FILECODE + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Else", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Else", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_ELSE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "If", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "If", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_IF_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + Status = InternalAppendNewAmlObject (&Object, NotifyObject, ListHead); + Status = AmlOPNameString (NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyObject NameString\n", __func__)); + goto Done; + } + + Status = AmlOPDataInteger (NotifyValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyValue Integer\n", __func__)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_NOTIFY_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Return", ListHead); + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Return", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + // Return without arguments is treated like Return(0) + // Zeroed byte = ZeroOp + ChildObject->Data = AllocateZeroPool (sizeof (UINT8)); + if (ChildObject->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Zero Child for Return\n", __func__)); + goto Done; + } + + ChildObject->DataSize = 1; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_RETURN_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c new file mode 100644 index 0000000000..c9a4399764 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c @@ -0,0 +1,213 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLTABLE_FILECODE + +// String Length Constants +#define OEM_ID_LENGTH 6 +#define OEM_TABLE_ID_LENGTH 8 +#define SIGNATURE_LENGTH 4 +#define CREATOR_ID_LENGTH 4 + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (ListHead == NULL) || + (TableNameString == NULL) || + (OemId == NULL) || + (OemTableId == NULL) || + (CreatorId == NULL) || + (AsciiStrLen (TableNameString) != SIGNATURE_LENGTH) || + (AsciiStrLen (OemId) > OEM_ID_LENGTH) || + (AsciiStrLen (OemTableId) > OEM_TABLE_ID_LENGTH) || + (AsciiStrLen (CreatorId) != CREATOR_ID_LENGTH)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, TableNameString, ListHead); + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, TableNameString, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate %a object\n", __func__, TableNameString)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, TableNameString)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_DESCRIPTION_HEADER); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, TableNameString)); + goto Done; + } + + // Fill table header with data + // Signature + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Signature)], + TableNameString, + AsciiStrLen (TableNameString) + ); + + // Table Length + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Length)], + (UINT32 *)&Object->DataSize, + sizeof (UINT32) + ); + + // ACPI Table Version + Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Revision)] = ComplianceRev; + + // OEM ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemId)], + OemId, + AsciiStrLen (OemId) + ); + + // OEM Table ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemTableId)], + OemTableId, + AsciiStrLen (OemTableId) + ); + + // OEM Table Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemRevision)], + (UINT8 *)&OemRevision, + sizeof (UINT32) + ); + + // Creator ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorId)], + CreatorId, + AsciiStrLen (CreatorId) + ); + + // Creator Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorRevision)], + (UINT8 *)&CreatorRevision, + sizeof (UINT32) + ); + + // Copy rest of data into Object + CopyMem ( + &Object->Data[sizeof (EFI_ACPI_DESCRIPTION_HEADER)], + ChildObject->Data, + ChildObject->DataSize + ); + + // Checksum Set on Table Install + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c new file mode 100644 index 0000000000..b1ad9b7037 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c @@ -0,0 +1,364 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_LOCALAMLOBJECTS_FILECODE + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if (Object == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (Object->Data != NULL) { + FreePool (Object->Data); + Object->Data = NULL; + Object->DataSize = 0; + Object->Completed = FALSE; + } + + return EFI_SUCCESS; +} + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **FreeObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + + if ((FreeObject == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = *FreeObject; + if (Object != NULL) { + InternalFreeAmlObjectData (Object); + if (IsNodeInList (ListHead, &Object->Link)) { + RemoveEntryList (&Object->Link); + } + + FreePool (Object); + } + + *FreeObject = NULL; + return EFI_SUCCESS; +} + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ) +{ + AML_OBJECT_INSTANCE *Object; + + if (ReturnObject == NULL) { + return EFI_INVALID_PARAMETER; + } + + *ReturnObject = NULL; + + // Allocate AML Object + Object = AllocateZeroPool (sizeof (AML_OBJECT_INSTANCE)); + if (Object == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Object Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + Object->DataSize = 0; + Object->Data = NULL; + Object->Signature = AML_OBJECT_INSTANCE_SIGNATURE; + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((ListHead == NULL) || (ReturnObject == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = InternalNewAmlObjectNoData (&Object); + if (!EFI_ERROR (Status)) { + InsertTailList (ListHead, &Object->Link); + *ReturnObject = Object; + } + + return Status; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + // Allocate Identifier Data + NULL termination + Object->DataSize = AsciiStrLen (Identifier) + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Data Identifier=%a\n", __func__, Identifier)); + InternalFreeAmlObject (&Object, ListHead); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (Object->Data, Identifier, Object->DataSize); + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + + if (Object->Completed) { + // Object to be found cannot be completed yet + continue; + } else { + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + *ReturnObject = Object; + return EFI_SUCCESS; + } else { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: First incomplete Object is not %a.\n", + __func__, + Identifier + )); + // Object looking for should be the first uncompleted Object. + return EFI_NOT_FOUND; + } + } + } while (Node != ListHead); + + *ReturnObject = NULL; + return EFI_NOT_FOUND; +} + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 *TempBuffer; + + Status = EFI_SUCCESS; + if ((ReturnObject == NULL) || + (ChildCount == NULL) || + (Link == NULL) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + *ChildCount = 0; + + Status = InternalNewAmlObjectNoData (&Object); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocating Object Data\n", __func__)); + goto Done; + } + + // Get first Child Node + Node = GetNextNode (ListHead, Link); + while (Node != ListHead) { + ChildObject = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Expand data buffer to fit existing data + new data + TempBuffer = ReallocatePool ( + Object->DataSize, + Object->DataSize + ChildObject->DataSize, + Object->Data + ); + if (TempBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + FreePool (Object->Data); + Object->Data = NULL; + DEBUG ((DEBUG_ERROR, "%a: ERROR: reallocating Object Data\n", __func__)); + goto Done; + } + + Object->Data = TempBuffer; + // Copy new data at end of buffer + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + // Get Next ChildObject Node, then free ChildObject from list + Node = GetNextNode (ListHead, Node); + InternalFreeAmlObject (&ChildObject, ListHead); + *ChildCount = *ChildCount + 1; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + Object = NULL; + } + + *ReturnObject = Object; + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c new file mode 100644 index 0000000000..2f4f676adb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c @@ -0,0 +1,13 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/*---------------------------------------------------------------------------------------- + * M O D U L E S U S E D + *---------------------------------------------------------------------------------------- + */ +#include <Filecode.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c new file mode 100644 index 0000000000..60305ee4a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c @@ -0,0 +1,90 @@ +/** @file + Library to support reset library, inheritted from Agesa Cf9Reset module. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> + +/** + This function causes a system-wide reset (cold reset), in which + all circuitry within the system returns to its initial state. This type of reset + is asynchronous to system operation and operates without regard to + cycle boundaries. + + If this function returns, it means that the system does not support cold reset. +**/ +VOID +EFIAPI +ResetCold ( + VOID + ) +{ +} + +/** + This function causes a system-wide initialization (warm reset), in which all processors + are set to their initial state. Pending cycles are not corrupted. + + If this function returns, it means that the system does not support warm reset. +**/ +VOID +EFIAPI +ResetWarm ( + VOID + ) +{ +} + +/** + This function causes the system to enter a power state equivalent + to the ACPI G2/S5 or G3 states. + + If this function returns, it means that the system does not support shutdown reset. +**/ +VOID +EFIAPI +ResetShutdown ( + VOID + ) +{ +} + +/** + This function causes the system to enter S3 and then wake up immediately. + + If this function returns, it means that the system does not support S3 feature. +**/ +VOID +EFIAPI +EnterS3WithImmediateWake ( + VOID + ) +{ +} + +/** + This function causes a systemwide reset. The exact type of the reset is + defined by the EFI_GUID that follows the Null-terminated Unicode string passed + into ResetData. If the platform does not recognize the EFI_GUID in ResetData + the platform must pick a supported reset type to perform.The platform may + optionally log the parameters from any non-normal reset that occurs. + + @param[in] DataSize The size, in bytes, of ResetData. + @param[in] ResetData The data buffer starts with a Null-terminated string, + followed by the EFI_GUID. +**/ +VOID +EFIAPI +ResetPlatformSpecific ( + IN UINTN DataSize, + IN VOID *ResetData + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c new file mode 100644 index 0000000000..d10e676668 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c @@ -0,0 +1,87 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Filecode.h> +#include <Uefi.h> +/*----------------------------------------------------------------------------------------*/ + +/** + * @param[in] EspiBase Espi MMIO base + * @param[in] RegAddr Slave register address + * + * @retval Register Value + */ +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ) +{ + return 0; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to read + * @param[in] Length Length in byte to read + * @param[in] Buffer Pointer to the data read to + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to write + * @param[in] Length Length in byte to write + * @param[in] Value Pointer to the data to write + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to erase + * @param[in] Length Block Size to erase + * + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c new file mode 100755 index 0000000000..9044d3d497 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c @@ -0,0 +1,68 @@ +/** @file + GNB function to create/locate PCIe configuration data area, Contain code + that create/locate/manages GNB/PCIe configuration + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/NbioHandleLib.h> +#include <Library/AmdBaseLib.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ) +{ + return NULL; +} + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ) +{ + PCI_ADDR PciAddr; + + PciAddr.AddressValue = 0; + return PciAddr; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c new file mode 100755 index 0000000000..d5fbe98d22 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c @@ -0,0 +1,276 @@ +/** @file + GNB function to create/locate PCIe configuration data area + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/GnbPcieConfigLib.h> + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ) +{ + return FALSE; +} + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ) +{ + return 0; +} + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ) +{ +} + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ +} + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ) +{ + return FALSE; +} + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ + return NULL; +} + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ) +{ +} + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ) +{ +} + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ) +{ +} + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c new file mode 100755 index 0000000000..5c6be22ee4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c @@ -0,0 +1,117 @@ +/** @file + Procedure to parse PCIe input configuration data + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <GnbDxio.h> + +/** + Get number of complexes in platform topology configuration + + @param[in] ComplexList First complex configuration in complex configuration array + @retval Number of Complexes + +**/ +UINTN +PcieInputParserGetNumberOfComplexes ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList + ) +{ + return 0; +} + +/** + Get number of PCIe engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfPcieEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of DDI engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfDdiEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of engines in given complex + + + + @param[in] Complex Complex configuration header + @retval Number of Engines +**/ +UINTN +PcieInputParserGetNumberOfEngines ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] Index Complex descriptor Index + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINTN Index + ) +{ + return NULL; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] SocketId Socket Id + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptorOfSocket ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINT32 SocketId + ) +{ + return NULL; +} + +/** + Get Engine descriptor from given complex by index + + @param[in] Complex Complex descriptor + @param[in] Index Engine descriptor index + @retval Pointer to Engine Descriptor +**/ +PCIE_ENGINE_DESCRIPTOR * +PcieInputParserGetEngineDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex, + IN UINTN Index + ) +{ + return NULL; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c new file mode 100644 index 0000000000..e6be32b071 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c @@ -0,0 +1,10 @@ +/** @file + SMN Register Access Methods + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/SmnAccessLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c new file mode 100644 index 0000000000..1dc13900c7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c @@ -0,0 +1,42 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/PcieConfigLib.h> +#include <Library/NbioCommonLibDxe.h> + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c new file mode 100644 index 0000000000..fbd3ddcf37 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c @@ -0,0 +1,23 @@ +/** @file + APCB DXE Driver + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PcdLib.h> + +EFI_STATUS +EFIAPI +AmdApcbV3DxeDriverEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c new file mode 100644 index 0000000000..23d1a8fee0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> + +/** + * @brief Amd Apcb V3 Pei Driver Entry + * + * @param[in] FileHandle File Handie + * @param[in] PeiServices Pei Services + * + * @retval EFI_SUCCESS Set APCB value successfully + * Non-EFI_SUCCESS Function Error + * + **/ +EFI_STATUS +EFIAPI +AmdApcbV3PeiDriverEntry ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c new file mode 100644 index 0000000000..74b129931b --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c @@ -0,0 +1,39 @@ +/** @file + Required OEM hooks for CCX initialization + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + Hook to store the vector that all APs should jump to out of reset to a non-volatile, + shared location. + + @param[in] ApInitAddress Address of the code that AP should jump to + @param[in,out] ContentToRestore The current value in the non-volatile storage + +**/ +VOID +SaveApInitVector ( + IN UINT32 ApInitAddress, + IN OUT UINT32 *ContentToRestore + ) +{ +} + +/** + Hook to restore the initial content of the non-volatile storage location. + + @param[in] ContentToRestore The value to restore + +**/ +VOID +RestoreContentVector ( + IN UINT32 ContentToRestore + ) +{ +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c new file mode 100644 index 0000000000..54ce202cb1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c @@ -0,0 +1,33 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Ppi/PciCfg2.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> + +/** + Module's entry function. + This routine will install EFI_PEI_PCI_CFG2_PPI. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @return Whether success to install service. +**/ +EFI_STATUS +EFIAPI +PeimInitializePciCfg ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c new file mode 100644 index 0000000000..643174d7b9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/PciSegmentInfoLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> + +/** + Return an array of PCI_SEGMENT_INFO holding the segment information. + + Note: The returned array/buffer is owned by callee. + + @param Count Return the count of segments. + + @retval A callee owned array holding the segment information. +**/ +PCI_SEGMENT_INFO * +EFIAPI +GetPciSegmentInfo ( + UINTN *Count + ) +{ + return (PCI_SEGMENT_INFO *)NULL; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c new file mode 100644 index 0000000000..d83bb6c2d8 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c @@ -0,0 +1,15 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiSmm.h> +#include <Register/Cpuid.h> +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Library/DebugLib.h> +#include <Protocol/SmmBase2.h> +#include <Library/IoLib.h> diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c new file mode 100644 index 0000000000..a264eb9294 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c @@ -0,0 +1,12 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/PcdLib.h> diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c new file mode 100644 index 0000000000..e379538e3a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c @@ -0,0 +1,36 @@ +/** @file + OEM OOB PPR DXE Driver. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <Library/DebugLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciIo.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TimerLib.h> +#include <IndustryStandard/Pci22.h> + +/** +* This function installs a protocol used by platform BIOS to provide the hotplug descriptor. +* +* @param[in] ImageHandle Image handler +* @param[in] SystemTable Pointer to the system table +* +* @retval EFI_SUCCESS The thread was successfully launched. +* +**/ +EFI_STATUS +EFIAPI +OobPprEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c new file mode 100644 index 0000000000..5242e6261a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c @@ -0,0 +1,20 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DebugLib.h> + +EFI_STATUS +EFIAPI +PspPlatformEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c new file mode 100644 index 0000000000..530bd9d4b6 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiPei.h> +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> + +EFI_STATUS +EFIAPI +HotplugDescEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c new file mode 100644 index 0000000000..fbc372586b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c @@ -0,0 +1,44 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} + +/** + Destructor for the library. free any resources. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. +**/ +EFI_STATUS +EFIAPI +ActLibraryUnregisterActCommand ( + IN EFI_HANDLE ImageHandle + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c new file mode 100644 index 0000000000..0a5f4a7e81 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c @@ -0,0 +1,36 @@ +/** @file + String token ID of help message text. + Shell supports to find help message in the resource section of an + application image if * .MAN file is not found. + This global variable is added to make build tool recognizes + that the help string is consumed by user and then build tool will + add the string into the resource section. + Thus the application can use '-?' option to show help message in Shell. + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c new file mode 100644 index 0000000000..47eb700f8f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/IoLib.h> + +/** + Performs platform specific initialization required for the CPU to access + the hardware associated with a SerialPortLib instance. This function does + not intiailzie the serial port hardware itself. Instead, it initializes + hardware devices that are required for the CPU to access the serial port + hardware. This function may be called more than once. + + @retval RETURN_SUCCESS The platform specific initialization succeeded. + @retval RETURN_DEVICE_ERROR The platform specific initialization could not be completed. + +**/ +RETURN_STATUS +EFIAPI +PlatformHookSerialPortInitialize ( + VOID + ) +{ + return RETURN_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl new file mode 100644 index 0000000000..72b9a87639 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl @@ -0,0 +1,9 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + diff --git a/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc new file mode 100644 index 0000000000..2dfb3190d4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc @@ -0,0 +1,13 @@ +; @file +; +; AMD Generic Encapsulated Software Architecture +; Code to setup temporary memory access for stack usage. This code +; is to be used on memory present systems that do not need CAR. +; +; Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +; +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +%macro AMD_ENABLE_UEFI_STACK2 2-3 + +%endmacro diff --git a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi index a731c7e369..937caee083 160000 --- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi +++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi @@ -1 +1 @@ -Subproject commit a731c7e36988c3308e1978ecde491f2f6182d490 +Subproject commit 937caee0833115f69d697ca190001ba0aa5c7368 -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119163): https://edk2.groups.io/g/devel/message/119163 Mute This Topic: https://groups.io/mt/106257082/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces 2024-05-23 8:31 ` Yao, Ken via groups.io @ 2024-05-24 4:39 ` Paul via groups.io 2024-05-24 4:56 ` Abdul Lateef Attar via groups.io 0 siblings, 1 reply; 16+ messages in thread From: Paul via groups.io @ 2024-05-24 4:39 UTC (permalink / raw) To: Yao, Ken, Zhai, MingXin (Duke), Chang, Abner, devel@edk2.groups.io Cc: Attar, AbdulLateef (Abdul Lateef), Fu, Igniculus, Xing, Eric [-- Attachment #1: Type: text/plain, Size: 761694 bytes --] [AMD Official Use Only - AMD Internal Distribution Only] Thanks for the up-stream, Abner. Looks good to me. Reviewed-by: Paul Grimes < paul.grimes@amd.com> ________________________________ From: Yao, Ken <Ken.Yao@amd.com> Sent: Thursday, May 23, 2024 1:31:31 AM To: Zhai, MingXin (Duke) <duke.zhai@amd.com>; Chang, Abner <Abner.Chang@amd.com>; devel@edk2.groups.io <devel@edk2.groups.io> Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Xing, Eric <Eric.Xing@amd.com> Subject: RE: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces [AMD Official Use Only - AMD Internal Distribution Only] [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. Reviewed-by: Ken Yao <Ken.Yao@amd.com> -----Original Message----- From: Zhai, MingXin (Duke) <duke.zhai@amd.com> Sent: Thursday, May 23, 2024 3:48 PM To: Chang, Abner <Abner.Chang@amd.com>; devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com> Subject: RE: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces [AMD Official Use Only - AMD Internal Distribution Only] Thanks Abner for the up-stream. Looks good to me. -----Original Message----- From: Chang, Abner <Abner.Chang@amd.com> Sent: Thursday, May 23, 2024 12:12 PM To: devel@edk2.groups.io Cc: Grimes, Paul <Paul.Grimes@amd.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Yao, Ken <Ken.Yao@amd.com>; Xing, Eric <Eric.Xing@amd.com>; Zhai, MingXin (Duke) <duke.zhai@amd.com> Subject: [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces From: Abner Chang <abner.chang@amd.com> BZ#: 4777 Initial commit of AMD cross platform/board generic encapsulated software architecture. This provides the basic definitions and protocols for the follow-up AMD open board project. Cc: Paul Grimes <paul.grimes@amd.com> Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> Cc: Igniculus Fu <igniculus.fu@amd.com> Cc: Ken Yao <ken.yao@amd.com> Cc: Eric Xing <eric.xing@amd.com> Cc: Duke Zhai <Duke.Zhai@amd.com> Signed-off-by: Abner Chang <abner.chang@amd.com> --- .../AgesaModulePkg/AgesaCommonModulePkg.dec | 39 + Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec | 18 + .../AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec | 20 + .../AMD/AgesaModulePkg/AgesaModuleDfPkg.dec | 25 + .../AMD/AgesaModulePkg/AgesaModuleFchPkg.dec | 62 + .../AMD/AgesaModulePkg/AgesaModuleMemPkg.dec | 26 + .../AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec | 34 + .../AMD/AgesaModulePkg/AgesaModulePspPkg.dec | 29 + Platform/AMD/AgesaPkg/AgesaPkg.dec | 435 +++ Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec | 41 + .../AgesaEdk2PlatformPkg.inc.dsc | 18 + .../AgesaSp5RsModulePkg.inc.dsc | 48 + .../CbsInstanceNull/CbsInstanceNull.inc.dsc | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.inc.dsc | 11 + .../AgesaSp5RsModulePkg.dxe.inc.fdf | 11 + .../AgesaSp5RsModulePkg.pei.inc.fdf | 9 + .../CbsInstanceNull.dxe.inc.fdf | 7 + .../CbsInstanceNull.pei.inc.fdf | 7 + .../0x19/RS/External/CbsStones.dxe.inc.fdf | 8 + .../0x19/RS/External/CbsStones.pei.inc.fdf | 8 + .../Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf | 7 + .../Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf | 10 + .../Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf | 7 + .../Library/AmdCalloutLib/AmdCalloutLib.inf | 29 + .../AmdPspMboxLibV2/AmdPspMboxLibV2.inf | 30 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.inf | 27 + .../AmdPspRomArmorLibNull.inf | 26 + .../Library/ApcbLibV3/ApcbLibV3.inf | 37 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.inf | 32 + .../BaseFabricTopologyRsLib.inf | 28 + .../CcxTscTimerLib/BaseTscTimerLib.inf | 35 + .../Library/CcxTscTimerLib/DxeTscTimerLib.inf | 42 + .../Library/CcxTscTimerLib/PeiTscTimerLib.inf | 37 + .../PciHostBridgeLib.inf | 42 + .../DxeAmlGenerationLib/AmlGenerationLib.inf | 47 + .../Library/FchBaseLib/FchBaseLib.inf | 26 + .../FchBaseResetSystemLib.inf | 35 + .../Library/FchEspiCmdLib/FchEspiCmdLib.inf | 33 + .../Library/NbioHandleLib/NbioHandleLib.inf | 24 + .../Library/PcieConfigLib/PcieConfigLib.inf | 25 + .../Library/SmnAccessLib/SmnAccessLib.inf | 33 + .../Library/CommonDxe/NbioCommonDxeLib.inf | 29 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf | 45 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf | 33 + .../OemAgesaCcxPlatformLibNull.inf | 27 + .../PciExpressPciCfg2/PciExpressPciCfg2.inf | 61 + .../PciExpressPciSegmentInfoLib.inf | 32 + .../AmdPspFlashAccSpiNorLibSmm.inf | 45 + .../PspRomArmorWhitelistLib.inf | 32 + .../Addendum/Oem/OobPprDxe/OobPprDxe.inf | 42 + .../Dxe/PspPlatformDriver/PspPlatform.inf | 32 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.inf | 29 + .../AmdAutoDynamicCommand.inf | 53 + .../AmdAutoDynamicCommand/AmdAutoToolApp.inf | 50 + .../BasePlatformHookLibAmdFchUart.inf | 33 + Platform/AMD/AgesaModulePkg/Include/AGESA.h | 158 + Platform/AMD/AgesaModulePkg/Include/AMD.h | 91 + .../Include/AmdEdk2/CpuRegisters.h | 15 + .../AgesaModulePkg/Include/AmdPspDirectory.h | 61 + .../AgesaModulePkg/Include/CpuRegistersDef.h | 156 + .../Include/FchRegistersCommon.h | 85 + .../AMD/AgesaModulePkg/Include/Filecode.h | 31 + Platform/AMD/AgesaModulePkg/Include/Gnb.h | 14 + Platform/AMD/AgesaModulePkg/Include/GnbDxio.h | 521 ++++ .../AgesaModulePkg/Include/GnbRegistersRS.h | 18 + .../Include/GnbRegistersRS/IOHC.h | 22 + .../Include/Guid/GnbPcieInfoHob.h | 31 + .../Include/Library/AmdBaseLib.h | 16 + .../Include/Library/AmdPspMboxLibV2.h | 43 + .../Include/Library/BaseFabricTopologyLib.h | 22 + .../Include/Library/FchBaseLib.h | 16 + .../Include/Library/FchEspiCmdLib.h | 413 +++ .../Include/Library/GnbPcieConfigLib.h | 16 + .../Include/Library/NbioCommonLibDxe.h | 37 + .../Include/Library/NbioHandleLib.h | 62 + .../Include/Library/PcieConfigLib.h | 283 ++ .../Include/Library/SmnAccessLib.h | 30 + .../Protocol/AmdNbioPcieServicesProtocol.h | 47 + .../Include/Protocol/AmdOemOobPprProtocol.h | 14 + .../Include/Protocol/FabricNumaServices2.h | 155 + .../Protocol/FabricTopologyServices2.h | 14 + .../AMD/AgesaModulePkg/Include/SocLogicalId.h | 23 + .../Library/DxeAmlGenerationLib/LocalAmlLib.h | 100 + .../DxeAmlGenerationLib/LocalAmlObjects.h | 150 + .../AMD/AgesaPkg/Include/AmdPcieComplex.h | 432 +++ Platform/AMD/AgesaPkg/Include/AmdSoc.h | 17 + .../Include/FabricResourceManagerCmn.h | 42 + .../AgesaPkg/Include/Guid/AmdMemoryInfoHob.h | 96 + .../Include/Library/AmdPspBaseLibV2.h | 51 + .../AgesaPkg/Include/Library/AmdPspFtpmLib.h | 83 + .../Include/Library/AmdPspRomArmorLib.h | 231 ++ .../Include/Library/AmlGenerationLib.h | 2722 +++++++++++++++++ .../Library/PlatformPspRomArmorWhitelistLib.h | 25 + .../AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h | 134 + .../Include/Protocol/AmdCxlServicesProtocol.h | 183 ++ .../Protocol/AmdPciResourcesProtocol.h | 110 + .../Include/Protocol/AmdPspFtpmProtocol.h | 187 ++ .../FabricResourceManagerServicesProtocol.h | 14 + Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h | 19 + Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h | 78 + Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h | 17 + .../AMD/AmdCpmPkg/Include/AmdCpmFunction.h | 32 + .../AmdCpmTableProtocol/AmdCpmTableProtocol.h | 39 + .../Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c | 31 + .../AmdPspRomArmorLib/AmdPspRomArmorLib.c | 12 + .../AmdPspRomArmorLibNull.c | 79 + .../Library/ApcbLibV3/ApcbLibV3.c | 12 + .../Library/ApcbLibV3Pei/ApcbLibV3Pei.c | 14 + .../BaseFabricTopologyRsLib.c | 37 + .../Library/CcxTscTimerLib/BaseTscTimerLib.c | 8 + .../Library/CcxTscTimerLib/DxeTscTimerLib.c | 35 + .../Library/CcxTscTimerLib/PeiTscTimerLib.c | 11 + .../Library/CcxTscTimerLib/TscTimerLibShare.c | 103 + .../DxeAmdPciHostBridgeLib/PciHostBridgeLib.c | 95 + .../DxeAmlGenerationLib/AmlArgObjects.c | 154 + .../DxeAmlGenerationLib/AmlAssistFunctions.c | 151 + .../DxeAmlGenerationLib/AmlDataObjects.c | 640 ++++ .../AmlExpressionOpcodes.c | 1294 ++++++++ .../DxeAmlGenerationLib/AmlLocalObjects.c | 158 + .../DxeAmlGenerationLib/AmlNameString.c | 576 ++++ .../DxeAmlGenerationLib/AmlNamedObject.c | 2138 +++++++++++++ .../AmlNamespaceModifierObjects.c | 360 +++ .../DxeAmlGenerationLib/AmlObjectsDebug.c | 144 + .../DxeAmlGenerationLib/AmlPkgLength.c | 267 ++ .../AmlResourceDescriptor.c | 1989 ++++++++++++ .../DxeAmlGenerationLib/AmlStatementOpcodes.c | 515 ++++ .../Library/DxeAmlGenerationLib/AmlTable.c | 213 ++ .../DxeAmlGenerationLib/LocalAmlObjects.c | 364 +++ .../Library/FchBaseLib/FchStallLib.c | 13 + .../FchBaseResetSystemLib.c | 90 + .../Library/FchEspiCmdLib/FchEspiCmdLib.c | 87 + .../Library/NbioHandleLib/NbioHandleLib.c | 68 + .../Library/PcieConfigLib/PcieConfigLib.c | 276 ++ .../PcieConfigLib/PcieInputParserLib.c | 117 + .../Library/SmnAccessLib/SmnAccessLib.c | 10 + .../Nbio/Library/CommonDxe/DxeLibFunctions.c | 42 + .../Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c | 23 + .../Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c | 29 + .../OemAgesaCcxPlatformLibNull.c | 39 + .../PciExpressPciCfg2/PciExpressPciCfg2.c | 33 + .../PciSegmentInfoLib.c | 30 + .../AmdPspFlashAccSpiNorLibSmm.c | 15 + .../PspRomArmorWhitelistLib.c | 12 + .../Addendum/Oem/OobPprDxe/OobPprDxe.c | 36 + .../Dxe/PspPlatformDriver/PspPlatformDriver.c | 20 + .../Dxe/ServerHotplugDxe/ServerHotplugDxe.c | 22 + .../AmdAutoDynamicCommand.c | 44 + .../AmdAutoDynamicCommand/AmdAutoToolApp.c | 36 + .../BasePlatformHookLibAmdFchUart.c | 29 + .../FchSongshanDxe/FchSongshanI2C_I3C.asl | 9 + .../AMD/AgesaPkg/Include/AmdUefiStackNasm.inc | 13 + .../Library/RiscVOpensbiLib/opensbi | 2 +- 152 files changed, 19669 insertions(+), 1 deletion(-) create mode 100644 Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec create mode 100755 Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec create mode 100644 Platform/AMD/AgesaPkg/AgesaPkg.dec create mode 100755 Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec create mode 100644 Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf create mode 100644 Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf create mode 100755 Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf create mode 100755 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf create mode 100644 Platform/AMD/AgesaModulePkg/Include/AGESA.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AMD.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Filecode.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Gnb.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbDxio.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h create mode 100644 Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h create mode 100755 Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h create mode 100755 Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h create mode 100644 Platform/AMD/AgesaPkg/Include/AmdSoc.h create mode 100644 Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h create mode 100644 Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h create mode 100644 Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h create mode 100644 Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h create mode 100644 Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h create mode 100644 Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c create mode 100755 Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c create mode 100644 Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c create mode 100644 Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c create mode 100644 Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c create mode 100644 Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c create mode 100644 Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c create mode 100644 Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl create mode 100644 Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc diff --git a/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec new file mode 100644 index 0000000000..d35a1f27b4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaCommonModulePkg.dec @@ -0,0 +1,39 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Common Module Package DEC +# file. +# This file provides the minimum AMD SoC/Mircoporcessor definitions for building +# AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCommonPkg + PACKAGE_GUID = 6CBE6566-0D3F-4E35-8358-9602354E9F09 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = {0x7788adf0, 0x9788, 0x4a3f, {0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd}} + gAgesaConfigDbPointerVariableGuid = {0x21229d24, 0xc71d, 0x4bc0, {0xb6, 0x3e, 0x67, 0x2f, 0x6d, 0xbf, 0x5f, 0xf7}} + gAmdMemoryInfoHobGuid = {0x1bce3d14, 0xa5fe, 0x4a0b, {0x9a, 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}} + +[Protocols] + ## Soc Protocols + gAmdSocLogicalIdProtocolGuid = {0x72f8e409, 0x0d2a, 0x4b91, {0x88, 0x6f, 0xba, 0x13, 0x44, 0x9f, 0xd7, 0x78}} + gAmdOemOobPprDxeProtocolGuid = {0x78031be3, 0x54a2, 0x4819, {0xb5, 0xba, 0x32, 0x79, 0x04, 0xf3, 0xa8, 0x41}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxSocketSupportedV2|2|UINT8|0x00002002 # 2 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDiePerSocketV2|1|UINT8|0x00002003 # 1 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxChannelPerDieV2|8|UINT8|0x00002004 # 8 by default + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemMaxDimmPerChannelV2|2|UINT8|0x00002005 # 2 by default + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdS3LibTableSize|0x4000|UINT64|0x00027003 + diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec new file mode 100644 index 0000000000..1637068432 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2Pkg.dec @@ -0,0 +1,18 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaEdk2Pkg + PACKAGE_GUID = E866104F-D458-41B1-AB26-FA5951618A8C + PACKAGE_VERSION = 0.1 + +[Includes] + Include/AmdEdk2 + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec new file mode 100755 index 0000000000..b84fe5b738 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleCcxPkg.dec @@ -0,0 +1,20 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Core Complex package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaCcxPkg + PACKAGE_GUID = df325429-029e-40f0-82db-0e69be7f6560 + PACKAGE_VERSION = 0.1 + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdCcxSingleBitErrLogging|FALSE|BOOLEAN|0x000CC029 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec new file mode 100755 index 0000000000..57db15e663 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleDfPkg.dec @@ -0,0 +1,25 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Data Fabric package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaDfPkg + PACKAGE_GUID = 81e51ee3-c347-4563-92fe-790ba953bf0f + PACKAGE_VERSION = 0.1 + +[Guids] + gAmdTotalNumberOfRootBridgesGuid = {0xfb5703f5, 0xf8a7, 0xf401, {0x18, 0xb4, 0x3f, 0x10, 0x8d, 0xeb, 0x26, 0x12}} + gAmdResourceSizeForEachRbGuid = {0x542b8f2f, 0xbd52, 0x4233, {0x8c, 0x3d, 0x66, 0x53, 0x0d, 0xe8, 0xa3, 0x69}} + +[Protocols] + gAmdFabricNumaServices2ProtocolGuid = {0xa8ff2e64, 0xf319, 0x4af1, {0x9e, 0xc8, 0x18, 0x89, 0x89, 0xc3, 0x1e, 0x4a}} + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec new file mode 100644 index 0000000000..521957e809 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleFchPkg.dec @@ -0,0 +1,62 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) FCH Module Package DEC +# file. +# This file provides the minimum AMD Fusion Control Hub package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 1.5 + PACKAGE_NAME = AgesaFchPkg + PACKAGE_GUID = e47c8ed9-3000-4e6e-b1c6-875b365b3849 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaModulePkgTokenSpaceGuid = { 0x7788adf0, 0x9788, 0x4a3f, { 0x83, 0xfa, 0xcb, 0x51, 0x2e, 0x7c, 0xf8, 0xdd } } + +[Protocols] + gFchInitDonePolicyProtocolGuid = { 0xc63c0c73, 0xf612, 0x4c02, { 0x84, 0xa3, 0xc6, 0x40, 0xad, 0x0b, 0xa6, 0x22 } } + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLegacyFree|FALSE|BOOLEAN|0x0003F001 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetEnable|TRUE|BOOLEAN|0x0003F002 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdHpetMsiDis|TRUE|BOOLEAN|0x0003F003 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdResetMode|0x00|UINT8|0x0003F00D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdNoneSioKbcSupport|FALSE|BOOLEAN|0x0003F021 + + ### @brief This item allows the customer to change OC signal polarity to be active low. This is universal and applies to all OC pins. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE)At present, this control applies to Family17h Model 00h-2Fh. + ### @li TRUE - OC pin is low when OC occurs. + ### @li FALSE - OC pin is high when OC occurs. + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciOcPolarityCfgLow|FALSE|BOOLEAN|0x0003F309 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb20OcPinSelect|0xFFFFFFFFFFFFFFFF|UINT64|0x0003F340 + #Die 0 + #[7:0] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 2.0 ports on XHCI controller 1 + #[23:0] MTS -- 6 USB 2.0 ports on XHCI controller 0 + #Die 1 + #[39:32] SSP -- 2 USB 2.0 ports on XHCI controller 0 + #[47:40] SSP -- 2 USB 2.0 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciUsb31OcPinSelect|0xFFFFFFFF|UINT32|0x0003F341 + #Die 0 + #[7:0] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[15:8] SSP -- 2 USB 3.1 ports on XHCI controller 1 + #[15:0] MTS -- 4 USB 3.1 ports on XHCI controller 0 + #Die 1 + #[23:16] SSP -- 2 USB 3.1 ports on XHCI controller 0 + #[31:24] SSP -- 2 USB 3.1 ports on XHCI controller 1 + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdLpcEnable|TRUE|BOOLEAN|0x0003F400 + + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdUsbRSOemConfigurationTable|{0x0}|VOID*|0x0003F40A + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdXhciSsid|0x00000000|UINT32|0x0003FF07 + gEfiAmdAgesaModulePkgTokenSpaceGuid.FchRTDeviceEnableMap|0x00000000|UINT32|0x0003FF81 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec new file mode 100644 index 0000000000..721d3ea73b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleMemPkg.dec @@ -0,0 +1,26 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Memory package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaMemPkg + PACKAGE_GUID = 445f7303-3171-428c-ad0b-32df4474a7ad + PACKAGE_VERSION = 0.1 + +[Includes] + Include/ + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries|64|UINT32|0x00029001 + + + diff --git a/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec new file mode 100755 index 0000000000..0501774c9b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModuleNbioPkg.dec @@ -0,0 +1,34 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD North Bridge I/O package definitions for building AMD +# edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaNbioPkg + PACKAGE_GUID = 1486f0fe-39ee-4856-a39f-222ff2404f26 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Protocols] + gAmdNbioPcieServicesProtocolGuid = {0x756db75c, 0xbb9d, 0x4289, {0x81, 0x3a, 0xdf, 0x21, 0x5, 0xc4, 0xf8, 0xe}} + +[PcdsFixedAtBuild] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIommuMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021100 #///< 1: Enable Iommu MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicMMIOAddressReservedEnable|FALSE|BOOLEAN|0x00021101 #///< 1: Enable Ioapic MMIO reserved from GNB driver. 0:Disable + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdPreDefineEn|FALSE|BOOLEAN|0x00021102 #///< TRUE: Enable assign IOAPIC ID at PEI phase + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgIoApicIdBase|0xF1|UINT8|0x00021103 #///< Base NBIO IOAPIC ID. ID assigned start from this value + +[PcdsDynamic] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgGnbIoapicId|0|UINT8|0x0004101D + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdCfgFchIoapicId|0|UINT8|0x0004101E + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdSmuFeatureControlDefinesExt|0x0|UINT32|0x00041200 diff --git a/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec new file mode 100644 index 0000000000..41cf320c76 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaModulePspPkg.dec @@ -0,0 +1,29 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) NBIO Module Package DEC +# file. +# This file provides the minimum AMD Platform Security Processor package definitions +# for building AMD edk2 modules. +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPspPkg + PACKAGE_GUID = 5c48f900-a98c-431f-8be5-19c09c65bb05 + PACKAGE_VERSION = 0.1 + +[Guids] + gApSyncFlagNvVariableGuid = { 0xad3f6761, 0xf0a3, 0x46c8, { 0xa4, 0xcb, 0x19, 0xb7, 0x0f, 0xfd, 0xb3, 0x05 } } + gAmdPspApobHobGuid = { 0x30b174f3, 0x7712, 0x4cca, { 0xbd, 0x13, 0xd0, 0xb8, 0xa8, 0x80, 0x19, 0x97 } } + +[Protocols] + gPspFlashAccSmmCommReadyProtocolGuid = { 0x9f373486, 0xda76, 0x4c9f, { 0x81, 0x55, 0x6c, 0xcd, 0xdb, 0x0b, 0x0b, 0x04 } } + gAmdPspFtpmProtocolGuid = { 0xac234e04, 0xb036, 0x476c, { 0x91, 0x66, 0xbe, 0x47, 0x52, 0xa0, 0x95, 0x09 } } + +[Ppis] + gAmdPspFtpmPpiGuid = { 0x91774185, 0xf72d, 0x467e, { 0x93, 0x39, 0xe0, 0x08, 0xdb, 0xae, 0x0e, 0x14 } } + gAmdPspFtpmFactoryResetPpiGuid = { 0x9c98130a, 0x8921, 0x45eb, { 0x86, 0xf3, 0x16, 0x04, 0x35, 0xc7, 0xc6, 0x40 } } diff --git a/Platform/AMD/AgesaPkg/AgesaPkg.dec b/Platform/AMD/AgesaPkg/AgesaPkg.dec new file mode 100644 index 0000000000..9377c64cc3 --- /dev/null +++ b/Platform/AMD/AgesaPkg/AgesaPkg.dec @@ -0,0 +1,435 @@ +## @file +# AMD Generic Encapsulated Software Architecture (AGESA) Package DEC +# file. +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = AgesaPkg + PACKAGE_GUID = DABFEFC6-5A79-444b-862A-1F6FE9F561FE + PACKAGE_VERSION = 0.1 + +[Includes] + Include + +[Guids] + gEfiAmdAgesaPkgTokenSpaceGuid = { 0xd4d8435f, 0xfffb, 0x4acb, { 0xa0, 0x4d, 0xff, 0x0f, 0xad, 0x67, 0x7f, 0xe9 } } + +[Protocols] + gAmdNbioCxlServicesProtocolGuid = {0x125CCFCE, 0x34AF, 0x422C, {0xB3, 0xB3, 0x71, 0x23, 0xA3, 0x1E, 0xC8, 0x61}} + gAmdPciResourceProtocolGuid = {0x663d4897, 0xed94, 0x4f0f, {0x86, 0x64, 0xfe, 0xdc, 0x70, 0x30, 0x7f, 0x19}} + gAmdCapsuleSmmHookProtocolGuid = {0x4fc43bbe, 0x1433, 0x4951, {0xac, 0x2d, 0x0d, 0x01, 0xfe, 0xc0, 0x0e, 0xb1}} + gAmdFspSetupTableInitDoneGuid = {0xef5394c6, 0x566d, 0x440f, {0x9d, 0x05, 0xc0, 0xa3, 0x2c, 0xb9, 0x33, 0x58}} + +[Ppis] + gAmdMemoryInfoHobPpiGuid = {0xba16e587, 0x1d66, 0x41b7, {0x9b, 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}} + gCapsuleUpdateDetectedPpiGuid = {0x745dfc73, 0xc401, 0x4ced, {0x8d, 0x3b, 0x1a, 0x82, 0xf3, 0xda, 0xdc, 0xf8}} + +[PcdsFixedAtBuild] + + ### @brief Enable EDK-II Protocols + ### @details This item enables support for EDKII implementation of ACPI Protocols when set to TRUE + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCompliantEdkIIAcpiSdtProtocol|TRUE|BOOLEAN|0x00020006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize |0x1000|UINT32|0x00020007 + + ### @brief assign non volatile storage base address + ### @details This assigns the base address to map to flash deivce. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress|0xFF000000|UINT32|0x00020017 + +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH.h" +#---------------------------------------------------------------------------- + + ### @name General FCH Controls + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1 register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0400) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1EvtBlkAddr|0x400|UINT16|0x0002F004 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM1Cnt register blocks as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0404) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPm1CntBlkAddr|0x404|UINT16|0x0002F005 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI PM Timer as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0408) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiPmTmrBlkAddr|0x408|UINT16|0x0002F006 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI CPU Control block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0410) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgCpuControlBlkAddr|0x410|UINT16|0x0002F007 + + ### @brief Allows the host BIOS to specify the IO address for the ACPI GPE0 register block as defined by ACPI spec. + ### @brief Permitted Choices: (Type: Value)(Default: 0x0420) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgAcpiGpe0BlkAddr|0x420|UINT16|0x0002F008 + + ### @brief This item defines the SMI command value sent by the host BIOS during the S3 resume sequence, to re-initialize the + ### FCH registers. This must be issued before the platform driver restore function is started. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD3) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemBeforePciRestoreSwSmi|0xD3|UINT8|0x0002F010 + + ### @brief This item defines the SMI command used by the host BIOS to signal the FCH driver that the platform driver has + ### completed its restore function. This allows the FCH driver to perform some final FCH settings. + ### @brief Permitted Choices: (Type: Value)(Default: 0xD4) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemAfterPciRestoreSwSmi|0xD4|UINT8|0x0002F011 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to activate ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemEnableAcpiSwSmi|0xA0|UINT8|0x0002F012 + + ### @brief Allows the host BIOS to set the SMI command value used by the OS to turn off ACPI mode. + ### @brief Permitted Choices: (Type: Value)(Default: 0xA1) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemDisableAcpiSwSmi|0xA1|UINT8|0x0002F013 + + ### @brief SMI command used for releasing the SPI controller lock mode. All devices on the SPI bus will be writable. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAA) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiUnlockSwSmi|0xAA|UINT8|0x0002F014 + + ### @brief SMI command for setting the lock mode in the SPI controller. This will effectively provide a write protection to the + ### SPI Flash ROM; however, write access to secondary SPI devices will also be blocked. + ### @brief Permitted Choices: (Type: Value)(Default: 0xAB) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchOemSpiLockSwSmi|0xAB|UINT8|0x0002F015 +#---------------------------------------------------------------------------- +#- FCH Fixed PCDs +#- +### Set Doxy_path: "PCD-FCH-IRQ.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart0Irq|0x03|UINT8|0x0002F01A + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart1Irq|0x0E|UINT8|0x0002F01B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart2Irq|0x05|UINT8|0x0002F01C + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart3Irq|0x0F|UINT8|0x0002F01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchUart4Irq|0x10|UINT8|0x0002F01E + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c0Irq|0x0A|UINT8|0x0002F01F + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c1Irq|0x0B|UINT8|0x0002F020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c2Irq|0x04|UINT8|0x0002F021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c3Irq|0x06|UINT8|0x0002F022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c4Irq|0x16|UINT8|0x0002F023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdFchI2c5Irq|0x17|UINT8|0x0002F024 +#- DF Fixed PCDs +#- +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + #Fabric + + ### @name General DF Controls + + ### @brief This item informs the SMBios generation code as to how many physical processor sockets exist in the system and + ### therefore how many Type 4 SMBios records to produce. + ### @brief Permitted Choices: (Type: Value)(Default: 0x01) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdNumberOfPhysicalSocket|1|UINT8|0x000CC103 +#---------------------------------------------------------------------------- +#- CCX Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-MTRR.h" +#---------------------------------------------------------------------------- + + + ### @brief The base address of temporary page table for accessing PCIE MMIO base address above 4G in PEI phase. + ### @brief Permitted Choices: 0x0 - 0xFFFFFFFF (Type: Value)(Default: 0) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPeiTempPageTableBaseAddress|0|UINT32|0x000CC11B + +#---------------------------------------------------------------------------- +#- CCX ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-ACPI.h" +#---------------------------------------------------------------------------- + #ACPI + # Cpu SSDT + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName0|0x43|UINT8|0x000AC001 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeName1|0x30|UINT8|0x000AC002 + ### @brief This element specifies whether the ACPI _PSS objects are defined in the system bus or processor scope. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li TRUE - The objects will be under the \_SB scope. + ### @li FALSE - The objects will be under the \_PR scope + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorScopeInSb|FALSE|BOOLEAN|0x000AC003 + + ### @brief Set the OEM ID field in ACPI table outputs to this string. The string must conform to the ACPI rules for the OEM ID field. + ### @brief Permitted Choices: (Type: Value)(Default: "AMD") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiTableHeaderOemId|"AMD"|VOID*|0x000AC004 + +#---------------------------------------------------------------------------- +#- CCX SMBIOS Fixed PCDs +#- +### Set Doxy_path: "PCD-CCX-SMBIOS.h" +#---------------------------------------------------------------------------- + + ### @name CCX SMBIOS Controls + + ### @brief When creating the SMBios table entry, use this as the label for the processor socket. This should match the + ### silkscreen label on the motherboard. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket0|"Unknown"|VOID*|0x00001001 + + ### @brief When creating the SMBios table entry, use this as the value for the 'serial number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket0|"Unknown"|VOID*|0x00001002 + + + ### @brief When creating the SMBios table entry, use this as the value for the 'Asset Tag' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket0|"Unknown"|VOID*|0x00001003 + + ### @brief When creating the SMBios table entry, use this as the value for the 'Part Number' field for each processor. + ### @brief Permitted Choices: (Type: Value)(Default: "Unknown") + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket0|"Unknown"|VOID*|0x00001004 + + ### @brief SMBios socket 1 Label. + ### @details When creating the SMBios table entry, use this as the label for the + ### processor socket. This should match the silkscreen label on the motherboard. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSocketDesignationSocket1|"Unknown"|VOID*|0x00001005 + + ### @brief SMBIOS socket 1 Serial Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'serial number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosSerialNumberSocket1|"Unknown"|VOID*|0x00001006 + + ### @brief SMBios socket 1 Asset Tag. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Asset Tag' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosAssetTagSocket1|"Unknown"|VOID*|0x00001007 + + ### @brief Socket 1 Part Number. + ### @details When creating the SMBios table entry, use this as the value for + ### the 'Part Number' field for the processor in socket 1. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosPartNumberSocket1|"Unknown"|VOID*|0x00001008 + +#---------------------------------------------------------------------------- +#- ACPI Fixed PCDs +#- +### Set Doxy_path: "PCD-ACPI.h" +#---------------------------------------------------------------------------- + + ### @name General ACPI Controls + + ### @brief PCD supporting maximum capacity for Type 16 table + ### @details This PCD represents maximum memory capacity in KB + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT16MaximumCapacity|0x04000000|UINT32|0x00001009 # 4G - 0x00400000 + # 8G - 0x00800000 + # 16G - 0x01000000 + # 32G - 0x02000000 + # 64G - 0x04000000 + # 128G - 0x08000000 + # 256G - 0x10000000 + # 512G - 0x20000000 +[PcdsDynamic] +#---------------------------------------------------------------------------- +# System level Dynamic PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCStateIoBaseAddress|0x413|UINT16|0x000CC002 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdt|TRUE|BOOLEAN|0x000CC00B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdApicMode|0xFF|UINT8|0x000CC01D + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCpuWdtEn|TRUE|BOOLEAN|0x000CC200 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerInSb|FALSE|BOOLEAN|0x000CC50B + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdAcpiCpuSsdtProcessorContainerName|"PLTF"|VOID*|0x000CC50C + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCcxCfgPFEHEnable|FALSE|BOOLEAN|0x000CC601 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdSmbiosT4CpuMaxSpeed|0|UINT16|0x000CC900 +#---------------------------------------------------------------------------- +#- DF Dynamic PCDs +### Set Doxy_path: "PCD-DF.h" +#---------------------------------------------------------------------------- + + + ### @cond (FF3||RN||BA||ZP||RMB||RPL||RS||SSP||MI3||BRH) + ### @brief Specifies the top address to be used for MMIO space allocations. No MMIO space will be used above this limit. Some devices have limits on the address space they + ### are able to access. For example a device with a 40-bit address limitation can not use MMIO space above 1TeraByte (1T). By setting this PCD to 0x10000000000 (1T), MMIO + ### space would not be allocated above 1T. The default is to use all of the space above the end of physical memory. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMmioAbove4GLimit|0xFFFFFFFFFFFFFFFF|UINT64|0x0003FFC2 + ### @endcond + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFabricResourceDefaultSizePtr|0|UINT64|0x00DF0000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchCfgSmiCmdPortAddr|0xB0|UINT16|0x0003FFC0 + + ### I2C-0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c0SdaHold|0x00000035|UINT32|0x000FC000 + ### I2C-1 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c1SdaHold|0x00000035|UINT32|0x000FC001 + ### I2C-2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c2SdaHold|0x00000035|UINT32|0x000FC002 + ### I2C-3 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c3SdaHold|0x00000035|UINT32|0x000FC003 + ### I2C-4 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c4SdaHold|0x00000035|UINT32|0x000FC004 + ### I2C-5 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdFchI2c5SdaHold|0x00000035|UINT32|0x000FC005 + ### @} end of I2C hold times + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-UART.h" +#---------------------------------------------------------------------------- + ### @name UART Legacy IO Assignments + ### @{ + ### @brief These controls allow the platform to specify the legacy IO ranges that are to be used by the UART ports in the processor. Permitted Choices: (Type: value)(Default: Disabled) + ### @li 0 - Disabled + ### @li 1 - IO range 0x02E8 - 0x02EF + ### @li 2 - IO range 0x02F8 - 0x02FF + ### @li 3 - IO range 0x03E8 - 0x03EF + ### @li 4 - IO range 0x03F8 - 0x03FF + + + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart0LegacyEnable|0x00|UINT8|0x000FC010 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart1LegacyEnable|0x00|UINT8|0x000FC011 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart2LegacyEnable|0x00|UINT8|0x000FC012 + gEfiAmdAgesaPkgTokenSpaceGuid.FchUart3LegacyEnable|0x00|UINT8|0x000FC013 + ### @} end UART Legacy IO assignments + +#---------------------------------------------------------------------------- +#- FCH Dynamic PCDs +### Set Doxy_path: "PCD-FCH-USB.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci0Enable|TRUE|BOOLEAN|0x000FC020 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci1Enable|TRUE|BOOLEAN|0x000FC021 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci2Enable|TRUE|BOOLEAN|0x000FC022 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhci3Enable|TRUE|BOOLEAN|0x000FC023 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdXhciECCDedErrRptEn|FALSE|BOOLEAN|0x000FC024 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataEnable|TRUE|BOOLEAN|0x000FC030 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdSataStaggeredSpinup|FALSE|BOOLEAN|0x000FC039 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdNvdimmEnable|FALSE|BOOLEAN|0x000A6024 + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO-BMC.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkTraining|FALSE|BOOLEAN|0x0004F004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkSocket|0xFF|UINT8|0x0004F005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkDie|0xFF|UINT8|0x0004F006 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEarlyBmcLinkLaneNum|0|UINT8|0x0004F03E + +#---------------------------------------------------------------------------- +#- NBIO Dynamic PCDs +### Set Doxy_path: "PCD-NBIO.h" +#---------------------------------------------------------------------------- + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgIommuSupport|TRUE|BOOLEAN|0x0004F027 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdIvInfoDmaReMap|FALSE|BOOLEAN|0x0004F028 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrVddfull_Scale_Current|0x00|UINT32|0x0004F0A0 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdTelemetry_VddcrSocfull_Scale_Current|0x00|UINT32|0x0004F0A2 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityLo|0x4|UINT32|0x0004F210 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdEgressPoisonSeverityHi|0x30011|UINT32|0x0004F211 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlProtocolErrorReporting|0|UINT8|0x0004F362 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdCxlComponentErrorReporting|0|UINT8|0x0004F363 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs DYNAMIC + + ### @brief This feature selects the APCB recovery support on x86 side. If or when an instance of a writable APCB is determined to be invalid, the PSP driver will + ### attempt a 'recovery' by copying the recovery instance of the APCB (default values as indicated in the APCB descriptor files). Upon boot up, the ABL reads CMOS + ### bytes 06/07 at index/data port of 0x72/0x73. If the CMOS flag reads anything else other than 0xA55A or 0x5555, the system boots in APCB recovery mode, in which + ### ABL consumes the recovery instances of APCB. Otherwise it boots in normal/non-recovery mode. + ### @brief Permitted Choices: (Type: Boolean)(Default: TRUE) + ### @brief This feature is affected by the platform CMOS power design. Please see Platform CMOS power . + ### @li TRUE - the AGESA PSP driver restores the APCB instances from the recovery instance, writes 0xA55A to the CMOS location and triggers a reset . The next time + ### the system powers up, ABL runs in normal/non-recovery mode. + ### @li FALSE - the AGESA PSP driver writes 0x5555 to the CMOS location without restoring the APCB instances or triggering a reset. In this mode the additional reset + ### is avoided at the potential risk of the writeable APCB instance being left corrupted forever. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspApcbRecoveryEnable|TRUE|BOOLEAN|0x95940008 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspAntiRollbackLateSplFuse|FALSE|BOOLEAN|0x95940018 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemPostPackageRepair|TRUE|BOOLEAN|0x00030004 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemBootTimePostPackageRepair|TRUE|BOOLEAN|0x00030005 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdMemRuntimePostPackageRepair|FALSE|BOOLEAN|0x00030006 +[PcdsDynamicEx] + +[PcdsFixedAtBuild, PcdsDynamic] +#---------------------------------------------------------------------------- +#- System control PCDs +### Set Doxy_path: "PCD-Sys.h" +#---------------------------------------------------------------------------- + ### @brief Switch for Debug Print function + ### @details Switch for Debug Print function to enable or not. + ### @li TRUE: Enable IdsDebugPrint output + ### @li FALSE: Disable IdsDebugPrint output + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEnable|FALSE|BOOLEAN|0x00020004 + ### @brief Specify the filter for IdsDebugPrint + ### @details When the filter values are matched, the AmdIdsDebugPrint can start to print debug message. + ### Refer Library/IdsLib.h for details, and the Master token is PcdAmdIdsDebugPrintEnable. + ### @li 0x100401008A30042C: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | MEM_STATUS | MEM_PMU | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + ### @li 0x100401008A300408: (GNB_TRACE | PCIE_MISC | NB_MISC | GFX_MISC | CPU_TRACE | MEM_FLOW | FCH_TRACE | MAIN_FLOW| TEST_POINT | PSP_TRACE) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintFilter|0x100401030A300408|UINT64|0x00020005 + ### @brief Switch for Serial port support of AGESA debug print + ### @details Switch for Serial port support of AGESA debug print, NOTE, AGESA will not init the serial port, + ### serial port should be initialized before call AGESA debug print. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortEnable|FALSE|BOOLEAN|0x00020009 + ### @brief The serial port used for debug output can be either 2-wire (Rx/Tx) or 4-wire (adding DSR/CTS). Waiting for CTS on a + ### 2-wire port would cause a hang. This control is added to check the cable connection. + ### @brief Permitted Choices: (Type: Boolean)(Default: FALSE) + ### @li FALSE - Presume a 2-wire port and do not wait for CTS. + ### @li TRUE - Wait for both DSR and CTS to be set. DSR is set if a cable is connected. CTS is set if it is ok to transmit data. + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortDetectCableConnection|FALSE|BOOLEAN|0x0002000A + + ### @brief Selection of UART and UART Legacy IO Serial port for AGESA debug print + ### @details Selection of UART and UART Legacy IO Serial port for AGESA debug print and invisible in ACPI name space. + ### @li Bit[0]: Select UART0 for AGESA debug print + ### @li Bit[1]: Select UART1 for AGESA debug print + ### @li Bit[2]: Select UART2 for AGESA debug print + ### @li Bit[3]: Select UART3 for AGESA debug print + ### @li Bit[4]: Select UART4 for AGESA debug print + ### @li Bit[8]: Select UART0 Legacy IO for AGESA debug print + ### @li Bit[9]: Select UART1 Legacy IO for AGESA debug print + ### @li Bit[10]: Select UART2 Legacy IO for AGESA debug print + ### @li Bit[11]: Select UART3 Legacy IO for AGESA debug print + ### @li Bit[15]: Set debug print serial port to invisible in ACPI name space at OS runtime + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPortSelect|0x0000|UINT16|0x0002718A + + ### @brief Specify the IO port for serial out + ### @details ESPI or LPC COM1: 0x3F8, COM2: 0x2F8, COM3: 0x3E8, COM4: 0x2E8, + ### UART0: 0xFEDC9000, UART1: 0xFEDCA000, UART2: 0xFEDCE000, UART3: 0xFEDCF000, UART4: 0xFEDD1000. + ### @li If it's IO port: it must < 0x10000 + ### @li If it's Memory: it must >= 0x10000 + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintSerialPort|0x3F8|UINT64|0x0002000B + + ### @brief Debug Print Emulation Auto Detect + ### @details Auto detect emulation platform to instead of PcdAmdIdsDebugPrintRedirectIOEnable and + ### PcdAmdIdsDebugPrintSerialPortEnable. + ### @li TRUE: Enable + ### @li FALSE: Disable + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdIdsDebugPrintEmulationAutoDetect|FALSE|BOOLEAN|0x00020016 + + gEfiAmdAgesaPkgTokenSpaceGuid.PcdCfgPlatformPPT|0|UINT32|0x0004F111 + +#---------------------------------------------------------------------------- +#- PSP Dynamic PCDs +### Set Doxy_path: "PCD-PSP.h" +#---------------------------------------------------------------------------- + ### PSP PCDs + + ### @brief Rom Armor selection + ### @details Rom Armor selection + ### @li 0: Rom Armor is disabled + ### @li 1: Rom Armor 1 is enabled (VMR/MTS/CPK) + ### @li 2: Rom Armor 2 is enabled (RN/CZN) + ### @li 3: Rom Armor 3 is enabled (CGL, RMB and later) + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspRomArmorSelection|0|UINT8|0x95940054 + + + + ### @brief System TPM config Value + ### @details System TPM config Value, SBIOS needs to set the value in PEI phase. + ### @li 0x0: dTPM + ### @li 0x1: PSP fTPM + ### @li 0x2: HSP fTPM + ### @li 0xFF: no TPM + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmConfig|0xFF|UINT8|0x95940024 + + ### @cond !BRH + ### @brief TPM SMx algorithm flag + ### @details TPM SMx algorithm flag, SBIOS needs to set the value in PEI phase. + ### @li 0: SM2, SM3 or SM4 crypto algorithms not supported + ### @li 1: SM2, SM3 or SM4 crypto algorithms supported + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAmdPspSystemTpmAlgSmx|0|UINT8|0x95940025 + ### @endcond diff --git a/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec new file mode 100755 index 0000000000..c8c474637f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/AmdCpmPkg.dec @@ -0,0 +1,41 @@ +## @file +# AMD Common Platform Module (CPM) Module Package DEC. +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = CpmPkg + PACKAGE_GUID = ABE128BA-1061-4A53-A1B8-D07329AA7A67 + PACKAGE_VERSION = 0.1 + +[Includes] + Include + Library + +[Guids] + gAmdCpmPkgTokenSpaceGuid = {0x916e0ddd, 0x2bd2, 0x4704, {0x93, 0xb9, 0x59, 0x4b, 0x01, 0xa5, 0xfa, 0x9f}} + gShellActHiiGuid = {0x340EBE97, 0x3C1C, 0x4272, {0x9C, 0xCE, 0xC1, 0xFF, 0x86, 0x6F, 0x73, 0x3C}} + gAmdPbsSystemConfigurationGuid = {0xa339d746, 0xf678, 0x49b3, {0x9f, 0xc7, 0x54, 0xce, 0x0f, 0x9d, 0xf2, 0x26}} + +[Protocols] + gAmdCpmTableProtocolGuid = { 0x3724cf01, 0x00c2, 0x9762, {0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 }} + gAmdCpmAllPciIoProtocolsInstalledProtocolGuid = { 0x676D7012, 0x139B, 0x485A, {0x96, 0xF1, 0x98, 0x6F, 0xC4, 0x8A, 0x86, 0x4B }} + +[Ppis] + gAmdCpmTablePpiGuid = { 0xd71cf893, 0xa8b5, 0x49d3, { 0xa2, 0x1b, 0x31, 0xe2, 0xf5, 0xc4, 0xa7, 0x47 } } + +[PcdsFixedAtBuild] + gAmdCpmPkgTokenSpaceGuid.PcdFchUartPort|2|UINT8|0x00000052 + + #ACPI + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiHestTableHeaderOemTableId|"AMD HEST"|VOID*|0x000AC001 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiBertTableHeaderOemTableId|"AMD BERT"|VOID*|0x000AC002 + gAmdCpmPkgTokenSpaceGuid.PcdAmdAcpiEinjTableHeaderOemTableId|"AMD EINJ"|VOID*|0x000AC003 + + gAmdCpmPkgTokenSpaceGuid.UsePciXAslName|FALSE|BOOLEAN|0x12000003 + gAmdCpmPkgTokenSpaceGuid.AcpiRestoreSwSmi|0xE3|UINT8|0x00000040 diff --git a/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc new file mode 100644 index 0000000000..37b8d15cb1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaEdk2PlatformPkg.inc.dsc @@ -0,0 +1,18 @@ +## @file +# +# The DSC include file for edk2 package to pull in the necessary AGESA modules +# into build process. +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses] + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc new file mode 100644 index 0000000000..e7e05fd2d8 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.inc.dsc @@ -0,0 +1,48 @@ +## @file +# The AGESA DSC file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses.Common.PEIM] + + ## APCB + ApcbLibV3Pei|AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf + +[LibraryClasses.Common.DXE_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses.Common.DXE_SMM_DRIVER] + AmdPspRomArmorLib|AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf + ApcbLibV3|AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf + +[LibraryClasses] + # + # Agesa specific common libraries + # + + ## PSP Libs + AmdPspMboxLibV2|AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf + + ## DF Lib + BaseFabricTopologyLib|AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf + + ## Gnb Lib + NbioHandleLib|AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf + PcieConfigLib|AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf + SmnAccessLib|AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf + NbioCommonDxeLib|AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf + + ## Fch Lib + FchBaseLib|AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf + +[Components.IA32] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf + +[Components.X64] + AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc new file mode 100644 index 0000000000..1f1e04c414 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.inc.dsc @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc new file mode 100644 index 0000000000..2916fecb26 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.inc.dsc @@ -0,0 +1,11 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEFINE AGESA_PKG_PATH = AgesaModulePkg + DEFINE AGESA_PKG_DEC = AgesaCommonModulePkg diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf new file mode 100644 index 0000000000..9303d1fac4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.dxe.inc.fdf @@ -0,0 +1,11 @@ +## @file +# The AGESA DXE FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +## APCB V3 Dxe Drivers + INF AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf diff --git a/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf new file mode 100644 index 0000000000..0ef5a2a806 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/AgesaSp5RsModulePkg.pei.inc.fdf @@ -0,0 +1,9 @@ +## @file +# The AGESA PEI FDF file for building AMD SP5 Genoa boards. +# +# Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/CbsInstanceNull/CbsInstanceNull.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.dxe.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf new file mode 100644 index 0000000000..da3afe6e59 --- /dev/null +++ b/Platform/AMD/AmdCbsPkg/Library/Family/0x19/RS/External/CbsStones.pei.inc.fdf @@ -0,0 +1,8 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.dxe.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf new file mode 100644 index 0000000000..b790e4ead5 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.fdf @@ -0,0 +1,10 @@ +## @file +# +# Platform Package Flash Description File +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf new file mode 100644 index 0000000000..4766ad0447 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Processor/Genoa/AmdCpmGenoaQuartzPkg.pei.inc.fdf @@ -0,0 +1,7 @@ +## @file +# +# Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf new file mode 100755 index 0000000000..8d3357bf56 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdCalloutLib/AmdCalloutLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdCalloutLib + FILE_GUID = A8FEA621-B381-4c06-9E9D-0897EF78BD78 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdCalloutLib + + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf new file mode 100644 index 0000000000..1594a99265 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.inf @@ -0,0 +1,30 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspMboxLibV2 + FILE_GUID = B9E57A31-CAB0-4CEE-9D50-9D43E2EEAA44 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspMboxLibV2 + +[Sources.common] + AmdPspMboxLibV2.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PciLib + SmnAccessLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf new file mode 100644 index 0000000000..c685a26604 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLib + FILE_GUID = 55871F80-4658-6EF3-A8AC-15B34FF8C2CE + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLib + +[Sources.common] + AmdPspRomArmorLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf new file mode 100644 index 0000000000..a3906dc13e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspRomArmorLibNull + FILE_GUID = 7351EAC0-4587-FED8-2788-BF9DA2ADCA6E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspRomArmorLibNull + +[Sources.common] + AmdPspRomArmorLibNull.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf new file mode 100644 index 0000000000..09d5bd38ac --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.inf @@ -0,0 +1,37 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3 + FILE_GUID = C7932467-DF16-4C7A-A32A-3E6F50213E68 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3 | DXE_DRIVER DXE_SMM_DRIVER DXE_RUNTIME_DRIVER DXE_CORE SMM_CORE UEFI_DRIVER + +[Sources.common] + ApcbLibV3.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSmmReadyToLockProtocolGuid + +[Pcd] + gEfiAmdAgesaModulePkgTokenSpaceGuid.PcdAmdMemCfgMaxPostPackageRepairEntries + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf new file mode 100644 index 0000000000..c031d00d79 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ApcbLibV3Pei + FILE_GUID = EEA4E007-E408-4daa-82BD-4C52E7058753 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ApcbLibV3Pei|PEIM + +[Sources.common] + ApcbLibV3Pei.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleMemPkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + PcdLib + BaseMemoryLib + PeiServicesLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf new file mode 100644 index 0000000000..38a72e26b7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.inf @@ -0,0 +1,28 @@ +## @file +# +# For EDKII use Only +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseFabricTopologyRsLib + FILE_GUID = D0A070DD-630A-43F8-9D76-EAAABDDE5FB9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseFabricTopologyLib + CONSTRUCTOR = BaseFabricTopologyLibConstructor + +[Sources] + BaseFabricTopologyRsLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + +[LibraryClasses] + BaseLib diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf new file mode 100644 index 0000000000..d15d8169fe --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.inf @@ -0,0 +1,35 @@ +## @file +# Base Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseTscTimerLib + FILE_GUID = D29338B9-50FE-4e4f-B7D4-A150A2C1F4FB + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + BaseTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf new file mode 100644 index 0000000000..1e52768a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.inf @@ -0,0 +1,42 @@ +## @file +# Dxe Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeTscTimerLib + FILE_GUID = 95ab030f-b4fd-4ee4-92a5-9e04e87634d9 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE + + CONSTRUCTOR = DxeTscTimerLibConstructor + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + DxeTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + PcdLib + BaseLib + UefiLib + DebugLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf new file mode 100644 index 0000000000..b1eaefd282 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.inf @@ -0,0 +1,37 @@ +## @file +# Pei Timer Library which uses the Time Stamp Counter in the processor. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiTscTimerLib + FILE_GUID = 342C36C0-15DF-43b4-9EC9-FBF748BFB3D1 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib|PEIM PEI_CORE + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources.common] + TscTimerLibShare.c + PeiTscTimerLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleCcxPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + PcdLib + BaseLib + HobLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf new file mode 100644 index 0000000000..f60f97905a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.inf @@ -0,0 +1,42 @@ +## @file +# Library instance of PciHostBridgeLib library class for coreboot. +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciHostBridgeLib + FILE_GUID = 74967FD7-A9A4-4B16-8B41-B26BC3230D0A + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciHostBridgeLib + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + PciHostBridgeLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleDfPkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + BaseMemoryLib + PciHostBridgeLib + DevicePathLib + MemoryAllocationLib + DebugLib + UefiBootServicesTableLib diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf new file mode 100644 index 0000000000..2a72fa8117 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlGenerationLib.inf @@ -0,0 +1,47 @@ +## @file +# +# Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmlGenerationLib + FILE_GUID = 8F62C8D1-B67F-4AFB-9179-54384F1A6163 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmlGenerationLib | DXE_DRIVER UEFI_DRIVER HOST_APPLICATION + +[Sources.common] + LocalAmlObjects.h + LocalAmlObjects.c + LocalAmlLib.h + AmlAssistFunctions.c + AmlObjectsDebug.c + AmlNameString.c + AmlDataObjects.c + AmlNamespaceModifierObjects.c + AmlPkgLength.c + AmlNamedObject.c + AmlTable.c + AmlStatementOpcodes.c + AmlResourceDescriptor.c + AmlExpressionOpcodes.c + AmlArgObjects.c + AmlLocalObjects.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf new file mode 100644 index 0000000000..e63a70e849 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchBaseLib.inf @@ -0,0 +1,26 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchBaseLib + FILE_GUID = 4108287a-c864-4427-b2c3-bd0e91a83abd + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchBaseLib + +[Sources.common] + FchStallLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + PciSegmentLib + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf new file mode 100644 index 0000000000..e422cb69a4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.inf @@ -0,0 +1,35 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = BaseResetSystemLib + FILE_GUID = e669c365-2df2-4540-a343-afec4e85b198 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseResetSystemLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + FchBaseResetSystemLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PrintLib + IoLib + + diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf new file mode 100644 index 0000000000..d7f49c40de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = FchEspiCmdLib + FILE_GUID = 89671327-a620-43e9-93b1-d1da79a50392 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FchEspiCmdLib + +[Sources.common] + FchEspiCmdLib.c + +[Packages] + AgesaModulePkg/AgesaModuleFchPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + IoLib + FchBaseLib + + + + + + + diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf new file mode 100755 index 0000000000..f32bbc9ff2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.inf @@ -0,0 +1,24 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioHandleLib + FILE_GUID = DC4639D3-DB75-486B-AC38-C84AA49601E3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioHandleLib + +[Sources] + NbioHandleLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + AgesaPkg/AgesaPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf new file mode 100755 index 0000000000..0d6ba605f5 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.inf @@ -0,0 +1,25 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PcieConfigLib + FILE_GUID = C1205AD2-FE67-4502-A0A7-FB1704A3F9AE + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PcieConfigLib + +[Sources] + PcieConfigLib.c + PcieInputParserLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf new file mode 100644 index 0000000000..ae1dd6cd83 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = SmnAccessLib + FILE_GUID = 9B7FF4FA-9DB5-4fec-BF71-B13D8A14A51E + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmnAccessLib + +[Sources] + SmnAccessLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + PrintLib + BaseLib + DebugPrintErrorLevelLib + + + + diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf new file mode 100644 index 0000000000..da7f5c185d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/NbioCommonDxeLib.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NbioCommonDxeLib + FILE_GUID = 1BF93335-5D55-46D9-99D9-5D962F039829 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NbioCommonDxeLib + +[Sources] + DxeLibFunctions.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModuleNbioPkg.dec + +[LibraryClasses] + BaseLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf new file mode 100644 index 0000000000..54c3514020 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbDxeV3 + FILE_GUID = 4D3708A0-6D9B-47D3-AD87-E80C781BC0A7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3DxeDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + DxeServicesTableLib + MemoryAllocationLib + ApcbLibV3 + +[Sources] + ApcbV3Dxe.c + +[Protocols] + gEfiDxeSmmReadyToLockProtocolGuid + gEfiSmmCommunicationProtocolGuid + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf new file mode 100644 index 0000000000..7f90aa6ea0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdApcbPeiV3 + FILE_GUID = E1B8CF4A-FE7B-4676-B4F7-50C7228282A4 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = AmdApcbV3PeiDriverEntry + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + BaseLib + PeimEntryPoint + ApcbLibV3Pei + +[sources] + ApcbV3Pei.c + +[Depex] + TRUE + diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf new file mode 100755 index 0000000000..0f115c362e --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.inf @@ -0,0 +1,27 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = OemAgesaCcxPlatformLibNull + FILE_GUID = B1F58B07-0146-4804-B701-A56CB5716529 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = OemAgesaCcxPlatformLib + +[Sources.common] + OemAgesaCcxPlatformLibNull.c + +[Packages] + MdePkg/MdePkg.dec + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf new file mode 100644 index 0000000000..ba551e5c14 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.inf @@ -0,0 +1,61 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciCfg2 + FILE_GUID = 7A6DF3DB-1C0A-45C2-8251-AFE794D7D6B3 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = PeimInitializePciCfg + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC (EBC is for build only) +# + +[Sources] + PciExpressPciCfg2.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaPkg/AgesaPkg.dec + + +[LibraryClasses] + PeimEntryPoint + BaseLib + PcdLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + HobLib + IoLib + +[Ppis] + gEfiPciCfg2PpiGuid ## PRODUCES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress + +[Pcd.IA32,Pcd.X64] + gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable ## SOMETIMES_CONSUMES + +[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64] + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES + +[Depex] + TRUE diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf new file mode 100644 index 0000000000..e712a80886 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciExpressPciSegmentInfoLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciExpressPciSegmentInfoLib + FILE_GUID = FA8B1082-88DF-4744-85A3-7F87A9EBF8DC + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciSegmentInfoLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + PciSegmentInfoLib.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + +[LibraryClasses] + DebugLib + BaseLib diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf new file mode 100644 index 0000000000..f4b9d0d789 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.inf @@ -0,0 +1,45 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdPspFlashAccLibSmm + FILE_GUID = 3BBDC3A5-A0E2-4E8A-8240-9E594920F040 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = AmdPspFlashAccLib | DXE_SMM_DRIVER + +[Sources.common] + AmdPspFlashAccSpiNorLibSmm.c + +[Packages] + MdePkg/MdePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + AgesaPkg/AgesaPkg.dec + +[LibraryClasses] + AmdPspBaseLibV2 + BaseLib + DebugLib + SmmServicesTableLib + UefiBootServicesTableLib + +[Protocols] + gEfiSmmBase2ProtocolGuid + gEfiSpiSmmNorFlashProtocolGuid + +[Pcd] + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashNvStorageBlockSize ## CONSUMES + gEfiAmdAgesaPkgTokenSpaceGuid.PcdAgesaFlashAreaBaseAddress ## CONSUMES + +[Depex] + gEfiSmmBase2ProtocolGuid AND + gEfiSpiSmmNorFlashProtocolGuid + diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf new file mode 100644 index 0000000000..57bb0d9e25 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = PspRomArmorWhitelistLib + FILE_GUID = B6F8507A-C96B-4036-A8C0-26BAD6AC5F34 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformPspRomArmorWhitelistLib + +[Sources] + PspRomArmorWhitelistLib.c + +[Packages] + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseMemoryLib + MemoryAllocationLib + PcdLib + DebugLib + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf new file mode 100644 index 0000000000..64fd2913ad --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.inf @@ -0,0 +1,42 @@ +## @file +# +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = OobPprDxe + FILE_GUID = F91DCAB4-3639-11EE-BE56-0242AC120002 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = OobPprEntry + +[Sources] + OobPprDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DebugLib + PcdLib + BaseMemoryLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + MemoryAllocationLib + TimerLib + +[Protocols] + gEfiPciIoProtocolGuid #CONSUMES + +[Depex] + TRUE + + + diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf new file mode 100644 index 0000000000..f4d7638c1a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatform.inf @@ -0,0 +1,32 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PspPlatform + FILE_GUID = 28374747-76FF-41B3-9740-381EFAEF13BC + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = PspPlatformEntryPoint + +[Sources] + PspPlatformDriver.c + +[Packages] + MdePkg/MdePkg.dec + AgesaPkg/AgesaPkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AgesaModulePkg/AgesaModulePspPkg.dec + +[LibraryClasses] + DebugLib + BaseLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf new file mode 100644 index 0000000000..973ace8632 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.inf @@ -0,0 +1,29 @@ +## @file +# +# Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ServerHotplugDxe + FILE_GUID = FAFF8CA9-E515-44ed-B5F9-E2F6E5D902E3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = HotplugDescEntry + +[Sources] + ServerHotplugDxe.c + +[Packages] + AgesaPkg/AgesaPkg.dec + MdePkg/MdePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + +[Depex] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf new file mode 100644 index 0000000000..2d9dbeb715 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.inf @@ -0,0 +1,53 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoDynamicCommand + FILE_GUID = CCD8FEC8-1E30-45BD-8632-DB83A255FAC3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.1 + ENTRY_POINT = ActCommandInitialize + UNLOAD_IMAGE = ActLibraryUnregisterActCommand + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoDynamicCommand.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + UefiLib + FileHandleLib + HiiLib + DebugLib + BaseMemoryLib + MemoryAllocationLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + +[Guids] + gShellActHiiGuid ## SOMETIMES_CONSUMES ## HII + gAgesaConfigDbPointerVariableGuid + +[Protocols] + gEfiShellDynamicCommandProtocolGuid + gEfiHiiPackageListProtocolGuid + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[DEPEX] + TRUE diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf new file mode 100644 index 0000000000..98c8755ab8 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.inf @@ -0,0 +1,50 @@ +## @file +# +# Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = AmdAutoToolApp + FILE_GUID = 470E1741-2DFE-43EF-861E-505CB3226DC0 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + ENTRY_POINT = ActCommandInitialize +# +# This flag specifies whether HII resource section is generated into PE image. +# + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources.common] + AmdAutoToolApp.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + MdeModulePkg/MdeModulePkg.dec + AgesaModulePkg/AgesaCommonModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + FileHandleLib + HiiLib + MemoryAllocationLib + UefiApplicationEntryPoint + UefiBootServicesTableLib + UefiHiiServicesLib + UefiLib + UefiRuntimeServicesTableLib + +[Protocols] + gEfiHiiPackageListProtocolGuid ## CONSUMES + gEfiShellParametersProtocolGuid + gEfiUnicodeCollation2ProtocolGuid + +[Guids] + diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf new file mode 100644 index 0000000000..9c3c0dd0a9 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.inf @@ -0,0 +1,33 @@ +## @file +# +# Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BasePlatformHookLibAmdFchUart + FILE_GUID = BF2F3F3F-4BE6-4B97-850D-D5D4941D391C + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformHookLib + +[Sources] + BasePlatformHookLibAmdFchUart.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + AmdCpmPkg/AmdCpmPkg.dec + AgesaModulePkg/AgesaModuleFchPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + IoLib + PlatformHookLib + + + diff --git a/Platform/AMD/AgesaModulePkg/Include/AGESA.h b/Platform/AMD/AgesaModulePkg/Include/AGESA.h new file mode 100644 index 0000000000..3ec03aafd3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AGESA.h @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AGESA_H_ +#define AGESA_H_ + +#include "AMD.h" +#include "SocLogicalId.h" + +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull +#define DESCRIPTOR_INITIALIZE_LIST 0x20000000ull + +/// PCIe link initialization +typedef enum { + EndpointDetect = 0, ///< Detect endpoint presence + EndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} PCIE_ENDPOINT_STATUS; + +/// PCIe port misc extended controls +typedef struct { + IN UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + IN UINT8 LinkSafeMode : 2; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through PCIe_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertise maximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 2; ///< Unused space +} PCIE_PORT_MISC_CONTROL; + +/// The IO APIC Interrupt Mapping Info +typedef struct { + IN UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + IN UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< - ABCD + ///< - BCDA + ///< - CDAB + ///< - DABC + IN UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< - Entry 0 of IO APIC redirection table + ///< - Entry 1 of IO APIC redirection table + ///< - Entry 31 of IO APIC redirection table +} APIC_DEVICE_INFO; + +/// GEN3 RxAdaptMode Configuration Structure +typedef struct { + IN BOOLEAN InitOffsetCancellation; ///< Initial Offset Cancellation Enable + IN UINT8 DFEControl; ///< DFE Control + IN UINT8 LEQControl; ///< LEQ Control + IN BOOLEAN DynamicOffsetCalibration; ///< Dynamic Offset Calibration Enable + IN BOOLEAN FOMCalculation; ///< FOM Calculation Enable + IN BOOLEAN PIOffsetCalibration; ///< PI Offset Calibratino Enable +} RX_ADAPT_MODE; + +/// PCIe port configuration data +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 ChannelType; ///< Channel type. + ///< 0 - "lowLoss", + ///< 1 - "highLoss", + ///< 2 - "mob0db", + ///< 3 - "mob3db", + ///< 4 - "extnd6db" + ///< 5 - "extnd8db" + IN UINT8 DeviceNumber; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 FunctionNumber; ///< Reserved for future use + IN UINT8 LinkSpeedCapability; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT8 ResetId; ///< Arbitrary number greater than 0 assigned by platform firmware for GPIO + ///< identification which control reset for given port. + ///< Each port with unique GPIO should have unique ResetId assigned. + ///< All ports use same GPIO to control reset should have same ResetId assigned. + ///< see AgesaPcieSlotResetContol. + IN UINT16 SlotNum; ///< Physical Slot Number + IN PCIE_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + IN PCIE_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + IN RX_ADAPT_MODE RxAdaptMode; ///< Gen3 RxAdaptMode configuration +} PCIE_PORT_DATA; + +/// PCIe Complex descriptor +typedef struct { + IN UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + IN UINT32 SocketId; ///< Socket Id + IN VOID *Reserved; ///< Reserved for future use +} PCIE_COMPLEX_DESCRIPTOR; + +/// VBIOS image info +typedef struct { + IN AMD_CONFIG_PARAMS StdHeader; ///< Standard configuration header + OUT VOID *ImagePtr; ///< Pointer to VBIOS image + IN PCI_ADDR GfxPciAddress; ///< PCI address of integrated graphics controller + IN UINT32 Flags; ///< BIT[0] - special repost requred +} GFX_VBIOS_IMAGE_INFO; + +// +// CPU MSR Register definitions +// +#define SYS_CFG 0xC0010010ul ///< Refer to AMD64 Architecture Programming manual. +#define TOP_MEM 0xC001001Aul ///< Refer to AMD64 Architecture Programming manual. +#define HWCR 0xC0010015ul ///< Refer to AMD64 Architecture Programming manual. + +/// +/// VDDP_VDDR Voltage Info for Low Power DIMM +/// +typedef struct _VDDP_VDDR_VOLTAGE { + IN BOOLEAN IsValid; ///< Indicates if daata is valid + IN UINT8 Voltage; ///< VDDP VDDR Voltage Value +} VDDP_VDDR_VOLTAGE; + +// CPU Build Configuration structures and definitions + +#define AMD_AP_MTRR_FIX64k_00000 0x00000250ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_80000 0x00000258ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX16k_A0000 0x00000259ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C0000 0x00000268ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_C8000 0x00000269ul ///< Refer to AMD64 Architecture Programming manual. +#define AMD_AP_MTRR_FIX4k_D0000 0x0000026Aul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_D8000 0x0000026Bul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E0000 0x0000026Cul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_E8000 0x0000026Dul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F0000 0x0000026Eul ///< Refer to AMD64 Architecture Programming manual +#define AMD_AP_MTRR_FIX4k_F8000 0x0000026Ful ///< Refer to AMD64 Architecture Programming manual + +#endif // AGESA_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AMD.h b/Platform/AMD/AgesaModulePkg/Include/AMD.h new file mode 100755 index 0000000000..062d9e1e1a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AMD.h @@ -0,0 +1,91 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_H_ +#define AMD_H_ + +/// The return status for all AGESA public services. +/// +/// Services return the most severe status of any logged event. Status other than SUCCESS, UNSUPPORTED, and BOUNDS_CHK +/// will have log entries with more detail. +/// +typedef enum { + AGESA_SUCCESS = 0, ///< 0 - The service completed normally. Info may be logged. + AGESA_UNSUPPORTED, ///< 1 - The dispatcher or create struct had an unimplemented function requested. + ///< Not logged. + AGESA_BOUNDS_CHK, ///< 2 - A dynamic parameter was out of range and the service was not provided. + ///< Example, memory address not installed, heap buffer handle not found. + ///< Not Logged. + AGESA_SYNC_MORE_DATA, ///< 3 - More data is available from PSP communications (used in ABL) + AGESA_SYNC_SLAVE_ASSERT, ///< 4 - Slave is at an ASSERT (used in ABL) + + // AGESA_STATUS of greater severity (the ones below this line), always have a log entry available. + AGESA_ALERT, ///< 5 - An observed condition, but no loss of function. See Log. + AGESA_WARNING, ///< 6 - Possible or minor loss of function. See Log. + AGESA_ERROR, ///< 7 - Significant loss of function, boot may be possible. See Log. + AGESA_CRITICAL, ///< 8 - Continue boot only to notify user. See Log. + AGESA_FATAL, ///< 9 - Halt booting. See Log, however Fatal errors pertaining to heap problems + ///< may not be able to reliably produce log events. + AGESA_OC_FATAL, ///< 10 - Halt booting. Critical Memory Overclock failure. (used in ABL) + AGESA_SKIP_ERROR, ///< 11 - Error, Skip init steps. (used in ABL) + AgesaStatusMax ///< Not a status, for limit checking. +} AGESA_STATUS; + +/** + Callout method to the host environment. + + Callout using a dispatch with appropriate thunk layer, which is determined by the host environment. + + @param[in] Function The specific callout function being invoked. + @param[in] FcnData Function specific data item. + @param[in,out] ConfigPtr Reference to Callout params. +**/ +typedef AGESA_STATUS (*CALLOUT_ENTRY) ( + IN UINT32 Function, + IN UINTN FcnData, + IN OUT VOID *ConfigPtr + ); + +/// AGESA Structures + +/// Extended PCI address format +typedef struct { + IN OUT UINT32 Register : 12; ///< Register offset + IN OUT UINT32 Function : 3; ///< Function number + IN OUT UINT32 Device : 5; ///< Device number + IN OUT UINT32 Bus : 8; ///< Bus number + IN OUT UINT32 Segment : 4; ///< Segment +} EXT_PCI_ADDR; + +/// Union type for PCI address +typedef union _PCI_ADDR { + IN UINT32 AddressValue; ///< Formal address + IN EXT_PCI_ADDR Address; ///< Extended address +} PCI_ADDR; + +/// +/// The standard header for all AGESA services. +/// +typedef struct { + IN UINT32 ImageBasePtr; ///< The AGESA Image base address. + IN UINT32 Func; ///< The service desired + IN UINT32 AltImageBasePtr; ///< Alternate Image location + IN CALLOUT_ENTRY CalloutPtr; ///< For Callout from AGESA + IN UINT8 HeapStatus; ///< For heap status from boot time slide. + IN UINT64 HeapBasePtr; ///< Location of the heap + IN OUT UINT8 Reserved[7]; ///< This space is reserved for future use. +} AMD_CONFIG_PARAMS; + +/// CPUID data received registers format +typedef struct { + OUT UINT32 EAX_Reg; ///< CPUID instruction result in EAX + OUT UINT32 EBX_Reg; ///< CPUID instruction result in EBX + OUT UINT32 ECX_Reg; ///< CPUID instruction result in ECX + OUT UINT32 EDX_Reg; ///< CPUID instruction result in EDX +} CPUID_DATA; +#endif // AMD_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h new file mode 100755 index 0000000000..534b03d4a7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdEdk2/CpuRegisters.h @@ -0,0 +1,15 @@ +/** @file + AMD CPU Register Table Related Functions. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_H_ +#define CPU_REGISTERS_H_ + +#include <CpuRegistersDef.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h new file mode 100644 index 0000000000..e086a4c9b1 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/AmdPspDirectory.h @@ -0,0 +1,61 @@ +/** @file + AMD Psp Directory header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_DIR_H_ +#define AMD_PSP_DIR_H_ + +#pragma pack (push, 1) +#define PSP_DIRECTORY_HEADER_SIGNATURE 0x50535024ul ///< $PSP +#define PSP_LV2_DIRECTORY_HEADER_SIGNATURE 0x324C5024ul ///< $PL2 + +/// Enum define various enum type for PSP entry type +enum _PSP_DIRECTORY_ENTRY_TYPE { + PSP_REGION_A_DIR = 0x48, ///< PSP entry points to PSP DIR in Region A + PSP_REGION_B_DIR = 0x4A, ///< PSP entry points to PSP DIR in Region B +}; + +/// Define structure for PSP directory +typedef struct { + UINT32 Cookie; ///< "$PSP" + UINT32 Checksum; ///< 32 bit CRC of header items below and the entire table + UINT32 TotalEntries; ///< Number of PSP Entries + UINT32 Reserved; ///< Unused +} PSP_DIRECTORY_HEADER; + +/// Define structure for 32 bits Entry type field +typedef struct { + UINT32 Type : 8; ///< Type of PSP Directory entry + UINT32 SubProgram : 8; ///< Specify the SubProgram + UINT32 RomId : 2; ///< Specify the ROM ID + UINT32 Reserved : 14; ///< Reserved +} PSP_DIRECTORY_ENTRY_TYPE_FIELD; + +/// Define union type for 32 bits Entry type field +typedef union { + PSP_DIRECTORY_ENTRY_TYPE_FIELD Field; ///< Definition of each filed + UINT32 Value; ///< Group it as 32bits Int +} PSP_DIRECTORY_ENTRY_TYPE; + +/// Structure for PSP Entry +typedef struct { + PSP_DIRECTORY_ENTRY_TYPE Type; ///< Type of PSP entry; 32 bit long + UINT32 Size; ///< Size of PSP Entry in bytes + UINT64 Location; ///< Location of PSP Entry (byte offset from start of SPI-ROM) +} PSP_DIRECTORY_ENTRY; + +/// Structure for PSP directory +typedef struct { + PSP_DIRECTORY_HEADER Header; ///< PSP directory header + PSP_DIRECTORY_ENTRY PspEntry[1]; ///< Array of PSP entries each pointing to a binary in SPI flash + ///< The actual size of this array comes from the + ///< header (PSP_DIRECTORY.Header.TotalEntries) +} PSP_DIRECTORY; + +#pragma pack (pop) +#endif //AMD_PSP_DIR_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h new file mode 100755 index 0000000000..faa8d35b1b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/CpuRegistersDef.h @@ -0,0 +1,156 @@ +/** @file + AMD CPU Register Table Related Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_REGISTERS_DEF_H_ +#define CPU_REGISTERS_DEF_H_ + +#undef BIT0 +#undef BIT1 +#undef BIT2 +#undef BIT3 +#undef BIT4 +#undef BIT5 +#undef BIT6 +#undef BIT7 +#undef BIT8 +#undef BIT9 +#undef BIT10 +#undef BIT10 +#undef BIT11 +#undef BIT12 +#undef BIT13 +#undef BIT14 +#undef BIT15 +#undef BIT16 +#undef BIT17 +#undef BIT18 +#undef BIT19 +#undef BIT20 +#undef BIT21 +#undef BIT22 +#undef BIT23 +#undef BIT24 +#undef BIT25 +#undef BIT26 +#undef BIT27 +#undef BIT28 +#undef BIT29 +#undef BIT30 +#undef BIT31 +#undef BIT32 +#undef BIT33 +#undef BIT34 +#undef BIT35 +#undef BIT36 +#undef BIT37 +#undef BIT38 +#undef BIT39 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT40 +#undef BIT41 +#undef BIT42 +#undef BIT43 +#undef BIT44 +#undef BIT45 +#undef BIT46 +#undef BIT47 +#undef BIT48 +#undef BIT49 +#undef BIT50 +#undef BIT51 +#undef BIT52 +#undef BIT53 +#undef BIT54 +#undef BIT55 +#undef BIT56 +#undef BIT57 +#undef BIT58 +#undef BIT59 +#undef BIT60 +#undef BIT61 +#undef BIT62 +#undef BIT63 + +#define BIT0 0x0000000000000001ull +#define BIT1 0x0000000000000002ull +#define BIT2 0x0000000000000004ull +#define BIT3 0x0000000000000008ull +#define BIT4 0x0000000000000010ull +#define BIT5 0x0000000000000020ull +#define BIT6 0x0000000000000040ull +#define BIT7 0x0000000000000080ull +#define BIT8 0x0000000000000100ull +#define BIT9 0x0000000000000200ull +#define BIT10 0x0000000000000400ull +#define BIT11 0x0000000000000800ull +#define BIT12 0x0000000000001000ull +#define BIT13 0x0000000000002000ull +#define BIT14 0x0000000000004000ull +#define BIT15 0x0000000000008000ull +#define BIT16 0x0000000000010000ull +#define BIT17 0x0000000000020000ull +#define BIT18 0x0000000000040000ull +#define BIT19 0x0000000000080000ull +#define BIT20 0x0000000000100000ull +#define BIT21 0x0000000000200000ull +#define BIT22 0x0000000000400000ull +#define BIT23 0x0000000000800000ull +#define BIT24 0x0000000001000000ull +#define BIT25 0x0000000002000000ull +#define BIT26 0x0000000004000000ull +#define BIT27 0x0000000008000000ull +#define BIT28 0x0000000010000000ull +#define BIT29 0x0000000020000000ull +#define BIT30 0x0000000040000000ull +#define BIT31 0x0000000080000000ull +#define BIT32 0x0000000100000000ull +#define BIT33 0x0000000200000000ull +#define BIT34 0x0000000400000000ull +#define BIT35 0x0000000800000000ull +#define BIT36 0x0000001000000000ull +#define BIT37 0x0000002000000000ull +#define BIT38 0x0000004000000000ull +#define BIT39 0x0000008000000000ull +#define BIT40 0x0000010000000000ull +#define BIT41 0x0000020000000000ull +#define BIT42 0x0000040000000000ull +#define BIT43 0x0000080000000000ull +#define BIT44 0x0000100000000000ull +#define BIT45 0x0000200000000000ull +#define BIT46 0x0000400000000000ull +#define BIT47 0x0000800000000000ull +#define BIT48 0x0001000000000000ull +#define BIT49 0x0002000000000000ull +#define BIT50 0x0004000000000000ull +#define BIT51 0x0008000000000000ull +#define BIT52 0x0010000000000000ull +#define BIT53 0x0020000000000000ull +#define BIT54 0x0040000000000000ull +#define BIT55 0x0080000000000000ull +#define BIT56 0x0100000000000000ull +#define BIT57 0x0200000000000000ull +#define BIT58 0x0400000000000000ull +#define BIT59 0x0800000000000000ull +#define BIT60 0x1000000000000000ull +#define BIT61 0x2000000000000000ull +#define BIT62 0x4000000000000000ull +#define BIT63 0x8000000000000000ull + +#define MSR_MMIO_CFG_BASE 0xC0010058ul // MMIO Configuration Base Address Register + +#endif // CPU_REGISTERS_DEF_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h new file mode 100644 index 0000000000..8ede1be838 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/FchRegistersCommon.h @@ -0,0 +1,85 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FCH_REGISTER_COMMON_H_ +#define FCH_REGISTER_COMMON_H_ + +// Misc +#define R_FCH_ACPI_PM1_STATUS 0x00 +#define R_FCH_ACPI_PM1_ENABLE 0x02 +#define R_FCH_ACPI_PM_CONTROL 0x04 + +#define FCH_LPC_BUS 0 +#define FCH_LPC_DEV 20 +#define FCH_LPC_FUNC 3 + +#define ACPI_MMIO_BASE 0xFED80000ul +#define SMI_BASE 0x200 // DWORD +#define IOMUX_BASE 0xD00 // BYTE +#define MISC_BASE 0xE00 +#define PMIO_BASE 0x300 // DWORD + +// +// FCH LPC Device 0x780E +// Device 20 (0x14) Func 3 +// +#define FCH_LPC_REG48 0x48 // IO/Mem Port Decode Enable Register 5- RW +#define FCH_LPC_REG74 0x74 // Alternative Wide IO Range Enable- W/R +#define FCH_LPC_REG7C 0x7C // TPM (trusted plant form module) reg- W/R +#define FCH_LPC_REGA0 0x0A0 // SPI base address +#define FCH_LPC_REGB8 0x0B8 + +// +// FCH MMIO Base (SMI) +// offset : 0x200 +// +#define FCH_SMI_REG80 0x80 // SmiStatus0 +#define FCH_SMI_REG84 0x84 // SmiStatus1 +#define FCH_SMI_REG88 0x88 // SmiStatus2 +#define FCH_SMI_REG8C 0x8C // SmiStatus3 +#define FCH_SMI_REG90 0x90 // SmiStatus4 +#define FCH_SMI_REG98 0x98 // SmiTrig +#define FCH_SMI_REGA0 0xA0 +#define FCH_SMI_REGB0 0xB0 +#define FCH_SMI_REGC4 0xC4 + +// +// FCH MMIO Base (PMIO) +// offset : 0x300 +// +#define FCH_PMIOA_REG60 0x60 // AcpiPm1EvtBlk + +// +// +#define FCH_MISC_REG80 0x80 +// FCH SPI +// + +#define FCH_SPI_BASE_ADDRESS 0xFEC10000 + +#define FCH_SPI_MMIO_REG00 0x00 +#define FCH_SPI_FIFO_PTR_CRL 0x00100000l // +#define FCH_SPI_BUSY 0x80000000l // +#define FCH_SPI_MMIO_REG1D 0x1D // +#define FCH_SPI_MMIO_REG20 0x20 +#define FCH_SPI_MMIO_REG22 0x22 // +#define FCH_SPI_MMIO_REG30 0x30 // +#define FCH_SPI_R2VAL24 0x00000001l // +#define FCH_SPI_R2VAL25 0x00000002l // +#define FCH_SPI_R2MSK24 0x00000004l // +#define FCH_SPI_R2MSK25 0x00000008l // +#define FCH_SPI_MMIO_REG45_CMDCODE 0x45 // +#define FCH_SPI_MMIO_REG47_CMDTRIGGER 0x47 // +#define FCH_SPI_MMIO_REG48_TXBYTECOUNT 0x48 // +#define FCH_SPI_MMIO_REG4B_RXBYTECOUNT 0x4B // +#define FCH_SPI_MMIO_REG4C_SPISTATUS 0x4C // +#define FCH_SPI_MMIO_REG5C_Addr32_Ctrl3 0x5C // +#define FCH_SPI_SPIROM_PAGE_MASK 0xFF // +#define FCH_SPI_MMIO_REG80_FIFO 0x80 // + +#endif /* FCH_REGISTER_COMMON_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Filecode.h b/Platform/AMD/AgesaModulePkg/Include/Filecode.h new file mode 100644 index 0000000000..726479d79f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Filecode.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * Collectively assign unique filecodes for assert and debug to each source file. + * + * Publish values for decorated filenames, which can be used for + * ASSERT and debug support using a preprocessor define like: + * @n <tt> _#define FILECODE MY_C_FILENAME_FILECODE </tt> @n + * This file serves as a reference for debugging to associate the code and filename. + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: Include + * @e _$Revision: 312538 $ @e \$Date: 2015-02-09 16:53:54 +0800 (Mon, 09 Feb 2015) $ + */ + +#ifndef _FILECODE_H_ +#define _FILECODE_H_ + +#define UNASSIGNED_FILE_FILECODE (0xFFFF) + +#endif // _FILECODE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Gnb.h b/Platform/AMD/AgesaModulePkg/Include/Gnb.h new file mode 100755 index 0000000000..ddc9309d3d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Gnb.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_H_ +#define GNB_H_ + +#define PVOID UINT64 + +#endif // GNB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h new file mode 100644 index 0000000000..192e0d6a8b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbDxio.h @@ -0,0 +1,521 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBDXIO_H_ +#define GNBDXIO_H_ + +#pragma pack (push, 1) + +#include <AGESA.h> +#include <Gnb.h> + +#define MAX_NUMBER_OF_COMPLEXES 16 + +#define DESCRIPTOR_TERMINATE_GNB 0x40000000ull +#define DESCRIPTOR_TERMINATE_TOPOLOGY 0x20000000ull +#define DESCRIPTOR_ALLOCATED 0x10000000ull +#define DESCRIPTOR_PLATFORM 0x08000000ull +#define DESCRIPTOR_COMPLEX 0x04000000ull +#define DESCRIPTOR_SILICON 0x02000000ull +#define DESCRIPTOR_PCIE_WRAPPER 0x01000000ull +#define DESCRIPTOR_PCIE_ENGINE 0x00800000ull +#define DESCRIPTOR_CXL_ENGINE 0x00200000ull + +#define SILICON_CXL_CAPABLE 0x00008000ull + +#define DESCRIPTOR_ALL_WRAPPERS (DESCRIPTOR_PCIE_WRAPPER) +#define DESCRIPTOR_ALL_ENGINES (DESCRIPTOR_PCIE_ENGINE | DESCRIPTOR_CXL_ENGINE) + +#define DESCRIPTOR_ALL_TYPES (DESCRIPTOR_ALL_WRAPPERS | DESCRIPTOR_ALL_ENGINES | DESCRIPTOR_SILICON | DESCRIPTOR_PLATFORM) +#define PcieLibGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) + +typedef UINT16 PCIE_ENGINE_INIT_STATUS; + +/// +/// Engine Configuration +/// +typedef struct { + IN UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + IN UINT16 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + IN UINT16 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG +} PCIE_ENGINE; + +/// +/// PCIe port misc extended controls +/// +typedef struct { + IN UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + IN UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + IN UINT8 CsLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to chipset + IN UINT8 Reserved0 : 5; ///< Unused space +} PORT_MISC_CONTROL; + +/// +/// PCIe port configuration data +/// +typedef struct { + IN UINT8 PortPresent; ///< Enable PCIe port for initialization. + IN UINT8 FunctionNumber : 3; ///< Reserved for future use + IN UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + IN UINT8 LinkSpeedCapability : 4; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + IN UINT8 LinkAspm : 4; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + IN UINT8 LinkHotplug; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + IN UINT16 SlotNum; ///< Physical Slot Number + IN PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + IN UINT8 Reserved1; ///< Reserved for future use +} PORT_DATA; + +typedef struct { + UINT8 LinkSpeed; + UINT8 MaxPayloadSupport; + UINT8 AspmCapability; + UINT8 PciPmL1_1; + UINT8 PciPmL1_2; + UINT8 AspmL1_1; + UINT8 AspmL1_2; + UINT8 EsmSupport; + UINT8 LtrSupport; + UINT8 SurpriseDownErrorReport; + UINT8 TenBitTagSupport; + UINT8 AriForwarding; + UINT8 AcsSupport; + UINT8 AcsSourceValidation; + UINT8 AcsTranslationBlocking; + UINT8 AcsP2pRequestRedirect; + UINT8 AcsP2pCompletionRedirect; + UINT8 AcsUpstreamForwarding; + UINT8 AcsP2pEgressControl; + UINT8 AcsDirectTranslatedP2p; + UINT8 LaneMargining; + UINT8 DataLinkFeature; + UINT8 DownstreamPortContainment; + UINT8 AdvancedErrorReporting; + UINT8 ECRCSupport; + UINT8 MulticastEnable; + UINT8 NativePCIeEnclosureManagement; + UINT8 Capability1Address; + UINT8 Capability1Data; + UINT8 Capability2Address; + UINT8 Capability2Data; + UINT8 Capability3Address; + UINT8 Capability3Data; + UINT8 Capability4Address; + UINT8 Capability4Data; +} PORT_CAPABILITIES; + +/// +/// PCIe PORT_FEATURES +/// +typedef struct { + UINT8 LinkSpeedControl; + UINT8 MaxPayloadSizeControl; + UINT8 ESMControl; + UINT8 LTRControl; + UINT8 DataLinkFeatureExchangeControl; + UINT8 TenBitTagControl; + UINT8 ARIControl; + UINT8 ACSControl; + UINT8 RxLaneMarginingControl; + UINT8 DynLanesPwrState; + UINT8 L1PowerDown; + UINT8 L11PowerDown; + UINT8 L12PowerDown; + UINT8 AutoSpdChngEn; + UINT8 TurnOffUnusedLanes; +} PORT_FEATURES; + +typedef struct { + UINT8 SpcGen1 : 1; ///< SPC Mode 2P5GT + UINT8 SpcGen2 : 1; ///< SPC Mode 5GT + UINT8 SpcGen3 : 2; ///< SPC Mode 8GT + UINT8 SpcGen4 : 2; ///< SPC Mode 16GT + UINT8 SpcGen5 : 2; ///< SPC Mode 32GT +} SPC_MODE; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT32 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT32 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT32 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT32 LcPresetMask8Gt : 10; ///< Gen3 Preset Mask + UINT32 LcFapeEnable8GT : 1; ///< Gen3 FapeEnable + UINT32 UNUSED2 : 7; ///< Currently unassigned - for alignment +} GEN3_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT32 LcPresetMask16Gt : 10; ///< Gen4 Preset Mask + UINT32 LcFapeEnable16GT : 1; ///< Gen4 FapeEnable + UINT32 UNUSED3 : 13; ///< Currently unassigned - for alignment +} GEN4_LANE_CNTL; + +typedef struct { + UINT32 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT32 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT32 LcPresetMask32Gt : 10; ///< Gen5 Preset Mask + UINT32 LcFapeEnable32GT : 1; ///< Gen5 FapeEnable + UINT32 PrecodeRequest : 1; ///< Precoding Request + UINT32 AdvertiseEqToHiRate : 1; ///< Advertise EQ To High Rate Support + UINT32 UNUSED4 : 11; ///< Currently unassigned - for alignment +} GEN5_LANE_CNTL; + +typedef struct { + UINT32 LcFapeReqPostCursor0 : 5; ///< PostCursor0 + UINT32 LcFapeReqPreCursor0 : 4; ///< PreCursor0 + UINT32 LcFapeReqPostCursor1 : 5; ///< PostCursor1 + UINT32 LcFapeReqPreCursor1 : 4; ///< PreCursor1 + UINT32 LcFapeReqPostCursor2 : 5; ///< PostCursor2 + UINT32 LcFapeReqPreCursor2 : 4; ///< PreCursor2 + UINT32 UNUSED6 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_0; + +typedef struct { + UINT32 LcFapeReqPostCursor3 : 5; ///< PostCursor3 + UINT32 LcFapeReqPreCursor3 : 4; ///< PreCursor3 + UINT32 LcFapeReqPostCursor4 : 5; ///< PostCursor4 + UINT32 LcFapeReqPreCursor4 : 4; ///< PreCursor4 + UINT32 LcFapeReqPostCursor5 : 5; ///< PostCursor5 + UINT32 LcFapeReqPreCursor5 : 4; ///< PreCursor5 + UINT32 UNUSED7 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_1; + +typedef struct { + UINT32 LcFapeReqPostCursor6 : 5; ///< PostCursor6 + UINT32 LcFapeReqPreCursor6 : 4; ///< PreCursor6 + UINT32 LcFapeReqPostCursor7 : 5; ///< PostCursor7 + UINT32 LcFapeReqPreCursor7 : 4; ///< PreCursor7 + UINT32 LcFapeReqPostCursor8 : 5; ///< PostCursor8 + UINT32 LcFapeReqPreCursor8 : 4; ///< PreCursor8 + UINT32 UNUSED8 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_2; + +typedef struct { + UINT32 LcFapeReqPostCursor9 : 5; ///< PostCursor9 + UINT32 LcFapeReqPreCursor9 : 4; ///< PreCursor9 + UINT32 LcFapeReqPostCursor10 : 5; ///< PostCursor10 + UINT32 LcFapeReqPreCursor10 : 4; ///< PreCursor10 + UINT32 LcFapeReqPostCursor11 : 5; ///< PostCursor11 + UINT32 LcFapeReqPreCursor11 : 4; ///< PreCursor11 + UINT32 UNUSED9 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_3; + +typedef struct { + UINT32 LcFapeReqPostCursor12 : 5; ///< PostCursor12 + UINT32 LcFapeReqPreCursor12 : 4; ///< PreCursor12 + UINT32 LcFapeReqPostCursor13 : 5; ///< PostCursor13 + UINT32 LcFapeReqPreCursor13 : 4; ///< PreCursor13 + UINT32 LcFapeReqPostCursor14 : 5; ///< PostCursor14 + UINT32 LcFapeReqPreCursor14 : 4; ///< PreCursor14 + UINT32 UNUSED10 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_4; + +typedef struct { + UINT32 LcFapeReqPostCursor15 : 5; ///< PostCursor15 + UINT32 LcFapeReqPreCursor15 : 4; ///< PreCursor15 + UINT32 LcFapeReqPostCursor16 : 5; ///< PostCursor16 + UINT32 LcFapeReqPreCursor16 : 4; ///< PreCursor16 + UINT32 LcFapeReqPostCursor17 : 5; ///< PostCursor17 + UINT32 LcFapeReqPreCursor17 : 4; ///< PreCursor17 + UINT32 UNUSED11 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_5; + +typedef struct { + UINT32 LcFapeReqPostCursor18 : 5; ///< PostCursor18 + UINT32 LcFapeReqPreCursor18 : 4; ///< PreCursor18 + UINT32 LcFapeReqPostCursor19 : 5; ///< PostCursor19 + UINT32 LcFapeReqPreCursor19 : 4; ///< PreCursor19 + UINT32 LcFapeReqPostCursor20 : 5; ///< PostCursor20 + UINT32 LcFapeReqPreCursor20 : 4; ///< PreCursor20 + UINT32 UNUSED12 : 5; ///< Currently unassigned - for alignment +} LC_FAPE_GROUP_6; + +/// +/// PCIe port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 IsBmcLocation : 1; ///< Port Location of BMC + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 TXDeEmphasis : 4; ///< TX De-emphasis + UINT8 TXMargin : 3; ///< TX Margin + UINT8 UNUSED1 : 1; ///< Currently unassigned - for alignment + + PORT_CAPABILITIES PortCapabilities; ///< Port Capabilities CBS + + SPC_MODE SpcMode; + + GEN3_LANE_CNTL LaneEqualizationCntl; + GEN4_LANE_CNTL Gen4LaneEqualizationCntl; + GEN5_LANE_CNTL Gen5LaneEqualizationCntl; + + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 UNUSED4 : 1; ///< Currently unassigned - for alignment + UINT8 SRIS_SRNS : 1; ///< SRIS SRNS + UINT8 SRIS_LowerSKPSupport : 1; ///< SRIS Lower SKP Support + UINT8 CcixControl : 1; ///< Bit to enable/disable ESM + UINT8 CxlControl : 1; ///< Bit to enable CXL Capability + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 SlotPowerLimitScale : 2; ///< Slot Power Limit Scale + UINT8 UNUSED5 : 1; ///< Currently unassigned - for alignment + + UINT8 RxMarginPersistence : 1; ///< Bit to enable/disable Rx Margin persistence mode + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 TxVetting : 1; ///< Gen4 Tx Vetting + UINT8 RxVetting : 1; ///< Gen4 Rx Vetting + UINT8 TxVettingGen5 : 1; ///< Gen5 Tx Vetting + UINT8 RxVettingGen5 : 1; ///< Gen5 Rx Vetting + + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 DlfCapDisable : 1; ///< DLF Capability 1:Disable 0:Enable + UINT8 DlfExchangeDisable : 1; ///< DLF Exchange 1:Disable 0:Enable + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + + UINT8 EqSearchMode : 2; ///< Equalization Search Mode + UINT8 BypassGen3EQ : 1; ///< BypassGen3EQ + UINT8 DisGen3EQPhase : 1; ///< Disable Gen3 EQ Phase2/3 + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset value + + UINT8 EqSearchModeGen4 : 2; ///< Equalization Search Mode for Gen4 + UINT8 BypassGen4EQ : 1; ///< Gen4 Bypass phase3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset value + UINT8 EqSearchModeGen5 : 2; ///< Equalization Search Mode for Gen5 + UINT8 BypassGen5EQ : 1; ///< Gen5 Bypass phase3 EQ + UINT8 DisGen5EQPhase : 1; ///< Gen5 Bypass phase2/3 EQ + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset value + + UINT16 PsppPolicyDC; ///< Pspp Policy DC + UINT16 PsppPolicyAC; ///< Pspp Policy AC + UINT8 PsppDeviceType; ///< Pspp Device Type + + LC_FAPE_GROUP_0 LcFapeSettingsGroup0; + LC_FAPE_GROUP_1 LcFapeSettingsGroup1; + LC_FAPE_GROUP_2 LcFapeSettingsGroup2; + LC_FAPE_GROUP_3 LcFapeSettingsGroup3; + LC_FAPE_GROUP_4 LcFapeSettingsGroup4; + LC_FAPE_GROUP_5 LcFapeSettingsGroup5; + LC_FAPE_GROUP_6 LcFapeSettingsGroup6; + + UINT8 ForceSteering : 1; ///< Steering is forced + UINT8 EsmUsTxPreset : 4; ///< ESM Upstream Tx Preset + UINT8 UNUSED13 : 3; ///< Currently unassigned - for alignment + + // Used by DXE + PORT_FEATURES PortFeatures; ///< Port Features CBS + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 I2CMuxInfo; ///< First I2c Mux on Bus + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:SRIS 2:SRNS 3:SRNS in SRIS 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 ClkReq : 4; ///< ClkReq:[0:3] + UINT8 EqPreset : 4; ///< EqPreset:[4:7] + UINT8 LinkAspmL1_1 : 1; ///< Enable PM L1 SS L1.1 + UINT8 LinkAspmL1_2 : 1; ///< Enable PM L1 SS L1.2 + UINT8 EsmControl : 1; ///< Bit to enable/disable ESM + UINT8 EsmDsTxPreset : 4; ///< ESM Downstream Tx Preset + UINT8 ClkReqFilterEn : 1; ///< Controls filtering of CLKREQb signal in LC in order to avoid false L1 substate entries/exits. +} PCIE_PORT_CONFIG; + +/// +/// CXL port configuration info +/// +typedef struct { + PORT_DATA PortData; ///< Port data + UINT8 StartCoreLane; ///< Start Core Lane + UINT8 EndCoreLane; ///< End Core lane + UINT8 NativeDevNumber : 5; ///< Native PCI device number of the port + UINT8 NativeFunNumber : 3; ///< Native PCI function number of the port + UINT8 CoreId : 4; ///< PCIe core ID + UINT8 PortId : 4; ///< Port ID on wrapper + PCI_ADDR Address; ///< PCI address of the port + UINT8 PcieBridgeId : 7; ///< IOC PCIe bridge ID + UINT8 UNUSED0 : 1; ///< Currently unassigned - for alignment + UINT8 LogicalBridgeId; ///< Logical Bridge ID + UINT8 SlotPowerLimit; ///< Slot Power Limit + UINT8 MaxPayloadSize; ///< Max_Payload_Size + + UINT8 CxlIndex; + UINT8 CxlDeviceType : 2; ///< Type of CXL device connected + UINT8 CxlVersion : 2; ///< Version of CXL device connected (1=CXL1.1, 2=CXL2.0) + UINT8 IsCxlScanned : 1; ///< Indicates if the CXL device has been scanned + UINT8 ReportToMpioinDxe : 1; ///< Indicates if the CXL info needs to be reported to MPIO in DXE + UINT8 UNUSED1 : 2; ///< Currently unassigned - for alignment + + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT32 Mmio32Base; + UINT32 Mmio32Size; + UINT64 Mmio64Base; + UINT64 Mmio64Size; + UINT32 Mmio32Gran; +} PCIE_CXL_CONFIG; + +/// +/// Descriptor header +/// +typedef struct { + UINT32 DescriptorFlags; ///< Descriptor flags + UINT16 Parent; ///< Offset of parent descriptor + UINT16 Peer; ///< Offset of the peer descriptor + UINT16 Child; ///< Offset of the list of child descriptors +} PCIE_DESCRIPTOR_HEADER; + +/// +/// Engine configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor header + PCIE_ENGINE EngineData; ///< Engine Data + PCIE_ENGINE_INIT_STATUS InitStatus; ///< Initialization Status + UINT8 Scratch; ///< Scratch pad + union { + PCIE_PORT_CONFIG Port; ///< PCIe port configuration data + PCIE_CXL_CONFIG Cxl; ///< CXL Configuration data + } Type; +} PCIE_ENGINE_CONFIG; + +/// +/// Wrapper configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 WrapId; ///< Wrapper ID + UINT8 CcixCoreConfig; ///< Ccix CORE Configuration + UINT8 StartPhyLane; ///< Start PHY Lane + UINT8 EndPhyLane; ///< End PHY Lane + UINT8 StartDxioLane; ///< Start Dxio Lane (Translated) + UINT8 EndDxioLane; ///< End Dxio Lane (Translated) + struct { + UINT8 PowerOffUnusedLanes : 1; ///< Power Off unused lanes + UINT8 PowerOffUnusedPlls : 1; ///< Power Off unused Plls + UINT8 ClkGating : 1; ///< TXCLK gating + UINT8 LclkGating : 1; ///< LCLK gating + UINT8 TxclkGatingPllPowerDown : 1; ///< TXCLK clock gating PLL power down + UINT8 PllOffInL1 : 1; ///< PLL off in L1 + UINT8 AccessEncoding : 1; ///< Reg access encoding + UINT8 CoreReversed : 1; ///< Indicates lanes are reversed in package connection + } Features; + UINT8 MasterPll; ///< Bitmap of master PLL + UINT32 AcsSupport : 1; ///< Acs Support + UINT32 LtrSupport : 1; ///< LTR Support + UINT32 AriForwarding : 1; ///< ARI Forwarding + UINT32 LaneMargining : 1; ///< Lane Margining + UINT32 NativePCIeEnclosureManagement : 1; ///< NPEM + UINT32 DownstreamPortContainment : 1; ///< Downstream port containment + UINT32 AdvancedErrorReporting : 1; ///< Advacned Error Reporting + UINT32 ECRCSupport : 2; ///< ECRC Capability + UINT32 Reserved : 23; ///< Reserved bits +} PCIE_WRAPPER_CONFIG; + +/// +/// Silicon configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 SocketId; ///< Socket ID + UINT8 DieNumber; ///< Module ID + UINT8 RBIndex; ///< Physical Root Bridge + UINT8 InstanceId; ///< Logical Instance Identifier + PCI_ADDR Address; ///< PCI address of GNB host bridge + UINT16 StartLane; ///< Start Lane of this node + UINT16 EndLane; ///< End Lane of this node + UINT8 BusNumberLimit; ///< Last Bus Number assigned to this node + UINT8 SbPresent : 1; ///< Set to 1 if FCH connected to this NBIO + UINT8 SmuPresent : 1; ///< Set to 1 if SMU connected to this NBIO + UINT8 MP_Instance : 6; ///< MP Instance + UINT8 LogicalRBIndex; ///< Logical Root Bridge + UINT8 NumEngineDesc; ///< Total number of lane bifurcation descriptors +} PCIE_SILICON_CONFIG; + +typedef PCIE_SILICON_CONFIG GNB_HANDLE; + +/// +/// Complex configuration data +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + UINT8 NodeId; ///< Processor Node ID + UINT8 Reserved; ///< For alignment +} PCIE_COMPLEX_CONFIG; + +/// +/// PCIe platform configuration info +/// +typedef struct { + PCIE_DESCRIPTOR_HEADER Header; ///< Descriptor Header + PVOID Reserved1; ///< Reserved + UINT32 Reserved2; ///< Reserved + UINT32 PhyConfigData; ///< Phy Configuration Data + UINT32 Reserved3; ///< Reserved + UINT32 Reserved4; ///< Reserved + UINT32 PsppTuningParams; ///< Tuning parameters for PSPP + UINT32 PsppTuningParams2; ///< Tuning parameters 2 for PSPP + UINT8 Reserved5; ///< Reserved + UINT8 PsppPolicy; ///< PSPP policy + UINT8 Reserved6; ///< Reserved + UINT8 RootBridgesPerSocket; ///< Number of root bridges per socket + PCIE_COMPLEX_CONFIG ComplexList[MAX_NUMBER_OF_COMPLEXES]; ///< Complex +} PCIE_PLATFORM_CONFIG; + +/// +/// PCIe Engine Description +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor on wrapper + ///< Bit30 - Descriptor allocated for PCIe port + PCIE_ENGINE EngineData; ///< Engine Data +} PCIE_ENGINE_DESCRIPTOR; +#pragma pack (pop) + +#endif // GNBDXIO_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h new file mode 100644 index 0000000000..90f52cca7b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS.h @@ -0,0 +1,18 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _GNBREGISTERSRS_H_ +#define _GNBREGISTERSRS_H_ + +#include "GnbRegistersRS/IOHC.h" + +#ifndef NBIO_SPACE +#define NBIO_SPACE(HANDLE, ADDRESS) (ADDRESS + (HANDLE->RBIndex << 20)) +#endif + +#endif /*_GNBREGISTERSRS_H_*/ diff --git a/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h new file mode 100644 index 0000000000..b1a95237de --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/GnbRegistersRS/IOHC.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _IOHC_H_ +#define _IOHC_H_ + +// Bitfield Description : DBG MMIO enable. +#define DBG_BASE_ADDR_LO_DBG_MMIO_EN_OFFSET 0 + +// Bitfield Description : Locks the DBG MMIO address range and enable until the next warm reset. +#define DBG_BASE_ADDR_LO_DBG_MMIO_LOCK_OFFSET 1 + +#define SMN_IOHUB0NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13b102f0UL +#define IOAPIC_BASE_ADDR_LO_IOAPIC_BASE_ADDR_LO_MASK 0xffffff00 +#define SMN_IOHUB1NBIO0_IOAPIC_BASE_ADDR_LO_ADDRESS 0x13c102f0UL + +#endif /* _IOHC_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h new file mode 100644 index 0000000000..f5cc5e2228 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Guid/GnbPcieInfoHob.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNB_PCIE_HOB_INFO_H_ +#define GNB_PCIE_HOB_INFO_H_ + +#define _GNB_PCIE_HOB_INFO_GUID \ +{ \ + 0x3eb1d90, 0xce14, 0x40d8, 0xa6, 0xba, 0x10, 0x3a, 0x8d, 0x7b, 0xd3, 0x2d \ +} +extern EFI_GUID gGnbPcieHobInfoGuid; + +#pragma pack (push, 1) +#define MAX_NUMBER_OF_CORES_PER_COMPLEX 3 +#define MAX_NUMBER_OF_PORTS_PER_COMPLEX 22 + +/// PCIe information HOB data +typedef struct _GNB_PCIE_INFORMATION_DATA_HOB { + EFI_HOB_GUID_TYPE EfiHobGuidType; ///< GUID Hob type structure + PCIE_PLATFORM_CONFIG PciePlatformConfigHob; ///< Platform Config Structure + UINT32 ComplexConfigs; ///< Allocation for Max Complex Structure suported +} GNB_PCIE_INFORMATION_DATA_HOB; + +#pragma pack (pop) + +#endif /* GNB_PCIE_HOB_INFO_H_ */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h new file mode 100644 index 0000000000..dc773737b9 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdBaseLib.h @@ -0,0 +1,16 @@ +/** @file + Contains interface to the AMD AGESA library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_BASE_LIB_H_ +#define AMD_BASE_LIB_H_ + +#include "Uefi.h" +#include "AMD.h" + +#endif // AMD_BASE_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h new file mode 100644 index 0000000000..9d9892aa30 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/AmdPspMboxLibV2.h @@ -0,0 +1,43 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +/* $NoKeywords:$ */ + +/** + * @file + * + * PSP Mailbox related functions Prototype definition + * + * + * @xrefitem bom "File Content Label" "Release Content" + * @e project: AGESA + * @e sub-project: PSP + * @e \$Revision: 312133 $ @e \$Date: 2015-02-03 02:47:45 +0800 (Tue, 03 Feb 2015) $ + */ + +#ifndef _PSP_MBOX_H_ +#define _PSP_MBOX_H_ + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ); + +#endif //_PSP_MBOX_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h new file mode 100644 index 0000000000..51935f413a --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/BaseFabricTopologyLib.h @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef BASE_FABRIC_TOPOLOGY_LIB_H_ +#define BASE_FABRIC_TOPOLOGY_LIB_H_ + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ); + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ); + +#endif // BASE_FABRIC_TOPOLOGY_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h new file mode 100644 index 0000000000..cae3aff9b3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchBaseLib.h @@ -0,0 +1,16 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_BASE_LIB_H_ +#define _FCH_BASE_LIB_H_ + +#include <Library/IoLib.h> +#include <Library/PciLib.h> +#include <Library/BaseLib.h> + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h new file mode 100644 index 0000000000..345e39adce --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/FchEspiCmdLib.h @@ -0,0 +1,413 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FCH_ESPI_CMD_LIB_H_ +#define _FCH_ESPI_CMD_LIB_H_ + +#include <Uefi/UefiBaseType.h> + +#define MAX_ESPI_RETRY 100000ul +// +// Cycle Type +// +#define CYCLE_TYPE_FLASH_READ 0 +#define CYCLE_TYPE_FLASH_WRITE 1 +#define CYCLE_TYPE_FLASH_ERASE 2 +#define CYCLE_TYPE_RPMC_OP1 3 +#define CYCLE_TYPE_RPMC_OP2 4 + +// RPMC OP1/OP2 Command Payload Max Length (512 Bits) +#define RPMC_CMD_PAYLOAD_MAX_LEN 0x40 + +// +// Master Registers +// +#define SET_CONFIGURATION 0 +#define GET_CONFIGURATION 1 +#define IN_BAND_RESET 2 +#define PC_MSG_DOWN_STREAM 4 +#define VM_DOWN_STREAM 5 +#define OOB_DOWN_STREAM 6 +#define FA_DOWN_STREAM 7 + +// ESPIx00 +#define DNCMD_STATUS BIT3 + +// ESPIx2C Master Capability +#define MASTER_FA_SUPPORT BIT0 +#define MASTER_OOB_SUPPORT BIT1 +#define MASTER_VW_SUPPORT BIT2 +#define MASTER_PERIPHERAL_SUPPORT BIT3 + +// ESPIx68 Slave0 Configuration +#define SLAVE_FA_ENABLE BIT0 +#define SLAVE_OOB_ENABLE BIT1 +#define SLAVE_VW_ENABLE BIT2 +#define SLAVE_PC_ENABLE BIT3 + +/// eSPIx00 eSPI Software Specific Register 0 +#define ESPI_DN_TXHDR_0 0x00 +typedef union { + struct { + UINT32 SWCommandType : 3; + UINT32 CommandStatus : 1; + UINT32 PutFlashNpTranActive : 1; + UINT32 Reserved : 3; + UINT32 DnCmdHdata0 : 8; + UINT32 DnCmdHdata1 : 8; + UINT32 DnCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx00_DN_TXHDR0; + +/// eSPIx04 eSPI Software Specific Register 1 +#define ESPI_DN_TXHDR_1 0x04 +typedef union { + struct { + UINT32 DnCmdHdata3 : 8; + UINT32 DnCmdHdata4 : 8; + UINT32 DnCmdHdata5 : 8; + UINT32 DnCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx04_DN_TXHDR1; + +#define ESPI_DN_TXHDR_2 0x08 +typedef union { + struct { + UINT32 DnCmdHdata7 : 8; + UINT32 Reserved : 24; + } Field; + UINT32 Value; +} ESPIx08_DN_TXHDR2; + +#define ESPI_DN_TXDATA_PORT 0x0C +typedef union { + struct { + UINT32 DnTxData0 : 8; + UINT32 DnTxData1 : 8; + UINT32 DnTxData2 : 8; + UINT32 DnTxData3 : 8; + } Field; + UINT32 Value; +} ESPIx0C_DN_TXDATA_PORT; + +#define ESPI_UP_RXHDR_0 0x10 +typedef union { + struct { + UINT32 UpCommandType : 3; + UINT32 UpCommandStatus : 1; + UINT32 SlaveSel : 2; + UINT32 Reserved : 2; + UINT32 UpCmdHdata0 : 8; + UINT32 UpCmdHdata1 : 8; + UINT32 UpCmdHdata2 : 8; + } Field; + UINT32 Value; +} ESPIx10_UP_RXHDR0; + +#define ESPI_UP_RXHDR_1 0x14 +typedef union { + struct { + UINT32 UpCmdHdata3 : 8; + UINT32 UpCmdHdata4 : 8; + UINT32 UpCmdHdata5 : 8; + UINT32 UpCmdHdata6 : 8; + } Field; + UINT32 Value; +} ESPIx14_UP_RXHDR1; + +#define ESPI_UP_RXDATA_PORT 0x18 + +/// eSPIx2C eSPI Master Capability +#define ESPI_MASTER_CAP 0x2C +typedef union { + struct { + UINT32 FlashAccessChannelSupport : 1; + UINT32 OOBMessageChannelSupport : 1; + UINT32 VWChannelSupport : 1; + UINT32 PChannelSupport : 1; + UINT32 MasterVersion : 3; + UINT32 FlashAccessChannelMaxPayload : 3; + UINT32 OOBMessageChannelMaxPayload : 3; + UINT32 OperatingMaxVWCount : 6; + UINT32 PChannelMaxPayloadSize : 3; + UINT32 NumberOfSlave : 3; + UINT32 OperatingSupportFreq : 3; + UINT32 IOMode : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheck : 1; + } Field; + UINT32 Value; +} ESPIx2C_MASTER_CAP; + +/// eSPIx30 eSPI Global Control 0 +#define ESPI_GLOBAL_CTRL0 0x30 +typedef union { + struct { + UINT32 WdgEn : 1; + UINT32 WaitChkEn : 1; + UINT32 PrClkgatEn : 1; + UINT32 AlStopEn : 1; + UINT32 AlIdleTimer : 3; + UINT32 RgDbgclkGatingEn : 1; + UINT32 WdgCnt : 16; + UINT32 WaitCnt : 6; + UINT32 PrRstEnPltrst : 1; + UINT32 SafsClkGateEn : 1; + } Field; + UINT32 Value; +} ESPIx30_GLOBAL_CTRL0; + +/// eSPIx68 eSPI Slave0 Configuration +#define ESPI_SLAVE0_CONFIG 0x68 +typedef union { + struct { + UINT32 FlashAccessChannelEnable : 1; + UINT32 OOBMessageChannelEnable : 1; + UINT32 VWChannelEnable : 1; + UINT32 PChannelEnable : 1; + UINT32 FlashSharingMode : 1; + UINT32 FlashMaxPayloadSize : 3; + UINT32 PutFlashNpHeaderDataEn : 1; + UINT32 PutFlashNpHeaderEn : 1; + UINT32 SafsDeferValidEn : 1; + UINT32 FlashModifierEn : 1; + UINT32 Reserved_24_12 : 13; + UINT32 OperatingFreq : 3; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 CRCCheckingEnable : 1; + } Field; + UINT32 Value; +} ESPIx68_SLAVE0_CONFIG; + +/// eSPIx70 eSPI Slave0 Interrupt Status +#define ESPI_SLAVE0_INT_STS 0x70 +typedef union { + struct { + UINT32 BusErrInt : 1; + UINT32 WaitTimeoutInt : 1; + UINT32 CrcErrInt : 1; + UINT32 Reserved_3 : 1; + UINT32 NoRspInt : 1; + UINT32 FatalErrInt : 1; + UINT32 NonFatalErrInt : 1; + UINT32 UnknownRspInt : 1; + UINT32 UnknownCtInt : 1; + UINT32 UnsucssCplInt : 1; + UINT32 IllegalTagInt : 1; + UINT32 IllegalLenInt : 1; + UINT32 RxOobOverflowInt : 1; + UINT32 RxMsgOverflowInt : 1; + UINT32 RxFlashOverflowInt : 1; + UINT32 ProtocolErrInt : 1; + UINT32 Reserved_16 : 1; + UINT32 UpFifoWdgTo : 1; + UINT32 MstAbortInt : 1; + UINT32 WdgTimeoutInt : 1; + UINT32 Reserved_23_20 : 4; + UINT32 RxVwGrp0Int : 1; + UINT32 RxVwGrp1Int : 1; + UINT32 RxVwGrp2Int : 1; + UINT32 RxVwGrp3Int : 1; + UINT32 DnCmdInt : 1; + UINT32 RxMsgInt : 1; + UINT32 RxOobInt : 1; + UINT32 FlashReqInt : 1; + } Field; + UINT32 Value; +} ESPIx70_SLAVE0_INT_STS; + +/// +/// Slave Registers +/// +#define SLAVE_REG_ID 0x04 +#define SLAVE_GENERAL_CAPCFG 0x08 +#define SLAVE_PC_CAPCFG 0x10 +#define SLAVE_VW_CAPCFG 0x20 +#define SLAVE_OOB_CAPCFG 0x30 +#define SLAVE_FA_CAPCFG 0x40 +#define SLAVE_FA_CAPCFG2 0x44 + +/// Offset 04h: Device Identification +typedef union { + struct { + UINT32 RO_VersionID : 8; + UINT32 Reserved_31_8 : 24; + } Field; + UINT32 Value; +} ESPI_SL04_DEVICE_ID; + +// SLAVE offset 0x08 SLAVE_GENERAL_CAPCFG +#define SLAVE_FA_SUPPORT BIT3 +#define SLAVE_OOB_SUPPORT BIT2 +#define SLAVE_VW_SUPPORT BIT1 +#define SLAVE_PERIPHERAL_SUPPORT BIT0 +/// Offset 08h: General Capabilities and Configurations +typedef union { + struct { + UINT32 RO_PCSupported : 1; + UINT32 RO_VWSupported : 1; + UINT32 RO_OOBMsgSupported : 1; + UINT32 RO_FASupported : 1; + UINT32 Reserved_7_3 : 4; + UINT32 Reserved_11_8 : 4; + UINT32 RO_MaxWaitStateAllowed : 4; + UINT32 RO_MaxFreqSupported : 3; + UINT32 RO_OpenDrainAlertSupported : 1; + UINT32 OperatingFreq : 3; + UINT32 OpenDrainAlertSelect : 1; + UINT32 RO_IOModeSupported : 2; + UINT32 IOModeSelect : 2; + UINT32 AlertMode : 1; + UINT32 Reserved_29 : 1; + UINT32 ResponseModifierEn : 1; + UINT32 CRCCheckingEn : 1; + } Field; + UINT32 Value; +} ESPI_SL08_SLAVE_GENERAL_CAPCFG; + +/// Offset 10h: Channel 0 Capabilities and Configurations +typedef union { + struct { + UINT32 PCEn : 1; + UINT32 RO_PCReady : 1; + UINT32 BusMasterEn : 1; + UINT32 Reserved_3 : 1; + UINT32 RO_PCMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 PCMaxPayloadSizeSelected : 3; + UINT32 Reserved_11 : 1; + UINT32 PCMaxReadRequestSize : 3; + UINT32 Reserved_31_15 : 17; + } Field; + UINT32 Value; +} ESPI_SL10_SLAVE_PC_CAPCFG; + +/// Offset 20h: Channel 1 Capabilities and Configurations +typedef union { + struct { + UINT32 VWEn : 1; + UINT32 RO_VWReady : 1; + UINT32 Reserved_7_2 : 6; + UINT32 RO_MaxVWCntSupported : 6; + UINT32 Reserved_15_14 : 2; + UINT32 OpMaxVWCnt : 6; + UINT32 Reserved_31_22 : 10; + } Field; + UINT32 Value; +} ESPI_SL20_SLAVE_VW_CAPCFG; + +/// Offset 30h: Channel 2 Capabilities and Configurations +typedef union { + struct { + UINT32 OOBEn : 1; + UINT32 RO_OOBReady : 1; + UINT32 Reserved_3_2 : 2; + UINT32 RO_MsgChMaxPayloadSizeSupported : 3; + UINT32 Reserved_7 : 1; + UINT32 MsgChMaxPayloadSizeSelected : 3; + UINT32 Reserved_31_11 : 21; + } Field; + UINT32 Value; +} ESPI_SL30_SLAVE_OOB_CAPCFG; + +/// Offset 40h: Channel 3 Capabilities and Configurations +typedef union { + struct { + UINT32 FAEn : 1; + UINT32 RO_FAReady : 1; + UINT32 FlashBlockEraseSize : 3; + UINT32 RO_ChMaxPayloadSizeSupported : 3; + UINT32 ChMaxPayloadSizeSelected : 3; + UINT32 RO_FlashSharingMode : 1; + UINT32 ChMaxReadReqSize : 3; + UINT32 Reserved_15 : 1; + UINT32 RO_FlashSharingCapabilitySupported : 2; + UINT32 Reserved_19_18 : 2; + UINT32 RO_RPMCCounterOn1stDevice : 4; + UINT32 RO_RPMCOp1On1stDevice : 8; + } Field; + UINT32 Value; +} ESPI_SL40_SLAVE_FA_CAPCFG; + +/// Offset 44h: Channel 3 Capabilities and Configurations2 +typedef union { + struct { + UINT32 RO_TargetMaxReadReqSizeSupported : 3; + UINT32 Reserved_7_3 : 5; + UINT32 RO_TargetFlashEraseBlockSize : 8; + UINT32 RO_TargetRPMCSupported : 6; + UINT32 RO_NumOfRPMCdevices : 2; + UINT32 Reserved_31_24 : 8; + } Field; + UINT32 Value; +} ESPI_SL44_SLAVE_FA_CAPCFG2; + +// +// eSPI Command functions +// +VOID +FchEspiCmd_InBandRst ( + IN UINT32 EspiBase + ); + +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ); + +VOID +FchEspiCmd_SetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr, + IN UINT32 Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ); + +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp1 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + IN UINT8 *Data + ); + +EFI_STATUS +FchEspiCmd_SafsRpmcOp2 ( + IN UINT32 EspiBase, + IN UINT8 RpmcFlashDev, + IN UINT32 Length, + OUT UINT8 *Buffer + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h new file mode 100755 index 0000000000..19688e2548 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/GnbPcieConfigLib.h @@ -0,0 +1,16 @@ +/** @file + GNB PCIe Library definition. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GNBPCIECONFIG_LIB_H_ +#define GNBPCIECONFIG_LIB_H_ + +#include <GnbDxio.h> +#include <Library/PcieConfigLib.h> + +#endif // GNBPCIECONFIG_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h new file mode 100644 index 0000000000..df88274530 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioCommonLibDxe.h @@ -0,0 +1,37 @@ +/** @file + Header file of AMD NBIO Common DXE library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOCOMMONLIBDXE_H_ +#define NBIOCOMMONLIBDXE_H_ + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ); + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ); + +#endif // NBIOCOMMONLIBDXE_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h new file mode 100755 index 0000000000..4fec578a9f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/NbioHandleLib.h @@ -0,0 +1,62 @@ +/** @file + GNB function to GetHostPciAddress and GetHandle. + Contain code that create/locate and rebase configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIOHANDLELIB_LIB_H_ +#define NBIOHANDLELIB_LIB_H_ + +#include <GnbDxio.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ); + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ); + +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define GnbGetSocketId(Handle) (Handle != NULL ? (Handle)->SocketId : 0) +#define GnbGetDieNumber(Handle) (Handle != NULL ? (Handle)->DieNumber : 0) +#define GnbGetRBIndex(Handle) (Handle != NULL ? (Handle)->RBIndex : 0) + +#endif // NBIOHANDLELIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h new file mode 100644 index 0000000000..9f53746814 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/PcieConfigLib.h @@ -0,0 +1,283 @@ +/** @file + Helper functions to access PCIe configuration data area. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PCIECONFIGLIB_LIB_H_ +#define PCIECONFIGLIB_LIB_H_ + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_WRAPPER_CALLBACK) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +typedef VOID (*PCIE_RUN_ON_ENGINE_CALLBACK2) ( + IN PCIE_ENGINE_CONFIG *Engine, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +typedef VOID (*PCIE_RUN_ON_WRAPPER_CALLBACK2) ( + IN PCIE_WRAPPER_CONFIG *Wrapper, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +typedef AGESA_STATUS (*PCIE_RUN_ON_DESCRIPTOR_CALLBACK) ( + IN PCIE_DESCRIPTOR_HEADER *Descriptor, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ); + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ); + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ); + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ); + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ); + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ); + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ); + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ); + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ); + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ); + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ); + +#define PcieConfigGetParentWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetParent (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetParentSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetParent (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetParentComplex(Descriptor) ((PCIE_COMPLEX_CONFIG *) PcieConfigGetParent (DESCRIPTOR_COMPLEX, &((Descriptor)->Header))) +#define PcieConfigGetPlatform(Descriptor) ((PCIE_PLATFORM_CONFIG *) PcieConfigGetParent (DESCRIPTOR_PLATFORM, &((Descriptor)->Header))) +#define PcieConfigGetChildWrapper(Descriptor) ((PCIE_WRAPPER_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_WRAPPERS, &((Descriptor)->Header))) +#define PcieConfigGetChildEngine(Descriptor) ((PCIE_ENGINE_CONFIG *) PcieConfigGetChild (DESCRIPTOR_ALL_ENGINES, &((Descriptor)->Header))) +#define PcieConfigGetChildSilicon(Descriptor) ((PCIE_SILICON_CONFIG *) PcieConfigGetChild (DESCRIPTOR_SILICON, &((Descriptor)->Header))) +#define PcieConfigGetNextDescriptor(Descriptor) ((((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : ((Descriptor + 1)))) +#define PcieConfigIsPcieEngine(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_ENGINE) != 0) : FALSE) +#define PcieConfigIsSbPcieEngine(Engine) ((Engine != NULL) ? ((BOOLEAN) (Engine->Type.Port.PortData.MiscControls.SbLink)) : FALSE) +#define PcieConfigIsEngineAllocated(Descriptor) ((Descriptor != NULL) ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_ALLOCATED) != 0) : FALSE) +#define PcieConfigSetDescriptorFlags(Descriptor, SetDescriptorFlags) if (Descriptor != NULL) (Descriptor)->Header.DescriptorFlags |= SetDescriptorFlags +#define PcieConfigResetDescriptorFlags(Descriptor, ResetDescriptorFlags) if (Descriptor != NULL) ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags &= (~(ResetDescriptorFlags)) +#define PcieInputParsetGetNextDescriptor(Descriptor) ((Descriptor == NULL) ? NULL : ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : (Descriptor + 1)) +#define PcieConfigGetNextTopologyDescriptor(Descriptor, Termination) ((Descriptor == NULL) ? NULL : ((((PCIE_DESCRIPTOR_HEADER *) Descriptor)->DescriptorFlags & Termination) != 0) ? NULL : ((UINT8 *) Descriptor + ((PCIE_DESCRIPTOR_HEADER *) Descriptor)->Peer)) +#define GnbGetNextHandle(Descriptor) (GNB_HANDLE *) PcieConfigGetNextTopologyDescriptor (Descriptor, DESCRIPTOR_TERMINATE_TOPOLOGY) +#define PcieConfigGetNextDataDescriptor(Descriptor) ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0 ? NULL : (Descriptor + 1)) + +#endif // PCIECONFIGLIB_LIB_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h new file mode 100644 index 0000000000..f0c6d1ccbb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Library/SmnAccessLib.h @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _SMNACCESSLIB_H_ +#define _SMNACCESSLIB_H_ + +VOID +SmnRegisterReadS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + OUT VOID *Value + ); + +VOID +SmnRegisterRMWS ( + IN UINT32 SegmentNumber, + IN UINT32 BusNumber, + IN UINT32 Address, + IN UINT32 AndMask, + IN UINT32 OrValue, + IN UINT32 Flags + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h new file mode 100644 index 0000000000..0e08e64b24 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdNbioPcieServicesProtocol.h @@ -0,0 +1,47 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_PCIE_SERVICES_PROTOCOL_H_ +#define NBIO_PCIE_SERVICES_PROTOCOL_H_ + +// Current PROTOCOL revision +#define AMD_NBIO_PCIE_SERVICES_REVISION 0x00 + +/// +/// Forward declaration for the NBIO_PCIE_SERVICES_PROTOCOL +/// +typedef struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL; + +// +// Protocol Definitions +// + +/** + Returns the NBIO debug options configuration structure + This + A pointer to the DXE_AMD_NBIO_SMU_SERVICES_PROTOCOL instance. + DebugOptions + A pointer to a pointer to store the address of the PCIe topology structure +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT)( + IN DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL *This, + OUT UINT32 **DebugOptions + ); + +/// +/// The Dxe of PCIE Services +/// +struct _DXE_AMD_NBIO_PCIE_SERVICES_PROTOCOL { + AMD_NBIO_PCIE_GET_TOPOLOGY_STRUCT PcieGetTopology; ///< +}; + +extern EFI_GUID gAmdNbioPcieServicesProtocolGuid; + +#endif /* NBIO_PCIE_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h new file mode 100644 index 0000000000..10d3b730a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/AmdOemOobPprProtocol.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_OEM_OOB_PPR_PROTOCOL_H_ +#define _AMD_OEM_OOB_PPR_PROTOCOL_H_ + +extern EFI_GUID gAmdOemOobPprDxeProtocolGuid; + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h new file mode 100644 index 0000000000..a15995188b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricNumaServices2.h @@ -0,0 +1,155 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_NUMA_SERVICES2_H_ +#define FABRIC_NUMA_SERVICES2_H_ +#include "AMD.h" + +#pragma pack (push, 1) + +#define MAX_PXM_VALUES_PER_QUADRANT 16 + +/// Domain type +typedef enum { + NumaDram, + NumaSLink, + NumaCxl, + MaxNumaDomainType2 +} DOMAIN_TYPE2; + +/// Reported Domain Info +typedef struct { + DOMAIN_TYPE2 Type; ///< Type + UINT32 SocketMap; ///< Bitmap indicating physical socket location + UINT32 PhysicalDomain; ///< Physical domain number +} DOMAIN_INFO2; + +/// Physical Dram Info +typedef struct { + UINT32 NormalizedCsMap; ///< Bitmap of CSs comprising this physical domain + UINT32 SharingEntityCount; ///< Number of virtual domains sharing this physical domain + UINT32 SharingEntityMap; ///< Bitmap of reported domains that share this physical domain + UINT32 Reserved; ///< Reserved +} PHYS_DOMAIN_INFO; + +/// Proximity Domain Info +typedef struct { + UINTN Count; ///< Entries in Domain array + UINTN Domain[MAX_PXM_VALUES_PER_QUADRANT]; ///< Domains in Quadrant +} PXM_DOMAIN_INFO; + +/// +/// Forward declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL +/// +typedef struct _FABRIC_NUMA_SERVICES2_PROTOCOL FABRIC_NUMA_SERVICES2_PROTOCOL; + +/** + * @brief Get the numa domain information. + * + * @details Get the numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfDomainsInSystem Number of unique NUMA domains + * @param[out] DomainInfo An array with information about each domain + * @param[out] CcxAsNumaDomain TRUE: each core complex is its own domain + * FALSE: physical mapping is employed + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfDomainsInSystem, + OUT DOMAIN_INFO2 **DomainInfo, + OUT BOOLEAN *CcxAsNumaDomain + ); + +/** + * @brief Translates a core's physical location to the appropriate NUMA domain. + * + * @details Translates a core's physical location to the appropriate NUMA domain. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] Socket Zero based socket that the core is attached to + * @param[in] Die DF die on socket that the core is attached to + * @param[in] Ccd Logical CCD the core is on + * @param[in] Ccx Logical core complex + * @param[out] Domain Domain the core belongs to + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_DOMAIN_XLAT)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN UINTN Socket, + IN UINTN Die, + IN UINTN Ccd, + IN UINTN Ccx, + OUT UINT32 *Domain + ); + +/** + * @brief Get physical numa domain information. + * + * @details Get physical numa domain information. + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[out] NumberOfPhysDomainsInSystem Number of valid domains in the system + * @param[out] PhysDomainInfo An array with information about each physical domain + * @param[out] PhysNodesPerSocket Actual NPS as determined by ABL (not including SLink) + * @param[out] NumberOfSystemSLinkDomains Number of domains describing SLink connected memory + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + OUT UINT32 *NumberOfPhysDomainsInSystem, + OUT PHYS_DOMAIN_INFO **PhysDomainInfo, + OUT UINT32 *PhysNodesPerSocket, + OUT UINT32 *NumberOfSystemSLinkDomains + ); + +/** + * @brief Get the proximity domain information about a PCIe root-port bridge + * + * @details Get the proximity domain information about a PCIe root-port bridge + * + * @param[in] This A pointer to the FABRIC_NUMA_SERVICES2_PROTOCOL instance. + * @param[in] RootPortBDF BDF for root-port bridge in PCI_ADDR format. + * @param[out] PxmDomainInfo Pointer to a structure returning associated NUMA node(s). + * @retval EFI_STATUS 0: Success, NonZero: Standard EFI Error. + */ +typedef +EFI_STATUS +(EFIAPI *FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO)( + IN FABRIC_NUMA_SERVICES2_PROTOCOL *This, + IN PCI_ADDR RootPortBDF, + OUT PXM_DOMAIN_INFO *PxmDomainInfo + ); + +/// +/// When installed, the Fabric NUMA Services 2 Protocol produces a collection of +/// services that return various information associated with non-uniform memory +/// architecture. +/// +struct _FABRIC_NUMA_SERVICES2_PROTOCOL { + UINTN Revision; ///< Revision Number + FABRIC_NUMA_SERVICES2_GET_DOMAIN_INFO GetDomainInfo; ///< Get Domain Info + FABRIC_NUMA_SERVICES2_DOMAIN_XLAT DomainXlat; ///< Domain Translation + FABRIC_NUMA_SERVICES2_GET_PHYSICAL_DOMAIN_INFO GetPhysDomainInfo; ///< Get Physical Domain Info + FABRIC_NUMA_SERVICES2_GET_PROXIMITY_DOMAIN_INFO GetPxmDomainInfo; ///< Get Proximity Domain Info +}; + +/// +/// Guid declaration for the FABRIC_NUMA_SERVICES2_PROTOCOL. +/// +extern EFI_GUID gAmdFabricNumaServices2ProtocolGuid; + +#pragma pack (pop) +#endif // _FABRIC_NUMA_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h new file mode 100644 index 0000000000..485240c0fb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/Protocol/FabricTopologyServices2.h @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_TOPOLOGY_SERVICES2_H_ +#define FABRIC_TOPOLOGY_SERVICES2_H_ + +#include <Library/BaseFabricTopologyLib.h> + +#endif // FABRIC_TOPOLOGY_SERVICES2_H_ diff --git a/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h new file mode 100755 index 0000000000..44093e4097 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Include/SocLogicalId.h @@ -0,0 +1,23 @@ +/** @file + SoC Logical ID Definitions. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SOC_LOGICAL_ID_H_ +#define SOC_LOGICAL_ID_H_ +#pragma pack (push, 1) + +/// +/// SOC logical ID structure +/// +typedef struct _SOC_LOGICAL_ID { + IN OUT UINT32 Family; ///< Indicates logical ID Family + IN OUT UINT16 Revision; ///< Indicates logical ID Revision +} SOC_LOGICAL_ID; + +#pragma pack (pop) +#endif // SOC_LOGICAL_ID_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h new file mode 100644 index 0000000000..a60ae20d33 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlLib.h @@ -0,0 +1,100 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_LIB_H_ +#define _INTERNAL_AML_LIB_H_ + +#include <Uefi.h> +#include <Library/AmlGenerationLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <IndustryStandard/Acpi.h> + +#include "LocalAmlObjects.h" + +// EDK2 open source MdePkg/Include/IndustryStandard/AcpiAml.h does not have +// these and should. +#define AML_DIGIT_CHAR_0 0x30 +#define AML_DIGIT_CHAR_9 0x39 + +// The max string size for a QWord is 8 bytes = 16 characters plus NULL Terminator +#define MAX_AML_DATA_INTEGER_SIZE 17 + +// Defines similar to ctype.h functions isalpha() and isdigit() +#define IS_ASCII_UPPER_ALPHA(c) ( ((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_Z) ) +#define IS_ASCII_HEX_DIGIT(c) ( (((c) >= AML_DIGIT_CHAR_0) && ((c) <= AML_DIGIT_CHAR_9)) ||\ + (((c) >= AML_NAME_CHAR_A) && ((c) <= AML_NAME_CHAR_F)) ) + +// Swap bytes of upper and lower WORDs within a DWORD +#define Swap4Bytes(val) \ + ( (((val) >> 8) & 0x000000FF) | (((val) << 8) & 0x0000FF00) | \ + (((val) >> 8) & 0x00FF0000) | (((val) << 8) & 0xFF000000) ) + +/* + Calculates the optimized integer value used by AmlDataInteger and others + + Not a public function so no doxygen comment identifiers. + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ); + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ); + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - Field NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ); + +#endif diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h new file mode 100644 index 0000000000..b19b6fe867 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.h @@ -0,0 +1,150 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _INTERNAL_AML_OBJECTS_H_ +#define _INTERNAL_AML_OBJECTS_H_ + +// #include "LocalAmlLib.h" + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **Object, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ); + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ); + +#endif // _INTERNAL_AML_OBJECTS_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h new file mode 100755 index 0000000000..3a628ed0b2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdPcieComplex.h @@ -0,0 +1,432 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCIE_COMPLEX_H_ +#define AMD_PCIE_COMPLEX_H_ + +// +// GNB PCIe configuration info +// +#define DESCRIPTOR_TERMINATE_LIST 0x80000000ull +#define DESCRIPTOR_IGNORE 0x40000000ull + +// +// Port parameter count +// +#define PCIE_PORT_PARAMETER_COUNT 64 + +/// +/// PCIe link initialization +/// DXIO endpoint status +/// +typedef enum { + DxioEndpointDetect = 0, ///< Detect endpoint presence + DxioEndpointNotPresent ///< Endpoint not present (or connected). Used in case there is alternative way to determine + ///< if device present on board or in slot. For example GPIO can be used to determine device presence. +} DXIO_ENDPOINT_STATUS; + +#pragma pack(push,1) +typedef struct { + UINT16 ParamType; ///< This identifies a specific port parameter to set. + UINT16 ParamValue; ///< Specifies the value to be assigned to port parameter. +} PORT_PARAM; + +typedef struct { + PORT_PARAM PhyParam[PCIE_PORT_PARAMETER_COUNT]; ///< PHY port parameter +} PORT_PARAMS; + +/// +/// Ancillary data struct with table size and address +/// +typedef struct { + IN UINT32 Count; ///< Total count in this Ancillary data table + IN UINT32 Ovrd; ///< Ancillary data table address point to ANC_DATA_PARAM[] +} ANC_DATA; + +typedef struct { + UINT16 ParamType; ///< This identifies a specific PHY parameter + UINT16 ParamValue; ///< This specifies the value to be assigned to indicated PHY parameter +} DXIO_PHY_PARAM; + +typedef struct { + DXIO_PHY_PARAM PhyParam[44]; ///< physical parameter +} PHY_DATA; + +/// +/// PCIe specific data structures +/// PCIe port misc extended controls +/// +typedef struct { + UINT8 LinkComplianceMode : 1; ///< Force port into compliance mode (device will not be trained, port output compliance pattern) + UINT8 LinkSafeMode : 1; ///< Safe mode PCIe capability. (Parameter may limit PCIe speed requested through DXIO_PORT_DATA::LinkSpeedCapability) + ///< 0 - port can advertize muximum supported capability + ///< 1 - port limit advertized capability and speed to PCIe Gen1 + UINT8 SbLink : 1; ///< PCIe link type + ///< 0 - General purpose port + ///< 1 - Port connected to SB + UINT8 ClkPmSupport : 1; ///< Clock Power Management Support + ///< 0 - Clock Power Management not configured + ///< 1 - Clock Power Management configured according to PCIe device capability + UINT8 ChannelType : 3; ///< Channel Type + ///< 0 - Channel Type Not Specified + ///< - Channel Type Short Trace + ///< 2 - Channel Type Long Trace + UINT8 TurnOffUnusedLanes : 1; ///< Turn Off Unused Lanes + ///< 0 - Turn on + ///< 1 - Turn off +} DXIO_PORT_MISC_CONTROL; + +/// +/// The IO APIC Interrupt Mapping Info +/// +typedef struct { + UINT8 GroupMap; ///< Group mapping for slot or endpoint device (connected to PCIE port) interrupts . + ///< 0 - IGNORE THIS STRUCTURE AND USE RECOMMENDED SETTINGS + ///< 1 - mapped to Grp 0 (Interrupts 0..3 of IO APIC redirection table) + ///< 2 - mapped to Grp 1 (Interrupts 4..7 of IO APIC redirection table) + ///< ... + ///< 8 - mapped to Grp 7 (Interrupts 28..31 of IO APIC redirection table) + UINT8 Swizzle; ///< Swizzle interrupt in the Group. + ///< 0 - ABCD + ///< 1 - BCDA + ///< 2 - CDAB + ///< 3 - DABC + UINT8 BridgeInt; ///< IOAPIC redirection table entry for PCIE bridge interrupt + ///< 0 - Entry 0 of IO APIC redirection table + ///< 1 - Entry 1 of IO APIC redirection table + ///< ... + ///< 31 - Entry 31 of IO APIC redirection table +} DXIO_APIC_DEVICE_INFO; +/// +/// PCIe port configuration data +/// +typedef struct { + UINT8 PortPresent : 1; ///< Enable PCIe port for initialization. + UINT8 Reserved1 : 2; ///< Reserved + UINT8 DeviceNumber : 5; ///< PCI Device number for port. + ///< 0 - Native port device number + ///< N - Port device number (See available configurations in BKDG + UINT8 FunctionNumber : 3; ///< Reserved for future use + UINT8 LinkSpeedCapability : 3; ///< PCIe link speed/ + ///< 0 - Maximum supported by silicon + ///< 1 - Gen1 + ///< 2 - Gen2 + ///< 3 - Gen3 + ///< 4 - Gen4 + ///< 5 - Gen5 + UINT8 AutoSpdChng : 2; ///< Upstread Auto Speed Change Allowed/ + ///< 0 - Use default implementation (Disabled for Gen1, Enabled for Gen2/3) + ///< 1 - Always Disabled + ///< 2 - Always Enabled + ///< 3 - Reserved + UINT8 EqPreset : 4; ///< Gen3 Equalization Preset */ + UINT8 LinkAspm : 2; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - L0s only + ///< 2 - L1 only + ///< 3 - L0s and L1 + UINT8 LinkAspmL1_1 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 LinkAspmL1_2 : 1; ///< ASPM control. (see AgesaPcieLinkAspm for additional option to control ASPM) + ///< 0 - Disabled + ///< 1 - Enabled + UINT8 ClkReq : 4; ///< ASPM Reserved Field + ///< 0 - NONE + ///< 1 - CLKREQ0 signal + ///< 2 - CLKREQ1 signal + ///< 3 - CLKREQ2 signal + ///< 4 - CLKREQ3 signal + ///< 5 - CLKREQG signal + UINT8 LinkHotplug : 4; ///< Hotplug control. + ///< 0 - Disabled + ///< 1 - Basic + ///< 2 - Server + ///< 3 - Enhanced + UINT8 SlotPowerLimit; ///< PCIe slot power limit. + UINT8 SlotPowerLimitScale : 2; ///< PCIe slot power limit Scale. + ///< 00b = 1.0x + ///< 01b = 0.1x + ///< 10b = 0.01x + ///< 11b = 0.001x + UINT8 IsMasterPLL : 1; ///< IsMasterPLL + UINT8 Gen4Features : 5; ///< Unused bits + ///< BIT0(DLF_Exchange) 1 - Disable, 0 - Enable + ///< IT1(DLF_Capability) 1 - Disable, 0 - Enable + UINT16 SlotNum : 13; ///< PHYSICAL_SLOT_NUM + UINT16 CsLink : 3; ///< Reserved + DXIO_PORT_MISC_CONTROL MiscControls; ///< Misc extended controls + DXIO_APIC_DEVICE_INFO ApicDeviceInfo; ///< IOAPIC device programming info + DXIO_ENDPOINT_STATUS EndpointStatus; ///< PCIe endpoint (device connected to PCIe port) status + UINT8 EsmSpeedBump; ///< Speed bump for ESM + UINT8 EsmControl : 1; ///< Enhanced speed mode control + UINT8 CcixControl : 1; ///< Ccix/Cxl control + UINT8 TxVetting : 1; ///< Tx Vetting + UINT8 RxVetting : 1; ///< Rx Vetting + UINT8 InvertPolarity : 1; ///< Invert RX Polarity + UINT8 InvertPolarity2 : 1; ///< Invert TX Polarity + UINT8 NtbHotplug : 1; ///< NTB Hotplug flag + ///< 0b = Disabled + ///< 1b = Enabled + UINT8 Reserved2 : 1; ///< Reserved + UINT8 SetGen3FixedPreset : 1; ///< Gen3 Fixed Preset Set + UINT8 SetGen4FixedPreset : 1; ///< Gen4 Fixed Preset Set + UINT8 SetGen5FixedPreset : 1; ///< Gen5 Fixed Preset Set + UINT8 Reserved3 : 5; ///< Reserved + UINT8 Gen3FixedPreset : 4; ///< Gen3 Fixed Preset + UINT8 Gen4FixedPreset : 4; ///< Gen4 Fixed Preset + UINT8 Gen5FixedPreset : 4; ///< Gen5 Fixed Preset + UINT8 Reserved4 : 4; ///< Reserved + UINT16 PsppPolicyDC; ///< Pspp DC control + UINT16 PsppPolicyAC; ///< PSPP AC control + UINT8 PsppDeviceType; ///< Pspp Device Type + UINT8 DisGen3EQPhase : 1; ///< Gen3 Bypass phase2/3 EQ + UINT8 DisGen4EQPhase : 1; ///< Gen4 Bypass phase2/3 EQ + UINT8 TXDeEmphasisOride : 1; ///< Override Gen2 DXIO deemphasis default + UINT8 TXDeEmphasis : 2; ///< Gen2 DXIO deemphasis setting + UINT8 Reserved5 : 3; ///< Reserved + struct { + UINT16 DsTxPreset : 4; ///< Gen3 Downstream Tx Preset + UINT16 DsRxPresetHint : 3; ///< Gen3 Downstream Rx Preset Hint + UINT16 UsTxPreset : 4; ///< Gen3 Upstream Tx Preset + UINT16 UsRxPresetHint : 3; ///< Gen3 Upstream Rx Preset Hint + UINT16 Reserved1 : 2; ///< Unused bits + UINT8 SetDsTxPreset : 1; ///< Gen3 Set Downstream Tx Preset + UINT8 SetDsRxPresetHint : 1; ///< Gen3 Set Downstream Rx Preset Hint + UINT8 SetUsTxPreset : 1; ///< Gen3 Set Upstream Tx Preset + UINT8 SetUsRxPresetHint : 1; ///< Gen3 Set Upstream Rx Preset Hint + UINT8 Reserved2 : 4; ///< Unused bits + } LaneEqualizationCntl; ///< Lane equalization control structure used for Gen3 values + struct { + UINT8 DsTxPreset : 4; ///< Gen4 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen4 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen4 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen4 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen4LaneEqualizationCntl; ///< Lane equalization control structure used for Gen4 values + struct { + UINT8 DsTxPreset : 4; ///< Gen5 Downstream Tx Preset + UINT8 UsTxPreset : 4; ///< Gen5 Upstream Tx Preset + UINT8 SetDsTxPreset : 1; ///< Gen5 Set Downstream Tx Preset + UINT8 SetUsTxPreset : 1; ///< Gen5 Set Upstream Tx Preset + UINT8 Reserved1 : 6; ///< Unused bits + } Gen5LaneEqualizationCntl; ///< Lane equalization control structure used for Gen5 values + struct { + UINT32 PresetMask8Gt : 10; ///< Preset Mask 8GT. + UINT32 PresetMask16Gt : 10; ///< Preset Mask 16GT. + UINT32 PresetMask32Gt : 10; ///< Preset Mask 32GT. + UINT32 Reserved1 : 2; ///< Unused bits + UINT8 SetPresetMask8Gt : 1; ///< Preset Mask 8GT Set + UINT8 SetPresetMask16Gt : 1; ///< Preset Mask 16GT Set + UINT8 SetPresetMask32Gt : 1; ///< Preset Mask 32GT Set + UINT8 Reserved2 : 5; ///< Unused bits + } PresetMaskCntl; ///< Preset Mask control structure used for Gen3/Gen4/Gen5 values + UINT8 TargetLinkSpeed : 3; ///< Target Link Speed + UINT8 BypassGen3EQ : 1; ///< Bypass Gen3 equalization + UINT8 BypassGen4EQ : 1; ///< Bypass Gen4 equalization + UINT8 SrisSkipInterval : 3; ///< Controls SRIS SKP generation interval + UINT8 SrisEnableMode : 4; ///< 0:Disable 1:Enable 0xF:Auto + UINT8 SrisAutoDetectMode : 4; ///< Controls SRIS Autodetect mode 0:Disable 1:Enable 0xF:Auto + UINT8 LowerSkpOsGenSup; ///< Controls LOWER_SKP_OS_GEN_SUPPORT + UINT8 LowerSkpOsRcvSup; ///< Controls LOWER_SKP_OS_RCV_SUPPORT + UINT8 SrisSkpIntervalSel : 2; ///< Controls SRIS SKIP Interval Selection Mode + UINT8 SrisAutodetectFactor : 2; ///< Controls the multiplier for SKP ordered set interval when generated based on elasticity buffer pointer slip feedback from PCS + UINT8 IsBmcLocation : 1; ///< IsBmcLocation + UINT8 SetEsmControl : 1; ///< Set ESM Control + UINT8 SetEsmSpeedBump : 1; ///< Set Speed bump for ESM + UINT8 Reserved6 : 1; ///< Unused bits + UINT8 I2CMuxInfo : 6; ///< Legacy I2c switch + UINT8 AlwaysExpose : 1; ///< Always expose unused PCIE port + UINT8 Reserved7 : 1; ///< Unused bits + UINT16 NpemEnable : 12; ///< Controls NPEM Enable + UINT16 Reserved8 : 4; ///< Unused bits + UINT16 NpemCapability : 12; ///< Controls NPEM Capability + UINT8 SwingMode : 3; ///< PCIe Swing Mode + UINT16 Reserved9 : 1; ///< Unused bits + UINT16 MpioAncDataIdx; ///< Reserved for internal use only + UINT8 Reserved10; ///< Reserved bits +} DXIO_PORT_DATA; + +/// +/// EtherNet specific data structures +/// +typedef struct { + UINT32 PortNum : 8; ///< Port Number + UINT32 PlatConf : 4; ///< Platform Config + ///< 0 = Reserved + ///< 1 = 10G/1G BackPlane + ///< 2 = 2.5G BackPlane + ///< 3= Soldered down 1000Base-T + ///< 4 = Soldered down 1000Base-X + ///< 5 = Soldered down NBase-T + ///< 6 = Soldered down 10GBase-T + ///< 7 = Soldered down 10GBase-r + ///< 8 = SFP+ Connector + UINT32 Reserved1 : 4; ///< Unused 12-15 + UINT32 MdioId : 5; ///< MDIO ID when MDIO Side band is used + UINT32 Reserved2 : 2; ///< Unused 21-22 + UINT32 SuppSpeed : 4; ///< Supported Speeds by Platform + ///< 1 = 100M Supported + ///< 2 = 1G Supported + ///< 4 = 2.5G Supported + ///< 8 = 10G Supported + UINT32 Reserved3 : 1; ///< Unused 27 + UINT32 ConnType : 3; ///< Supported Speeds by Platform + ///< 0 = Port not Used + ///< 1 = SFP+ Connection I2C interface + ///< 2 = MDIO PHY + ///< 4 = Backplane Connection + UINT32 Reserved4 : 1; ///< Unused 31 +} ETH_PORT_PROPERTY0; + +typedef struct { + UINT32 MdioReset : 2; ///< MDIO Reset Type + ///< 0 = None + ///< 1 = I2C GPIO + ///< 2 = Integrated GPIO + ///< 3 = Reserved + UINT32 Reserved1 : 2; ///< Unused 2-3 + UINT32 MdioGpioResetNum : 2; ///< Integrated GPIO number for reset + UINT32 Reserved2 : 2; ///< Unused 6-7 + UINT32 SfpGpioAdd : 3; ///< Lower I2C address of GPIO Expander PCA9535 + UINT32 Reserved3 : 1; ///< Unused 11 + UINT32 TxFault : 4; ///< TX FAULT + UINT32 Rs : 4; ///< RS Signal + UINT32 ModAbs : 4; ///< MOD_ABS signal + UINT32 RxLoss : 4; ///< Rx_LOS signal + UINT32 SfpGpioMask : 4; ///< SFP+ sideband signals that are not supported by platform +} ETH_PORT_PROPERTY3; + +typedef struct { + UINT32 SfpMux : 3; ///< Lower address of Mux PCA 9545 + UINT32 Reserved1 : 1; ///< Unused 3 + UINT32 SfpBusSeg : 3; ///< SFP BUS Segment. Downstream channels of PCA9545 + UINT32 Reserved2 : 1; ///< Unused 7 + UINT32 SfpMuxUpAdd : 5; ///< Upper address of Mux PCA 9545 + UINT32 Reserved3 : 3; ///< Unused 13-15 + UINT32 RedriverAddress : 7; ///< Address of ReDriver + UINT32 RedriverInterface : 1; ///< ReDriver Interface Descriptor + UINT32 RedriverLane : 3; ///< ReDriver Lane number + UINT32 Reserved4 : 1; ///< Unused 27 + UINT32 RedriverModel : 3; ///< ReDriver Model + UINT32 RedriverPresent : 1; ///< Redriver Present +} ETH_PORT_PROPERTY4; + +typedef struct { + UINT32 TxEqPre : 6; ///< TX EQ PRE + UINT32 Reserved1 : 2; ///< Unused 7-6 + UINT32 TxEqMain : 6; ///< TX EQ MAIN + UINT32 Reserved2 : 2; ///< Unused 15-14 + UINT32 TxEqPost : 6; ///< TX EQ POST + UINT32 Reserved3 : 10; ///< Unused 31-23 +} ETH_PORT_TXEQ; +/// Ethernet PCIe port configuration data +/// +typedef struct { + ETH_PORT_PROPERTY0 EthPortProp0; ///< XGBE_PORT_PROPERTY_0 + ETH_PORT_PROPERTY3 EthPortProp3; ///< XGBE_PORT_PROPERTY_3 + ETH_PORT_PROPERTY4 EthPortProp4; ///< XGBE_PORT_PROPERTY_4 + UINT32 PadMux0; ///< PadMux0 Setting (8 bits) + UINT32 PadMux1; ///< PadMux1 Setting (8 bits) + UINT32 MacAddressLo; ///< Lower 32 bits of MAC Address + UINT32 MacAddressHi; ///< Upper 32 bits of MAC Address + ETH_PORT_TXEQ EthPortTxEq; ///< TX EQ Settings +} ETHERNET_PORT_DATA; + +/// +/// High level data structures for passing topology from platform to AGESA +/// +typedef struct { + UINT8 EngineType; ///< Engine type + ///< 0 - Ignore engine configuration + ///< 1 - PCIe port + UINT8 HotPluggable : 1; ///< HotPluggable + ///< 0 - Link is NOT Hot-Switchable + ///< 1 - Link IS Hot-Switchable + UINT8 Reserved1 : 7; ///< Unused field, leave as 0 + UINT8 StartLane; ///< Start Lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 EndLane; ///< End lane ID (in reversed configuration StartLane > EndLane) + ///< Refer to lane descriptions and supported configurations in BKDG + UINT8 GpioGroupId; ///< Unique identifier for the GPIO or GPIO group associated with + ///< this engine. GPIOs are used for hotplug notification and link + ///< type (e.g SATA Express or PCIe) + UINT8 DxioStartLane; ///< Internal coding of start lane + UINT8 DxioEndLane; ///< Internal coding of end lane + UINT8 SearchDepth; ///< SearchDepth only uses 1 bit - always initialize to 0 will be updated dynamically +} DXIO_ENGINE_DATA; + +/// +/// PCIe port descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in complex + DXIO_ENGINE_DATA EngineData; ///< Engine data + DXIO_PORT_DATA Port; ///< PCIe port specific configuration info + ETHERNET_PORT_DATA EtherNet; ///< Ancillary data for EtherNet + PHY_DATA Phy; ///< Ancillary data for PHY programming customization + PORT_PARAMS PortParams; ///< Extensible port parameter list for simplified topology structure + ANC_DATA AncData; ///< Ancillary data override +} DXIO_PORT_DESCRIPTOR; + +#pragma pack(pop) + +/// +/// +/// PCIe Complex descriptor +/// +typedef struct { + UINT32 Flags; ///< Descriptor flags + ///< Bit31 - last descriptor in topology + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR *PciePortList; ///< Pointer to array of PCIe port descriptors or NULL (Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST). + VOID *Reserved2; ///< Reserved for future use + UINT8 BmcLinkLocation; ///< Identifies the socket/die location of a BMC link (Used by AGESA, input not required) + UINT8 BmcLinkLaneNum; ///< Identifies the socket/die location of a BMC Lane number + UINT8 Reserved3[2]; ///< Reserved for future +} DXIO_COMPLEX_DESCRIPTOR; + +/// +/// Engine descriptor type +/// +typedef enum { + DxioUnusedEngine = 0, ///< Unused descriptor Excluded from configuration + DxioPcieEngine = 1, ///< PCIe port + DxioUSBEngine = 2, ///< USB port + ///< __Deprecated__ + DxioSATAEngine = 3, ///< SATA + DxioUSB_OVER_PCIE = 4, ///< USB4 PCIe (internal use only) + DxioUBMHFCEngine = 5, ///< New for Genoa UBM HFC Connector for auto-discovery + DxioOCP3Engine = 6, ///< New for Genoa OCP3 Bifurcatable Connector + DxioUdot3Engine = 7, ///< New for Genoa U.3 Multiprotocol Connector + DxioDPEngine = 8, ///< Digital Display __For APU display connector list__ + DxioEthernetEngine = 0x10, ///< Ethernet (GBe, XGBe) + ///< __Deprecated__ + DxioGOPEngine = 0x20, ///< GOP + ///< __Deprecated__ + DxioNTBDevice = 0x60, ///< For NBIF NTB Enable (internal use only) + DxioHDaudioEngine, ///< For NBIF HDaudtio Enable (internal use only) + DxioACPEngine, ///< For NBIF ACP Enable (internal use only) + DxioMP2Engine, ///< For NBIF MP2 Enable (internal use only) + DxioMaxPcieEngine ///< Max engine type for boundary check. +} DXIO_ENGINE_TYPE; + +/// +/// PCIe link speeds +/// +typedef enum { + DxioGenMaxSupported, ///< Maximum supported + DxioGen1 = 1, ///< Gen1 + DxioGen2, ///< Gen2 + DxioGen3, ///< Gen3 + DxioGen4, ///< Gen4 + DxioGen5, ///< Gen5 + MaxDxioGen ///< Max Gen for boundary check +} DXIO_LINK_SPEEDS; +#endif // AMD_PCIE_COMPLEX_H_ diff --git a/Platform/AMD/AgesaPkg/Include/AmdSoc.h b/Platform/AMD/AgesaPkg/Include/AmdSoc.h new file mode 100644 index 0000000000..d62f260235 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdSoc.h @@ -0,0 +1,17 @@ +/** @file + + Copyright (C) 2015-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _AMD_SOC_H_ +#define _AMD_SOC_H_ + +#define F1A_BRH_A0_RAW_ID 0x00B00F00ul +#define F1A_BRH_B0_RAW_ID 0x00B00F10ul +#define F1A_BRH_B1_RAW_ID 0x00B00F11ul +#define F1A_BRHD_A0_RAW_ID 0x00B10F00ul +#define F1A_BRHD_B0_RAW_ID 0x00B10F10ul +#endif // _AMD_SOC_H_ diff --git a/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h new file mode 100644 index 0000000000..2291f7dc83 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/FabricResourceManagerCmn.h @@ -0,0 +1,42 @@ +/** @file + Fabric resource manager common definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_CMN_H_ +#define FABRIC_RESOURCE_MANAGER_CMN_H_ +#pragma pack (push, 1) + +#define MAX_SOCKETS_SUPPORTED 2 ///< Max number of sockets in system. +#define MAX_RBS_PER_SOCKET 20 ///< Max number of root bridges per socket. + +/** + * @brief DF address aperture structure. + * @details This contains information used to define an MMIO region. + */ +typedef struct _FABRIC_ADDR_APERTURE { + UINT64 Base; ///< Aperture base Address. + UINT64 Size; ///< Aperture size. + UINT64 Alignment; ///< Alignment bit map. 0xFFFFF means 1MB align. +} FABRIC_ADDR_APERTURE; + +/** + * @brief DF Resource for each RootBridge structure. + * @details This contains information used to define the MMIO region for each RootBridge. + */ +typedef struct _FABRIC_RESOURCE_FOR_EACH_RB { + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeAbove4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) above 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE NonPrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Nonprefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrefetchableMmioSizeBelow4G[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< Prefetchable MMIO resource(s) below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondNonPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second nonprefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE PrimaryRbSecondPrefetchableMmioSizeBelow4G; ///< Primary RootBridge's second prefetchable MMIO size below 4G. @see FABRIC_ADDR_APERTURE + FABRIC_ADDR_APERTURE IO[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< IO resource(s) @see FABRIC_ADDR_APERTURE + UINT16 PciBusNumber[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; ///< PCI bus number(s). +} FABRIC_RESOURCE_FOR_EACH_RB; +#pragma pack (pop) +#endif // FABRIC_RESOURCE_MANAGER_CMN_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h new file mode 100644 index 0000000000..9e58f299b4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Guid/AmdMemoryInfoHob.h @@ -0,0 +1,96 @@ +/** @file + AMD Memory Info Hob Definition + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_MEMORY_INFO_HOB_H_ +#define AMD_MEMORY_INFO_HOB_H_ + +/** + * @brief 128 bit Buffer containing UID Unique Identifier value for Memory Info HOB. + * EFI_GUID defined in UefiBaseType.h + */ +extern EFI_GUID gAmdMemoryInfoHobGuid; + +#pragma pack (push, 1) + +/** + * @brief Memory descriptor structure for each memory range + */ +typedef struct { + UINT64 Base; ///< Base address of memory rang + UINT64 Size; ///< Size of memory rang + UINT32 Attribute; ///< Attribute of memory rang + UINT32 Reserved; ///< For alignment purpose +} AMD_MEMORY_RANGE_DESCRIPTOR; + +/** + * @brief Memory attribute in the memory range descriptor = AVAILABLE + */ +#define AMD_MEMORY_ATTRIBUTE_AVAILABLE 0x1 + +/** + * @brief Memory attribute in the memory range descriptor = UMA + */ +#define AMD_MEMORY_ATTRIBUTE_UMA 0x2 + +/** + * @brief Memory attribute in the memory range descriptor = MMIO + */ +#define AMD_MEMORY_ATTRIBUTE_MMIO 0x3 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_RESERVED 0x4 + +/** + * @brief Memory attribute in the memory range descriptor = GPUMEM + */ +#define AMD_MEMORY_ATTRIBUTE_GPUMEM 0x5 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_SP + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_SP 0x6 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED 0x7 + +/** + * @brief Memory attribute in the memory range descriptor = GPU_RESERVED_TMR + */ +#define AMD_MEMORY_ATTRIBUTE_GPU_RESERVED_TMR 0x8 + +/** + * @brief Memory attribute in the memory range descriptor = RESERVED_SMUFEATURES + */ +#define AMD_MEMORY_ATTRIBUTE_Reserved_SmuFeatures 0x9 + +/// Memory info HOB structure +typedef struct { + UINT32 Version; ///< Version of HOB structure + BOOLEAN AmdMemoryVddioValid; ///< This field determines if Vddio is valid + UINT16 AmdMemoryVddio; ///< Vddio Voltage + BOOLEAN AmdMemoryVddpVddrValid; ///< This field determines if VddpVddr is valid + UINT8 AmdMemoryVddpVddr; ///< VddpVddr voltage + BOOLEAN AmdMemoryFrequencyValid; ///< Memory Frequency Valid + UINT32 AmdMemoryFrequency; ///< Memory Frquency + UINT32 AmdMemoryDdrMaxRate; ///< Memory DdrMaxRate + UINT32 NumberOfDescriptor; ///< Number of memory range descriptor + AMD_MEMORY_RANGE_DESCRIPTOR Ranges[1]; ///< Memory ranges array +} AMD_MEMORY_INFO_HOB; + +#pragma pack (pop) + +/** + * @brief Macro that defines the Memory Info HOB version + */ +#define AMD_MEMORY_INFO_HOB_VERISION 0x00000110ul // Ver: 00.00.01.10 + +#endif // AMD_MEMORY_INFO_HOB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h new file mode 100644 index 0000000000..d144a4ad20 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspBaseLibV2.h @@ -0,0 +1,51 @@ +/** @file + AMD Psp Base Lib + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PSP_BASELIB_V2_H_ +#define AMD_PSP_BASELIB_V2_H_ + +#include <AmdPspDirectory.h> + +#define MAX_IMAGE_SLOT_COUNT 32 + +#define ALIGNMENT_4K BASE_4KB +#define ALIGN_CHECK(addr, alignment) ((((UINTN)(addr)) & ((alignment) - 1)) == 0) +#define ALIGN_4K_CHECK(addr) ALIGN_CHECK((addr), ALIGNMENT_4K) + +#define IS_VALID_ADDR32(addr) (((UINT32)(addr) != 0) && (UINT32)(addr) != 0xFFFFFFFF) + +#pragma pack (push, 1) + +#define FIRMWARE_TABLE_SIGNATURE 0x55AA55AAul + +/// Define the structure OEM signature table +typedef struct _FIRMWARE_ENTRY_TABLEV2 { + UINT32 Signature; ///< 0x00 Signature should be 0x55AA55AAul + UINT32 ImcRomBase; ///< 0x04 Base Address for Imc Firmware + UINT32 GecRomBase; ///< 0x08 Base Address for Gmc Firmware + UINT32 XHCRomBase; ///< 0x0C Base Address for XHCI Firmware + UINT32 LegacyPspDirBase; ///< 0x10 Base Address of PSP directory + UINT32 PspDirBase; ///< 0x14 Base Address for PSP directory + UINT32 Reserved1; ///< 0x18 Base Address for Reserved BIOS directory + UINT32 Reserved2; ///< 0x1C Base Address for Reserved BIOS directory + UINT32 Reserved3; ///< 0x20 Base Address for Reserved BIOS directory + UINT32 Config; ///< 0x24 reserved for EFS Configuration + UINT32 NewBiosDirBase; ///< 0x28 Generic Base address for all program + UINT32 PspDirBackupBase; ///< 0x2C Backup PSP directory address for all programs +} FIRMWARE_ENTRY_TABLEV2; + +/// It also used as structure to store ISH generic information across programs +typedef struct { + UINT32 Priority; + UINT32 UpdateRetries; + UINT32 GlitchRetries; + UINT32 ImageSlotAddr; +} IMAGE_SLOT_HEADER; + +#pragma pack (pop) + +#endif // AMD_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h new file mode 100644 index 0000000000..23c90b65c2 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspFtpmLib.h @@ -0,0 +1,83 @@ +/** @file + AMD Psp Ftpm Library header file + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_LIB_H_ +#define PSP_FTPM_LIB_H_ +#include <IndustryStandard/Acpi30.h> + +/* SYSTEM_TPM_CONFIG_VAL + * Value range for APCB_TOKEN_UID_PSP_SYSTEM_TPM_CONFIG + */ +typedef enum { + SYSTEM_TPM_CONFIG_DTPM = 0x00, ///< dTPM + SYSTEM_TPM_CONFIG_PSP_FTPM = 0x01, ///< PSP FTPM + SYSTEM_TPM_CONFIG_HSP_FTPM = 0x02, ///< HSP FTPM + SYSTEM_TPM_CONFIG_NONE = 0xFF, ///< None of TPM +} SYSTEM_TPM_CONFIG_VAL; + +#pragma pack (push, 1) +/// Define TPM_2_CONTROL_AREA +typedef struct { + // Interface Identifier + volatile UINT64 InterfaceIdentifier; ///< Interface Identifier + // TPM2 Control Area Extension + volatile UINT32 Clear; ///< Clear + volatile UINT32 RemainingBytes; ///< RemainingBytes + volatile UINT32 StatusReserved; ///< StatusReserved + volatile UINT32 StatusError; ///< StatusError + volatile UINT32 StatusCancel; ///< StatusCancel + volatile UINT32 StatusStart; ///< StatusStart + UINT64 InterruptControl; ///< InterruptControl + UINT32 CommandSize; ///< CommandSize + EFI_PHYSICAL_ADDRESS CommandAddress; ///< CommandAddress + UINT32 ResponseSize; ///< ResponseSize + EFI_PHYSICAL_ADDRESS ResponseAddress; ///< ResponseAddress + // Memory Absent command/response buffer + volatile UINT32 CmdRespHWBuffer; ///< Cmd/Rsp HW Buffer +} TPM2_CONTROL_AREA; + +#pragma pack (pop) + +/** + GET TPM related Info + + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +EFI_STATUS +FtpmGetInfo ( + IN OUT UINTN *FtpmStatus + ); + +/** + Execute a TPM command + + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +EFI_STATUS +FtpmExecuteCommand ( + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +#endif //PSP_FTPM_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h new file mode 100644 index 0000000000..4ad4020f95 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmdPspRomArmorLib.h @@ -0,0 +1,231 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _PSP_ROM_ARMOR_LIB_H_ +#define _PSP_ROM_ARMOR_LIB_H_ + +#include "Uefi.h" + +#define PSP_MAX_SPI_CMD_SUPPORT (4) ///< Max number of SPI command support +#define PSP_MAX_SPI_DATA_BUFFER_SIZE (72) ///< Max SPI Command Data Buffer Size +#define PSP_MAX_WHITE_LIST_CMD_NUM (32) ///< Max White list allowed command array number support +#define PSP_MAX_WHITE_LIST_REGION_NUM (16) ///< Max White list allowed region array number support + +#define SPI_CHIP_SELECT_ALL (0) ///< Allowed on all chip selects +#define SPI_CHIP_SELECT_1 (1) ///< Chip Select 1 +#define SPI_CHIP_SELECT_2 (2) ///< Chip Select 2 + +#define SPI_COMMAND_FREQUENCY_66_66MHZ (0) ///< 0=66.66MHz +#define SPI_COMMAND_FREQUENCY_33_33MHZ (1) ///< 1=33.33MHz +#define SPI_COMMAND_FREQUENCY_22_22MHZ (2) ///< 2=22.22MHz +#define SPI_COMMAND_FREQUENCY_16_66MHZ (3) ///< 3=16.66MHz +#define SPI_COMMAND_FREQUENCY_100MHZ (4) ///< 4=100MHz +#define SPI_COMMAND_FREQUENCY_800KHZ (5) ///< 5=800KHz + +#define SPI_COMMAND_NOT_PROCEDDED (0) ///< 0 = Command not examined/processed +#define SPI_COMMAND_COMPLETED (1) ///< 1 = Command completed successfully +#define SPI_COMMAND_EXECUTION_ERROR (2) ///< 2 = Execution Error (i.e. timeout) +#define SPI_COMMAND_NOT_ALLOWED (3) ///< 3 = Command not allowed by Whitelist +#define SPI_COMMAND_MALFORMED (4) ///< 4 = Command malformed + +#pragma pack (push, 1) + +typedef struct { + UINT8 ChipSelect; ///< 1 = CS1, 2 = CS2, all other values illegal + + UINT8 Frequency; ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 BytesToTx; ///< Bytes to Transmit, valid range is 0-72. Does not include the + ///< SPI Opcode byte, but does include the address, dummy bytes, and + ///< data. + + UINT8 BytesToRx; ///< Bytes to Receive from device, BytesToTx + BytesToRx <= 72 + + UINT8 OpCode; ///< The SPI Command OpCode (the first byte sent by the SPI controller) + + UINT8 Reserved[3]; ///< Reserved for future expansion + + UINT8 Buffer[PSP_MAX_SPI_DATA_BUFFER_SIZE]; ///< The remaining 0-72 bytes sent/received by the SPI controller. + ///< + ///< The SPI Controller will + ///< 1. Assert the ChipSelect + ///< 2. Send the one byte OpCode + ///< 3. Send Buffer[0] to Buffer[BytesToTx-1] to the SPI device + ///< 4. Read BytesToRx bytes from the device into Buffer[BytesToTx] to + ///< Buffer[BytesToTx+BytesToRx-1] + ///< 5. Deassert the ChipSelect line + ///< + ///< SPI ROM Commands that include a target address send the address + ///< immediately after the OpCode (i.e. Buffer[0..2] or Buffer[0..3] + ///< depending if 24 or 32bit addresses are associated with the OpCode). + ///< See the SPI ROM Device's datasheet for full details on your + ///< devices commands and formats. +} SPI_COMMAND; ///< The struct of Spi Command + +typedef union { + struct { + ///< SPI_COMMUNICATION_RESULT + UINT16 Command0Result : 4; ///< Result[ 3: 0] The result of Command[0] + UINT16 Command1Result : 4; ///< Result[ 7: 4] The result of Command[1] + UINT16 Command2Result : 4; ///< Result[11: 8] The result of Command[2] + UINT16 Command3Result : 4; ///< Result[15:12] The result of Command[3] + } Field; ///< the struct type of Command0 ~ Command4 + UINT16 Value; ///< 16 bit value of Command0 ~ Command4 +} SPI_COMMUNICATION_RESULT; ///< The union struct type of Spi Communication Result + +typedef struct { + UINT8 ReadyToRun; ///< Set to FALSE by x86 while the buffer is being constructed. Set to + ///< TRUE by x86 as the last step in building the communication buffer, + ///< just before x86 rings the PSP doorbell. + ///< + ///< Set to FALSE by PSP after the PSP copies the buffer from DRAM to + ///< private SRAM. + + UINT8 CommandCount; ///< Number of commands to execute, Valid Values 1-4 + + SPI_COMMUNICATION_RESULT SpiCommunicationResult; ///< Set to zero by x86 when the buffer is built. Atomically set to a + ///< non-zero value by the PSP to indicate the PSP has finished + ///< processing the requests in the communication buffer. The specific + ///< value written by the PSP provides per command results + ///< + ///< Result values with special meaning: + ///< 0x0000 = (written by x86) PSP has not finished handling the request + ///< 0x1000 = PSP determined the request is malformed (invalid + ///< CommandCount, chipselect, BytesToRx/Tx, etc) + ///< 0x2000, 0x3000, 0x4000, ... , 0xF000 = Reserved for future errors + ///< + ///< Generic Result values: + ///< SpiCommunicationResult[ 3: 0] The result of Command[0] + ///< SpiCommunicationResult[ 7: 4] The result of Command[1] + ///< SpiCommunicationResult[11: 8] The result of Command[2] + ///< SpiCommunicationResult[15:12] The result of Command[3] + ///< 0 = Command not examined/processed + ///< 1 = Command completed successfully + ///< 2 = Execution Error (i.e. timeout) + ///< 3 = Command not allowed by Whitelist + ///< 4 = Command malformed + ///< 5-15 = reserved for future use + ///< + ///< Examples of Generic Results: + ///< 0x0000 - PSP has not finished the request + ///< 0x0001 - PSP ran Command0 successfully, and is now idle + ///< 0x0111 - PSP ran Command0/1/2 successfully and is now idle + ///< 0x0031 - PSP ran Command0, but Command1 was blocked by whitelist + + SPI_COMMAND SpiCommand[PSP_MAX_SPI_CMD_SUPPORT]; ///< Spi command array +} SPI_COMMUNICATION_BUFFER; ///< The struct type of Spi Communication Buffer + +typedef struct { + UINT8 ChipSelect; ///< 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + + UINT8 Frequency; ///< The allowed frequency for the command + ///< 0=66.66MHz, 1=33.33MHz, 2=22.22MHz, + ///< 3=16.66MHz, 4=100Mhz, 5=800KHz, all others illegal + + UINT8 OpCode; ///< The allowed commands opcode + + UINT8 MinTx; ///< The minimum range of allowed transmit byte counts for this command + ///< (does not include opcode) + UINT8 MaxTx; ///< The maximum range of allowed transmit byte counts for this command + ///< (does not include opcode) + + UINT8 MinRx; ///< The minimum range of allowed Rx byte counts + UINT8 MaxRx; ///< The maximum range of allowed Rx byte counts + + UINT8 AddrChkMethod; ///< 0=No address verification performed + ///< 1=Treat Buffer[0-2] as a 24-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + ///< 2=Treat Buffer[0-3] as a 32-bit address, and verify the entire + ///< ImpactZone of the command falls within one of the allowed regions + + UINT32 ImpactSize; ///< The Impact Zone is the naturally aligned power of two sized block + ///< of addresses that may be impacted by a given SPI Command. For + ///< example, a sector erase command targeted at an address within a + ///< 64K block will impact every byte within that 64K block. Likewise + ///< a page program SPI command (i.e. write) may impact many bytes + ///< within the targeted 256/512 byte page due to page wrap-around, but + ///< no bytes outside the page. The ImapctSize field specifies the power + ///< of two size of the ImpactZone for this command. If VerifyAddress is + ///< zero (no checking) this field must also be zero, otherwise this + ///< field must be a power of two between 256 and 64MB (256, 512, ..., + ///< 67108864). NOTE: When setting this field, carefully examine your + ///< device's datasheet. + ///< +} WHITE_LIST_ALLOWED_COMMAND; ///< The struct type of White List Allowed Command + +typedef struct { + // 8 bytes + UINT32 StartAddress; ///< LSB must be 0x00, bit31 identifies a chipselect: 0=CS1, 1=CS2 + UINT32 EndAddress; ///< LSB must be 0xFF, StartAddress must be less than EndAddress +} WHITE_LIST_ALLOWED_REGION; ///< The struct type of White List Allowed Region + +typedef struct { + UINT8 AllowedCmdCount; ///< Allow Command Count + UINT8 AllowedRegionCount; ///< Allow Region Count + WHITE_LIST_ALLOWED_COMMAND WhitelistAllowedCommands[PSP_MAX_WHITE_LIST_CMD_NUM]; ///< White List Allowed Command Table + WHITE_LIST_ALLOWED_REGION WhitelistAllowedRegions[PSP_MAX_WHITE_LIST_REGION_NUM]; ///< White List Allowed Region Table +} SPI_WHITE_LIST; ///< The struct type of Spi White List + +#pragma pack (pop) + +/** + * @brief Request secures the SPI Controller + * + * @param[in,out] SpiCommunicationBuffer Spi Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN OUT SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ); + +/** + * @brief Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI white list structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ); + +/** + * @brief Request execute SPI command provide in TSEG comm buffer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ); + +/** + * @brief Request PSP firmware switch SPI controller chip select. + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ); + +#endif //_PSP_ROM_ARMOR_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h new file mode 100644 index 0000000000..0189910bd1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/AmlGenerationLib.h @@ -0,0 +1,2722 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AML_LIB_H_ +#define AML_LIB_H_ + +#include <Uefi.h> +#include <IndustryStandard/Acpi.h> + +typedef enum { + AmlStart, + AmlClose, + AmlInvalid +} AML_FUNCTION_PHASE; + +#define AML_OBJECT_INSTANCE_SIGNATURE SIGNATURE_32 ('a', 'm', 'l', 'o') + +// +// Device Status Bitmap (Section 6.3.7 ACPI version 6.3) +// Bit [0] - Set if the device is present. +// Bit [1] - Set if the device is enabled and decoding its resources. +// Bit [2] - Set if the device should be shown in the UI. +// Bit [3] - Set if the device is functioning properly (cleared if device +// failed its diagnostics). +// Bit [4] - Set if the battery is present. +// Bits [31:5] - Reserved (must be cleared). +// +#define DEVICE_PRESENT_BIT 0x0001 +#define DEVICE_ENABLED_BIT 0x0002 +#define DEVICE_IN_UI_BIT 0x0004 +#define DEVICE_HEALTH_BIT 0x0008 +#define DEVICE_BATTERY_BIT 0x0010 // Control Method Battery Device Only + +typedef enum { + UnknownObj, + IntObj, + StrObj, + BuffObj, + PkgObj, + FieldUnitObj, + DeviceObj, + EventObj, + MethodObj, + MutexObj, + OpRegionObj, + PowerResObj, + ProcessorObj, + ThermalZoneObj, + BuffFieldObj, + DDBHandlObj, + InvalidObj +} OBJECT_TYPE_KEYWORD; + +typedef struct { + UINT32 Signature; + BOOLEAN Completed; + UINTN DataSize; + UINT8 *Data; + LIST_ENTRY Link; +} AML_OBJECT_INSTANCE; + +// *************************************************************************** +// AML defines to be consistent with already existing +// MdePkg/Include/IndustryStandard/Acpi*.h defines. +// *** These could be upstreamed at some point. +// *************************************************************************** +// Limits of (DWord|Word|QWord)Space ResourceType +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MIN 0xC0 +#define EFI_ACPI_SPACE_RESOURCE_TYPE_MAX 0xFF + +// General Flags: Flags that are common to all resource types +// Bits[7:4] Reserved(must be 0) +// Bit[3] Max Address Fixed, _MAF: +// 1 The specified maximum address is fixed +// 0 The specified maximum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED (1 << 3) +#define EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED (0 << 3) +#define EFI_ACPI_GENERAL_FLAG_MASK_MAF EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +// Bit[2] Min Address Fixed, _MIF: +// 1 The specified minimum address is fixed +// 0 The specified minimum address is not fixed and can be changed +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED (1 << 2) +#define EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED (0 << 2) +#define EFI_ACPI_GENERAL_FLAG_MASK_MIF EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +// Bit[1] Decode Type, _DEC: +// 1 This bridge subtractively decodes this address(top level bridges only) +// 0 This bridge positively decodes this address +#define EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE (1 << 1) +#define EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE (0 << 1) +#define EFI_ACPI_GENERAL_FLAG_MASK_DEC EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +// Bit[0] Consumer / Producer: +// 1 This device consumes this resource +// 0 This device produces and consumes this resource +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER (1 << 0) +#define EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER (0 << 0) +#define EFI_ACPI_GENERAL_FLAG_MASK_USAGE EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER + +// Memory Resource Flag (Resource Type = 0) DefinitionsBits +// Memory Resource Flag Masks +// Bits[7:6] Reserved(must be 0) +// Bit[5] Memory to I/O Translation, _TTP: +// 0 TypeStatic +// 1 Type Translation +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_TTP (1 << 5) +// Bit[4:3] Memory Attributes, _MTP: +// 0 AddressRangeMemory +// 1 AddressRangeReserved +// 2 AddressRangeACPI +// 3 AddressRangeNVS +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MTP (3 << 3) +// Bit[2:1] Memory Attributes, _MEM: +// 0 The memory is non-cacheable +// 1 The memory is cacheable +// 2 The memory is cacheable and supports write-combining +// 3 The memory is cacheable and prefetchable +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM (3 << 1) +// Bit[0] Write Status, _RW: +// 0 This memory range is read-only +// 1 This memory is read-write +#define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW (1 << 0) + +// I/O Resource Flag (Resource Type = 1) DefinitionsBits +// I/O Resource Flags +// Bit [7:6] Reserved (must be 0) +// Bit [5] Sparse Translation, _TRS. This bit is only meaningful if Bit [4] is set. +// 1 SparseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = (((port & 0xFFFc) << 10) || (port & 0xFFF)) + _TRA In the address +// used to access the I/O port, bits[11:2] must be identical to bits[21:12], +// this gives four bytes of I/O ports on each 4 KB page. +// 0 DenseTranslation: The primary-side memory address of any specific I/O port +// within the secondary-side range can be found using the following function. +// address = port + _TRA +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_SPARSE_TRANSLATION (1 << 5) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_DENSE_TRANSLATION (0 << 5) +// Bit [4] I/O to Memory Translation, _TTP +// 1 TypeTranslation: This resource, which is I/O on the secondary side of the +// bridge, is memory on the primary side of the bridge. +// 0 TypeStatic: This resource, which is I/O on the secondary side of the +// bridge, is also I/O on the primary side of the bridge. +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_TRANSLATION (1 << 4) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_STATIC (0 << 4) +// Bit [3:2] Reserved (must be 0) +// Bit [1:0] _RNG +// 3 Memory window covers the entire range +// 2 ISARangesOnly. This flag is for bridges on systems with multiple bridges. +// Setting this bit means the memory window specified in this descriptor is +// limited to the ISA I/O addresses that fall within the specified window. The +// ISA I/O ranges are: n000-n0FF, n400-n4FF, n800-n8FF, nC00-nCFF. This bit can +// only be set for bridges entirely configured throughACPI namespace. +// 1 NonISARangesOnly. This flag is for bridges on systems with multiple +// bridges. Setting this bit means the memory window specified in this +// descriptor is limited to the non-ISA I/O addresses that fall within the +// specified window. The non-ISA I/O ranges are: n100-n3FF, n500-n7FF, +// n900-nBFF, nD00-nFFF. This bit can only be set for bridges entirely +// configured through ACPI namespace. +// 0 Reserved +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE (3 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY (2 << 0) +#define EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY (1 << 0) + +#define AML_OBJECT_INSTANCE_FROM_LINK(a) BASE_CR (a, AML_OBJECT_INSTANCE, Link) + +// Method Serialize Flag Values +typedef enum { + NotSerialized, + Serialized, + FlagInvalid +} METHOD_SERIALIZE_FLAG; +// AccessField Access Attrib Flags. +// Ref ACPI spec 6.3 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL 0x00 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK 0x02 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE 0x04 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE 0x06 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD 0x08 +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK 0x0A +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES 0x0B +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL 0x0C +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL 0x0D +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES 0x0E +#define EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES 0X0F + +// AccessField access types +typedef enum { + AnyAcc, + ByteAcc, + WordAcc, + DWordAcc, + QWordAcc, + BufferAcc, +} EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS; + +// Field lock rules +typedef enum { + NoLock, + Lock +} EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS; + +// Field update rules +typedef enum { + Preserve, + WriteAsOnes, + WriteAsZeros +} EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS; + +// Field access attributes. for AttribBytes, AttribRawBytes and AttribRawProcessBytes +// the ExtendedAccessField definition is used, as this is what iASL compiles into, rather +// than the AccessField that is specified in the ACPI spec. +typedef enum { + AttribNormal = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_NORMAL, + AttribQuick = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_QUICK, + AttribSendReceive = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_SEND_RECEIVE, + AttribByte = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTE, + AttribWord = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_WORD, + AttribBlock = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK, + AttribBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BYTES, + AttribProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_PROCESS_CALL, + AttribBlockProcessCall = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_BLOCK_PROCESS_CALL, + AttribRawBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_BYTES, + AttribRawProcessBytes = EFI_ACPI_FIELD_FLAGS_ACCESS_ATTRIB_ATTRIB_RAW_PROCESS_BYTES +} EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS; + +// +// Resource Type Specific Flags +// Ref ACPI specification 6.4.3.5.5 +// +// +// DMA Information +// Ref ACPI specification 6.4.2.2 +// +// DmaType values +typedef enum { + Compatibility = EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY, + TypeA = EFI_ACPI_DMA_SPEED_TYPE_A, + TypeB = EFI_ACPI_DMA_SPEED_TYPE_B, + TypeF = EFI_ACPI_DMA_SPEED_TYPE_F +} EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS; + +// IsBusMaster values +typedef enum { + NotBusMaster = 0, + BusMaster = EFI_ACPI_DMA_BUS_MASTER +} EFI_ACPI_DMA_BUS_MASTER_KEYWORDS; + +// DmaTransferSize values +typedef enum { + Transfer8 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT, + Transfer8_16 = EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT, + Transfer16 = EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT +} EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS; + +// +// Interrupt Resource Descriptor Information +// Ref ACPI specification 6.4.2.1 +// +// IRQ Information - Wake Capability +// +#define EFI_ACPI_IRQ_WAKE_CAPABLE_MASK 0x20 +#define EFI_ACPI_IRQ_NOT_WAKE_CAPABLE 0x0 +#define EFI_ACPI_IRQ_WAKE_CAPABLE 0x20 + +typedef enum { + NotWakeCapable = EFI_ACPI_IRQ_NOT_WAKE_CAPABLE, + WakeCapable = EFI_ACPI_IRQ_WAKE_CAPABLE +} EFI_ACPI_IRQ_WAKE_CAPABILITY_KEYWORDS; + +// +// IRQ Information - Interrupt Sharing +// +#define EFI_ACPI_IRQ_EXCLUSIVE 0x0 + +typedef enum { + Exclusive = EFI_ACPI_IRQ_EXCLUSIVE, + Shared = EFI_ACPI_IRQ_SHARABLE, + ExclusiveAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_EXCLUSIVE, + SharedAndWake = EFI_ACPI_IRQ_WAKE_CAPABLE | EFI_ACPI_IRQ_SHARABLE +} EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS; + +// +// IRQ Information - Interrupt Polarity +// +typedef enum { + ActiveHigh = EFI_ACPI_IRQ_HIGH_TRUE, + ActiveLow = EFI_ACPI_IRQ_LOW_FALSE +} EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS; + +// +// IRQ Information - Interrupt Mode +// +#define EFI_ACPI_IRQ_MODE_MASK 0x1 +typedef enum { + LevelTriggered = EFI_ACPI_IRQ_LEVEL_TRIGGERED, + EdgeTriggered = EFI_ACPI_IRQ_EDGE_TRIGGERED +} EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS; + +// IO Port Descriptor Information +// Ref ACPI specification 6.4.2.5 +// +typedef enum { + Decode16 = EFI_ACPI_IO_DECODE_16_BIT, + Decode10 = EFI_ACPI_IO_DECODE_10_BIT +} EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION; + +// +// Memory Resource Information +// Ref ACPI specification 6.4.3.5 +// +// Consumer/Producer Bit[0] +typedef enum { + ResourceProducer = EFI_ACPI_GENERAL_FLAG_RESOURCE_PRODUCER, + ResourceConsumer = EFI_ACPI_GENERAL_FLAG_RESOURCE_CONSUMER +} RESOURCE_USAGE_FLAG; + +// Decode Type (_DEC) Bit[1] +typedef enum { + PosDecode = EFI_ACPI_GENERAL_FLAG_DECODE_POSITIVE, + SubDecode = EFI_ACPI_GENERAL_FLAG_DECODE_SUBTRACTIVE +} MEM_DECODE_FLAG; + +// Min Address Fixed (_MIF) Bit[2] +typedef enum { + MinNotFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED, + MinFixed = EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED +} MIN_FIXED_FLAG; + +// Max Address Fixed (_MAF) Bit[3] +typedef enum { + MaxNotFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED, + MaxFixed = EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED +} MAX_FIXED_FLAG; + +// Memory Attributes (_MEM) Bits[2:1] +typedef enum { + NonCacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_NON_CACHEABLE, + Cacheable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE, + WriteCombining = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_WRITE_COMBINING, + Prefetchable = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE +} CACHEABLE_FLAG; + +// Write Status (_RW) Bit[0] +typedef enum { + ReadOnly = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_ONLY, + ReadWrite = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_WRITE +} READ_WRITE_FLAG; + +// Memory Attributes (_MTP) Bits[4:3] +typedef enum { + AddressRangeMemory = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_MEMORY, + AddressRangeReserved = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_RESERVED, + AddressRangeACPI = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_ACPI, + AddressRangeNVS = EFI_APCI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_NVS +} MEMORY_RANGE_TYPE; + +// Memory to IO Translation (_TTP) Bit[5] +// Note: IO and Memory Resources use different bits for this. +// Value must be handled at function level when implemented. +typedef enum { + TypeStatic = 0, + TypeTranslation = 1 +} MEMORY_TRANSLATION_TYPE; + +// Memory Window Attributes (_RNG) Bits[1:0] +typedef enum { + Reserved = 0, + NonISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_NON_ISA_ONLY, + ISAOnly = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ISA_ONLY, + EntireRange = EFI_ACPI_IO_RESOURCE_SPECIFIC_FLAG_TYPE_RANGE_ENTIRE, + ISARangeMax +} IO_ISA_RANGES; + +// Generic Address Space Address IDs +typedef enum { + SystemMemory = EFI_ACPI_6_4_SYSTEM_MEMORY, + SystemIO = EFI_ACPI_6_4_SYSTEM_IO, + PCI_Config = EFI_ACPI_6_4_PCI_CONFIGURATION_SPACE, + EmbeddedControl = EFI_ACPI_6_4_EMBEDDED_CONTROLLER, + SMBus = EFI_ACPI_6_4_SMBUS, + SystemCMOS = EFI_ACPI_6_4_SYSTEM_CMOS, + PciBarTarget = EFI_ACPI_6_4_PCI_BAR_TARGET, + IPMI = EFI_ACPI_6_4_IPMI, + GeneralPurposeIO = EFI_ACPI_6_4_GENERAL_PURPOSE_IO, + GenericSerialBus = EFI_ACPI_6_4_GENERIC_SERIAL_BUS, + PCC = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + PlatformCommChannel = EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL, + FFixedHW = EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE +} GENERIC_ADDRESS_SPACE_ID; + +typedef enum { + UndefinedSize = EFI_ACPI_6_4_UNDEFINED, + ByteSize = EFI_ACPI_6_4_BYTE, + WordSize = EFI_ACPI_6_4_WORD, + DWordSize = EFI_ACPI_6_4_DWORD, + QWordSize = EFI_ACPI_6_4_QWORD +} ACPI_DATA_SIZE; + +typedef ACPI_DATA_SIZE GENERIC_ADDRESS_ACCESS_SIZE; + +// *************************************************************************** +// AML Objects +// *************************************************************************** + +// --------------------------------------------------------------------------- +// Table and Table Header Encoding +// --------------------------------------------------------------------------- + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Name Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Namestring AML Object and inserts it into the linked list + + Completes NameString in one call as "one phase" + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Data Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an optimized integer object + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Package Length Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Term Objects Encoding +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Namespace Modifier Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString DataRefObject + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Named Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Named Object name + @param[in,out] ListHead - Linked list has completed Name Object after AmlClose + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be created between AmlStart and AmlClose Phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ); + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + // + // x' is encoded as bits 0:7 of the AccessAttrib byte. + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed AccessAs Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj since AML does not store + ArgTypes here. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 1 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Type 2 Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Resource Descriptor Objects Encoding +// --------------------------------------------------------------------------- + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlDWordSpace () + + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. RangeLength + evaluates to a 32-bit integer that specifies the total number of bytes decoded + in the memory range. The 32-bit field DescriptorName. _LEN is automatically + created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + AmlQWordSpace () + + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Expression Opcodes Encoding +// --------------------------------------------------------------------------- + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// --------------------------------------------------------------------------- +// Miscellaneous Objects Encoding +// --------------------------------------------------------------------------- + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op |Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ + +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ); + +// *************************************************************************** +// AML Assistance Functions +// *************************************************************************** + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ); + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ); + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ); + +// *************************************************************************** +// AML Debug Functions +// *************************************************************************** + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ); + +/** + DEBUG print a buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS.IS.A.SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ); + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ); + +#endif // AML_LIB_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h new file mode 100644 index 0000000000..d48ca1a90a --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Library/PlatformPspRomArmorWhitelistLib.h @@ -0,0 +1,25 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/AmdPspRomArmorLib.h> + +/* + * Return allocated and filled AMD PSP ROM Armor White list Table + * + * + * @param[in] PlatformSpiWhitelist Pointer to white list table + * + * @return EFI_SUCCESS + * @return EFI_OUT_OF_RESOURCES Buffer to return couldn't be allocated + */ +EFI_STATUS +EFIAPI +GetPspRomArmorWhitelist ( + IN SPI_WHITE_LIST **PlatformSpiWhitelist + ); diff --git a/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h new file mode 100644 index 0000000000..6c854651cc --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Ppi/AmdPspFtpmPpi.h @@ -0,0 +1,134 @@ +/** @file + AMD Psp Ftpm Ppi Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PSP_FTPM_PPI_H_ +#define PSP_FTPM_PPI_H_ +#include <Uefi.h> + +typedef struct _PSP_FTPM_PPI PSP_FTPM_PPI; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: GET TPM related Info + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PPI *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PPI *This, + IN VOID *CommandBuffer, + IN UINTN CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + **/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs. + + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PPI itself + @param[in,out] ResponseBuffer Point to the TPM response buffer + @param[in,out] ResponseSize Size of the TPM response buffer + + @retval EFI_STATUS 0: Success, Non-Zero Error +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PPI *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + PSP_FTPM_PPI prototype + + Defines PSP_FTPM_PPI. This PPI is used to get Ftpm info. + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PPI { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs +} PSP_FTPM_PPI; + +extern EFI_GUID gAmdPspFtpmPpiGuid; +extern EFI_GUID gAmdPspFtpmFactoryResetPpiGuid; + +#endif diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h new file mode 100644 index 0000000000..715cbbcf78 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdCxlServicesProtocol.h @@ -0,0 +1,183 @@ +/** @file + CXL Configuration Services Protocol prototype definition + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef NBIO_CXL_SERVICES_PROTOCOL_H_ +#define NBIO_CXL_SERVICES_PROTOCOL_H_ + +#include "AMD.h" +#include <Protocol/FabricTopologyServices2.h> +#include <Protocol/FabricResourceManagerServicesProtocol.h> + +#define AMD_NBIO_CXL_SERVICES_REVISION 0x00 + +/// Forward declaration for the AMD_NBIO_CXL_SERVICES_PROTOCOL +typedef struct _AMD_NBIO_CXL_SERVICES_PROTOCOL AMD_NBIO_CXL_SERVICES_PROTOCOL; + +extern EFI_GUID gAmdNbioCxlServicesProtocolGuid; ///< CXL services protocol calling + +#pragma pack (push, 1) +/// Port Information Structure +typedef struct _AMD_CXL_PORT_INFO_STRUCT { + PCI_ADDR EndPointBDF; ///< Bus/Device/Function of Root Port in PCI_ADDR format + UINT8 LogicalNbioInstance; ///< Logical Instance ID of NBIO + UINT8 PhysicalNbioInstance; ///< Physical Instance ID of NBIO where this port is located + UINT8 SocketID; ///< Socket ID for this port + UINT32 UsRcrb; ///< Upstream Port RCRB address + UINT32 DsRcrb; ///< Downstream Port RCRB address + UINT32 UsMemBar0; ///< Upstream port MEMBAR0 + UINT32 DsMemBar0; ///< Downstream port MEMBAR0 + UINT8 PortId; ///< Physical port location + UINT8 PortWidth; ///< Lane width of the port + UINT32 CxlPortAddress; ///< CXL root port address (CXL 2.0 root port or CXL 1.1 RCiEP) + BOOLEAN IsSwitch; ///< CXL Switch flag +} AMD_CXL_PORT_INFO_STRUCT; + +/// Port MMIO32 Resources Information Structure +typedef struct _AMD_CXL_RESOURCES_INFO_STRUCT { + UINT32 Mmio32Base[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Size[MAX_SOCKETS_SUPPORTED][MAX_RBS_PER_SOCKET]; + UINT32 Mmio32Gran; +} AMD_CXL_RESOURCES_INFO_STRUCT; +#pragma pack (pop) + +// Protocol Definitions + +/** + This function gets information about a specific PCIe root port. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortInformation + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_ROOT_PORT_INFORMATION)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr + IN UINTN PortIndex, ///< port index + OUT AMD_CXL_PORT_INFO_STRUCT *PortInformation ///< port information ptr + ); + +/** + This function configures a specific PCIe root port for CXL capabilities. + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port. + PortInformation OPTIONAL (can be NULL) + A pointer to an information structure to be populated by this function to + identify the location of the CXL port. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_CONFIGURE_ROOT_PORT)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< this ptr + IN PCI_ADDR EndpointBDF ///< end pt bdf + ); + +/** + This function configures a specific PCIe root port for CXL presence + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + EndpointBDF + Bus/Device/Function of Endpoint in PCI_ADDR format. + PortConfiguration + A pointer to a configuration structure that contains the information necessary + to configurare the CXL port such as Socket id,rbindex,port id,segment,bus base,limit or presence. +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_AVAILABLE)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT FABRIC_RESOURCE_FOR_EACH_RB *ResourceForEachRb ///< + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_GET_PORT_RB_LOCATION)( + ///< get port rb location + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN UINT8 Segment, ///< + IN UINT8 BusBase, ///< + OUT UINT8 *SocketId, ///< + OUT UINT8 *RbIndex ///< + ); + +/** + This function gets the CXL MMIO32 values to be used by the fabric resource manager + + This + A pointer to the AMD_NBIO_CXL_SERVICES_PROTOCOL instance. + CxlMmio32ResourceForEachRb + A pointer to the structure that will hold the MMIO32 base and size values for each root bridge +**/ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_RESOURCES_INFORMATION)( + ///< cxl port presence info + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< + IN OUT AMD_CXL_RESOURCES_INFO_STRUCT *CxlMmio32Resources ///< + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_REPORT_TO_MPIO)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This ///< ptr to protocol + ); + +/** + * @brief + * + */ +typedef +EFI_STATUS +(EFIAPI *AMD_CXL_FIND_2P0_DEVICES)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN UINTN PortIndex ///< port index + ); + +/** + * @brief + * + */ +typedef +VOID +(EFIAPI *AMD_CXL_ENABLE_SCM_PMEM)( + IN AMD_NBIO_CXL_SERVICES_PROTOCOL *This, ///< ptr to protocol + IN PCI_ADDR CxlPciAddress ///< PCI address + ); + +/// The Protocol Definition for CXL Services +struct _AMD_NBIO_CXL_SERVICES_PROTOCOL { + UINT32 Revision; ///< revision + UINTN CxlCount; ///< CXL count + AMD_CXL_GET_ROOT_PORT_INFORMATION CxlGetRootPortInformation; ///< CXL root port information + AMD_CXL_CONFIGURE_ROOT_PORT CxlConfigureRootPort; ///< configuring the root port + AMD_CXL_GET_PORT_RB_LOCATION GetCxlPortRBLocation; ///< CXL port RB location + AMD_CXL_RESOURCES_AVAILABLE GetCxlAvailableResources; ///< Get resources allocated for CXL RCiEP + AMD_CXL_RESOURCES_INFORMATION GetCxlMmio32Resources; ///< Get CXL MMIO resources for CXL RCiEP + AMD_CXL_REPORT_TO_MPIO CxlReportToMpio; ///< Sends the CXL info to MPIO + AMD_CXL_FIND_2P0_DEVICES CxlFind2p0Devices; ///< Finds CXL 2.0 devices after PCIe enumeration + AMD_CXL_ENABLE_SCM_PMEM CxlEnableScmForPersistentMemory; ///< Notifies SMU that CXL persistent memory is present +}; + +#endif /* NBIO_CXL_SERVICES_PROTOCOL_H */ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h new file mode 100644 index 0000000000..7bcff65dc9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPciResourcesProtocol.h @@ -0,0 +1,110 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_PCI_RESOURCES_PROTOCOL_H_ +#define AMD_PCI_RESOURCES_PROTOCOL_H_ + +typedef struct { + UINTN Index; + UINT8 SocketId; + UINTN Segment; + UINTN BaseBusNumber; +} PCI_ROOT_BRIDGE_OBJECT; + +typedef struct { + UINTN Index; + BOOLEAN Enabled; + UINT8 PortPresent; + UINTN Device; + UINTN Function; + UINTN SlotNum; + // Interrupts are relative to IOAPIC 0->n + UINTN BridgeInterrupt; // Redirection table entry for mapped bridge interrupt + UINTN EndpointInterruptArray[4]; // Redirection table entries for mapped INT A/B/C/D +} PCI_ROOT_PORT_OBJECT; + +typedef enum { + IOMMU = 0, + IOAPIC +} FIXED_RESOURCE_TYPE; + +typedef struct { + UINTN Index; + FIXED_RESOURCE_TYPE ResourceType; + UINTN Address; + UINTN Limit; +} FIXED_RESOURCES_OBJECT; + +/// Forward declaration for the AMD_PCI_RESOURCES_PROTOCOL. +typedef struct _AMD_PCI_RESOURCES_PROTOCOL AMD_PCI_RESOURCES_PROTOCOL; + +/** + * @brief System information through EFI call + * @details + */ +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + OUT UINTN *NumberOfRootBridges + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT PCI_ROOT_BRIDGE_OBJECT **RootBridgeInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfRootPorts + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN RootPortIndex, + OUT PCI_ROOT_PORT_OBJECT **RootPortInfo + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + OUT UINTN *NumberOfFixedResources + ); + +typedef +EFI_STATUS +(EFIAPI *AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO)( + IN AMD_PCI_RESOURCES_PROTOCOL *This, + IN UINTN RootBridgeIndex, + IN UINTN FixedResourceIndex, + OUT FIXED_RESOURCES_OBJECT **FixedResourceInfo + ); + +struct _AMD_PCI_RESOURCES_PROTOCOL { + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTBRIDGES AmdPciResourcesGetNumberOfRootBridges; + AMD_PCI_RESOURCES_GET_ROOT_BRIDGE_INFO AmdPciResourcesGetRootBridgeInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_ROOTPORTS AmdPciResourcesGetNumberOfRootPorts; + AMD_PCI_RESOURCES_GET_ROOT_PORT_INFO AmdPciResourcesGetRootPortInfo; + AMD_PCI_RESOURCES_GET_NUMBER_OF_FIXEDRESOURCES AmdPciResourcesGetNumberOfFixedResources; + AMD_PCI_RESOURCES_GET_FIXED_RESOURCE_INFO AmdPciResourcesGetFixedResourceInfo; +}; + +extern EFI_GUID gAmdPciResourceProtocolGuid; ///< Guid for calling + +#endif // AMD_PCI_RESOURCES_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h new file mode 100644 index 0000000000..ebc7812b18 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/AmdPspFtpmProtocol.h @@ -0,0 +1,187 @@ +/** @file + AMD Psp Ftpm Protocol Header + + Copyright (C) 2023-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FTPM_PROTOCOL_H_ +#define FTPM_PROTOCOL_H_ + +#include <Uefi.h> +// +// GUID definition +// +extern EFI_GUID gAmdPspFtpmProtocolGuid; + +/** + structure definition for HSP mailbox + +**/ +typedef struct { + // C2H_TPM_L0 + UINT64 TPM_L0_Address; /// Mailbox address + UINT64 TPM_L0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 TPM_L0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L0(VLT0) + UINT64 VLT0_Address; /// Mailbox address + UINT64 VLT0_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT0_H2C_MSG_Address; /// Doorbell address HSP->CPU + + // C2H_HSP_L1(VLT1) + UINT64 VLT1_Address; /// Mailbox address + UINT64 VLT1_C2H_MSG_Address; /// Doorbell address CPU->HSP + UINT64 VLT1_HSC_MSG_Address; /// Doorbell address HSP->CPU + + // Interrupt Information + UINT8 Gsi[4]; /// Gsi[0] is for HSP Channel 0 TPM + /// Gsi[1] is for HSP Channel 1 VTL0 + /// Gsi[2] is for HSP Channel 2 VTL1 + /// Gsi[3] is reserved +} HSP_MAILBOX_ADDRESS, *PHSP_MAILBOX_ADDRESS; + +typedef union { + HSP_MAILBOX_ADDRESS HSP_info; +} FTPM_INFO; + +typedef struct _PSP_FTPM_PROTOCOL PSP_FTPM_PROTOCOL; + +/** + Define function prototype: Execute a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_EXECUTE)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: GET TPM related Information + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmStatus Used to hold more detail info (Unused Currently) + + @return EFI_SUCCESS Ftpm function supported + @return EFI_UNSUPPORTED Ftpm function unsupported + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_CHECK_STATUS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT UINTN *FtpmStatus + ); + +/** + Define function prototype: Send a TPM command + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in] CommandBuffer Point to the TPM command buffer + @param[in] CommandSize Size of the TPM command buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_SEND_COMMAND)( + IN PSP_FTPM_PROTOCOL *This, + IN VOID *CommandBuffer, + IN UINT32 CommandSize + ); + +/** + Define function prototype: Get a TPM command's response + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer + + @return EFI_SUCCESS Command executed successfully + @return EFI_UNSUPPORTED Device unsupported + @return EFI_TIMEOUT Command fail due the time out + @return EFI_DEVICE_ERROR Command fail due the error status set + @return EFI_BUFFER_TOO_SMALL Response buffer too small to hold the response + +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_RESPONSE)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINT32 *ResponseSize + ); + +/** + Define function prototype: Get TCG Logs + This function only implemented on Pluton-fTPM + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in, out] ResponseBuffer Point to the TPM response buffer + @param[in, out] ResponseSize Size of the TPM response buffer +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TCG_LOGS)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *ResponseBuffer, + IN OUT UINTN *ResponseSize + ); + +/** + Function prototype for GetHspfTPMInfo. Return Pluton mailbox base address to SBIOS. + SBIOS should call this procedure after PCI Enumeration Complete. + + @param[in] This Point to PSP_FTPM_PROTOCOL itself + @param[in,out] FtpmInfo Point to Pluton mailbox base address + + @return EFI_SUCCESS - Success + @return EFI_INVALID_PARAMETER - Input parameter is invalid + @return EFI_NOT_READY - Pluton-fTPM device BAR0 MMIO is not ready. +**/ +typedef +EFI_STATUS +(EFIAPI *FTPM_GET_TPM_INFO)( + IN PSP_FTPM_PROTOCOL *This, + IN OUT VOID *FtpmInfo + ); + +/** + PSP_FTPM_PROTOCOL prototype + + Defines PSP_FTPM_PROTOCOL. This protocol is used to get Ftpm info + Send TPM command, Get TPM command's response, Execute TPM command(Include send & get response) +**/ +typedef struct _PSP_FTPM_PROTOCOL { + FTPM_EXECUTE Execute; ///< Execute TPM command, include send & get response + FTPM_CHECK_STATUS CheckStatus; ///< Check TPM Status + FTPM_SEND_COMMAND SendCommand; ///< Send TPM command + FTPM_GET_RESPONSE GetResponse; ///< Get Last TPM command response + FTPM_GET_TCG_LOGS GetTcgLogs; ///< Get TCG Logs + FTPM_GET_TPM_INFO GetInfo; ///< Get TPM info +} PSP_FTPM_PROTOCOL; + +#endif //FTPM_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h new file mode 100644 index 0000000000..7f57facf88 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/Protocol/FabricResourceManagerServicesProtocol.h @@ -0,0 +1,14 @@ +/** @file + Fabric MMIO map manager Protocol prototype definition + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#define FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ +#include <FabricResourceManagerCmn.h> + +#endif // FABRIC_RESOURCE_MANAGER_SERVICES_PROTOCOL_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h new file mode 100644 index 0000000000..a7fef5a35c --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmBase.h @@ -0,0 +1,19 @@ +/** @file + AMD CPM Base Definitions. + + Copyright (C) 2014-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_BASE_H_ +#define AMD_CPM_BASE_H_ + +#include <Base.h> +#include <Uefi.h> +#include <PiPei.h> +#include <AmdCpmCommon.h> +#include <Library/DebugLib.h> + +#endif // AMD_CPM_BASE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h new file mode 100644 index 0000000000..af192fcf03 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmCommon.h @@ -0,0 +1,78 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_COMMON_H_ +#define AMD_CPM_COMMON_H_ + +#pragma pack(push) + +#include <AGESA.h> +#include <AmdPcieComplex.h> +#include <AmdCpmDefine.h> +#include <AmdCpmFunction.h> + +/// The signatures of CPM table + +typedef enum { + CPM_SIGNATURE_DXIO_TOPOLOGY = SIGNATURE_32 ('$', 'A', '2', '6'), ///< The signature of Socket 0 AMD_CPM_DXIO_TOPOLOGY_TABLE + CPM_SIGNATURE_DXIO_TOPOLOGY_S1 = SIGNATURE_32 ('$', 'A', '2', '7') ///< The signature of Socket 1 AMD_CPM_DXIO_TOPOLOGY_TABLE +} AMD_CPM_TABLE_SIGNATURE; + +/// CPM table header +typedef struct { + UINT32 TableSignature; ///< Signature of CPM table + UINT16 TableSize; ///< Table size + UINT8 FormatRevision; ///< Revision of table format + UINT8 ContentRevision; ///< Revision of table content + UINT32 PlatformMask; ///< The mask of platform table supports + UINT32 Attribute; ///< Table attribute +} AMD_CPM_TABLE_COMMON_HEADER; + +/// Table pointer +typedef union { + VOID *Pointer; ///< Table pointer + UINT64 Raw; ///< Table pointer value +} AMD_CPM_POINTER; + +/// DXIO Topology Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT32 SocketId; ///< Socket Id + DXIO_PORT_DESCRIPTOR Port[AMD_DXIO_PORT_DESCRIPTOR_SIZE]; ///< DXIO Port Descriptor List +} AMD_CPM_DXIO_TOPOLOGY_TABLE; + +/// AMD CPM Main Table +typedef struct { + AMD_CPM_TABLE_COMMON_HEADER Header; ///< Table header + UINT8 PlatformName[32]; ///< Platform name + UINT8 BiosType; ///< BIOS type + UINT16 CurrentPlatformId; ///< Current Platform Id + UINT32 PcieMemIoBaseAddr; ///< PcieMemIoBaseAddr + UINT32 AcpiMemIoBaseAddr; ///< AcpiMemIoBaseAddr + AMD_CPM_POINTER Service; ///< Reserved for internal use + AMD_CPM_POINTER TableInRomList; ///< Reserved for internal use + AMD_CPM_POINTER TableInRamList; ///< Reserved for internal use + AMD_CPM_POINTER TableInHobList; ///< Reserved for internal use + AMD_CPM_POINTER HobTablePtr; ///< Reserved for internal use + + UINT8 ExtClkGen; ///< External ClkGen Config. 0x00~0x7F + UINT8 UnusedGppClkOffEn; ///< Config to turn off unused GPP clock + UINT8 LpcUartEn; ///< LpcUartEn + UINT64 AltAcpiMemIoBaseAddr; ///< Alternate AcpiMemIoBaseAddr for Slave FCH +} AMD_CPM_MAIN_TABLE; + +/// Structure for Chip Id +typedef struct { + UINT8 Cpu; ///< CPU/APU Chip Id + UINT8 Sb; ///< SB Chip Id + UINT8 Reserved[6]; +} AMD_CPM_CHIP_ID; +#pragma pack (pop) + +#endif //AMD_CPM_COMMON_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h new file mode 100644 index 0000000000..4fc3f97a80 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmDefine.h @@ -0,0 +1,17 @@ +/** @file + AMD CPM Common Definitions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_DEFINE_H_ +#define AMD_CPM_DEFINE_H_ + +#ifndef AMD_DXIO_PORT_DESCRIPTOR_SIZE +#define AMD_DXIO_PORT_DESCRIPTOR_SIZE 0x30 +#endif + +#endif // AMD_CPM_DEFINE_H_ diff --git a/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h new file mode 100644 index 0000000000..7dce238135 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Include/AmdCpmFunction.h @@ -0,0 +1,32 @@ +/** @file + AMD CPM Common Functions. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_FUNCTION_H_ +#define AMD_CPM_FUNCTION_H_ + +typedef VOID *(EFIAPI *AMD_CPM_GETTABLEPTR_FN)( + IN VOID *This, + IN UINT32 TableId + ); + +typedef AGESA_STATUS (EFIAPI *AMD_CPM_GETPOSTEDVBIOSIMAGE_FN)( + IN GFX_VBIOS_IMAGE_INFO *VbiosImageInfo + ); + +/// Common Functions for CPM Drivers +typedef struct _AMD_CPM_COMMON_FUNCTION { + AMD_CPM_GETTABLEPTR_FN GetTablePtr2; ///< Get CPM Table Pointer. The table can be re-writable +} AMD_CPM_COMMON_FUNCTION; + +/// CPM Public Functions for platform DXE Driver to use +typedef struct _AMD_CPM_DXE_PUBLIC_FUNCTION { + AMD_CPM_GETPOSTEDVBIOSIMAGE_FN GetPostedVbiosImage; ///< Get posted VBIOS image +} AMD_CPM_DXE_PUBLIC_FUNCTION; + +#endif //AMD_CPM_FUNCTION_H_ diff --git a/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h new file mode 100644 index 0000000000..4a90aa3d8b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/Protocol/AmdCpmTableProtocol/AmdCpmTableProtocol.h @@ -0,0 +1,39 @@ +/** @file + AMD CPM Table Protocol. + + Copyright (C) 2012-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_CPM_TABLE_PROTOCOL_H_ +#define AMD_CPM_TABLE_PROTOCOL_H_ + +#include <AmdCpmBase.h> + +// +// GUID definition +// +#define AMD_CPM_TABLE_PROTOCOL_GUID \ + { 0x3724cf01, 0x00c2, 0x9762, 0x11, 0xb3, 0x0e, 0xa8, 0xaa, 0x89, 0x72, 0x00 } + +#define AMD_CPM_TABLE_SMM_PROTOCOL_GUID \ + { 0xaf6efacf, 0x7a13, 0x45a3, 0xb1, 0xa5, 0xaa, 0xfc, 0x06, 0x1c, 0x4b, 0x79 } + +extern EFI_GUID gAmdCpmTableProtocolGuid; +extern EFI_GUID gAmdCpmTableSmmProtocolGuid; + +/// DXE Protocol Structure +typedef struct _AMD_CPM_TABLE_PROTOCOL { + UINTN Revision; ///< Protocol Revision + AMD_CPM_MAIN_TABLE *MainTablePtr; ///< Pointer to CPM Main Table + AMD_CPM_CHIP_ID ChipId; ///< Id of SB Chip + AMD_CPM_COMMON_FUNCTION CommonFunction; ///< Private Common Functions + AMD_CPM_DXE_PUBLIC_FUNCTION DxePublicFunction; ///< Public Function of Protocol +} AMD_CPM_TABLE_PROTOCOL; + +// Current Protocol Revision +#define AMD_CPM_TABLE_PROTOCOL_REV 0x00 + +#endif // AMD_CPM_TABLE_PROTOCOL_H_ diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c new file mode 100644 index 0000000000..fa83888e95 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspMboxLibV2/AmdPspMboxLibV2.c @@ -0,0 +1,31 @@ +/** @file + PSP Mailbox related functions + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + * @brief Bios send these commands to PSP to grant dTPM status and event log + * + * @param[out] DesiredConfig dTPM configuration requested + * @param[out] ConfigStatus 0 - success. non-zero failure. + * @param[in,out] LogDataSize Size of LogData buffer + * @param[out] LogData Point to allocated event log buffer + * + * @retval EFI_STATUS 0: Success, NonZero Error + */ +EFI_STATUS +PspMboxGetDTPMData ( + OUT UINT32 *DesiredConfig, + OUT UINT32 *ConfigStatus, + IN OUT UINT32 *LogDataSize, + OUT VOID *LogData + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c new file mode 100644 index 0000000000..0e9baad955 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLib/AmdPspRomArmorLib.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c new file mode 100644 index 0000000000..a04bc1f992 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/AmdPspRomArmorLibNull/AmdPspRomArmorLibNull.c @@ -0,0 +1,79 @@ +/** @file + + Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/AmdPspRomArmorLib.h> + +/** + * Request secures the SPI Controller + * + * @param[in, out] SpiCommunicationBuffer SPI Communication Structure Buffer pointer + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnterSmmOnlyMode ( + IN SPI_COMMUNICATION_BUFFER *SpiCommunicationBuffer + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Loads the whitelist into the PSP. + * + * @param[in] SpiWhitelist SPI White List structure buffer pointer. + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspEnforceWhitelist ( + IN SPI_WHITE_LIST *SpiWhitelist + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request execute SPI command provide in TSEG comm buffer. + * + * @param[in] NONE + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspExecuteSpiCommand ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} + +/** + * Request PSP firmware switch SPI controller chip select. + * + * + * @param[in] Chipset SPI controller chip select, 0= Allowed on all chip selects, 1= CS1, 2= CS2, all else invalid + * + * @retval EFI_SUCCESS Initial success + * @retval Others Error happens during initialize + */ +EFI_STATUS +EFIAPI +PspSwitchChipSelect ( + IN UINT8 ChipSelect + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c new file mode 100644 index 0000000000..fce82d75b0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3/ApcbLibV3.c @@ -0,0 +1,12 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/PcdLib.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/SmmBase2.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c new file mode 100644 index 0000000000..f8b9eb0bcf --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/ApcbLibV3Pei/ApcbLibV3Pei.c @@ -0,0 +1,14 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <PiPei.h> +#include <Base.h> +#include <Library/PcdLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PeiServicesLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c new file mode 100644 index 0000000000..cff678d76b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/BaseFabricTopologyRsLib/BaseFabricTopologyRsLib.c @@ -0,0 +1,37 @@ +** @file + Fabric Topology Base Lib implementation + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> + +UINTN +FabricTopologyGetNumberOfProcessorsPresent ( + VOID + ) +{ + return 0; +} + +UINTN +FabricTopologyGetNumberOfRootBridgesOnSocket ( + IN UINTN Socket + ) +{ + return 0; +} + +RETURN_STATUS +EFIAPI +BaseFabricTopologyLibConstructor ( + VOID + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c new file mode 100644 index 0000000000..f72cbe7dff --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/BaseTscTimerLib.c @@ -0,0 +1,8 @@ +/** @file + A Base Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c new file mode 100644 index 0000000000..a155978a5d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/DxeTscTimerLib.c @@ -0,0 +1,35 @@ +/** @file + A Dxe Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> + +/** The constructor function determines the actual TSC frequency. + + First, Get TSC frequency from system configuration table with TSC frequency GUID, + if the table is not found, install it. + This function will always return EFI_SUCCESS. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +DxeTscTimerLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c new file mode 100644 index 0000000000..f70aa3de0e --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/PeiTscTimerLib.c @@ -0,0 +1,11 @@ +/** @file + A Pei Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Library/HobLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c new file mode 100644 index 0000000000..7d14d62e60 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/CcxTscTimerLib/TscTimerLibShare.c @@ -0,0 +1,103 @@ +/** @file + The Timer Library implementation which uses the Time Stamp Counter in the processor. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** Stalls the CPU for at least the specified number of MicroSeconds. + + @param[in] MicroSeconds The minimum number of microseconds to delay. + + @return The value of MicroSeconds input. + +**/ +UINTN +EFIAPI +MicroSecondDelay ( + IN UINTN MicroSeconds + ) +{ + return 0; +} + +/** Stalls the CPU for at least the specified number of NanoSeconds. + + @param[in] NanoSeconds The minimum number of nanoseconds to delay. + + @return The value of NanoSeconds input. + +**/ +UINTN +EFIAPI +NanoSecondDelay ( + IN UINTN NanoSeconds + ) +{ + return 0; +} + +/** Retrieves the current value of the 64-bit free running Time-Stamp counter. + + The properties of the counter can be retrieved by the + GetPerformanceCounterProperties() function. + + @return The current value of the free running performance counter. + +**/ +UINT64 +EFIAPI +GetPerformanceCounter ( + VOID + ) +{ + return 0; +} + +/** Retrieves the 64-bit frequency in Hz and the range of performance counter + values. + + If StartValue is not NULL, then the value that the performance counter starts + with, 0x0, is returned in StartValue. If EndValue is not NULL, then the value + that the performance counter end with, 0xFFFFFFFFFFFFFFFF, is returned in + EndValue. + + The 64-bit frequency of the performance counter, in Hz, is always returned. + + @param[out] StartValue Pointer to where the performance counter's starting value is saved, or NULL. + @param[out] EndValue Pointer to where the performance counter's ending value is saved, or NULL. + + @return The frequency in Hz. + +**/ +UINT64 +EFIAPI +GetPerformanceCounterProperties ( + OUT UINT64 *StartValue, OPTIONAL + OUT UINT64 *EndValue OPTIONAL + ) +{ + return 0; +} + +/** + Converts elapsed ticks of performance counter to time in nanoseconds. + + This function converts the elapsed ticks of running performance counter to + time value in unit of nanoseconds. + + @param Ticks The number of elapsed ticks of running performance counter. + + @return The elapsed time in nanoseconds. + +**/ +UINT64 +EFIAPI +GetTimeInNanoSecond ( + IN UINT64 Ticks + ) +{ + return 0; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c new file mode 100644 index 0000000000..44e23df62f --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmdPciHostBridgeLib/PciHostBridgeLib.c @@ -0,0 +1,95 @@ +/** @file + AMD instance of the PCI Host Bridge Library. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/PciHostBridgeLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciRootBridgeIo.h> +#include <Protocol/PciHostBridgeResourceAllocation.h> + +/** + Sort all root bridges in bus ascending order and set DevicePath UIDs + continuous and ascending from zero + + @param[in,out] RootBridgeList Array of root bridges. + @param[in] Count Count of root bridges in RootBridgeList + + @return All the root bridge instances in an array are sorted in bus order. + DevicePath UID updated to continuous and ascending numbers starting + with 0. +**/ +VOID +EFIAPI +PciHostBridgeSortRootBridges ( + IN PCI_ROOT_BRIDGE *RootBridgeList, + IN UINTN Count + ) +{ +} + +/** + Return all the root bridge instances in an array. + + @param Count Return the count of root bridge instances. + + @return All the root bridge instances in an array. + The array should be passed into PciHostBridgeFreeRootBridges() + when it's not used. +**/ +PCI_ROOT_BRIDGE * +EFIAPI +PciHostBridgeGetRootBridges ( + UINTN *Count + ) +{ + return (PCI_ROOT_BRIDGE *)NULL; +} + +/** + Free the root bridge instances array returned from PciHostBridgeGetRootBridges(). + + @param Bridges The root bridge instances array. + @param Count The count of the array. +**/ +VOID +EFIAPI +PciHostBridgeFreeRootBridges ( + PCI_ROOT_BRIDGE *Bridges, + UINTN Count + ) +{ +} + +/** + Inform the platform that the resource conflict happens. + + @param HostBridgeHandle Handle of the Host Bridge. + @param Configuration Pointer to PCI I/O and PCI memory resource + descriptors. The Configuration contains the resources + for all the root bridges. The resource for each root + bridge is terminated with END descriptor and an + additional END is appended indicating the end of the + entire resources. The resource descriptor field + values follow the description in + EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL + .SubmitResources(). +**/ +VOID +EFIAPI +PciHostBridgeResourceConflict ( + EFI_HANDLE HostBridgeHandle, + VOID *Configuration + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c new file mode 100644 index 0000000000..318f8e5ad7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlArgObjects.c @@ -0,0 +1,154 @@ +/** @file + + Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLARGOBJECTS_FILECODE + +/* + Fill the DataBuffer with correct Arg Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 argument, i.e., Arg1, Arg2 ... Arg6. + + @param[in] ArgN - Argument Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid ArgN provided. +*/ +EFI_STATUS +EFIAPI +InternalAmlArgBuffer ( + IN OUT UINT8 ArgN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (ArgN) { + case 0: + Data[0] = AML_ARG0; + break; + case 1: + Data[0] = AML_ARG1; + break; + case 2: + Data[0] = AML_ARG2; + break; + case 3: + Data[0] = AML_ARG3; + break; + case 4: + Data[0] = AML_ARG4; + break; + case 5: + Data[0] = AML_ARG5; + break; + case 6: + Data[0] = AML_ARG6; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an ArgN Opcode object + + Arg Objects Encoding + ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | Arg6Op + Arg0Op := 0x68 + Arg1Op := 0x69 + Arg2Op := 0x6A + Arg3Op := 0x6B + Arg4Op := 0x6C + Arg5Op := 0x6D + Arg6Op := 0x6E + + @param[in] ArgN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOpArgN ( + IN UINT8 ArgN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "ARGN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlArgBuffer ( + ArgN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + ArgN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c new file mode 100644 index 0000000000..371537c9aa --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlAssistFunctions.c @@ -0,0 +1,151 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLASSISTFUNCTIONS_FILECODE + +/** + Free all the children AML_OBJECT_INSTANCE(s) of ListHead. + Will not free ListHead nor an Object containing ListHead. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlFreeObjectList ( + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Get next node before freeing current Object + Node = GetNextNode (ListHead, Node); + // Free Object + InternalFreeAmlObject (&Object, ListHead); + } + + return EFI_SUCCESS; +} + +/** + Validate that ACPI table is completed and return Table and Size + + @param[in,out] ListHead - Head of linked list of Objects + @param[out] Table - Completed ACPI Table + @param[out] TableSize - Completed ACPI Table size + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_DEVICE_ERROR +**/ +EFI_STATUS +EFIAPI +AmlGetCompletedTable ( + IN OUT LIST_ENTRY *ListHead, + OUT VOID **Table, + OUT UINTN *TableSize + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead cannot be NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + *TableSize = 0; + Node = GetFirstNode (ListHead); + if (!IsNodeAtEnd (ListHead, Node)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Multiple nodes remain, Likely missed an 'AmlClose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } else { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if (!Object->Completed) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Final node not completed: Likely missed an 'AmlCLose' call\n", __func__)); + return EFI_DEVICE_ERROR; + } + + *Table = Object->Data; + *TableSize = Object->DataSize; + } + + return EFI_SUCCESS; +} + +/** + Initialize Table List to work with AmlGenerationLib + + Allocates a LIST_ENTRY linked list item and initializes it. Use + AmlReleaseTableList to free resulting table and LIST_ENTRY. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER + EFI_OUT_OF_RESOURCES +**/ +EFI_STATUS +EFIAPI +AmlInitializeTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ListHead = NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + *ListHead = AllocatePool (sizeof (LIST_ENTRY)); + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to allocate Table List Head\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + InitializeListHead (*ListHead); + + return EFI_SUCCESS; +} + +/** + Release table List + + Releases all elements. Use to free built table and LIST_ENTRY allocated by + AmlInitializeTableList. + + @param[in,out] ListHead - Head of linked list of Objects + + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlReleaseTableList ( + IN OUT LIST_ENTRY **ListHead + ) +{ + if (*ListHead == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NULL ListHead passed in\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + AmlFreeObjectList (*ListHead); + FreePool (*ListHead); + *ListHead = NULL; + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c new file mode 100644 index 0000000000..b7d4f4c9d7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlDataObjects.c @@ -0,0 +1,640 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLDATAOBJECTS_FILECODE + +/* + Creates an allocated buffer with sized data and no Op Code + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] // 0x0000000000000000- 0xFFFFFFFFFFFFFFFF + + Forces max integer size UINT64 + + Caller is responsible for freeing returned buffer. + + @param[in] Integer - Integer value to encode + @param[in] IntegerSize - Size of integer in bytes + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlSizedDataBuffer ( + IN UINT64 Integer, + IN UINTN IntegerSize, + OUT VOID **ReturnData + ) +{ + UINT8 *Data; + + if ((IntegerSize != sizeof (UINT8)) && + (IntegerSize != sizeof (UINT16)) && + (IntegerSize != sizeof (UINT32)) && + (IntegerSize != sizeof (UINT64))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Incorrect integer size=%d requested.\n", __func__, IntegerSize)); + return EFI_INVALID_PARAMETER; + } + + if ((IntegerSize < sizeof (UINT64)) && (Integer >= LShiftU64 (1, IntegerSize * 8))) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer is larger than requestd size.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Max Data Size is 64 bit. Plus one Opcode byte + Data = AllocateZeroPool (sizeof (UINT64)); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + // Already established we only have supported sizes above + switch (IntegerSize) { + case sizeof (UINT8): + *(UINT8 *)Data = (UINT8)Integer; + break; + case sizeof (UINT16): + *(UINT16 *)Data = (UINT16)Integer; + break; + case sizeof (UINT32): + *(UINT32 *)Data = (UINT32)Integer; + break; + case sizeof (UINT64): + *(UINT64 *)Data = (UINT64)Integer; + break; + } + + *ReturnData = (VOID *)Data; + return EFI_SUCCESS; +} + +/* + Calculates the optimized integer value used by AmlOPDataInteger and others + + Forces max integer size UINT64 + + @param[in] Integer - Integer value to encode + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer +*/ +EFI_STATUS +EFIAPI +InternalAmlDataIntegerBuffer ( + IN UINT64 Integer, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *IntegerData; + UINTN IntegerDataSize; + UINT8 *Data = NULL; + UINTN DataSize; + + // Max Data Size is 64 bit. Plus one Opcode byte + IntegerData = AllocateZeroPool (sizeof (UINT64) + 1); + if (IntegerData == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Space Alloc Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + if (Integer == 0) { + // ZeroOp + IntegerDataSize = 1; + IntegerData[0] = AML_ZERO_OP; + } else if (Integer == 1) { + // OneOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONE_OP; + } else if (Integer == (UINT64) ~0x0) { + // OnesOp + IntegerDataSize = 1; + IntegerData[0] = AML_ONES_OP; + } else { + if (Integer >= 0x100000000) { + // QWordConst + IntegerDataSize = sizeof (UINT64) + 1; + IntegerData[0] = AML_QWORD_PREFIX; + } else if (Integer >= 0x10000) { + // DWordConst + IntegerDataSize = sizeof (UINT32) + 1; + IntegerData[0] = AML_DWORD_PREFIX; + } else if (Integer >= 0x100) { + // WordConst + IntegerDataSize = sizeof (UINT16) + 1; + IntegerData[0] = AML_WORD_PREFIX; + } else { + // ByteConst + IntegerDataSize = sizeof (UINT8) + 1; + IntegerData[0] = AML_BYTE_PREFIX; + } + + DataSize = IntegerDataSize - 1; + InternalAmlSizedDataBuffer (Integer, DataSize, (VOID **)&Data); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Integer Data Space Alloc Failed\n", __func__)); + FreePool (IntegerData); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (&IntegerData[1], Data, DataSize); + FreePool (Data); + } + + // Reallocate the pool so size is exact + *ReturnData = (VOID *)IntegerData; + *ReturnDataSize = IntegerDataSize; + + return EFI_SUCCESS; +} + +/** + Creates an optimized integer object + + Forces max integer size UINT64 + + ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | + ConstObj | RevisionOp | DefBuffer + DataObject := ComputationalData | DefPackage | DefVarPackage + DataRefObject := DataObject | ObjectReference | DDBHandle + ByteConst := BytePrefix ByteData + BytePrefix := 0x0A + WordConst := WordPrefix WordData + WordPrefix := 0x0B + DWordConst := DWordPrefix DWordData + DWordPrefix := 0x0C + QWordConst := QWordPrefix QWordData + QWordPrefix := 0x0E + ConstObj := ZeroOp | OneOp | OnesOp + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + ZeroOp := 0x00 + OneOp := 0x01 + OnesOp := 0xFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataInteger ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DATA_INTEGER")); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + Integer, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an Sized Data integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + WordData := ByteData[0:7] ByteData[8:15] + // 0x0000-0xFFFF + DWordData := WordData[0:15] WordData[16:31] + // 0x00000000-0xFFFFFFFF + QWordData := DWordData[0:31] DWordData[32:63] + // 0x0000000000000000-0xFFFFFFFFFFFFFFFF + + @param[in] Integer - Number to be optimized and encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +InternalAmlOPSizedData ( + IN UINT64 Integer, + IN UINTN IntegerSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "SIZED_DATA_INTEGER")); + goto Done; + } + + Object->DataSize = IntegerSize; + Status = InternalAmlSizedDataBuffer ( + Integer, + Object->DataSize, + (VOID **)&(Object->Data) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ACPI Integer 0x%X object\n", __func__, Integer)); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a ByteData integer object for use in Buffer objects. Does not + include opcode. + + ByteData := 0x00 - 0xFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPByteData ( + IN UINT8 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT8), ListHead); +} + +/** + Creates a WordData integer object for use in Buffer objects. Does not + include opcode. + + WordData := 0x0000 - 0xFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPWordData ( + IN UINT16 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT16), ListHead); +} + +/** + Creates a DWordData integer object for use in Buffer objects. Does not + include opcode. + + DWordData := 0x00000000 - 0xFFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDWordData ( + IN UINT32 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT32), ListHead); +} + +/** + Creates a QWordData integer object for use in Buffer objects. Does not + include opcode. + + QWordData := 0x00000000_00000000 - 0xFFFFFFFF_FFFFFFFF + + @param[in] Integer - Number to be placed in object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPQWordData ( + IN UINT64 Integer, + IN OUT LIST_ENTRY *ListHead + ) +{ + return InternalAmlOPSizedData (Integer, sizeof (UINT64), ListHead); +} + +/** + Creates a data string object + + ComputationalData := String + + String := StringPrefix AsciiCharList NullChar + StringPrefix := 0x0D + AsciiCharList := Nothing | <AsciiChar AsciiCharList> + AsciiChar := 0x01 - 0x7F + NullChar := 0x00 + + @param[in] String - String to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + UINT8 *Data; + UINTN DataSize; + UINTN Index; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Validate all characters + DataSize = AsciiStrLen (String); + for (Index = 0; Index < DataSize; Index++) { + if (String[Index] < 0x01) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid character String[%d] : %a\n", + __func__, + Index, + String + )); + return Status; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // AML_STRING_PREFIX + String + NULL Terminator + DataSize += 2; + Data = AllocatePool (DataSize); + if (Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: String Space Allocation %a\n", + __func__, + String + )); + goto Done; + } + + Data[0] = AML_STRING_PREFIX; + CopyMem (&Data[1], String, DataSize - 1); + + // DataString Complete, Put into Object + Object->Data = Data; + Object->DataSize = DataSize; + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a data buffer AML object from an array + + This will take the passed in buffer and generate an AML Object from that + buffer + + @param[in] Buffer - Buffer to be placed in AML Object + @param[in] BufferSize - Size of Buffer to be copied into Object + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPDataBufferFromArray ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Buffer == NULL) || (BufferSize == 0) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Data Buffer object\n", __func__)); + goto Done; + } + + Object->Data = AllocatePool (BufferSize); + Object->DataSize = BufferSize; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Data Buffer allocate failed\n", __func__)); + goto Done; + } + + CopyMem (Object->Data, Buffer, BufferSize); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.36 EISAID (EISA ID String To Integer Conversion Macro) + + Syntax: + EISAID (EisaIdString) => DWordConst + + Arguments: + The EisaIdString must be a String object of the form "UUUNNNN", where "U" + is an uppercase letter and "N" is a hexadecimal digit. No asterisks or other + characters are allowed in the string. + + Description: + Converts EisaIdString, a 7-character text string argument, into its + corresponding 4-byte numeric EISA ID encoding. It can be used when declaring + IDs for devices that have EISA IDs. + + Encoded EISA ID Definition - 32-bits + bits[15:0] - three character compressed ASCII EISA ID. * + bits[31:16] - binary number + * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' + + + Example: + EISAID ("PNP0C09") // This is a valid invocation of the macro. + + @param[in] String - EISA ID string. + @param[in,out] ListHead - Head of Linked List of all AML Objects +**/ +EFI_STATUS +EFIAPI +AmlOPEisaId ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + UINT32 EncodedEisaId; + UINT8 i; + + EncodedEisaId = 0; + + if ((String == NULL) || (ListHead == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, inputs cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AsciiStrLen (String) != 0x7) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid length for 'String' parameter.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // + // Verify String is formatted as "UUUNNNN". + // + for (i = 0; i <= 0x6; i++) { + // + // If first 3 characters are not uppercase alpha or last 4 characters are not hexadecimal + // + if (((i <= 0x2) && (!IS_ASCII_UPPER_ALPHA (String[i]))) || + ((i >= 0x3) && (!IS_ASCII_HEX_DIGIT (String[i])))) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid EISA ID string format!\n", __func__)); + DEBUG ((DEBUG_ERROR, " Input String must be formatted as 'UUUNNNN'.\n")); + return EFI_INVALID_PARAMETER; + } + } + + // + // Convert string to 4-byte EISA ID encoding. + // Ex: 'PNP0A03' encodes to '0x30AD041' + // + EncodedEisaId = ((((String[0] - AML_NAME_CHAR_A + 1) & 0x1f) << 10) + + (((String[1] - AML_NAME_CHAR_A + 1) & 0x1f) << 5) + + (((String[2] - AML_NAME_CHAR_A + 1) & 0x1f) << 0) + + (UINT32)(AsciiStrHexToUint64 (&String[3]) << 16)); + + // + // Swap bytes of upper and lower WORD to format EISA ID with proper endian-ness. + // + EncodedEisaId = Swap4Bytes (EncodedEisaId); + + // + // Insert DWordPrefix into list. + // Note: EncodedEisaId will always be 32-bits, resulting in DWordConst. + // + Status = AmlOPDataInteger (EncodedEisaId, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to create ACPI DWordConst from Encoded EISA ID.\n", __func__)); + return Status; + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c new file mode 100644 index 0000000000..e8ea9d8e84 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlExpressionOpcodes.c @@ -0,0 +1,1294 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLEXPRESSIONOPCODES_FILECODE + +// ---------------------------------------------------------------------------- +// Expression Opcodes Encoding +// ---------------------------------------------------------------------------- +// ExpressionOpcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat | +// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement | +// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit | +// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual | +// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid | +// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod | +// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr | +// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight | +// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer | +// DefToDecimalString | DefToHexString | DefToInteger | DefToString | +// DefWait | DefXOr | MethodInvocation +// ---------------------------------------------------------------------------- + +/** + Creates a Buffer (BufferSize) {Initializer} => Buffer Object + + Initializers must be created between AmlStart and AmlClose Phase + + DefBuffer := BufferOp PkgLength BufferSize ByteList + BufferOp := 0x11 + BufferSize := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] BufferSize - Requested BufferSize, Encoded value will be + MAX (BufferSize OR Child->DataSize) + @param[in,out] ListHead - Linked list has completed Buffer Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBuffer ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN BufferSize, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN InternalBufferSize; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. Have a message with this to be + // very specific + if (BufferSize >= SIZE_4GB) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BufferSize=0x%X >= 4GB\n", __func__, BufferSize)); + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Buffer Object + Status = InternalAppendNewAmlObject (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFER object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer PkgLength object\n", __func__)); + goto Done; + } + + // Start BufferSize + Status = InternalAppendNewAmlObject (&Object, "BUFFERSIZE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BUFFERSIZE object\n", __func__)); + goto Done; + } + + // ByteList is too complicated and must be added outside + break; + + case AmlClose: + // ByteList items should be closed already + + // Close BufferSize + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "BUFFERSIZE", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate BufferSize object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect BufferSize children\n", __func__)); + goto Done; + } + + // Set BufferSize Object to correct value and size. + // BufferSize should be from zero (no Child Data) to MAX of requested + // BufferSize or size required for ChildObject->Data. + InternalBufferSize = MAX (BufferSize, ChildObject->DataSize); + // iASL compiler 20200110 only keeps lower 32 bits of size. We'll error if + // someone requests something >= 4GB size. + if (InternalBufferSize >= SIZE_4GB) { + Status = EFI_BAD_BUFFER_SIZE; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: BufferSize 0x%X >= 4GB\n", + __func__, + InternalBufferSize + )); + goto Done; + } + + Status = InternalAmlDataIntegerBuffer ( + InternalBufferSize, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc BufferSize\n", __func__)); + goto Done; + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate BufferSize\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Buffer object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "BUFFER", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Buffer object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // Buffer must have at least PkgLength BufferSize + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Buffer Data\n", __func__)); + goto Done; + } + + // BufferOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_BUFFER_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a LEqual (Source1, Source2) => Boolean + + Source1 and Source2 operands must be created between AmlStart and AmlClose Phase + + DefLEqual := LequalOp Operand Operand + LequalOp := 0x93 + Operand := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed LEqual Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlLEqual ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the LEqual Object + Status = InternalAppendNewAmlObject (&Object, "LEQUAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start LEQUAL object\n", __func__)); + goto Done; + } + + // Operands are too complicated and must be added outside + break; + + case AmlClose: + + // Close LEqual + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "LEQUAL", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate LEqual object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + // LEqual must have at least two operands + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No LEqual Args\n", __func__)); + goto Done; + } + + // LequalOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Buffer allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = AML_LEQUAL_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + Creates (NumElements) section of a Package: {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + Internal only function no public reference or documentation needed. + + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlNumElements ( + IN AML_FUNCTION_PHASE Phase, + IN OUT UINTN *NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + ChildCount = 0; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Number of Elements Object + Status = InternalAppendNewAmlObject (&Object, "NUM_ELEMENTS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlLocateObjectByIdentifier ( + &Object, + "NUM_ELEMENTS", + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Fail locate NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collect NUM_ELEMENTS children\n", __func__)); + goto Done; + } + + // We do not have to change anything for NumElements >= Child Count + if (*NumElements == 0) { + *NumElements = ChildCount; + } else if (*NumElements < ChildCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements < ChildCount.\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } + + if (*NumElements <= MAX_UINT8) { + Object->DataSize = 1; + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumElements allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = (UINT8)*NumElements; + } else { + Status = InternalAmlDataIntegerBuffer ( + *NumElements, + (VOID **)&Object->Data, + &Object->DataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: calc NumElements\n", __func__)); + goto Done; + } + } + + if ((ChildObject->DataSize != 0) && (ChildObject->Data != NULL)) { + // Make room for ChildObject->Data + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + + ChildObject->DataSize, + Object->Data + ); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: to reallocate NumElements\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + } + + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Package (NumElements) {PackageList} => Package + + Initializers must be created between AmlStart and AmlClose Phase + + DefPackage := PackageOp PkgLength NumElements PackageElementList + PackageOp := 0x12 + DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList + VarPackageOp := 0x13 + NumElements := ByteData + VarNumElements := TermArg => Integer + PackageElementList := Nothing | <PackageElement PackageElementList> + PackageElement := DataRefObject | NameString + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] NumElements - Number of elements in the package. If 0, size + is calculated from the PackageList. + @param[in,out] ListHead - Linked list has completed Package Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlPackage ( + IN AML_FUNCTION_PHASE Phase, + IN UINTN NumElements, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINT8 OpCode; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start the Package Object + Status = InternalAppendNewAmlObject (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PACKAGE object\n", __func__)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package PkgLength object\n", __func__)); + goto Done; + } + + // Start Number of Elements Object + Status = InternalAmlNumElements (AmlStart, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + // PackageList is too complicated and must be added outside + break; + + case AmlClose: + // PackageList items should be closed already + + // Close Number of Elements Object + Status = InternalAmlNumElements (AmlClose, &NumElements, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close NUM_ELEMENTS object\n", __func__)); + goto Done; + } + + if (NumElements <= MAX_UINT8) { + OpCode = AML_PACKAGE_OP; + } else { + OpCode = AML_VAR_PACKAGE_OP; + } + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // Complete Package object with all data + Status = InternalAmlLocateObjectByIdentifier (&Object, "PACKAGE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate PACKAGE object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + // Package must have at least PkgLength NumElements + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: No Package Data\n", __func__)); + goto Done; + } + + // PackageOp and VarPackageOp are both one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Package allocate failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + // Free Child Object since it has been consumed + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a Store expression + + Syntax: + Store (Source, Destination) => DataRefObject Destination = Source => DataRefObject + + Store expression must be created between AmlStart and AmlClose Phase. + + DefStore := StoreOp TermArg SuperName + StoreOp := 0x70 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlStore ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append STORE object\n", __func__)); + goto Done; + } + + // TermArg and SuperName are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlStore(AmlStart,..) and + // AmlStore(AmlClose,...) - when creating the Store expression. + break; + + case AmlClose: + // TermArg and SuperName must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "STORE", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating STORE Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = AML_STORE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left or Right expression + + Syntax: + ShiftLeft (Source, ShiftCount, Reult) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftOp Operand ShiftCount Target + ShiftOp := 0x79 or 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] ShiftOp - Specifies whether to shift left or shift + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlShift ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 ShiftOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append SHIFT object\n", __func__)); + goto Done; + } + + // Operand, ShiftCount, and Target are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlShift(AmlStart,..) and + // AmlShift(AmlClose,...) - when creating the Shift expression. + + break; + + case AmlClose: + // Operand, ShiftCount, and Target must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "SHIFT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating SHIFT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = ShiftOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Shift Left expression + + Syntax: + ShiftLeft (Source, ShiftCount, Result) => Integer + Result = Source << ShiftCount => Integer + Result <<= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftLeft := ShiftLeftOp Operand ShiftCount Target + ShiftLeftOp := 0x79 + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftLeft ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_LEFT_OP, ListHead); + return Status; +} + +/** + Creates a Shift Right expression + + Syntax: + ShiftRight (Source, ShiftCount, Reult) => Integer + Result = Source >> ShiftCount => Integer + Result >>= ShiftCount => Integer + + Shift expression must be created between AmlStart and AmlClose Phase. + + DefShiftRight := ShiftRightOp Operand ShiftCount Target + ShiftRightOp := 0x7A + ShiftCount := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlShiftRight ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlShift (Phase, AML_SHIFT_RIGHT_OP, ListHead); + return Status; +} + +/** + Creates a Find First Set Bit AML object for + both right and left searches. + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetRightBit (Source, Result) => Integer + + Bit Fields must be created between AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + DefFindSetRightBit := FindSetRightBitOp Operand Target + FindSetRightBitOp := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] FindSetOp - Specifies whether to search left or search + right. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlFindSetBit ( + IN AML_FUNCTION_PHASE Phase, + IN UINT8 FindSetOp, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start Store expression + Status = InternalAppendNewAmlObject (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append FIND_SET object\n", __func__)); + goto Done; + } + + // Source and Result are outside the scope of this object. They must be + // defined as part of a multi-tier call - in between AmlFindSet(AmlStart,..) and + // AmlFindSet(AmlClose,...) - when creating the FindSetBit expression. + + break; + + case AmlClose: + // Source and Result must have been created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "FINDSET", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating FIND_SET Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Store Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Store object + Object->Data[0] = FindSetOp; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a FindSetLeftBit AML Object + + Syntax: + FindSetLeftBit (Source, Result) => Integer + + FindSetLeftBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetLeftBit := FindSetLeftBitOp Operand Target + FindSetLeftBitOp := 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetLeftBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_LEFT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a FindSetRightBit AML Object + + Syntax: + FindSetRightBit (Source, Result) => Integer + + FindSetRightBit expression must be created between + AmlStart and AmlClose Phase. + + DefFindSetRightBit := FindSetRightBit Operand Target + FindSetRightBit := 0x82 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlFindSetRightBit ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlFindSetBit (Phase, AML_FIND_SET_RIGHT_BIT_OP, ListHead); + return Status; +} + +/** + Creates a Decrement expression + + Syntax: + Decrement (Minuend) => Integer + Minuend-- => Integer + + Creates object to decrement Minuend. + + DefDecrement := DecrementOp SuperName + DecrementOp := 0x76 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDecrement ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Phase) { + case AmlStart: + // Start decrement expression + Status = InternalAppendNewAmlObject (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append DECREMENT object\n", __func__)); + goto Done; + } + + // Minuend is outside the scope of this object. It must be + // defined as part of a multi-tier call - in between AmlDecrement(AmlStart,..) and + // AmlDecrement(AmlClose,...) - when creating the Decrement expression. + + break; + + case AmlClose: + // Minuend must created and closed by now. + Status = InternalAmlLocateObjectByIdentifier (&Object, "DECREMENT", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating DECREMENT Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Store() has no child data.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Store()\n", __func__)); + goto Done; + } + + // Decrement Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + + // Fill out Decrement object + Object->Data[0] = AML_DECREMENT_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c new file mode 100644 index 0000000000..21deb200e3 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlLocalObjects.c @@ -0,0 +1,158 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLLOCALOBJECTS_FILECODE + +/** + Fill the DataBuffer with correct Local Opcode based on provided argument number + Valid Argument numbers are 0, 1, 2, 3, 4, 5 and 6. + AML supports max 7 Local variables, i.e., Local1, Local2 ... Local6. + + @param[in] LocalN - Local variable Number + @param[out] ReturnData - Allocated DataBuffer with encoded integer + @param[out] ReturnDataSize - Size of ReturnData + + @return EFI_SUCCESS - Successful completion + @return EFI_OUT_OF_RESOURCES - Failed to allocate ReturnDataBuffer + @return EFI_INVALID_PARAMETER - Invalid LocalN provided. +**/ +EFI_STATUS +EFIAPI +InternalAmlLocalBuffer ( + IN OUT UINT8 LocalN, + OUT VOID **ReturnData, + OUT UINTN *ReturnDataSize + ) +{ + UINT8 *Data; + UINTN DataSize; + + Data = AllocateZeroPool (sizeof (UINT8)); + if (Data == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Failed to create Data Buffer.\n", + __func__ + )); + return EFI_OUT_OF_RESOURCES; + } + + DataSize = 1; + switch (LocalN) { + case 0: + Data[0] = AML_LOCAL0; + break; + case 1: + Data[0] = AML_LOCAL1; + break; + case 2: + Data[0] = AML_LOCAL2; + break; + case 3: + Data[0] = AML_LOCAL3; + break; + case 4: + Data[0] = AML_LOCAL4; + break; + case 5: + Data[0] = AML_LOCAL5; + break; + case 6: + Data[0] = AML_LOCAL6; + break; + case 7: + Data[0] = AML_LOCAL7; + break; + default: + FreePool (Data); + return EFI_INVALID_PARAMETER; + } + + *ReturnData = (VOID *)Data; + *ReturnDataSize = DataSize; + + return EFI_SUCCESS; +} + +/** + Creates an LocalN Opcode object + + Local Objects Encoding + LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op + Local0Op := 0x60 + Local1Op := 0x61 + Local2Op := 0x62 + Local3Op := 0x63 + Local4Op := 0x64 + Local5Op := 0x65 + Local6Op := 0x66 + Local7Op := 0x67 + + @param[in] LocalN - Argument Number to be encoded + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail +**/ +EFI_STATUS +EFIAPI +AmlOPLocalN ( + IN UINT8 LocalN, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Start %a object\n", + __func__, + "LOCALN_OPCODE" + )); + goto Done; + } + + Status = InternalAmlLocalBuffer ( + LocalN, + (VOID **)&(Object->Data), + &(Object->DataSize) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: ACPI Argument 0x%X object\n", + __func__, + LocalN + )); + goto Done; + } + + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c new file mode 100644 index 0000000000..0502547a01 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNameString.c @@ -0,0 +1,576 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESTRING_FILECODE + +#define MAX_NAME_SEG_COUNT 255 + +/* + Is character a RootChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a RootChar + @return FALSE - Character is not a RootChar + */ +BOOLEAN +InternalIsRootChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_ROOT_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a ParentPrefixChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a ParentPrefixChar + @return FALSE - Character is not a ParentPrefixChar + */ +BOOLEAN +InternalIsParentPrefixChar ( + IN CHAR8 TestChar + ) +{ + if (TestChar == AML_PARENT_PREFIX_CHAR) { + return TRUE; + } + + return FALSE; +} + +/* + Is character a LeadNameChar = '_', 'A' - 'Z' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a LeadNameChar + @return FALSE - Character is not a LeadNameChar + */ +BOOLEAN +InternalIsLeadNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChars '_', 'A'-'Z' + (TestChar == AML_NAME_CHAR__) || + ((TestChar >= AML_NAME_CHAR_A) && + (TestChar <= AML_NAME_CHAR_Z)) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a DigitChar = '0' - '9' + + @param[in] TestChar - Character to check + + @return TRUE - Character is a DigitChar + @return FALSE - Character is not a DigitChar + */ +BOOLEAN +InternalIsDigitChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed DigitChars '0'-'9' + (TestChar >= AML_DIGIT_CHAR_0) && + (TestChar <= AML_DIGIT_CHAR_9) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameChar = LeadNameChar | DigitChar + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameChar ( + IN CHAR8 TestChar + ) +{ + if ( // Allowed LeadNameChar and DigitChars + InternalIsDigitChar (TestChar) || + InternalIsLeadNameChar (TestChar) + ) + { + return TRUE; + } + + return FALSE; +} + +/* + Is character a NameSeg separator + + @param[in] TestChar - Character to check + + @return TRUE - Character is a NameChar + @return FALSE - Character is not a NameChar + */ +BOOLEAN +InternalIsNameSegSeparator ( + IN CHAR8 TestChar + ) +{ + if (TestChar == '.') { + return TRUE; + } + + return FALSE; +} + +/** + Creates a NameSeg AML object and inserts it into the List + + NameSeg := <leadnamechar namechar namechar namechar> + + NameSegs shorter than 4 characters are filled with trailing underscores + + @param[in] Name - NameSeg + @param[in,out] ListHead - Linked list has NameSeg after call + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlNameSeg ( + IN CHAR8 *Name, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + UINT8 *NameSeg; + UINTN NameLen; + EFI_STATUS Status; + + if (Name == NULL) { + return EFI_INVALID_PARAMETER; + } + + NameLen = AsciiStrLen (Name); + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameSeg = NULL; + // parameter validation + if ((NameLen == 0) || (NameLen > 4)) { + return EFI_INVALID_PARAMETER; + } + + if (!InternalIsLeadNameChar (Name[0])) { + return EFI_INVALID_PARAMETER; + } + + for (UINT8 i = 1; NameLen > 1 && i < NameLen; i++) { + if (!InternalIsNameChar (Name[i])) { + return EFI_INVALID_PARAMETER; + } + } + + NameSeg = AllocateZeroPool (4); + if (NameSeg == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (NameSeg, Name, NameLen); + + if (NameLen < 4) { + SetMem (&NameSeg[NameLen], 4 - NameLen, '_'); + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (Object != NULL) { + if (!EFI_ERROR (Status)) { + Object->Data = NameSeg; + Object->DataSize = 4; + Object->Completed = TRUE; + } else { + InternalFreeAmlObject (&Object, ListHead); + FreePool (NameSeg); + } + } + + return Status; +} + +/** + Creates a Namestring AML Object and inserts it into the linked list + + LeadNameChar := 'A'-'Z' | '_' + DigitChar := '0'-'9' + NameChar := DigitChar | LeadNameChar + RootChar := '\' + ParentPrefixChar := '^' + + 'A'-'Z' := 0x41 - 0x5A + '_' := 0x5F + '0'-'9' := 0x30 - 0x39 + '\' := 0x5C + '^' := 0x5E + + NameSeg := <LeadNameChar NameChar NameChar NameChar> + // Notice that NameSegs shorter than 4 characters are filled with + // trailing underscores ('_'s). + NameString := <RootChar NamePath> | <PrefixPath NamePath> + PrefixPath := Nothing | <'^' PrefixPath> + NamePath := NameSeg | DualNamePath | MultiNamePath | NullName + + DualNamePath := DualNamePrefix NameSeg NameSeg + DualNamePrefix := 0x2E + MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount) + MultiNamePrefix := 0x2F + + SegCount := ByteData + + Note:SegCount can be from 1 to 255. For example: MultiNamePrefix(35) is + encoded as 0x2f 0x23 and followed by 35 NameSegs. So, the total encoding + length will be 1 + 1 + 35*4 = 142. Notice that: DualNamePrefix NameSeg + NameSeg has a smaller encoding than the encoding of: MultiNamePrefix(2) + NameSeg NameSeg + + SimpleName := NameString | ArgObj | LocalObj + SuperName := SimpleName | DebugObj | Type6Opcode + NullName := 0x00 + Target := SuperName | NullName + + @param[in] String - Null Terminated NameString Representation + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlOPNameString ( + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + CHAR8 *NameString; + CHAR8 *NameStringPrefix; + UINTN NameStringBufferSize; + UINTN NameStringSize; + UINTN NameStringPrefixSize; + UINTN NameSegCount; + UINTN StringIndex; + UINTN StringLength; + UINTN NameSegIndex; + BOOLEAN FoundRootChar; + BOOLEAN FoundParentPrefixChar; + BOOLEAN FoundParenthesisOpenChar; + BOOLEAN FoundParenthesisCloseChar; + + if ((String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + NameString = NULL; + FoundRootChar = FALSE; + FoundParentPrefixChar = FALSE; + NameStringBufferSize = 0; + FoundParenthesisOpenChar = FALSE; + FoundParenthesisCloseChar = FALSE; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString %a object\n", __func__, String)); + goto Done; + } + + // Create a buffer to fit NameSeg [4] * max NameSegCount [255] + NameStringBufferSize = 4 * MAX_NAME_SEG_COUNT; + NameString = AllocateZeroPool (NameStringBufferSize); + // Create arbitrarily large RootChar\ParentPrefixChar buffer + NameStringPrefix = AllocateZeroPool (NameStringBufferSize); + + // Calculate length of required space + StringLength = AsciiStrLen (String); + NameStringSize = 0; + NameStringPrefixSize = 0; + NameSegIndex = 0; + NameSegCount = 0; + for (StringIndex = 0; StringIndex < StringLength; StringIndex++) { + if (NameStringPrefixSize >= NameStringBufferSize) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Exceeded ParentPrefixChar support at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (InternalIsRootChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: RootChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains more than 1 RootChar.\n", __func__, String)); + goto Done; + } + + if (FoundParentPrefixChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // RootChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundRootChar = TRUE; + } else if (InternalIsParentPrefixChar (String[StringIndex])) { + if (NameSegCount != 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: ParentPrefixChar at offset=%d of String=%a\n", __func__, StringIndex, String)); + goto Done; + } + + if (FoundRootChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString=%a contains RootChar and ParentPrefixChar.\n", __func__, String)); + goto Done; + } + + // ParentPrefixChar; increment NameStringSize + NameStringPrefix[NameStringPrefixSize] = String[StringIndex]; + NameStringPrefixSize++; + FoundParentPrefixChar = TRUE; + } else if (!InternalIsNameChar (String[StringIndex])) { + if (InternalIsNameSegSeparator (String[StringIndex])) { + if (NameSegIndex == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid NameSeg separator at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + NameSegIndex = 0; + } + } else if (String[StringIndex] == '(') { + if (FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisOpenChar = TRUE; + } else if (String[StringIndex] == ')') { + if (FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Invalid Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if (!FoundParenthesisOpenChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: No Open Parenthesis before offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + FoundParenthesisCloseChar = TRUE; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Unsupported character at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } + } else { + // Must be NameChar + if (FoundParenthesisOpenChar || FoundParenthesisCloseChar) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameChar after Parenthesis at offset=%d of String=%a\n", + __func__, + StringIndex, + String + )); + goto Done; + } else if ((NameSegIndex == 0) && InternalIsDigitChar (String[StringIndex])) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: must be LeadNameChar at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } + + if (NameSegIndex >= 4) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: NameSeg > 4 characters at offset=%d of String=%a'\n", + __func__, + StringIndex, + String + )); + goto Done; + } else { + if (NameSegIndex == 0) { + NameSegCount++; + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: Max NameSegCount=%d reached at offset=%d of String=%a'\n", + __func__, + MAX_NAME_SEG_COUNT, + StringIndex, + String + )); + goto Done; + } + } + + NameString[NameStringSize] = String[StringIndex]; + NameStringSize++; + NameSegIndex++; + if ((StringIndex + 1 >= StringLength) || + !InternalIsNameChar (String[StringIndex + 1])) + { + // Extend in progress NameSeg with '_'s + if (NameSegIndex < 4) { + SetMem (&NameString[NameStringSize], 4 - NameSegIndex, '_'); + NameStringSize += 4 - NameSegIndex; + } + } + } + } + } + + // Create AML Record with NameString contents from above + // Copy in RootChar or ParentPrefixChar(s) + if (NameStringPrefixSize != 0) { + Object->Data = ReallocatePool ( + Object->DataSize, + NameStringPrefixSize, + Object->Data + ); + CopyMem ( + &Object->Data[Object->DataSize], + NameStringPrefix, + NameStringPrefixSize + ); + Object->DataSize += NameStringPrefixSize; + FreePool (NameStringPrefix); + } + + // Set up for Dual/MultiName Prefix + if (NameSegCount > MAX_NAME_SEG_COUNT) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Exceeded MaxNameSegCount in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 0) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: ERROR: Must be at least one NameSeg in NameString=%a\n", __func__, String)); + goto Done; + } else if (NameSegCount == 1) { + // Single NameSeg + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize, + Object->Data + ); + } else if (NameSegCount == 2) { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 1, + Object->Data + ); + Object->Data[Object->DataSize] = AML_DUAL_NAME_PREFIX; + Object->DataSize += 1; + } else { + Object->Data = ReallocatePool ( + Object->DataSize, + Object->DataSize + NameStringSize + 2, + Object->Data + ); + Object->Data[Object->DataSize] = AML_MULTI_NAME_PREFIX; + Object->Data[Object->DataSize + 1] = NameSegCount & 0xFF; + Object->DataSize += 2; + } + + // Copy NameString data over. From above must be at least one NameSeg + CopyMem (&Object->Data[Object->DataSize], NameString, NameStringSize); + Object->DataSize += NameStringSize; + FreePool (NameString); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + if (NameString != NULL) { + FreePool (NameString); + } + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c new file mode 100644 index 0000000000..37ae9319be --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamedObject.c @@ -0,0 +1,2138 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMEDOBJECT_FILECODE + +#define METHOD_ARGS_MAX 7 +#define MAX_SYNC_LEVEL 0x0F +#define GENERIC_FIELD_IDENTIFIER "FIELD" + +/** + Creates a Device (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := DeviceOp PkgLength NameString TermList + NameOp := ExtOpPrefix 0x82 + ExtOpPrefix := 0x5B + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDevice ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Device for %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, String)); + goto Done; + } + + // Device Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_DEVICE_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an AccessField + + AccessField := 0x01 AccessType AccessAttrib + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start ACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (3); + // AML_ACCESSFIELD_OP + AccessType + AccessAttrib + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for ACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->DataSize = 3; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an ExtendedAccessField + + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Specifies the access length for the field member + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlExtendedAccessField ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + + // Start new AML object + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start EXTENDEDACCESSFIELD object\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (4); + // AML_EXTACCESSFIELD_OP + AccessType + AccessAttrib + AccessLength + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for EXTENDEDACCESSFIELD\n", __func__)); + goto Done; + } + + Object->Data[0] = AML_FIELD_EXT_ACCESS_OP; + Object->Data[1] = (UINT8)AccessType; + Object->Data[2] = (UINT8)AccessAttribute; + Object->Data[3] = AccessLength; + Object->DataSize = 4; + + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an AccessAs Field Unit + + AccessAs (AccessType, AccessAttribute) + AccessAs (AccessType, AccessAttribute (AccessLength)) + + AccessField := 0x01 AccessType AccessAttrib + AccessType := ByteData // Bits 0:3 - Same as AccessType bits of FieldFlags. + // Bits 4:5 - Reserved + // Bits 7:6 - 0 = AccessAttrib = Normal Access Attributes + // 1 = AccessAttrib = AttribBytes (x) + // 2 = AccessAttrib = AttribRawBytes (x) + // 3 = AccessAttrib = AttribRawProcessBytes (x) + + // x' is encoded as bits 0:7 of the AccessAttrib byte. + The description of bits 7:6 is incorrect and if AttribBytes, + AttribRawBytes, or AttribRawProcessBytes are used here, an + ExtendedAccessField is used with the following definitions + ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib AccessLength + ExtendedAccessAttrib := ByteData // 0x0B AttribBytes + // 0x0E AttribRawBytes + // 0x0F AttribRawProcess + + AccessAttrib := ByteData // If AccessType is BufferAcc for the SMB or + // GPIO OpRegions, AccessAttrib can be one of + // the following values: + // 0x02 AttribQuick + // 0x04 AttribSendReceive + // 0x06 AttribByte + // 0x08 AttribWord + // 0x0A AttribBlock + // 0x0C AttribProcessCall + // 0x0D AttribBlockProcessCall + + @param[in] AccessType - Access type for field member + @param[in] AccessAttribute - Access attribute for field member + @param[in] AccessLength - Only used if AccessAttribute is AttribBytes, + AttribRawBytes, or AttribRawProcessBytes. + Specifies the access length for the field member + Otherwise, ignored. + @param[in,out] ListHead - Linked list containing AML objects + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAccessAs ( + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_ACCESS_ATTRIBUTE_KEYWORDS AccessAttribute, + IN UINT8 AccessLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // AcessType parameter check + if (AccessType > BufferAcc) { + return EFI_INVALID_PARAMETER; + } + + // AccessAttrib parameter checking + if ((AccessAttribute >= AttribNormal) && (AccessAttribute <= AttribBlock)) { + if ((AccessAttribute & 1) == 1) { + return EFI_INVALID_PARAMETER; + } + } else if (AccessAttribute > AttribRawProcessBytes) { + return EFI_INVALID_PARAMETER; + } + + // if AccessAttrib requires a length parameter, then an ExtendedAccessField is used + switch (AccessAttribute) { + case AttribBytes: + case AttribRawBytes: + case AttribRawProcessBytes: + Status = InternalAmlExtendedAccessField (AccessType, AccessAttribute, AccessLength, ListHead); + break; + default: + Status = InternalAmlAccessField (AccessType, AccessAttribute, ListHead); + break; + } + + return Status; +} + +/** + Creates an External Object + + External (ObjectName, ObjectType, ReturnType, ParameterTypes) + + Note: ReturnType is not used for AML encoding and is therefore not passed in + to this function. + ParameterTypes is only used if the ObjectType is a MethodObj. It + specifies MethodObj's argument types in a list. For the purposes of + this library, we are passing in the the number of input parameters for + that MethodObj. + + DefExternal := ExternalOp NameString ObjectType ArgumentCount + ExternalOp := 0x15 + ObjectType := ByteData + ArgumentCount := ByteData (0 - 7) + + @param[in] Name - Object name + @param[in] ObjectType - Type of object declared + @param[in] NumArgs - Only used if ObjectType is MethodObj. + Specifies the number of input parameters for + that MethodObj. + Otherwise, ignored. + @param[in,out] ListHead - Linked list that has completed External Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPExternal ( + IN CHAR8 *Name, + IN UINT8 ObjectType, + IN UINT8 NumArgs, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (ObjectType >= InvalidObj) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start EXTERNAL object + Status = InternalAppendNewAmlObject (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a NameString object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "EXTERNAL", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, Name)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 3); + // AML_EXTERNAL_OP + Name + ObjectType + ArgumentCount + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->DataSize = 0; + Object->Data[0] = AML_EXTERNAL_OP; + Object->DataSize++; + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + Object->Data[Object->DataSize] = ObjectType; + Object->DataSize++; + Object->Data[Object->DataSize] = NumArgs; + Object->DataSize++; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Locates the AML object that holds the cumulative offset term. + This is the node directly after the node designated by + GENERIC_FIELD_IDENTIFIER in Object->Data. + + @param[out] ReturnObject - Object that contains the offset term + @param[in,out] ListHead - Linked list that contains the GENERIC_FIELD_IDENTIFIER + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateOffsetTerm ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + CHAR8 *Identifier; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + Identifier = GENERIC_FIELD_IDENTIFIER; + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + break; + } + } while (Node != ListHead); + + // Check to make sure FIELD is found, otherwise error + if ((Object->DataSize == 0) || + (Object->DataSize != IdentifierSize) || + CompareMem ( + Object->Data, + Identifier, + (MAX (Object->DataSize, IdentifierSize) != 0) + )) + { + return EFI_DEVICE_ERROR; + } + + // Have found FIELD + Node = GetNextNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Offset (ByteOffset) + + Creates a ReservedField if the passed ByteOffset is larger than + the previous bit length value optionally specified by an AmlOPFieldListItem, + or another Offset call. All offsets are defined starting from zero, based at + the starting address of the parent Operation Region. + + ReservedField := 0x00 PkgLength + + @param[in] ByteLength -Byte offset of the next defined field within + the parent Operation Region + @param[in,out] ListHead - Linked list has completed Offset object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOffset ( + IN UINT32 ByteOffset, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + UINT8 *PkgLength; + UINTN DataLength; + EFI_STATUS Status; + UINT64 InternalOffsetData; + UINT64 BitCount; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + InternalOffsetData = 0; + BitCount = LShiftU64 (ByteOffset, 3); + Object = NULL; + OffsetObject = NULL; + PkgLength = NULL; + + // Find and read internal offset data + Status = InternalAmlLocateOffsetTerm (&OffsetObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term\n", __func__)); + goto Done; + } + + InternalOffsetData = *(UINT64 *)OffsetObject->Data; + + if (InternalOffsetData > BitCount) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid backwards offset\n", __func__)); + Status = EFI_INVALID_PARAMETER; + goto Done; + } else if (InternalOffsetData == BitCount) { + // Do not need to append any reserved fields + Status = EFI_SUCCESS; + goto Done; + } + + // update internal offset value to new offset + *(UINT64 *)OffsetObject->Data = BitCount; + + // take difference to find how many bits to reserve + BitCount = BitCount - InternalOffsetData; + + // Create new object for the offset data, add pkglength encoding + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: appending new AML object\n", __func__)); + goto Done; + } + + Status = InternalAmlBitPkgLength ((UINT32)BitCount, &PkgLength, &DataLength); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: internal AML PkgLength\n", __func__)); + goto Done; + } + + Object->DataSize = DataLength + 1; // add one for Reserved Field Indicator + Object->Data = AllocateZeroPool (Object->DataSize); + + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for Offset\n", __func__)); + goto Done; + } + + Object->Data[0] = 0; + CopyMem (&Object->Data[1], PkgLength, DataLength); // read internal offset data + Object->Completed = TRUE; + FreePool (PkgLength); + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a NamedField or a ReservedField, depending on the + parameters. + + To create a NamedField item pass in the NameSeg and Bitlength + as in ASL. To create a ReservedField pass "" as the Name. + Must be used inside a Field or IndexField TermList. + + NamedField := NameSeg PkgLength + ReservedField := 0x00 PkgLength + + @param[in] Name - Field NameSeg + @param[in] BitLength - Length of field item in bits + @param[in,out] ListHead - Linked list has completed FieldUnitItem + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPFieldUnit ( + IN CHAR8 *Name, + IN UINT32 BitLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *OffsetObject; + EFI_STATUS Status; + + if ((ListHead == NULL) || (Name == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + OffsetObject = NULL; + + if (AsciiStrLen (Name) == 0) { + if (BitLength > 0) { + // Prepend a 0 to the list + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->Data = AllocateZeroPool (1); + Object->DataSize = 1; + Object->Completed = TRUE; + } else { + Status = EFI_SUCCESS; + goto Done; + } + } else { + // add NameSeg to List + Status = InternalAmlNameSeg (Name, ListHead); + } + + if (EFI_ERROR (Status)) { + goto Done; + } + + // Locate and update internal Offset term + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating offset term for %a object\n", __func__, Name)); + goto Done; + } + + *(UINT64 *)Object->Data += BitLength; // write + + // Add BitLength as a PkgLength term + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlBitPkgLength (BitLength, &Object->Data, &Object->DataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Appending BitLength for %a object\n", __func__, Name)); + goto Done; + } + + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&OffsetObject, ListHead); + } + + return Status; +} + +/** + Creates a Field + + Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefField := FieldOp PkgLength NameString FieldFlags FieldList + FieldOp := ExtOpPrefix 0x81 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Field NameString + @param[in] AccessType - Access Type for field + @param[in] LockRule - Lock rule for field + @param[in] UpdateRule - Update rule for field + @param[in,out] ListHead - Linked list has completed Field Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (Name == NULL) || (AsciiStrLen (Name) == 0)) { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field for %a object\n", __func__, Name)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Unable to append AML object.\n", __func__)); + goto Done; + } + + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Field internal offset %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, Name)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, Name)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a BankField + + BankField (RegionName, BankName, BankValue, AccessType, LockRule, UpdateRule) {FieldUnitList} + FieldUnitList must be added between AmlStart and AmlClose phase + + DefBankField := BankFieldOp PkgLength NameString NameString BankValue FieldFlags FieldList + BankFieldOp := ExtOpPrefix 0x87 + BankValue := TermArg => Integer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] RegionName - Name of host Operation Region + @param[in] BankName - Name of bank selection register + @param[in] BankValue - Bank Selection ID + @param[in] AccessType - Access Type as in Field + @param[in] LockRule - Lock rule as in Field + @param[in] UpdateRule - Update rule as in Field + @param[in,out] ListHead - Linked list has completed BankField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlBankField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *RegionName, + IN CHAR8 *BankName, + IN UINT64 BankValue, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || + (BankName == NULL) || (AsciiStrLen (BankName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start BankField internal offset %a object\n", __func__, BankName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required Region NameString + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, RegionName)); + goto Done; + } + + // Insert required Bank NameString + Status = AmlOPNameString (BankName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, BankName)); + goto Done; + } + + // Insert required BankValue integer + Status = AmlOPDataInteger (BankValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Adding BankValue Integer for %a object\n", __func__, BankName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, BankName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameStrings completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, BankName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, BankName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, BankName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, BankName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, BankName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, BankName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_BANK_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates an IndexField + + IndexField (IndexName, DataName, AccessType, LockRule, UpdateRule) {FieldUnitList} + + FieldUnitList must be added between AmlStart and AmlClose phase + + DefIndexField := IndexFieldOp PkgLength NameString NameString FieldFlags FieldList + IndexFieldOp := ExtOpPrefix 0x86 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] IndexName - Name of Index FieldUnit + @param[in] DataName - Name of Data FieldUnit + @param[in] AccessType - Access Type for the FieldUnit + @param[in] LockRule - Lock rule for the FieldUnit + @param[in] UpdateRule - Update rule for the FieldUnit + @param[in,out] ListHead - Linked list has completed IndexField Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIndexField ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *IndexName, + IN CHAR8 *DataName, + IN EFI_ACPI_FIELD_ACCESS_TYPE_KEYWORDS AccessType, + IN EFI_ACPI_FIELD_LOCK_RULE_KEYWORDS LockRule, + IN EFI_ACPI_FIELD_UPDATE_RULE_KEYWORDS UpdateRule, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 FieldFlags; + UINTN ChildCount; + + if ((ListHead == NULL) || (IndexName == NULL) || (AsciiStrLen (IndexName) == 0) || + (DataName == NULL) || (AsciiStrLen (DataName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // parameter validation + if ((Phase > AmlClose) || (AccessType > BufferAcc) || (LockRule > Lock) || (UpdateRule > WriteAsZeros)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert internal offset counter + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + Object->DataSize = sizeof (UINT64); + Object->Data = AllocateZeroPool (Object->DataSize); + Object->Completed = TRUE; + if (EFI_ERROR (Status) || (Object->Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start IndexField internal offset %a object\n", __func__, IndexName)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Index NameString + Status = AmlOPNameString (IndexName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, IndexName)); + goto Done; + } + + // Insert required Data NameString + Status = AmlOPNameString (DataName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, DataName)); + goto Done; + } + + // Add Field Flags + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start FIELD_FLAGS for %a object\n", __func__, IndexName)); + goto Done; + } + + // Field Flags is one byte + Object->DataSize = 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + FieldFlags = (UINT8)((UpdateRule << 5) | (LockRule << 4) | AccessType); + + Object->Data[0] = FieldFlags; + Object->Completed = TRUE; + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, IndexName)); + goto Done; + } + + // Remove internal offset counter + Status = InternalAmlLocateOffsetTerm (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locating internal offset term%a\n", __func__, IndexName)); + goto Done; + } + + Status = InternalFreeAmlObject (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: removing offset term%a\n", __func__, IndexName)); + goto Done; + } + + // remove original field identifier data + Status = InternalAmlLocateObjectByIdentifier (&Object, GENERIC_FIELD_IDENTIFIER, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, IndexName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, IndexName)); + goto Done; + } + + // Field Op is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, IndexName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_INDEX_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + OperationRegion (RegionName, RegionSpace, Offset, Length) + + DefOpRegion := OpRegionOp NameString RegionSpace RegionOffset RegionLen + OpRegionOp := ExtOpPrefix 0x80 + RegionSpace := + ByteData // 0x00 SystemMemory + // 0x01 SystemIO + // 0x02 PCI_Config + // 0x03 EmbeddedControl + // 0x04 SMBus + // 0x05 System CMOS + // 0x06 PciBarTarget + // 0x07 IPMI + // 0x08 GeneralPurposeIO + // 0x09 GenericSerialBus + // 0x0A PCC + // 0x80-0xFF: OEM Defined + RegionOffset := TermArg => Integer + RegionLen := TermArg => Integer + + @param[in] RegionName - Name for the Operation Region + @param[in] RegionSpace - Region Space type + @param[in] Offset - Offset within the selected RegionSpace at which the + region starts (byte-granular) + @param[in] Length - Length of the region in bytes. + @param[in,out] ListHead - Linked list head + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPOperationRegion ( + IN CHAR8 *RegionName, + IN GENERIC_ADDRESS_SPACE_ID RegionSpace, + IN UINT64 Offset, + IN UINT64 Length, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_STATUS Status; + + // Input parameter validation + if ((RegionName == NULL) || (AsciiStrLen (RegionName) == 0) || (ListHead == NULL) || + ((RegionSpace > PCC) && (RegionSpace < 0x80)) || (RegionSpace > 0xFF)) + { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + ChildObject = NULL; + Status = EFI_DEVICE_ERROR; + + Status = InternalAppendNewAmlObject (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start OpRegion for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPNameString (RegionName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Name String for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPByteData ((UINT8)RegionSpace, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Region space byte data for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Offset, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Offset data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = AmlOPDataInteger (Length, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Length data integer for %a object\n", __func__, RegionName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "OPREGION", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, RegionName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, RegionName)); + goto Done; + } + + // OpRegion Opcode is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, RegionName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_REGION_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a CreateField AML Object and inserts it into the linked list + + Syntax: + CreateField ( SourceBuffer, BitIndex, NumBits, FieldName ) + + DefCreateField := CreateFieldOp SourceBuff BitIndex NumBits NameString + CreateFieldOp := ExtOpPrefix 0x13 + ExtOpPrefix := 0x5B + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + NumBits := TermArg -> Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer field object + @param[in] BitIndex, - Starting bit index place the new buffer + @param[in] NumBits, - Number of bits to reserve + @param[in] FieldName, - The new buffer field object to be created in SourceBuffer + @param[in,out] ListHead - Linked list has completed CreateField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN UINT64 NumBits, + IN CHAR8 *FieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + Object = NULL; + + if ((SourceBuffer == NULL) || (FieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + ChildObject = NULL; + Status = InternalAppendNewAmlObject (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (BitIndex, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: BitIndex for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPDataInteger (NumBits, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NumBits for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = AmlOPNameString (FieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FieldName)); + goto Done; + } + + // CreateFieldOp is two bytes + Object->DataSize = ChildObject->DataSize + 2; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FieldName)); + goto Done; + } + + Object->Data[0] = AML_EXT_OP; + Object->Data[1] = AML_EXT_CREATE_FIELD_OP; + CopyMem ( + &Object->Data[2], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Internal function used to create a CreateBit|Byte|Word|DWord|QWordField objects + and insert them into the linked list + + @param[in] SourceBuffer, - Buffer to insert the new buffer fixed field object + @param[in] Index, - Starting index to place the new buffer + @param[in] FixedFieldName, - Name of the FixedField + @param[in] OpCode, - AML opcode for the Create_Field encoding + @param[in,out] ListHead - Linked list has completed CreateFixedField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +InternalAmlCreateFixedField ( + IN CHAR8 *SourceBuffer, + IN UINT64 Index, + IN CHAR8 *FixedFieldName, + IN UINT8 OpCode, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + ChildObject = NULL; + + if ((SourceBuffer == NULL) || (FixedFieldName == NULL) || (ListHead == NULL) || + (AsciiStrLen (SourceBuffer) == 0) || (AsciiStrLen (FixedFieldName) == 0)) + { + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObject (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: CreateField for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Check if Localx Buffer + if (AsciiStrnCmp (SourceBuffer, "Local", 5) == 0) { + if ((SourceBuffer[5] >= '0') && (SourceBuffer[5] <= '9')) { + Status = AmlOPLocalN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[5]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: LocalN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + // Check if Argx Buffer + } else if (AsciiStrnCmp (SourceBuffer, "Arg", 3) == 0) { + if ((SourceBuffer[3] >= '0') && (SourceBuffer[3] <= '9')) { + Status = AmlOpArgN ((UINT8)AsciiStrDecimalToUintn (&SourceBuffer[3]), ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ArgN for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + } else { + Status = AmlOPNameString (SourceBuffer, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: NameString for %a object\n", __func__, FixedFieldName)); + goto Done; + } + } + + Status = AmlOPDataInteger (Index, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Index for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = AmlOPNameString (FixedFieldName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: FieldName for %a object\n", __func__, FixedFieldName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "CreateFixedField", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, FixedFieldName)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, FixedFieldName)); + goto Done; + } + + // CreateWordFieldOp is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, FixedFieldName)); + goto Done; + } + + Object->Data[0] = OpCode; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + Creates a CreateBitField AML Object and inserts it into the linked list + + Syntax: + CreateBitField (SourceBuffer, BitIndex, BitFieldName) + + DefCreateBitField := CreateBitFieldOp SourceBuff BitIndex NameString + CreateBitFieldOp := 0x8D + SourceBuff := TermArg => Buffer + BitIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer bit field object + @param[in] BitIndex, - Starting bit index to place the new buffer + @param[in] BitFieldName, - Name of the BitField + @param[in,out] ListHead - Linked list has completed CreateBitField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateBitField ( + IN CHAR8 *SourceBuffer, + IN UINT64 BitIndex, + IN CHAR8 *BitFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, BitIndex, BitFieldName, AML_CREATE_BIT_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateByteField AML Object and inserts it into the linked list + + Syntax: + CreateByteField ( SourceBuffer, ByteIndex, ByteFieldName ) + + DefCreateByteField := CreateByteFieldOp SourceBuff ByteIndex NameString + CreateByteFieldOp := 0x8C + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer byte field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] ByteFieldName, - Name of the ByteField + @param[in,out] ListHead - Linked list has completed CreateByteField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateByteField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *ByteFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, ByteFieldName, AML_CREATE_BYTE_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateDWordField AML Object and inserts it into the linked list + + Syntax: + CreateDWordField ( SourceBuffer, ByteIndex, DWordFieldName ) + + DefCreateDWordField := CreateDWordFieldOp SourceBuff ByteIndex NameString + CreateDWordFieldOp := 0x8A + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer DWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] DWordFieldName, - Name of the DWordField + @param[in,out] ListHead - Linked list has completed CreateDWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateDWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *DWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, DWordFieldName, AML_CREATE_DWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateQWordField AML Object and inserts it into the linked list + + Syntax: + CreateQWordField ( SourceBuffer, ByteIndex, QWordFieldName ) + + DefCreateQWordField := CreateQWordFieldOp SourceBuff ByteIndex NameString + CreateQWordFieldOp := 0x8F + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to insert the new buffer QWord field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] QWordFieldName, - Name of the QWordField + @param[in,out] ListHead - Linked list has completed CreateQWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateQWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *QWordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, QWordFieldName, AML_CREATE_QWORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a CreateWordField AML Object and inserts it into the linked list + + Syntax: + CreateWordField ( SourceBuffer, ByteIndex, WordFieldName ) + + DefCreateWordField := CreateWordFieldOp SourceBuff ByteIndex NameString + CreateWordFieldOp := 0x8B + SourceBuff := TermArg => Buffer + ByteIndex := TermArg => Integer + + @param[in] SourceBuffer, - Buffer to house the new buffer word field object + @param[in] ByteIndex, - Starting byte index to place the new buffer + @param[in] WordFieldName, - Name of the WordField + @param[in,out] ListHead - Linked list has completed CreateWordField object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPCreateWordField ( + IN CHAR8 *SourceBuffer, + IN UINT64 ByteIndex, + IN CHAR8 *WordFieldName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlCreateFixedField (SourceBuffer, ByteIndex, WordFieldName, AML_CREATE_WORD_FIELD_OP, ListHead); + return Status; +} + +/** + Creates a Method + + Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, + ParameterTypes) {TermList} + + TermList must be created between AmlStart and AmlClose Phase + + Note: ReturnType and ParameterTypes are not used for AML encoding + and are therefore not passed in to this function. + + DefMethod := MethodOp PkgLength NameString MethodFlags TermList + MethodOp := 0x14 + MethodFlags := ByteData // bit 0-2: ArgCount (0-7) + // bit 3: SerializeFlag + // 0 NotSerialized + // 1 Serialized + // bit 4-7: SyncLevel (0x00-0x0f) + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] Name - Method name + @param[in] NumArgs - Number of arguments passed in to method + @param[in] SerializeRule - Flag indicating whether method is serialized + or not + @param[in] SyncLevel - synchronization level for the method (0 - 15), + use zero for default sync level. + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlMethod ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *Name, + IN UINT8 NumArgs, + IN METHOD_SERIALIZE_FLAG SerializeRule, + IN UINT8 SyncLevel, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 MethodFlags; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (Name == NULL) || + (NumArgs > METHOD_ARGS_MAX) || + (SyncLevel > MAX_SYNC_LEVEL) || + (SerializeRule >= FlagInvalid) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Method for %a object\n", __func__, Name)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (Name, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, Name)); + goto Done; + } + + // Add Method Flags + Status = InternalAppendNewAmlObject (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + // Add Method Flags + Status = InternalAmlLocateObjectByIdentifier (&Object, "METHOD_FLAGS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate METHOD_FLAGS for %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a METHOD_FLAGS child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Flags is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + MethodFlags = NumArgs & 0x07; + if (SerializeRule) { + MethodFlags |= BIT3; + } + + MethodFlags |= (SyncLevel & 0x0F) << 4; + Object->Data[0] = MethodFlags; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + // Required NameString completed in one phase call + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, Name)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "Method", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, Name)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a child data collection.\n", __func__, Name)); + goto Done; + } + + // Method Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, Name)); + goto Done; + } + + Object->Data[0] = AML_METHOD_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&ChildObject, ListHead); + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c new file mode 100644 index 0000000000..afe51cdcf2 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlNamespaceModifierObjects.c @@ -0,0 +1,360 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLNAMESPACEMODIFIEROBJECTS_FILECODE + +/** + Creates a Scope (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefScope := ScopeOp PkgLength NameString TermList + ScopeOp := 0x10 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Location + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlScope ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start PkgLength for %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Insert NameString for %a object\n", __func__, String)); + goto Done; + } + + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close PkgLength for %a object\n", __func__, String)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + // Scope Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_SCOPE_OP; + CopyMem (&Object->Data[1], ChildObject->Data, ChildObject->DataSize); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Name (ObjectName, Object) + + Object must be created between AmlStart and AmlClose Phase + + DefName := NameOp NameString ChildObjectData + NameOp := 0x08 + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] String - Object name + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlName ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *String, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (String == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, String)); + goto Done; + } + + // Insert required NameString + Status = AmlOPNameString (String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start NameString for %a object\n", __func__, String)); + goto Done; + } + + break; + case AmlClose: + // DataRefObject should be closed already + + Status = InternalAmlLocateObjectByIdentifier (&Object, String, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, String)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, String)); + goto Done; + } + + Object->Data = AllocatePool (ChildObject->DataSize + 1); + // Name Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, String)); + goto Done; + } + + Object->Data[0] = AML_NAME_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates an Alias (SourceObject, AliasObject) + + DefAlias := AliasOp NameString NameString + AliasOp := 0x06 + + @param[in] SourceName - Any named Source Object NameString + @param[in] AliasName - Alias Object NameString + @param[in,out] ListHead - Linked list has completed the Alias Object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPAlias ( + IN CHAR8 *SourceName, + IN CHAR8 *AliasName, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((SourceName == NULL) || (AliasName == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + // Start ALIAS object + Status = InternalAppendNewAmlObject (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot append ALIAS object\n", __func__)); + goto Done; + } + + // Insert required Object (to be aliased) NameString + Status = AmlOPNameString (SourceName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, SourceName)); + goto Done; + } + + // Insert required Alias NameString + Status = AmlOPNameString (AliasName, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create NameString: %a \n", __func__, AliasName)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, "ALIAS", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot locate ALIAS object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, SourceName)); + goto Done; + } + + Object->Data = AllocateZeroPool (ChildObject->DataSize + 1); + // Alias Op is one byte + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, SourceName)); + goto Done; + } + + Object->Data[0] = AML_ALIAS_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c new file mode 100644 index 0000000000..279bfc782d --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlObjectsDebug.c @@ -0,0 +1,144 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLOBJECTSDEBUG_FILECODE + +/** + DEBUG print a (VOID *)buffer in an array of HEX bytes + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + + @param[in] Buffer - Buffer containing buffer + @param[in] BufferSize - Number of bytes to print + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintBuffer ( + IN VOID *Buffer, + IN UINTN BufferSize + ) +{ + UINTN Column; + UINTN Index; + UINTN NumberOfColumns; + UINT8 *Data; + + Data = Buffer; + NumberOfColumns = 16; + // Header + DEBUG ((DEBUG_VERBOSE, " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n")); + for (Index = 0; Index < BufferSize;) { + // Row Counter + DEBUG ((DEBUG_VERBOSE, "%4X ", Index)); + + // Hex ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + DEBUG ((DEBUG_VERBOSE, " %02X", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, " ")); + } + } + + DEBUG ((DEBUG_VERBOSE, " ")); + // Ascii ouput + for (Column = 0; Column < NumberOfColumns; Column++) { + if (Index + Column < BufferSize) { + // Only print ACPI acceptable characters + if (((Data[Index + Column] >= 0x30) && // '0' - '9' + (Data[Index + Column] <= 0x39)) || + ((Data[Index + Column] >= 0x41) && // 'A' - 'Z' + (Data[Index + Column] <= 0x5A)) || + (Data[Index + Column] == 0x5C) || // '\' + (Data[Index + Column] == 0x5F) || // '_' + (Data[Index + Column] == 0x5E) // '^' + ) + { + DEBUG ((DEBUG_VERBOSE, "%c", Data[Index + Column])); + } else { + DEBUG ((DEBUG_VERBOSE, ".")); + } + } + } + + Index += NumberOfColumns; + DEBUG ((DEBUG_VERBOSE, "\n")); + } + + return EFI_SUCCESS; +} + +/** + DEBUG print an AML Object including an array of HEX bytes for the data + + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 0000 54 48 49 53 20 49 53 20 41 20 53 41 4D 50 4C 45 THIS IS A SAMPLE + 0010 5F 42 55 46 46 45 52 01 02 5E 5C 30 31 _BUFFER..^\01 + Completed=(TRUE|FALSE) + + @param[in] Object - AML_OBJECT_INSTANCE + + @retval EFI_SUCCESS, EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintObject ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if ((Object == NULL) || (Object->Signature != AML_OBJECT_INSTANCE_SIGNATURE)) { + return EFI_INVALID_PARAMETER; + } + + DEBUG (( + DEBUG_VERBOSE, + "Object=0x%X, Size=0x%d\n", + (UINTN)Object, + Object->DataSize + )); + AmlDebugPrintBuffer (Object->Data, Object->DataSize); + DEBUG ((DEBUG_VERBOSE, "Completed=%a\n", Object->Completed ? "TRUE" : "FALSE")); + DEBUG ((DEBUG_VERBOSE, "\n")); + return EFI_SUCCESS; +} + +/** + DEBUG print a linked list of AML buffer Objects in an array of HEX bytes + + @param[in] ListHead - Head of AML_OBJECT_INSTANCE Linked List +**/ +EFI_STATUS +EFIAPI +AmlDebugPrintLinkedObjects ( + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + + if (ListHead == NULL) { + return EFI_INVALID_PARAMETER; + } + + DEBUG ((DEBUG_VERBOSE, "Printing AML_OBJECT_INSTANCE Linked List\n")); + Node = GetNextNode (ListHead, ListHead); + while (Node != ListHead) { + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + AmlDebugPrintObject (Object); + Node = GetNextNode (ListHead, Node); + } + + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c new file mode 100644 index 0000000000..85d184b759 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlPkgLength.c @@ -0,0 +1,267 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLPKGLENGTH_FILECODE + +#define MAX_ONE_BYTE_PKG_LENGTH 63 +#define ONE_BYTE_PKG_LENGTH_ENCODING 0x00 +#define ONE_BYTE_NIBBLE_MASK 0x3F + +#define MAX_TWO_BYTE_PKG_LENGTH 4095 +#define TWO_BYTE_PKG_LENGTH_ENCODING 0x40 +#define PKG_LENGTH_NIBBLE_MASK 0x0F + +#define MAX_THREE_BYTE_PKG_LENGTH 1048575 +#define THREE_BYTE_PKG_LENGTH_ENCODING 0x80 + +#define MAX_FOUR_BYTE_PKG_LENGTH 268435455 +#define FOUR_BYTE_PKG_LENGTH_ENCODING 0xC0 + +/** + Creates a Package Length encoding and places it in the return buffer, + PkgLengthEncoding. Similar to AmlPkgLength but the PkgLength does not + include the length of its own encoding. + + @param[in] DataSize - The size of data to be encoded as a pkglength + @param[out] PkgLengthEncoding - Return buffer containing the AML encoding + @param[out] ReturnDataLength - Size of the return buffer + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +InternalAmlBitPkgLength ( + IN UINT32 DataSize, + OUT UINT8 **PkgLengthEncoding, + OUT UINTN *ReturnDataLength + ) +{ + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + EFI_STATUS Status; + + Status = EFI_INVALID_PARAMETER; + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((DataSize) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((DataSize) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + // DataSize = DataLength + DataSize; + *PkgLengthEncoding = AllocatePool (DataLength); + if (*PkgLengthEncoding == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + *PkgLengthEncoding[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (DataSize) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&PkgLengthEncoding[0][1], &PkgLengthRemainder, DataLength - 1); + } + + *ReturnDataLength = DataLength; + +Done: + return Status; +} + +/** + Creates a Package Length AML Object and inserts it into the linked list + + PkgLength := PkgLeadByte | + <PkgLeadByte ByteData> | + <PkgLeadByte ByteData ByteData> | + <PkgLeadByte ByteData ByteData ByteData> + + PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)> + <bit 5-4: Only used if PkgLength < 63> + <bit 3-0: Least significant package length nybble> + + Note: The high 2 bits of the first byte reveal how many follow bytes are in + the PkgLength. If the PkgLength has only one byte, bit 0 through 5 are used + to encode the package length (in other words, values 0-63). If the package + length value is more than 63, more than one byte must be used for the encoding + in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero. + + If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become + the least significant 4 bits of the resulting package length value. The next + ByteData will become the next least significant 8 bits of the resulting value + and so on, up to 3 ByteData bytes. Thus, the maximum package length is 2**28. + + @param[in] Phase - Example: AmlStart, AmlClose + @param[in,out] ListHead - Head of Linked List of all AML Objects + + @return EFI_SUCCESS - Success + @return all others - Fail + **/ +EFI_STATUS +EFIAPI +AmlPkgLength ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + UINTN DataLength; + UINT8 PkgLeadByte; + UINTN PkgLengthRemainder; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start Length object\n", __func__)); + goto Done; + } + + break; + case AmlClose: + Status = InternalAmlLocateObjectByIdentifier (&Object, "LENGTH", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate Length object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, "Length")); + goto Done; + } + + DataLength = 0; + // Calculate Length of PkgLength Data and fill out least + // significant nibble + if ((ChildObject->DataSize + 1) <= MAX_ONE_BYTE_PKG_LENGTH) { + DataLength = 1; + PkgLeadByte = ONE_BYTE_PKG_LENGTH_ENCODING; + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & ONE_BYTE_NIBBLE_MASK); + } else { + if ((ChildObject->DataSize + 2) <= MAX_TWO_BYTE_PKG_LENGTH) { + DataLength = 2; + PkgLeadByte = TWO_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 3) <= MAX_THREE_BYTE_PKG_LENGTH) { + DataLength = 3; + PkgLeadByte = THREE_BYTE_PKG_LENGTH_ENCODING; + } else if ((ChildObject->DataSize + 4) <= MAX_FOUR_BYTE_PKG_LENGTH) { + DataLength = 4; + PkgLeadByte = FOUR_BYTE_PKG_LENGTH_ENCODING; + } else { + Status = EFI_DEVICE_ERROR; + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: PkgLength data size > 0x%X\n", + __func__, + MAX_FOUR_BYTE_PKG_LENGTH - 4 + )); + goto Done; + } + + PkgLeadByte |= ((ChildObject->DataSize + DataLength) & PKG_LENGTH_NIBBLE_MASK); + } + + // Allocate new data buffer + Object->DataSize = DataLength + ChildObject->DataSize; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocation failed Object=PkgLength\n", __func__)); + goto Done; + } + + // Populate PkgLeadByte + Object->Data[0] = PkgLeadByte; + + // Populate remainder of PkgLength bytes + PkgLengthRemainder = (ChildObject->DataSize + DataLength) >> 4; + if (PkgLengthRemainder != 0) { + CopyMem (&Object->Data[1], &PkgLengthRemainder, DataLength - 1); + } + + CopyMem ( + &Object->Data[DataLength], + ChildObject->Data, + ChildObject->DataSize + ); + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c new file mode 100644 index 0000000000..4ef746327b --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlResourceDescriptor.c @@ -0,0 +1,1989 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLRESOURCEDESCRIPTOR_FILECODE + +/** + ResourceTemplate (Resource To Buffer Conversion Macro) + + Syntax: + ResourceTemplate () {ResourceMacroList} => Buffer + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed ResourceTemplate Object + after AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlResourceTemplate ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + EFI_ACPI_END_TAG_DESCRIPTOR *EndTag; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = AmlBuffer (AmlStart, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + // Start EndTag object to be completed in Close + // ACPI 6.3: 6.4.2.9 End Tag: ...The End Tag is automatically generated by + // the ASL compiler at the end of the ResourceTemplate statement. + Status = InternalAppendNewAmlObject (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "END_TAG")); + goto Done; + } + + // ResourceMacroList is too complicated and must be added outside + break; + case AmlClose: + // ResourceMacroList should be closed already + + // Locate and complete End Tag + Status = InternalAmlLocateObjectByIdentifier (&Object, "END_TAG", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Locate %a object\n", __func__, "END_TAG")); + goto Done; + } + + // Release Object->Data Identifier + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: EndTag Alloc Failed\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + // ChildObject Data goes before End Tag + if ((ChildObject->Data != NULL) && (ChildObject->DataSize > 0)) { + CopyMem (Object->Data, ChildObject->Data, ChildObject->DataSize); + } + + EndTag = (EFI_ACPI_END_TAG_DESCRIPTOR *)&Object->Data[ChildObject->DataSize]; + EndTag->Desc = ACPI_END_TAG_DESCRIPTOR; + // Spec says the byte is a checksum, but I have never seen a value other + // than zero in the field compiled from ASL. + // EndTag->Checksum already = 0; + + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + + Status = AmlBuffer (AmlClose, 0, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Close %a object\n", __func__, "ResourceTemplate")); + goto Done; + } + + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + InternalAmlAddressSpaceCheck + + Checks Address space parameters for Word, DWord, or QWord size Address space + Descriptor. Size will be constrained by the Resource Descriptor input + parameters being of the correct size. + + @param[in] IsMinFixed + @param[in] IsMaxFixed + @param[in] AddressGranularity + @param[in] AddressMinimum + @param[in] AddressMaximum + @param[in] RangeLength + +**/ +EFI_STATUS +EFIAPI +InternalAmlAddressSpaceCheck ( + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 RangeLength + ) +{ + // Max must be greater than Min + if (AddressMaximum < AddressMinimum) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum greater than AddressMaximum\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Address Granularity must be (2^n)-1 + if (((AddressGranularity + 1) & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity must be (a power of 2)-1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (RangeLength == 0) { + // LEN _MIF _MAF Definition + // 0 0 0 + // 0 0 1 + // 0 1 0 + // Variable size, variable location resource descriptor for _PRS. + // If _MIF is set, _MIN must be a multiple of (_GRA+1). If _MAF + // is set, _MAX must be (a multiple of (_GRA+1))-1. + // OS can pick the resource range that satisfies following conditions: + // If _MIF is not set, start address is a multiple of (_GRA+1) + // and greater or equal to _MIN. Otherwise, start address is _MIN. + // If _MAF is not set, end address is (a multiple of (_GRA+1))-1 + // and less or equal to _MAX. Otherwise, end address is _MAX. + // 0 1 1 (Invalid combination) + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // 0 1 1 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsMinFixed and IsMaxFixed cannot both be set\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED) { + // 0 0 1 + if ((AddressMaximum & AddressGranularity) != AddressGranularity) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMaximum=0x%lX + 1) is not a multiple of\n", __func__, AddressMaximum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressMaximum == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMaximum can not be 0\n", __func__)); + DEBUG ((DEBUG_ERROR, "%a: When IsMaxFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if (IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) { + // 0 1 0 + if ((AddressMinimum & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressMinimum=0x%lX is not a multiple of\n", __func__, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 1\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED) && + (AddressMinimum == 0) && + (AddressMaximum == 0) && + (AddressGranularity == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Maximum, Minimum, Granularity all 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } else { + // LEN _MIF _MAF Definition + // >0 0 0 Fixed size, variable location resource descriptor for _PRS. + // _LEN must be a multiple of (_GRA+1). + // OS can pick the resource range that satisfies following conditions: + // Start address is a multiple of (_GRA+1) and greater or equal to _MIN. + // End address is (start address+_LEN-1) and less or equal to _MAX. + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + // >0 1 1 Fixed size, fixed location resource descriptor. + // _GRA must be 0 and _LEN must be (_MAX - _MIN +1). + if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_NOT_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_NOT_FIXED)) + { + // >0 0 0 + if ((RangeLength & AddressGranularity) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX is not a multiple of\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: (AddressGranularity=0x%lX + 1)\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When IsMinFixed = 0, IsMaxFixed = 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength > (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX > (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 0, IsMaxFixed = 0\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else if ((IsMinFixed == EFI_ACPI_GENERAL_FLAG_MIN_IS_FIXED) && + (IsMaxFixed == EFI_ACPI_GENERAL_FLAG_MAX_IS_FIXED)) + { + // >0 1 1 + if (AddressGranularity != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: AddressGranularity=0x%lX != 0\n", __func__, AddressGranularity)); + DEBUG ((DEBUG_ERROR, "%a: When RangeLength=0x%lX > 0, IsMinFixed = 1, and IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } else if (RangeLength != (AddressMaximum - AddressMinimum + 1)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: RangeLength=0x%lX != (AddrRangeMax=0x%lX - AddrRangeMin=0x%lX + 1)\n", __func__, RangeLength, AddressMaximum, AddressMinimum)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed = 1, IsMaxFixed = 1\n", __func__, RangeLength)); + return EFI_INVALID_PARAMETER; + } + } else { + // >0 0 1 (Invalid combination) + // >0 1 0 (Invalid combination) + DEBUG ((DEBUG_ERROR, "%a: ERROR: When RangeLength=0x%lX > 0,\n", __func__, RangeLength)); + DEBUG ((DEBUG_ERROR, "%a: IsMinFixed and IsMaxFixed must both be either 1 or 0\n", __func__)); + return EFI_INVALID_PARAMETER; + } + } + + return EFI_SUCCESS; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + The DWORD address space descriptor is used to report resource usage in a + 32-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPDWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Dword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: DWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "DWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.32 DMA (DMA Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DMA (DmaType, IsBusMaster, DmaTransferSize, DescriptorName) {DmaChannelList} => Buffer (BitMask) + + Generates: 6.4.2.2 DMA Descriptor + + @param[in] DmaType - DMA channel speed supported + @param[in] IsBusMaster - Logical device bus master status + @param[in] DmaTransferSize - DMA transfer type preference (8-bit, 16-bit, both) + @param[in] DmaChannelList - DMA channel mask bits [7:0] (channels 0 - 7), _DMA + Bit [0] is channel 0, etc. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDma ( + IN EFI_ACPI_DMA_SPEED_TYPE_KEYWORDS DmaType, + IN EFI_ACPI_DMA_BUS_MASTER_KEYWORDS IsBusMaster, + IN EFI_ACPI_DMA_TRANSFER_TYPE_KEYWORDS DmaTransferSize, + IN UINT8 DmaChannelList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_DMA_DESCRIPTOR *Descriptor; + + if ((DmaType & (UINT8) ~EFI_ACPI_DMA_SPEED_TYPE_MASK) != 0) { + // Invalid DmaType value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaType '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if ((IsBusMaster & ~EFI_ACPI_DMA_BUS_MASTER_MASK) != 0) { + // Invalid IsBusMaster value + DEBUG ((DEBUG_ERROR, "%a: ERROR: IsBusMaster '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (((DmaTransferSize & ~EFI_ACPI_DMA_TRANSFER_TYPE_MASK) != 0) || + (DmaTransferSize == 0x3)) + { + // Invalid DmaTransferSize value + DEBUG ((DEBUG_ERROR, "%a: ERROR: DmaTransferSize '%x' is not valid.\n", __func__, DmaType)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "DMA_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_DMA_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DMA_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_DMA_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_DMA_DESCRIPTOR; + Descriptor->ChannelMask = DmaChannelList; + // + // Descriptor->Information bit mask: + // Bit [7] Reserved (must be 0) + // Bits [6:5] DMA channel speed supported, _TYP + // 00 Indicates compatibility mode + // 01 Indicates Type A DMA as described in the EISA + // 10 Indicates Type B DMA + // 11 Indicates Type F + // Bits [4:3] Ignored + // Bit [2] Logical device bus master status, _BM + // 0 Logical device is not a bus master + // 1 Logical device is a bus master + // Bits [1:0] DMA transfer type preference, _SIZ + // 00 8-bit only + // 01 8- and 16-bit + // 10 16-bit only + Descriptor->Information = (UINT8)(DmaType + + IsBusMaster + + DmaTransferSize); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.35 DWordSpace (DWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.2 DWord Address Space Descriptor + Type 1, Large Item Value 0x7 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.33 DWordIO (DWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 are Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.34 DWordMemory (DWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + DWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed DWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPDWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT32 AddressGranularity, + IN UINT32 AddressMinimum, + IN UINT32 AddressMaximum, + IN UINT32 AddressTranslation, + IN UINT32 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPDWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create QWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPQWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Qword Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: QWord Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "QWORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "QWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.65 IRQ (Interrupt Resource Descriptor Macro) + + Syntax: + IRQ (EdgeLevel, ActiveLevel, Shared, DescriptorName) {InterruptList} => Buffer + + Arguments: + EdgeLevel: + Describes whether the interrupt is edge triggered (Edge) or level triggered + (Level). The field DescriptorName. _HE is automatically created to refer to + this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + ActiveLevel: + Describes whether the interrupt is active-high (ActiveHigh) or active-low + (ActiveLow). The field DescriptorName. _LL is automatically created to refer + to this portion of the resource descriptor, where '1' is Edge and ActiveHigh + and '0' is Level and ActiveLow. + + Shared: + Describes whether the interrupt can be shared with other devices (Shared) or + not (Exclusive), and whether it is capable of waking the system from a + low-power idle or system sleep state (SharedAndWake or ExclusiveAndWake). + The field DescriptorName. _SHR is automatically created to refer to this portion + of the resource descriptor, where '1' is Shared and '0' is Exclusive. If nothing + is specified, then Exclusive is assumed. + + InterruptList: + IRQ mask bits [15:0] + Bit[0] represents IRQ0, bit[1] is IRQ1, etc. + + DescriptorName: + Is an optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this resource + descriptor within the current resource template buffer. The predefined + descriptor field names may be appended to this name to access individual + fields within the descriptor via the Buffer Field operators. + + Description: + The IRQ macro evaluates to a buffer that contains an IRQ resource descriptor. + The format of the IRQ descriptor can be found in "IRQ Descriptor". The macro + produces the three-byte form of the descriptor. The macro is designed to be + used inside of a ResourceTemplate. + + Generates: 6.4.2.1 IRQ Descriptor + + @param[in] EdgeLevel - trigger level supported + @param[in] ActiveLevel - interrupt polarity + @param[in] Shared - interrupt exclusivity + @param[in] InterruptList - IRQ mask bits[7:0], _INT + Bit [0] represents IRQ0, + bit[1] is IRQ1, and so on. + IRQ mask bits[15:8], _INT + Bit [0] represents IRQ8, + bit[1] is IRQ9, and so on. + // DescriptorName - Optional - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IRQ buffer + + @retval EFI_SUCCESS + @retval Error status + +**/ +EFI_STATUS +EFIAPI +AmlOPIRQ ( + IN EFI_ACPI_IRQ_INTERRUPT_MODE_KEYWORDS EdgeLevel, + IN EFI_ACPI_IRQ_INTERRUPT_POLARITY_KEYWORDS ActiveLevel, + IN EFI_ACPI_IRQ_INTERRUPT_SHARING_KEYWORDS Shared, + IN UINT16 InterruptList, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IRQ_DESCRIPTOR *Descriptor; + + if ((EdgeLevel & (UINT8) ~EFI_ACPI_IRQ_MODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: EdgeLevel '%x' is not valid.\n", __func__, EdgeLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((ActiveLevel & (UINT8) ~EFI_ACPI_IRQ_POLARITY_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ActiveLevel '%x' is not valid.\n", __func__, ActiveLevel)); + return EFI_INVALID_PARAMETER; + } + + if ((Shared & (UINT8) ~(EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | EFI_ACPI_IRQ_SHARABLE_MASK)) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Shared '%x' is not valid.\n", __func__, Shared)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Cannot create %a object.", __func__, "IRQ_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IRQ_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Alloc for %a failed\n", __func__, "IRQ_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IRQ_DESCRIPTOR *)Object->Data; + Descriptor->Header.Byte = ACPI_IRQ_DESCRIPTOR; + Descriptor->Mask = InterruptList; + // + // Ref 6.4.2.1 IRQ Descriptor - IRQ Information + // Descriptor->Information bit mask: + // IRQ Information. Each bit, when set, indicates this device is capable of + // driving a certain type of interrupt. (Optional-if not included then assume + // edge sensitive, high true interrupts.) These bits can be used both for + // reporting and setting IRQ resources. + // Note: This descriptor is meant for describing interrupts that are connected + // to PIC-compatible interrupt controllers, which can only be programmed + // for Active-High-Edge-Triggered or Active-Low-LevelTriggered interrupts. + // Any other combination is invalid. The Extended Interrupt Descriptor can + // be used to describe other combinations. + // + // Bit [7:6] Reserved (must be 0) + // Bit [5] Wake Capability, _WKC + // 0x0 = Not Wake Capable: This interrupt is not capable of waking the system. + // 0x1 = Wake Capable: This interrupt is capable of waking the system from a + // low-power idle state or a system sleep state. + // Bit [4] Interrupt Sharing, _SHR + // 0x0 = Exclusive: This interrupt is not shared with other devices. + // 0x1 = Shared: This interrupt is shared with other devices. + // Bit [3] Interrupt Polarity, _LL + // 0 Active-High - This interrupt is sampled when the signal is high, or true + // 1 Active-Low - This interrupt is sampled when the signal is low, or false. + // Bit [2:1] Ignored + // Bit [0] Interrupt Mode, _HE + // 0 Level-Triggered - Interrupt is triggered in response to signal in a low state. + // 1 Edge-Triggered - Interrupt is triggered in response to a change in signal state from + // low to high. + // + Descriptor->Information = (UINT8)((EFI_ACPI_IRQ_WAKE_CAPABLE_MASK | + EFI_ACPI_IRQ_SHARABLE_MASK | + EFI_ACPI_IRQ_POLARITY_MASK | + EFI_ACPI_IRQ_MODE_MASK) & + (Shared | + ActiveLevel | + EdgeLevel)); + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.64 IO (IO Resource Descriptor Macro) + + Syntax: + IO (Decode, AddressMin, AddressMax, AddressAlignment, RangeLength, DescriptorName) => Buffer + + Arguments: + Decode: + Describes whether the I/O range uses 10-bit decode (Decode10) or 16-bit + decode (Decode16). The field DescriptorName. _DEC is automatically created + to refer to this portion of the resource descriptor, where '1' is Decode16 + and '0' is Decode10. + + AddressMin: + Evaluates to a 16-bit integer that specifies the minimum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MIN is automatically created to refer to this + portion of the resource descriptor. + + AddressMax: + Evaluates to a 16-bit integer that specifies the maximum acceptable starting + address for the I/O range. It must be an even multiple of AddressAlignment. + The field DescriptorName._MAX is automatically created to refer to this + portion of the resource descriptor. + + AddressAlignment: + Evaluates to an 8-bit integer that specifies the alignment granularity + for the I/O address assigned. The field DescriptorName. _ALN is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: + Evaluates to an 8-bit integer that specifies the number of bytes in the + I/O range. The field DescriptorName. _LEN is automatically created to refer + to this portion of the resource descriptor. + + DescriptorName: + An optional argument that specifies a name for an integer constant that + will be created in the current scope that contains the offset of this + resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The IO macro evaluates to a buffer which contains an IO resource descriptor. + The format of the IO descriptor can be found in the ACPI Specification section + "I/O Port Descriptor". The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.2.5 I/O Port Descriptor + Type 0, Small Item Name 0x8, Length = 7 + + @param[in] Decode, + @param[in] AddressMin, + @param[in] AddressMax, + @param[in] AddressAlignment, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed IO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPIO ( + IN EFI_ACPI_IO_PORT_DESCRIPTOR_INFORMATION Decode, + IN UINT16 AddressMin, + IN UINT16 AddressMax, + IN UINT8 AddressAlignment, + IN UINT8 RangeLength, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_IO_PORT_DESCRIPTOR *Descriptor; + UINT64 Remainder; + + if ((Decode & (UINT8) ~EFI_ACPI_IO_DECODE_MASK) != 0) { + // Invalid Decode value + DEBUG ((DEBUG_ERROR, "%a: ERROR: Decode '%x' is not valid.\n", __func__, Decode)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (AddressAlignment != 0) { + DivU64x64Remainder (AddressMin, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMin=0x%X) is not a multiple of\n", __func__, AddressMin)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + + DivU64x64Remainder (AddressMax, AddressAlignment, &Remainder); + if (Remainder != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: (AddressMax=0x%X) is not a multiple of\n", __func__, AddressMax)); + DEBUG ((DEBUG_ERROR, "%a: (AddressAlignment)=0x%X\n", __func__, AddressAlignment)); + return EFI_INVALID_PARAMETER; + } + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_IO_PORT_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_IO_PORT_DESCRIPTOR *)Object->Data; + + /* + * According to ACPI spec for + * ACPI_IO_PORT_DESCRIPTOR = 0x47 contains the informaion about + * Name, Type and Length, hence no need to calculate the length. + * Below is description from ACPI spec + * Byte 0 I/O Port Descriptor Value = 0x47 (01000111B) - Type = 0, Small item name = + * 0x8, Length = 7 + */ + Descriptor->Header.Byte = ACPI_IO_PORT_DESCRIPTOR; + // + // Descriptor->Information bit mask: + // Bit [7:1] Reserved, must be 0 + // Bit [0] (_DEC) + // 1 The logical device decodes 16-bit addresses + // 0 The logical device decodes 10-bit addresses + Descriptor->Information = (UINT8)(EFI_ACPI_IO_DECODE_MASK & Decode); + Descriptor->BaseAddressMin = AddressMin; + Descriptor->BaseAddressMax = AddressMax; + Descriptor->Alignment = AddressAlignment; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.114 Register (Generic Register Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + Register (AddressSpaceKeyword, RegisterBitWidth, RegisterBitOffset, + RegisterAddress, AccessSize, DescriptorName) + + Generates: + 6.4.3.7 Generic Register Descriptor + Type 1, Large Item Value 0x2 + The generic register descriptor describes the location of a fixed width + register within any of the ACPI-defined address spaces. See Generic Register + Descriptor for details. + + + @param[in] AddressSpaceKeyword, + @param[in] RegisterBitWidth, + @param[in] RegisterBitOffset, + @param[in] RegisterAddress, + @param[in] AccessSize, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPRegister ( + IN GENERIC_ADDRESS_SPACE_ID AddressSpaceKeyword, + IN UINT8 RegisterBitWidth, + IN UINT8 RegisterBitOffset, + IN UINT64 RegisterAddress, + IN UINT8 AccessSize, + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *Descriptor; + + if ((AddressSpaceKeyword < EFI_ACPI_6_4_SYSTEM_MEMORY) || + (AddressSpaceKeyword > EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if ((AddressSpaceKeyword > EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL) && + (AddressSpaceKeyword < EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AddressSpaceKeyword=0x%02X\n", __func__, AddressSpaceKeyword)); + return EFI_INVALID_PARAMETER; + } + + if (AccessSize > EFI_ACPI_6_4_QWORD) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid AccessSize=0x%02X\n", __func__, AccessSize)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "IO_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "IO_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR *)Object->Data; + + Descriptor->Header.Header.Byte = ACPI_GENERIC_REGISTER_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->AddressSpaceId = AddressSpaceKeyword; + Descriptor->RegisterBitWidth = RegisterBitWidth; + Descriptor->RegisterBitOffset = RegisterBitOffset; + Descriptor->AddressSize = AccessSize; + Descriptor->RegisterAddress = RegisterAddress; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/* + 19.6.111 QWordSpace (QWord Space Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.1 QWord Address Space Descriptor + Type 1, Large Item Value 0xA + The QWORD address space descriptor is used to report resource usage in a + 64-bit address space (like memory and I/O). + + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordSpace buffer + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +AmlOPQWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.82 Memory32Fixed (Memory Resource Descriptor Macro) + + Syntax: + Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) + + Arguments: + ReadAndWrite: Specifies whether or not the memory region is read-only (ReadOnly) + or read/write (ReadWrite). If nothing is specified, then ReadWrite is assumed. + The 1-bit field DescriptorName._RW is automatically created to refer to this + portion of the resource descriptor, where '1' is ReadWrite and '0' is ReadOnly. + + AddressBase: Evaluates to a 32-bit integer that specifies the base address + of the memory range. The 32-bit field DescriptorName. _BAS is automatically + created to refer to this portion of the resource descriptor. + + RangeLength: Evaluates to a 32-bit integer that specifies the total number of + bytes decoded in the memory range. The 32-bit field DescriptorName. _LEN is + automatically created to refer to this portion of the resource descriptor. + + DescriptorName: Is an optional argument that specifies a name for an integer + constant that will be created in the current scope that contains the offset + of this resource descriptor within the current resource template buffer. The + predefined descriptor field names may be appended to this name to access + individual fields within the descriptor via the Buffer Field operators. + + Description: + The Memory32Fixed macro evaluates to a buffer which contains a 32-bit memory + descriptor, which describes a fixed range of memory addresses. The format of + the fixed 32-bit memory descriptor can be found in 32-Bit Fixed Memory Range + Descriptor. The macro is designed to be used inside of a ResourceTemplate. + + Generates: + 6.4.3.4 32-Bit Fixed Memory Range Descriptor + Type 1, Large Item Value 0x6 + This memory range descriptor describes a device's memory resources within a + 32-bit address space. + + @param[in] ReadAndWrite, + @param[in] AddressBase, + @param[in] RangeLength, + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed memory resource descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPMemory32Fixed ( + IN READ_WRITE_FLAG ReadAndWrite, + IN UINT32 AddressBase, + IN UINT32 RangeLength, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *Descriptor; + + if ((ReadAndWrite & (UINT8) ~EFI_ACPI_MEMORY_WRITE_STATUS_MASK) != 0) { + // Invalid ReadAndWrite value + DEBUG ((DEBUG_ERROR, "%a: ERROR: ReadAndWrite '%x' is not valid.\n", __func__, ReadAndWrite)); + return EFI_INVALID_PARAMETER; + } + + if (ListHead == NULL) { + // Invalid + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid parameter, ListHead cannot == NULL.\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a cannot create %a object.", __func__, "MEMORY_32_FIXED_RESOURCE")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "MEMORY_32_FIXED_RESOURCE")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->Information = ReadAndWrite; + Descriptor->BaseAddress = AddressBase; + Descriptor->Length = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.109 QWordIO (QWord IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, + TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordIO buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.110 QWordMemory (QWord Memory Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + QWordMemory (ResourceUsage, Decode, IsMinFixed, IsMaxFixed, Cacheable, + ReadAndWrite, AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, MemoryRangeType, TranslationType) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Cacheable, + @param[in] ReadAndWrite, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + MemoryRangeType - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed QWordMemory buffer + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPQWordMemory ( + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Cacheable, + IN UINT8 ReadAndWrite, + IN UINT64 AddressGranularity, + IN UINT64 AddressMinimum, + IN UINT64 AddressMaximum, + IN UINT64 AddressTranslation, + IN UINT64 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // MemoryRangeType - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // Validate Type Specific Parameters + if ((Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid Cacheable Parameter 0x%X\n", __func__, (Cacheable & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_MEM))); + return EFI_INVALID_PARAMETER; + } + + if ((ReadAndWrite & ~EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_MASK_RW) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ReadAndWrite Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPQWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_MEM, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (Cacheable | ReadAndWrite), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/* + Internal function to create DWord Address Space Descriptors + + This function only requires a single call and therefore no Phases + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + The WORD address space descriptor is used to report resource usage in a + 16-bit address space (like memory and I/O, Bus Number). + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +*/ +EFI_STATUS +EFIAPI +InternalAmlOPWordAddressSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + + // Vaidate General Flags Input + if ((ResourceUsage & ~EFI_ACPI_GENERAL_FLAG_MASK_USAGE) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid ResourceUsage Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((Decode & ~EFI_ACPI_GENERAL_FLAG_MASK_DEC) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid Decode Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMinFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MIF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMinFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + if ((IsMaxFixed & ~EFI_ACPI_GENERAL_FLAG_MASK_MAF) != 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Invalid IsMaxFixed Parameter\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlAddressSpaceCheck ( + IsMinFixed, + IsMaxFixed, + AddressGranularity, + AddressMinimum, + AddressMaximum, + RangeLength + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Word Address Space Check FAILED\n", __func__)); + return Status; + } + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Start %a object\n", __func__, "WORD_ADDRESS")); + goto Done; + } + + Object->DataSize = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a Alloc Failed\n", __func__, "DWORD_ADDRESS")); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + Descriptor = (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR *)Object->Data; + Descriptor->Header.Header.Byte = ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR; + Descriptor->Header.Length = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + Descriptor->ResType = ResourceType; + Descriptor->GenFlag = IsMinFixed | IsMaxFixed | Decode; + Descriptor->SpecificFlag = TypeSpecificFlags; + Descriptor->AddrSpaceGranularity = AddressGranularity; + Descriptor->AddrRangeMin = AddressMinimum; + Descriptor->AddrRangeMax = AddressMaximum; + Descriptor->AddrTranslationOffset = AddressTranslation; + Descriptor->AddrLen = RangeLength; + Object->Completed = TRUE; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + } + + return Status; +} + +/** + 19.6.152 WordSpace (Word Space Resource Descriptor Macro) ) + + This function only requires a single call and therefore no Phases + Syntax + WordSpace (ResourceType, ResourceUsage, Decode, IsMinFixed, IsMaxFixed, + TypeSpecificFlags, AddressGranularity, AddressMinimum, + AddressMaximum, AddressTranslation, RangeLength, + ResourceSourceIndex, ResourceSource, DescriptorName) + + Generates: + 6.4.3.5.3 Word Address Space Descriptor + Type 1, Large Item Value 0x8 + + @param[in] ResourceType + @param[in] ResourceUsage, + @param[in] Decode, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] TypeSpecificFlags, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordSpace Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordSpace ( + IN UINT8 ResourceType, + IN UINT8 ResourceUsage, + IN UINT8 Decode, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 TypeSpecificFlags, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + // UINT8 ResourceType cannot be > 0xFF, so no need to check top end. + if (ResourceType < EFI_ACPI_SPACE_RESOURCE_TYPE_MIN) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Invalid ResourceType\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ResourceType, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + TypeSpecificFlags, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.150 WordBusNumber (Word Bus Number Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordBusNumber (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordBusNumber + Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordBusNumber ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_BUS, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + 0, + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} + +/** + 19.6.151 WordIO (Word IO Resource Descriptor Macro) + + This function only requires a single call and therefore no Phases + Syntax + WordIO (ResourceUsage, IsMinFixed, IsMaxFixed, Decode, ISARanges, + AddressGranularity, AddressMinimum, AddressMaximum, + AddressTranslation, RangeLength, ResourceSourceIndex, + ResourceSource, DescriptorName, TranslationType, TranslationDensity) + + defines for pass in parameters can be found in: + MdePkg/Include/IndustryStandard/Acpi10.h + + @param[in] ResourceUsage, + @param[in] IsMinFixed, + @param[in] IsMaxFixed, + @param[in] Decode, + @param[in] ISARanges, + @param[in] AddressGranularity, + @param[in] AddressMinimum, + @param[in] AddressMaximum, + @param[in] AddressTranslation, + @param[in] RangeLength, + ResourceSourceIndex - NOT IMPLEMENTED + ResourceSource - NOT IMPLEMENTED + DescriptorName - NOT IMPLEMENTED + TranslationType - NOT IMPLEMENTED + TranslationDensity - NOT IMPLEMENTED + @param[in,out] ListHead - Linked list has completed WordIO Descriptor + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPWordIO ( + IN UINT8 ResourceUsage, + IN UINT8 IsMinFixed, + IN UINT8 IsMaxFixed, + IN UINT8 Decode, + IN UINT8 ISARanges, + IN UINT16 AddressGranularity, + IN UINT16 AddressMinimum, + IN UINT16 AddressMaximum, + IN UINT16 AddressTranslation, + IN UINT16 RangeLength, + // ResourceSourceIndex - NOT IMPLEMENTED + // ResourceSource - NOT IMPLEMENTED + // DescriptorName - NOT IMPLEMENTED + // TranslationType - NOT IMPLEMENTED + // TranslationDensity - NOT IMPLEMENTED + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + + if (ISARanges == 0) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges = 0 = Reserved\n", __func__)); + return EFI_INVALID_PARAMETER; + } else if (ISARanges > 3) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: ISARanges > 3 is Invalid\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + Status = InternalAmlOPWordAddressSpace ( + ACPI_ADDRESS_SPACE_TYPE_IO, + ResourceUsage, + Decode, + IsMinFixed, + IsMaxFixed, + (ISARanges), + AddressGranularity, + AddressMinimum, + AddressMaximum, + AddressTranslation, + RangeLength, + ListHead + ); + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c new file mode 100644 index 0000000000..03201d0109 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlStatementOpcodes.c @@ -0,0 +1,515 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLSTATEMENTOPCODES_FILECODE + +/** + Creates an Else object + + TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefElse := Nothing | <elseop pkglength termlist> + ElseOp := 0xA1 + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlElse Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlElse ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Else", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Else", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_ELSE_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a If object + + Predicate and TermList must be created between AmlStart and AmlClose Phase + + Since ElseIf (...) is created with Else {( If (){})}. ElseIf will not be + supported and must be created with Else and If. + + DefIfElse := IfOp PkgLength Predicate TermList DefElse + IfOp := 0xA0 + Predicate := TermArg => Integer + + EXAMPLE: + AmlIf (AmlStart, ListHead); + { + { // Predicate + AmlOpDataInteger (1, ListHead); + } // Predicate + { // TermList + ... + } // TermList + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + { + AmlIf (AmlStart, ListHead); + { + {} // Predicate + {} // Termlist + } + AmlIf (AmlClose, ListHead); + AmlElse (AmlStart, ListHead); + {} // TermList + AmlElse (AmlClose, ListHead); + } + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed AmlIf Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlIf ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "If", ListHead); + + // Start required PkgLength + Status = AmlPkgLength (AmlStart, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: If PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // Close required PkgLength before finishing Object + Status = AmlPkgLength (AmlClose, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: close PkgLength object\n", __func__)); + goto Done; + } + + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "If", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + Status = EFI_DEVICE_ERROR; + DEBUG ((DEBUG_ERROR, "%a: ERROR: If must have at least a Predicate\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_IF_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Notify object + + DefNotify := NotifyOp NotifyObject NotifyValue + NotifyOp := 0x86 + NotifyObject := SuperName => ThermalZone | Processor | Device + NotifyValue := TermArg => Integer + + @param[in] NotifyObject - String of Namestring to a device + @param[in] NotifyValue - Integer Notify value + @param[in,out] ListHead - Linked list updated with Notify object + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlOPNotify ( + IN CHAR8 *NotifyObject, + IN UINT64 NotifyValue, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + Status = InternalAppendNewAmlObject (&Object, NotifyObject, ListHead); + Status = AmlOPNameString (NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyObject NameString\n", __func__)); + goto Done; + } + + Status = AmlOPDataInteger (NotifyValue, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Failed creating NotifyValue Integer\n", __func__)); + goto Done; + } + + Status = InternalAmlLocateObjectByIdentifier (&Object, NotifyObject, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_NOTIFY_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} + +/** + Creates a Return object + + Object must be created between AmlStart and AmlClose Phase + + DefReturn := ReturnOp ArgObject + ReturnOp := 0xA4 + ArgObject := TermArg => DataRefObject + + @param[in] Phase - Either AmlStart or AmlClose + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlReturn ( + IN AML_FUNCTION_PHASE Phase, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, "Return", ListHead); + // DataRefObject is outside the scope of this object + break; + case AmlClose: + // DataRefObject should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, "Return", ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locating Return Object\n", __func__)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: collecting Child data\n", __func__)); + goto Done; + } + + // Handle Return with no arguments + if ((ChildObject->Data == NULL) || (ChildObject->DataSize == 0)) { + // Return without arguments is treated like Return(0) + // Zeroed byte = ZeroOp + ChildObject->Data = AllocateZeroPool (sizeof (UINT8)); + if (ChildObject->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Zero Child for Return\n", __func__)); + goto Done; + } + + ChildObject->DataSize = 1; + } + + // Allocate buffer for Return object + Object->Data = AllocatePool (ChildObject->DataSize + 1); + Object->DataSize = ChildObject->DataSize + 1; + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object=Return\n", __func__)); + goto Done; + } + + // Fill out Return object + Object->Data[0] = AML_RETURN_OP; + CopyMem ( + &Object->Data[1], + ChildObject->Data, + ChildObject->DataSize + ); + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c new file mode 100644 index 0000000000..c9a4399764 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/AmlTable.c @@ -0,0 +1,213 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_AMLTABLE_FILECODE + +// String Length Constants +#define OEM_ID_LENGTH 6 +#define OEM_TABLE_ID_LENGTH 8 +#define SIGNATURE_LENGTH 4 +#define CREATOR_ID_LENGTH 4 + +/** + Creates an AML Encoded Table + Object must be created between AmlStart and AmlClose Phase + + DefBlockHeader := TableSignature TableLength SpecCompliance CheckSum OemID + OemTableID OemRevision CreatorID CreatorRevision + + TableSignature := DWordData // As defined in section 5.2.3. + TableLength := DWordData // Length of the table in bytes including the + // block header + SpecCompliance := ByteData // The revision of the structure. + CheckSum := ByteData // Byte checksum of the entire table. + OemID := ByteData(6) // OEM ID of up to 6 characters. + // If the OEM ID is shorter than 6 + // characters, it can be terminated with a + // NULL character. + OemTableID := ByteData(8) // OEM Table ID of up to 8 characters. + // If the OEM Table ID is shorter than + // 8 characters, it can be terminated with + // a NULL character. + OemRevision := DWordData // OEM Table Revision. + CreatorID := DWordData // Vendor ID of the ASL compiler. + CreatorRevision := DWordData // Revision of the ASL compiler. + + @param[in] Phase - Either AmlStart or AmlClose + @param[in] TableNameString - Table Name + @param[in] ComplianceRev - Compliance Revision + @param[in] OemId - OEM ID + @param[in] OemTableId - OEM ID of table + @param[in] OemRevision - OEM Revision number + @param[in] CreatorId - Vendor ID of the ASL compiler + @param[in] CreatorRevision - Vendor Revision of the ASL compiler + @param[in,out] ListHead - Linked list has completed String Object after + AmlClose. + + @retval EFI_SUCCESS + @retval Error status +**/ +EFI_STATUS +EFIAPI +AmlDefinitionBlock ( + IN AML_FUNCTION_PHASE Phase, + IN CHAR8 *TableNameString, + IN UINT8 ComplianceRev, + IN CHAR8 *OemId, + IN CHAR8 *OemTableId, + IN UINT32 OemRevision, + IN CHAR8 *CreatorId, + IN UINT32 CreatorRevision, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINTN ChildCount; + + if ((Phase >= AmlInvalid) || + (ListHead == NULL) || + (TableNameString == NULL) || + (OemId == NULL) || + (OemTableId == NULL) || + (CreatorId == NULL) || + (AsciiStrLen (TableNameString) != SIGNATURE_LENGTH) || + (AsciiStrLen (OemId) > OEM_ID_LENGTH) || + (AsciiStrLen (OemTableId) > OEM_TABLE_ID_LENGTH) || + (AsciiStrLen (CreatorId) != CREATOR_ID_LENGTH)) + { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_DEVICE_ERROR; + Object = NULL; + ChildObject = NULL; + + switch (Phase) { + case AmlStart: + Status = InternalAppendNewAmlObject (&Object, TableNameString, ListHead); + // TermList is too complicated and must be added outside + break; + + case AmlClose: + // TermList should be closed already + Status = InternalAmlLocateObjectByIdentifier (&Object, TableNameString, ListHead); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: locate %a object\n", __func__, TableNameString)); + goto Done; + } + + // Get rid of original Identifier data + InternalFreeAmlObjectData (Object); + + // Collect child data and delete children + Status = InternalAmlCollapseAndReleaseChildren ( + &ChildObject, + &ChildCount, + &Object->Link, + ListHead + ); + if (EFI_ERROR (Status) || + (ChildObject->Data == NULL) || + (ChildObject->DataSize == 0)) + { + DEBUG ((DEBUG_ERROR, "%a: ERROR: %a has no child data.\n", __func__, TableNameString)); + goto Done; + } + + Object->DataSize = ChildObject->DataSize + sizeof (EFI_ACPI_DESCRIPTION_HEADER); + Object->Data = AllocateZeroPool (Object->DataSize); + if (Object->Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocate Object->Data for %a\n", __func__, TableNameString)); + goto Done; + } + + // Fill table header with data + // Signature + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Signature)], + TableNameString, + AsciiStrLen (TableNameString) + ); + + // Table Length + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Length)], + (UINT32 *)&Object->DataSize, + sizeof (UINT32) + ); + + // ACPI Table Version + Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Revision)] = ComplianceRev; + + // OEM ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemId)], + OemId, + AsciiStrLen (OemId) + ); + + // OEM Table ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemTableId)], + OemTableId, + AsciiStrLen (OemTableId) + ); + + // OEM Table Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, OemRevision)], + (UINT8 *)&OemRevision, + sizeof (UINT32) + ); + + // Creator ID + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorId)], + CreatorId, + AsciiStrLen (CreatorId) + ); + + // Creator Version + CopyMem ( + &Object->Data[OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, CreatorRevision)], + (UINT8 *)&CreatorRevision, + sizeof (UINT32) + ); + + // Copy rest of data into Object + CopyMem ( + &Object->Data[sizeof (EFI_ACPI_DESCRIPTION_HEADER)], + ChildObject->Data, + ChildObject->DataSize + ); + + // Checksum Set on Table Install + InternalFreeAmlObject (&ChildObject, ListHead); + Object->Completed = TRUE; + Status = EFI_SUCCESS; + break; + + default: + Status = EFI_DEVICE_ERROR; + break; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + InternalFreeAmlObject (&ChildObject, ListHead); + } + + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c new file mode 100644 index 0000000000..b1ad9b7037 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/DxeAmlGenerationLib/LocalAmlObjects.c @@ -0,0 +1,364 @@ +/** @file + + Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LocalAmlLib.h" +#include <Filecode.h> + +#define FILECODE LIBRARY_DXEAMLGENERATIONLIB_LOCALAMLOBJECTS_FILECODE + +/** + Free Object->Data + + Frees Object->Data, Nulls pointer, zeros size and marks + Object->Completed = FALSE + + @param [in] Object - Pointer to Object to have Data freed + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObjectData ( + IN AML_OBJECT_INSTANCE *Object + ) +{ + if (Object == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (Object->Data != NULL) { + FreePool (Object->Data); + Object->Data = NULL; + Object->DataSize = 0; + Object->Completed = FALSE; + } + + return EFI_SUCCESS; +} + +/** + Free an Object + + Removes Object from it's linked list. + Frees Object->Data + Frees Object + + @param [in] Object - Pointer to Object to be freed + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object Freed + @return <all others> - Object free failed +**/ +EFI_STATUS +EFIAPI +InternalFreeAmlObject ( + IN AML_OBJECT_INSTANCE **FreeObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + AML_OBJECT_INSTANCE *Object; + + if ((FreeObject == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = *FreeObject; + if (Object != NULL) { + InternalFreeAmlObjectData (Object); + if (IsNodeInList (ListHead, &Object->Link)) { + RemoveEntryList (&Object->Link); + } + + FreePool (Object); + } + + *FreeObject = NULL; + return EFI_SUCCESS; +} + +/** + Creates a new AML_OBJECT_INSTANCE. Object->Data will be NULL and + Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject + ) +{ + AML_OBJECT_INSTANCE *Object; + + if (ReturnObject == NULL) { + return EFI_INVALID_PARAMETER; + } + + *ReturnObject = NULL; + + // Allocate AML Object + Object = AllocateZeroPool (sizeof (AML_OBJECT_INSTANCE)); + if (Object == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Object Failed\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + Object->DataSize = 0; + Object->Data = NULL; + Object->Signature = AML_OBJECT_INSTANCE_SIGNATURE; + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Object->Data + will be NULL and Object->DataSize will be 0 + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObjectNoData ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((ListHead == NULL) || (ReturnObject == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = InternalNewAmlObjectNoData (&Object); + if (!EFI_ERROR (Status)) { + InsertTailList (ListHead, &Object->Link); + *ReturnObject = Object; + } + + return Status; +} + +/** + Inserts a new AML_OBJECT_INSTANCE at the end of the linked list. Using a + string Identifier for comparison purposes + + Allocates AML_OBJECT_INSTANCE which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in,out] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object created and appended to linked list + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAppendNewAmlObject ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + AML_OBJECT_INSTANCE *Object; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + + Status = InternalAppendNewAmlObjectNoData (&Object, ListHead); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + // Allocate Identifier Data + NULL termination + Object->DataSize = AsciiStrLen (Identifier) + 1; + Object->Data = AllocatePool (Object->DataSize); + if (Object->Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: Allocate Data Identifier=%a\n", __func__, Identifier)); + InternalFreeAmlObject (&Object, ListHead); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (Object->Data, Identifier, Object->DataSize); + + *ReturnObject = Object; + return EFI_SUCCESS; +} + +/** + Finds AML_OBJECT_INSTANCE given a string Identifier looking backwards in the + AML_OBJECT_INSTANCE linked list + + @param [out] ReturnObject - Pointer to an Object + @param [in] Identifier - String Identifier to create object with + @param [in] ListHead - Head of AML Object linked list + + @return EFI_SUCCESS - Object located and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlLocateObjectByIdentifier ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + IN CHAR8 *Identifier, + IN LIST_ENTRY *ListHead + ) +{ + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + UINTN IdentifierSize; + + if ((Identifier == NULL) || (ListHead == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Object = NULL; + *ReturnObject = NULL; + + IdentifierSize = AsciiStrLen (Identifier) + 1; + // Look Backwards and find Node for this Object + Node = ListHead; + do { + Node = GetPreviousNode (ListHead, Node); + Object = AML_OBJECT_INSTANCE_FROM_LINK (Node); + + if (Object->Completed) { + // Object to be found cannot be completed yet + continue; + } else { + if ((Object->DataSize != 0) && + (Object->DataSize == IdentifierSize) && + (CompareMem ( + Object->Data, + Identifier, + MAX (Object->DataSize, IdentifierSize) + ) == 0)) + { + *ReturnObject = Object; + return EFI_SUCCESS; + } else { + DEBUG (( + DEBUG_ERROR, + "%a: ERROR: First incomplete Object is not %a.\n", + __func__, + Identifier + )); + // Object looking for should be the first uncompleted Object. + return EFI_NOT_FOUND; + } + } + } while (Node != ListHead); + + *ReturnObject = NULL; + return EFI_NOT_FOUND; +} + +/** + Finds all children of the Link and appends them into a single ObjectData + buffer of ObjectDataSize + + Allocates AML_OBJECT_INSTANCE and Data which must be freed by caller + + @param [out] ReturnObject - Pointer to an Object pointer + @param [out] ChildCount - Count of Child Objects collapsed + @param [in] Link - Linked List Object entry to collect children + @param [in,out] ListHead - Head of Object Linked List + + @return EFI_SUCCESS - ChildObject created and returned + @return <all others> - Object creation failed, Object = NULL +**/ +EFI_STATUS +EFIAPI +InternalAmlCollapseAndReleaseChildren ( + OUT AML_OBJECT_INSTANCE **ReturnObject, + OUT UINTN *ChildCount, + IN LIST_ENTRY *Link, + IN OUT LIST_ENTRY *ListHead + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Node; + AML_OBJECT_INSTANCE *Object; + AML_OBJECT_INSTANCE *ChildObject; + UINT8 *TempBuffer; + + Status = EFI_SUCCESS; + if ((ReturnObject == NULL) || + (ChildCount == NULL) || + (Link == NULL) || + (ListHead == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + *ChildCount = 0; + + Status = InternalNewAmlObjectNoData (&Object); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR: allocating Object Data\n", __func__)); + goto Done; + } + + // Get first Child Node + Node = GetNextNode (ListHead, Link); + while (Node != ListHead) { + ChildObject = AML_OBJECT_INSTANCE_FROM_LINK (Node); + // Expand data buffer to fit existing data + new data + TempBuffer = ReallocatePool ( + Object->DataSize, + Object->DataSize + ChildObject->DataSize, + Object->Data + ); + if (TempBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + FreePool (Object->Data); + Object->Data = NULL; + DEBUG ((DEBUG_ERROR, "%a: ERROR: reallocating Object Data\n", __func__)); + goto Done; + } + + Object->Data = TempBuffer; + // Copy new data at end of buffer + CopyMem ( + &Object->Data[Object->DataSize], + ChildObject->Data, + ChildObject->DataSize + ); + Object->DataSize += ChildObject->DataSize; + // Get Next ChildObject Node, then free ChildObject from list + Node = GetNextNode (ListHead, Node); + InternalFreeAmlObject (&ChildObject, ListHead); + *ChildCount = *ChildCount + 1; + } + +Done: + if (EFI_ERROR (Status)) { + InternalFreeAmlObject (&Object, ListHead); + Object = NULL; + } + + *ReturnObject = Object; + return Status; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c new file mode 100644 index 0000000000..2f4f676adb --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseLib/FchStallLib.c @@ -0,0 +1,13 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/*---------------------------------------------------------------------------------------- + * M O D U L E S U S E D + *---------------------------------------------------------------------------------------- + */ +#include <Filecode.h> diff --git a/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c new file mode 100644 index 0000000000..60305ee4a6 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchBaseResetSystemLib/FchBaseResetSystemLib.c @@ -0,0 +1,90 @@ +/** @file + Library to support reset library, inheritted from Agesa Cf9Reset module. + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> + +/** + This function causes a system-wide reset (cold reset), in which + all circuitry within the system returns to its initial state. This type of reset + is asynchronous to system operation and operates without regard to + cycle boundaries. + + If this function returns, it means that the system does not support cold reset. +**/ +VOID +EFIAPI +ResetCold ( + VOID + ) +{ +} + +/** + This function causes a system-wide initialization (warm reset), in which all processors + are set to their initial state. Pending cycles are not corrupted. + + If this function returns, it means that the system does not support warm reset. +**/ +VOID +EFIAPI +ResetWarm ( + VOID + ) +{ +} + +/** + This function causes the system to enter a power state equivalent + to the ACPI G2/S5 or G3 states. + + If this function returns, it means that the system does not support shutdown reset. +**/ +VOID +EFIAPI +ResetShutdown ( + VOID + ) +{ +} + +/** + This function causes the system to enter S3 and then wake up immediately. + + If this function returns, it means that the system does not support S3 feature. +**/ +VOID +EFIAPI +EnterS3WithImmediateWake ( + VOID + ) +{ +} + +/** + This function causes a systemwide reset. The exact type of the reset is + defined by the EFI_GUID that follows the Null-terminated Unicode string passed + into ResetData. If the platform does not recognize the EFI_GUID in ResetData + the platform must pick a supported reset type to perform.The platform may + optionally log the parameters from any non-normal reset that occurs. + + @param[in] DataSize The size, in bytes, of ResetData. + @param[in] ResetData The data buffer starts with a Null-terminated string, + followed by the EFI_GUID. +**/ +VOID +EFIAPI +ResetPlatformSpecific ( + IN UINTN DataSize, + IN VOID *ResetData + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c new file mode 100644 index 0000000000..d10e676668 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/FchEspiCmdLib/FchEspiCmdLib.c @@ -0,0 +1,87 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Filecode.h> +#include <Uefi.h> +/*----------------------------------------------------------------------------------------*/ + +/** + * @param[in] EspiBase Espi MMIO base + * @param[in] RegAddr Slave register address + * + * @retval Register Value + */ +UINT32 +FchEspiCmd_GetConfiguration ( + IN UINT32 EspiBase, + IN UINT32 RegAddr + ) +{ + return 0; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to read + * @param[in] Length Length in byte to read + * @param[in] Buffer Pointer to the data read to + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashRead ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + OUT UINT8 *Buffer + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to write + * @param[in] Length Length in byte to write + * @param[in] Value Pointer to the data to write + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashWrite ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length, + IN UINT8 *Value + ) +{ + return EFI_SUCCESS; +} + +/*----------------------------------------------------------------------------------------*/ + +/** + * + * @param[in] EspiBase Espi MMIO base + * @param[in] Address Address to erase + * @param[in] Length Block Size to erase + * + * + */ +EFI_STATUS +FchEspiCmd_SafsFlashErase ( + IN UINT32 EspiBase, + IN UINT32 Address, + IN UINT32 Length + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c new file mode 100755 index 0000000000..9044d3d497 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/NbioHandleLib/NbioHandleLib.c @@ -0,0 +1,68 @@ +/** @file + GNB function to create/locate PCIe configuration data area, Contain code + that create/locate/manages GNB/PCIe configuration + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/NbioHandleLib.h> +#include <Library/AmdBaseLib.h> + +/** + Get GNB handle + + @param[in] Pcie Pointer to global PCIe configuration + +**/ +GNB_HANDLE * +NbioGetHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of alternate host bridge (e.g. MI200) + + @param[in] Pcie Pointer to global PCIe configuration +**/ +GNB_HANDLE * +NbioGetAltHandle ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return NULL; +} + +/** + Get GNB handle of next socket + + @param[in] NbioHandle Pointer to current GnbHandle +**/ +GNB_HANDLE * +NbioGetNextSocket ( + IN GNB_HANDLE *NbioHandle + ) +{ + return NULL; +} + +/** + Get PCI_ADDR of GNB + + @param[in] Handle Pointer to GNB_HANDLE +**/ +PCI_ADDR +NbioGetHostPciAddress ( + IN GNB_HANDLE *Handle + ) +{ + PCI_ADDR PciAddr; + + PciAddr.AddressValue = 0; + return PciAddr; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c new file mode 100755 index 0000000000..d5fbe98d22 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieConfigLib.c @@ -0,0 +1,276 @@ +/** @file + GNB function to create/locate PCIe configuration data area + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/GnbPcieConfigLib.h> + +/** + Check Port Status + + @param[in] Engine Pointer to engine config descriptor + @param[in] PortStatus Check if status asserted for port + @retval TRUE if status asserted +**/ +BOOLEAN +PcieConfigCheckPortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN UINT32 PortStatus + ) +{ + return FALSE; +} + +/** + Set/Reset port status + + @param[in] Engine Pointer to engine config descriptor + @param[in] SetStatus SetStatus + @param[in] ResetStatus ResetStatus + +**/ +UINT16 +PcieConfigUpdatePortStatus ( + IN PCIE_ENGINE_CONFIG *Engine, + IN PCIE_ENGINE_INIT_STATUS SetStatus, + IN PCIE_ENGINE_INIT_STATUS ResetStatus + ) +{ + return 0; +} + +/** + Execute callback on all descriptor of specific type + + @param[in] InDescriptorFlags Include descriptor flags + @param[in] OutDescriptorFlags Exclude descriptor flags + @param[in] TerminationFlags Termination flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllDescriptors ( + IN UINT32 InDescriptorFlags, + IN UINT32 OutDescriptorFlags, + IN UINT32 TerminationFlags, + IN PCIE_RUN_ON_DESCRIPTOR_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in topology + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +AGESA_STATUS +PcieConfigRunProcForAllWrappers ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ + return AGESA_UNSUPPORTED; +} + +/** + Execute callback on all wrappers in NBIO + + + @param[in] DescriptorFlags Wrapper Flags + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllWrappersInNbio ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_WRAPPER_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN GNB_HANDLE *GnbHandle + ) +{ +} + +/** + Execute callback on all engine in topology + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEngines ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK Callback, + IN OUT VOID *Buffer, + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Execute callback on all engine in wrapper + + @param[in] DescriptorFlags Engine flags. + @param[in] Callback Pointer to callback function + @param[in, out] Buffer Pointer to buffer to pass information to callback + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigRunProcForAllEnginesInWrapper ( + IN UINT32 DescriptorFlags, + IN PCIE_RUN_ON_ENGINE_CALLBACK2 Callback, + IN OUT VOID *Buffer, + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ +} + +/** + Get parent descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetParent ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get child descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetChild ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Get peer descriptor of specific type + + @param[in] Type Descriptor type + @param[in] Descriptor Pointer to buffer to pass information to callback +**/ +PCIE_DESCRIPTOR_HEADER * +PcieConfigGetPeer ( + IN UINT32 Type, + IN PCIE_DESCRIPTOR_HEADER *Descriptor + ) +{ + return NULL; +} + +/** + Check is engine is active or potentially active + + @param[in] Engine Pointer to engine descriptor + @retval TRUE - engine active + @retval FALSE - engine not active +**/ +BOOLEAN +PcieConfigIsActivePcieEngine ( + IN PCIE_ENGINE_CONFIG *Engine + ) +{ + return FALSE; +} + +/** + Locate SB engine on wrapper + + @param[in] Wrapper Pointer to wrapper config descriptor + @retval SB engine pointer or NULL +**/ +PCIE_ENGINE_CONFIG * +PcieConfigLocateSbEngine ( + IN PCIE_WRAPPER_CONFIG *Wrapper + ) +{ + return NULL; +} + +/** + Helper function to dump engine configuration + + @param[in] EngineList Engine Configuration +**/ +VOID +PcieConfigEngineDebugDump ( + IN PCIE_ENGINE_CONFIG *EngineList + ) +{ +} + +/** + Helper function to dump wrapper configuration + + @param[in] WrapperList Wrapper Configuration +**/ +VOID +PcieConfigWrapperDebugDump ( + IN PCIE_WRAPPER_CONFIG *WrapperList + ) +{ +} + +/** + Helper function to dump configuration to debug out + + @param[in] Pcie Pointer to global PCIe configuration +**/ +VOID +PcieConfigDebugDump ( + IN PCIE_PLATFORM_CONFIG *Pcie + ) +{ +} + +/** + Helper function to dump input configuration to user engine descriptor + + @param[in] EngineDescriptor Pointer to engine descriptor +**/ +VOID +PcieUserDescriptorConfigDump ( + IN PCIE_ENGINE_DESCRIPTOR *EngineDescriptor + ) +{ +} + +/** + Helper function to dump input configuration to debug out + + @param[in] ComplexDescriptor Pointer to user defined complex descriptor +**/ +VOID +PcieUserConfigConfigDump ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexDescriptor + ) +{ +} diff --git a/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c new file mode 100755 index 0000000000..5c6be22ee4 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/PcieConfigLib/PcieInputParserLib.c @@ -0,0 +1,117 @@ +/** @file + Procedure to parse PCIe input configuration data + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <GnbDxio.h> + +/** + Get number of complexes in platform topology configuration + + @param[in] ComplexList First complex configuration in complex configuration array + @retval Number of Complexes + +**/ +UINTN +PcieInputParserGetNumberOfComplexes ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList + ) +{ + return 0; +} + +/** + Get number of PCIe engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfPcieEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of DDI engines in given complex + + @param[in] Complex Complex configuration + @retval Number of Engines +**/ +UINTN +PcieInputParserGetLengthOfDdiEnginesList ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get number of engines in given complex + + + + @param[in] Complex Complex configuration header + @retval Number of Engines +**/ +UINTN +PcieInputParserGetNumberOfEngines ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex + ) +{ + return 0; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] Index Complex descriptor Index + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINTN Index + ) +{ + return NULL; +} + +/** + Get Complex descriptor by index from given Platform configuration + + @param[in] ComplexList Platform topology configuration + @param[in] SocketId Socket Id + @retval Pointer to Complex Descriptor +**/ +PCIE_COMPLEX_DESCRIPTOR * +PcieInputParserGetComplexDescriptorOfSocket ( + IN PCIE_COMPLEX_DESCRIPTOR *ComplexList, + IN UINT32 SocketId + ) +{ + return NULL; +} + +/** + Get Engine descriptor from given complex by index + + @param[in] Complex Complex descriptor + @param[in] Index Engine descriptor index + @retval Pointer to Engine Descriptor +**/ +PCIE_ENGINE_DESCRIPTOR * +PcieInputParserGetEngineDescriptor ( + IN PCIE_COMPLEX_DESCRIPTOR *Complex, + IN UINTN Index + ) +{ + return NULL; +} diff --git a/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c new file mode 100644 index 0000000000..e6be32b071 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Library/SmnAccessLib/SmnAccessLib.c @@ -0,0 +1,10 @@ +/** @file + SMN Register Access Methods + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/SmnAccessLib.h> diff --git a/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c new file mode 100644 index 0000000000..1dc13900c7 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Nbio/Library/CommonDxe/DxeLibFunctions.c @@ -0,0 +1,42 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <GnbDxio.h> +#include <Library/AmdBaseLib.h> +#include <Library/PcieConfigLib.h> +#include <Library/NbioCommonLibDxe.h> + +/** + Function to retrieve SOC_LOGICAL_ID + + @param[out] LogicalId Pointer to SOC_LOGICAL_ID + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetLogicalId ( + OUT SOC_LOGICAL_ID *LogicalId + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Function to retrieve PCIE_PLATFORM_CONFIG + + @param[out] Pcie Pointer to PCIE_PLATFORM_CONFIG Pointer + @retval EFI_UNSUPPORTED + +**/ +EFI_STATUS +PcieGetPcieDxe ( + OUT PCIE_PLATFORM_CONFIG **Pcie + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c new file mode 100644 index 0000000000..fbd3ddcf37 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Dxe/ApcbV3Dxe.c @@ -0,0 +1,23 @@ +/** @file + APCB DXE Driver + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PcdLib.h> + +EFI_STATUS +EFIAPI +AmdApcbV3DxeDriverEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c new file mode 100644 index 0000000000..23d1a8fee0 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Psp/ApcbDrv/ApcbV3Pei/ApcbV3Pei.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> + +/** + * @brief Amd Apcb V3 Pei Driver Entry + * + * @param[in] FileHandle File Handie + * @param[in] PeiServices Pei Services + * + * @retval EFI_SUCCESS Set APCB value successfully + * Non-EFI_SUCCESS Function Error + * + **/ +EFI_STATUS +EFIAPI +AmdApcbV3PeiDriverEntry ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c new file mode 100644 index 0000000000..74b129931b --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Ccx/OemAgesaCcxPlatformLibNull/OemAgesaCcxPlatformLibNull.c @@ -0,0 +1,39 @@ +/** @file + Required OEM hooks for CCX initialization + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +/** + Hook to store the vector that all APs should jump to out of reset to a non-volatile, + shared location. + + @param[in] ApInitAddress Address of the code that AP should jump to + @param[in,out] ContentToRestore The current value in the non-volatile storage + +**/ +VOID +SaveApInitVector ( + IN UINT32 ApInitAddress, + IN OUT UINT32 *ContentToRestore + ) +{ +} + +/** + Hook to restore the initial content of the non-volatile storage location. + + @param[in] ContentToRestore The value to restore + +**/ +VOID +RestoreContentVector ( + IN UINT32 ContentToRestore + ) +{ +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c new file mode 100644 index 0000000000..54ce202cb1 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciCfg2/PciExpressPciCfg2.c @@ -0,0 +1,33 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Ppi/PciCfg2.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> + +/** + Module's entry function. + This routine will install EFI_PEI_PCI_CFG2_PPI. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @return Whether success to install service. +**/ +EFI_STATUS +EFIAPI +PeimInitializePciCfg ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c new file mode 100644 index 0000000000..643174d7b9 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/PciSegments/PciExpressPciSegmentInfoLib/PciSegmentInfoLib.c @@ -0,0 +1,30 @@ +/** @file + + Copyright (C) 2018-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/PciSegmentInfoLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> + +/** + Return an array of PCI_SEGMENT_INFO holding the segment information. + + Note: The returned array/buffer is owned by callee. + + @param Count Return the count of segments. + + @retval A callee owned array holding the segment information. +**/ +PCI_SEGMENT_INFO * +EFIAPI +GetPciSegmentInfo ( + UINTN *Count + ) +{ + return (PCI_SEGMENT_INFO *)NULL; +} diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c new file mode 100644 index 0000000000..d83bb6c2d8 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/AmdPspFlashAccSpiNorLibSmm/AmdPspFlashAccSpiNorLibSmm.c @@ -0,0 +1,15 @@ +/** @file + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiSmm.h> +#include <Register/Cpuid.h> +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Library/DebugLib.h> +#include <Protocol/SmmBase2.h> +#include <Library/IoLib.h> diff --git a/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c new file mode 100644 index 0000000000..a264eb9294 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Addendum/Psp/PspRomArmorWhitelistLib/PspRomArmorWhitelistLib.c @@ -0,0 +1,12 @@ +/** @file + Platform ROM Armor Whitelist table + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/PcdLib.h> diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c new file mode 100644 index 0000000000..e379538e3a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/OobPprDxe/OobPprDxe.c @@ -0,0 +1,36 @@ +/** @file + OEM OOB PPR DXE Driver. + + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiDxe.h> +#include <Library/DebugLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/PciIo.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TimerLib.h> +#include <IndustryStandard/Pci22.h> + +/** +* This function installs a protocol used by platform BIOS to provide the hotplug descriptor. +* +* @param[in] ImageHandle Image handler +* @param[in] SystemTable Pointer to the system table +* +* @retval EFI_SUCCESS The thread was successfully launched. +* +**/ +EFI_STATUS +EFIAPI +OobPprEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c new file mode 100644 index 0000000000..5242e6261a --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/PspPlatformDriver/PspPlatformDriver.c @@ -0,0 +1,20 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DebugLib.h> + +EFI_STATUS +EFIAPI +PspPlatformEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c new file mode 100644 index 0000000000..530bd9d4b6 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Addendum/Oem/Quartz/Dxe/ServerHotplugDxe/ServerHotplugDxe.c @@ -0,0 +1,22 @@ +/** @file + + Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <PiPei.h> +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> + +EFI_STATUS +EFIAPI +HotplugDescEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c new file mode 100644 index 0000000000..fbc372586b --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoDynamicCommand.c @@ -0,0 +1,44 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} + +/** + Destructor for the library. free any resources. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. +**/ +EFI_STATUS +EFIAPI +ActLibraryUnregisterActCommand ( + IN EFI_HANDLE ImageHandle + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c new file mode 100644 index 0000000000..0a5f4a7e81 --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/AmdAutoDynamicCommand/AmdAutoToolApp.c @@ -0,0 +1,36 @@ +/** @file + String token ID of help message text. + Shell supports to find help message in the resource section of an + application image if * .MAN file is not found. + This global variable is added to make build tool recognizes + that the help string is consumed by user and then build tool will + add the string into the resource section. + Thus the application can use '-?' option to show help message in Shell. + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + Entry point of Act Dynamic Command. + + Produce the DynamicCommand protocol to handle "act" command. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Act command is executed sucessfully. + @retval EFI_ABORTED HII package was failed to initialize. + @retval others Other errors when executing act command. +**/ +EFI_STATUS +EFIAPI +ActCommandInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} diff --git a/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c new file mode 100644 index 0000000000..47eb700f8f --- /dev/null +++ b/Platform/AMD/AmdCpmPkg/Library/CommonLib/BasePlatformHookLibAmdFchUart/BasePlatformHookLibAmdFchUart.c @@ -0,0 +1,29 @@ +/** @file + + Copyright (C) 2016-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/IoLib.h> + +/** + Performs platform specific initialization required for the CPU to access + the hardware associated with a SerialPortLib instance. This function does + not intiailzie the serial port hardware itself. Instead, it initializes + hardware devices that are required for the CPU to access the serial port + hardware. This function may be called more than once. + + @retval RETURN_SUCCESS The platform specific initialization succeeded. + @retval RETURN_DEVICE_ERROR The platform specific initialization could not be completed. + +**/ +RETURN_STATUS +EFIAPI +PlatformHookSerialPortInitialize ( + VOID + ) +{ + return RETURN_SUCCESS; +} diff --git a/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl new file mode 100644 index 0000000000..72b9a87639 --- /dev/null +++ b/Platform/AMD/AgesaModulePkg/Fch/Songshan/FchSongshanDxe/FchSongshanI2C_I3C.asl @@ -0,0 +1,9 @@ +/** @file + + Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + diff --git a/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc new file mode 100644 index 0000000000..2dfb3190d4 --- /dev/null +++ b/Platform/AMD/AgesaPkg/Include/AmdUefiStackNasm.inc @@ -0,0 +1,13 @@ +; @file +; +; AMD Generic Encapsulated Software Architecture +; Code to setup temporary memory access for stack usage. This code +; is to be used on memory present systems that do not need CAR. +; +; Copyright (C) 2008-2024 Advanced Micro Devices, Inc. All rights reserved.<BR> +; +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +%macro AMD_ENABLE_UEFI_STACK2 2-3 + +%endmacro diff --git a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi index a731c7e369..937caee083 160000 --- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi +++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi @@ -1 +1 @@ -Subproject commit a731c7e36988c3308e1978ecde491f2f6182d490 +Subproject commit 937caee0833115f69d697ca190001ba0aa5c7368 -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119201): https://edk2.groups.io/g/devel/message/119201 Mute This Topic: https://groups.io/mt/106257082/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 1428813 bytes --] ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces 2024-05-24 4:39 ` Paul via groups.io @ 2024-05-24 4:56 ` Abdul Lateef Attar via groups.io 0 siblings, 0 replies; 16+ messages in thread From: Abdul Lateef Attar via groups.io @ 2024-05-24 4:56 UTC (permalink / raw) To: Paul, devel [-- Attachment #1: Type: text/plain, Size: 457 bytes --] Reviewed-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> ( AbdulLateef.Attar@amd.com ) -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119204): https://edk2.groups.io/g/devel/message/119204 Mute This Topic: https://groups.io/mt/106257082/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 2969 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2024-05-24 5:02 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-05-23 4:12 [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Chang, Abner via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 2/3] Platform/AMD: Update Readme.md Chang, Abner via groups.io 2024-05-23 7:25 ` Xing, Eric via groups.io 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 2024-05-23 8:30 ` Yao, Ken via groups.io 2024-05-24 4:40 ` Paul via groups.io 2024-05-24 5:02 ` Abdul Lateef Attar via groups.io 2024-05-23 4:12 ` [edk2-devel] [edk2-platforms][PATCH 3/3] edk2-platform/Maintainer: Add entries for AMD packages Chang, Abner via groups.io 2024-05-23 16:27 ` Michael D Kinney 2024-05-24 2:00 ` Abdul Lateef Attar via groups.io 2024-05-24 4:46 ` Paul via groups.io 2024-05-23 7:26 ` [edk2-devel] [edk2-platforms][PATCH 1/3] Platform/AMD: Initial commit of cross platform/board interfaces Xing, Eric via groups.io 2024-05-23 7:47 ` Zhai, MingXin (Duke) via groups.io 2024-05-23 8:31 ` Yao, Ken via groups.io 2024-05-24 4:39 ` Paul via groups.io 2024-05-24 4:56 ` Abdul Lateef Attar via groups.io
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox