UefiCpuPkg/CpuS3DataDxe: Consume the existing PcdCpuS3DataAddress

If PCD PcdCpuS3DataAddress is set before, CpuS3DataDxe should get RegisterTable
and PreSmmRegisterTable from existing PCD pointed buffer and needn't to allocate
new buffer for RegisterTable and PreSmmRegisterTable.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
Jeff Fan 2017-03-07 19:39:27 +08:00
parent 9cc45009ba
commit 8b371e93f2
1 changed files with 31 additions and 19 deletions

View File

@ -160,11 +160,17 @@ CpuS3DataInitialize (
VOID *Gdt; VOID *Gdt;
VOID *Idt; VOID *Idt;
EFI_EVENT Event; EFI_EVENT Event;
ACPI_CPU_DATA *OldAcpiCpuData;
if (!PcdGetBool (PcdAcpiS3Enable)) { if (!PcdGetBool (PcdAcpiS3Enable)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
//
// Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
//
OldAcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64 (PcdCpuS3DataAddress);
// //
// Allocate ACPI NVS memory below 4G memory for use on ACPI S3 resume. // Allocate ACPI NVS memory below 4G memory for use on ACPI S3 resume.
// //
@ -229,32 +235,38 @@ CpuS3DataInitialize (
AcpiCpuDataEx->GdtrProfile.Base = (UINTN)Gdt; AcpiCpuDataEx->GdtrProfile.Base = (UINTN)Gdt;
AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt; AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt;
// if (OldAcpiCpuData != NULL) {
// Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs AcpiCpuData->RegisterTable = OldAcpiCpuData->RegisterTable;
// AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData->PreSmmInitRegisterTable;
TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE); } else {
RegisterTable = (CPU_REGISTER_TABLE *)AllocateAcpiNvsMemoryBelow4G (TableSize); //
ASSERT (RegisterTable != NULL); // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs
for (Index = 0; Index < NumberOfCpus; Index++) { //
Status = MpServices->GetProcessorInfo ( TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
RegisterTable = (CPU_REGISTER_TABLE *)AllocateAcpiNvsMemoryBelow4G (TableSize);
ASSERT (RegisterTable != NULL);
for (Index = 0; Index < NumberOfCpus; Index++) {
Status = MpServices->GetProcessorInfo (
MpServices, MpServices,
Index, Index,
&ProcessorInfoBuffer &ProcessorInfoBuffer
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
RegisterTable[Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId; RegisterTable[Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId;
RegisterTable[Index].TableLength = 0; RegisterTable[Index].TableLength = 0;
RegisterTable[Index].AllocatedSize = 0; RegisterTable[Index].AllocatedSize = 0;
RegisterTable[Index].RegisterTableEntry = 0; RegisterTable[Index].RegisterTableEntry = 0;
RegisterTable[NumberOfCpus + Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId; RegisterTable[NumberOfCpus + Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId;
RegisterTable[NumberOfCpus + Index].TableLength = 0; RegisterTable[NumberOfCpus + Index].TableLength = 0;
RegisterTable[NumberOfCpus + Index].AllocatedSize = 0; RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0; RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
}
AcpiCpuData->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
} }
AcpiCpuData->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
// //
// Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure