123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798 |
- /** @file
- UbaConfigDatabase Peim.
- @copyright
- Copyright 2013 - 2021 Intel Corporation. <BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "CfgDbPei.h"
- #include <Ppi/EndOfPeiPhase.h>
- #include <Library/BaseLib.h>
- #include <Library/DebugLib.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/MemoryAllocationLib.h>
- #include <Library/HobLib.h>
- #include <Library/PeimEntryPoint.h>
- #include <Library/PeiServicesLib.h>
- #include <Library/PeiServicesTablePointerLib.h>
- /**
- Internal function for getting the platform record node in the database.
- @param This uba Ppi instance.
- @param SkuNode The pointer to pointer of Platform record node.
- @retval EFI_NOT_FOUND Platform record not found.
- @retval EFI_SUCCESS Platform found.
- **/
- EFI_STATUS
- InternalGetSkuNode (
- IN UBA_CONFIG_DATABASE_PPI *This,
- OUT UBA_BOARD_NODE **SkuNode
- )
- {
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- UbaPeimPrivate = NULL;
- UbaPeimPrivate = PRIVATE_DATA_FROM_PPI (This);
- *SkuNode = UbaPeimPrivate->CurrentSku;
- return EFI_SUCCESS;
- }
- /**
- Internal function for init the platform record to database.
- Create the connections between UBA_BOARD_NODE and UBA_PEIM_PRIVATE_DATA
- @param This uba Ppi instance.
- @param BoardId The platform type.
- @param BoardGuid The platform GUID.
- @param BoardName The platform user friendly name.
- @param SkuNode The pointer to pointer of Platform record node.
- @retval EFI_ALREADY_STARTED Platform record already exist.
- @retval EFI_OUT_OF_RESOURCES No enough resource.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- InternalInitSku (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN UINT32 BoardId,
- IN EFI_GUID *BoardGuid, OPTIONAL
- IN CHAR8 *BoardName, OPTIONAL
- OUT UBA_BOARD_NODE **SkuNode OPTIONAL
- )
- {
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- UBA_BOARD_NODE *NewSkuNode;
- UbaPeimPrivate = NULL;
- NewSkuNode = NULL;
- UbaPeimPrivate = PRIVATE_DATA_FROM_PPI (This);
- NewSkuNode = AllocateZeroPool (sizeof (UBA_BOARD_NODE));
- if (NewSkuNode == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- NewSkuNode->Signature = UBA_BOARD_SIGNATURE;
- NewSkuNode->Version = UBA_BOARD_VERSION;
- NewSkuNode->BoardId = BoardId;
- if (BoardName != NULL) {
- AsciiStrnCpyS (NewSkuNode->BoardName, sizeof (NewSkuNode->BoardName), BoardName, sizeof (NewSkuNode->BoardName) - 1);
- }
- if (BoardGuid != NULL) {
- CopyMem (&NewSkuNode->BoardGuid, BoardGuid, sizeof (EFI_GUID));
- }
- //Initialize the list head for Datalink.
- InitializeListHead (&NewSkuNode->DataLinkHead);
- if (SkuNode != NULL) {
- *SkuNode = NewSkuNode;
- UbaPeimPrivate->CurrentSku = NewSkuNode;
- }
- return EFI_SUCCESS;
- }
- /**
- Internal function for adding new configuration data record to database.
- @param This uba Ppi instance.
- @param ResId The resource ID.
- @param Data Data pointer.
- @param DataSize Data size.
- @retval EFI_INVALID_PARAMETER Parameter invalid.
- @retval EFI_OUT_OF_RESOURCES No enough resource.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- InternalAddNewConfigData (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN EFI_GUID *ResId,
- IN VOID *Data,
- IN UINTN DataSize
- )
- {
- EFI_STATUS Status;
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- UBA_CONFIG_NODE *NewDataNode;
- UBA_BOARD_NODE *SkuNode;
- EFI_PEI_PPI_DESCRIPTOR *ConfigDataPpi;
- UbaPeimPrivate = NULL;
- NewDataNode = NULL;
- SkuNode = NULL;
- ConfigDataPpi = NULL;
- if ((ResId == NULL) || (Data == NULL) || (DataSize <= 0)) {
- return EFI_INVALID_PARAMETER;
- }
- UbaPeimPrivate = PRIVATE_DATA_FROM_PPI (This);
- Status = InternalGetSkuNode (This, &SkuNode);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- NewDataNode = AllocateZeroPool (sizeof (UBA_CONFIG_NODE));
- if (NewDataNode == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- NewDataNode->Signature = UBA_BOARD_SIGNATURE;
- NewDataNode->Version = UBA_BOARD_VERSION;
- NewDataNode->Handle = (EFI_HANDLE) (UINTN) UbaPeimPrivate->HandleCount;
- NewDataNode->Data = AllocateCopyPool (DataSize, Data);
- NewDataNode->Size = (UINT32) DataSize;
- CopyMem (&NewDataNode->ResId, ResId, sizeof (EFI_GUID));
- InsertTailList (&SkuNode->DataLinkHead, &NewDataNode->DataLink);
- SkuNode->DataCount ++;
- UbaPeimPrivate->ConfigDataCount ++;
- UbaPeimPrivate->HandleCount ++;
- //
- // This PPI just install for NotifyPpi
- // The PPI instance UbaCfgDbPpi should not used
- //
- ConfigDataPpi = AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
- if (ConfigDataPpi == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- ConfigDataPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
- ConfigDataPpi->Guid = &NewDataNode->ResId;
- ConfigDataPpi->Ppi = &UbaPeimPrivate->UbaCfgDbPpi;
- Status = PeiServicesInstallPpi (ConfigDataPpi);
- ASSERT_EFI_ERROR (Status);
- if (Status != EFI_SUCCESS) {
- return Status;
- }
- return EFI_SUCCESS;
- }
- /**
- Internal function for Getting configuration data from database.
- @param This uba Ppi instance.
- @param SkuNode The platform node record.
- @param ResId The resource ID.
- @param Data Data pointer.
- @param DataSize Data size pointer.
- @retval EFI_INVALID_PARAMETER Parameter invalid.
- @retval EFI_NOT_FOUND Resource not found.
- @retval EFI_BUFFER_TOO_SMALL The buffer is too small to copy the data.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- InternalGetConfigData (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN UBA_BOARD_NODE *SkuNode,
- IN EFI_GUID *ResId,
- OUT VOID *Data, OPTIONAL
- OUT UINTN *DataSize OPTIONAL
- )
- {
- LIST_ENTRY *ListHead;
- LIST_ENTRY *Link;
- UBA_CONFIG_NODE *DataNode;
- ListHead = NULL;
- Link = NULL;
- DataNode = NULL;
- if ((SkuNode == NULL) || (ResId == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- ListHead = &SkuNode->DataLinkHead;
- if (IsListEmpty (ListHead)) {
- return EFI_NOT_FOUND;
- }
- for (Link = GetFirstNode (ListHead); !IsNull (ListHead, Link); Link = GetNextNode (ListHead, Link)) {
- DataNode = CONFIG_NODE_INSTANCE_FROM_THIS (Link);
- ASSERT (DataNode != NULL);
- if (DataNode == NULL) {
- return EFI_UNSUPPORTED;
- }
- if (CompareGuid (ResId, &DataNode->ResId)) {
- if (DataSize != NULL) {
- if (*DataSize < DataNode->Size) {
- *DataSize = DataNode->Size;
- return EFI_BUFFER_TOO_SMALL;
- }
- *DataSize = DataNode->Size;
- if (Data != NULL) {
- CopyMem (Data, DataNode->Data, DataNode->Size);
- }
- }
- return EFI_SUCCESS;
- }
- }
- return EFI_NOT_FOUND;
- }
- /**
- Covert the LIST_ENTRY pointer from CAR to RAM after memory init.
- @param Link The LIST_ENTRY pointer want to convert.
- @param PtrPositive The pointer need positive fix.
- @param PtrDelta The pointer delta value after memory init.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- PeiConvertListPointer (
- IN LIST_ENTRY *Link,
- IN BOOLEAN PtrPositive,
- IN UINTN PtrDelta
- )
- {
- if (PtrPositive) {
- Link->ForwardLink = (LIST_ENTRY *) ((UINTN) Link->ForwardLink + PtrDelta);
- Link->BackLink = (LIST_ENTRY *) ((UINTN) Link->BackLink + PtrDelta);
- } else {
- Link->ForwardLink = (LIST_ENTRY *) ((UINTN) Link->ForwardLink - PtrDelta);
- Link->BackLink = (LIST_ENTRY *) ((UINTN) Link->BackLink - PtrDelta);
- }
- return EFI_SUCCESS;
- }
- /**
- Covert general pointer from CAR to RAM after memory init.
- @param Ptr The VOID pointer want to convert.
- @param PtrPositive The pointer need positive fix.
- @param PtrDelta The pointer delta value after memory init.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- PeiConvertVoidPointer (
- IN VOID **Ptr,
- IN BOOLEAN PtrPositive,
- IN UINTN PtrDelta
- )
- {
- if (PtrPositive) {
- *Ptr = (VOID *) ((UINTN)*Ptr + PtrDelta);
- } else {
- *Ptr = (VOID *) ((UINTN)*Ptr - PtrDelta);
- }
- return EFI_SUCCESS;
- }
- /**
- Covert all pointers from CAR to RAM after memory init.
- @param This The uba Ppi pointer.
- @param PtrPositive The pointer need positive fix.
- @param PtrDelta The pointer delta value after memory init.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- PeiConvertDataPointer (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN BOOLEAN PtrPositive,
- IN UINTN PtrDelta
- )
- {
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- UBA_BOARD_NODE *SkuNode;
- UBA_CONFIG_NODE *DataNode;
- LIST_ENTRY *DataListHead;
- LIST_ENTRY *DataLink;
- UbaPeimPrivate = NULL;
- SkuNode = NULL;
- DataNode = NULL;
- DataListHead = NULL;
- DataLink = NULL;
- UbaPeimPrivate = PRIVATE_DATA_FROM_PPI (This);
- if (UbaPeimPrivate->ThisAddress == (UINTN) This) {
- return EFI_SUCCESS;
- }
- PeiConvertVoidPointer ((VOID**) &UbaPeimPrivate->CurrentSku, PtrPositive, PtrDelta);
- SkuNode = UbaPeimPrivate->CurrentSku;
- DataListHead = &SkuNode->DataLinkHead;
- PeiConvertListPointer (DataListHead, PtrPositive, PtrDelta);
- DataLink = DataListHead->ForwardLink;
- while (DataListHead != DataLink) {
- PeiConvertListPointer (DataLink, PtrPositive, PtrDelta);
- DataNode = CONFIG_NODE_INSTANCE_FROM_THIS (DataLink);
- PeiConvertVoidPointer (&DataNode->Data, PtrPositive, PtrDelta);
- DataLink = DataLink->ForwardLink;
- }
- UbaPeimPrivate->ThisAddress = (UINTN) This;
- return EFI_SUCCESS;
- }
- /**
- Check whether the This pointer have been relocated after memory init,
- if true, we need also relocate our own pointers in the heap, because core won't
- do it for us.
- @param This The uba Ppi pointer.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- PeiCheckPointerRelocated (
- IN UBA_CONFIG_DATABASE_PPI *This
- )
- {
- EFI_STATUS Status;
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- BOOLEAN PtrPositive;
- UINTN PtrDelta;
- Status = EFI_SUCCESS;
- UbaPeimPrivate = NULL;
- PtrPositive = FALSE;
- PtrDelta = 0;
- UbaPeimPrivate = PRIVATE_DATA_FROM_PPI (This);
- if (UbaPeimPrivate->ThisAddress != (UINTN) This) {
- if ((UINTN) This > UbaPeimPrivate->ThisAddress) {
- PtrPositive = TRUE;
- PtrDelta = (UINTN) This - UbaPeimPrivate->ThisAddress;
- } else {
- PtrPositive = FALSE;
- PtrDelta = UbaPeimPrivate->ThisAddress - (UINTN) This;
- }
- Status = PeiConvertDataPointer (This, PtrPositive, PtrDelta);
- }
- return Status;
- }
- /**
- Set platform's GUID and user friendly name by BoardId.
- If the BoardId is not exist in database, it will create a new platform.
- @param This UBA Ppi instance.
- @param BoardId The platform type, same define as Platform.h.
- @param BoardGuid The GUID for this platform.
- @param BoardName The user friendly name for this platform.
- @retval EFI_ALREADY_STARTED Create new for an exist platform.
- @retval EFI_OUT_OF_RESOURCES Resource not enough.
- @retval EFI_NOT_FOUND Platform not found.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- EFIAPI
- PeiUbaInit (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN UINT32 BoardId,
- IN EFI_GUID *BoardGuid, OPTIONAL
- IN CHAR8 *BoardName OPTIONAL
- )
- {
- EFI_STATUS Status;
- UBA_BOARD_NODE *SkuNode;
- Status = EFI_SUCCESS;
- SkuNode = NULL;
- PeiCheckPointerRelocated (This);
- Status = InternalInitSku (This, BoardId, BoardGuid, BoardName, &SkuNode);
- return Status;
- }
- /**
- Get platform's GUID and user friendly name by BoardId.
- This is used when you need a BoardGuid to Add/Get platform data
- Core will create a new platform for you if the BoardId is not
- recorded in database, and assgin a unique GUID for this platform.
- @param This uba Ppi instance.
- @param BoardId The platform type, same define as Platform.h.
- @param BoardGuid The GUID for this platform.
- @param BoardName The user friendly name for this platform.
- @retval EFI_ALREADY_STARTED Create new for an exist platform.
- @retval EFI_OUT_OF_RESOURCES Resource not enough.
- @retval EFI_NOT_FOUND Platform not found.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- EFIAPI
- PeiUbaGetSku (
- IN UBA_CONFIG_DATABASE_PPI *This,
- OUT UINT32 *BoardId,
- OUT EFI_GUID *BoardGuid, OPTIONAL
- OUT CHAR8 *BoardName OPTIONAL
- )
- {
- EFI_STATUS Status;
- UBA_BOARD_NODE *SkuNode;
- SkuNode = NULL;
- PeiCheckPointerRelocated (This);
- Status = InternalGetSkuNode (This, &SkuNode);
- if (!EFI_ERROR (Status)) {
- if (BoardId != NULL) {
- *BoardId = SkuNode->BoardId;
- }
- if (BoardName != NULL) {
- AsciiStrCpyS (BoardName, AsciiStrSize (SkuNode->BoardName) / sizeof (CHAR8), SkuNode->BoardName);
- }
- if (BoardGuid != NULL) {
- CopyMem (BoardGuid, &SkuNode->BoardGuid, sizeof (EFI_GUID));
- }
- return EFI_SUCCESS;
- }
- return Status;
- }
- /**
- Add configuration data to uba configuration database.
- @param This uba Ppi instance.
- @param ResId The configuration data resource id.
- @param Data The data buffer pointer.
- @param DataSize Size of data want to add into database.
- @retval EFI_INVALID_PARAMETER Required parameters not correct.
- @retval EFI_OUT_OF_RESOURCES Resource not enough.
- @retval EFI_NOT_FOUND Platform not found.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- EFIAPI
- PeiUbaAddData (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN EFI_GUID *ResId,
- IN VOID *Data,
- IN UINTN DataSize
- )
- {
- EFI_STATUS Status;
- UBA_BOARD_NODE *SkuNode;
- SkuNode = NULL;
- PeiCheckPointerRelocated (This);
- Status = InternalGetSkuNode (This, &SkuNode);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = InternalAddNewConfigData (This, ResId, Data, DataSize);
- return Status;
- }
- /**
- Get configuration data from uba configuration database.
- @param This uba Ppi instance.
- @param ResId The configuration data resource id.
- @param Data The data buffer pointer.
- @param DataSize IN:Size of data want to get, OUT: Size of data in database.
- @retval EFI_INVALID_PARAMETER Required parameters not correct.
- @retval EFI_BUFFER_TOO_SMALL The DataSize of Data buffer is too small to get this configuration data
- @retval EFI_OUT_OF_RESOURCES Resource not enough.
- @retval EFI_NOT_FOUND Platform or data not found.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- EFIAPI
- PeiUbaGetData (
- IN UBA_CONFIG_DATABASE_PPI *This,
- IN EFI_GUID *ResId,
- OUT VOID *Data,
- OUT UINTN *DataSize
- )
- {
- EFI_STATUS Status;
- UBA_BOARD_NODE *SkuNode;
- SkuNode = NULL;
- if ((ResId == NULL) || (Data == NULL) || (DataSize == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- PeiCheckPointerRelocated (This);
- Status = InternalGetSkuNode (This, &SkuNode);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = InternalGetConfigData (This, SkuNode, ResId, Data, DataSize);
- if (!EFI_ERROR (Status)) {
- return EFI_SUCCESS;
- }
- return EFI_NOT_FOUND;
- }
- /**
- Internal function for creating a HOB for platform data,
- and copy all the platform information and configuration data to the HOB,
- it will be passed to DXE driver.
- @param SkuNode The platform node in database.
- @param HobGuid The Hob GUID want to build.
- @retval EFI_OUT_OF_RESOURCES No enough resource.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- InternalCreateHobForSkuNode (
- IN UBA_BOARD_NODE *SkuNode,
- IN EFI_GUID *HobGuid
- )
- {
- UINT8 *HobData;
- UBA_CONFIG_HOB_HEADER *HobHeader;
- UBA_CONFIG_HOB_FIELD *HobDataFieldStart;
- UINT8 *ConfigDataHobPtr;
- UINTN DataLength;
- UINTN Index;
- LIST_ENTRY *ListHead;
- LIST_ENTRY *Link;
- UBA_CONFIG_NODE *DataNode;
- HobData = NULL;
- HobHeader = NULL;
- HobDataFieldStart = NULL;
- ConfigDataHobPtr = NULL;
- DataLength = 0;
- ListHead = NULL;
- Link = NULL;
- DataNode = NULL;
- if (SkuNode->DataCount != 0) {
- DataLength = sizeof (UBA_CONFIG_HOB_HEADER) +
- sizeof (UBA_CONFIG_HOB_FIELD) * (SkuNode->DataCount - 1);
- //
- // Get config data size
- //
- ListHead = &SkuNode->DataLinkHead;
- for (Link = GetFirstNode (ListHead); !IsNull (ListHead, Link); Link = GetNextNode (ListHead, Link)) {
- DataNode = CONFIG_NODE_INSTANCE_FROM_THIS (Link);
- DataLength += DataNode->Size;
- }
- HobData = BuildGuidHob (HobGuid, DataLength);
- ASSERT (HobData != NULL);
- if (HobData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- HobHeader = (UBA_CONFIG_HOB_HEADER *) HobData;
- HobDataFieldStart = HobHeader->HobField;
- ConfigDataHobPtr = (UINT8 *) HobDataFieldStart + (sizeof (UBA_CONFIG_HOB_FIELD) * SkuNode->DataCount);
- //
- // Copy our HOB header
- //
- HobHeader->Signature = UBA_CONFIG_HOB_SIGNATURE;
- HobHeader->Version = UBA_CONFIG_HOB_VERSION;
- HobHeader->HobLength = DataLength;
- CopyGuid (&HobHeader->DataGuid, HobGuid);
- HobHeader->BoardId = SkuNode->BoardId;
- HobHeader->DataCount = SkuNode->DataCount;
- CopyGuid (&HobHeader->BoardGuid, &SkuNode->BoardGuid);
- CopyMem (HobHeader->BoardName, SkuNode->BoardName, AsciiStrSize (SkuNode->BoardName));
- //
- // Copy N * (UBA_CONFIG_HOB_NODE & UBA_CONFIG_HOB_NODE->Data)
- //
- Index = 0;
- ListHead = &SkuNode->DataLinkHead;
- for (Link = GetFirstNode (ListHead); !IsNull (ListHead, Link); Link = GetNextNode (ListHead, Link)) {
- DataNode = CONFIG_NODE_INSTANCE_FROM_THIS (Link);
- ASSERT (DataNode != NULL);
- if (DataNode == NULL) {
- return EFI_UNSUPPORTED;
- }
- HobDataFieldStart[Index].Size = DataNode->Size;
- HobDataFieldStart[Index].Signature = DataNode->Signature;
- HobDataFieldStart[Index].Version = DataNode->Version;
- CopyGuid (&HobDataFieldStart[Index].ResId, &DataNode->ResId);
- CopyMem (ConfigDataHobPtr, DataNode->Data, DataNode->Size);
- //
- // Fix the config data pointer after memory copy
- // Set the pointer address into memory in HOB
- //
- HobDataFieldStart[Index].DataOffset = ((UINTN) ConfigDataHobPtr - (UINTN) HobHeader);
- Index ++;
- ConfigDataHobPtr += DataNode->Size;
- }
- }
- return EFI_SUCCESS;
- }
- /**
- End of PEI phase callback, we need build configuration data HOB in this callback,
- it will pass to DXE driver.
- @param PeiServices The PEI service pointer.
- @param NotifyDescriptor The notify descriptor.
- @param Ppi The PPI was notified.
- @retval EFI_OUT_OF_RESOURCES No enough resource.
- @retval EFI_NOT_FOUND Platform/data not found.
- @retval EFI_SUCCESS Operation success.
- **/
- EFI_STATUS
- EndOfPeiPpiNotifyCallback (
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
- IN VOID *Ppi
- )
- {
- EFI_STATUS Status;
- UBA_CONFIG_DATABASE_PPI *UbaConfigPpi;
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- UBA_BOARD_NODE *SkuNode;
- UbaPeimPrivate = NULL;
- SkuNode = NULL;
- Status = PeiServicesLocatePpi (
- &gUbaConfigDatabasePpiGuid,
- 0,
- NULL,
- (VOID**) &UbaConfigPpi
- );
- ASSERT_EFI_ERROR (Status);
- if (Status != EFI_SUCCESS) {
- return Status;
- }
- PeiCheckPointerRelocated (UbaConfigPpi);
- //
- // Build GUID data HOB for current platform configuration data
- //
- UbaPeimPrivate = PRIVATE_DATA_FROM_PPI (UbaConfigPpi);
- if (UbaPeimPrivate->CurrentSku != NULL) {
- SkuNode = UbaPeimPrivate->CurrentSku;
- Status = InternalCreateHobForSkuNode (SkuNode, &gUbaCurrentConfigHobGuid);
- ASSERT_EFI_ERROR (Status);
- if (Status != EFI_SUCCESS) {
- return Status;
- }
- }
- //
- // Other will not pass to DXE because it's useless
- //
- return EFI_SUCCESS;
- }
- EFI_PEI_NOTIFY_DESCRIPTOR mNotifyList[] = {
- {
- EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
- &gEfiEndOfPeiSignalPpiGuid,
- EndOfPeiPpiNotifyCallback
- }
- };
- /**
- Entry point function for the PEIM
- @param FileHandle Handle of the file being invoked.
- @param PeiServices Describes the list of possible PEI Services.
- @return EFI_SUCCESS If we installed our PPI
- **/
- EFI_STATUS
- EFIAPI
- UbaConfigDatabasePeimEntry (
- IN EFI_PEI_FILE_HANDLE FileHandle,
- IN CONST EFI_PEI_SERVICES **PeiServices
- )
- {
- EFI_STATUS Status;
- UBA_PEIM_PRIVATE_DATA *UbaPeimPrivate;
- UbaPeimPrivate = NULL;
- UbaPeimPrivate = AllocateZeroPool (sizeof (UBA_PEIM_PRIVATE_DATA));
- if (UbaPeimPrivate == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- DEBUG ((DEBUG_INFO, "UbaConfigDatabasePeimEntry!\n"));
- UbaPeimPrivate->Signature = UBA_BOARD_SIGNATURE;
- UbaPeimPrivate->Version = UBA_BOARD_VERSION;
- UbaPeimPrivate->ConfigDataCount = 0;
- UbaPeimPrivate->HandleCount = 0;
- UbaPeimPrivate->ThisAddress = (UINTN) &UbaPeimPrivate->UbaCfgDbPpi;
- UbaPeimPrivate->UbaPeimPpiList.Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
- UbaPeimPrivate->UbaPeimPpiList.Guid = &gUbaConfigDatabasePpiGuid;
- UbaPeimPrivate->UbaPeimPpiList.Ppi = &UbaPeimPrivate->UbaCfgDbPpi;
- UbaPeimPrivate->UbaCfgDbPpi.Signature = UBA_CONFIG_PPI_SIGNATURE;
- UbaPeimPrivate->UbaCfgDbPpi.Version = UBA_CONFIG_PPI_VERSION;
- UbaPeimPrivate->UbaCfgDbPpi.InitSku = PeiUbaInit;
- UbaPeimPrivate->UbaCfgDbPpi.GetSku = PeiUbaGetSku;
- UbaPeimPrivate->UbaCfgDbPpi.AddData = PeiUbaAddData;
- UbaPeimPrivate->UbaCfgDbPpi.GetData = PeiUbaGetData;
- //
- // Just produce our PPI
- //
- Status = PeiServicesInstallPpi (&UbaPeimPrivate->UbaPeimPpiList);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = PeiServicesNotifyPpi (&mNotifyList[0]);
- ASSERT_EFI_ERROR (Status);
- return Status;
- }
|