/** @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;
}