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