AcpiPlatform.c 42 KB

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