PeiPlatformHooklib.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /** @file
  2. PEI Library Functions. Initialize GPIOs
  3. Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <PiPei.h>
  7. #include <PeiPlatformHookLib.h>
  8. #include <SaPolicyCommon.h>
  9. #include <Library/DebugLib.h>
  10. #include <Library/BaseMemoryLib.h>
  11. #include <Library/IoLib.h>
  12. #include <Library/HobLib.h>
  13. #include <Library/PcdLib.h>
  14. #include <Library/TimerLib.h>
  15. #include <Library/PchCycleDecodingLib.h>
  16. #include <Library/PeiPlatformLib.h>
  17. #include <Library/PciSegmentLib.h>
  18. #include <Library/PeiServicesLib.h>
  19. #include <Library/PmcLib.h>
  20. #include <Library/PeiSaPolicyLib.h>
  21. #include <PchAccess.h>
  22. #include <Library/CpuPlatformLib.h>
  23. #include <Library/GpioNativeLib.h>
  24. #include <Library/GpioLib.h>
  25. #include <GpioPinsCnlLp.h>
  26. #include <GpioPinsCnlH.h>
  27. #include <Library/PchInfoLib.h>
  28. #include <Library/CnviLib.h>
  29. #include <SioRegs.h>
  30. #include <PlatformBoardConfig.h>
  31. #include <Library/PchPcrLib.h>
  32. #include <Library/GpioCheckConflictLib.h>
  33. #define SIO_RUNTIME_REG_BASE_ADDRESS 0x0680
  34. #define RECOVERY_MODE_GPIO_PIN 0 // Platform specific @todo use PCD
  35. #define MANUFACTURE_MODE_GPIO_PIN 0 // Platform specific @todo use PCD
  36. /**
  37. Configures GPIO
  38. @param[in] GpioTable Point to Platform Gpio table
  39. @param[in] GpioTableCount Number of Gpio table entries
  40. **/
  41. VOID
  42. ConfigureGpio (
  43. IN GPIO_INIT_CONFIG *GpioDefinition,
  44. IN UINT16 GpioTableCount
  45. )
  46. {
  47. DEBUG ((DEBUG_INFO, "ConfigureGpio() Start\n"));
  48. CreateGpioCheckConflictHob (GpioDefinition, GpioTableCount);
  49. GpioConfigurePads (GpioTableCount, GpioDefinition);
  50. DEBUG ((DEBUG_INFO, "ConfigureGpio() End\n"));
  51. }
  52. /**
  53. Configure GPIO group GPE tier.
  54. @retval none.
  55. **/
  56. VOID
  57. GpioGroupTierInitHook(
  58. VOID
  59. )
  60. {
  61. DEBUG ((DEBUG_INFO, "GpioGroupTierInitHook Start\n"));
  62. if (PcdGet32 (PcdGpioGroupToGpeDw0)) {
  63. GpioSetGroupToGpeDwX (PcdGet32 (PcdGpioGroupToGpeDw0),
  64. PcdGet32 (PcdGpioGroupToGpeDw1),
  65. PcdGet32 (PcdGpioGroupToGpeDw2));
  66. }
  67. DEBUG ((DEBUG_INFO, "GpioGroupTierInitHook End\n"));
  68. }
  69. /**
  70. Configure single GPIO pad for touchpanel interrupt
  71. **/
  72. VOID
  73. TouchpanelGpioInit (
  74. VOID
  75. )
  76. {
  77. GPIO_INIT_CONFIG* TouchpanelPad;
  78. GPIO_PAD_OWN PadOwnVal;
  79. PadOwnVal = 0;
  80. TouchpanelPad = (VOID *) (UINTN) PcdGet32 (PcdBoardGpioTableTouchPanel);
  81. if (TouchpanelPad != NULL) {
  82. GpioGetPadOwnership (TouchpanelPad->GpioPad, &PadOwnVal);
  83. if (PadOwnVal == GpioPadOwnHost) {
  84. GpioConfigurePads (1, TouchpanelPad);
  85. }
  86. }
  87. }
  88. /**
  89. Configure GPIO Before Memory is not ready.
  90. **/
  91. VOID
  92. GpioInitPreMem (
  93. VOID
  94. )
  95. {
  96. if (PcdGet32 (PcdBoardGpioTablePreMem) != 0 && PcdGet16 (PcdBoardGpioTablePreMemSize) != 0) {
  97. ConfigureGpio ((VOID *) (UINTN) PcdGet32 (PcdBoardGpioTablePreMem), (UINTN) PcdGet16 (PcdBoardGpioTablePreMemSize));
  98. }
  99. }
  100. /**
  101. Basic GPIO configuration before memory is ready
  102. **/
  103. VOID
  104. GpioInitEarlyPreMem (
  105. VOID
  106. )
  107. {
  108. GPIO_CONFIG BbrstConfig;
  109. UINT32 WwanBbrstGpio;
  110. WwanBbrstGpio = PcdGet32 (PcdWwanBbrstGpio);
  111. if (WwanBbrstGpio) {
  112. //
  113. // BIOS needs to put modem in OFF state for the two scenarios below.
  114. // 1. Modem RESET# is not asserted via PLTRST# in the previous sleep state
  115. // 2. Modem is disabled via setup option
  116. //
  117. GpioGetPadConfig (WwanBbrstGpio, &BbrstConfig);
  118. if ((PcdGetBool (PcdPcieWwanEnable) == FALSE) ||
  119. (PcdGetBool (PcdWwanResetWorkaround) == TRUE &&
  120. BbrstConfig.Direction == GpioDirOut &&
  121. BbrstConfig.OutputState == GpioOutHigh)) {
  122. //
  123. // Assert FULL_CARD_POWER_OFF#, RESET# and PERST# GPIOs
  124. //
  125. if (PcdGet32 (PcdBoardGpioTableWwanOffEarlyPreMem) != 0 && PcdGet16 (PcdBoardGpioTableWwanOffEarlyPreMemSize) != 0) {
  126. ConfigureGpio ((VOID *) (UINTN) PcdGet32 (PcdBoardGpioTableWwanOffEarlyPreMem), (UINTN) PcdGet16 (PcdBoardGpioTableWwanOffEarlyPreMemSize));
  127. }
  128. if (PcdGetBool (PcdPcieWwanEnable) == TRUE && PcdGetBool (PcdWwanResetWorkaround) == TRUE) {
  129. MicroSecondDelay (1 * 1000); // Delay by 1ms
  130. }
  131. }
  132. //
  133. // Turn ON modem power and de-assert RESET# and PERST# GPIOs
  134. //
  135. if (PcdGetBool (PcdPcieWwanEnable) == TRUE) {
  136. if (PcdGet32 (PcdBoardGpioTableWwanOnEarlyPreMem) != 0 && PcdGet16 (PcdBoardGpioTableWwanOnEarlyPreMemSize) != 0) {
  137. ConfigureGpio ((VOID *) (UINTN) PcdGet32 (PcdBoardGpioTableWwanOnEarlyPreMem), (UINTN) PcdGet16 (PcdBoardGpioTableWwanOnEarlyPreMemSize));
  138. }
  139. }
  140. }
  141. }
  142. /**
  143. Configure GPIO
  144. **/
  145. VOID
  146. GpioInit (
  147. VOID
  148. )
  149. {
  150. ConfigureGpio ((VOID *) (UINTN) PcdGet32 (PcdBoardGpioTable), (UINTN) PcdGet16 (PcdBoardGpioTableSize));
  151. if (PcdGet32 (PcdBoardGpioTable2)) {
  152. ConfigureGpio ((VOID *) (UINTN) PcdGet32 (PcdBoardGpioTable2), (UINTN) PcdGet16 (PcdBoardGpioTable2Size));
  153. }
  154. TouchpanelGpioInit();
  155. //
  156. // Lock pads after initializing platform GPIO.
  157. // Pads which were requested to be unlocked during configuration
  158. // will not be locked.
  159. //
  160. GpioLockPads ();
  161. return;
  162. }
  163. /**
  164. Configure Super IO
  165. **/
  166. VOID
  167. SioInit (
  168. VOID
  169. )
  170. {
  171. //
  172. // Program and Enable Default Super IO Configuration Port Addresses and range
  173. //
  174. PchLpcGenIoRangeSet (PcdGet16 (PcdLpcSioConfigDefaultPort) & (~0xF), 0x10);
  175. PchLpcGenIoRangeSet (SIO_RUNTIME_REG_BASE_ADDRESS & (~0x7F), 0x10);
  176. return;
  177. }
  178. /**
  179. Configure GPIO and SIO before memory ready
  180. @retval EFI_SUCCESS Operation success.
  181. **/
  182. EFI_STATUS
  183. BoardInitPreMem (
  184. VOID
  185. )
  186. {
  187. //
  188. // Obtain Platform Info from HOB.
  189. //
  190. GpioInitPreMem ();
  191. GpioGroupTierInitHook ();
  192. SioInit ();
  193. return EFI_SUCCESS;
  194. }
  195. /**
  196. Configure GPIO and SIO
  197. @retval EFI_SUCCESS Operation success.
  198. **/
  199. EFI_STATUS
  200. BoardInit (
  201. VOID
  202. )
  203. {
  204. GpioInit ();
  205. return EFI_SUCCESS;
  206. }
  207. /**
  208. Do platform specific programming post-memory.
  209. @retval EFI_SUCCESS The function completed successfully.
  210. **/
  211. EFI_STATUS
  212. PlatformSpecificInit (
  213. VOID
  214. )
  215. {
  216. GPIO_CONFIG GpioConfig;
  217. if (IsCnlPch ()) {
  218. //
  219. // Tristate unused pins by audio link mode.
  220. //
  221. ZeroMem(&GpioConfig, sizeof(GPIO_CONFIG));
  222. GpioConfig.PadMode = GpioPadModeGpio;
  223. GpioConfig.HostSoftPadOwn = GpioHostOwnGpio;
  224. GpioConfig.Direction = GpioDirNone;
  225. GpioConfig.OutputState = GpioOutDefault;
  226. GpioConfig.InterruptConfig = GpioIntDis;
  227. GpioConfig.PowerConfig = GpioPlatformReset;
  228. GpioConfig.ElectricalConfig = GpioTermNone;
  229. GpioSetPadConfig (GPIO_CNL_LP_SSP1_SFRM, &GpioConfig);
  230. GpioSetPadConfig (GPIO_CNL_LP_SSP1_TXD, &GpioConfig);
  231. }
  232. return EFI_SUCCESS;
  233. }
  234. /**
  235. Early Board Configuration before memory is ready
  236. @retval EFI_SUCCESS Operation success.
  237. **/
  238. EFI_STATUS
  239. BoardInitEarlyPreMem (
  240. VOID
  241. )
  242. {
  243. GpioInitEarlyPreMem ();
  244. return EFI_SUCCESS;
  245. }