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