/** @file
|
PCH SPI PEI Library implements the SPI Host Controller Compatibility Interface.
|
|
@copyright
|
Copyright 2004 - 2021 Intel Corporation. <BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
**/
|
|
|
#include <Library/IoLib.h>
|
#include <Library/DebugLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
#include <Library/PeiServicesLib.h>
|
#include <Ppi/Spi.h>
|
#include <Ppi/PchPolicy.h>
|
#include <Private/Library/PchSpiCommonLib.h>
|
#include <Library/PchMultiPchBase.h>
|
|
typedef struct {
|
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
|
SPI_INSTANCE SpiInstance;
|
} PEI_SPI_INSTANCE;
|
|
|
/**
|
Read data from the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] FlashRegionType The Flash Region type for flash cycle which is listed in the Descriptor.
|
@param[in] Address The Flash Linear Address must fall within a region for which BIOS has access permissions.
|
@param[in] ByteCount Number of bytes in the data portion of the SPI cycle.
|
@param[out] Buffer The Pointer to caller-allocated buffer containing the dada received.
|
It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashRead (
|
IN PCH_SPI_PROTOCOL *This,
|
IN FLASH_REGION_TYPE FlashRegionType,
|
IN UINT32 Address,
|
IN UINT32 ByteCount,
|
OUT UINT8 *Buffer
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Write data to the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] FlashRegionType The Flash Region type for flash cycle which is listed in the Descriptor.
|
@param[in] Address The Flash Linear Address must fall within a region for which BIOS has access permissions.
|
@param[in] ByteCount Number of bytes in the data portion of the SPI cycle.
|
@param[in] Buffer Pointer to caller-allocated buffer containing the data sent during the SPI cycle.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashWrite (
|
IN PCH_SPI_PROTOCOL *This,
|
IN FLASH_REGION_TYPE FlashRegionType,
|
IN UINT32 Address,
|
IN UINT32 ByteCount,
|
IN UINT8 *Buffer
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Erase some area on the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] FlashRegionType The Flash Region type for flash cycle which is listed in the Descriptor.
|
@param[in] Address The Flash Linear Address must fall within a region for which BIOS has access permissions.
|
@param[in] ByteCount Number of bytes in the data portion of the SPI cycle.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashErase (
|
IN PCH_SPI_PROTOCOL *This,
|
IN FLASH_REGION_TYPE FlashRegionType,
|
IN UINT32 Address,
|
IN UINT32 ByteCount
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Read SFDP data from the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] ComponentNumber The Componen Number for chip select
|
@param[in] Address The starting byte address for SFDP data read.
|
@param[in] ByteCount Number of bytes in SFDP data portion of the SPI cycle
|
@param[out] SfdpData The Pointer to caller-allocated buffer containing the SFDP data received
|
It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashReadSfdp (
|
IN PCH_SPI_PROTOCOL *This,
|
IN UINT8 ComponentNumber,
|
IN UINT32 Address,
|
IN UINT32 ByteCount,
|
OUT UINT8 *SfdpData
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Read Jedec Id from the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] ComponentNumber The Componen Number for chip select
|
@param[in] ByteCount Number of bytes in JedecId data portion of the SPI cycle, the data size is 3 typically
|
@param[out] JedecId The Pointer to caller-allocated buffer containing JEDEC ID received
|
It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashReadJedecId (
|
IN PCH_SPI_PROTOCOL *This,
|
IN UINT8 ComponentNumber,
|
IN UINT32 ByteCount,
|
OUT UINT8 *JedecId
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Write the status register in the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] ByteCount Number of bytes in Status data portion of the SPI cycle, the data size is 1 typically
|
@param[in] StatusValue The Pointer to caller-allocated buffer containing the value of Status register writing
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashWriteStatus (
|
IN PCH_SPI_PROTOCOL *This,
|
IN UINT32 ByteCount,
|
IN UINT8 *StatusValue
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Read status register in the flash part.
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] ByteCount Number of bytes in Status data portion of the SPI cycle, the data size is 1 typically
|
@param[out] StatusValue The Pointer to caller-allocated buffer containing the value of Status register received.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolFlashReadStatus (
|
IN PCH_SPI_PROTOCOL *This,
|
IN UINT32 ByteCount,
|
OUT UINT8 *StatusValue
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Get the SPI region base and size, based on the enum type
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] FlashRegionType The Flash Region type for for the base address which is listed in the Descriptor.
|
@param[out] BaseAddress The Flash Linear Address for the Region 'n' Base
|
@param[out] RegionSize The size for the Region 'n'
|
|
@retval EFI_SUCCESS Read success
|
@retval EFI_INVALID_PARAMETER Invalid region type given
|
@retval EFI_DEVICE_ERROR The region is not used
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolGetRegionAddress (
|
IN PCH_SPI_PROTOCOL *This,
|
IN FLASH_REGION_TYPE FlashRegionType,
|
OUT UINT32 *BaseAddress,
|
OUT UINT32 *RegionSize
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Read PCH Soft Strap Values
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] SoftStrapAddr PCH Soft Strap address offset from FPSBA.
|
@param[in] ByteCount Number of bytes in SoftStrap data portion of the SPI cycle
|
@param[out] SoftStrapValue The Pointer to caller-allocated buffer containing PCH Soft Strap Value.
|
If the value of ByteCount is 0, the data type of SoftStrapValue should be UINT16 and SoftStrapValue will be PCH Soft Strap Length
|
It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolReadPchSoftStrap (
|
IN PCH_SPI_PROTOCOL *This,
|
IN UINT32 SoftStrapAddr,
|
IN UINT32 ByteCount,
|
OUT VOID *SoftStrapValue
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
/**
|
Read CPU Soft Strap Values
|
|
@param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
@param[in] SoftStrapAddr CPU Soft Strap address offset from FCPUSBA.
|
@param[in] ByteCount Number of bytes in SoftStrap data portion of the SPI cycle.
|
@param[out] SoftStrapValue The Pointer to caller-allocated buffer containing CPU Soft Strap Value.
|
If the value of ByteCount is 0, the data type of SoftStrapValue should be UINT16 and SoftStrapValue will be PCH Soft Strap Length
|
It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
|
|
@retval EFI_SUCCESS Command succeed.
|
@retval EFI_INVALID_PARAMETER The parameters specified are not valid.
|
@retval EFI_DEVICE_ERROR Device error, command aborts abnormally.
|
**/
|
EFI_STATUS
|
EFIAPI
|
SpiProtocolReadCpuSoftStrap (
|
IN PCH_SPI_PROTOCOL *This,
|
IN UINT32 SoftStrapAddr,
|
IN UINT32 ByteCount,
|
OUT VOID *SoftStrapValue
|
)
|
{
|
return EFI_UNSUPPORTED;
|
}
|
|
|
/**
|
Initialize an SPI protocol instance.
|
|
@param[in] PchId The PCH Id (0 - Legacy PCH, 1 ... n - Non-Legacy PCH)
|
@param[in] SpiInstance Pointer to SpiInstance to initialize
|
|
@retval EFI_SUCCESS The protocol instance was properly initialized
|
@exception EFI_UNSUPPORTED The PCH is not supported by this module
|
**/
|
EFI_STATUS
|
SpiProtocolConstructor (
|
IN UINT8 PchId,
|
IN SPI_INSTANCE *SpiInstance
|
)
|
{
|
//
|
// Initialize the SPI protocol instance
|
//
|
SpiInstance->Signature = PCH_SPI_PRIVATE_DATA_SIGNATURE;
|
SpiInstance->Handle = NULL;
|
SpiInstance->SpiProtocol.Revision = PCH_SPI_SERVICES_REVISION;
|
SpiInstance->SpiProtocol.FlashRead = SpiProtocolFlashRead;
|
SpiInstance->SpiProtocol.FlashWrite = SpiProtocolFlashWrite;
|
SpiInstance->SpiProtocol.FlashErase = SpiProtocolFlashErase;
|
SpiInstance->SpiProtocol.FlashReadSfdp = SpiProtocolFlashReadSfdp;
|
SpiInstance->SpiProtocol.FlashReadJedecId = SpiProtocolFlashReadJedecId;
|
SpiInstance->SpiProtocol.FlashWriteStatus = SpiProtocolFlashWriteStatus;
|
SpiInstance->SpiProtocol.FlashReadStatus = SpiProtocolFlashReadStatus;
|
SpiInstance->SpiProtocol.GetRegionAddress = SpiProtocolGetRegionAddress;
|
SpiInstance->SpiProtocol.ReadPchSoftStrap = SpiProtocolReadPchSoftStrap;
|
SpiInstance->SpiProtocol.ReadCpuSoftStrap = SpiProtocolReadCpuSoftStrap;
|
return EFI_SUCCESS;
|
}
|
|
/**
|
Installs PCH SPI PPI
|
|
@retval EFI_SUCCESS PCH SPI PPI is installed successfully
|
@retval EFI_OUT_OF_RESOURCES Can't allocate pool
|
**/
|
EFI_STATUS
|
EFIAPI
|
InstallPchSpi (
|
VOID
|
)
|
{
|
EFI_STATUS Status;
|
PEI_SPI_INSTANCE *PeiSpiInstance;
|
SPI_INSTANCE *SpiInstance;
|
|
DEBUG ((DEBUG_INFO, "InstallPchSpi() Start\n"));
|
|
//
|
// PCI Enumeratuion is not done till later in DXE
|
// Initlialize SPI BAR0 to a default value till enumeration is done
|
// also enable memory space decoding for SPI
|
//
|
|
|
PeiSpiInstance = (PEI_SPI_INSTANCE *) AllocateZeroPool (sizeof (PEI_SPI_INSTANCE));
|
if (NULL == PeiSpiInstance) {
|
return EFI_OUT_OF_RESOURCES;
|
}
|
|
SpiInstance = &(PeiSpiInstance->SpiInstance);
|
SpiProtocolConstructor (PCH_LEGACY_ID, SpiInstance);
|
|
PeiSpiInstance->PpiDescriptor.Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
PeiSpiInstance->PpiDescriptor.Guid = &gPchSpiPpiGuid;
|
PeiSpiInstance->PpiDescriptor.Ppi = &(SpiInstance->SpiProtocol);
|
|
|
|
///
|
/// Install the SPI PPI
|
///
|
Status = PeiServicesInstallPpi (&PeiSpiInstance->PpiDescriptor);
|
ASSERT_EFI_ERROR (Status);
|
|
DEBUG ((DEBUG_INFO, "SPI PPI Installed\n"));
|
|
DEBUG ((DEBUG_INFO, "InstallPchSpi() End\n"));
|
|
return Status;
|
}
|
|
/**
|
Board Install Dummy SPI Ppi entry point.
|
|
@param FileHandle Handle of the file being invoked.
|
Type EFI_PEI_FILE_HANDLE is defined in FfsFindNextFile().
|
@param PeiServices General purpose services available to every PEIM.
|
|
@retval EFI_SUCCESS
|
**/
|
EFI_STATUS
|
EFIAPI
|
DummySpiPpiEntryPoint (
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
)
|
{
|
|
InstallPchSpi ();
|
|
return EFI_SUCCESS;
|
|
}
|