|
@@ -0,0 +1,834 @@
|
|
|
+/** @file
|
|
|
+ Configuration Manager Dxe
|
|
|
+
|
|
|
+ Copyright 2020 NXP
|
|
|
+ Copyright 2020 Puresoftware Ltd
|
|
|
+
|
|
|
+ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
+
|
|
|
+ @par Glossary:
|
|
|
+ - Cm or CM - Configuration Manager
|
|
|
+ - Obj or OBJ - Object
|
|
|
+**/
|
|
|
+
|
|
|
+#include <IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h>
|
|
|
+#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
|
|
|
+#include <Library/ArmLib.h>
|
|
|
+#include <Library/DebugLib.h>
|
|
|
+#include <Library/IoLib.h>
|
|
|
+#include <Library/PcdLib.h>
|
|
|
+#include <Library/UefiBootServicesTableLib.h>
|
|
|
+#include <Protocol/AcpiTable.h>
|
|
|
+#include <Protocol/ConfigurationManagerProtocol.h>
|
|
|
+
|
|
|
+/** The platform specific headers
|
|
|
+*/
|
|
|
+#include "ConfigurationManager.h"
|
|
|
+#include <Library/SocLib.h>
|
|
|
+
|
|
|
+/** The platform configuration repository information.
|
|
|
+*/
|
|
|
+STATIC
|
|
|
+FSL_PLATFORM_REPOSITORY_INFO FslPlatformRepositoryInfo = {
|
|
|
+ /// Configuration Manager information
|
|
|
+ { CONFIGURATION_MANAGER_REVISION, CFG_MGR_OEM_ID },
|
|
|
+
|
|
|
+ // ACPI Table List
|
|
|
+ {
|
|
|
+ // FADT Table
|
|
|
+ {
|
|
|
+ EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
|
|
|
+ EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_REVISION,
|
|
|
+ CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt),
|
|
|
+ NULL,
|
|
|
+ CFG_MGR_TABLE_ID
|
|
|
+ },
|
|
|
+
|
|
|
+ // GTDT Table
|
|
|
+ {
|
|
|
+ EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
|
|
|
+ EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION,
|
|
|
+ CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdGtdt),
|
|
|
+ NULL,
|
|
|
+ CFG_MGR_TABLE_ID
|
|
|
+ },
|
|
|
+
|
|
|
+ // MADT Table
|
|
|
+ {
|
|
|
+ EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
|
|
|
+ EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
|
|
|
+ CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMadt),
|
|
|
+ NULL,
|
|
|
+ CFG_MGR_TABLE_ID
|
|
|
+ },
|
|
|
+
|
|
|
+ // PCI MCFG Table
|
|
|
+ {
|
|
|
+ EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,
|
|
|
+ EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION,
|
|
|
+ CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMcfg),
|
|
|
+ NULL,
|
|
|
+ CFG_MGR_TABLE_ID
|
|
|
+ },
|
|
|
+
|
|
|
+ // SPCR Table
|
|
|
+ {
|
|
|
+ EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
|
|
|
+ EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION,
|
|
|
+ CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSpcr),
|
|
|
+ NULL,
|
|
|
+ CFG_MGR_TABLE_ID
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ // Boot architecture information
|
|
|
+ { EFI_ACPI_6_2_ARM_PSCI_COMPLIANT }, // BootArchFlags
|
|
|
+
|
|
|
+ // Power management profile information
|
|
|
+ { EFI_ACPI_6_2_PM_PROFILE_ENTERPRISE_SERVER }, // PowerManagement Profile
|
|
|
+
|
|
|
+ // Generic Timer Info
|
|
|
+ {
|
|
|
+ // The physical base address for the counter control frame
|
|
|
+ TIMER_BASE_ADDRESS,
|
|
|
+ // The physical base address for the counter read frame
|
|
|
+ TIMER_READ_BASE_ADDRESS,
|
|
|
+ // The secure PL1 timer interrupt
|
|
|
+ TIMER_SEC_IT,
|
|
|
+ // The secure PL1 timer flags
|
|
|
+ GTDT_GTIMER_FLAGS,
|
|
|
+ // The non-secure PL1 timer interrupt
|
|
|
+ TIMER_NON_SEC_IT,
|
|
|
+ // The non-secure PL1 timer flags
|
|
|
+ GTDT_GTIMER_FLAGS,
|
|
|
+ // The virtual timer interrupt
|
|
|
+ TIMER_VIRT_IT,
|
|
|
+ // The virtual timer flags
|
|
|
+ GTDT_GTIMER_FLAGS,
|
|
|
+ // The non-secure PL2 timer interrupt
|
|
|
+ TIMER_HYP_IT,
|
|
|
+ // The non-secure PL2 timer flags
|
|
|
+ GTDT_GTIMER_FLAGS
|
|
|
+ },
|
|
|
+
|
|
|
+ // Generic Timer Block Information
|
|
|
+ PLAT_TIMER_BLOCK_INFO,
|
|
|
+
|
|
|
+ // GTDT Frames
|
|
|
+ PLAT_TIMER_FRAME_INFO,
|
|
|
+
|
|
|
+ // Watchdog info
|
|
|
+ PLAT_WATCHDOG_INFO,
|
|
|
+
|
|
|
+ // GIC CPU Interface information
|
|
|
+ PLAT_GIC_CPU_INTERFACE,
|
|
|
+
|
|
|
+ // GIC Distributor Info
|
|
|
+ PLAT_GIC_DISTRIBUTOR_INFO,
|
|
|
+
|
|
|
+ // GIC Redistributor
|
|
|
+ PLAT_GIC_REDISTRIBUTOR_INFO,
|
|
|
+
|
|
|
+ // GIC ITS
|
|
|
+ PLAT_GIC_ITS_INFO,
|
|
|
+
|
|
|
+ // MCFG Info
|
|
|
+ PLAT_MCFG_INFO,
|
|
|
+
|
|
|
+ // SPCR Info
|
|
|
+ PLAT_SPCR_INFO,
|
|
|
+
|
|
|
+ 2.0 // fsl board revision
|
|
|
+};
|
|
|
+
|
|
|
+/** Initialize the platform configuration repository.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success
|
|
|
+**/
|
|
|
+STATIC
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+InitializePlatformRepository (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This
|
|
|
+ )
|
|
|
+{
|
|
|
+ FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
|
|
|
+ UINT32 Svr;
|
|
|
+
|
|
|
+ PlatformRepo = This->PlatRepoInfo;
|
|
|
+
|
|
|
+ Svr = SocGetSvr ();
|
|
|
+ if (SVR_SOC_VER(Svr) == SVR_LX2160A) {
|
|
|
+ PlatformRepo->FslBoardRevision = SVR_MAJOR(Svr);
|
|
|
+ DEBUG ((DEBUG_INFO, "Fsl : SoC LX2160A Rev = 0x%x\n", PlatformRepo->FslBoardRevision));
|
|
|
+ } else {
|
|
|
+ DEBUG ((DEBUG_INFO, "Fsl : SoC Unknown Rev = 0x%x\n", PlatformRepo->FslBoardRevision));
|
|
|
+ }
|
|
|
+
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return PCI Configuration Info.
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Object ID of the CM object requested
|
|
|
+ @param [in] Token A unique token for identifying the requested
|
|
|
+ CM_ARM_PCI_INFO object.
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is
|
|
|
+ not found.
|
|
|
+ **/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+GetPciConfigInfo (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
|
|
|
+ UINT32 TotalObjCount;
|
|
|
+ UINT32 ObjIndex;
|
|
|
+
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
+ PlatformRepo = This->PlatRepoInfo;
|
|
|
+
|
|
|
+ TotalObjCount = ARRAY_SIZE (PlatformRepo->PciConfigInfo);
|
|
|
+
|
|
|
+ for (ObjIndex = 0; ObjIndex < TotalObjCount; ObjIndex++) {
|
|
|
+ if (Token == (CM_OBJECT_TOKEN)&PlatformRepo->PciConfigInfo[ObjIndex])
|
|
|
+ {
|
|
|
+ CmObject->ObjectId = CmObjectId;
|
|
|
+ CmObject->Size = sizeof (PlatformRepo->PciConfigInfo[ObjIndex]);
|
|
|
+ CmObject->Data = (VOID*)&PlatformRepo->PciConfigInfo[ObjIndex];
|
|
|
+ CmObject->Count = 1;
|
|
|
+ return EFI_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return EFI_NOT_FOUND;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return GIC CPU Interface Info.
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Object ID of the CM object requested
|
|
|
+ @param [in] Token A unique token for identifying the requested
|
|
|
+ CM_ARM_GICC_INFO object.
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is
|
|
|
+ not found.
|
|
|
+ **/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+GetGicCInfo (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
|
|
|
+
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
+ PlatformRepo = This->PlatRepoInfo;
|
|
|
+
|
|
|
+ if (Token != (CM_OBJECT_TOKEN)&PlatformRepo->GicCInfo) {
|
|
|
+ return EFI_NOT_FOUND;
|
|
|
+ }
|
|
|
+
|
|
|
+ CmObject->ObjectId = CmObjectId;
|
|
|
+ CmObject->Size = sizeof (PlatformRepo->GicCInfo);
|
|
|
+ CmObject->Data = (VOID*)&PlatformRepo->GicCInfo;
|
|
|
+ CmObject->Count = ARRAY_SIZE (PlatformRepo->GicCInfo);
|
|
|
+
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return a GT Block timer frame info list.
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Token A token for identifying the object
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is not found.
|
|
|
+ **/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+GetGTBlockTimerFrameInfo (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
|
|
|
+
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
+ PlatformRepo = This->PlatRepoInfo;
|
|
|
+
|
|
|
+ if (Token != (CM_OBJECT_TOKEN)&PlatformRepo->GTBlock0TimerInfo) {
|
|
|
+ return EFI_NOT_FOUND;
|
|
|
+ }
|
|
|
+
|
|
|
+ CmObject->ObjectId = CmObjectId;
|
|
|
+ CmObject->Size = sizeof (PlatformRepo->GTBlock0TimerInfo);
|
|
|
+ CmObject->Data = (VOID*)&PlatformRepo->GTBlock0TimerInfo;
|
|
|
+ CmObject->Count = ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo);
|
|
|
+
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/** A helper function for returning the Configuration Manager Objects.
|
|
|
+
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Object Pointer to the Object(s).
|
|
|
+ @param [in] ObjectSize Total size of the Object(s).
|
|
|
+ @param [in] ObjectCount Number of Objects.
|
|
|
+ @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+**/
|
|
|
+STATIC
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+HandleCmObject (
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN VOID * Object,
|
|
|
+ IN CONST UINTN ObjectSize,
|
|
|
+ IN CONST UINTN ObjectCount,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc
|
|
|
+ )
|
|
|
+{
|
|
|
+ CmObjectDesc->ObjectId = CmObjectId;
|
|
|
+ CmObjectDesc->Size = ObjectSize;
|
|
|
+ CmObjectDesc->Data = (VOID*)Object;
|
|
|
+ CmObjectDesc->Count = ObjectCount;
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_INFO,
|
|
|
+ "INFO: CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n",
|
|
|
+ CmObjectId,
|
|
|
+ CmObjectDesc->Data,
|
|
|
+ CmObjectDesc->Size,
|
|
|
+ CmObjectDesc->Count
|
|
|
+ ));
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/** A helper function for returning the Configuration Manager Objects that
|
|
|
+ match the token.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Object Pointer to the Object(s).
|
|
|
+ @param [in] ObjectSize Total size of the Object(s).
|
|
|
+ @param [in] ObjectCount Number of Objects.
|
|
|
+ @param [in] Token A token identifying the object.
|
|
|
+ @param [in] HandlerProc A handler function to search the object
|
|
|
+ referenced by the token.
|
|
|
+ @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is not found.
|
|
|
+**/
|
|
|
+STATIC
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+HandleCmObjectRefByToken (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN VOID * Object,
|
|
|
+ IN CONST UINTN ObjectSize,
|
|
|
+ IN CONST UINTN ObjectCount,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token,
|
|
|
+ IN CONST CM_OBJECT_HANDLER_PROC HandlerProc,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+ CmObjectDesc->ObjectId = CmObjectId;
|
|
|
+ if (Token == CM_NULL_TOKEN) {
|
|
|
+ CmObjectDesc->Size = ObjectSize;
|
|
|
+ CmObjectDesc->Data = (VOID*)Object;
|
|
|
+ CmObjectDesc->Count = ObjectCount;
|
|
|
+ Status = EFI_SUCCESS;
|
|
|
+ } else {
|
|
|
+ Status = HandlerProc (This, CmObjectId, Token, CmObjectDesc);
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_INFO,
|
|
|
+ "INFO: Token = 0x%p, CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n",
|
|
|
+ (VOID*)Token,
|
|
|
+ CmObjectId,
|
|
|
+ CmObjectDesc->Data,
|
|
|
+ CmObjectDesc->Size,
|
|
|
+ CmObjectDesc->Count
|
|
|
+ ));
|
|
|
+ return Status;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return a standard namespace object.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Token An optional token identifying the object. If
|
|
|
+ unused this must be CM_NULL_TOKEN.
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is not found.
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+GetStandardNameSpaceObject (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+ FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
|
|
|
+
|
|
|
+ Status = EFI_SUCCESS;
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+ PlatformRepo = This->PlatRepoInfo;
|
|
|
+
|
|
|
+ switch (GET_CM_OBJECT_ID (CmObjectId)) {
|
|
|
+ case EStdObjCfgMgrInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->CmInfo,
|
|
|
+ sizeof (PlatformRepo->CmInfo),
|
|
|
+ 1,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+ case EStdObjAcpiTableList:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->CmAcpiTableList,
|
|
|
+ sizeof (PlatformRepo->CmAcpiTableList),
|
|
|
+ ARRAY_SIZE (PlatformRepo->CmAcpiTableList),
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+ default: {
|
|
|
+ Status = EFI_NOT_FOUND;
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_ERROR,
|
|
|
+ "ERROR: Object 0x%x. Status = %r\n",
|
|
|
+ CmObjectId,
|
|
|
+ Status
|
|
|
+ ));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Status;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return an ARM namespace object.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Token An optional token identifying the object. If
|
|
|
+ unused this must be CM_NULL_TOKEN.
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is not found.
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+GetArmNameSpaceObject (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+ FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
|
|
|
+
|
|
|
+ Status = EFI_SUCCESS;
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+ PlatformRepo = This->PlatRepoInfo;
|
|
|
+
|
|
|
+ switch (GET_CM_OBJECT_ID (CmObjectId)) {
|
|
|
+ case EArmObjBootArchInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->BootArchInfo,
|
|
|
+ sizeof (PlatformRepo->BootArchInfo),
|
|
|
+ 1,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjPowerManagementProfileInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->PmProfileInfo,
|
|
|
+ sizeof (PlatformRepo->PmProfileInfo),
|
|
|
+ 1,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjGenericTimerInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->GenericTimerInfo,
|
|
|
+ sizeof (PlatformRepo->GenericTimerInfo),
|
|
|
+ 1,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjPlatformGenericWatchdogInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->Watchdog,
|
|
|
+ sizeof (PlatformRepo->Watchdog),
|
|
|
+ PLAT_WATCHDOG_COUNT,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjPlatformGTBlockInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->GTBlockInfo,
|
|
|
+ sizeof (PlatformRepo->GTBlockInfo),
|
|
|
+ ARRAY_SIZE (PlatformRepo->GTBlockInfo),
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjGTBlockTimerFrameInfo:
|
|
|
+ Status = HandleCmObjectRefByToken (
|
|
|
+ This,
|
|
|
+ CmObjectId,
|
|
|
+ PlatformRepo->GTBlock0TimerInfo,
|
|
|
+ sizeof (PlatformRepo->GTBlock0TimerInfo),
|
|
|
+ ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo),
|
|
|
+ Token,
|
|
|
+ GetGTBlockTimerFrameInfo,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjGicCInfo:
|
|
|
+ Status = HandleCmObjectRefByToken (
|
|
|
+ This,
|
|
|
+ CmObjectId,
|
|
|
+ PlatformRepo->GicCInfo,
|
|
|
+ sizeof (PlatformRepo->GicCInfo),
|
|
|
+ ARRAY_SIZE (PlatformRepo->GicCInfo),
|
|
|
+ Token,
|
|
|
+ GetGicCInfo,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjGicDInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->GicDInfo,
|
|
|
+ sizeof (PlatformRepo->GicDInfo),
|
|
|
+ 1,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjGicRedistributorInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->GicRedistInfo,
|
|
|
+ sizeof (PlatformRepo->GicRedistInfo),
|
|
|
+ PLAT_GIC_REDISTRIBUTOR_COUNT,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjGicItsInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->GicItsInfo,
|
|
|
+ sizeof (PlatformRepo->GicItsInfo),
|
|
|
+ PLAT_GIC_ITS_COUNT,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjSerialConsolePortInfo:
|
|
|
+ Status = HandleCmObject (
|
|
|
+ CmObjectId,
|
|
|
+ &PlatformRepo->SpcrSerialPort,
|
|
|
+ sizeof (PlatformRepo->SpcrSerialPort),
|
|
|
+ 1,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EArmObjPciConfigSpaceInfo:
|
|
|
+ Status = HandleCmObjectRefByToken (
|
|
|
+ This,
|
|
|
+ CmObjectId,
|
|
|
+ PlatformRepo->PciConfigInfo,
|
|
|
+ sizeof (PlatformRepo->PciConfigInfo),
|
|
|
+ ARRAY_SIZE (PlatformRepo->PciConfigInfo),
|
|
|
+ Token,
|
|
|
+ GetPciConfigInfo,
|
|
|
+ CmObject
|
|
|
+ );
|
|
|
+ break;
|
|
|
+
|
|
|
+ default: {
|
|
|
+ Status = EFI_NOT_FOUND;
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_INFO,
|
|
|
+ "INFO: Object 0x%x. Status = %r\n",
|
|
|
+ CmObjectId,
|
|
|
+ Status
|
|
|
+ ));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }//switch
|
|
|
+
|
|
|
+ return Status;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return an OEM namespace object.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Token An optional token identifying the object. If
|
|
|
+ unused this must be CM_NULL_TOKEN.
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is not found.
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+GetOemNameSpaceObject (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+
|
|
|
+ Status = EFI_SUCCESS;
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (GET_CM_OBJECT_ID (CmObjectId)) {
|
|
|
+ default: {
|
|
|
+ Status = EFI_NOT_FOUND;
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_ERROR,
|
|
|
+ "ERROR: Object 0x%x. Status = %r\n",
|
|
|
+ CmObjectId,
|
|
|
+ Status
|
|
|
+ ));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Status;
|
|
|
+}
|
|
|
+
|
|
|
+/** The GetObject function defines the interface implemented by the
|
|
|
+ Configuration Manager Protocol for returning the Configuration
|
|
|
+ Manager Objects.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Token An optional token identifying the object. If
|
|
|
+ unused this must be CM_NULL_TOKEN.
|
|
|
+ @param [in, out] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the requested Object.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS Success.
|
|
|
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
|
+ @retval EFI_NOT_FOUND The required object information is not found.
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+FslPlatformGetObject (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
|
|
|
+ IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+
|
|
|
+ if ((This == NULL) || (CmObject == NULL)) {
|
|
|
+ ASSERT (This != NULL);
|
|
|
+ ASSERT (CmObject != NULL);
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (GET_CM_NAMESPACE_ID (CmObjectId)) {
|
|
|
+ case EObjNameSpaceStandard:
|
|
|
+ Status = GetStandardNameSpaceObject (This, CmObjectId, Token, CmObject);
|
|
|
+ break;
|
|
|
+ case EObjNameSpaceArm:
|
|
|
+ Status = GetArmNameSpaceObject (This, CmObjectId, Token, CmObject);
|
|
|
+ break;
|
|
|
+ case EObjNameSpaceOem:
|
|
|
+ Status = GetOemNameSpaceObject (This, CmObjectId, Token, CmObject);
|
|
|
+ break;
|
|
|
+ default: {
|
|
|
+ Status = EFI_INVALID_PARAMETER;
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_ERROR,
|
|
|
+ "ERROR: Unknown Namespace Object = 0x%x. Status = %r\n",
|
|
|
+ CmObjectId,
|
|
|
+ Status
|
|
|
+ ));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Status;
|
|
|
+}
|
|
|
+
|
|
|
+/** The SetObject function defines the interface implemented by the
|
|
|
+ Configuration Manager Protocol for updating the Configuration
|
|
|
+ Manager Objects.
|
|
|
+
|
|
|
+ @param [in] This Pointer to the Configuration Manager Protocol.
|
|
|
+ @param [in] CmObjectId The Configuration Manager Object ID.
|
|
|
+ @param [in] Token An optional token identifying the object. If
|
|
|
+ unused this must be CM_NULL_TOKEN.
|
|
|
+ @param [in] CmObject Pointer to the Configuration Manager Object
|
|
|
+ descriptor describing the Object.
|
|
|
+
|
|
|
+ @retval EFI_UNSUPPORTED This operation is not supported.
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+FslPlatformSetObject (
|
|
|
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
|
|
|
+ IN CONST CM_OBJECT_ID CmObjectId,
|
|
|
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
|
|
|
+ IN CM_OBJ_DESCRIPTOR * CONST CmObject
|
|
|
+ )
|
|
|
+{
|
|
|
+ return EFI_UNSUPPORTED;
|
|
|
+}
|
|
|
+
|
|
|
+/** A structure describing the configuration manager protocol interface.
|
|
|
+*/
|
|
|
+STATIC
|
|
|
+CONST
|
|
|
+EDKII_CONFIGURATION_MANAGER_PROTOCOL FslConfigManagerProtocol = {
|
|
|
+ CREATE_REVISION (1, 0),
|
|
|
+ FslPlatformGetObject,
|
|
|
+ FslPlatformSetObject,
|
|
|
+ &FslPlatformRepositoryInfo
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ Entrypoint of Configuration Manager Dxe.
|
|
|
+
|
|
|
+ @param ImageHandle
|
|
|
+ @param SystemTable
|
|
|
+
|
|
|
+ @return EFI_SUCCESS
|
|
|
+ @return EFI_LOAD_ERROR
|
|
|
+ @return EFI_OUT_OF_RESOURCES
|
|
|
+
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+ConfigurationManagerDxeInitialize (
|
|
|
+ IN EFI_HANDLE ImageHandle,
|
|
|
+ IN EFI_SYSTEM_TABLE * SystemTable
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+
|
|
|
+ Status = gBS->InstallProtocolInterface (
|
|
|
+ &ImageHandle,
|
|
|
+ &gEdkiiConfigurationManagerProtocolGuid,
|
|
|
+ EFI_NATIVE_INTERFACE,
|
|
|
+ (VOID*)&FslConfigManagerProtocol
|
|
|
+ );
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_ERROR,
|
|
|
+ "ERROR: Failed to get Install Configuration Manager Protocol." \
|
|
|
+ " Status = %r\n",
|
|
|
+ Status
|
|
|
+ ));
|
|
|
+ goto error_handler;
|
|
|
+ }
|
|
|
+
|
|
|
+ Status = InitializePlatformRepository (
|
|
|
+ &FslConfigManagerProtocol
|
|
|
+ );
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ DEBUG ((
|
|
|
+ DEBUG_ERROR,
|
|
|
+ "ERROR: Failed to initialize the Platform Configuration Repository." \
|
|
|
+ " Status = %r\n",
|
|
|
+ Status
|
|
|
+ ));
|
|
|
+ }
|
|
|
+
|
|
|
+error_handler:
|
|
|
+ return Status;
|
|
|
+}
|