AcpiPlatform.c 42 KB

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