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; }