PeiTbtPolicyLib.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /** @file
  2. This file is PeiTbtPolicyLib library.
  3. Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <Library/PeiServicesLib.h>
  7. #include <Library/GpioLib.h>
  8. #include <PiPei.h>
  9. #include <PeiTbtPolicyLibrary.h>
  10. #include <Ppi/ReadOnlyVariable2.h>
  11. #include <Ppi/PeiTbtPolicy.h>
  12. #include <Base.h>
  13. #include <GpioConfig.h>
  14. /**
  15. Update PEI TBT Policy Callback
  16. **/
  17. VOID
  18. EFIAPI
  19. UpdatePeiTbtPolicy (
  20. VOID
  21. )
  22. {
  23. EFI_STATUS Status;
  24. EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariableServices;
  25. PEI_TBT_POLICY *PeiTbtConfig;
  26. PeiTbtConfig = NULL;
  27. Status = EFI_NOT_FOUND;
  28. DEBUG ((DEBUG_INFO, "UpdatePeiTbtPolicy \n"));
  29. Status = PeiServicesLocatePpi (
  30. &gEfiPeiReadOnlyVariable2PpiGuid,
  31. 0,
  32. NULL,
  33. (VOID **) &VariableServices
  34. );
  35. ASSERT_EFI_ERROR (Status);
  36. Status = PeiServicesLocatePpi (
  37. &gPeiTbtPolicyPpiGuid,
  38. 0,
  39. NULL,
  40. (VOID **) &PeiTbtConfig
  41. );
  42. if (EFI_ERROR(Status)) {
  43. DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
  44. }
  45. ASSERT_EFI_ERROR (Status);
  46. //
  47. // Update DTBT Policy
  48. //
  49. PeiTbtConfig-> DTbtControllerConfig.DTbtControllerEn = PcdGet8 (PcdDTbtControllerEn);
  50. if (PcdGet8 (PcdDTbtControllerType) == TYPE_PEG)
  51. {
  52. PeiTbtConfig-> DTbtControllerConfig.Type = (UINT8) TYPE_PEG;
  53. PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber = 1; // PEG RP 1 (Function no. 0)
  54. }
  55. else {
  56. PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber = PcdGet8 (PcdDTbtPcieRpNumber);
  57. PeiTbtConfig-> DTbtControllerConfig.Type = PcdGet8 (PcdDTbtControllerType);
  58. }
  59. PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.GpioPad = (GPIO_PAD) PcdGet32 (PcdDTbtCioPlugEventGpioPad);
  60. if (GpioCheckFor2Tier(PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.GpioPad)) {
  61. PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting = 0;
  62. PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature = SIGNATURE_32('X', 'T', 'B', 'T');
  63. }
  64. else {
  65. PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting = 1;
  66. //
  67. // Update Signature based on platform GPIO.
  68. //
  69. PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature = SIGNATURE_32('X', 'T', 'B', 'T');
  70. }
  71. PeiTbtConfig->DTbtCommonConfig.TbtBootOn = PcdGet8 (PcdDTbtBootOn);
  72. PeiTbtConfig->DTbtCommonConfig.TbtUsbOn = PcdGet8 (PcdDTbtUsbOn);
  73. PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr = PcdGet8 (PcdDTbtGpio3ForcePwr);
  74. PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly = PcdGet16 (PcdDTbtGpio3ForcePwrDly);
  75. return;
  76. }
  77. /**
  78. Print PEI TBT Policy
  79. **/
  80. VOID
  81. EFIAPI
  82. TbtPrintPeiPolicyConfig (
  83. VOID
  84. )
  85. {
  86. DEBUG_CODE_BEGIN ();
  87. EFI_STATUS Status;
  88. PEI_TBT_POLICY *PeiTbtConfig;
  89. PeiTbtConfig = NULL;
  90. Status = EFI_NOT_FOUND;
  91. DEBUG ((DEBUG_INFO, "TbtPrintPolicyConfig Start\n"));
  92. Status = PeiServicesLocatePpi (
  93. &gPeiTbtPolicyPpiGuid,
  94. 0,
  95. NULL,
  96. (VOID **) &PeiTbtConfig
  97. );
  98. if (EFI_ERROR(Status)) {
  99. DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
  100. }
  101. ASSERT_EFI_ERROR (Status);
  102. //
  103. // Print DTBT Policy
  104. //
  105. DEBUG ((DEBUG_INFO, "\n------------------------ TBT Policy (PEI) Print BEGIN -----------------\n"));
  106. DEBUG ((DEBUG_INFO, "Revision : 0x%x\n", PEI_TBT_POLICY_REVISION));
  107. DEBUG ((DEBUG_INFO, "------------------------ PEI_TBT_CONFIG -----------------\n"));
  108. DEBUG ((DEBUG_INFO, " Revision : %d\n", PEI_TBT_POLICY_REVISION));
  109. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.DTbtControllerEn = %x\n", PeiTbtConfig-> DTbtControllerConfig.DTbtControllerEn));
  110. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.Type = %x\n", PeiTbtConfig-> DTbtControllerConfig.Type));
  111. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.PcieRpNumber = %x\n", PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber));
  112. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.ForcePwrGpio.GpioPad = %x\n", PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioPad));
  113. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.ForcePwrGpio.GpioLevel = %x\n", PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioLevel));
  114. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.PcieRstGpio.GpioPad = %x\n", PeiTbtConfig-> DTbtControllerConfig.PcieRstGpio.GpioPad));
  115. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.PcieRstGpio.GpioLevel = %x\n", PeiTbtConfig-> DTbtControllerConfig.PcieRstGpio.GpioLevel));
  116. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.GpioPad = %x\n", PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.GpioPad));
  117. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature = %x\n", PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature));
  118. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting = %x\n", PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting));
  119. //
  120. // Print DTBT Common Policy
  121. //
  122. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.TbtBootOn = %x\n", PeiTbtConfig->DTbtCommonConfig.TbtBootOn));
  123. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.TbtUsbOn = %x\n", PeiTbtConfig->DTbtCommonConfig.TbtUsbOn));
  124. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr = %x\n", PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr));
  125. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly = %x\n", PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly));
  126. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.DTbtSharedGpioConfiguration = %x\n", PeiTbtConfig->DTbtCommonConfig.DTbtSharedGpioConfiguration));
  127. DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.PcieRstSupport = %x\n", PeiTbtConfig->DTbtCommonConfig.PcieRstSupport));
  128. DEBUG ((DEBUG_INFO, "\n------------------------ TBT Policy (PEI) Print END -----------------\n"));
  129. DEBUG_CODE_END ();
  130. return;
  131. }
  132. /**
  133. Install Tbt Policy
  134. @retval EFI_SUCCESS The policy is installed.
  135. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  136. **/
  137. EFI_STATUS
  138. EFIAPI
  139. InstallPeiTbtPolicy (
  140. VOID
  141. )
  142. {
  143. EFI_STATUS Status;
  144. EFI_PEI_PPI_DESCRIPTOR *PeiTbtPolicyPpiDesc;
  145. PEI_TBT_POLICY *PeiTbtConfig;
  146. DEBUG ((DEBUG_INFO, "Install PEI TBT Policy\n"));
  147. PeiTbtConfig = NULL;
  148. //
  149. // Allocate memory for PeiTbtPolicyPpiDesc
  150. //
  151. PeiTbtPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
  152. ASSERT (PeiTbtPolicyPpiDesc != NULL);
  153. if (PeiTbtPolicyPpiDesc == NULL) {
  154. return EFI_OUT_OF_RESOURCES;
  155. }
  156. //
  157. // Allocate memory and initialize all default to zero for PeiTbtPolicy
  158. //
  159. PeiTbtConfig = (PEI_TBT_POLICY *) AllocateZeroPool (sizeof (PEI_TBT_POLICY));
  160. ASSERT (PeiTbtConfig != NULL);
  161. if (PeiTbtConfig == NULL) {
  162. return EFI_OUT_OF_RESOURCES;
  163. }
  164. //
  165. // Initialize PPI
  166. //
  167. PeiTbtPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
  168. PeiTbtPolicyPpiDesc->Guid = &gPeiTbtPolicyPpiGuid;
  169. PeiTbtPolicyPpiDesc->Ppi = PeiTbtConfig;
  170. Status = PeiServicesInstallPpi (PeiTbtPolicyPpiDesc);
  171. ASSERT_EFI_ERROR (Status);
  172. if (EFI_ERROR (Status)) {
  173. DEBUG ((DEBUG_ERROR, "Install PEI TBT Policy failed\n"));
  174. }
  175. return Status;
  176. }