/** Routine Description: Sets the state of a GPIO pin Arguments: This - pointer to protocol Gpio - which pin to modify Mode - mode to set Returns: EFI_SUCCESS - GPIO set as requested EFI_UNSUPPORTED - Mode is not supported EFI_INVALID_PARAMETER - Gpio pin is out of range **/ EFI_STATUS EFIAPI Set ( IN EMBEDDED_GPIO *This, IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_MODE Mode ) { EFI_STATUS Status = EFI_SUCCESS; UINTN Index, Offset, RegisterBase; Status = PL061Locate (Gpio, &Index, &Offset, &RegisterBase); if (EFI_ERROR (Status)) goto EXIT; // Initialize the hardware if not already done if (!mPL061Initialized) { Status = PL061Initialize(); if (EFI_ERROR(Status)) { goto EXIT; } } switch (Mode) { case GPIO_MODE_INPUT: // Set the corresponding direction bit to LOW for input MmioAnd8 (RegisterBase + PL061_GPIO_DIR_REG, ~GPIO_PIN_MASK(Gpio)); break; case GPIO_MODE_OUTPUT_0: // Set the corresponding data bit to LOW for 0 MmioWrite8 (RegisterBase + PL061_GPIO_DATA_REG + (GPIO_PIN_MASK(Offset) << 2), 0); // Set the corresponding direction bit to HIGH for output MmioOr8 (RegisterBase + PL061_GPIO_DIR_REG, GPIO_PIN_MASK(Offset)); break; case GPIO_MODE_OUTPUT_1: // Set the corresponding data bit to HIGH for 1 MmioWrite8 (RegisterBase + PL061_GPIO_DATA_REG + (GPIO_PIN_MASK(Offset) << 2), 0xff); // Set the corresponding direction bit to HIGH for output MmioOr8 (RegisterBase + PL061_GPIO_DIR_REG, GPIO_PIN_MASK(Offset)); break; default: // Other modes are not supported return EFI_UNSUPPORTED; } EXIT: return Status; }
/** Routine Description: Sets the state of a GPIO pin Arguments: This - pointer to protocol Gpio - which pin to modify Mode - mode to set Returns: EFI_SUCCESS - GPIO set as requested EFI_UNSUPPORTED - Mode is not supported EFI_INVALID_PARAMETER - Gpio pin is out of range **/ EFI_STATUS EFIAPI Set ( IN EMBEDDED_GPIO *This, IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_MODE Mode ) { EFI_STATUS Status = EFI_SUCCESS; UINTN Index, Offset, RegisterBase; Status = PL061Locate (Gpio, &Index, &Offset, &RegisterBase); ASSERT_EFI_ERROR (Status); switch (Mode) { case GPIO_MODE_INPUT: // Set the corresponding direction bit to LOW for input MmioAnd8 (RegisterBase + PL061_GPIO_DIR_REG, ~GPIO_PIN_MASK(Offset) & 0xFF); break; case GPIO_MODE_OUTPUT_0: // Set the corresponding direction bit to HIGH for output MmioOr8 (RegisterBase + PL061_GPIO_DIR_REG, GPIO_PIN_MASK(Offset)); // Set the corresponding data bit to LOW for 0 PL061SetPins (RegisterBase, GPIO_PIN_MASK(Offset), 0); break; case GPIO_MODE_OUTPUT_1: // Set the corresponding direction bit to HIGH for output MmioOr8 (RegisterBase + PL061_GPIO_DIR_REG, GPIO_PIN_MASK(Offset)); // Set the corresponding data bit to HIGH for 1 PL061SetPins (RegisterBase, GPIO_PIN_MASK(Offset), 0xff); break; default: // Other modes are not supported return EFI_UNSUPPORTED; } return EFI_SUCCESS; }
/** Performs a bitwise inclusive OR of an 8-bit PCI configuration register with an 8-bit value. Reads the 8-bit PCI configuration register specified by Address, performs a bitwise inclusive OR between the read result and the value specified by OrData, and writes the result to the 8-bit PCI configuration register specified by Address. The value written to the PCI configuration register is returned. This function must guarantee that all PCI read and write operations are serialized. If Address > 0x0FFFFFFF, then ASSERT(). @param Address Address that encodes the PCI Bus, Device, Function and Register. @param OrData The value to OR with the PCI configuration register. @return The value written back to the PCI configuration register. **/ UINT8 EFIAPI PciExpressOr8 ( IN UINTN Address, IN UINT8 OrData ) { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioOr8 ((UINTN) GetPciExpressBaseAddress () + Address, OrData); }
/** This function will update any runtime platform specific information. This currently includes: Setting OEM table values, ID, table ID, creator ID and creator revision. Enabling the proper processor entries in the APIC tables. @param[in] Table The table to update. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS PlatformUpdateTables ( IN OUT EFI_ACPI_COMMON_HEADER *Table ) { EFI_ACPI_DESCRIPTION_HEADER *TableHeader; UINT8 *CurrPtr; UINT8 *EndPtr; ACPI_APIC_STRUCTURE_PTR *ApicPtr; UINT8 CurrProcessor; EFI_STATUS Status; EFI_MP_SERVICES_PROTOCOL *MpService; UINTN MaximumNumberOfCPUs; UINTN NumberOfEnabledCPUs; UINTN BufferSize; ACPI_APIC_STRUCTURE_PTR *ProcessorLocalApicEntry; UINTN BspIndex; EFI_ACPI_1_0_ASF_DESCRIPTION_TABLE *AsfEntry; EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *HpetTbl; UINT64 OemIdValue; UINT8 Index; EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Facp; EFI_ACPI_OSFR_TABLE *OsfrTable; EFI_ACPI_OSFR_OCUR_OBJECT *pOcurObject; EFI_ACPI_OSFR_OCUR_OBJECT OcurObject = {{0xB46F133D, 0x235F, 0x4634, 0x9F, 0x03, 0xB1, 0xC0, 0x1C, 0x54, 0x78, 0x5B}, 0, 0, 0, 0, 0}; CHAR16 *OcurMfgStringBuffer = NULL; CHAR16 *OcurModelStringBuffer = NULL; UINT8 *OcurRefDataBlockBuffer = NULL; UINTN OcurMfgStringBufferSize; UINTN OcurModelStringBufferSize; UINTN OcurRefDataBlockBufferSize; #if defined (IDCC2_SUPPORTED) && IDCC2_SUPPORTED EFI_ACPI_ASPT_TABLE *pSpttTable; #endif UINT16 NumberOfHpets; UINT16 HpetCapIdValue; UINT32 HpetBlockID; UINTN LocalApicCounter; EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer; UINT8 TempVal; EFI_ACPI_3_0_IO_APIC_STRUCTURE *IOApicType; EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *APICTableHeader; CurrPtr = NULL; EndPtr = NULL; ApicPtr = NULL; LocalApicCounter = 0; CurrProcessor = 0; ProcessorLocalApicEntry = NULL; if (Table->Signature != EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) { TableHeader = (EFI_ACPI_DESCRIPTION_HEADER *) Table; // // Update the OEMID. // OemIdValue = mPlatformInfo->AcpiOemId; *(UINT32 *)(TableHeader->OemId) = (UINT32)OemIdValue; *(UINT16 *)(TableHeader->OemId + 4) = *(UINT16*)(((UINT8 *)&OemIdValue) + 4); if ((Table->Signature != EFI_ACPI_2_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE)) { // // Update the OEM Table ID. // TableHeader->OemTableId = mPlatformInfo->AcpiOemTableId; } // // Update the OEM Table ID. // TableHeader->OemRevision = EFI_ACPI_OEM_REVISION; // // Update the creator ID. // TableHeader->CreatorId = EFI_ACPI_CREATOR_ID; // // Update the creator revision. // TableHeader->CreatorRevision = EFI_ACPI_CREATOR_REVISION; } // // Complete this function. // // // Locate the MP services protocol. // // // Find the MP Protocol. This is an MP platform, so MP protocol must be // there. // Status = gBS->LocateProtocol ( &gEfiMpServiceProtocolGuid, NULL, (VOID **) &MpService ); if (EFI_ERROR (Status)) { return Status; } // // Determine the number of processors. // MpService->GetNumberOfProcessors ( MpService, &MaximumNumberOfCPUs, &NumberOfEnabledCPUs ); ASSERT (MaximumNumberOfCPUs <= MAX_CPU_NUM && NumberOfEnabledCPUs >= 1); // // Assign a invalid intial value for update. // // // Update the processors in the APIC table. // switch (Table->Signature) { case EFI_ACPI_1_0_ASF_DESCRIPTION_TABLE_SIGNATURE: // // Update the table if ASF is enabled. Otherwise, return error so caller will not install. // if (mSystemConfig.Asf == 1) { return EFI_UNSUPPORTED; } AsfEntry = (EFI_ACPI_1_0_ASF_DESCRIPTION_TABLE *) Table; TempVal = (mNumberSmbusAddress < ASF_ADDR_DEVICE_ARRAY_LENGTH)? mNumberSmbusAddress : ASF_ADDR_DEVICE_ARRAY_LENGTH; for (Index = 0; Index < TempVal; Index++) { AsfEntry->AsfAddr.FixedSmbusAddresses[Index] = mSmbusRsvdAddresses[Index]; } break; case EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE: Status = MpService->WhoAmI ( MpService, &BspIndex ); // // PCAT_COMPAT Set to 1 indicate 8259 vectors should be disabled. // APICTableHeader = (EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)Table; APICTableHeader->Flags |= EFI_ACPI_3_0_PCAT_COMPAT; CurrPtr = (UINT8 *) &((EFI_ACPI_DESCRIPTION_HEADER *) Table)[1]; CurrPtr = CurrPtr + 8; // // Size of Local APIC Address & Flag. // EndPtr = (UINT8 *) Table; EndPtr = EndPtr + Table->Length; while (CurrPtr < EndPtr) { ApicPtr = (ACPI_APIC_STRUCTURE_PTR *) CurrPtr; switch (ApicPtr->AcpiApicCommon.Type) { case EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC: // // ESS override // Fix for Ordering of MADT to be maintained as it is in MADT table. // // Update processor enabled or disabled and keep the local APIC // order in MADT intact. // // Sanity check to make sure proc-id is not arbitrary. // DEBUG ((EFI_D_ERROR, "ApicPtr->AcpiLocalApic.AcpiProcessorId = %x, MaximumNumberOfCPUs = %x\n", \ ApicPtr->AcpiLocalApic.AcpiProcessorId, MaximumNumberOfCPUs)); if(ApicPtr->AcpiLocalApic.AcpiProcessorId > MaximumNumberOfCPUs) { ApicPtr->AcpiLocalApic.AcpiProcessorId = (UINT8)MaximumNumberOfCPUs; } BufferSize = 0; ApicPtr->AcpiLocalApic.Flags = 0; for (CurrProcessor = 0; CurrProcessor < MaximumNumberOfCPUs; CurrProcessor++) { Status = MpService->GetProcessorInfo ( MpService, CurrProcessor, &ProcessorInfoBuffer ); if (Status == EFI_SUCCESS && ProcessorInfoBuffer.ProcessorId == ApicPtr->AcpiLocalApic.ApicId) { // // Check to see whether or not a processor (or thread) is enabled. // if ((BspIndex == CurrProcessor) || ((ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT) != 0)) { // // Go on and check if Hyper Threading is enabled. If HT not enabled // hide this thread from OS by not setting the flag to 1. This is the // software way to disable Hyper Threading. Basically we just hide it // from the OS. // ApicPtr->AcpiLocalApic.Flags = EFI_ACPI_1_0_LOCAL_APIC_ENABLED; if(ProcessorInfoBuffer.Location.Thread != 0) { ApicPtr->AcpiLocalApic.Flags = 0; } AppendCpuMapTableEntry (&(ApicPtr->AcpiLocalApic)); } break; } } // // If no APIC-ID match, the cpu may not be populated. // break; case EFI_ACPI_3_0_IO_APIC: IOApicType = (EFI_ACPI_3_0_IO_APIC_STRUCTURE *)CurrPtr; IOApicType->IoApicId = 0x02; // // IO APIC entries can be patched here. // break; } CurrPtr = CurrPtr + ApicPtr->AcpiApicCommon.Length; } break; case EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE: Facp = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) Table; Facp->Flags &= (UINT32)(~(3<<2)); break; case EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE: // // Patch the memory resource. // PatchDsdtTable ((EFI_ACPI_DESCRIPTION_HEADER *) Table); break; case EFI_ACPI_3_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE: // // Gv3 support // // TBD: Need re-design based on the ValleyTrail platform. // break; case EFI_ACPI_3_0_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE: // // Adjust HPET Table to correct the Base Address. // // Enable HPET always as Hpet.asi always indicates that Hpet is enabled. // MmioOr8 (R_PCH_PCH_HPET + R_PCH_PCH_HPET_GCFG, B_PCH_PCH_HPET_GCFG_EN); HpetTbl = (EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *) Table; HpetTbl->BaseAddressLower32Bit.Address = HPET_BASE_ADDRESS; HpetTbl->EventTimerBlockId = *((UINT32*)(UINTN)HPET_BASE_ADDRESS); HpetCapIdValue = *(UINT16 *)(UINTN)(HPET_BASE_ADDRESS); NumberOfHpets = HpetCapIdValue & B_PCH_PCH_HPET_GCID_NT; // Bits [8:12] contains the number of Hpets HpetBlockID = EFI_ACPI_EVENT_TIMER_BLOCK_ID; if((NumberOfHpets) && (NumberOfHpets & B_PCH_PCH_HPET_GCID_NT)) { HpetBlockID |= (NumberOfHpets); } HpetTbl->EventTimerBlockId = HpetBlockID; break; case EFI_ACPI_3_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE: // // Update MCFG base and end bus number. // ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE *) Table)->Segment[0].BaseAddress = mPlatformInfo->PciData.PciExpressBase; ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE *) Table)->Segment[0].EndBusNumber = (UINT8)RShiftU64 (mPlatformInfo->PciData.PciExpressSize, 20) - 1; break; case EFI_ACPI_OSFR_TABLE_SIGNATURE: // // Get size of OSFR variable. // OcurMfgStringBufferSize = 0; Status = gRT->GetVariable ( gACPIOSFRMfgStringVariableName, &gACPIOSFRMfgStringVariableGuid, NULL, &OcurMfgStringBufferSize, NULL ); if (Status != EFI_BUFFER_TOO_SMALL) { // // Variable must not be present on the system. // return EFI_UNSUPPORTED; } // // Allocate memory for variable data. // OcurMfgStringBuffer = AllocatePool (OcurMfgStringBufferSize); Status = gRT->GetVariable ( gACPIOSFRMfgStringVariableName, &gACPIOSFRMfgStringVariableGuid, NULL, &OcurMfgStringBufferSize, OcurMfgStringBuffer ); if (!EFI_ERROR (Status)) { OcurModelStringBufferSize = 0; Status = gRT->GetVariable ( gACPIOSFRModelStringVariableName, &gACPIOSFRModelStringVariableGuid, NULL, &OcurModelStringBufferSize, NULL ); if (Status != EFI_BUFFER_TOO_SMALL) { // // Variable must not be present on the system. // return EFI_UNSUPPORTED; } // // Allocate memory for variable data. // OcurModelStringBuffer = AllocatePool (OcurModelStringBufferSize); Status = gRT->GetVariable ( gACPIOSFRModelStringVariableName, &gACPIOSFRModelStringVariableGuid, NULL, &OcurModelStringBufferSize, OcurModelStringBuffer ); if (!EFI_ERROR (Status)) { OcurRefDataBlockBufferSize = 0; Status = gRT->GetVariable ( gACPIOSFRRefDataBlockVariableName, &gACPIOSFRRefDataBlockVariableGuid, NULL, &OcurRefDataBlockBufferSize, NULL ); if (Status == EFI_BUFFER_TOO_SMALL) { // // Allocate memory for variable data. // OcurRefDataBlockBuffer = AllocatePool (OcurRefDataBlockBufferSize); Status = gRT->GetVariable ( gACPIOSFRRefDataBlockVariableName, &gACPIOSFRRefDataBlockVariableGuid, NULL, &OcurRefDataBlockBufferSize, OcurRefDataBlockBuffer ); } OsfrTable = (EFI_ACPI_OSFR_TABLE *) Table; // // Currently only one object is defined: OCUR_OSFR_TABLE. // OsfrTable->ObjectCount = 1; // // Initialize table length to fixed portion of the ACPI OSFR table. // OsfrTable->Header.Length = sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION); *(UINT32 *)((UINTN) OsfrTable + sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION)) = \ (UINT32) (sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION) + sizeof (UINT32)); pOcurObject = (EFI_ACPI_OSFR_OCUR_OBJECT *)((UINTN) OsfrTable + sizeof (EFI_ACPI_OSFR_TABLE_FIXED_PORTION) + \ sizeof (UINT32)); CopyMem (pOcurObject, &OcurObject, sizeof (EFI_ACPI_OSFR_OCUR_OBJECT)); pOcurObject->ManufacturerNameStringOffset = (UINT32)((UINTN) pOcurObject - (UINTN) OsfrTable + \ sizeof (EFI_ACPI_OSFR_OCUR_OBJECT)); pOcurObject->ModelNameStringOffset = (UINT32)((UINTN) pOcurObject - (UINTN) OsfrTable + \ sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize); if (OcurRefDataBlockBufferSize > 0) { pOcurObject->MicrosoftReferenceOffset = (UINT32)((UINTN) pOcurObject - (UINTN) OsfrTable + \ sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize + OcurModelStringBufferSize); } CopyMem ((UINTN *)((UINTN) pOcurObject + sizeof (EFI_ACPI_OSFR_OCUR_OBJECT)), OcurMfgStringBuffer, \ OcurMfgStringBufferSize); CopyMem ((UINTN *)((UINTN) pOcurObject + sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize), \ OcurModelStringBuffer, OcurModelStringBufferSize); if (OcurRefDataBlockBufferSize > 0) { CopyMem ((UINTN *)((UINTN) pOcurObject + sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + OcurMfgStringBufferSize + \ OcurModelStringBufferSize),OcurRefDataBlockBuffer, OcurRefDataBlockBufferSize); } OsfrTable->Header.Length += (UINT32)(OcurMfgStringBufferSize + OcurModelStringBufferSize + OcurRefDataBlockBufferSize); OsfrTable->Header.Length += sizeof (EFI_ACPI_OSFR_OCUR_OBJECT) + sizeof (UINT32); } } gBS->FreePool (OcurMfgStringBuffer); gBS->FreePool (OcurModelStringBuffer); gBS->FreePool (OcurRefDataBlockBuffer); break; default: break; } // // // Update the hardware signature in the FACS structure. // // // Locate the SPCR table and update based on current settings. // The user may change CR settings via setup or other methods. // The SPCR table must match. // return EFI_SUCCESS; }
EFI_STATUS EFIAPI PeiInitPlatform ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { UINTN SmbusRegBase; EFI_PLATFORM_INFO_HOB PlatformInfo; EFI_STATUS Status= EFI_SUCCESS; EFI_PEI_READ_ONLY_VARIABLE2_PPI *Variable = NULL; UINTN VariableSize; SYSTEM_CONFIGURATION SystemConfiguration; UINT32 GGC = 0; EFI_PEI_PPI_DESCRIPTOR *mVlvMmioPolicyPpiDesc; VLV_MMIO_POLICY_PPI *mVlvMmioPolicyPpi; ZeroMem (&PlatformInfo, sizeof(PlatformInfo)); Status = InstallMonoStatusCode(FileHandle, PeiServices); ASSERT_EFI_ERROR (Status); // // Initialize Stall PPIs // Status = (*PeiServices)->InstallPpi (PeiServices, &mInstallStallPpi[0]); ASSERT_EFI_ERROR (Status); Status = (*PeiServices)->NotifyPpi (PeiServices, &mMemoryDiscoveredNotifyList[0]); ASSERT_EFI_ERROR (Status); SmbusRegBase = PchPciDeviceMmBase ( DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SMBUS, PCI_FUNCTION_NUMBER_PCH_SMBUS ); // // Since PEI has no PCI enumerator, set the BAR & I/O space enable ourselves // MmioAndThenOr32 (SmbusRegBase + R_PCH_SMBUS_BASE, B_PCH_SMBUS_BASE_BAR, SMBUS_BASE_ADDRESS); MmioOr8 (SmbusRegBase + R_PCH_SMBUS_PCICMD, B_PCH_SMBUS_PCICMD_IOSE); PchBaseInit(); // //Todo: confirm if we need program 8254 // // Setting 8254 // Program timer 1 as refresh timer // IoWrite8 (0x43, 0x54); IoWrite8 (0x41, 0x12); // // RTC power failure handling // RtcPowerFailureHandler (PeiServices); PchMmPci32( 0, 0, 2, 0, 0x50) = 0x210; VariableSize = sizeof (SYSTEM_CONFIGURATION); ZeroMem (&SystemConfiguration, VariableSize); // // Obtain variable services // Status = (*PeiServices)->LocatePpi( PeiServices, &gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (void **)&Variable ); ASSERT_EFI_ERROR(Status); Status = Variable->GetVariable ( Variable, L"Setup", &gEfiSetupVariableGuid, NULL, &VariableSize, &SystemConfiguration ); if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) { //The setup variable is corrupted VariableSize = sizeof(SYSTEM_CONFIGURATION); Status = Variable->GetVariable( Variable, L"SetupRecovery", &gEfiSetupVariableGuid, NULL, &VariableSize, &SystemConfiguration ); ASSERT_EFI_ERROR (Status); } if (EFI_ERROR (Status)) { GGC = ((2 << 3) | 0x200); PciCfg16Write(EC_BASE, 0, 2, 0, 0x50, GGC); GGC = PciCfg16Read(EC_BASE, 0, 2, 0, 0x50); DEBUG((EFI_D_INFO , "GGC: 0x%08x GMSsize:0x%08x\n", GGC, (GGC & (BIT7|BIT6|BIT5|BIT4|BIT3))>>3)); } else { if (SystemConfiguration.Igd == 1 && SystemConfiguration.PrimaryVideoAdaptor != 2) {
VOID PchBaseInit ( VOID ) { // // Program ACPI Power Management I/O Space Base Address // MmioWrite16 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_ACPI_BASE ), (UINT16)((ACPI_BASE_ADDRESS & B_PCH_LPC_ACPI_BASE_BAR) | B_PCH_LPC_ACPI_BASE_EN) ); // // Program GPIO Base Address // MmioWrite16 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_GPIO_BASE ), (UINT16)((GPIO_BASE_ADDRESS & B_PCH_LPC_GPIO_BASE_BAR) | B_PCH_LPC_GPIO_BASE_EN) ); // // Set PMC Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_PMC_BASE ), (UINT32)((PMC_BASE_ADDRESS & B_PCH_LPC_PMC_BASE_BAR) | B_PCH_LPC_PMC_BASE_EN) ); // // Set IO Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_IO_BASE ), (UINT32)((IO_BASE_ADDRESS & B_PCH_LPC_IO_BASE_BAR) | B_PCH_LPC_IO_BASE_EN) ); // // Set ILB Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_ILB_BASE ), (UINT32)((ILB_BASE_ADDRESS & B_PCH_LPC_ILB_BASE_BAR) | B_PCH_LPC_ILB_BASE_EN) ); // // Set PUnit Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_PUNIT_BASE ), (UINT32)((PUNIT_BASE_ADDRESS & B_PCH_LPC_PUNIT_BASE_BAR) | B_PCH_LPC_PUNIT_BASE_EN) ); // // Set SPI Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_SPI_BASE ), (UINT32)((SPI_BASE_ADDRESS & B_PCH_LPC_SPI_BASE_BAR) | B_PCH_LPC_SPI_BASE_EN) ); // // Set Root Complex Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_RCBA ), (UINT32)((RCBA_BASE_ADDRESS & B_PCH_LPC_RCBA_BAR) | B_PCH_LPC_RCBA_EN) ); // // Set MPHY Base Address // MmioWrite32 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, R_PCH_LPC_MPHY_BASE ), (UINT32)((MPHY_BASE_ADDRESS & B_PCH_LPC_MPHY_BASE_BAR) | B_PCH_LPC_MPHY_BASE_EN) ); MmioWrite16 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SMBUS, PCI_FUNCTION_NUMBER_PCH_SMBUS, R_PCH_SMBUS_BASE ), (UINT16)(SMBUS_BASE_ADDRESS & B_PCH_SMBUS_BASE_BAR) ); MmioOr8 ( MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SMBUS, PCI_FUNCTION_NUMBER_PCH_SMBUS, R_PCH_SMBUS_PCICMD ), B_PCH_SMBUS_PCICMD_IOSE ); }