Platform.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /**@file
  2. Platform PEI driver
  3. Copyright (c) 2019-2021, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
  4. Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
  5. Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>
  6. SPDX-License-Identifier: BSD-2-Clause-Patent
  7. **/
  8. //
  9. // The package level header files this module uses
  10. //
  11. #include <PiPei.h>
  12. //
  13. // The Library classes this module consumes
  14. //
  15. #include <Library/DebugLib.h>
  16. #include <Library/HobLib.h>
  17. #include <Library/IoLib.h>
  18. #include <Library/MemoryAllocationLib.h>
  19. #include <Library/PcdLib.h>
  20. #include <Library/PciLib.h>
  21. #include <Library/PeimEntryPoint.h>
  22. #include <Library/PeiServicesLib.h>
  23. #include <Library/ResourcePublicationLib.h>
  24. #include <Guid/MemoryTypeInformation.h>
  25. #include <Ppi/MasterBootMode.h>
  26. #include <IndustryStandard/Pci22.h>
  27. #include <SiFiveU5MCCoreplex.h>
  28. #include "Platform.h"
  29. EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
  30. { EfiACPIMemoryNVS, 0x004 },
  31. { EfiACPIReclaimMemory, 0x008 },
  32. { EfiReservedMemoryType, 0x004 },
  33. { EfiRuntimeServicesData, 0x024 },
  34. { EfiRuntimeServicesCode, 0x030 },
  35. { EfiBootServicesCode, 0x180 },
  36. { EfiBootServicesData, 0xF00 },
  37. { EfiMaxMemoryType, 0x000 }
  38. };
  39. EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {
  40. {
  41. EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
  42. &gEfiPeiMasterBootModePpiGuid,
  43. NULL
  44. }
  45. };
  46. STATIC EFI_BOOT_MODE mBootMode = BOOT_WITH_FULL_CONFIGURATION;
  47. VOID
  48. AddIoMemoryBaseSizeHob (
  49. EFI_PHYSICAL_ADDRESS MemoryBase,
  50. UINT64 MemorySize
  51. )
  52. {
  53. BuildResourceDescriptorHob (
  54. EFI_RESOURCE_MEMORY_MAPPED_IO,
  55. EFI_RESOURCE_ATTRIBUTE_PRESENT |
  56. EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
  57. EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
  58. EFI_RESOURCE_ATTRIBUTE_TESTED,
  59. MemoryBase,
  60. MemorySize
  61. );
  62. }
  63. VOID
  64. AddReservedMemoryBaseSizeHob (
  65. EFI_PHYSICAL_ADDRESS MemoryBase,
  66. UINT64 MemorySize
  67. )
  68. {
  69. BuildResourceDescriptorHob (
  70. EFI_RESOURCE_MEMORY_RESERVED,
  71. EFI_RESOURCE_ATTRIBUTE_PRESENT |
  72. EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
  73. EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
  74. EFI_RESOURCE_ATTRIBUTE_TESTED,
  75. MemoryBase,
  76. MemorySize
  77. );
  78. }
  79. VOID
  80. AddIoMemoryRangeHob (
  81. EFI_PHYSICAL_ADDRESS MemoryBase,
  82. EFI_PHYSICAL_ADDRESS MemoryLimit
  83. )
  84. {
  85. AddIoMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
  86. }
  87. VOID
  88. AddMemoryBaseSizeHob (
  89. EFI_PHYSICAL_ADDRESS MemoryBase,
  90. UINT64 MemorySize
  91. )
  92. {
  93. BuildResourceDescriptorHob (
  94. EFI_RESOURCE_SYSTEM_MEMORY,
  95. EFI_RESOURCE_ATTRIBUTE_PRESENT |
  96. EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
  97. EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
  98. EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
  99. EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
  100. EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
  101. EFI_RESOURCE_ATTRIBUTE_TESTED,
  102. MemoryBase,
  103. MemorySize
  104. );
  105. }
  106. VOID
  107. AddMemoryRangeHob (
  108. EFI_PHYSICAL_ADDRESS MemoryBase,
  109. EFI_PHYSICAL_ADDRESS MemoryLimit
  110. )
  111. {
  112. AddMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
  113. }
  114. VOID
  115. AddUntestedMemoryBaseSizeHob (
  116. EFI_PHYSICAL_ADDRESS MemoryBase,
  117. UINT64 MemorySize
  118. )
  119. {
  120. BuildResourceDescriptorHob (
  121. EFI_RESOURCE_SYSTEM_MEMORY,
  122. EFI_RESOURCE_ATTRIBUTE_PRESENT |
  123. EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
  124. EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
  125. EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
  126. EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
  127. EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE,
  128. MemoryBase,
  129. MemorySize
  130. );
  131. }
  132. VOID
  133. AddUntestedMemoryRangeHob (
  134. EFI_PHYSICAL_ADDRESS MemoryBase,
  135. EFI_PHYSICAL_ADDRESS MemoryLimit
  136. )
  137. {
  138. AddUntestedMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
  139. }
  140. VOID
  141. AddPciResource (
  142. VOID
  143. )
  144. {
  145. //
  146. // Platform-specific
  147. //
  148. }
  149. VOID
  150. MemMapInitialization (
  151. VOID
  152. )
  153. {
  154. //
  155. // Create Memory Type Information HOB
  156. //
  157. BuildGuidDataHob (
  158. &gEfiMemoryTypeInformationGuid,
  159. mDefaultMemoryTypeInformation,
  160. sizeof(mDefaultMemoryTypeInformation)
  161. );
  162. //
  163. // Add PCI IO Port space available for PCI resource allocations.
  164. //
  165. AddPciResource ();
  166. }
  167. VOID
  168. MiscInitialization (
  169. VOID
  170. )
  171. {
  172. //
  173. // Build the CPU HOB with guest RAM size dependent address width and 16-bits
  174. // of IO space. (Side note: unlike other HOBs, the CPU HOB is needed during
  175. // S3 resume as well, so we build it unconditionally.)
  176. //
  177. // TODO: Determine this dynamically from the platform
  178. // setting or the HART configuration.
  179. //
  180. BuildCpuHob (48, 32);
  181. }
  182. /**
  183. Check if system returns from S3.
  184. @return BOOLEAN TRUE, system returned from S3
  185. FALSE, system is not returned from S3
  186. **/
  187. BOOLEAN
  188. CheckResumeFromS3 (
  189. VOID
  190. )
  191. {
  192. //
  193. //Platform implementation-specific
  194. //
  195. return FALSE;
  196. }
  197. VOID
  198. BootModeInitialization (
  199. VOID
  200. )
  201. {
  202. EFI_STATUS Status;
  203. if (CheckResumeFromS3 () == TRUE) {
  204. DEBUG ((DEBUG_INFO, "This is wake from S3\n"));
  205. } else {
  206. DEBUG ((DEBUG_INFO, "This is normal boot\n"));
  207. }
  208. Status = PeiServicesSetBootMode (mBootMode);
  209. ASSERT_EFI_ERROR (Status);
  210. Status = PeiServicesInstallPpi (mPpiBootMode);
  211. ASSERT_EFI_ERROR (Status);
  212. }
  213. /**
  214. Build processor information for U54 Coreplex processor.
  215. @return EFI_SUCCESS Status.
  216. **/
  217. EFI_STATUS
  218. BuildCoreInformationHob (
  219. VOID
  220. )
  221. {
  222. return BuildRiscVSmbiosHobs ();
  223. }
  224. /**
  225. Perform Platform PEI initialization.
  226. @param FileHandle Handle of the file being invoked.
  227. @param PeiServices Describes the list of possible PEI Services.
  228. @return EFI_SUCCESS The PEIM initialized successfully.
  229. **/
  230. EFI_STATUS
  231. EFIAPI
  232. InitializePlatform (
  233. IN EFI_PEI_FILE_HANDLE FileHandle,
  234. IN CONST EFI_PEI_SERVICES **PeiServices
  235. )
  236. {
  237. EFI_STATUS Status;
  238. DEBUG ((DEBUG_INFO, "Platform PEIM Loaded\n"));
  239. BootModeInitialization ();
  240. DEBUG ((DEBUG_INFO, "Platform BOOT mode initiated.\n"));
  241. PublishPeiMemory ();
  242. DEBUG ((DEBUG_INFO, "PEI memory published.\n"));
  243. InitializeRamRegions ();
  244. DEBUG ((DEBUG_INFO, "Platform RAM regions initiated.\n"));
  245. if (mBootMode != BOOT_ON_S3_RESUME) {
  246. PeiFvInitialization ();
  247. MemMapInitialization ();
  248. }
  249. MiscInitialization ();
  250. Status = BuildCoreInformationHob ();
  251. if (EFI_ERROR (Status)) {
  252. DEBUG ((DEBUG_ERROR, "Fail to build processor informstion HOB.\n"));
  253. ASSERT(FALSE);
  254. }
  255. return EFI_SUCCESS;
  256. }