PlatformInfoDxe.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /** @file
  2. Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. PlatformInfoDxe.c
  6. Abstract:
  7. Platform Info driver to public platform related HOB data
  8. --*/
  9. #include "PlatformInfoDxe.h"
  10. /**
  11. Entry point for the driver.
  12. This routine get the platform HOB data from PEI and publish
  13. as Platform Info variable that can be accessed during boot service and
  14. runtime.
  15. @param ImageHandle Image Handle.
  16. @param SystemTable EFI System Table.
  17. @retval Status Function execution status.
  18. **/
  19. EFI_STATUS
  20. EFIAPI
  21. PlatformInfoInit (
  22. IN EFI_HANDLE ImageHandle,
  23. IN EFI_SYSTEM_TABLE *SystemTable
  24. )
  25. {
  26. EFI_STATUS Status;
  27. EFI_PLATFORM_INFO_HOB *PlatformInfoHobPtr;
  28. EFI_PEI_HOB_POINTERS GuidHob;
  29. EFI_PLATFORM_INFO_HOB TmpHob;
  30. UINTN VarSize;
  31. EFI_OS_SELECTION_HOB *OsSlectionHobPtr;
  32. UINT8 Selection;
  33. SYSTEM_CONFIGURATION SystemConfiguration;
  34. UINT8 *LpssDataHobPtr;
  35. UINT8 *LpssDataVarPtr;
  36. UINTN i;
  37. VarSize = sizeof(SYSTEM_CONFIGURATION);
  38. Status = gRT->GetVariable(
  39. NORMAL_SETUP_NAME,
  40. &gEfiNormalSetupGuid,
  41. NULL,
  42. &VarSize,
  43. &SystemConfiguration
  44. );
  45. if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
  46. //The setup variable is corrupted
  47. VarSize = sizeof(SYSTEM_CONFIGURATION);
  48. Status = gRT->GetVariable(
  49. L"SetupRecovery",
  50. &gEfiNormalSetupGuid,
  51. NULL,
  52. &VarSize,
  53. &SystemConfiguration
  54. );
  55. ASSERT_EFI_ERROR (Status);
  56. }
  57. VarSize = sizeof(Selection);
  58. Status = gRT->GetVariable(
  59. L"OsSelection",
  60. &gOsSelectionVariableGuid,
  61. NULL,
  62. &VarSize,
  63. &Selection
  64. );
  65. if (EFI_ERROR(Status)) {
  66. Selection = SystemConfiguration.ReservedO;
  67. Status = gRT->SetVariable (
  68. L"OsSelection",
  69. &gOsSelectionVariableGuid,
  70. EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
  71. sizeof(Selection),
  72. &Selection
  73. );
  74. }
  75. GuidHob.Raw = GetHobList ();
  76. if (GuidHob.Raw != NULL) {
  77. if ((GuidHob.Raw = GetNextGuidHob (&gOsSelectionVariableGuid, GuidHob.Raw)) != NULL) {
  78. OsSlectionHobPtr = GET_GUID_HOB_DATA (GuidHob.Guid);
  79. if (OsSlectionHobPtr->OsSelectionChanged) {
  80. SystemConfiguration.ReservedO = OsSlectionHobPtr->OsSelection;
  81. //
  82. // Load Audio default configuration
  83. //
  84. SystemConfiguration.Lpe = OsSlectionHobPtr->Lpe;
  85. SystemConfiguration.PchAzalia = OsSlectionHobPtr->PchAzalia;
  86. //
  87. // Load LPSS and SCC default configurations
  88. //
  89. LpssDataHobPtr = &OsSlectionHobPtr->LpssData.LpssPciModeEnabled;
  90. LpssDataVarPtr = &SystemConfiguration.LpssPciModeEnabled;
  91. for (i = 0; i < sizeof(EFI_PLATFORM_LPSS_DATA); i++) {
  92. *LpssDataVarPtr = *LpssDataHobPtr;
  93. LpssDataVarPtr++;
  94. LpssDataHobPtr++;
  95. }
  96. SystemConfiguration.GOPEnable = TRUE;
  97. Status = gRT->SetVariable (
  98. NORMAL_SETUP_NAME,
  99. &gEfiNormalSetupGuid,
  100. EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
  101. sizeof(SYSTEM_CONFIGURATION),
  102. &SystemConfiguration
  103. );
  104. ASSERT_EFI_ERROR (Status);
  105. }
  106. }
  107. }
  108. GuidHob.Raw = GetHobList ();
  109. if (GuidHob.Raw == NULL) {
  110. return EFI_NOT_FOUND;
  111. }
  112. if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) {
  113. PlatformInfoHobPtr = GET_GUID_HOB_DATA (GuidHob.Guid);
  114. VarSize = sizeof(EFI_PLATFORM_INFO_HOB);
  115. Status = gRT->GetVariable(
  116. L"PlatformInfo",
  117. &gEfiVlv2VariableGuid,
  118. NULL,
  119. &VarSize,
  120. &TmpHob
  121. );
  122. if (EFI_ERROR(Status) || CompareMem (&TmpHob, PlatformInfoHobPtr, VarSize)) {
  123. //
  124. // Write the Platform Info to volatile memory
  125. //
  126. Status = gRT->SetVariable(
  127. L"PlatformInfo",
  128. &gEfiVlv2VariableGuid,
  129. EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
  130. sizeof(EFI_PLATFORM_INFO_HOB),
  131. PlatformInfoHobPtr
  132. );
  133. if (EFI_ERROR(Status)) {
  134. return Status;
  135. }
  136. }
  137. }
  138. return EFI_SUCCESS;
  139. }