|
@@ -2,20 +2,106 @@
|
|
|
PCH SPI Common Driver implements the SPI Host Controller Compatibility Interface.
|
|
|
|
|
|
Copyright (c) 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>
|
|
|
#include <IndustryStandard/Pci30.h>
|
|
|
#include <PchAccess.h>
|
|
|
-#include <Protocol/Spi.h>
|
|
|
+#include <Protocol/Spi2.h>
|
|
|
#include <IncludePrivate/Library/PchSpiCommonLib.h>
|
|
|
#include <Register/X58Ich10.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.
|
|
|
|
|
@@ -144,8 +230,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.
|
|
@@ -158,8 +244,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
|
|
@@ -172,7 +258,7 @@ SpiProtocolFlashRead (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionType,
|
|
|
+ FlashRegionGuid,
|
|
|
FlashCycleRead,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -184,8 +270,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.
|
|
@@ -197,8 +283,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
|
|
@@ -211,7 +297,7 @@ SpiProtocolFlashWrite (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionType,
|
|
|
+ FlashRegionGuid,
|
|
|
FlashCycleWrite,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -223,8 +309,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.
|
|
|
|
|
@@ -235,8 +321,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
|
|
|
)
|
|
@@ -248,7 +334,7 @@ SpiProtocolFlashErase (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionType,
|
|
|
+ FlashRegionGuid,
|
|
|
FlashCycleErase,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -260,7 +346,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
|
|
@@ -274,7 +360,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,
|
|
@@ -303,7 +389,7 @@ SpiProtocolFlashReadSfdp (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleReadSfdp,
|
|
|
FlashAddress,
|
|
|
ByteCount,
|
|
@@ -315,7 +401,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
|
|
@@ -328,7 +414,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
|
|
@@ -356,7 +442,7 @@ SpiProtocolFlashReadJedecId (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleReadJedecId,
|
|
|
Address,
|
|
|
ByteCount,
|
|
@@ -368,7 +454,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
|
|
|
|
|
@@ -379,7 +465,7 @@ SpiProtocolFlashReadJedecId (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashWriteStatus (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT32 ByteCount,
|
|
|
IN UINT8 *StatusValue
|
|
|
)
|
|
@@ -391,7 +477,7 @@ SpiProtocolFlashWriteStatus (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleWriteStatus,
|
|
|
0,
|
|
|
ByteCount,
|
|
@@ -403,7 +489,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.
|
|
|
|
|
@@ -414,7 +500,7 @@ SpiProtocolFlashWriteStatus (
|
|
|
EFI_STATUS
|
|
|
EFIAPI
|
|
|
SpiProtocolFlashReadStatus (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINT32 ByteCount,
|
|
|
OUT UINT8 *StatusValue
|
|
|
)
|
|
@@ -426,7 +512,7 @@ SpiProtocolFlashReadStatus (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionAll,
|
|
|
+ &gFlashRegionAllGuid,
|
|
|
FlashCycleReadStatus,
|
|
|
0,
|
|
|
ByteCount,
|
|
@@ -438,8 +524,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'
|
|
|
|
|
@@ -450,18 +536,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;
|
|
|
}
|
|
@@ -496,7 +589,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.
|
|
@@ -510,7 +603,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
|
|
@@ -542,7 +635,7 @@ SpiProtocolReadPchSoftStrap (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionDescriptor,
|
|
|
+ &gFlashRegionDescriptorGuid,
|
|
|
FlashCycleRead,
|
|
|
StrapFlashAddr,
|
|
|
ByteCount,
|
|
@@ -554,7 +647,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.
|
|
@@ -568,7 +661,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
|
|
@@ -600,7 +693,7 @@ SpiProtocolReadCpuSoftStrap (
|
|
|
//
|
|
|
Status = SendSpiCmd (
|
|
|
This,
|
|
|
- FlashRegionDescriptor,
|
|
|
+ &gFlashRegionDescriptorGuid,
|
|
|
FlashCycleRead,
|
|
|
StrapFlashAddr,
|
|
|
ByteCount,
|
|
@@ -612,8 +705,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.
|
|
@@ -626,8 +719,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,
|
|
@@ -682,7 +775,7 @@ SendSpiCmd (
|
|
|
goto SendSpiCmdEnd;
|
|
|
}
|
|
|
|
|
|
- Status = SpiProtocolGetRegionAddress (This, FlashRegionType, &HardwareSpiAddr, &FlashRegionSize);
|
|
|
+ Status = SpiProtocolGetRegionAddress (This, FlashRegionGuid, &HardwareSpiAddr, &FlashRegionSize);
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
goto SendSpiCmdEnd;
|
|
|
}
|
|
@@ -897,7 +990,7 @@ SendSpiCmdEnd:
|
|
|
**/
|
|
|
BOOLEAN
|
|
|
WaitForSpiCycleComplete (
|
|
|
- IN PCH_SPI_PROTOCOL *This,
|
|
|
+ IN PCH_SPI2_PROTOCOL *This,
|
|
|
IN UINTN PchSpiBar0,
|
|
|
IN BOOLEAN ErrorCheck
|
|
|
)
|