From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mx.groups.io with SMTP id smtpd.web11.166.1627960714941156505 for ; Mon, 02 Aug 2021 20:18:35 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@linux.microsoft.com header.s=default header.b=k3bveCZ5; spf=pass (domain: linux.microsoft.com, ip: 13.77.154.182, mailfrom: mikuback@linux.microsoft.com) Received: from localhost.localdomain (unknown [167.220.2.74]) by linux.microsoft.com (Postfix) with ESMTPSA id 2D12820BE66A; Mon, 2 Aug 2021 19:41:36 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 2D12820BE66A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1627958496; bh=/KY9i4C4OwqrAAA6Vtv+/hn2+F2tECjsBzBrj+OK4CU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k3bveCZ5qaMARBPUZiL+GPozPGzvVX0nySW8pXOqjUqFgd0MYbVl43hh3PQF0BfP+ 89OvomVh2MlrYOGB1alCaYSx6Jrk+JmKL1sTBZuKxVPCA8J1LMub9hrn1p6/vF/vBJ 7tkSjm+j7bPK0He3NRWbf/hi9D0FvGy0AzONVu4w= From: "Michael Kubacki" To: devel@edk2.groups.io Cc: Chasel Chiu , Rangasai V Chaganty , Nate DeSimone Subject: [edk2-platforms][PATCH v5 41/46] CoffeelakeSiliconPkg/BasePchSpiCommonLib: Identify flash regions by GUID Date: Mon, 2 Aug 2021 22:39:09 -0400 Message-Id: <20210803023914.1569-42-mikuback@linux.microsoft.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210803023914.1569-1-mikuback@linux.microsoft.com> References: <20210803023914.1569-1-mikuback@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Kubacki REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3307 Updates the library to identify flash regions by GUID and internally map the GUID entries to values specific to CoffeelakeSiliconPkg. Cc: Chasel Chiu Cc: Rangasai V Chaganty Cc: Nate DeSimone Signed-off-by: Michael Kubacki Reviewed-by: Chasel Chiu --- Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BasePchSpiCommonL= ib/SpiCommon.c | 144 ++++++++++++++++---- Silicon/Intel/CoffeelakeSiliconPkg/Pch/Include/Private/Library/PchSpiCom= monLib.h | 16 +-- Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BasePchSpiCommonL= ib/BasePchSpiCommonLib.inf | 12 ++ 3 files changed, 141 insertions(+), 31 deletions(-) diff --git a/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BaseP= chSpiCommonLib/SpiCommon.c b/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Libra= ry/Private/BasePchSpiCommonLib/SpiCommon.c index bc84a4f27f1a..26a3d0e7db31 100644 --- a/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BasePchSpiCo= mmonLib/SpiCommon.c +++ b/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BasePchSpiCo= mmonLib/SpiCommon.c @@ -2,11 +2,13 @@ PCH SPI Common Driver implements the SPI Host Controller Compatibility= Interface. =20 Copyright (c) 2019 Intel Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #include +#include #include #include #include @@ -20,6 +22,95 @@ #include #include =20 +typedef enum { + FlashRegionDescriptor, + FlashRegionBios, + FlashRegionMe, + FlashRegionGbe, + FlashRegionPlatformData, + FlashRegionDer, + FlashRegionEc =3D 8, + FlashRegionAll, + FlashRegionMax +} FLASH_REGION_TYPE; + +typedef struct { + EFI_GUID *Guid; + FLASH_REGION_TYPE Type; +} FLASH_REGION_MAPPING; + +FLASH_REGION_MAPPING mFlashRegionTypes[] =3D { + { + &gFlashRegionDescriptorGuid, + FlashRegionDescriptor + }, + { + &gFlashRegionBiosGuid, + FlashRegionBios + }, + { + &gFlashRegionMeGuid, + FlashRegionMe + }, + { + &gFlashRegionGbeGuid, + FlashRegionGbe + }, + { + &gFlashRegionPlatformDataGuid, + FlashRegionPlatformData + }, + { + &gFlashRegionDerGuid, + FlashRegionDer + }, + { + &gFlashRegionEcGuid, + FlashRegionEc + }, + { + &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 t= o 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 fo= und for the given flash region GUID. + +**/ +EFI_STATUS +GetFlashRegionType ( + IN EFI_GUID *FlashRegionGuid, + OUT FLASH_REGION_TYPE *FlashRegionType + ) +{ + UINTN Index; + + if (FlashRegionGuid =3D=3D NULL || FlashRegionType =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + for (Index =3D 0; Index < ARRAY_SIZE (mFlashRegionTypes); Index++) { + if (CompareGuid (mFlashRegionTypes[Index].Guid, FlashRegionGuid)) { + *FlashRegionType =3D mFlashRegionTypes[Index].Type; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + /** Initialize an SPI protocol instance. =20 @@ -303,7 +394,7 @@ WaitForSpiCycleComplete ( This function sends the programmed SPI command to the slave device. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @param[in] SpiRegionType The SPI Region type for flash cycle wh= ich 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 wit= hin a region for which BIOS has access permissions. @param[in] ByteCount Number of bytes in the data portion of= the SPI cycle. @@ -318,7 +409,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, @@ -404,7 +495,7 @@ SendSpiCmd ( } } =20 - Status =3D SpiProtocolGetRegionAddress (This, FlashRegionType, &Hardwa= reSpiAddr, &FlashRegionSize); + Status =3D SpiProtocolGetRegionAddress (This, FlashRegionGuid, &Hardwa= reSpiAddr, &FlashRegionSize); if (EFI_ERROR (Status)) { goto SendSpiCmdEnd; } @@ -616,7 +707,7 @@ SendSpiCmd ( Read data from the flash part. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 wit= hin 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. @@ -630,7 +721,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 @@ -643,7 +734,7 @@ SpiProtocolFlashRead ( // Status =3D SendSpiCmd ( This, - FlashRegionType, + FlashRegionGuid, FlashCycleRead, Address, ByteCount, @@ -656,7 +747,7 @@ SpiProtocolFlashRead ( Write data to the flash part. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 wit= hin 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 con= taining the data sent during the SPI cycle. @@ -669,7 +760,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 @@ -682,7 +773,7 @@ SpiProtocolFlashWrite ( // Status =3D SendSpiCmd ( This, - FlashRegionType, + FlashRegionGuid, FlashCycleWrite, Address, ByteCount, @@ -695,7 +786,7 @@ SpiProtocolFlashWrite ( Erase some area on the flash part. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 wit= hin a region for which BIOS has access permissions. @param[in] ByteCount Number of bytes in the data portion of= the SPI cycle. =20 @@ -707,7 +798,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 ) @@ -719,7 +810,7 @@ SpiProtocolFlashErase ( // Status =3D SendSpiCmd ( This, - FlashRegionType, + FlashRegionGuid, FlashCycleErase, Address, ByteCount, @@ -774,7 +865,7 @@ SpiProtocolFlashReadSfdp ( // Status =3D SendSpiCmd ( This, - FlashRegionAll, + &gFlashRegionAllGuid, FlashCycleReadSfdp, FlashAddress, ByteCount, @@ -827,7 +918,7 @@ SpiProtocolFlashReadJedecId ( // Status =3D SendSpiCmd ( This, - FlashRegionAll, + &gFlashRegionAllGuid, FlashCycleReadJedecId, Address, ByteCount, @@ -862,7 +953,7 @@ SpiProtocolFlashWriteStatus ( // Status =3D SendSpiCmd ( This, - FlashRegionAll, + &gFlashRegionAllGuid, FlashCycleWriteStatus, 0, ByteCount, @@ -897,7 +988,7 @@ SpiProtocolFlashReadStatus ( // Status =3D SendSpiCmd ( This, - FlashRegionAll, + &gFlashRegionAllGuid, FlashCycleReadStatus, 0, ByteCount, @@ -910,7 +1001,7 @@ SpiProtocolFlashReadStatus ( Get the SPI region base and size, based on the enum type =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 add= ress which corresponds to the type in the descriptor. @param[out] BaseAddress The Flash Linear Address for the Regio= n 'n' Base @param[out] RegionSize The size for the Region 'n' =20 @@ -922,17 +1013,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; =20 SpiInstance =3D SPI_INSTANCE_FROM_SPIPROTOCOL (This); =20 + Status =3D GetFlashRegionType (FlashRegionGuid, &FlashRegionType); + if (EFI_ERROR (Status)) { + return EFI_INVALID_PARAMETER; + } + if (FlashRegionType >=3D FlashRegionMax) { return EFI_INVALID_PARAMETER; } @@ -1013,7 +1111,7 @@ SpiProtocolReadPchSoftStrap ( // Status =3D SendSpiCmd ( This, - FlashRegionDescriptor, + &gFlashRegionDescriptorGuid, FlashCycleRead, StrapFlashAddr, ByteCount, @@ -1071,7 +1169,7 @@ SpiProtocolReadCpuSoftStrap ( // Status =3D SendSpiCmd ( This, - FlashRegionDescriptor, + &gFlashRegionDescriptorGuid, FlashCycleRead, StrapFlashAddr, ByteCount, diff --git a/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Include/Private/Libra= ry/PchSpiCommonLib.h b/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Include/Pri= vate/Library/PchSpiCommonLib.h index 0a973a77a381..e69e2f1e456c 100644 --- a/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Include/Private/Library/PchS= piCommonLib.h +++ b/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Include/Private/Library/PchS= piCommonLib.h @@ -148,7 +148,7 @@ IsSpiFlashWriteGranted ( Read data from the flash part. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 wit= hin 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. @@ -162,7 +162,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 +172,7 @@ SpiProtocolFlashRead ( Write data to the flash part. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 wit= hin 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 con= taining the data sent during the SPI cycle. @@ -185,7 +185,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 @@ -195,7 +195,7 @@ SpiProtocolFlashWrite ( Erase some area on the flash part. =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 wit= hin a region for which BIOS has access permissions. @param[in] ByteCount Number of bytes in the data portion of= the SPI cycle. =20 @@ -207,7 +207,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 ); @@ -300,7 +300,7 @@ SpiProtocolFlashReadStatus ( Get the SPI region base and size, based on the enum type =20 @param[in] This Pointer to the PCH_SPI_PROTOCOL instan= ce. - @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 add= ress which corresponds to the type in the descriptor. @param[out] BaseAddress The Flash Linear Address for the Regio= n 'n' Base @param[out] RegionSize The size for the Region 'n' =20 @@ -312,7 +312,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/CoffeelakeSiliconPkg/Pch/Library/Private/BaseP= chSpiCommonLib/BasePchSpiCommonLib.inf b/Silicon/Intel/CoffeelakeSiliconP= kg/Pch/Library/Private/BasePchSpiCommonLib/BasePchSpiCommonLib.inf index f5dc4ee0bfef..b152d2278839 100644 --- a/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BasePchSpiCo= mmonLib/BasePchSpiCommonLib.inf +++ b/Silicon/Intel/CoffeelakeSiliconPkg/Pch/Library/Private/BasePchSpiCo= mmonLib/BasePchSpiCommonLib.inf @@ -2,6 +2,7 @@ # Component description file for the PchSpiCommonLib # # Copyright (c) 2019 Intel Corporation. All rights reserved.
+# Copyright (c) Microsoft Corporation.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -27,3 +28,14 @@ [LibraryClasses] IoLib DebugLib PmcLib + +[Guids] + gFlashRegionDescriptorGuid + gFlashRegionBiosGuid + gFlashRegionMeGuid + gFlashRegionGbeGuid + gFlashRegionPlatformDataGuid + gFlashRegionDerGuid + gFlashRegionEcGuid + gFlashRegionAllGuid + gFlashRegionMaxGuid --=20 2.28.0.windows.1