[edk2-devel] [edk2-platforms][PATCH v4 40/41] SimicsIch10Pkg/BasePchSpiCommonLib: Identify flash regions by GUID
Nate DeSimone
nathaniel.l.desimone at intel.com
Thu Jul 29 00:47:50 UTC 2021
Reviewed-by: Nate DeSimone <nathaniel.l.desimone at intel.com>
> -----Original Message-----
> From: mikuback at linux.microsoft.com <mikuback at linux.microsoft.com>
> Sent: Friday, June 25, 2021 2:21 PM
> To: devel at edk2.groups.io
> Cc: Agyeman, Prince <prince.agyeman at intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone at intel.com>
> Subject: [edk2-platforms][PATCH v4 40/41]
> SimicsIch10Pkg/BasePchSpiCommonLib: Identify flash regions by GUID
>
> From: Michael Kubacki <michael.kubacki at 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.agyeman at intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone at intel.com>
> Signed-off-by: Michael Kubacki <michael.kubacki at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list