/** @file Copyright (c) 2016, AMD Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include STATIC AMD_MP_CORE_INFO_PROTOCOL mAmdMpCoreInfoProtocol = { 0 }; STATIC ARM_CORE_INFO * AmdStyxGetArmCoreInfoTable ( OUT UINTN *NumEntries ); STATIC EFI_STATUS AmdStyxGetPmuSpiFromMpId ( IN UINT32 MpId, OUT UINT32 *PmuSpi ); #pragma pack(push, 1) typedef struct _PMU_INFO { UINT32 MpId; UINT32 PmuSpi; } PMU_INFO; STATIC PMU_INFO mPmuInfo[] = { {0x000, 7}, {0x001, 8}, {0x100, 9}, {0x101, 10}, {0x200, 11}, {0x201, 12}, {0x300, 13}, {0x301, 14} }; #pragma pack(pop) #define MAX_CPUS sizeof(mPmuInfo) / sizeof(PMU_INFO) EFI_STATUS EFIAPI PlatInitDxeEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; ARM_CORE_INFO *ArmCoreInfoTable; UINTN ArmCoreCount; EFI_HANDLE Handle = NULL; DEBUG ((EFI_D_ERROR, "PlatInitDxe Loaded\n")); // Get core information ArmCoreCount = 0; ArmCoreInfoTable = AmdStyxGetArmCoreInfoTable (&ArmCoreCount); ASSERT (ArmCoreInfoTable != NULL); ASSERT (ArmCoreCount != 0); // Install CoreInfo Protocol mAmdMpCoreInfoProtocol.GetArmCoreInfoTable = AmdStyxGetArmCoreInfoTable; mAmdMpCoreInfoProtocol.GetPmuSpiFromMpId = AmdStyxGetPmuSpiFromMpId; Status = gBS->InstallProtocolInterface ( &Handle, &gAmdMpCoreInfoProtocolGuid, EFI_NATIVE_INTERFACE, (VOID *)&mAmdMpCoreInfoProtocol ); ASSERT_EFI_ERROR (Status); return Status; } STATIC ARM_CORE_INFO * AmdStyxGetArmCoreInfoTable ( OUT UINTN *NumEntries ) { EFI_HOB_GUID_TYPE *Hob; ASSERT (NumEntries != NULL); Hob = GetFirstGuidHob (&gAmdStyxMpCoreInfoGuid); if (Hob == NULL) { return NULL; } *NumEntries = GET_GUID_HOB_DATA_SIZE (Hob) / sizeof (ARM_CORE_INFO); return GET_GUID_HOB_DATA (Hob); } STATIC EFI_STATUS AmdStyxGetPmuSpiFromMpId ( IN UINT32 MpId, OUT UINT32 *PmuSpi ) { UINT32 i; for (i = 0; i < MAX_CPUS; ++i) { if (mPmuInfo[ i ].MpId == MpId) { *PmuSpi = mPmuInfo[ i ].PmuSpi; return EFI_SUCCESS; } } return EFI_INVALID_PARAMETER; }