From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id EBA041A1E53 for ; Tue, 20 Sep 2016 23:51:19 -0700 (PDT) Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga102.jf.intel.com with ESMTP; 20 Sep 2016 23:51:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,372,1470726000"; d="scan'208";a="11689246" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga005.jf.intel.com with ESMTP; 20 Sep 2016 23:51:19 -0700 Received: from fmsmsx122.amr.corp.intel.com (10.18.125.37) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 20 Sep 2016 23:51:12 -0700 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by fmsmsx122.amr.corp.intel.com (10.18.125.37) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 20 Sep 2016 23:51:11 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.118]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.95]) with mapi id 14.03.0248.002; Wed, 21 Sep 2016 14:51:08 +0800 From: "Wei, David" To: "Yao, Jiewen" , "edk2-devel@lists.01.org" CC: "Tian, Feng" , "Zeng, Star" , "Kinney, Michael D" , "Gao, Liming" , "Zhang, Chao B" Thread-Topic: [PATCH 38/45] Vlv2TbltDevicePkg/PlatformFlashAccessLib: Add instance for capsule update. Thread-Index: AQHSE9QV1q/ZlgpSPkOGIVT2okEz3KCDgSUg Date: Wed, 21 Sep 2016 06:51:07 +0000 Message-ID: <89954A0B46707A448411A627AD4EEE34663798A6@SHSMSX101.ccr.corp.intel.com> References: <1474440326-9292-1-git-send-email-jiewen.yao@intel.com> <1474440326-9292-39-git-send-email-jiewen.yao@intel.com> In-Reply-To: <1474440326-9292-39-git-send-email-jiewen.yao@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNzAwMDQ4MWItNGRjYS00N2U0LWI4YjgtNTJlMmQwMWFlNjM4IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6InJaQmxJQkxSbGVrQTgwb2lVbFliRFVpTmc1MkJkcWZFcEg0bFljRWJuS1E9In0= x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH 38/45] Vlv2TbltDevicePkg/PlatformFlashAccessLib: Add instance for capsule update. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Sep 2016 06:51:20 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: David Wei =20 Thanks, David Wei =20 -----Original Message----- From: Yao, Jiewen=20 Sent: Wednesday, September 21, 2016 2:45 PM To: edk2-devel@lists.01.org Cc: Wei, David ; Tian, Feng ; Zen= g, Star ; Kinney, Michael D ; Gao, Liming ; Zhang, Chao B Subject: [PATCH 38/45] Vlv2TbltDevicePkg/PlatformFlashAccessLib: Add instan= ce for capsule update. Add PlatformFlashAccessLib for capsule update. Cc: David Wei Cc: Feng Tian Cc: Star Zeng Cc: Michael D Kinney Cc: Liming Gao Cc: Chao Zhang Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiewen Yao --- Vlv2TbltDevicePkg/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformF= lashAccessLib.c | 192 ++++++++++++++++++++ Vlv2TbltDevicePkg/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformF= lashAccessLib.inf | 47 +++++ 2 files changed, 239 insertions(+) diff --git a/Vlv2TbltDevicePkg/Feature/Capsule/Library/PlatformFlashAccessL= ib/PlatformFlashAccessLib.c b/Vlv2TbltDevicePkg/Feature/Capsule/Library/Pla= tformFlashAccessLib/PlatformFlashAccessLib.c new file mode 100644 index 0000000..ae8b171 --- /dev/null +++ b/Vlv2TbltDevicePkg/Feature/Capsule/Library/PlatformFlashAccessLib/Plat= formFlashAccessLib.c @@ -0,0 +1,192 @@ +/** @file + Platform Flash Access library. + + Copyright (c) 2016, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#define SECTOR_SIZE_64KB 0x10000 // Common 64kBytes sector size +#define ALINGED_SIZE SECTOR_SIZE_64KB + +STATIC EFI_PHYSICAL_ADDRESS mInternalFdAddress; + +/** + Perform flash write opreation. + + @param FirmwareType The type of firmware. + @param FlashAddress The address of flash device to be accessed. + @param FlashAddressType The type of flash device address. + @param Buffer The pointer to the data buffer. + @param Length The length of data buffer in bytes. + + @retval EFI_SUCCESS The operation returns successfully. + @retval EFI_WRITE_PROTECTED The flash device is read only. + @retval EFI_UNSUPPORTED The flash device access is unsupported. + @retval EFI_INVALID_PARAMETER The input parameter is not valid. +**/ +EFI_STATUS +EFIAPI +PerformFlashWrite( + IN PLATFORM_FIRMWARE_TYPE FirmwareType, + IN EFI_PHYSICAL_ADDRESS FlashAddress, + IN FLASH_ADDRESS_TYPE FlashAddressType, + IN VOID *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + + DEBUG((EFI_D_INFO, "PerformFlashWrite - 0x%x(%x) - 0x%x\n", (UINTN)Flash= Address, (UINTN)FlashAddressType, Length)); + if (FirmwareType >=3D PlatformFirmwareTypeMax) { + return EFI_UNSUPPORTED; + } + if (FlashAddressType =3D=3D FlashAddressTypeRelativeAddress) { + FlashAddress =3D FlashAddress + mInternalFdAddress; + } + + LibFvbFlashDeviceBlockLock(FlashAddress, Length, FALSE); + + // + // Erase & Write + // + Status =3D LibFvbFlashDeviceBlockErase((UINTN)FlashAddress, Length); + ASSERT_EFI_ERROR(Status); + if (EFI_ERROR(Status)) { + LibFvbFlashDeviceBlockLock(FlashAddress, Length, TRUE); + DEBUG((EFI_D_ERROR, "Flash Erase error\n")); + return Status; + } + + Status =3D LibFvbFlashDeviceWrite((UINTN)FlashAddress, &Length, Buffer); + ASSERT_EFI_ERROR(Status); + if (EFI_ERROR(Status)) { + LibFvbFlashDeviceBlockLock(FlashAddress, Length, TRUE); + DEBUG((EFI_D_ERROR, "Flash write error\n")); + return Status; + } + + LibFvbFlashDeviceBlockLock(FlashAddress, Length, TRUE); + + return EFI_SUCCESS; +} + +/** + Perform microcode write opreation. + + @param FlashAddress The address of flash device to be accessed. + @param Buffer The pointer to the data buffer. + @param Length The length of data buffer in bytes. + + @retval EFI_SUCCESS The operation returns successfully. + @retval EFI_WRITE_PROTECTED The flash device is read only. + @retval EFI_UNSUPPORTED The flash device access is unsupported. + @retval EFI_INVALID_PARAMETER The input parameter is not valid. +**/ +EFI_STATUS +EFIAPI +MicrocodeFlashWrite( + IN EFI_PHYSICAL_ADDRESS FlashAddress, + IN VOID *Buffer, + IN UINTN Length + ) +{ + EFI_PHYSICAL_ADDRESS AlignedFlashAddress; + VOID *AlignedBuffer; + UINTN AlignedLength; + UINTN OffsetHead; + UINTN OffsetTail; + EFI_STATUS Status; + + DEBUG((EFI_D_INFO, "MicrocodeFlashWrite - 0x%x - 0x%x\n", (UINTN)FlashAd= dress, Length)); + + // + // Need make buffer 64K aligned to support ERASE + // + // [Aligned] FlashAddress [Aligned] + // | | | + // V V V + // +--------------+=3D=3D=3D=3D=3D=3D=3D=3D+------------+ + // | OffsetHeader | Length | OffsetTail | + // +--------------+=3D=3D=3D=3D=3D=3D=3D=3D+------------+ + // ^ + // |<-----------AlignedLength-----------> + // | + // AlignedFlashAddress + // + OffsetHead =3D FlashAddress & (ALINGED_SIZE - 1); + OffsetTail =3D (FlashAddress + Length) & (ALINGED_SIZE - 1); + if (OffsetTail !=3D 0) { + OffsetTail =3D ALINGED_SIZE - OffsetTail; + } + + if ((OffsetHead !=3D 0) || (OffsetTail !=3D 0)) { + AlignedFlashAddress =3D FlashAddress - OffsetHead; + AlignedLength =3D Length + OffsetHead + OffsetTail; + + AlignedBuffer =3D AllocatePool(AlignedLength); + if (AlignedBuffer =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + // + // Save original buffer + // + if (OffsetHead !=3D 0) { + CopyMem((UINT8 *)AlignedBuffer, (VOID *)AlignedFlashAddress, OffsetH= ead); + } + if (OffsetTail !=3D 0) { + CopyMem((UINT8 *)AlignedBuffer + OffsetHead + Length, (VOID *)(Align= edFlashAddress + OffsetHead + Length), OffsetTail); + } + // + // Override new buffer + // + CopyMem((UINT8 *)AlignedBuffer + OffsetHead, Buffer, Length); + } else { + AlignedFlashAddress =3D FlashAddress; + AlignedBuffer =3D Buffer; + AlignedLength =3D Length; + } + + Status =3D PerformFlashWrite( + PlatformFirmwareTypeBios, + AlignedFlashAddress, + FlashAddressTypeAbsoluteAddress, + AlignedBuffer, + AlignedLength + ); + if ((OffsetHead !=3D 0) || (OffsetTail !=3D 0)) { + FreePool (AlignedBuffer); + } + return Status; +} + +/** + Platform Flash Access Lib Constructor. +**/ +EFI_STATUS +EFIAPI +PerformFlashAccessLibConstructor ( + VOID + ) +{ + mInternalFdAddress =3D FixedPcdGet64(PcdFlashAreaBaseAddress); + DEBUG((EFI_D_INFO, "PcdFlashAreaBaseAddress - 0x%x\n", mInternalFdAddres= s)); + + return EFI_SUCCESS; +} diff --git a/Vlv2TbltDevicePkg/Feature/Capsule/Library/PlatformFlashAccessL= ib/PlatformFlashAccessLib.inf b/Vlv2TbltDevicePkg/Feature/Capsule/Library/P= latformFlashAccessLib/PlatformFlashAccessLib.inf new file mode 100644 index 0000000..18c2809 --- /dev/null +++ b/Vlv2TbltDevicePkg/Feature/Capsule/Library/PlatformFlashAccessLib/Plat= formFlashAccessLib.inf @@ -0,0 +1,47 @@ +## @file +# Platform Flash Access library. +# +# Copyright (c) 2016, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D PlatformFlashAccessLib + FILE_GUID =3D 31CF9CEC-DA4E-4505-AA20-33364A291A95 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D PlatformFlashAccessLib + LIBRARY_CLASS =3D MicrocodeFlashAccessLib + CONSTRUCTOR =3D PerformFlashAccessLibConstructor + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 IPF EBC +# + +[Sources] + PlatformFlashAccessLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Vlv2TbltDevicePkg/PlatformPkg.dec + +[LibraryClasses] + BaseMemoryLib + PcdLib + DebugLib + FlashDeviceLib + MemoryAllocationLib + +[FixedPcd] + gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress --=20 2.7.4.windows.1