|
@@ -2,10 +2,13 @@
|
|
|
PCH SPI Common Driver implements the SPI Host Controller Compatibility Interface.
|
|
|
|
|
|
Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
|
|
|
+Copyright (c) Microsoft Corporation.<BR>
|
|
|
+
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
|
|
**/
|
|
|
#include <Uefi/UefiBaseType.h>
|
|
|
+#include <Guid/FlashRegion.h>
|
|
|
#include <Library/IoLib.h>
|
|
|
#include <Library/DebugLib.h>
|
|
|
#include <Library/BaseMemoryLib.h>
|
|
@@ -13,9 +16,93 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
#include <PchAccess.h>
|
|
|
#include <Library/PchCycleDecodingLib.h>
|
|
|
#include <Library/MmPciLib.h>
|
|
|
-#include <Protocol/Spi.h>
|
|
|
+#include <Protocol/Spi2.h>
|
|
|
#include <Library/PchSpiCommonLib.h>
|
|
|
|
|
|
+typedef enum {
|
|
|
+ FlashRegionDescriptor,
|
|
|
+ FlashRegionBios,
|
|
|
+ FlashRegionMe,
|
|
|
+ FlashRegionGbe,
|
|
|
+ FlashRegionPlatformData,
|
|
|
+ FlashRegionDer,
|
|
|
+ FlashRegionAll,
|
|
|
+ FlashRegionMax
|
|
|
+} FLASH_REGION_TYPE;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ EFI_GUID *Guid;
|
|
|
+ FLASH_REGION_TYPE Type;
|
|
|
+} FLASH_REGION_MAPPING;
|
|
|
+
|
|
|
+FLASH_REGION_MAPPING mFlashRegionTypes[] = {
|
|
|
+ {
|
|
|
+ &gFlashRegionDescriptorGuid,
|
|
|
+ FlashRegionDescriptor
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionBiosGuid,
|
|
|
+ FlashRegionBios
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionMeGuid,
|
|
|
+ FlashRegionMe
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionGbeGuid,
|
|
|
+ FlashRegionGbe
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionPlatformDataGuid,
|
|
|
+ FlashRegionPlatformData
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionDerGuid,
|
|
|
+ FlashRegionDer
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
+ FlashRegionAll
|
|
|
+ },
|
|
|
+ {
|
|
|
+ &gFlashRegionMaxGuid,
|
|
|
+ FlashRegionMax
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ Returns the type of a flash region given its GUID.
|
|
|
+
|
|
|
+ @param[in] FlashRegionGuid Pointer to the flash region GUID.
|
|
|
+ @param[out] FlashRegionType Pointer to a buffer that will be set to the flash region type value.
|
|
|
+
|
|
|
+ @retval EFI_SUCCESS The flash region type was found for the given flash region GUID.
|
|
|
+ @retval EFI_INVALID_PARAMETER A pointer argument passed to the function is NULL.
|
|
|
+ @retval EFI_NOT_FOUND The flash region type was not found for the given flash region GUID.
|
|
|
+
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+GetFlashRegionType (
|
|
|
+ IN EFI_GUID *FlashRegionGuid,
|
|
|
+ OUT FLASH_REGION_TYPE *FlashRegionType
|
|
|
+ )
|
|
|
+{
|
|
|
+ UINTN Index;
|
|
|
+
|
|
|
+ if (FlashRegionGuid == NULL || FlashRegionType == NULL) {
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Index = 0; Index < ARRAY_SIZE (mFlashRegionTypes); Index++) {
|
|
|
+ if (CompareGuid (mFlashRegionTypes[Index].Guid, FlashRegionGuid)) {
|
|
|
+ *FlashRegionType = mFlashRegionTypes[Index].Type;
|
|
|
+ return EFI_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return EFI_NOT_FOUND;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
Initialize an SPI protocol instance.
|
|
|
|
|
@@ -248,8 +335,8 @@ PchPmTimerStallRuntimeSafe (
|
|
|
/**
|
|
|
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] This Pointer to the PCH_SPI2_PROTOCOL instance.
|
|
|
+ @param[in] FlashRegionGuid The Flash Region GUID for flash cycle which corresponds to the type 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.
|
|
@@ -262,8 +349,8 @@ PchPmTimerStallRuntimeSafe (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashRead (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
- IN FLASH_REGION_TYPE FlashRegionType,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
+ IN EFI_GUID *FlashRegionGuid,
|
|
|
IN UINT32 Address,
|
|
|
IN UINT32 ByteCount,
|
|
|
OUT UINT8 *Buffer
|
|
@@ -276,7 +363,7 @@ SpiProtocolFlashRead (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionType,
|
|
|
+ FlashRegionGuid,
|
|
|
FlashCycleRead,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -288,8 +375,8 @@ SpiProtocolFlashRead (
|
|
|
/**
|
|
|
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] This Pointer to the PCH_SPI2_PROTOCOL instance.
|
|
|
+ @param[in] FlashRegionGuid The Flash Region GUID for flash cycle which corresponds to the type 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.
|
|
@@ -301,8 +388,8 @@ SpiProtocolFlashRead (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashWrite (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
- IN FLASH_REGION_TYPE FlashRegionType,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
+ IN EFI_GUID *FlashRegionGuid,
|
|
|
IN UINT32 Address,
|
|
|
IN UINT32 ByteCount,
|
|
|
IN UINT8 *Buffer
|
|
@@ -315,7 +402,7 @@ SpiProtocolFlashWrite (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionType,
|
|
|
+ FlashRegionGuid,
|
|
|
FlashCycleWrite,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -327,8 +414,8 @@ SpiProtocolFlashWrite (
|
|
|
/**
|
|
|
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] This Pointer to the PCH_SPI2_PROTOCOL instance.
|
|
|
+ @param[in] FlashRegionGuid The Flash Region GUID for flash cycle which corresponds to the type 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.
|
|
|
|
|
@@ -339,8 +426,8 @@ SpiProtocolFlashWrite (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashErase (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
- IN FLASH_REGION_TYPE FlashRegionType,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
+ IN EFI_GUID *FlashRegionGuid,
|
|
|
IN UINT32 Address,
|
|
|
IN UINT32 ByteCount
|
|
|
)
|
|
@@ -352,7 +439,7 @@ SpiProtocolFlashErase (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionType,
|
|
|
+ FlashRegionGuid,
|
|
|
FlashCycleErase,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -364,7 +451,7 @@ SpiProtocolFlashErase (
|
|
|
/**
|
|
|
Read SFDP data from the flash part.
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_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
|
|
@@ -378,7 +465,7 @@ SpiProtocolFlashErase (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashReadSfdp (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT8 ComponentNumber,
|
|
|
IN UINT32 Address,
|
|
|
IN UINT32 ByteCount,
|
|
@@ -407,7 +494,7 @@ SpiProtocolFlashReadSfdp (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleReadSfdp,
|
|
|
FlashAddress,
|
|
|
ByteCount,
|
|
@@ -419,7 +506,7 @@ SpiProtocolFlashReadSfdp (
|
|
|
/**
|
|
|
Read Jedec Id from the flash part.
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_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
|
|
@@ -432,7 +519,7 @@ SpiProtocolFlashReadSfdp (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashReadJedecId (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT8 ComponentNumber,
|
|
|
IN UINT32 ByteCount,
|
|
|
OUT UINT8 *JedecId
|
|
@@ -460,7 +547,7 @@ SpiProtocolFlashReadJedecId (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleReadJedecId,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -472,7 +559,7 @@ SpiProtocolFlashReadJedecId (
|
|
|
/**
|
|
|
Write the status register in the flash part.
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_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
|
|
|
|
|
@@ -483,7 +570,7 @@ SpiProtocolFlashReadJedecId (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashWriteStatus (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT32 ByteCount,
|
|
|
IN UINT8 *StatusValue
|
|
|
)
|
|
@@ -495,7 +582,7 @@ SpiProtocolFlashWriteStatus (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleWriteStatus,
|
|
|
0,
|
|
|
ByteCount,
|
|
@@ -507,7 +594,7 @@ SpiProtocolFlashWriteStatus (
|
|
|
/**
|
|
|
Read status register in the flash part.
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_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.
|
|
|
|
|
@@ -518,7 +605,7 @@ SpiProtocolFlashWriteStatus (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashReadStatus (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT32 ByteCount,
|
|
|
OUT UINT8 *StatusValue
|
|
|
)
|
|
@@ -530,7 +617,7 @@ SpiProtocolFlashReadStatus (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleReadStatus,
|
|
|
0,
|
|
|
ByteCount,
|
|
@@ -542,8 +629,8 @@ SpiProtocolFlashReadStatus (
|
|
|
/**
|
|
|
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[in] This Pointer to the PCH_SPI2_PROTOCOL instance.
|
|
|
+ @param[in] FlashRegionGuid The Flash Region GUID for the base address which corresponds to the type in the descriptor.
|
|
|
@param[out] BaseAddress The Flash Linear Address for the Region 'n' Base
|
|
|
@param[out] RegionSize The size for the Region 'n'
|
|
|
|
|
@@ -554,18 +641,25 @@ SpiProtocolFlashReadStatus (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolGetRegionAddress (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
- IN FLASH_REGION_TYPE FlashRegionType,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
+ IN EFI_GUID *FlashRegionGuid,
|
|
|
OUT UINT32 *BaseAddress,
|
|
|
OUT UINT32 *RegionSize
|
|
|
)
|
|
|
{
|
|
|
- SPI_INSTANCE *SpiInstance;
|
|
|
- UINTN PchSpiBar0;
|
|
|
- UINT32 ReadValue;
|
|
|
+ EFI_STATUS Status;
|
|
|
+ FLASH_REGION_TYPE FlashRegionType;
|
|
|
+ SPI_INSTANCE *SpiInstance;
|
|
|
+ UINTN PchSpiBar0;
|
|
|
+ UINT32 ReadValue;
|
|
|
|
|
|
SpiInstance = SPI_INSTANCE_FROM_SPIPROTOCOL (This);
|
|
|
|
|
|
+ Status = GetFlashRegionType (FlashRegionGuid, &FlashRegionType);
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ return EFI_INVALID_PARAMETER;
|
|
|
+ }
|
|
|
+
|
|
|
if (FlashRegionType >= FlashRegionMax) {
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
}
|
|
@@ -600,7 +694,7 @@ SpiProtocolGetRegionAddress (
|
|
|
/**
|
|
|
Read PCH Soft Strap Values
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_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.
|
|
@@ -614,7 +708,7 @@ SpiProtocolGetRegionAddress (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolReadPchSoftStrap (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT32 SoftStrapAddr,
|
|
|
IN UINT32 ByteCount,
|
|
|
OUT VOID *SoftStrapValue
|
|
@@ -646,7 +740,7 @@ SpiProtocolReadPchSoftStrap (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionDescriptor,
|
|
|
+ &gFlashRegionDescriptorGuid,
|
|
|
FlashCycleRead,
|
|
|
StrapFlashAddr,
|
|
|
ByteCount,
|
|
@@ -658,7 +752,7 @@ SpiProtocolReadPchSoftStrap (
|
|
|
/**
|
|
|
Read CPU Soft Strap Values
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_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.
|
|
@@ -672,7 +766,7 @@ SpiProtocolReadPchSoftStrap (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolReadCpuSoftStrap (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT32 SoftStrapAddr,
|
|
|
IN UINT32 ByteCount,
|
|
|
OUT VOID *SoftStrapValue
|
|
@@ -704,7 +798,7 @@ SpiProtocolReadCpuSoftStrap (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionDescriptor,
|
|
|
+ &gFlashRegionDescriptorGuid,
|
|
|
FlashCycleRead,
|
|
|
StrapFlashAddr,
|
|
|
ByteCount,
|
|
@@ -716,8 +810,8 @@ SpiProtocolReadCpuSoftStrap (
|
|
|
/**
|
|
|
This function sends the programmed SPI command to the slave device.
|
|
|
|
|
|
- @param[in] This Pointer to the PCH_SPI_PROTOCOL instance.
|
|
|
- @param[in] SpiRegionType The SPI Region type for flash cycle which is listed in the Descriptor
|
|
|
+ @param[in] This Pointer to the PCH_SPI2_PROTOCOL instance.
|
|
|
+ @param[in] FlashRegionGuid The Flash Region GUID for flash cycle which corresponds to the type in the descriptor.
|
|
|
@param[in] FlashCycleType The Flash SPI cycle type list in HSFC (Hardware Sequencing Flash Control Register) register
|
|
|
@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.
|
|
@@ -730,8 +824,8 @@ SpiProtocolReadCpuSoftStrap (
|
|
|
**/
|
|
|
EFI_STATUS
|
|
|
SendSpiCmd (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
- IN FLASH_REGION_TYPE FlashRegionType,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
+ IN EFI_GUID *FlashRegionGuid,
|
|
|
IN FLASH_CYCLE_TYPE FlashCycleType,
|
|
|
IN UINT32 Address,
|
|
|
IN UINT32 ByteCount,
|
|
@@ -795,7 +889,7 @@ SendSpiCmd (
|
|
|
goto SendSpiCmdEnd;
|
|
|
}
|
|
|
|
|
|
- Status = SpiProtocolGetRegionAddress (This, FlashRegionType, &HardwareSpiAddr, &FlashRegionSize);
|
|
|
+ Status = SpiProtocolGetRegionAddress (This, FlashRegionGuid, &HardwareSpiAddr, &FlashRegionSize);
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
goto SendSpiCmdEnd;
|
|
|
}
|
|
@@ -1016,7 +1110,7 @@ SendSpiCmdEnd:
|
|
|
**/
|
|
|
BOOLEAN
|
|
|
WaitForSpiCycleComplete (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINTN PchSpiBar0,
|
|
|
IN BOOLEAN ErrorCheck
|
|
|
)
|