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