mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 10:19:50 +00:00 
			
		
		
		
	Fix variable set but not used errors detected by GCC 4.8. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Lee Leahy <leroy.p.leahy@intel.com> Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
		
			
				
	
	
		
			379 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
Processor power management initialization code.
 | 
						|
 | 
						|
Copyright (c) 2013-2016 Intel Corporation.
 | 
						|
 | 
						|
This program and the accompanying materials
 | 
						|
are licensed and made available under the terms and conditions of the BSD License
 | 
						|
which accompanies this distribution.  The full text of the license may be found at
 | 
						|
http://opensource.org/licenses/bsd-license.php
 | 
						|
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "SmmPowerManagement.h"
 | 
						|
 | 
						|
//
 | 
						|
// Global variables
 | 
						|
//
 | 
						|
extern EFI_ACPI_SDT_PROTOCOL   *mAcpiSdt;
 | 
						|
extern EFI_ACPI_TABLE_PROTOCOL *mAcpiTable;
 | 
						|
 | 
						|
extern EFI_GUID gPowerManagementAcpiTableStorageGuid;
 | 
						|
 | 
						|
/**
 | 
						|
  This function is the entry of processor power management initialization code.
 | 
						|
  It initializes the processor's power management features based on the user
 | 
						|
  configurations and hardware capabilities.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
PpmInit (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Processor Power Management Flags
 | 
						|
  //
 | 
						|
  mGlobalNvsAreaPtr->Cfgd = PcdGet32(PcdPpmFlags);
 | 
						|
 | 
						|
  //
 | 
						|
  // Patch and publish power management related acpi tables
 | 
						|
  //
 | 
						|
  PpmPatchAndPublishAcpiTables();
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function is to patch and publish power management related acpi tables.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
PpmPatchAndPublishAcpiTables (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
    //
 | 
						|
    // Patch FADT table to enable C2,C3
 | 
						|
    //
 | 
						|
  PpmPatchFadtTable();
 | 
						|
 | 
						|
  //
 | 
						|
    // Load all the power management acpi tables and patch IST table
 | 
						|
    //
 | 
						|
    PpmLoadAndPatchPMTables();
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function is to patch PLvl2Lat and PLvl3Lat to enable C2, C3 support in OS.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
PpmPatchFadtTable (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
    EFI_STATUS                    Status;
 | 
						|
  EFI_ACPI_DESCRIPTION_HEADER   *Table;
 | 
						|
  EFI_ACPI_SDT_HEADER           *CurrentTable;
 | 
						|
  EFI_ACPI_TABLE_VERSION        Version;
 | 
						|
  UINTN                         Index;
 | 
						|
  UINTN                         Handle;
 | 
						|
 | 
						|
  //
 | 
						|
  // Scan all the acpi tables to find FADT 2.0
 | 
						|
  //
 | 
						|
  Index = 0;
 | 
						|
  do {
 | 
						|
    Status = mAcpiSdt->GetAcpiTable (
 | 
						|
                       Index,
 | 
						|
                       &CurrentTable,
 | 
						|
                       &Version,
 | 
						|
                       &Handle
 | 
						|
                       );
 | 
						|
    if (Status == EFI_NOT_FOUND) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    ASSERT_EFI_ERROR (Status);
 | 
						|
    Index++;
 | 
						|
  } while (CurrentTable->Signature != EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE || CurrentTable->Revision != 0x03);
 | 
						|
 | 
						|
  ASSERT (CurrentTable->Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);
 | 
						|
 | 
						|
  Table  = NULL;
 | 
						|
  Status = gBS->AllocatePool (EfiBootServicesData, CurrentTable->Length, (VOID **) &Table);
 | 
						|
  ASSERT (Table != NULL);
 | 
						|
  CopyMem (Table, CurrentTable, CurrentTable->Length);
 | 
						|
 | 
						|
  //
 | 
						|
  // Update the ACPI table and recalculate checksum
 | 
						|
  //
 | 
						|
  Status = mAcpiTable->UninstallAcpiTable (mAcpiTable, Handle);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
     //
 | 
						|
     // Should not get an error here ever, but abort if we do.
 | 
						|
     //
 | 
						|
     return ;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Update the check sum
 | 
						|
  // It needs to be zeroed before the checksum calculation
 | 
						|
  //
 | 
						|
  ((EFI_ACPI_SDT_HEADER *)Table)->Checksum = 0;
 | 
						|
  ((EFI_ACPI_SDT_HEADER *)Table)->Checksum =
 | 
						|
    CalculateCheckSum8 ((VOID *)Table, Table->Length);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add the table
 | 
						|
  //
 | 
						|
  Status = mAcpiTable->InstallAcpiTable (
 | 
						|
                            mAcpiTable,
 | 
						|
                            Table,
 | 
						|
                            Table->Length,
 | 
						|
                            &Handle
 | 
						|
                            );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
  gBS->FreePool (Table);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
SsdtTableUpdate (
 | 
						|
  IN OUT   EFI_ACPI_DESCRIPTION_HEADER  *TableHeader
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
 | 
						|
    Update the SSDT table
 | 
						|
 | 
						|
  Arguments:
 | 
						|
 | 
						|
    Table   - The SSDT table to be patched
 | 
						|
 | 
						|
  Returns:
 | 
						|
 | 
						|
    None
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  UINT8      *CurrPtr;
 | 
						|
  UINT8      *SsdtPointer;
 | 
						|
  UINT32     *Signature;
 | 
						|
 | 
						|
  //
 | 
						|
  // Loop through the ASL looking for values that we must fix up.
 | 
						|
  //
 | 
						|
  CurrPtr = (UINT8 *) TableHeader;
 | 
						|
  for (SsdtPointer = CurrPtr;
 | 
						|
       SsdtPointer <= (CurrPtr + ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length);
 | 
						|
       SsdtPointer++
 | 
						|
      )
 | 
						|
  {
 | 
						|
    Signature = (UINT32 *) SsdtPointer;
 | 
						|
    if ((*Signature) == SIGNATURE_32 ('P', 'M', 'B', 'A')) {
 | 
						|
      switch (*(Signature+1)) {
 | 
						|
      case (SIGNATURE_32 ('L', 'V', 'L', '0')):
 | 
						|
        Signature[0] = PcdGet16(PcdPmbaIoBaseAddress);
 | 
						|
        Signature[1] = 0;
 | 
						|
        break;
 | 
						|
      case (SIGNATURE_32 ('L', 'V', 'L', '2')):
 | 
						|
        Signature[0] = PcdGet16(PcdPmbaIoLVL2);
 | 
						|
        Signature[1] = 0;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
LocateSupportProtocol (
 | 
						|
  IN  EFI_GUID                       *Protocol,
 | 
						|
  OUT VOID                           **Instance,
 | 
						|
  IN  UINT32                         Type
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Locate the first instance of a protocol.  If the protocol requested is an
 | 
						|
  FV protocol, then it will return the first FV that contains the ACPI table
 | 
						|
  storage file.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Protocol      The protocol to find.
 | 
						|
  Instance      Return pointer to the first instance of the protocol
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_SUCCESS           The function completed successfully.
 | 
						|
  EFI_NOT_FOUND         The protocol could not be located.
 | 
						|
  EFI_OUT_OF_RESOURCES  There are not enough resources to find the protocol.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  EFI_HANDLE              *HandleBuffer;
 | 
						|
  UINTN                   NumberOfHandles;
 | 
						|
  EFI_FV_FILETYPE         FileType;
 | 
						|
  UINT32                  FvStatus;
 | 
						|
  EFI_FV_FILE_ATTRIBUTES  Attributes;
 | 
						|
  UINTN                   Size;
 | 
						|
  UINTN                   i;
 | 
						|
 | 
						|
  FvStatus = 0;
 | 
						|
 | 
						|
  //
 | 
						|
  // Locate protocol.
 | 
						|
  //
 | 
						|
  Status = gBS->LocateHandleBuffer (
 | 
						|
                   ByProtocol,
 | 
						|
                   Protocol,
 | 
						|
                   NULL,
 | 
						|
                   &NumberOfHandles,
 | 
						|
                   &HandleBuffer
 | 
						|
                   );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
 | 
						|
    //
 | 
						|
    // Defined errors at this time are not found and out of resources.
 | 
						|
    //
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
  //
 | 
						|
  // Looking for FV with ACPI storage file
 | 
						|
  //
 | 
						|
 | 
						|
  for (i = 0; i < NumberOfHandles; i++) {
 | 
						|
    //
 | 
						|
    // Get the protocol on this handle
 | 
						|
    // This should not fail because of LocateHandleBuffer
 | 
						|
    //
 | 
						|
    Status = gBS->HandleProtocol (
 | 
						|
                     HandleBuffer[i],
 | 
						|
                     Protocol,
 | 
						|
                     Instance
 | 
						|
                     );
 | 
						|
    ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
    if (!Type) {
 | 
						|
      //
 | 
						|
      // Not looking for the FV protocol, so find the first instance of the
 | 
						|
      // protocol.  There should not be any errors because our handle buffer
 | 
						|
      // should always contain at least one or LocateHandleBuffer would have
 | 
						|
      // returned not found.
 | 
						|
      //
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // See if it has the ACPI storage file
 | 
						|
    //
 | 
						|
 | 
						|
    Status = ((EFI_FIRMWARE_VOLUME2_PROTOCOL*) (*Instance))->ReadFile (*Instance,
 | 
						|
                                                              &gPowerManagementAcpiTableStorageGuid,
 | 
						|
                                                              NULL,
 | 
						|
                                                              &Size,
 | 
						|
                                                              &FileType,
 | 
						|
                                                              &Attributes,
 | 
						|
                                                              &FvStatus
 | 
						|
                                                              );
 | 
						|
 | 
						|
    //
 | 
						|
    // If we found it, then we are done
 | 
						|
    //
 | 
						|
    if (Status == EFI_SUCCESS) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Our exit status is determined by the success of the previous operations
 | 
						|
  // If the protocol was found, Instance already points to it.
 | 
						|
  //
 | 
						|
 | 
						|
  //
 | 
						|
  // Free any allocated buffers
 | 
						|
  //
 | 
						|
  gBS->FreePool (HandleBuffer);
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function is to load all the power management acpi tables and patch IST table.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
PpmLoadAndPatchPMTables (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
    EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;
 | 
						|
    EFI_STATUS                    Status;
 | 
						|
    INTN                          Instance;
 | 
						|
  EFI_ACPI_COMMON_HEADER        *CurrentTable;
 | 
						|
  UINTN                         TableHandle;
 | 
						|
  UINT32                        FvStatus;
 | 
						|
  UINTN                         Size;
 | 
						|
 | 
						|
    Status = LocateSupportProtocol (&gEfiFirmwareVolume2ProtocolGuid, (VOID**)&FwVol, 1);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Read tables from the storage file.
 | 
						|
  //
 | 
						|
  Instance = 0;
 | 
						|
  CurrentTable = NULL;
 | 
						|
 | 
						|
  while (Status == EFI_SUCCESS) {
 | 
						|
 | 
						|
    Status = FwVol->ReadSection (
 | 
						|
                      FwVol,
 | 
						|
                      &gPowerManagementAcpiTableStorageGuid,
 | 
						|
                      EFI_SECTION_RAW,
 | 
						|
                      Instance,
 | 
						|
                      (VOID**)&CurrentTable,
 | 
						|
                      &Size,
 | 
						|
                      &FvStatus
 | 
						|
                      );
 | 
						|
 | 
						|
    if (!EFI_ERROR(Status)) {
 | 
						|
      SsdtTableUpdate ((EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable);
 | 
						|
 | 
						|
      //
 | 
						|
      // Update the check sum
 | 
						|
      // It needs to be zeroed before the checksum calculation
 | 
						|
      //
 | 
						|
      ((EFI_ACPI_SDT_HEADER *)CurrentTable)->Checksum = 0;
 | 
						|
      ((EFI_ACPI_SDT_HEADER *)CurrentTable)->Checksum = (UINT8)
 | 
						|
        CalculateCheckSum8 ((VOID *)CurrentTable, CurrentTable->Length);
 | 
						|
 | 
						|
      //
 | 
						|
      // Add the table
 | 
						|
      //
 | 
						|
      TableHandle = 0;
 | 
						|
      Status = mAcpiTable->InstallAcpiTable (
 | 
						|
                              mAcpiTable,
 | 
						|
                              CurrentTable,
 | 
						|
                              CurrentTable->Length,
 | 
						|
                              &TableHandle
 | 
						|
                              );
 | 
						|
 | 
						|
      ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
      //
 | 
						|
      // Increment the instance
 | 
						|
      //
 | 
						|
      Instance++;
 | 
						|
      CurrentTable = NULL;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
}
 |