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