VOID EFIAPI fTPMAcpiEvent ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupport; UINTN TableHandle; TPM2_CONTROL_AREA *Tpm2ControlArea; UINT8 *Tpm2AcpiDataPtr; UINT32 *Memory32Fixed; EFI_ACPI_TABLE_VERSION Version; EFI_PHYSICAL_ADDRESS PspBar1Addr; gBS->CloseEvent (Event); // // Locate ACPISupport table. Bail if absent // Status = gBS->LocateProtocol ( &gEfiAcpiSupportGuid, NULL, &AcpiSupport); if (EFI_ERROR (Status)) { return; } if (GetPspBar1Addr (&PspBar1Addr)) { return; } Tpm2ControlArea = (TPM2_CONTROL_AREA *) (UINTN) PspBar1Addr; // Update the TPM ACPI Table for ControlArea location Tpm2AcpiTable.ControlArea = (EFI_PHYSICAL_ADDRESS) Tpm2ControlArea + 0x10; // // Install the ACPI Table // PSP_DEBUG ("\tInstall ACPI TPM2 Table\n"); TableHandle = 0; //(EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0 | // EFI_ACPI_TABLE_VERSION_4_0 | EFI_ACPI_TABLE_VERSION_5_0) Version = 0x3E; Status = AcpiSupport->SetAcpiTable ( AcpiSupport, &Tpm2AcpiTable, TRUE, Version, &TableHandle ); if (EFI_ERROR (Status)) { return; } PSP_DEBUG ("\tUpdate _CRS Object with actual value\n"); //Update _CRS Object with actual value for (Tpm2AcpiDataPtr = ((UINT8 *)fTPMAmlData + sizeof (EFI_ACPI_DESCRIPTION_HEADER)); Tpm2AcpiDataPtr <= ((UINT8 *)fTPMAmlData + ((EFI_ACPI_DESCRIPTION_HEADER *)fTPMAmlData)->Length); Tpm2AcpiDataPtr++ ) { Memory32Fixed = (UINT32 *)Tpm2AcpiDataPtr; switch (*Memory32Fixed) { //TPM2.0 Command Buffer allocate by BIOS, should be updated during POST //Memory32Fixed (ReadWrite, 0xBBBBBBBB, 0x100000) case 0xBBBBBBBB: *Memory32Fixed = (UINT32) (Tpm2ControlArea->CommandAddress); PSP_DEBUG ("Tpm2ControlArea->CommandAddress %x\n", Tpm2ControlArea->CommandAddress); Tpm2AcpiDataPtr += (sizeof (UINT32) - 1); break; //TPM2.0 Response Buffer allocate by BIOS, should be updated during POST //Memory32Fixed (ReadWrite, 0xCCCCCCCC, 0x100000) case 0xCCCCCCCC: *Memory32Fixed = (UINT32) (Tpm2ControlArea->ResponseAddress); PSP_DEBUG ("Tpm2ControlArea->ResponseAddress %x\n", Tpm2ControlArea->ResponseAddress); Tpm2AcpiDataPtr += (sizeof (UINT32) - 1); break; default: break; } } PSP_DEBUG ("\tInstall Tpm SSDT table\n"); TableHandle = 0; AcpiSupport->SetAcpiTable ( AcpiSupport, fTPMAmlData, TRUE, Version, &TableHandle ); if (EFI_ERROR (Status)) { return; } PSP_DEBUG ("PublishTables ACPI table\n"); Status = AcpiSupport->PublishTables (AcpiSupport, Version); if (EFI_ERROR (Status)) { return; } PSP_DEBUG ("fTPMAcpiEvent exit\n"); }
/** Routine Description: GC_TODO: Add function description. Arguments: Event - GC_TODO: add argument description Context - GC_TODO: add argument description Returns: GC_TODO: add return values **/ STATIC VOID EFIAPI OnReadyToBoot ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; EFI_ACPI_TABLE_VERSION TableVersion; EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupport; EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save; SYSTEM_CONFIGURATION SetupVarBuffer; UINTN VariableSize; EFI_PLATFORM_CPU_INFO *PlatformCpuInfoPtr = NULL; EFI_PLATFORM_CPU_INFO PlatformCpuInfo; EFI_PEI_HOB_POINTERS GuidHob; if (mFirstNotify) { return; } mFirstNotify = TRUE; // // To avoid compiler warning of "C4701: potentially uninitialized local variable 'PlatformCpuInfo' used". // PlatformCpuInfo.CpuVersion.FullCpuId = 0; // // Get Platform CPU Info HOB. // PlatformCpuInfoPtr = NULL; ZeroMem (&PlatformCpuInfo, sizeof(EFI_PLATFORM_CPU_INFO)); VariableSize = sizeof(EFI_PLATFORM_CPU_INFO); Status = gRT->GetVariable( EfiPlatformCpuInfoVariable, &gEfiVlv2VariableGuid, NULL, &VariableSize, PlatformCpuInfoPtr ); if (EFI_ERROR(Status)) { GuidHob.Raw = GetHobList (); if (GuidHob.Raw != NULL) { if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformCpuInfoGuid, GuidHob.Raw)) != NULL) { PlatformCpuInfoPtr = GET_GUID_HOB_DATA (GuidHob.Guid); } } } if ((PlatformCpuInfoPtr != NULL)) { CopyMem(&PlatformCpuInfo, PlatformCpuInfoPtr, sizeof(EFI_PLATFORM_CPU_INFO)); } // // Update the ACPI parameter blocks finally. // VariableSize = sizeof (SYSTEM_CONFIGURATION); Status = gRT->GetVariable ( L"Setup", &mSystemConfigurationGuid, NULL, &VariableSize, &SetupVarBuffer ); ASSERT_EFI_ERROR (Status); // // Find the AcpiSupport protocol. // Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0); ASSERT_EFI_ERROR (Status); TableVersion = EFI_ACPI_TABLE_VERSION_2_0; // // Publish ACPI 1.0 or 2.0 Tables. // Status = AcpiSupport->PublishTables ( AcpiSupport, TableVersion ); ASSERT_EFI_ERROR (Status); // // S3 script save. // Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID **) &AcpiS3Save); if (!EFI_ERROR (Status)) { AcpiS3Save->S3Save (AcpiS3Save, NULL); } }
VOID IScsiPublishIbft ( IN VOID ) /*++ Routine Description: Publish and remove the iSCSI Boot Firmware Table according to the iSCSI session status. Arguments: None. Returns: None. --*/ { EFI_STATUS Status; UINTN TableHandle; EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupport; EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table; EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; EFI_ACPI_DESCRIPTION_HEADER *Rsdt; UINTN HandleCount; EFI_HANDLE *HandleBuffer; UINT8 *Heap; UINTN Index; INTN TableIndex; EFI_ACPI_TABLE_VERSION Version; UINT32 Signature; Status = gBS->LocateProtocol (&gEfiAcpiSupportGuid, NULL, &AcpiSupport); if (EFI_ERROR (Status)) { return ; } // // Find ACPI table RSD_PTR from system table // for (Index = 0, Rsdp = NULL; Index < gST->NumberOfTableEntries; Index++) { if (EfiCompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpi30TableGuid) || EfiCompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpi20TableGuid) || EfiCompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpiTableGuid) ) { // // A match was found. // Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) gST->ConfigurationTable[Index].VendorTable; break; } } if (Rsdp == NULL) { return ; } else { Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress; } // // Try to remove the old iSCSI Boot Firmware Table. // for (TableIndex = 0;; TableIndex++) { Status = AcpiSupport->GetAcpiTable ( AcpiSupport, TableIndex, &Table, &Version, &TableHandle ); if (EFI_ERROR (Status)) { break; } Signature = Table->Signature; NetFreePool (Table); if (Signature == EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE) { // // Remove the table. // Status = AcpiSupport->SetAcpiTable ( AcpiSupport, NULL, FALSE, Version, &TableHandle ); if (EFI_ERROR (Status)) { return ; } break; } } // // Get all iSCSI private protocols. // Status = gBS->LocateHandleBuffer ( ByProtocol, &mIScsiPrivateGuid, NULL, &HandleCount, &HandleBuffer ); if (EFI_ERROR (Status)) { return ; } // // Allocate 4k bytes to hold the ACPI table. // Table = NetAllocatePool (IBFT_MAX_SIZE); if (Table == NULL) { return ; } Heap = (CHAR8 *) Table + IBFT_HEAP_OFFSET; // // Fill in the various section of the iSCSI Boot Firmware Table. // IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId); IScsiInitControlSection (Table, HandleCount); IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]); IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer); NetFreePool (HandleBuffer); TableHandle = 0; // // Install or update the iBFT table. // Status = AcpiSupport->SetAcpiTable ( AcpiSupport, Table, TRUE, EFI_ACPI_TABLE_VERSION_3_0, &TableHandle ); if (!EFI_ERROR (Status)) { AcpiSupport->PublishTables (AcpiSupport, EFI_ACPI_TABLE_VERSION_3_0); } NetFreePool (Table); }