ExStatusCodeHandlerPei.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /** @file
  2. @copyright
  3. Copyright 2017 - 2021 Intel Corporation. <BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "ExStatusCodeHandlerPei.h"
  7. EFI_PEI_EX_RSC_HANDLER_PPI mExStatusCodeHandlerPpi = {
  8. RegisterExStatusCodeHandler
  9. };
  10. EFI_PEI_PPI_DESCRIPTOR mExStatusCodeHandlerPpiList[] = {
  11. {
  12. EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
  13. &gEfiPeiExStatusCodeHandlerPpiGuid,
  14. &mExStatusCodeHandlerPpi
  15. }
  16. };
  17. /**
  18. Registers ExSerialStatusCodeReportWorker as callback function for ReportStatusCode() notification.
  19. @param[in] PeiServices Pointer to PEI Services Table.
  20. @retval EFI_SUCCESS Function was successfully registered.
  21. @retval EFI_INVALID_PARAMETER The callback function was NULL.
  22. @retval EFI_OUT_OF_RESOURCES The internal buffer ran out of space. No more functions can be
  23. registered.
  24. @retval EFI_ALREADY_STARTED The function was already registered. It can't be registered again.
  25. **/
  26. EFI_STATUS
  27. EFIAPI
  28. RegisterExStatusCodeHandler (
  29. IN CONST EFI_PEI_SERVICES **PeiServices
  30. )
  31. {
  32. EFI_STATUS Status;
  33. EFI_PEI_RSC_HANDLER_PPI *RscHandlerPpi;
  34. Status = PeiServicesLocatePpi (
  35. &gEfiPeiRscHandlerPpiGuid,
  36. 0,
  37. NULL,
  38. (VOID **) &RscHandlerPpi
  39. );
  40. ASSERT_EFI_ERROR (Status);
  41. if (PcdGetBool (PcdStatusCodeUseSerial)) {
  42. Status = RscHandlerPpi->Register (ExSerialStatusCodeReportWorker);
  43. if (Status != EFI_ALREADY_STARTED) {
  44. ASSERT_EFI_ERROR (Status);
  45. }
  46. }
  47. return Status;
  48. }
  49. /**
  50. Entry point of EX Status Code PEIM.
  51. This function is the entry point of this EX Status Code PEIM.
  52. It initializes serial port status code handler with policy features.
  53. @param FileHandle Handle of the file being invoked.
  54. @param PeiServices Describes the list of possible PEI Services.
  55. @retval EFI_SUCESS The entry point of PEIM executes successfully.
  56. **/
  57. EFI_STATUS
  58. EFIAPI
  59. ExStatusCodeHandlerPeiEntry (
  60. IN EFI_PEI_FILE_HANDLE FileHandle,
  61. IN CONST EFI_PEI_SERVICES **PeiServices
  62. )
  63. {
  64. EFI_STATUS Status;
  65. UINT32 DebugPrintErrorLevel;
  66. //
  67. // Dispatch initialization request to sub-statuscode-devices.
  68. //
  69. Status = SerialPortInitialize();
  70. ASSERT_EFI_ERROR (Status);
  71. //
  72. // If serial logging is disabled. set PcdStatusCodeUseSerial to FALSE.
  73. //
  74. DebugPrintErrorLevel = GetDebugPrintErrorLevel ();
  75. if (DebugPrintErrorLevel == 0) {
  76. Status = PcdSetBoolS (PcdStatusCodeUseSerial, FALSE);
  77. ASSERT_EFI_ERROR (Status);
  78. }
  79. Status = RegisterExStatusCodeHandler (PeiServices);
  80. ASSERT_EFI_ERROR (Status);
  81. //
  82. // Install Report Status Code Handler PPI
  83. //
  84. Status = PeiServicesInstallPpi (mExStatusCodeHandlerPpiList);
  85. ASSERT_EFI_ERROR (Status);
  86. return EFI_SUCCESS;
  87. }