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: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>; Desimone, > Nathaniel L <nathaniel.l.desim...@intel.com>; Luo, Heng > <heng....@intel.com> > Subject: [edk2-platforms][PATCH v4 41/41] > TigerlakeSiliconPkg/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 TigerlakeSiliconPkg. > > Cc: Rangasai V Chaganty <rangasai.v.chaga...@intel.com> > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Cc: Heng Luo <heng....@intel.com> > Signed-off-by: Michael Kubacki <michael.kuba...@microsoft.com> > --- > > Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiCommon > Lib/SpiCommon.c | 176 +++++++++++++++++--- > > Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/IncludePrivate/Library/SpiCom > monLib.h | 16 +- > > Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiCommon > Lib/BaseSpiCommonLib.inf | 18 +- > 3 files changed, 177 insertions(+), 33 deletions(-) > > diff --git > a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiComm > onLib/SpiCommon.c > b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiComm > onLib/SpiCommon.c > index 954b349e7c8a..5f372a5b58cb 100644 > --- > a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiComm > onLib/SpiCommon.c > +++ b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseS > +++ piCommonLib/SpiCommon.c > @@ -2,9 +2,12 @@ > PCH SPI Common Driver implements the SPI Host Controller Compatibility > Interface. > > Copyright (c) 2021, 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/BaseLib.h> > #include <Library/IoLib.h> > #include <Library/DebugLib.h> > @@ -21,6 +24,125 @@ > #include <Library/PchPciBdfLib.h> > #include <Library/SpiAccessLib.h> > > +typedef enum { > + FlashRegionDescriptor, > + FlashRegionBios, > + FlashRegionMe, > + FlashRegionGbe, > + FlashRegionPlatformData, > + FlashRegionDer, > + FlashRegionSecondaryBios, > + FlashRegionMicrocodePatch, > + FlashRegionEc, > + FlashRegionDeviceExpansion, > + FlashRegionIe, > + FlashRegion10GbeA, > + FlashRegion10GbeB, > + FlashRegionAll = 16, > + 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 > + }, > + { > + &gFlashRegionSecondaryBiosGuid, > + FlashRegionSecondaryBios > + }, > + { > + &gFlashRegionMicrocodePatchGuid, > + FlashRegionMicrocodePatch > + }, > + { > + &gFlashRegionEcGuid, > + FlashRegionEc > + }, > + { > + &gFlashRegionDeviceExpansionGuid, > + FlashRegionDeviceExpansion > + }, > + { > + &gFlashRegionIeGuid, > + FlashRegionIe > + }, > + { > + &gFlashRegion10GbeAGuid, > + FlashRegion10GbeA > + }, > + { > + &gFlashRegion10GbeBGuid, > + FlashRegion10GbeB > + }, > + { > + &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. > > @@ -179,7 +301,7 @@ SpiProtocolConstructor ( > ASSERT (SpiInstance->CpuStrapBaseAddr != 0); > > if (SpiInstance->CpuStrapBaseAddr != 0x300) { > - Status = SpiProtocolFlashRead (&(SpiInstance->SpiProtocol), > FlashRegionAll, R_FLASH_UMAP1, sizeof (Data32), (UINT8 *) (&Data32)); > + Status = SpiProtocolFlashRead (&(SpiInstance->SpiProtocol), > + &gFlashRegionAllGuid, R_FLASH_UMAP1, sizeof (Data32), (UINT8 *) > + (&Data32)); > ASSERT_EFI_ERROR (Status); > Mdtba = (UINT16)(((Data32 & B_FLASH_UMAP1_MDTBA) >> > N_FLASH_UMAP1_MDTBA) << N_FLASH_UMAP1_MDTBA_REPR); > DEBUG ((DEBUG_INFO, "Mdtba : %0x\n", Mdtba)); @@ -312,7 +434,7 @@ > WaitForSpiCycleComplete ( > 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. > @@ -327,7 +449,7 @@ STATIC > 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, > @@ -413,7 +535,7 @@ SendSpiCmd ( > } > } > > - Status = SpiProtocolGetRegionAddress (This, FlashRegionType, > &HardwareSpiAddr, &FlashRegionSize); > + Status = SpiProtocolGetRegionAddress (This, FlashRegionGuid, > + &HardwareSpiAddr, &FlashRegionSize); > if (EFI_ERROR (Status)) { > goto SendSpiCmdEnd; > } > @@ -626,7 +748,7 @@ SendSpiCmd ( > 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. > @@ -640,7 +762,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 > @@ -653,7 +775,7 @@ SpiProtocolFlashRead ( > // > Status = SendSpiCmd ( > This, > - FlashRegionType, > + FlashRegionGuid, > FlashCycleRead, > Address, > ByteCount, > @@ -666,7 +788,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. > @@ -679,7 +801,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 > @@ -692,7 +814,7 @@ SpiProtocolFlashWrite ( > // > Status = SendSpiCmd ( > This, > - FlashRegionType, > + FlashRegionGuid, > FlashCycleWrite, > Address, > ByteCount, > @@ -705,7 +827,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. > > @@ -717,7 +839,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 > ) > @@ -729,7 +851,7 @@ SpiProtocolFlashErase ( > // > Status = SendSpiCmd ( > This, > - FlashRegionType, > + FlashRegionGuid, > FlashCycleErase, > Address, > ByteCount, > @@ -790,7 +912,7 @@ SpiProtocolFlashReadSfdp ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleReadSfdp, > FlashAddress, > ByteCount, > @@ -849,7 +971,7 @@ SpiProtocolFlashReadJedecId ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleReadJedecId, > Address, > ByteCount, > @@ -890,7 +1012,7 @@ SpiProtocolFlashWriteStatus ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleWriteStatus, > 0, > ByteCount, > @@ -931,7 +1053,7 @@ SpiProtocolFlashReadStatus ( > // > Status = SendSpiCmd ( > This, > - FlashRegionAll, > + &gFlashRegionAllGuid, > FlashCycleReadStatus, > 0, > ByteCount, > @@ -944,7 +1066,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' > > @@ -956,17 +1078,23 @@ 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; > } > @@ -1047,7 +1175,7 @@ SpiProtocolReadPchSoftStrap ( > // > Status = SendSpiCmd ( > This, > - FlashRegionDescriptor, > + &gFlashRegionDescriptorGuid, > FlashCycleRead, > StrapFlashAddr, > ByteCount, > @@ -1105,7 +1233,7 @@ SpiProtocolReadCpuSoftStrap ( > // > Status = SendSpiCmd ( > This, > - FlashRegionDescriptor, > + &gFlashRegionDescriptorGuid, > FlashCycleRead, > StrapFlashAddr, > ByteCount, > diff --git > a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/IncludePrivate/Library/SpiCo > mmonLib.h > b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/IncludePrivate/Library/SpiCo > mmonLib.h > index 3290f7712280..3038ae749ef2 100644 > --- > a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/IncludePrivate/Library/SpiCo > mmonLib.h > +++ b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/IncludePrivate/Libra > +++ ry/SpiCommonLib.h > @@ -146,7 +146,7 @@ IsSpiFlashWriteGranted ( > 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. > @@ -160,7 +160,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 > @@ -170,7 +170,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. > @@ -183,7 +183,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 > @@ -193,7 +193,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. > > @@ -205,7 +205,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 > ); > @@ -298,7 +298,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' > > @@ -310,7 +310,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 > ); > diff --git > a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiComm > onLib/BaseSpiCommonLib.inf > b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiComm > onLib/BaseSpiCommonLib.inf > index 2686dff41e25..4981276e13e8 100644 > --- > a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseSpiComm > onLib/BaseSpiCommonLib.inf > +++ b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/Spi/LibraryPrivate/BaseS > +++ piCommonLib/BaseSpiCommonLib.inf > @@ -2,6 +2,7 @@ > # Component description file for the PchSpiCommonLib # # Copyright (c) > 2021, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) Microsoft Corporation.<BR> > # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -29,4 +30,19 @@ > [LibraryClasses] > PchPciBdfLib > SpiAccessLib > > -[Pcd] > +[Guids] > + gFlashRegionDescriptorGuid > + gFlashRegionBiosGuid > + gFlashRegionMeGuid > + gFlashRegionGbeGuid > + gFlashRegionPlatformDataGuid > + gFlashRegionDerGuid > + gFlashRegionSecondaryBiosGuid > + gFlashRegionMicrocodePatchGuid > + gFlashRegionEcGuid > + gFlashRegionDeviceExpansionGuid > + gFlashRegionIeGuid > + gFlashRegion10GbeAGuid > + gFlashRegion10GbeBGuid > + gFlashRegionAllGuid > + gFlashRegionMaxGuid > -- > 2.28.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#78323): https://edk2.groups.io/g/devel/message/78323 Mute This Topic: https://groups.io/mt/84519330/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-