AGESA_STATUS PcieFmAlibBuildAcpiTable ( IN VOID *AlibSsdtPtr, IN AMD_CONFIG_PARAMS *StdHeader ) { AGESA_STATUS AgesaStatus; D18F4x15C_STRUCT D18F4x15C; PP_FUSE_ARRAY *PpFuseArray; UINT32 AmlObjName; VOID *AmlObjPtr; IDS_HDT_CONSOLE (GNB_TRACE, "PcieFmAlibBuildAcpiTable Enter\n"); AgesaStatus = AGESA_SUCCESS; // Set voltage configuration PpFuseArray = GnbLocateHeapBuffer (AMD_PP_FUSE_TABLE_HANDLE, StdHeader); ASSERT (PpFuseArray != NULL); if (PpFuseArray != NULL) { GnbLibPciRead ( MAKE_SBDFO (0, 0, 0x18, 0x4, D18F4x15C_ADDRESS), AccessWidth32, &D18F4x15C.Value, StdHeader ); if (D18F4x15C.Field.BoostSrc != 0 || PpFuseArray->GpuBoostCap != 0) { // AmlObjName = 'B0DA'; AmlObjName = Int32FromChar ('A', 'D', '0', 'B'); AmlObjPtr = GnbLibFind (AlibSsdtPtr, ((ACPI_TABLE_HEADER*) &AlibSsdt[0])->TableLength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { *(UINT8*)((UINT8*) AmlObjPtr + 5) = 1; } else { AgesaStatus = AGESA_FATAL; } } } else { AgesaStatus = AGESA_FATAL; } IDS_HDT_CONSOLE (GNB_TRACE, "PcieFmAlibBuildAcpiTable Exit[0x%x]\n", AgesaStatus); return AgesaStatus; }
AGESA_STATUS PcieFmAlibBuildAcpiTable ( IN VOID *AlibSsdtPtr, IN AMD_CONFIG_PARAMS *StdHeader ) { AGESA_STATUS Status; AGESA_STATUS AgesaStatus; UINT32 AmlObjName; GFX_PLATFORM_CONFIG *Gfx; VOID *AmlObjPtr; BOOLEAN AltVddNbSupport; IDS_HDT_CONSOLE (GNB_TRACE, "PcieFmAlibBuildAcpiTable Enter\n"); AgesaStatus = AGESA_SUCCESS; AltVddNbSupport = TRUE; // AmlObjName = 'A0DA'; AmlObjName = 0x41304441; AmlObjPtr = GnbLibFind (AlibSsdtPtr, ((ACPI_TABLE_HEADER*) &AlibSsdt[0])->TableLength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { Status = GfxLocateConfigData (StdHeader, &Gfx); AGESA_STATUS_UPDATE (Status, AgesaStatus); ASSERT (Status == AGESA_SUCCESS); if ((Status != AGESA_SUCCESS) || (GnbBuildOptions.CfgAltVddNb == FALSE) || (Gfx->UmaInfo.MemClock > DDR1333_FREQUENCY) || ((Gfx->GfxDiscreteCardInfo.AmdPcieGfxCardBitmap != 0) && GfxLibIsControllerPresent (StdHeader))) { AltVddNbSupport = FALSE; } // CBS/IDS can change AltVddNbSupport IDS_OPTION_HOOK (IDS_GNB_ALTVDDNB, &AltVddNbSupport, StdHeader); if (!AltVddNbSupport) { IDS_HDT_CONSOLE (GNB_TRACE, " AltVddNb - Disabled\n"); *(UINT8*)((UINT8*) AmlObjPtr + 5) = 0; } } else { AgesaStatus = AGESA_ERROR; } IDS_HDT_CONSOLE (GNB_TRACE, "PcieFmAlibBuildAcpiTable Exit[0x%x]\n", AgesaStatus); return AgesaStatus; }
AGESA_STATUS PcieAlibUpdateGnbData ( IN OUT VOID *SsdtBuffer, IN AMD_CONFIG_PARAMS *StdHeader ) { UINT64 LocalMsrRegister; UINT32 AmlObjName; VOID *AmlObjPtr; IDS_HDT_CONSOLE (GNB_TRACE, "PcieAlibUpdateGnbData Enter\n"); // // Locate Base address variable // AmlObjName = STRING_TO_UINT32 ('A', 'G', 'R', 'B'); AmlObjPtr = GnbLibFind ( SsdtBuffer, ((ACPI_TABLE_HEADER*) SsdtBuffer)->TableLength, (UINT8*) &AmlObjName, sizeof (AmlObjName) ); /// @todo // ASSERT (AmlObjPtr != NULL); if (AmlObjPtr == NULL) { return AGESA_ERROR; } // // Update PCIe MMIO base // LibAmdMsrRead (MSR_MMIO_Cfg_Base, &LocalMsrRegister, StdHeader); if ((LocalMsrRegister & BIT0) != 0 && (LocalMsrRegister & 0xFFFFFFFF00000000) == 0) { *(UINT32*)((UINT8*) AmlObjPtr + 5) = (UINT32) (LocalMsrRegister & 0xFFFFF00000); } else { ASSERT (FALSE); return AGESA_ERROR; } IDS_HDT_CONSOLE (GNB_TRACE, "PcieAlibUpdateGnbData Exit\n"); return AGESA_SUCCESS; }
AGESA_STATUS PcieAlibBuildAcpiTableV2 ( IN AMD_CONFIG_PARAMS *StdHeader, OUT VOID **AlibSsdtPtr ) { AGESA_STATUS Status; AGESA_STATUS AgesaStatus; VOID *AlibSsdtBuffer; VOID *AlibSsdtTable; UINTN AlibSsdtlength; UINT32 AmlObjName; VOID *AmlObjPtr; IDS_HDT_CONSOLE (GNB_TRACE, "PcieAlibBuildAcpiTableV2 Enter\n"); AgesaStatus = AGESA_SUCCESS; AlibSsdtTable = GnbFmAlibGetBaseTable (StdHeader); AlibSsdtlength = ((ACPI_TABLE_HEADER*) AlibSsdtTable)->TableLength; if (*AlibSsdtPtr == NULL) { AlibSsdtBuffer = GnbAllocateHeapBuffer ( AMD_ACPI_ALIB_BUFFER_HANDLE, AlibSsdtlength, StdHeader ); ASSERT (AlibSsdtBuffer != NULL); if (AlibSsdtBuffer == NULL) { return AGESA_ERROR; } *AlibSsdtPtr = AlibSsdtBuffer; } else { AlibSsdtBuffer = *AlibSsdtPtr; } // Check length of port data ASSERT (sizeof (_ALIB_PORT_DATA) <= 20); // Check length of global data ASSERT (sizeof (_ALIB_GLOBAL_DATA) <= 32); // Copy template to buffer LibAmdMemCopy (AlibSsdtBuffer, AlibSsdtTable, AlibSsdtlength, StdHeader); // Update table OEM fields. LibAmdMemCopy ( (VOID *) &((ACPI_TABLE_HEADER*) AlibSsdtBuffer)->OemId, (VOID *) &GnbBuildOptions.OemIdString, sizeof (GnbBuildOptions.OemIdString), StdHeader); LibAmdMemCopy ( (VOID *) &((ACPI_TABLE_HEADER*) AlibSsdtBuffer)->OemTableId, (VOID *) &GnbBuildOptions.OemTableIdString, sizeof (GnbBuildOptions.OemTableIdString), StdHeader); // // Update register base base // PcieAlibUpdateGnbData (AlibSsdtBuffer, StdHeader); // // Update transfer block // AmlObjName = STRING_TO_UINT32 ('A', 'D', 'A', 'T'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); if (AmlObjPtr != NULL) { AmlObjPtr = (UINT8 *) AmlObjPtr + 10; } // Dispatch function from table Status = GnbLibDispatchFeaturesV2 (&AlibDispatchTableV2[0], AmlObjPtr, StdHeader); AGESA_STATUS_UPDATE (Status, AgesaStatus); if (AgesaStatus != AGESA_SUCCESS) { //Shrink table length to size of the header ((ACPI_TABLE_HEADER*) AlibSsdtBuffer)->TableLength = sizeof (ACPI_TABLE_HEADER); } ChecksumAcpiTable ((ACPI_TABLE_HEADER*) AlibSsdtBuffer, StdHeader); IDS_HDT_CONSOLE (GNB_TRACE, "PcieAlibBuildAcpiTableV2 Exit [0x%x]\n", AgesaStatus); return AgesaStatus; }
AGESA_STATUS PcieAlibBuildAcpiTable ( IN AMD_CONFIG_PARAMS *StdHeader, OUT VOID **AlibSsdtPtr ) { AGESA_STATUS Status; UINT32 AmlObjName; PCIe_PLATFORM_CONFIG *Pcie; PP_FUSE_ARRAY *PpFuseArray; VOID *AlibSsdtBuffer; VOID *AmlObjPtr; UINT8 SclkVidArray[4]; UINT8 BootUpVid; UINT8 BootUpVidIndex; UINT8 Gen1VidIndex; UINTN Index; UINTN AlibSsdtlength; Status = AGESA_SUCCESS; AlibSsdtlength = ((ACPI_TABLE_HEADER*) &AlibSsdt[0])->TableLength; if (*AlibSsdtPtr == NULL) { AlibSsdtBuffer = GnbAllocateHeapBuffer ( AMD_ACPI_ALIB_BUFFER_HANDLE, AlibSsdtlength, StdHeader ); ASSERT (AlibSsdtBuffer != NULL); if (AlibSsdtBuffer == NULL) { return AGESA_ERROR; } *AlibSsdtPtr = AlibSsdtBuffer; } else { AlibSsdtBuffer = *AlibSsdtPtr; } // Copy template to buffer LibAmdMemCopy (AlibSsdtBuffer, &AlibSsdt[0], AlibSsdtlength, StdHeader); // Set PCI MMIO configuration // AmlObjName = '10DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '1'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); if (AmlObjPtr != NULL) { UINT64 MsrReg; LibAmdMsrRead (MSR_MMIO_Cfg_Base, &MsrReg, StdHeader); if ((MsrReg & BIT0) != 0 && (MsrReg & 0xFFFFFFFF00000000) == 0) { *(UINT32*)((UINT8*)AmlObjPtr + 5) = (UINT32)(MsrReg & 0xFFFFF00000); } else { Status = AGESA_ERROR; } } else { Status = AGESA_ERROR; } // Set voltage configuration PpFuseArray = GnbLocateHeapBuffer (AMD_PP_FUSE_TABLE_HANDLE, StdHeader); if (PpFuseArray != NULL) { // AmlObjName = '30DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '3'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { *(UINT8*)((UINT8*)AmlObjPtr + 5) = PpFuseArray->PcieGen2Vid; } else { Status = AGESA_ERROR; } } else { Status = AGESA_ERROR; } GnbLibPciRead ( MAKE_SBDFO ( 0, 0, 0x18, 3, D18F3x15C_ADDRESS), AccessWidth32, &SclkVidArray[0], StdHeader ); Gen1VidIndex = 0; BootUpVidIndex = 0; BootUpVid = 0xff; for (Index = 0; Index < 4; Index++) { if (SclkVidArray[Index] > SclkVidArray[Gen1VidIndex]) { Gen1VidIndex = (UINT8) Index; } if (SclkVidArray[Index] != 0 && SclkVidArray[Index] < BootUpVid) { BootUpVid = SclkVidArray[Index]; BootUpVidIndex = (UINT8) Index; } } // AmlObjName = '40DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '4'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { *(UINT8*)((UINT8*)AmlObjPtr + 5) = Gen1VidIndex; } else { Status = AGESA_ERROR; } // AmlObjName = '50DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '5'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { *(UINT8*)((UINT8*)AmlObjPtr + 5) = BootUpVidIndex; } else { Status = AGESA_ERROR; } // Set PCIe configuration if (PcieLocateConfigurationData (StdHeader, &Pcie) == AGESA_SUCCESS) { // AmlObjName = '20DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '2'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { *(UINT8*)((UINT8*)AmlObjPtr + 5) = Pcie->PsppPolicy; } else { Status = AGESA_ERROR; } // AmlObjName = '60DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '6'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { PcieConfigRunProcForAllEngines ( DESCRIPTOR_ALLOCATED | DESCRIPTOR_PCIE_ENGINE, PcieAlibSetPortMaxSpeedCallback, (UINT8*)((UINT8*)AmlObjPtr + 7), Pcie ); } else { Status = AGESA_ERROR; } // AmlObjName = '80DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '8'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { PcieConfigRunProcForAllEngines ( DESCRIPTOR_ALLOCATED | DESCRIPTOR_PCIE_ENGINE, PcieAlibSetPortOverrideSpeedCallback, (UINT8*)((UINT8*)AmlObjPtr + 7), Pcie ); } else { Status = AGESA_ERROR; } // AmlObjName = '70DA'; AmlObjName = Int32FromChar ('A', 'D', '0', '7'); AmlObjPtr = GnbLibFind (AlibSsdtBuffer, AlibSsdtlength, (UINT8*) &AmlObjName, sizeof (AmlObjName)); ASSERT (AmlObjPtr != NULL); if (AmlObjPtr != NULL) { PcieConfigRunProcForAllEngines ( DESCRIPTOR_ALLOCATED | DESCRIPTOR_PCIE_ENGINE, PcieAlibSetPortInfoCallback, (UINT8*)((UINT8*)AmlObjPtr + 4), Pcie ); } else { Status = AGESA_ERROR; } } else { ASSERT (FALSE); Status = AGESA_ERROR; } if (Status == AGESA_SUCCESS) { Status = PcieFmAlibBuildAcpiTable (AlibSsdtBuffer, StdHeader); } if (Status != AGESA_SUCCESS) { //Shrink table length to size of the header ((ACPI_TABLE_HEADER*) AlibSsdtBuffer)->TableLength = sizeof (ACPI_TABLE_HEADER); } ChecksumAcpiTable ((ACPI_TABLE_HEADER*) AlibSsdtBuffer, StdHeader); return Status; }