AcpiPlatform.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. /** @file
  2. Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. AcpiPlatform.c
  6. Abstract:
  7. ACPI Platform Driver
  8. **/
  9. #include <PiDxe.h>
  10. #include <Protocol/TcgService.h>
  11. #include <Protocol/FirmwareVolume2.h>
  12. #include "AcpiPlatform.h"
  13. #include "AcpiPlatformHooks.h"
  14. #include "AcpiPlatformHooksLib.h"
  15. #include "Platform.h"
  16. #include <Hpet.h>
  17. #include <Mcfg.h>
  18. #include "Osfr.h"
  19. #include <Guid/GlobalVariable.h>
  20. #include <Guid/SetupVariable.h>
  21. #include <Guid/PlatformInfo.h>
  22. #include <Protocol/CpuIo.h>
  23. #include <Guid/BoardFeatures.h>
  24. #include <Protocol/AcpiSupport.h>
  25. #include <Protocol/AcpiS3Save.h>
  26. #include <Protocol/Ps2Policy.h>
  27. #include <Library/CpuIA32.h>
  28. #include <SetupMode.h>
  29. #include <Guid/AcpiTableStorage.h>
  30. #include <Guid/EfiVpdData.h>
  31. #include <PchAccess.h>
  32. #include <Guid/Vlv2Variable.h>
  33. #include <Guid/PlatformCpuInfo.h>
  34. #include <IndustryStandard/WindowsSmmSecurityMitigationTable.h>
  35. CHAR16 EfiPlatformCpuInfoVariable[] = L"PlatformCpuInfo";
  36. CHAR16 gACPIOSFRModelStringVariableName[] = ACPI_OSFR_MODEL_STRING_VARIABLE_NAME;
  37. CHAR16 gACPIOSFRRefDataBlockVariableName[] = ACPI_OSFR_REF_DATA_BLOCK_VARIABLE_NAME;
  38. CHAR16 gACPIOSFRMfgStringVariableName[] = ACPI_OSFR_MFG_STRING_VARIABLE_NAME;
  39. EFI_CPU_IO_PROTOCOL *mCpuIo;
  40. EFI_GLOBAL_NVS_AREA_PROTOCOL mGlobalNvsArea;
  41. #ifndef __GNUC__
  42. #pragma optimize("", off)
  43. #endif
  44. BOOLEAN mFirstNotify;
  45. EFI_PLATFORM_INFO_HOB *mPlatformInfo;
  46. EFI_GUID mSystemConfigurationGuid = SYSTEM_CONFIGURATION_GUID;
  47. SYSTEM_CONFIGURATION mSystemConfiguration;
  48. SYSTEM_CONFIGURATION mSystemConfig;
  49. UINT8 mSmbusRsvdAddresses[] = PLATFORM_SMBUS_RSVD_ADDRESSES;
  50. UINT8 mNumberSmbusAddress = sizeof( mSmbusRsvdAddresses ) / sizeof( mSmbusRsvdAddresses[0] );
  51. /**
  52. Locate the first instance of a protocol. If the protocol requested is an
  53. FV protocol, then it will return the first FV that contains the ACPI table
  54. storage file.
  55. @param[in] Protocol The protocol to find.
  56. @param[in] Instance Return pointer to the first instance of the protocol.
  57. @param[in] Type The type of protocol to locate.
  58. @retval EFI_SUCCESS The function completed successfully.
  59. @retval EFI_NOT_FOUND The protocol could not be located.
  60. @retval EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.
  61. **/
  62. EFI_STATUS
  63. LocateSupportProtocol (
  64. IN EFI_GUID *Protocol,
  65. OUT VOID **Instance,
  66. IN UINT32 Type
  67. )
  68. {
  69. EFI_STATUS Status;
  70. EFI_HANDLE *HandleBuffer;
  71. UINTN NumberOfHandles;
  72. EFI_FV_FILETYPE FileType;
  73. UINT32 FvStatus;
  74. EFI_FV_FILE_ATTRIBUTES Attributes;
  75. UINTN Size;
  76. UINTN Index;
  77. FvStatus = 0;
  78. //
  79. // Locate protocol.
  80. //
  81. Status = gBS->LocateHandleBuffer (
  82. ByProtocol,
  83. Protocol,
  84. NULL,
  85. &NumberOfHandles,
  86. &HandleBuffer
  87. );
  88. if (EFI_ERROR (Status)) {
  89. //
  90. // Defined errors at this time are not found and out of resources.
  91. //
  92. return Status;
  93. }
  94. //
  95. // Looking for FV with ACPI storage file.
  96. //
  97. for (Index = 0; Index < NumberOfHandles; Index++) {
  98. //
  99. // Get the protocol on this handle.
  100. // This should not fail because of LocateHandleBuffer.
  101. //
  102. Status = gBS->HandleProtocol (
  103. HandleBuffer[Index],
  104. Protocol,
  105. Instance
  106. );
  107. ASSERT (!EFI_ERROR (Status));
  108. if (!Type) {
  109. //
  110. // Not looking for the FV protocol, so find the first instance of the
  111. // protocol. There should not be any errors because our handle buffer
  112. // should always contain at least one or LocateHandleBuffer would have
  113. // returned not found.
  114. //
  115. break;
  116. }
  117. //
  118. // See if it has the ACPI storage file.
  119. //
  120. Status = ((EFI_FIRMWARE_VOLUME_PROTOCOL *) (*Instance))->ReadFile (
  121. *Instance,
  122. &gEfiAcpiTableStorageGuid,
  123. NULL,
  124. &Size,
  125. &FileType,
  126. &Attributes,
  127. &FvStatus
  128. );
  129. //
  130. // If we found it, then we are done.
  131. //
  132. if (!EFI_ERROR (Status)) {
  133. break;
  134. }
  135. }
  136. //
  137. // Our exit status is determined by the success of the previous operations.
  138. // If the protocol was found, Instance already points to it.
  139. //
  140. //
  141. // Free any allocated buffers.
  142. //
  143. gBS->FreePool (HandleBuffer);
  144. return Status;
  145. }
  146. /**
  147. This function will update any runtime platform specific information.
  148. This currently includes:
  149. Setting OEM table values, ID, table ID, creator ID and creator revision.
  150. Enabling the proper processor entries in the APIC tables.
  151. @param[in] Table The table to update.
  152. @retval EFI_SUCCESS The function completed successfully.
  153. **/
  154. EFI_STATUS
  155. PlatformUpdateTables (
  156. IN OUT EFI_ACPI_COMMON_HEADER *Table
  157. )
  158. {
  159. EFI_ACPI_DESCRIPTION_HEADER *TableHeader;
  160. UINT8 *CurrPtr;
  161. UINT8 *EndPtr;
  162. ACPI_APIC_STRUCTURE_PTR *ApicPtr;
  163. UINT8 CurrProcessor;
  164. EFI_STATUS Status;
  165. EFI_MP_SERVICES_PROTOCOL *MpService;
  166. UINTN MaximumNumberOfCPUs;
  167. UINTN NumberOfEnabledCPUs;
  168. UINTN BspIndex;
  169. EFI_ACPI_1_0_ASF_DESCRIPTION_TABLE *AsfEntry;
  170. EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *HpetTbl;
  171. UINT64 OemIdValue;
  172. UINT8 Index;
  173. EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Facp;
  174. EFI_ACPI_OSFR_TABLE *OsfrTable;
  175. EFI_ACPI_OSFR_OCUR_OBJECT *pOcurObject;
  176. EFI_ACPI_OSFR_OCUR_OBJECT OcurObject = {{0xB46F133D, 0x235F, 0x4634, 0x9F, 0x03, 0xB1, 0xC0, 0x1C, 0x54, 0x78, 0x5B}, 0, 0, 0, 0, 0};
  177. CHAR16 *OcurMfgStringBuffer = NULL;
  178. CHAR16 *OcurModelStringBuffer = NULL;
  179. UINT8 *OcurRefDataBlockBuffer = NULL;
  180. UINTN OcurMfgStringBufferSize;
  181. UINTN OcurModelStringBufferSize;
  182. UINTN OcurRefDataBlockBufferSize;
  183. #if defined (IDCC2_SUPPORTED) && IDCC2_SUPPORTED
  184. EFI_ACPI_ASPT_TABLE *pSpttTable;
  185. #endif
  186. UINT16 NumberOfHpets;
  187. UINT16 HpetCapIdValue;
  188. UINT32 HpetBlockID;
  189. EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
  190. UINT8 TempVal;
  191. EFI_ACPI_3_0_IO_APIC_STRUCTURE *IOApicType;
  192. EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *APICTableHeader;
  193. EFI_ACPI_WSMT_TABLE *WsmtTable;
  194. CurrPtr = NULL;
  195. EndPtr = NULL;
  196. ApicPtr = NULL;
  197. CurrProcessor = 0;
  198. if (Table->Signature != EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) {
  199. TableHeader = (EFI_ACPI_DESCRIPTION_HEADER *) Table;
  200. //
  201. // Update the OEMID.
  202. //
  203. OemIdValue = mPlatformInfo->AcpiOemId;
  204. *(UINT32 *)(TableHeader->OemId) = (UINT32)OemIdValue;
  205. *(UINT16 *)(TableHeader->OemId + 4) = *(UINT16*)(((UINT8 *)&OemIdValue) + 4);
  206. if ((Table->Signature != EFI_ACPI_2_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE)) {
  207. //
  208. // Update the OEM Table ID.
  209. //
  210. TableHeader->OemTableId = mPlatformInfo->AcpiOemTableId;
  211. }
  212. //
  213. // Update the OEM Table ID.
  214. //
  215. TableHeader->OemRevision = EFI_ACPI_OEM_REVISION;
  216. //
  217. // Update the creator ID.
  218. //
  219. TableHeader->CreatorId = EFI_ACPI_CREATOR_ID;
  220. //
  221. // Update the creator revision.
  222. //
  223. TableHeader->CreatorRevision = EFI_ACPI_CREATOR_REVISION;
  224. }
  225. //
  226. // Complete this function.
  227. //
  228. //
  229. // Locate the MP services protocol.
  230. //
  231. //
  232. // Find the MP Protocol. This is an MP platform, so MP protocol must be
  233. // there.
  234. //
  235. Status = gBS->LocateProtocol (
  236. &gEfiMpServiceProtocolGuid,
  237. NULL,
  238. (VOID **) &MpService
  239. );
  240. if (EFI_ERROR (Status)) {
  241. return Status;
  242. }
  243. //
  244. // Determine the number of processors.
  245. //
  246. MpService->GetNumberOfProcessors (
  247. MpService,
  248. &MaximumNumberOfCPUs,
  249. &NumberOfEnabledCPUs
  250. );
  251. ASSERT (MaximumNumberOfCPUs <= MAX_CPU_NUM && NumberOfEnabledCPUs >= 1);
  252. //
  253. // Assign a invalid intial value for update.
  254. //
  255. //
  256. // Update the processors in the APIC table.
  257. //
  258. switch (Table->Signature) {
  259. case EFI_ACPI_1_0_ASF_DESCRIPTION_TABLE_SIGNATURE:
  260. //
  261. // Update the table if ASF is enabled. Otherwise, return error so caller will not install.
  262. //
  263. if (mSystemConfig.Asf == 1) {
  264. return EFI_UNSUPPORTED;
  265. }
  266. AsfEntry = (EFI_ACPI_1_0_ASF_DESCRIPTION_TABLE *) Table;
  267. TempVal = (mNumberSmbusAddress < ASF_ADDR_DEVICE_ARRAY_LENGTH)? mNumberSmbusAddress : ASF_ADDR_DEVICE_ARRAY_LENGTH;
  268. for (Index = 0; Index < TempVal; Index++) {
  269. AsfEntry->AsfAddr.FixedSmbusAddresses[Index] = mSmbusRsvdAddresses[Index];
  270. }
  271. break;
  272. case EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE:
  273. Status = MpService->WhoAmI (
  274. MpService,
  275. &BspIndex
  276. );
  277. //
  278. // PCAT_COMPAT Set to 1 indicate 8259 vectors should be disabled.
  279. //
  280. APICTableHeader = (EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)Table;
  281. APICTableHeader->Flags |= EFI_ACPI_3_0_PCAT_COMPAT;
  282. CurrPtr = (UINT8 *) &((EFI_ACPI_DESCRIPTION_HEADER *) Table)[1];
  283. CurrPtr = CurrPtr + 8;
  284. //
  285. // Size of Local APIC Address & Flag.
  286. //
  287. EndPtr = (UINT8 *) Table;
  288. EndPtr = EndPtr + Table->Length;
  289. while (CurrPtr < EndPtr) {
  290. ApicPtr = (ACPI_APIC_STRUCTURE_PTR *) CurrPtr;
  291. switch (ApicPtr->AcpiApicCommon.Type) {
  292. case EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC:
  293. //
  294. // ESS override
  295. // Fix for Ordering of MADT to be maintained as it is in MADT table.
  296. //
  297. // Update processor enabled or disabled and keep the local APIC
  298. // order in MADT intact.
  299. //
  300. // Sanity check to make sure proc-id is not arbitrary.
  301. //
  302. DEBUG ((EFI_D_ERROR, "ApicPtr->AcpiLocalApic.AcpiProcessorId = %x, MaximumNumberOfCPUs = %x\n", \
  303. ApicPtr->AcpiLocalApic.AcpiProcessorId, MaximumNumberOfCPUs));
  304. if(ApicPtr->AcpiLocalApic.AcpiProcessorId > MaximumNumberOfCPUs) {
  305. ApicPtr->AcpiLocalApic.AcpiProcessorId = (UINT8)MaximumNumberOfCPUs;
  306. }
  307. ApicPtr->AcpiLocalApic.Flags = 0;
  308. for (CurrProcessor = 0; CurrProcessor < MaximumNumberOfCPUs; CurrProcessor++) {
  309. Status = MpService->GetProcessorInfo (
  310. MpService,
  311. CurrProcessor,
  312. &ProcessorInfoBuffer
  313. );
  314. if (Status == EFI_SUCCESS && ProcessorInfoBuffer.ProcessorId == ApicPtr->AcpiLocalApic.ApicId) {
  315. //
  316. // Check to see whether or not a processor (or thread) is enabled.
  317. //
  318. if ((BspIndex == CurrProcessor) || ((ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT) != 0)) {
  319. //
  320. // Go on and check if Hyper Threading is enabled. If HT not enabled
  321. // hide this thread from OS by not setting the flag to 1. This is the
  322. // software way to disable Hyper Threading. Basically we just hide it
  323. // from the OS.
  324. //
  325. ApicPtr->AcpiLocalApic.Flags = EFI_ACPI_1_0_LOCAL_APIC_ENABLED;
  326. if(ProcessorInfoBuffer.Location.Thread != 0) {
  327. ApicPtr->AcpiLocalApic.Flags = 0;
  328. }
  329. AppendCpuMapTableEntry (&(ApicPtr->AcpiLocalApic));
  330. }
  331. break;
  332. }
  333. }
  334. //
  335. // If no APIC-ID match, the cpu may not be populated.
  336. //
  337. break;
  338. case EFI_ACPI_3_0_IO_APIC:
  339. IOApicType = (EFI_ACPI_3_0_IO_APIC_STRUCTURE *)CurrPtr;
  340. IOApicType->IoApicId = 0x02;
  341. //
  342. // IO APIC entries can be patched here.
  343. //
  344. break;
  345. }
  346. CurrPtr = CurrPtr + ApicPtr->AcpiApicCommon.Length;
  347. }
  348. break;
  349. case EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE:
  350. Facp = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) Table;
  351. Facp->Flags &= (UINT32)(~(3<<2));
  352. break;
  353. case EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:
  354. //
  355. // Patch the memory resource.
  356. //
  357. PatchDsdtTable ((EFI_ACPI_DESCRIPTION_HEADER *) Table);
  358. break;
  359. case EFI_ACPI_3_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:
  360. //
  361. // Gv3 support
  362. //
  363. // TBD: Need re-design based on the ValleyTrail platform.
  364. //
  365. break;
  366. case EFI_ACPI_3_0_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE:
  367. //
  368. // Adjust HPET Table to correct the Base Address.
  369. //
  370. // Enable HPET always as Hpet.asi always indicates that Hpet is enabled.
  371. //
  372. MmioOr8 (R_PCH_PCH_HPET + R_PCH_PCH_HPET_GCFG, B_PCH_PCH_HPET_GCFG_EN);
  373. HpetTbl = (EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *) Table;
  374. HpetTbl->BaseAddressLower32Bit.Address = HPET_BASE_ADDRESS;
  375. HpetTbl->EventTimerBlockId = *((UINT32*)(UINTN)HPET_BASE_ADDRESS);
  376. HpetCapIdValue = *(UINT16 *)(UINTN)(HPET_BASE_ADDRESS);
  377. NumberOfHpets = HpetCapIdValue & B_PCH_PCH_HPET_GCID_NT; // Bits [8:12] contains the number of Hpets
  378. HpetBlockID = EFI_ACPI_EVENT_TIMER_BLOCK_ID;
  379. if((NumberOfHpets) && (NumberOfHpets & B_PCH_PCH_HPET_GCID_NT)) {
  380. HpetBlockID |= (NumberOfHpets);
  381. }
  382. HpetTbl->EventTimerBlockId = HpetBlockID;
  383. break;
  384. case EFI_ACPI_3_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE:
  385. //
  386. // Update MCFG base and end bus number.
  387. //
  388. ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE *) Table)->Segment[0].BaseAddress
  389. = mPlatformInfo->PciData.PciExpressBase;
  390. ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE *) Table)->Segment[0].EndBusNumber
  391. = (UINT8)RShiftU64 (mPlatformInfo->PciData.PciExpressSize, 20) - 1;
  392. break;
  393. case EFI_ACPI_OSFR_TABLE_SIGNATURE:
  394. //
  395. // Get size of OSFR variable.
  396. //
  397. OcurMfgStringBufferSize = 0;
  398. Status = gRT->GetVariable (
  399. gACPIOSFRMfgStringVariableName,
  400. &gACPIOSFRMfgStringVariableGuid,
  401. NULL,
  402. &OcurMfgStringBufferSize,
  403. NULL
  404. );
  405. if (Status != EFI_BUFFER_TOO_SMALL) {
  406. //
  407. // Variable must not be present on the system.
  408. //
  409. return EFI_UNSUPPORTED;
  410. }
  411. //
  412. // Allocate memory for variable data.
  413. //
  414. OcurMfgStringBuffer = AllocatePool (OcurMfgStringBufferSize);
  415. Status = gRT->GetVariable (
  416. gACPIOSFRMfgStringVariableName,
  417. &gACPIOSFRMfgStringVariableGuid,
  418. NULL,
  419. &OcurMfgStringBufferSize,
  420. OcurMfgStringBuffer
  421. );
  422. if (!EFI_ERROR (Status)) {
  423. OcurModelStringBufferSize = 0;
  424. Status = gRT->GetVariable (
  425. gACPIOSFRModelStringVariableName,
  426. &gACPIOSFRModelStringVariableGuid,
  427. NULL,
  428. &OcurModelStringBufferSize,
  429. NULL
  430. );
  431. if (Status != EFI_BUFFER_TOO_SMALL) {
  432. //
  433. // Variable must not be present on the system.
  434. //
  435. return EFI_UNSUPPORTED;
  436. }
  437. //
  438. // Allocate memory for variable data.
  439. //
  440. OcurModelStringBuffer = AllocatePool (OcurModelStringBufferSize);
  441. Status = gRT->GetVariable (
  442. gACPIOSFRModelStringVariableName,
  443. &gACPIOSFRModelStringVariableGuid,
  444. NULL,
  445. &OcurModelStringBufferSize,
  446. OcurModelStringBuffer
  447. );
  448. if (!EFI_ERROR (Status)) {
  449. OcurRefDataBlockBufferSize = 0;
  450. Status = gRT->GetVariable (
  451. gACPIOSFRRefDataBlockVariableName,
  452. &gACPIOSFRRefDataBlockVariableGuid,
  453. NULL,
  454. &OcurRefDataBlockBufferSize,
  455. NULL
  456. );
  457. if (Status == EFI_BUFFER_TOO_SMALL) {
  458. //
  459. // Allocate memory for variable data.
  460. //
  461. OcurRefDataBlockBuffer = AllocatePool (OcurRefDataBlockBufferSize);
  462. Status = gRT->GetVariable (
  463. gACPIOSFRRefDataBlockVariableName,
  464. &gACPIOSFRRefDataBlockVariableGuid,
  465. NULL,
  466. &OcurRefDataBlockBufferSize,
  467. OcurRefDataBlockBuffer
  468. );
  469. }
  470. OsfrTable = (EFI_ACPI_OSFR_TABLE *) Table;
  471. //
  472. // Currently only one object is defined: OCUR_OSFR_TABLE.
  473. //
  474. OsfrTable->ObjectCount = 1;
  475. //
  476. // Initialize table length to fixed portion of the ACPI OSFR table.
  477. //
  478. OsfrTable->Header.Length = sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION);
  479. *(UINT32 *)((UINTN) OsfrTable + sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION)) = \
  480. (UINT32) (sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION) + sizeof (UINT32));
  481. pOcurObject = (EFI_ACPI_OSFR_OCUR_OBJECT *)((UINTN) OsfrTable + sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION) + \
  482. sizeof (UINT32));
  483. CopyMem (pOcurObject, &OcurObject, sizeof (EFI_ACPI_OSFR_OCUR_OBJECT));
  484. pOcurObject->ManufacturerNameStringOffset = (UINT32)((UINTN) pOcurObject - (UINTN) OsfrTable + \
  485. sizeof (EFI_ACPI_OSFR_OCUR_OBJECT));
  486. pOcurObject->ModelNameStringOffset = (UINT32)((UINTN) pOcurObject - (UINTN) OsfrTable + \
  487. sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize);
  488. if (OcurRefDataBlockBufferSize > 0) {
  489. pOcurObject->MicrosoftReferenceOffset = (UINT32)((UINTN) pOcurObject - (UINTN) OsfrTable + \
  490. sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize + OcurModelStringBufferSize);
  491. }
  492. CopyMem ((UINTN *)((UINTN) pOcurObject + sizeof (EFI_ACPI_OSFR_OCUR_OBJECT)), OcurMfgStringBuffer, \
  493. OcurMfgStringBufferSize);
  494. CopyMem ((UINTN *)((UINTN) pOcurObject + sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize), \
  495. OcurModelStringBuffer, OcurModelStringBufferSize);
  496. if (OcurRefDataBlockBufferSize > 0) {
  497. CopyMem ((UINTN *)((UINTN) pOcurObject + sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize + \
  498. OcurModelStringBufferSize),OcurRefDataBlockBuffer, OcurRefDataBlockBufferSize);
  499. }
  500. OsfrTable->Header.Length += (UINT32)(OcurMfgStringBufferSize + OcurModelStringBufferSize + OcurRefDataBlockBufferSize);
  501. OsfrTable->Header.Length += sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + sizeof (UINT32);
  502. }
  503. }
  504. gBS->FreePool (OcurMfgStringBuffer);
  505. gBS->FreePool (OcurModelStringBuffer);
  506. gBS->FreePool (OcurRefDataBlockBuffer);
  507. break;
  508. case EFI_ACPI_WINDOWS_SMM_SECURITY_MITIGATION_TABLE_SIGNATURE:
  509. WsmtTable = (EFI_ACPI_WSMT_TABLE *) Table;
  510. //
  511. // Update Microsoft WSMT table Protections flags.
  512. //
  513. WsmtTable->ProtectionFlags = ((WsmtTable->ProtectionFlags) | (EFI_WSMT_PROTECTION_FLAGS_FIXED_COMM_BUFFERS | EFI_WSMT_PROTECTION_FLAGS_COMM_BUFFER_NESTED_PTR_PROTECTION ));
  514. break;
  515. default:
  516. break;
  517. }
  518. //
  519. //
  520. // Update the hardware signature in the FACS structure.
  521. //
  522. //
  523. // Locate the SPCR table and update based on current settings.
  524. // The user may change CR settings via setup or other methods.
  525. // The SPCR table must match.
  526. //
  527. return EFI_SUCCESS;
  528. }
  529. /**
  530. Routine Description:
  531. GC_TODO: Add function description.
  532. Arguments:
  533. Event - GC_TODO: add argument description
  534. Context - GC_TODO: add argument description
  535. Returns:
  536. GC_TODO: add return values
  537. **/
  538. STATIC
  539. VOID
  540. EFIAPI
  541. OnReadyToBoot (
  542. IN EFI_EVENT Event,
  543. IN VOID *Context
  544. )
  545. {
  546. EFI_STATUS Status;
  547. EFI_ACPI_TABLE_VERSION TableVersion;
  548. EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupport;
  549. EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
  550. SYSTEM_CONFIGURATION SetupVarBuffer;
  551. UINTN VariableSize;
  552. EFI_PLATFORM_CPU_INFO *PlatformCpuInfoPtr = NULL;
  553. EFI_PLATFORM_CPU_INFO PlatformCpuInfo;
  554. EFI_PEI_HOB_POINTERS GuidHob;
  555. if (mFirstNotify) {
  556. return;
  557. }
  558. mFirstNotify = TRUE;
  559. //
  560. // To avoid compiler warning of "C4701: potentially uninitialized local variable 'PlatformCpuInfo' used".
  561. //
  562. PlatformCpuInfo.CpuVersion.FullCpuId = 0;
  563. //
  564. // Get Platform CPU Info HOB.
  565. //
  566. PlatformCpuInfoPtr = NULL;
  567. ZeroMem (&PlatformCpuInfo, sizeof(EFI_PLATFORM_CPU_INFO));
  568. VariableSize = sizeof(EFI_PLATFORM_CPU_INFO);
  569. Status = gRT->GetVariable(
  570. EfiPlatformCpuInfoVariable,
  571. &gEfiVlv2VariableGuid,
  572. NULL,
  573. &VariableSize,
  574. PlatformCpuInfoPtr
  575. );
  576. if (EFI_ERROR(Status)) {
  577. GuidHob.Raw = GetHobList ();
  578. if (GuidHob.Raw != NULL) {
  579. if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformCpuInfoGuid, GuidHob.Raw)) != NULL) {
  580. PlatformCpuInfoPtr = GET_GUID_HOB_DATA (GuidHob.Guid);
  581. }
  582. }
  583. }
  584. if ((PlatformCpuInfoPtr != NULL)) {
  585. CopyMem(&PlatformCpuInfo, PlatformCpuInfoPtr, sizeof(EFI_PLATFORM_CPU_INFO));
  586. }
  587. //
  588. // Update the ACPI parameter blocks finally.
  589. //
  590. VariableSize = sizeof (SYSTEM_CONFIGURATION);
  591. Status = gRT->GetVariable (
  592. L"Setup",
  593. &mSystemConfigurationGuid,
  594. NULL,
  595. &VariableSize,
  596. &SetupVarBuffer
  597. );
  598. if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {
  599. //The setup variable is corrupted
  600. VariableSize = sizeof(SYSTEM_CONFIGURATION);
  601. Status = gRT->GetVariable(
  602. L"SetupRecovery",
  603. &mSystemConfigurationGuid,
  604. NULL,
  605. &VariableSize,
  606. &SetupVarBuffer
  607. );
  608. ASSERT_EFI_ERROR (Status);
  609. }
  610. //
  611. // Find the AcpiSupport protocol.
  612. //
  613. Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0);
  614. ASSERT_EFI_ERROR (Status);
  615. TableVersion = EFI_ACPI_TABLE_VERSION_2_0;
  616. //
  617. // Publish ACPI 1.0 or 2.0 Tables.
  618. //
  619. Status = AcpiSupport->PublishTables (
  620. AcpiSupport,
  621. TableVersion
  622. );
  623. ASSERT_EFI_ERROR (Status);
  624. //
  625. // S3 script save.
  626. //
  627. Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID **) &AcpiS3Save);
  628. if (!EFI_ERROR (Status)) {
  629. AcpiS3Save->S3Save (AcpiS3Save, NULL);
  630. }
  631. }
  632. VOID
  633. PR1FSASetting (
  634. IN VOID
  635. )
  636. {
  637. //
  638. // for FSA on PR1.
  639. //
  640. if (mPlatformInfo->BoardId == BOARD_ID_BL_FFRD && mPlatformInfo->BoardRev >= PR1) {
  641. DEBUG((EFI_D_ERROR, "Set FSA status = 1 for FFRD PR1\n"));
  642. mGlobalNvsArea.Area->FsaStatus = mSystemConfiguration.PchFSAOn;
  643. }
  644. if (mPlatformInfo->BoardId == BOARD_ID_BL_FFRD8) {
  645. DEBUG((EFI_D_ERROR, "Set FSA status = 1 for FFRD8\n"));
  646. mGlobalNvsArea.Area->FsaStatus = mSystemConfiguration.PchFSAOn;
  647. }
  648. }
  649. /**
  650. Entry point for Acpi platform driver.
  651. @param[in] ImageHandle A handle for the image that is initializing this driver.
  652. @param[in] SystemTable A pointer to the EFI system table.
  653. @retval EFI_SUCCESS Driver initialized successfully.
  654. @retval EFI_LOAD_ERROR Failed to Initialize or has been loaded.
  655. @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
  656. **/
  657. EFI_STATUS
  658. EFIAPI
  659. AcpiPlatformEntryPoint (
  660. IN EFI_HANDLE ImageHandle,
  661. IN EFI_SYSTEM_TABLE *SystemTable
  662. )
  663. {
  664. EFI_STATUS Status;
  665. EFI_STATUS AcpiStatus;
  666. EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupport;
  667. EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;
  668. INTN Instance;
  669. EFI_ACPI_COMMON_HEADER *CurrentTable;
  670. UINTN TableHandle;
  671. UINT32 FvStatus;
  672. UINTN Size;
  673. EFI_EVENT Event;
  674. EFI_ACPI_TABLE_VERSION TableVersion;
  675. UINTN VarSize;
  676. UINTN SysCfgSize;
  677. EFI_HANDLE Handle;
  678. EFI_PS2_POLICY_PROTOCOL *Ps2Policy;
  679. EFI_PEI_HOB_POINTERS GuidHob;
  680. UINT8 PortData;
  681. EFI_MP_SERVICES_PROTOCOL *MpService;
  682. UINTN MaximumNumberOfCPUs;
  683. UINTN NumberOfEnabledCPUs;
  684. PCH_STEPPING pchStepping;
  685. mFirstNotify = FALSE;
  686. TableVersion = EFI_ACPI_TABLE_VERSION_2_0;
  687. Instance = 0;
  688. CurrentTable = NULL;
  689. TableHandle = 0;
  690. //
  691. // Update HOB variable for PCI resource information.
  692. // Get the HOB list. If it is not present, then ASSERT.
  693. //
  694. GuidHob.Raw = GetHobList ();
  695. if (GuidHob.Raw != NULL) {
  696. if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) {
  697. mPlatformInfo = GET_GUID_HOB_DATA (GuidHob.Guid);
  698. }
  699. }
  700. //
  701. // Search for the Memory Configuration GUID HOB. If it is not present, then
  702. // there's nothing we can do. It may not exist on the update path.
  703. //
  704. VarSize = sizeof(SYSTEM_CONFIGURATION);
  705. Status = gRT->GetVariable(
  706. L"Setup",
  707. &mSystemConfigurationGuid,
  708. NULL,
  709. &VarSize,
  710. &mSystemConfiguration
  711. );
  712. if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
  713. //The setup variable is corrupted
  714. VarSize = sizeof(SYSTEM_CONFIGURATION);
  715. Status = gRT->GetVariable(
  716. L"SetupRecovery",
  717. &mSystemConfigurationGuid,
  718. NULL,
  719. &VarSize,
  720. &mSystemConfiguration
  721. );
  722. ASSERT_EFI_ERROR (Status);
  723. }
  724. //
  725. // Find the AcpiSupport protocol.
  726. //
  727. Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0);
  728. ASSERT_EFI_ERROR (Status);
  729. //
  730. // Locate the firmware volume protocol.
  731. //
  732. Status = LocateSupportProtocol (&gEfiFirmwareVolume2ProtocolGuid, (VOID **) &FwVol, 1);
  733. ASSERT_EFI_ERROR (Status);
  734. //
  735. // Read the current system configuration variable store.
  736. //
  737. SysCfgSize = sizeof(SYSTEM_CONFIGURATION);
  738. Status = gRT->GetVariable (
  739. L"Setup",
  740. &gEfiNormalSetupGuid,
  741. NULL,
  742. &SysCfgSize,
  743. &mSystemConfig
  744. );
  745. if (EFI_ERROR (Status) || SysCfgSize != sizeof(SYSTEM_CONFIGURATION)) {
  746. //The setup variable is corrupted
  747. SysCfgSize = sizeof(SYSTEM_CONFIGURATION);
  748. Status = gRT->GetVariable(
  749. L"SetupRecovery",
  750. &gEfiNormalSetupGuid,
  751. NULL,
  752. &SysCfgSize,
  753. &mSystemConfig
  754. );
  755. ASSERT_EFI_ERROR (Status);
  756. }
  757. Status = EFI_SUCCESS;
  758. Instance = 0;
  759. //
  760. // TBD: Need re-design based on the ValleyTrail platform.
  761. //
  762. Status = gBS->LocateProtocol (
  763. &gEfiMpServiceProtocolGuid,
  764. NULL,
  765. (VOID **) &MpService
  766. );
  767. if (EFI_ERROR (Status)) {
  768. return Status;
  769. }
  770. //
  771. // Determine the number of processors.
  772. //
  773. MpService->GetNumberOfProcessors (
  774. MpService,
  775. &MaximumNumberOfCPUs,
  776. &NumberOfEnabledCPUs
  777. );
  778. //
  779. // Allocate and initialize the NVS area for SMM and ASL communication.
  780. //
  781. Status = gBS->AllocatePool (
  782. EfiACPIMemoryNVS,
  783. sizeof (EFI_GLOBAL_NVS_AREA),
  784. (void **)&mGlobalNvsArea.Area
  785. );
  786. ASSERT_EFI_ERROR (Status);
  787. gBS->SetMem (
  788. mGlobalNvsArea.Area,
  789. sizeof (EFI_GLOBAL_NVS_AREA),
  790. 0
  791. );
  792. DEBUG((EFI_D_ERROR, "mGlobalNvsArea.Area is at 0x%X\n", mGlobalNvsArea.Area));
  793. //
  794. // Update global NVS area for ASL and SMM init code to use.
  795. //
  796. mGlobalNvsArea.Area->ApicEnable = 1;
  797. mGlobalNvsArea.Area->EmaEnable = 0;
  798. mGlobalNvsArea.Area->NumberOfBatteries = 1;
  799. mGlobalNvsArea.Area->BatteryCapacity0 = 100;
  800. mGlobalNvsArea.Area->BatteryStatus0 = 84;
  801. mGlobalNvsArea.Area->OnboardCom = 1;
  802. mGlobalNvsArea.Area->IdeMode = 0;
  803. mGlobalNvsArea.Area->PowerState = 0;
  804. mGlobalNvsArea.Area->LogicalProcessorCount = (UINT8)NumberOfEnabledCPUs;
  805. mGlobalNvsArea.Area->PassiveThermalTripPoint = mSystemConfiguration.PassiveThermalTripPoint;
  806. mGlobalNvsArea.Area->PassiveTc1Value = mSystemConfiguration.PassiveTc1Value;
  807. mGlobalNvsArea.Area->PassiveTc2Value = mSystemConfiguration.PassiveTc2Value;
  808. mGlobalNvsArea.Area->PassiveTspValue = mSystemConfiguration.PassiveTspValue;
  809. mGlobalNvsArea.Area->CriticalThermalTripPoint = mSystemConfiguration.CriticalThermalTripPoint;
  810. mGlobalNvsArea.Area->IgdPanelType = mSystemConfiguration.IgdFlatPanel;
  811. mGlobalNvsArea.Area->IgdPanelScaling = mSystemConfiguration.PanelScaling;
  812. mGlobalNvsArea.Area->IgdSciSmiMode = 0;
  813. mGlobalNvsArea.Area->IgdTvFormat = 0;
  814. mGlobalNvsArea.Area->IgdTvMinor = 0;
  815. mGlobalNvsArea.Area->IgdSscConfig = 1;
  816. mGlobalNvsArea.Area->IgdBiaConfig = mSystemConfiguration.IgdLcdIBia;
  817. mGlobalNvsArea.Area->IgdBlcConfig = mSystemConfiguration.IgdLcdIGmchBlc;
  818. mGlobalNvsArea.Area->IgdDvmtMemSize = mSystemConfiguration.IgdDvmt50TotalAlloc;
  819. mGlobalNvsArea.Area->IgdPAVP = mSystemConfiguration.PavpMode;
  820. mGlobalNvsArea.Area->AlsEnable = mSystemConfiguration.AlsEnable;
  821. mGlobalNvsArea.Area->BacklightControlSupport = 2;
  822. mGlobalNvsArea.Area->BrightnessPercentage = 100;
  823. mGlobalNvsArea.Area->IgdState = 1;
  824. mGlobalNvsArea.Area->LidState = 1;
  825. mGlobalNvsArea.Area->DeviceId1 = 0x80000100 ;
  826. mGlobalNvsArea.Area->DeviceId2 = 0x80000400 ;
  827. mGlobalNvsArea.Area->DeviceId3 = 0x80000200 ;
  828. mGlobalNvsArea.Area->DeviceId4 = 0x04;
  829. mGlobalNvsArea.Area->DeviceId5 = 0x05;
  830. mGlobalNvsArea.Area->NumberOfValidDeviceId = 4 ;
  831. mGlobalNvsArea.Area->CurrentDeviceList = 0x0F ;
  832. mGlobalNvsArea.Area->PreviousDeviceList = 0x0F ;
  833. mGlobalNvsArea.Area->UartSelection = mSystemConfiguration.UartInterface;
  834. mGlobalNvsArea.Area->PcuUart1Enable = mSystemConfiguration.PcuUart1;
  835. mGlobalNvsArea.Area->NativePCIESupport = 1;
  836. mGlobalNvsArea.Area->RtcBattery = mSystemConfiguration.RtcBattery;
  837. //
  838. // Update BootMode: 0:ACPI mode; 1:PCI mode
  839. //
  840. mGlobalNvsArea.Area->LpssSccMode = mSystemConfiguration.LpssPciModeEnabled;
  841. if (mSystemConfiguration.LpssMipiHsi == 0) {
  842. mGlobalNvsArea.Area->MipiHsiAddr = 0;
  843. mGlobalNvsArea.Area->MipiHsiLen = 0;
  844. mGlobalNvsArea.Area->MipiHsi1Addr = 0;
  845. mGlobalNvsArea.Area->MipiHsi1Len = 0;
  846. }
  847. //
  848. // Platform Flavor
  849. //
  850. mGlobalNvsArea.Area->PlatformFlavor = mPlatformInfo->PlatformFlavor;
  851. //
  852. // Update the Platform id
  853. //
  854. mGlobalNvsArea.Area->BoardID = mPlatformInfo->BoardId;
  855. //
  856. // Update the Board Revision
  857. //
  858. mGlobalNvsArea.Area->FabID = mPlatformInfo->BoardRev;
  859. //
  860. // Update SOC Stepping
  861. //
  862. mGlobalNvsArea.Area->SocStepping = (UINT8)(PchStepping());
  863. mGlobalNvsArea.Area->OtgMode = mSystemConfiguration.PchUsbOtg;
  864. pchStepping = PchStepping();
  865. if (mSystemConfiguration.UsbAutoMode == 1) {
  866. //
  867. // Auto mode is enabled.
  868. //
  869. if (PchA0 == pchStepping) {
  870. //
  871. // For A0, EHCI is enabled as default.
  872. //
  873. mSystemConfiguration.PchUsb20 = 1;
  874. mSystemConfiguration.PchUsb30Mode = 0;
  875. mSystemConfiguration.UsbXhciSupport = 0;
  876. DEBUG ((EFI_D_INFO, "EHCI is enabled as default. SOC 0x%x\n", pchStepping));
  877. } else {
  878. //
  879. // For A1 and later, XHCI is enabled as default.
  880. //
  881. mSystemConfiguration.PchUsb20 = 0;
  882. mSystemConfiguration.PchUsb30Mode = 1;
  883. mSystemConfiguration.UsbXhciSupport = 1;
  884. DEBUG ((EFI_D_INFO, "XHCI is enabled as default. SOC 0x%x\n", pchStepping));
  885. }
  886. }
  887. mGlobalNvsArea.Area->XhciMode = mSystemConfiguration.PchUsb30Mode;
  888. mGlobalNvsArea.Area->Stepping = mPlatformInfo->IchRevision;
  889. //
  890. // Override invalid Pre-Boot Driver and XhciMode combination.
  891. //
  892. if ((mSystemConfiguration.UsbXhciSupport == 0) && (mSystemConfiguration.PchUsb30Mode == 3)) {
  893. mGlobalNvsArea.Area->XhciMode = 2;
  894. }
  895. if ((mSystemConfiguration.UsbXhciSupport == 1) && (mSystemConfiguration.PchUsb30Mode == 2)) {
  896. mGlobalNvsArea.Area->XhciMode = 3;
  897. }
  898. DEBUG ((EFI_D_ERROR, "ACPI NVS XHCI:0x%x\n", mGlobalNvsArea.Area->XhciMode));
  899. mGlobalNvsArea.Area->PmicEnable = GLOBAL_NVS_DEVICE_DISABLE;
  900. mGlobalNvsArea.Area->BatteryChargingSolution = GLOBAL_NVS_DEVICE_DISABLE;
  901. mGlobalNvsArea.Area->ISPDevSel = mSystemConfiguration.ISPDevSel;
  902. mGlobalNvsArea.Area->LpeEnable = mSystemConfiguration.Lpe;
  903. mGlobalNvsArea.Area->LpeAudioReportedByDSDT = mSystemConfiguration.LpeAudioReportedByDSDT;
  904. if (mSystemConfiguration.ISPEn == 0) {
  905. mGlobalNvsArea.Area->ISPDevSel = GLOBAL_NVS_DEVICE_DISABLE;
  906. }
  907. mGlobalNvsArea.Area->WittEnable = mSystemConfiguration.WittEnable;
  908. mGlobalNvsArea.Area->UtsEnable = mSystemConfiguration.UtsEnable;
  909. mGlobalNvsArea.Area->SarEnable = mSystemConfiguration.SAR1;
  910. mGlobalNvsArea.Area->ReservedO = 1;
  911. SettingI2CTouchAddress();
  912. mGlobalNvsArea.Area->IdleReserve= mSystemConfiguration.IdleReserve;
  913. //
  914. // Read BMBOUND and store it in GlobalNVS to pass into ASL.
  915. //
  916. // BUGBUG: code was moved into silicon reference code.
  917. //
  918. if (mSystemConfiguration.eMMCBootMode== 1) {
  919. //
  920. // Auto detect mode.
  921. //
  922. DEBUG ((EFI_D_ERROR, "Auto detect mode------------start\n"));
  923. //
  924. // Silicon Steppings.
  925. //
  926. switch (PchStepping()) {
  927. case PchA0: // A0/A1
  928. case PchA1:
  929. DEBUG ((EFI_D_ERROR, "SOC A0/A1: eMMC 4.41 Configuration\n"));
  930. mSystemConfiguration.LpsseMMCEnabled = 1;
  931. mSystemConfiguration.LpsseMMC45Enabled = 0;
  932. break;
  933. case PchB0: // B0 and later.
  934. default:
  935. DEBUG ((EFI_D_ERROR, "SOC B0 and later: eMMC 4.5 Configuration\n"));
  936. mSystemConfiguration.LpsseMMCEnabled = 0;
  937. mSystemConfiguration.LpsseMMC45Enabled = 1;
  938. break;
  939. }
  940. } else if (mSystemConfiguration.eMMCBootMode == 2) {
  941. //
  942. // eMMC 4.41
  943. //
  944. DEBUG ((EFI_D_ERROR, "Force to eMMC 4.41 Configuration\n"));
  945. mSystemConfiguration.LpsseMMCEnabled = 1;
  946. mSystemConfiguration.LpsseMMC45Enabled = 0;
  947. } else if (mSystemConfiguration.eMMCBootMode == 3) {
  948. //
  949. // eMMC 4.5
  950. //
  951. DEBUG ((EFI_D_ERROR, "Force to eMMC 4.5 Configuration\n"));
  952. mSystemConfiguration.LpsseMMCEnabled = 0;
  953. mSystemConfiguration.LpsseMMC45Enabled = 1;
  954. } else {
  955. //
  956. // Disable eMMC controllers.
  957. //
  958. DEBUG ((EFI_D_ERROR, "Disable eMMC controllers\n"));
  959. mSystemConfiguration.LpsseMMCEnabled = 0;
  960. mSystemConfiguration.LpsseMMC45Enabled = 0;
  961. }
  962. mGlobalNvsArea.Area->emmcVersion = 0;
  963. if (mSystemConfiguration.LpsseMMCEnabled) {
  964. DEBUG ((EFI_D_ERROR, "mGlobalNvsArea.Area->emmcVersion = 0\n"));
  965. mGlobalNvsArea.Area->emmcVersion = 0;
  966. }
  967. if (mSystemConfiguration.LpsseMMC45Enabled) {
  968. DEBUG ((EFI_D_ERROR, "mGlobalNvsArea.Area->emmcVersion = 1\n"));
  969. mGlobalNvsArea.Area->emmcVersion = 1;
  970. }
  971. mGlobalNvsArea.Area->SdCardRemovable = mSystemConfiguration.SdCardRemovable;
  972. //
  973. // Microsoft IOT
  974. //
  975. if ((mSystemConfiguration.LpssHsuart0FlowControlEnabled == 1) && \
  976. (mSystemConfiguration.LpssPwm0Enabled == 0) && \
  977. (mSystemConfiguration.LpssPwm1Enabled == 0)) {
  978. mGlobalNvsArea.Area->MicrosoftIoT = GLOBAL_NVS_DEVICE_ENABLE;
  979. DEBUG ((EFI_D_ERROR, "JP1 is set to be MSFT IOT configuration.\n"));
  980. } else {
  981. mGlobalNvsArea.Area->MicrosoftIoT = GLOBAL_NVS_DEVICE_DISABLE;
  982. DEBUG ((EFI_D_ERROR, "JP1 is not set to be MSFT IOT configuration.\n"));
  983. }
  984. //
  985. // SIO related option.
  986. //
  987. Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (void **)&mCpuIo);
  988. ASSERT_EFI_ERROR (Status);
  989. mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_DISABLE;
  990. mGlobalNvsArea.Area->DockedSioPresent = GLOBAL_NVS_DEVICE_DISABLE;
  991. if (mGlobalNvsArea.Area->DockedSioPresent != GLOBAL_NVS_DEVICE_ENABLE) {
  992. //
  993. // Check ID for SIO WPCN381U.
  994. //
  995. Status = mCpuIo->Io.Read (
  996. mCpuIo,
  997. EfiCpuIoWidthUint8,
  998. WPCN381U_CONFIG_INDEX,
  999. 1,
  1000. &PortData
  1001. );
  1002. ASSERT_EFI_ERROR (Status);
  1003. if (PortData != 0xFF) {
  1004. PortData = 0x20;
  1005. Status = mCpuIo->Io.Write (
  1006. mCpuIo,
  1007. EfiCpuIoWidthUint8,
  1008. WPCN381U_CONFIG_INDEX,
  1009. 1,
  1010. &PortData
  1011. );
  1012. ASSERT_EFI_ERROR (Status);
  1013. Status = mCpuIo->Io.Read (
  1014. mCpuIo,
  1015. EfiCpuIoWidthUint8,
  1016. WPCN381U_CONFIG_DATA,
  1017. 1,
  1018. &PortData
  1019. );
  1020. ASSERT_EFI_ERROR (Status);
  1021. if ((PortData == WPCN381U_CHIP_ID) || (PortData == WDCP376_CHIP_ID)) {
  1022. mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_ENABLE;
  1023. mGlobalNvsArea.Area->OnboardCom = GLOBAL_NVS_DEVICE_ENABLE;
  1024. mGlobalNvsArea.Area->OnboardComCir = GLOBAL_NVS_DEVICE_DISABLE;
  1025. }
  1026. }
  1027. }
  1028. //
  1029. // Get Ps2 policy to set. Will be use if present.
  1030. //
  1031. Status = gBS->LocateProtocol (
  1032. &gEfiPs2PolicyProtocolGuid,
  1033. NULL,
  1034. (VOID **)&Ps2Policy
  1035. );
  1036. if (!EFI_ERROR (Status)) {
  1037. Status = Ps2Policy->Ps2InitHardware (ImageHandle);
  1038. }
  1039. mGlobalNvsArea.Area->SDIOMode = mSystemConfiguration.LpssSdioMode;
  1040. Handle = NULL;
  1041. Status = gBS->InstallMultipleProtocolInterfaces (
  1042. &Handle,
  1043. &gEfiGlobalNvsAreaProtocolGuid,
  1044. &mGlobalNvsArea,
  1045. NULL
  1046. );
  1047. //
  1048. // Read tables from the storage file.
  1049. //
  1050. while (!EFI_ERROR (Status)) {
  1051. CurrentTable = NULL;
  1052. Status = FwVol->ReadSection (
  1053. FwVol,
  1054. &gEfiAcpiTableStorageGuid,
  1055. EFI_SECTION_RAW,
  1056. Instance,
  1057. (VOID **) &CurrentTable,
  1058. &Size,
  1059. &FvStatus
  1060. );
  1061. if (!EFI_ERROR (Status)) {
  1062. //
  1063. // Allow platform specific code to reject the table or update it.
  1064. //
  1065. AcpiStatus = AcpiPlatformHooksIsActiveTable (CurrentTable);
  1066. if (!EFI_ERROR (AcpiStatus)) {
  1067. //
  1068. // Perform any table specific updates.
  1069. //
  1070. AcpiStatus = PlatformUpdateTables (CurrentTable);
  1071. if (!EFI_ERROR (AcpiStatus)) {
  1072. //
  1073. // Add the table.
  1074. //
  1075. TableHandle = 0;
  1076. AcpiStatus = AcpiSupport->SetAcpiTable (
  1077. AcpiSupport,
  1078. CurrentTable,
  1079. TRUE,
  1080. TableVersion,
  1081. &TableHandle
  1082. );
  1083. ASSERT_EFI_ERROR (AcpiStatus);
  1084. }
  1085. }
  1086. //
  1087. // Increment the instance.
  1088. //
  1089. Instance++;
  1090. }
  1091. }
  1092. Status = EfiCreateEventReadyToBootEx (
  1093. TPL_NOTIFY,
  1094. OnReadyToBoot,
  1095. NULL,
  1096. &Event
  1097. );
  1098. //
  1099. // Finished.
  1100. //
  1101. return EFI_SUCCESS;
  1102. }
  1103. UINT8
  1104. ReadCmosBank1Byte (
  1105. IN UINT8 Index
  1106. )
  1107. {
  1108. UINT8 Data;
  1109. IoWrite8(0x72, Index);
  1110. Data = IoRead8 (0x73);
  1111. return Data;
  1112. }
  1113. VOID
  1114. WriteCmosBank1Byte (
  1115. IN UINT8 Index,
  1116. IN UINT8 Data
  1117. )
  1118. {
  1119. IoWrite8 (0x72, Index);
  1120. IoWrite8 (0x73, Data);
  1121. }
  1122. VOID
  1123. SettingI2CTouchAddress (
  1124. IN VOID
  1125. )
  1126. {
  1127. if (mSystemConfiguration.I2CTouchAd == 0) {
  1128. //
  1129. // If setup menu select auto set I2C Touch Address base on board id.
  1130. //
  1131. if (mPlatformInfo->BoardId == BOARD_ID_BL_RVP ||
  1132. mPlatformInfo->BoardId == BOARD_ID_BL_STHI ||
  1133. mPlatformInfo->BoardId == BOARD_ID_BL_RVP_DDR3L ) {
  1134. //
  1135. //RVP
  1136. //
  1137. mGlobalNvsArea.Area->I2CTouchAddress = 0x4B;
  1138. } else if (mPlatformInfo->BoardId == BOARD_ID_BL_FFRD) {
  1139. //
  1140. //FFRD
  1141. //
  1142. mGlobalNvsArea.Area->I2CTouchAddress = 0x4A;
  1143. } else if (mPlatformInfo->BoardId == BOARD_ID_BB_RVP) {
  1144. mGlobalNvsArea.Area->I2CTouchAddress = 0x4C;
  1145. } else if (mPlatformInfo->BoardId == BOARD_ID_CVH) {
  1146. mGlobalNvsArea.Area->I2CTouchAddress = 0x4C;
  1147. } else if (mPlatformInfo->BoardId == BOARD_ID_BL_FFRD8) {
  1148. //
  1149. //FFRD8 uses 0x4A.
  1150. //
  1151. mGlobalNvsArea.Area->I2CTouchAddress = 0x4A;
  1152. }
  1153. } else {
  1154. mGlobalNvsArea.Area->I2CTouchAddress = mSystemConfiguration.I2CTouchAd;
  1155. }
  1156. DEBUG((EFI_D_ERROR, "GlobalNvsArea.Area->I2CTouchAddress: [%02x]\n", mGlobalNvsArea.Area->I2CTouchAddress));
  1157. }