Reviewed-by: Nate DeSimone <nathaniel.l.desim...@intel.com> > -----Original Message----- > From: mikub...@linux.microsoft.com <mikub...@linux.microsoft.com> > Sent: Friday, June 25, 2021 2:21 PM > To: devel@edk2.groups.io > Cc: Agyeman, Prince <prince.agye...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com> > Subject: [edk2-platforms][PATCH v4 40/41] > SimicsIch10Pkg/BasePchSpiCommonLib: Identify flash regions by GUID > > From: Michael Kubacki <michael.kuba...@microsoft.com> > > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3307 > > Updates the library to identify flash regions by GUID and internally map the > GUID entries to values specific to SimicsIch10Pkg. > > Cc: Agyeman Prince <prince.agye...@intel.com> > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Signed-off-by: Michael Kubacki <michael.kuba...@microsoft.com> > --- > > Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/SpiCom > mon.c | 139 ++++++++++++++++---- > Silicon/Intel/SimicsIch10Pkg/IncludePrivate/Library/PchSpiCommonLib.h > | 20 +-- > > Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/BasePch > SpiCommonLib.inf | 11 ++ > 3 files changed, 137 insertions(+), 33 deletions(-) > > diff --git > a/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/SpiCo > mmon.c > b/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/SpiCo > mmon.c > index fc2a8be76b6a..04dbd921c091 100644 > --- > a/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/SpiCo > mmon.c > +++ b/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/Sp > +++ iCommon.c > @@ -2,11 +2,13 @@ > 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> > @@ -16,6 +18,90 @@ > #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. > > @@ -145,7 +231,7 @@ 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] 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. > @@ -159,7 +245,7 @@ EFI_STATUS > EFIAPI > SpiProtocolFlashRead ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + 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, > @@ -185,7 +271,7 @@ 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] 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. > @@ -198,7 +284,7 @@ EFI_STATUS > EFIAPI > SpiProtocolFlashWrite ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + 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, > @@ -224,7 +310,7 @@ 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] 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. > > @@ -236,7 +322,7 @@ EFI_STATUS > EFIAPI > SpiProtocolFlashErase ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + IN EFI_GUID *FlashRegionGuid, > IN UINT32 Address, > IN UINT32 ByteCount > ) > @@ -248,7 +334,7 @@ SpiProtocolFlashErase ( > // > Status = SendSpiCmd ( > This, > - FlashRegionType, > + FlashRegionGuid, > FlashCycleErase, > Address, > ByteCount, > @@ -303,7 +389,7 @@ SpiProtocolFlashReadSfdp ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleReadSfdp, > FlashAddress, > ByteCount, > @@ -356,7 +442,7 @@ SpiProtocolFlashReadJedecId ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleReadJedecId, > Address, > ByteCount, > @@ -391,7 +477,7 @@ SpiProtocolFlashWriteStatus ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleWriteStatus, > 0, > ByteCount, > @@ -426,7 +512,7 @@ SpiProtocolFlashReadStatus ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleReadStatus, > 0, > ByteCount, > @@ -439,7 +525,7 @@ 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] 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' > > @@ -451,17 +537,24 @@ EFI_STATUS > EFIAPI > SpiProtocolGetRegionAddress ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + 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; > } > @@ -542,7 +635,7 @@ SpiProtocolReadPchSoftStrap ( > // > Status = SendSpiCmd ( > This, > - FlashRegionDescriptor, > + &gFlashRegionDescriptorGuid, > FlashCycleRead, > StrapFlashAddr, > ByteCount, > @@ -600,7 +693,7 @@ SpiProtocolReadCpuSoftStrap ( > // > Status = SendSpiCmd ( > This, > - FlashRegionDescriptor, > + &gFlashRegionDescriptorGuid, > FlashCycleRead, > StrapFlashAddr, > ByteCount, > @@ -613,7 +706,7 @@ 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] 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. > @@ -627,7 +720,7 @@ SpiProtocolReadCpuSoftStrap ( EFI_STATUS > SendSpiCmd ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + 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; > } > diff --git > a/Silicon/Intel/SimicsIch10Pkg/IncludePrivate/Library/PchSpiCommonLib.h > b/Silicon/Intel/SimicsIch10Pkg/IncludePrivate/Library/PchSpiCommonLib.h > index 2c8162ac8170..603e141e2058 100644 > --- > a/Silicon/Intel/SimicsIch10Pkg/IncludePrivate/Library/PchSpiCommonLib.h > +++ b/Silicon/Intel/SimicsIch10Pkg/IncludePrivate/Library/PchSpiCommonLi > +++ b.h > @@ -135,7 +135,7 @@ ReleaseSpiBar0 ( > 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] 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. > @@ -149,7 +149,7 @@ EFI_STATUS > EFIAPI > SpiProtocolFlashRead ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + IN EFI_GUID *FlashRegionGuid, > IN UINT32 Address, > IN UINT32 ByteCount, > OUT UINT8 *Buffer > @@ -159,7 +159,7 @@ 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] 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. > @@ -172,7 +172,7 @@ EFI_STATUS > EFIAPI > SpiProtocolFlashWrite ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + IN EFI_GUID *FlashRegionGuid, > IN UINT32 Address, > IN UINT32 ByteCount, > IN UINT8 *Buffer > @@ -182,7 +182,7 @@ 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] 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. > > @@ -194,7 +194,7 @@ EFI_STATUS > EFIAPI > SpiProtocolFlashErase ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + IN EFI_GUID *FlashRegionGuid, > IN UINT32 Address, > IN UINT32 ByteCount > ); > @@ -287,7 +287,7 @@ 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] 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' > > @@ -299,7 +299,7 @@ EFI_STATUS > EFIAPI > SpiProtocolGetRegionAddress ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + IN EFI_GUID *FlashRegionGuid, > OUT UINT32 *BaseAddress, > OUT UINT32 *RegionSize > ); > @@ -354,7 +354,7 @@ 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] 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. > @@ -368,7 +368,7 @@ SpiProtocolReadCpuSoftStrap ( EFI_STATUS > SendSpiCmd ( > IN PCH_SPI_PROTOCOL *This, > - IN FLASH_REGION_TYPE FlashRegionType, > + IN EFI_GUID *FlashRegionGuid, > IN FLASH_CYCLE_TYPE FlashCycleType, > IN UINT32 Address, > IN UINT32 ByteCount, > diff --git > a/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/BasePc > hSpiCommonLib.inf > b/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/BasePc > hSpiCommonLib.inf > index b5aa13c1c56d..3a64005b5690 100644 > --- > a/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/BasePc > hSpiCommonLib.inf > +++ b/Silicon/Intel/SimicsIch10Pkg/LibraryPrivate/BasePchSpiCommonLib/Ba > +++ sePchSpiCommonLib.inf > @@ -2,6 +2,7 @@ > # Component description file for the PchSpiCommonLib # # Copyright (c) > 2019 Intel Corporation. All rights reserved. <BR> > +# Copyright (c) Microsoft Corporation.<BR> > # > # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -30,3 +31,13 @@ > [LibraryClasses] [Pcd] > gIntelSiliconPkgTokenSpaceGuid.PcdBiosAreaBaseAddress ## CONSUMES > gIntelSiliconPkgTokenSpaceGuid.PcdBiosSize ## CONSUMES > + > +[Guids] > + gFlashRegionDescriptorGuid > + gFlashRegionBiosGuid > + gFlashRegionMeGuid > + gFlashRegionGbeGuid > + gFlashRegionPlatformDataGuid > + gFlashRegionDerGuid > + gFlashRegionAllGuid > + gFlashRegionMaxGuid > -- > 2.28.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#78322): https://edk2.groups.io/g/devel/message/78322 Mute This Topic: https://groups.io/mt/84519320/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-