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