/** @file Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include /** Registers the given function for callback during board detection. When this function is called the given function pointer is added to an internal list. When board detection is performed within the BoardDetect() API, the function pointers in the list will be invoked until a board detection function reports it has successfully detected the board. @param[in] BoardDetect A pointer to a function of type BOARD_DETECT_FUNC that is called during board detection. @retval EFI_SUCCESS The function was successfully registered. @retval EFI_INVALID_PARAMETER The function pointer given is NULL. @retval EFI_OUT_OF_RESOURCES Insufficient memory resources exist to add a new board detection callback. **/ EFI_STATUS EFIAPI RegisterBoardDetect ( IN BOARD_DETECT_FUNC *BoardDetect ) { EFI_STATUS Status; EFI_PEI_PPI_DESCRIPTOR *PpiListBoardDetect; if (BoardDetect == NULL) { return EFI_INVALID_PARAMETER; } PpiListBoardDetect = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); if (PpiListBoardDetect == NULL) { ASSERT (PpiListBoardDetect != NULL); return EFI_OUT_OF_RESOURCES; } PpiListBoardDetect->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); PpiListBoardDetect->Guid = &gBoardDetectGuid; PpiListBoardDetect->Ppi = BoardDetect; Status = PeiServicesInstallPpi (PpiListBoardDetect); ASSERT_EFI_ERROR (Status); return Status; } /** Registers the given set of board functions for callback to perform pre-memory board initialization tasks. When this function is called, the given structure of function pointers are stored for future invocation. When board pre-memory initialization tasks are required, the corresponding pre-memory function in this structure will be called. Typically, RegisterBoardPreMemInit() is called during board detection with the successfully detected board providing its set of board-specific pre-memory initialization functions. @param[in] BoardPreMemInit A pointer to a structure of function pointers described in the type BOARD_PRE_MEM_INIT_FUNC. @retval EFI_SUCCESS The board pre-memory functions were successfully registered. @retval EFI_INVALID_PARAMETER The pointer given is NULL. @retval EFI_OUT_OF_RESOURCES Insufficient memory resources exist to register the callback functions. **/ EFI_STATUS EFIAPI RegisterBoardPreMemInit ( IN BOARD_PRE_MEM_INIT_FUNC *BoardPreMemInit ) { EFI_STATUS Status; EFI_PEI_PPI_DESCRIPTOR *PpiListBoardInitPreMem; if (BoardPreMemInit == NULL) { return EFI_OUT_OF_RESOURCES; } PpiListBoardInitPreMem = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); if (PpiListBoardInitPreMem == NULL) { ASSERT (PpiListBoardInitPreMem != NULL); return EFI_OUT_OF_RESOURCES; } PpiListBoardInitPreMem->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); PpiListBoardInitPreMem->Guid = &gBoardPreMemInitGuid; PpiListBoardInitPreMem->Ppi = BoardPreMemInit; Status = PeiServicesInstallPpi (PpiListBoardInitPreMem); ASSERT_EFI_ERROR (Status); return Status; } /** Registers the given set of board functions for callback to perform post-memory board initialization tasks. When this function is called, the given structure of function pointers are stored for future invocation. When board post-memory initialization tasks are required, the corresponding post-memory function in this structure will be called. Typically, RegisterBoardPostMemInit() is called during board detection with the successfuly detected board providing its set of board-specific post-memory initialization functions. @param[in] BoardPostMemInit A pointer to a structure of function pointers described in the type BOARD_POST_MEM_INIT_FUNC. @retval EFI_SUCCESS The board post-memory functions were successfully registered. @retval EFI_INVALID_PARAMETER The pointer given is NULL. @retval EFI_OUT_OF_RESOURCES Insufficient memory resources exist to register the callback functions. **/ EFI_STATUS EFIAPI RegisterBoardPostMemInit ( IN BOARD_POST_MEM_INIT_FUNC *BoardPostMemInit ) { EFI_STATUS Status; EFI_PEI_PPI_DESCRIPTOR *PpiListBoardInitPostMem; if (BoardPostMemInit == NULL) { return EFI_INVALID_PARAMETER; } PpiListBoardInitPostMem = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); if (PpiListBoardInitPostMem == NULL) { ASSERT (PpiListBoardInitPostMem != NULL); return EFI_OUT_OF_RESOURCES; } PpiListBoardInitPostMem->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); PpiListBoardInitPostMem->Guid = &gBoardPostMemInitGuid; PpiListBoardInitPostMem->Ppi = BoardPostMemInit; Status = PeiServicesInstallPpi (PpiListBoardInitPostMem); ASSERT_EFI_ERROR (Status); return Status; }