mirror of https://github.com/acidanthera/audk.git
Retire VariablePei and PcatSingleSegmentPciCfgPei in IntelFrameworkModulePkg.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8551 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d84d730a2c
commit
1f095a0f38
|
@ -138,9 +138,6 @@
|
|||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusOnlySupportSlaveDma|FALSE|BOOLEAN|0x00010041
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSupportIsaMemory|TRUE|BOOLEAN|0x00010042
|
||||
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfgDisable|FALSE|BOOLEAN|0x00010043
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfg2Disable|FALSE|BOOLEAN|0x00010044
|
||||
|
||||
[PcdsFixedAtBuild]
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciIncompatibleDeviceSupportMask|0|UINT8|0x0001003f
|
||||
|
||||
|
|
|
@ -148,9 +148,6 @@
|
|||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSupportDma|TRUE
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusOnlySupportSlaveDma|FALSE
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSupportIsaMemory|TRUE
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfgDisable|TRUE
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfg2Disable|TRUE
|
||||
|
||||
|
||||
[PcdsFixedAtBuild.common]
|
||||
gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000
|
||||
|
@ -228,8 +225,6 @@
|
|||
IntelFrameworkModulePkg/Universal/DataHubStdErrDxe/DataHubStdErrDxe.inf
|
||||
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
|
||||
IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
|
||||
IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf
|
||||
IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.inf
|
||||
IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
|
||||
|
||||
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
#/** @file
|
||||
# Single Segment Pci Configuration PPI
|
||||
#
|
||||
# This file declares PciCfg PPI used to access PCI configuration space in PEI
|
||||
# Copyright (c) 2006 - 2009, Intel Corporation
|
||||
#
|
||||
# All rights reserved. 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.
|
||||
#
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PcatSingleSegmentPciCfgPei
|
||||
FILE_GUID = 27A5159D-5E61-4809-919A-422E887101EF
|
||||
MODULE_TYPE = PEIM
|
||||
VERSION_STRING = 1.0
|
||||
EFI_SPECIFICATION_VERSION = 0x00020000
|
||||
ENTRY_POINT = PeimInitializePciCfg
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
PciCfg.c
|
||||
PciCfg2.c
|
||||
PciCfgInternal.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
|
||||
|
||||
[LibraryClasses]
|
||||
PeimEntryPoint
|
||||
PciLib
|
||||
BaseLib
|
||||
DebugLib
|
||||
|
||||
|
||||
[Ppis]
|
||||
gEfiPciCfg2PpiGuid # PPI ALWAYS_PRODUCED
|
||||
gEfiPciCfgPpiInServiceTableGuid # PPI ALWAYS_PRODUCED
|
||||
|
||||
[FeaturePcd.common]
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfgDisable
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfg2Disable
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
|
|
@ -1,249 +0,0 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 2007, Intel Corporation
|
||||
All rights reserved. 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.
|
||||
|
||||
|
||||
|
||||
Module Name:
|
||||
|
||||
PciCfg.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Single Segment Pci Configuration PPI
|
||||
|
||||
Revision History
|
||||
|
||||
**/
|
||||
|
||||
#include "PciCfgInternal.h"
|
||||
|
||||
|
||||
/**
|
||||
PCI read operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
@param This Pointer to local data for the interface.
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
@param Address The physical address of the access.
|
||||
@param Buffer A pointer to the buffer of data.
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
@retval EFI_INVALID_PARAMETER Unsupported width
|
||||
enumeration.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfgRead (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_PCI_CFG_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
UINTN PciLibAddress;
|
||||
|
||||
PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
|
||||
|
||||
if (Width == EfiPeiPciCfgWidthUint8) {
|
||||
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
|
||||
} else if (Width == EfiPeiPciCfgWidthUint16) {
|
||||
if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
|
||||
*((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1);
|
||||
}
|
||||
} else if (Width == EfiPeiPciCfgWidthUint32) {
|
||||
if ((PciLibAddress & 0x03) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
WriteUnaligned32 (((UINT32 *) Buffer), PciRead32 (PciLibAddress));
|
||||
} else if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into word by word.
|
||||
//
|
||||
WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress));
|
||||
WriteUnaligned16 (((UINT16 *) Buffer + 1), PciRead16 (PciLibAddress + 2));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
|
||||
*((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1);
|
||||
*((UINT8 *) Buffer + 2) = PciRead8 (PciLibAddress + 2);
|
||||
*((UINT8 *) Buffer + 3) = PciRead8 (PciLibAddress + 3);
|
||||
}
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
PCI write operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
@param This Pointer to local data for the interface.
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
@param Address The physical address of the access.
|
||||
@param Buffer A pointer to the buffer of data.
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Unsupported width
|
||||
enumeration.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfgWrite (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_PCI_CFG_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
UINTN PciLibAddress;
|
||||
|
||||
PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
|
||||
|
||||
if (Width == EfiPeiPciCfgWidthUint8) {
|
||||
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
|
||||
} else if (Width == EfiPeiPciCfgWidthUint16) {
|
||||
if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
|
||||
PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1));
|
||||
}
|
||||
} else if (Width == EfiPeiPciCfgWidthUint32) {
|
||||
if ((PciLibAddress & 0x03) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
PciWrite32 (PciLibAddress, ReadUnaligned32 ((UINT32 *) Buffer));
|
||||
} else if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into word by word.
|
||||
//
|
||||
PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer));
|
||||
PciWrite16 (PciLibAddress + 2, ReadUnaligned16 ((UINT16 *) Buffer + 1));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
|
||||
PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1));
|
||||
PciWrite8 (PciLibAddress + 2, *((UINT8 *) Buffer + 2));
|
||||
PciWrite8 (PciLibAddress + 3, *((UINT8 *) Buffer + 3));
|
||||
}
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
PCI read-modify-write operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
@param This Pointer to local data for the interface.
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
@param Address The physical address of the access.
|
||||
@param SetBits Value of the bits to set.
|
||||
@param ClearBits Value of the bits to clear.
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
@retval EFI_INVALID_PARAMETER Unsupported width
|
||||
enumeration.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfgModify (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_PCI_CFG_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN UINTN SetBits,
|
||||
IN UINTN ClearBits
|
||||
)
|
||||
{
|
||||
UINTN PciLibAddress;
|
||||
|
||||
PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
|
||||
if (Width == EfiPeiPciCfgWidthUint8) {
|
||||
PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits);
|
||||
} else if (Width == EfiPeiPciCfgWidthUint16) {
|
||||
if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
PciAndThenOr16 (PciLibAddress, (UINT16)~ClearBits, (UINT16)SetBits);
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits);
|
||||
PciAndThenOr8 (PciLibAddress + 1, (UINT8)~(ClearBits >> 8), (UINT8)(SetBits >> 8));
|
||||
}
|
||||
} else if (Width == EfiPeiPciCfgWidthUint32) {
|
||||
if ((PciLibAddress & 0x03) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
PciAndThenOr32 (PciLibAddress, (UINT32)~ClearBits, (UINT32)SetBits);
|
||||
} else if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into word by word.
|
||||
//
|
||||
PciAndThenOr16 (PciLibAddress, (UINT16)~ClearBits, (UINT16)SetBits);
|
||||
PciAndThenOr16 (PciLibAddress + 2, (UINT16)~(ClearBits >> 16), (UINT16)(SetBits >> 16));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits);
|
||||
PciAndThenOr8 (PciLibAddress + 1, (UINT8)~(ClearBits >> 8), (UINT8)(SetBits >> 8));
|
||||
PciAndThenOr8 (PciLibAddress + 2, (UINT8)~(ClearBits >> 16), (UINT8)(SetBits >> 16));
|
||||
PciAndThenOr8 (PciLibAddress + 3, (UINT8)~(ClearBits >> 24), (UINT8)(SetBits >> 24));
|
||||
}
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
@ -1,405 +0,0 @@
|
|||
/**
|
||||
|
||||
Copyright (c) 2006 - 2007, Intel Corporation
|
||||
All rights reserved. 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 "PciCfgInternal.h"
|
||||
|
||||
/**
|
||||
@par Ppi Description:
|
||||
The EFI_PEI_PCI_CFG2_PPI interfaces are used to abstract
|
||||
accesses to PCI controllers behind a PCI root bridge
|
||||
controller.
|
||||
|
||||
@param Read PCI read services. See the Read() function description.
|
||||
|
||||
@param Write PCI write services. See the Write() function description.
|
||||
|
||||
@param Modify PCI read-modify-write services. See the Modify() function description.
|
||||
|
||||
@param Segment The PCI bus segment which the specified functions will access.
|
||||
|
||||
**/
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||
EFI_PEI_PCI_CFG2_PPI gPciCfg2Ppi = {
|
||||
PciCfg2Read,
|
||||
PciCfg2Write,
|
||||
PciCfg2Modify
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||
EFI_PEI_PPI_DESCRIPTOR gPciCfg2PpiList = {
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||
&gEfiPciCfg2PpiGuid,
|
||||
&gPciCfg2Ppi
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
@par Ppi Description:
|
||||
The EFI_PEI_PCI_CFG_PPI interfaces are used to abstract accesses to PCI
|
||||
controllers behind a PCI root bridge controller.
|
||||
|
||||
@param Read PCI read services. See the Read() function description.
|
||||
|
||||
@param Write PCI write services. See the Write() function description.
|
||||
|
||||
@param Modify PCI read-modify-write services. See the Modify() function description.
|
||||
|
||||
@param Segment The PCI bus segment which the specified functions will access.
|
||||
|
||||
**/
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||
EFI_PEI_PCI_CFG_PPI gPciCfgPpi = {
|
||||
PciCfgRead,
|
||||
PciCfgWrite,
|
||||
PciCfgModify
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||
EFI_PEI_PPI_DESCRIPTOR gPciCfgPpiList = {
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||
&gEfiPciCfgPpiInServiceTableGuid,
|
||||
&gPciCfgPpi
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.
|
||||
|
||||
@param Address PCI address with
|
||||
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS format.
|
||||
|
||||
@return The PCI address with PCI_LIB_ADDRESS format.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
PciCfgAddressConvert (
|
||||
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *Address
|
||||
)
|
||||
{
|
||||
if (Address->ExtendedRegister == 0) {
|
||||
return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->Register);
|
||||
}
|
||||
|
||||
return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->ExtendedRegister);
|
||||
}
|
||||
|
||||
/**
|
||||
Reads from a given location in the PCI configuration space.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
|
||||
|
||||
@param This Pointer to local data for the interface.
|
||||
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
|
||||
|
||||
@param Address The physical address of the access. The format of
|
||||
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
|
||||
|
||||
@param Buffer A pointer to the buffer of data..
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
|
||||
|
||||
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
|
||||
time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfg2Read (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
UINTN PciLibAddress;
|
||||
|
||||
PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
|
||||
|
||||
if (Width == EfiPeiPciCfgWidthUint8) {
|
||||
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
|
||||
} else if (Width == EfiPeiPciCfgWidthUint16) {
|
||||
if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
|
||||
*((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1);
|
||||
}
|
||||
} else if (Width == EfiPeiPciCfgWidthUint32) {
|
||||
if ((PciLibAddress & 0x03) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
WriteUnaligned32 (((UINT32 *) Buffer), PciRead32 (PciLibAddress));
|
||||
} else if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into word by word.
|
||||
//
|
||||
WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress));
|
||||
WriteUnaligned16 (((UINT16 *) Buffer + 1), PciRead16 (PciLibAddress + 2));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
|
||||
*((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1);
|
||||
*((UINT8 *) Buffer + 2) = PciRead8 (PciLibAddress + 2);
|
||||
*((UINT8 *) Buffer + 3) = PciRead8 (PciLibAddress + 3);
|
||||
}
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Write to a given location in the PCI configuration space.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
|
||||
|
||||
@param This Pointer to local data for the interface.
|
||||
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
|
||||
|
||||
@param Address The physical address of the access. The format of
|
||||
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
|
||||
|
||||
@param Buffer A pointer to the buffer of data..
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
|
||||
|
||||
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
|
||||
time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfg2Write (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
UINTN PciLibAddress;
|
||||
|
||||
PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
|
||||
|
||||
if (Width == EfiPeiPciCfgWidthUint8) {
|
||||
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
|
||||
} else if (Width == EfiPeiPciCfgWidthUint16) {
|
||||
if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
|
||||
PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1));
|
||||
}
|
||||
} else if (Width == EfiPeiPciCfgWidthUint32) {
|
||||
if ((PciLibAddress & 0x03) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
PciWrite32 (PciLibAddress, ReadUnaligned32 ((UINT32 *) Buffer));
|
||||
} else if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into word by word.
|
||||
//
|
||||
PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer));
|
||||
PciWrite16 (PciLibAddress + 2, ReadUnaligned16 ((UINT16 *) Buffer + 1));
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
|
||||
PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1));
|
||||
PciWrite8 (PciLibAddress + 2, *((UINT8 *) Buffer + 2));
|
||||
PciWrite8 (PciLibAddress + 3, *((UINT8 *) Buffer + 3));
|
||||
}
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
PCI read-modify-write operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
|
||||
@param This Pointer to local data for the interface.
|
||||
|
||||
@param Width The width of the access. Enumerated in bytes. Type
|
||||
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
|
||||
|
||||
@param Address The physical address of the access.
|
||||
|
||||
@param SetBits Points to value to bitwise-OR with the read configuration value.
|
||||
|
||||
The size of the value is determined by Width.
|
||||
|
||||
@param ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
|
||||
The size of the value is determined by Width.
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
|
||||
|
||||
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting
|
||||
the operation at this time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfg2Modify (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN VOID *SetBits,
|
||||
IN VOID *ClearBits
|
||||
)
|
||||
{
|
||||
UINTN PciLibAddress;
|
||||
UINT16 ClearValue16;
|
||||
UINT16 SetValue16;
|
||||
UINT32 ClearValue32;
|
||||
UINT32 SetValue32;
|
||||
|
||||
PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
|
||||
|
||||
if (Width == EfiPeiPciCfgWidthUint8) {
|
||||
PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits));
|
||||
} else if (Width == EfiPeiPciCfgWidthUint16) {
|
||||
if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits));
|
||||
SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits);
|
||||
PciAndThenOr16 (PciLibAddress, ClearValue16, SetValue16);
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits));
|
||||
PciAndThenOr8 (PciLibAddress + 1, (UINT8) (~(*((UINT8 *) ClearBits + 1))), *((UINT8 *) SetBits + 1));
|
||||
}
|
||||
} else if (Width == EfiPeiPciCfgWidthUint32) {
|
||||
if ((PciLibAddress & 0x03) == 0) {
|
||||
//
|
||||
// Aligned Pci address access
|
||||
//
|
||||
ClearValue32 = (UINT32) (~ReadUnaligned32 ((UINT32 *) ClearBits));
|
||||
SetValue32 = ReadUnaligned32 ((UINT32 *) SetBits);
|
||||
PciAndThenOr32 (PciLibAddress, ClearValue32, SetValue32);
|
||||
} else if ((PciLibAddress & 0x01) == 0) {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into word by word.
|
||||
//
|
||||
ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits));
|
||||
SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits);
|
||||
PciAndThenOr16 (PciLibAddress, ClearValue16, SetValue16);
|
||||
|
||||
ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits + 1));
|
||||
SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits + 1);
|
||||
PciAndThenOr16 (PciLibAddress + 2, ClearValue16, SetValue16);
|
||||
} else {
|
||||
//
|
||||
// Unaligned Pci address access, break up the request into byte by byte.
|
||||
//
|
||||
PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits));
|
||||
PciAndThenOr8 (PciLibAddress + 1, (UINT8) (~(*((UINT8 *) ClearBits + 1))), *((UINT8 *) SetBits + 1));
|
||||
PciAndThenOr8 (PciLibAddress + 2, (UINT8) (~(*((UINT8 *) ClearBits + 2))), *((UINT8 *) SetBits + 2));
|
||||
PciAndThenOr8 (PciLibAddress + 3, (UINT8) (~(*((UINT8 *) ClearBits + 3))), *((UINT8 *) SetBits + 3));
|
||||
}
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Module's entry function.
|
||||
This routine will install EFI_PEI_PCI_CFG2_PPI or EFI_PEI_PCI_CFG_PPI
|
||||
according to PeiServices's version.
|
||||
|
||||
@param FileHandle Handle of the file being invoked.
|
||||
@param PeiServices Describes the list of possible PEI Services.
|
||||
|
||||
@return Whether success to install service
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeimInitializePciCfg (
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
if ((**PeiServices).Hdr.Revision < PEI_SERVICES_REVISION) {
|
||||
//
|
||||
// BugBug: Curently, the FrameworkPkg does not define
|
||||
// FRAMEWORK_PEI_SERVICES. So, In order to install
|
||||
// the PeiServices.PciCfg(), we casttype
|
||||
// EFI_PEI_PCI_CFG_PPI to EFI_PEI_PCI_CFG2_PPI.
|
||||
// After defining the FRAMEWORK_PEI_SERVICES. this should
|
||||
// be updated as:
|
||||
//
|
||||
// FrameworkPeiServices = (FRAMEWORK_PEI_SERVICES **) PeiServices;
|
||||
// (**FrameworkPeiServices).PciCfg = &mPciCfgPpi;
|
||||
//
|
||||
(**(EFI_PEI_SERVICES**)PeiServices).PciCfg = (EFI_PEI_PCI_CFG2_PPI *) &gPciCfgPpi;
|
||||
} else {
|
||||
(**(EFI_PEI_SERVICES**)PeiServices).PciCfg = &gPciCfg2Ppi;
|
||||
}
|
||||
|
||||
if (!FeaturePcdGet (PcdPciCfgDisable)) {
|
||||
Status = (**PeiServices).InstallPpi (PeiServices, &gPciCfgPpiList);
|
||||
}
|
||||
if (!FeaturePcdGet (PcdPciCfg2Disable)) {
|
||||
Status = (**PeiServices).InstallPpi (PeiServices, &gPciCfg2PpiList);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
|
@ -1,237 +0,0 @@
|
|||
/**
|
||||
|
||||
Copyright (c) 2006 - 2007, Intel Corporation
|
||||
All rights reserved. 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.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __PCICFGPPI_INTERLNAL_H_
|
||||
#define __PCICFGPPI_INTERLNAL_H_
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <FrameworkPei.h>
|
||||
|
||||
#include <Ppi/PciCfg2.h>
|
||||
#include <Ppi/PciCfg.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PciLib.h>
|
||||
#include <Library/PeimEntryPoint.h>
|
||||
|
||||
#include <IndustryStandard/Pci.h>
|
||||
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_PEI_PCI_CFG_PPI gPciCfgPpi;
|
||||
extern EFI_PEI_PPI_DESCRIPTOR gPciCfgPpiList;
|
||||
|
||||
/**
|
||||
Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.
|
||||
|
||||
@param Address PCI address with
|
||||
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS format.
|
||||
|
||||
@return The PCI address with PCI_LIB_ADDRESS format.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
PciCfgAddressConvert (
|
||||
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *Address
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Reads from a given location in the PCI configuration space.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
|
||||
|
||||
@param This Pointer to local data for the interface.
|
||||
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
|
||||
|
||||
@param Address The physical address of the access. The format of
|
||||
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
|
||||
|
||||
@param Buffer A pointer to the buffer of data..
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
|
||||
|
||||
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
|
||||
time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfg2Read (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Write to a given location in the PCI configuration space.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
|
||||
|
||||
@param This Pointer to local data for the interface.
|
||||
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
|
||||
|
||||
@param Address The physical address of the access. The format of
|
||||
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
|
||||
|
||||
@param Buffer A pointer to the buffer of data..
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
|
||||
|
||||
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
|
||||
time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfg2Write (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
PCI read-modify-write operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
|
||||
@param This Pointer to local data for the interface.
|
||||
|
||||
@param Width The width of the access. Enumerated in bytes. Type
|
||||
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
|
||||
|
||||
@param Address The physical address of the access.
|
||||
|
||||
@param SetBits Points to value to bitwise-OR with the read configuration value.
|
||||
|
||||
The size of the value is determined by Width.
|
||||
|
||||
@param ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
|
||||
The size of the value is determined by Width.
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
|
||||
|
||||
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting
|
||||
the operation at this time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfg2Modify (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN VOID *SetBits,
|
||||
IN VOID *ClearBits
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
PCI read operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
@param This Pointer to local data for the interface.
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
@param Address The physical address of the access.
|
||||
@param Buffer A pointer to the buffer of data.
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
@retval EFI_NOT_YET_AVAILABLE The service has not been installed.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfgRead (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_PCI_CFG_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
PCI write operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
@param This Pointer to local data for the interface.
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
@param Address The physical address of the access.
|
||||
@param Buffer A pointer to the buffer of data.
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
@retval EFI_NOT_YET_AVAILABLE The service has not been installed.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfgWrite (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_PCI_CFG_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
PCI read-modify-write operation.
|
||||
|
||||
@param PeiServices An indirect pointer to the PEI Services Table
|
||||
published by the PEI Foundation.
|
||||
@param This Pointer to local data for the interface.
|
||||
@param Width The width of the access. Enumerated in bytes.
|
||||
@param Address The physical address of the access.
|
||||
@param SetBits Value of the bits to set.
|
||||
@param ClearBits Value of the bits to clear.
|
||||
|
||||
@retval EFI_SUCCESS The function completed successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PciCfgModify (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_PCI_CFG_PPI *This,
|
||||
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
|
||||
IN UINT64 Address,
|
||||
IN UINTN SetBits,
|
||||
IN UINTN ClearBits
|
||||
);
|
||||
|
||||
#endif
|
|
@ -1,57 +0,0 @@
|
|||
/** @file
|
||||
Variable worker functions.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation<BR>
|
||||
All rights reserved. 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 <Variable.h>
|
||||
|
||||
|
||||
/**
|
||||
Get one variable by the index count.
|
||||
|
||||
@param IndexTable The pointer to variable index table.
|
||||
@param Count The index count of variable in index table.
|
||||
|
||||
@return The pointer to variable header indexed by count.
|
||||
|
||||
**/
|
||||
VARIABLE_HEADER *
|
||||
GetVariableByIndex (
|
||||
IN VARIABLE_INDEX_TABLE *IndexTable,
|
||||
IN UINT32 Count
|
||||
)
|
||||
{
|
||||
return (VARIABLE_HEADER *) (UINTN) ((((UINT32)IndexTable->Index[Count]) << 2) + ((UINT32)(UINTN)IndexTable->StartPtr & 0xFFFC0000) );
|
||||
}
|
||||
|
||||
/**
|
||||
Record Variable in VariableIndex HOB.
|
||||
|
||||
Record Variable in VariableIndex HOB and update the length of variable index table.
|
||||
|
||||
@param IndexTable The pointer to variable index table.
|
||||
@param Variable The pointer to the variable that will be recorded.
|
||||
|
||||
@retval VOID
|
||||
|
||||
**/
|
||||
VOID
|
||||
VariableIndexTableUpdate (
|
||||
IN OUT VARIABLE_INDEX_TABLE *IndexTable,
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
{
|
||||
IndexTable->Index[IndexTable->Length++] = (UINT16) (((UINT32)(UINTN) Variable) >> 2);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -1,733 +0,0 @@
|
|||
/** @file
|
||||
Framework PEIM to provide the Variable functionality
|
||||
|
||||
Copyright (c) 2006 - 2009 Intel Corporation. <BR>
|
||||
All rights reserved. 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.
|
||||
Module Name:
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Variable.h"
|
||||
|
||||
//
|
||||
// Module globals
|
||||
//
|
||||
EFI_PEI_READ_ONLY_VARIABLE_PPI mVariablePpi = {
|
||||
PeiGetVariable,
|
||||
PeiGetNextVariableName
|
||||
};
|
||||
|
||||
EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariable2Ppi = {
|
||||
PeiGetVariable2,
|
||||
PeiGetNextVariableName2
|
||||
};
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR mPpiListVariable[] = {
|
||||
{
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI),
|
||||
&gEfiPeiReadOnlyVariable2PpiGuid,
|
||||
&mVariable2Ppi
|
||||
},
|
||||
{
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||
&gEfiPeiReadOnlyVariablePpiGuid,
|
||||
&mVariablePpi
|
||||
}
|
||||
};
|
||||
|
||||
EFI_GUID mEfiVariableIndexTableGuid = EFI_VARIABLE_INDEX_TABLE_GUID;
|
||||
|
||||
/**
|
||||
Provide the functionality of the variable services.
|
||||
|
||||
@param FileHandle Handle of the file being invoked.
|
||||
@param PeiServices Describes the list of possible PEI Services.
|
||||
|
||||
@return EFI_SUCCESS If the interface could be successfully installed.
|
||||
@return EFI_UNSUPPORTED If current boot path is in recovery mode, then does not
|
||||
install this interface.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeimInitializeVariableServices (
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
EFI_BOOT_MODE BootMode;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Check if this is recovery boot path. If no, publish the variable access capability
|
||||
// to other modules. If yes, the content of variable area is not reliable. Therefore,
|
||||
// in this case we should not provide variable service to other pei modules.
|
||||
//
|
||||
Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
if (BootMode == BOOT_IN_RECOVERY_MODE) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return (**PeiServices).InstallPpi (PeiServices, &mPpiListVariable[0]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the pointer to the first variable memory pointer byte
|
||||
|
||||
@param VarStoreHeader Pointer to the Variable Store Header.
|
||||
|
||||
@return VARIABLE_HEADER* Pointer to last unavailable Variable Header
|
||||
|
||||
**/
|
||||
VARIABLE_HEADER *
|
||||
GetStartPointer (
|
||||
IN VARIABLE_STORE_HEADER *VarStoreHeader
|
||||
)
|
||||
{
|
||||
//
|
||||
// The end of variable store
|
||||
//
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the pointer to the last variable memory pointer byte
|
||||
|
||||
@param VarStoreHeader Pointer to the Variable Store Header.
|
||||
|
||||
@return VARIABLE_HEADER* Pointer to last unavailable Variable Header
|
||||
|
||||
**/
|
||||
VARIABLE_HEADER *
|
||||
GetEndPointer (
|
||||
IN VARIABLE_STORE_HEADER *VarStoreHeader
|
||||
)
|
||||
|
||||
{
|
||||
//
|
||||
// The end of variable store
|
||||
//
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
This code checks if variable header is valid or not.
|
||||
|
||||
@param Variable Pointer to the Variable Header.
|
||||
|
||||
@retval TRUE Variable header is valid.
|
||||
@retval FALSE Variable header is not valid.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
IsValidVariableHeader (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
{
|
||||
if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the size of name of variable.
|
||||
|
||||
@param Variable Pointer to the Variable Header.
|
||||
|
||||
@return UINTN Size of variable in bytes
|
||||
|
||||
**/
|
||||
UINTN
|
||||
NameSizeOfVariable (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
{
|
||||
if (Variable->State == (UINT8) (-1) ||
|
||||
Variable->DataSize == (UINT32) -1 ||
|
||||
Variable->NameSize == (UINT32) -1 ||
|
||||
Variable->Attributes == (UINT32) -1) {
|
||||
return 0;
|
||||
}
|
||||
return (UINTN) Variable->NameSize;
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the size of name of variable.
|
||||
|
||||
@param Variable Pointer to the Variable Header.
|
||||
|
||||
@return UINTN Size of variable in bytes
|
||||
|
||||
**/
|
||||
UINTN
|
||||
DataSizeOfVariable (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
{
|
||||
if (Variable->State == (UINT8) -1 ||
|
||||
Variable->DataSize == (UINT32) -1 ||
|
||||
Variable->NameSize == (UINT32) -1 ||
|
||||
Variable->Attributes == (UINT32) -1) {
|
||||
return 0;
|
||||
}
|
||||
return (UINTN) Variable->DataSize;
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the pointer to the variable name.
|
||||
|
||||
@param Variable Pointer to the Variable Header.
|
||||
|
||||
@return CHAR16* Pointer to Variable Name
|
||||
|
||||
**/
|
||||
CHAR16 *
|
||||
GetVariableNamePtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
|
||||
{
|
||||
|
||||
return (CHAR16 *) (Variable + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the pointer to the variable data.
|
||||
|
||||
@param Variable Pointer to the Variable Header.
|
||||
|
||||
@return UINT8* Pointer to Variable Data
|
||||
|
||||
**/
|
||||
UINT8 *
|
||||
GetVariableDataPtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
{
|
||||
UINTN Value;
|
||||
|
||||
//
|
||||
// Be careful about pad size for alignment
|
||||
//
|
||||
Value = (UINTN) GetVariableNamePtr (Variable);
|
||||
Value += NameSizeOfVariable (Variable);
|
||||
Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));
|
||||
|
||||
return (UINT8 *) Value;
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the pointer to the next variable header.
|
||||
|
||||
@param Variable Pointer to the Variable Header.
|
||||
|
||||
@return VARIABLE_HEADER* Pointer to next variable header.
|
||||
|
||||
**/
|
||||
VARIABLE_HEADER *
|
||||
GetNextVariablePtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
|
||||
{
|
||||
UINTN Value;
|
||||
|
||||
if (!IsValidVariableHeader (Variable)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Value = (UINTN) GetVariableDataPtr (Variable);
|
||||
Value += DataSizeOfVariable (Variable);
|
||||
Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));
|
||||
|
||||
//
|
||||
// Be careful about pad size for alignment
|
||||
//
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN (Value);
|
||||
}
|
||||
|
||||
/**
|
||||
This code gets the pointer to the variable name.
|
||||
|
||||
@param VarStoreHeader Pointer to the Variable Store Header.
|
||||
|
||||
@retval EfiRaw Variable store is raw
|
||||
@retval EfiValid Variable store is valid
|
||||
@retval EfiInvalid Variable store is invalid
|
||||
|
||||
**/
|
||||
VARIABLE_STORE_STATUS
|
||||
EFIAPI
|
||||
GetVariableStoreStatus (
|
||||
IN VARIABLE_STORE_HEADER *VarStoreHeader
|
||||
)
|
||||
|
||||
{
|
||||
|
||||
if (CompareGuid (&VarStoreHeader->Signature, &gEfiVariableGuid) &&
|
||||
VarStoreHeader->Format == VARIABLE_STORE_FORMATTED &&
|
||||
VarStoreHeader->State == VARIABLE_STORE_HEALTHY
|
||||
) {
|
||||
|
||||
return EfiValid;
|
||||
}
|
||||
|
||||
if (((UINT32 *)(&VarStoreHeader->Signature))[0] == 0xffffffff &&
|
||||
((UINT32 *)(&VarStoreHeader->Signature))[1] == 0xffffffff &&
|
||||
((UINT32 *)(&VarStoreHeader->Signature))[2] == 0xffffffff &&
|
||||
((UINT32 *)(&VarStoreHeader->Signature))[3] == 0xffffffff &&
|
||||
VarStoreHeader->Size == 0xffffffff &&
|
||||
VarStoreHeader->Format == 0xff &&
|
||||
VarStoreHeader->State == 0xff
|
||||
) {
|
||||
|
||||
return EfiRaw;
|
||||
} else {
|
||||
return EfiInvalid;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
This function compares a variable with variable entries in database
|
||||
|
||||
@param Variable - Pointer to the variable in our database
|
||||
@param VariableName - Name of the variable to compare to 'Variable'
|
||||
@param VendorGuid - GUID of the variable to compare to 'Variable'
|
||||
@param PtrTrack - Variable Track Pointer structure that contains
|
||||
Variable Information.
|
||||
|
||||
@retval EFI_SUCCESS - Found match variable
|
||||
@retval EFI_NOT_FOUND - Variable not found
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
CompareWithValidVariable (
|
||||
IN VARIABLE_HEADER *Variable,
|
||||
IN CONST CHAR16 *VariableName,
|
||||
IN CONST EFI_GUID *VendorGuid,
|
||||
OUT VARIABLE_POINTER_TRACK *PtrTrack
|
||||
)
|
||||
|
||||
{
|
||||
VOID *Point;
|
||||
|
||||
if (VariableName[0] == 0) {
|
||||
PtrTrack->CurrPtr = Variable;
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
//
|
||||
// Don't use CompareGuid function here for performance reasons.
|
||||
// Instead we compare the GUID a UINT32 at a time and branch
|
||||
// on the first failed comparison.
|
||||
//
|
||||
if ((((INT32 *) VendorGuid)[0] == ((INT32 *) &Variable->VendorGuid)[0]) &&
|
||||
(((INT32 *) VendorGuid)[1] == ((INT32 *) &Variable->VendorGuid)[1]) &&
|
||||
(((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&
|
||||
(((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])
|
||||
) {
|
||||
ASSERT (NameSizeOfVariable (Variable) != 0);
|
||||
Point = (VOID *) GetVariableNamePtr (Variable);
|
||||
if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {
|
||||
PtrTrack->CurrPtr = Variable;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
This code finds variable in storage blocks (Non-Volatile)
|
||||
|
||||
@param PeiServices - General purpose services available to every PEIM.
|
||||
@param VariableName - Name of the variable to be found
|
||||
@param VendorGuid - Vendor GUID to be found.
|
||||
@param PtrTrack - Variable Track Pointer structure that contains
|
||||
Variable Information.
|
||||
|
||||
@retval EFI_SUCCESS - Variable found successfully
|
||||
@retval EFI_NOT_FOUND - Variable not found
|
||||
@retval EFI_INVALID_PARAMETER - Invalid variable name
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FindVariable (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN CONST CHAR16 *VariableName,
|
||||
IN CONST EFI_GUID *VendorGuid,
|
||||
OUT VARIABLE_POINTER_TRACK *PtrTrack
|
||||
)
|
||||
|
||||
{
|
||||
EFI_HOB_GUID_TYPE *GuidHob;
|
||||
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||
VARIABLE_HEADER *Variable;
|
||||
VARIABLE_HEADER *MaxIndex;
|
||||
VARIABLE_INDEX_TABLE *IndexTable;
|
||||
UINT32 Count;
|
||||
UINT8 *VariableBase;
|
||||
|
||||
if (VariableName[0] != 0 && VendorGuid == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// No Variable Address equals zero, so 0 as initial value is safe.
|
||||
//
|
||||
MaxIndex = 0;
|
||||
|
||||
GuidHob = GetFirstGuidHob (&mEfiVariableIndexTableGuid);
|
||||
if (GuidHob == NULL) {
|
||||
IndexTable = BuildGuidHob (&mEfiVariableIndexTableGuid, sizeof (VARIABLE_INDEX_TABLE));
|
||||
IndexTable->Length = 0;
|
||||
IndexTable->StartPtr = NULL;
|
||||
IndexTable->EndPtr = NULL;
|
||||
IndexTable->GoneThrough = 0;
|
||||
} else {
|
||||
IndexTable = GET_GUID_HOB_DATA (GuidHob);
|
||||
for (Count = 0; Count < IndexTable->Length; Count++)
|
||||
{
|
||||
MaxIndex = GetVariableByIndex (IndexTable, Count);
|
||||
|
||||
if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {
|
||||
PtrTrack->StartPtr = IndexTable->StartPtr;
|
||||
PtrTrack->EndPtr = IndexTable->EndPtr;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (IndexTable->GoneThrough) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
//
|
||||
// If not found in HOB, then let's start from the MaxIndex we've found.
|
||||
//
|
||||
if (MaxIndex != NULL) {
|
||||
Variable = GetNextVariablePtr (MaxIndex);
|
||||
} else {
|
||||
if (IndexTable->StartPtr || IndexTable->EndPtr) {
|
||||
Variable = IndexTable->StartPtr;
|
||||
} else {
|
||||
VariableBase = (UINT8 *) (UINTN) PcdGet32 (PcdFlashNvStorageVariableBase);
|
||||
|
||||
//
|
||||
// Check if FV header is valid.
|
||||
//
|
||||
if (((EFI_FIRMWARE_VOLUME_HEADER *) VariableBase)->Signature != EFI_FVH_SIGNATURE) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
VariableStoreHeader = (VARIABLE_STORE_HEADER *) (VariableBase + \
|
||||
((EFI_FIRMWARE_VOLUME_HEADER *) (VariableBase)) -> HeaderLength);
|
||||
|
||||
if (GetVariableStoreStatus (VariableStoreHeader) != EfiValid) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (~VariableStoreHeader->Size == 0) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
//
|
||||
// Find the variable by walk through non-volatile variable store
|
||||
//
|
||||
IndexTable->StartPtr = GetStartPointer (VariableStoreHeader);
|
||||
IndexTable->EndPtr = GetEndPointer (VariableStoreHeader);
|
||||
|
||||
//
|
||||
// Start Pointers for the variable.
|
||||
// Actual Data Pointer where data can be written.
|
||||
//
|
||||
Variable = IndexTable->StartPtr;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Find the variable by walk through non-volatile variable store
|
||||
//
|
||||
PtrTrack->StartPtr = IndexTable->StartPtr;
|
||||
PtrTrack->EndPtr = IndexTable->EndPtr;
|
||||
|
||||
while ((Variable < IndexTable->EndPtr) && IsValidVariableHeader (Variable)) {
|
||||
if (Variable->State == VAR_ADDED) {
|
||||
//
|
||||
// Record Variable in VariableIndex HOB
|
||||
//
|
||||
if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME)
|
||||
{
|
||||
VariableIndexTableUpdate (IndexTable, Variable);
|
||||
}
|
||||
|
||||
if (CompareWithValidVariable (Variable, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Variable = GetNextVariablePtr (Variable);
|
||||
}
|
||||
//
|
||||
// If gone through the VariableStore, that means we never find in Firmware any more.
|
||||
//
|
||||
if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME) {
|
||||
IndexTable->GoneThrough = 1;
|
||||
}
|
||||
|
||||
PtrTrack->CurrPtr = NULL;
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Provide the read variable functionality of the variable services.
|
||||
|
||||
@param PeiServices - General purpose services available to every PEIM.
|
||||
|
||||
@param VariableName - The variable name
|
||||
|
||||
@param VendorGuid - The vendor's GUID
|
||||
|
||||
@param Attributes - Pointer to the attribute
|
||||
|
||||
@param DataSize - Size of data
|
||||
|
||||
@param Data - Pointer to data
|
||||
|
||||
@retval EFI_SUCCESS - The interface could be successfully installed
|
||||
|
||||
@retval EFI_NOT_FOUND - The variable could not be discovered
|
||||
|
||||
@retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetVariable (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN CHAR16 *VariableName,
|
||||
IN EFI_GUID * VendorGuid,
|
||||
OUT UINT32 *Attributes OPTIONAL,
|
||||
IN OUT UINTN *DataSize,
|
||||
OUT VOID *Data
|
||||
)
|
||||
|
||||
{
|
||||
VARIABLE_POINTER_TRACK Variable;
|
||||
UINTN VarDataSize;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// Find existing variable
|
||||
//
|
||||
Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable);
|
||||
|
||||
if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Get data size
|
||||
//
|
||||
VarDataSize = DataSizeOfVariable (Variable.CurrPtr);
|
||||
if (*DataSize >= VarDataSize) {
|
||||
//
|
||||
// PO-TKW: Address one checking in this place
|
||||
//
|
||||
if (Data == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
(*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);
|
||||
|
||||
if (Attributes != NULL) {
|
||||
*Attributes = Variable.CurrPtr->Attributes;
|
||||
}
|
||||
|
||||
*DataSize = VarDataSize;
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
*DataSize = VarDataSize;
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Provide the read variable functionality of the variable services.
|
||||
|
||||
@param PeiServices - General purpose services available to every PEIM.
|
||||
|
||||
@param VariableName - The variable name
|
||||
|
||||
@param VendorGuid - The vendor's GUID
|
||||
|
||||
@param Attributes - Pointer to the attribute
|
||||
|
||||
@param DataSize - Size of data
|
||||
|
||||
@param Data - Pointer to data
|
||||
|
||||
@retval EFI_SUCCESS - The interface could be successfully installed
|
||||
|
||||
@retval EFI_NOT_FOUND - The variable could not be discovered
|
||||
|
||||
@retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetVariable2 (
|
||||
IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,
|
||||
IN CONST CHAR16 *VariableName,
|
||||
IN CONST EFI_GUID *VariableGuid,
|
||||
OUT UINT32 *Attributes,
|
||||
IN OUT UINTN *DataSize,
|
||||
OUT VOID *Data
|
||||
)
|
||||
|
||||
{
|
||||
return PeiGetVariable (
|
||||
(EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
|
||||
(CHAR16*)VariableName,
|
||||
(EFI_GUID*)VariableGuid,
|
||||
Attributes,
|
||||
DataSize,
|
||||
Data
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Provide the get next variable functionality of the variable services.
|
||||
|
||||
@param PeiServices - General purpose services available to every PEIM.
|
||||
@param VariabvleNameSize - The variable name's size.
|
||||
@param VariableName - A pointer to the variable's name.
|
||||
@param VendorGuid - A pointer to the EFI_GUID structure.
|
||||
|
||||
@param VariableNameSize - Size of the variable name
|
||||
|
||||
@param VariableName - The variable name
|
||||
|
||||
@param VendorGuid - The vendor's GUID
|
||||
|
||||
@retval EFI_SUCCESS - The interface could be successfully installed
|
||||
|
||||
@retval EFI_NOT_FOUND - The variable could not be discovered
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetNextVariableName (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN OUT UINTN *VariableNameSize,
|
||||
IN OUT CHAR16 *VariableName,
|
||||
IN OUT EFI_GUID *VendorGuid
|
||||
)
|
||||
|
||||
{
|
||||
VARIABLE_POINTER_TRACK Variable;
|
||||
UINTN VarNameSize;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable);
|
||||
|
||||
if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (VariableName[0] != 0) {
|
||||
//
|
||||
// If variable name is not NULL, get next variable
|
||||
//
|
||||
Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);
|
||||
}
|
||||
|
||||
while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {
|
||||
if (IsValidVariableHeader (Variable.CurrPtr)) {
|
||||
if (Variable.CurrPtr->State == VAR_ADDED) {
|
||||
ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);
|
||||
|
||||
VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);
|
||||
if (VarNameSize <= *VariableNameSize) {
|
||||
(*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);
|
||||
|
||||
(*PeiServices)->CopyMem (VendorGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
|
||||
*VariableNameSize = VarNameSize;
|
||||
return Status;
|
||||
//
|
||||
// Variable is found
|
||||
//
|
||||
} else {
|
||||
Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Provide the get next variable functionality of the variable services.
|
||||
|
||||
@param PeiServices - General purpose services available to every PEIM.
|
||||
@param VariabvleNameSize - The variable name's size.
|
||||
@param VariableName - A pointer to the variable's name.
|
||||
@param VariableGuid - A pointer to the EFI_GUID structure.
|
||||
|
||||
@param VariableNameSize - Size of the variable name
|
||||
|
||||
@param VariableName - The variable name
|
||||
|
||||
@param VendorGuid - The vendor's GUID
|
||||
|
||||
|
||||
@retval EFI_SUCCESS - The interface could be successfully installed
|
||||
|
||||
@retval EFI_NOT_FOUND - The variable could not be discovered
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetNextVariableName2 (
|
||||
IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,
|
||||
IN OUT UINTN *VariableNameSize,
|
||||
IN OUT CHAR16 *VariableName,
|
||||
IN OUT EFI_GUID *VariableGuid
|
||||
)
|
||||
|
||||
{
|
||||
return PeiGetNextVariableName (
|
||||
(EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
|
||||
VariableNameSize,
|
||||
VariableName,
|
||||
VariableGuid
|
||||
);
|
||||
}
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 2007, Intel Corporation
|
||||
All rights reserved. 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.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _PEI_VARIABLE_H
|
||||
#define _PEI_VARIABLE_H
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Ppi/ReadOnlyVariable.h>
|
||||
#include <Ppi/ReadOnlyVariable2.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PeimEntryPoint.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PeiServicesTablePointerLib.h>
|
||||
#include <Guid/VariableFormat.h>
|
||||
|
||||
typedef struct {
|
||||
VARIABLE_HEADER *CurrPtr;
|
||||
VARIABLE_HEADER *EndPtr;
|
||||
VARIABLE_HEADER *StartPtr;
|
||||
} VARIABLE_POINTER_TRACK;
|
||||
|
||||
#define VARIABLE_INDEX_TABLE_VOLUME 122
|
||||
|
||||
#define EFI_VARIABLE_INDEX_TABLE_GUID \
|
||||
{ 0x8cfdb8c8, 0xd6b2, 0x40f3, { 0x8e, 0x97, 0x02, 0x30, 0x7c, 0xc9, 0x8b, 0x7c } }
|
||||
|
||||
typedef struct {
|
||||
UINT16 Length;
|
||||
UINT16 GoneThrough;
|
||||
VARIABLE_HEADER *EndPtr;
|
||||
VARIABLE_HEADER *StartPtr;
|
||||
UINT16 Index[VARIABLE_INDEX_TABLE_VOLUME];
|
||||
} VARIABLE_INDEX_TABLE;
|
||||
|
||||
//
|
||||
// Functions
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetVariable (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN CHAR16 *VariableName,
|
||||
IN EFI_GUID * VendorGuid,
|
||||
OUT UINT32 *Attributes OPTIONAL,
|
||||
IN OUT UINTN *DataSize,
|
||||
OUT VOID *Data
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetVariable2 (
|
||||
IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,
|
||||
IN CONST CHAR16 *VariableName,
|
||||
IN CONST EFI_GUID *VariableGuid,
|
||||
OUT UINT32 *Attributes,
|
||||
IN OUT UINTN *DataSize,
|
||||
OUT VOID *Data
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetNextVariableName2 (
|
||||
IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,
|
||||
IN OUT UINTN *VariableNameSize,
|
||||
IN OUT CHAR16 *VariableName,
|
||||
IN OUT EFI_GUID *VariableGuid
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PeiGetNextVariableName (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN OUT UINTN *VariableNameSize,
|
||||
IN OUT CHAR16 *VariableName,
|
||||
IN OUT EFI_GUID *VendorGuid
|
||||
);
|
||||
|
||||
/**
|
||||
Get one variable by the index count.
|
||||
|
||||
@param IndexTable The pointer to variable index table.
|
||||
@param Count The index count of variable in index table.
|
||||
|
||||
@return The pointer to variable header indexed by count.
|
||||
|
||||
**/
|
||||
VARIABLE_HEADER *
|
||||
GetVariableByIndex (
|
||||
IN VARIABLE_INDEX_TABLE *IndexTable,
|
||||
IN UINT32 Count
|
||||
);
|
||||
|
||||
/**
|
||||
Record Variable in VariableIndex HOB.
|
||||
|
||||
Record Variable in VariableIndex HOB and update the length of variable index table.
|
||||
|
||||
@param IndexTable The pointer to variable index table.
|
||||
@param Variable The pointer to the variable that will be recorded.
|
||||
|
||||
@retval VOID
|
||||
|
||||
**/
|
||||
VOID
|
||||
VariableIndexTableUpdate (
|
||||
IN OUT VARIABLE_INDEX_TABLE *IndexTable,
|
||||
IN VARIABLE_HEADER *Variable
|
||||
);
|
||||
|
||||
#endif // _PEI_VARIABLE_H
|
|
@ -1,114 +0,0 @@
|
|||
#/** @file
|
||||
# Component description file for PeiVariable module.
|
||||
#
|
||||
# This module will produce EFI_PEI_READ_ONLY_VARIABLE_PPI and EFI_PEI_READ_ONLY_VARIABLE2_PPI
|
||||
# Framework PEIM to provide the Variable functionality.
|
||||
# Copyright (c) 2006 - 2009, Intel Corporation
|
||||
#
|
||||
# All rights reserved. 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.
|
||||
#
|
||||
#
|
||||
#**/
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Defines Section - statements that will be processed to create a Makefile.
|
||||
#
|
||||
################################################################################
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PeiVariable
|
||||
FILE_GUID = 34C8C28F-B61C-45a2-8F2E-89E46BECC63B
|
||||
MODULE_TYPE = PEIM
|
||||
VERSION_STRING = 1.0
|
||||
EFI_SPECIFICATION_VERSION = 0x00020000
|
||||
ENTRY_POINT = PeimInitializeVariableServices
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Sources Section - list of files that are required for the build to succeed.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[Sources.common]
|
||||
Variable.c
|
||||
Variable.h
|
||||
|
||||
[Sources.Ia32]
|
||||
VariableWorker.c
|
||||
|
||||
[Sources.X64]
|
||||
VariableWorker.c
|
||||
|
||||
[Sources.IPF]
|
||||
Ipf/VariableWorker.c
|
||||
|
||||
[Sources.EBC]
|
||||
VariableWorker.c
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Package Dependency Section - list of Package files that are required for
|
||||
# this module.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[Packages]
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Library Class Section - list of Library Classes that are required for
|
||||
# this module.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
PcdLib
|
||||
HobLib
|
||||
PeimEntryPoint
|
||||
DebugLib
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# PPI C Name Section - list of PPI and PPI Notify C Names that this module
|
||||
# uses or produces.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[Ppis]
|
||||
gEfiPeiReadOnlyVariablePpiGuid # PPI ALWAYS_PRODUCED
|
||||
gEfiPeiReadOnlyVariable2PpiGuid # PPI ALWAYS_PRODUCED
|
||||
|
||||
[Guids]
|
||||
gEfiVariableGuid
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Pcd DYNAMIC - list of PCDs that this module is coded for.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[Pcd.common]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize
|
||||
|
||||
[depex]
|
||||
TRUE
|
|
@ -1,63 +0,0 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2007, Intel Corporation
|
||||
All rights reserved. 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.
|
||||
|
||||
Module Name:
|
||||
|
||||
VariableWorker.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Framework PEIM to provide the Variable functionality
|
||||
|
||||
**/
|
||||
|
||||
#include <Variable.h>
|
||||
|
||||
/**
|
||||
Get one variable by the index count.
|
||||
|
||||
@param IndexTable The pointer to variable index table.
|
||||
@param Count The index count of variable in index table.
|
||||
|
||||
@return The pointer to variable header indexed by count.
|
||||
|
||||
**/
|
||||
VARIABLE_HEADER *
|
||||
GetVariableByIndex (
|
||||
IN VARIABLE_INDEX_TABLE *IndexTable,
|
||||
IN UINT32 Count
|
||||
)
|
||||
{
|
||||
return (VARIABLE_HEADER *) (UINTN) (IndexTable->Index[Count] + ((UINTN) IndexTable->StartPtr & 0xFFFF0000));
|
||||
}
|
||||
|
||||
/**
|
||||
Record Variable in VariableIndex HOB.
|
||||
|
||||
Record Variable in VariableIndex HOB and update the length of variable index table.
|
||||
|
||||
@param IndexTable The pointer to variable index table.
|
||||
@param Variable The pointer to the variable that will be recorded.
|
||||
|
||||
@retval VOID
|
||||
|
||||
**/
|
||||
VOID
|
||||
VariableIndexTableUpdate (
|
||||
IN OUT VARIABLE_INDEX_TABLE *IndexTable,
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
{
|
||||
IndexTable->Index[IndexTable->Length++] = (UINT16) (UINTN) Variable;
|
||||
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue