mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
Vlv2TbltDevicePkg/PlatformFlashAccessLib: Add instance for update.
Add PlatformFlashAccessLib for capsule update. Cc: David Wei <david.wei@intel.com> Cc: Feng Tian <feng.tian@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Chao Zhang <chao.b.zhang@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: David Wei <david.wei@intel.com>
This commit is contained in:
parent
ff4e4b26f5
commit
75ce133c3c
@ -0,0 +1,190 @@
|
||||
/** @file
|
||||
Platform Flash Access library.
|
||||
|
||||
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD 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 IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/PlatformFlashAccessLib.h>
|
||||
#include <Library/FlashDeviceLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
|
||||
#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[in] FirmwareType The type of firmware.
|
||||
@param[in] FlashAddress The address of flash device to be accessed.
|
||||
@param[in] FlashAddressType The type of flash device address.
|
||||
@param[in] Buffer The pointer to the data buffer.
|
||||
@param[in] 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((DEBUG_INFO, "PerformFlashWrite - 0x%x(%x) - 0x%x\n", (UINTN)FlashAddress, (UINTN)FlashAddressType, Length));
|
||||
if (FlashAddressType == FlashAddressTypeRelativeAddress) {
|
||||
FlashAddress = FlashAddress + mInternalFdAddress;
|
||||
}
|
||||
|
||||
DEBUG((DEBUG_INFO, " - 0x%x(%x) - 0x%x\n", (UINTN)FlashAddress, (UINTN)FlashAddressType, Length));
|
||||
LibFvbFlashDeviceBlockLock(FlashAddress, Length, FALSE);
|
||||
|
||||
//
|
||||
// Erase & Write
|
||||
//
|
||||
Status = LibFvbFlashDeviceBlockErase((UINTN)FlashAddress, Length);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
if (EFI_ERROR(Status)) {
|
||||
LibFvbFlashDeviceBlockLock(FlashAddress, Length, TRUE);
|
||||
DEBUG((DEBUG_ERROR, "Flash Erase error\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = LibFvbFlashDeviceWrite((UINTN)FlashAddress, &Length, Buffer);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
if (EFI_ERROR(Status)) {
|
||||
LibFvbFlashDeviceBlockLock(FlashAddress, Length, TRUE);
|
||||
DEBUG((DEBUG_ERROR, "Flash write error\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
LibFvbFlashDeviceBlockLock(FlashAddress, Length, TRUE);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Perform microcode write opreation.
|
||||
|
||||
@param[in] FlashAddress The address of flash device to be accessed.
|
||||
@param[in] Buffer The pointer to the data buffer.
|
||||
@param[in] 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((DEBUG_INFO, "MicrocodeFlashWrite - 0x%x - 0x%x\n", (UINTN)FlashAddress, Length));
|
||||
|
||||
//
|
||||
// Need make buffer 64K aligned to support ERASE
|
||||
//
|
||||
// [Aligned] FlashAddress [Aligned]
|
||||
// | | |
|
||||
// V V V
|
||||
// +--------------+========+------------+
|
||||
// | OffsetHeader | Length | OffsetTail |
|
||||
// +--------------+========+------------+
|
||||
// ^
|
||||
// |<-----------AlignedLength----------->
|
||||
// |
|
||||
// AlignedFlashAddress
|
||||
//
|
||||
OffsetHead = FlashAddress & (ALINGED_SIZE - 1);
|
||||
OffsetTail = (FlashAddress + Length) & (ALINGED_SIZE - 1);
|
||||
if (OffsetTail != 0) {
|
||||
OffsetTail = ALINGED_SIZE - OffsetTail;
|
||||
}
|
||||
|
||||
if ((OffsetHead != 0) || (OffsetTail != 0)) {
|
||||
AlignedFlashAddress = FlashAddress - OffsetHead;
|
||||
AlignedLength = Length + OffsetHead + OffsetTail;
|
||||
|
||||
AlignedBuffer = AllocatePool(AlignedLength);
|
||||
if (AlignedBuffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
//
|
||||
// Save original buffer
|
||||
//
|
||||
if (OffsetHead != 0) {
|
||||
CopyMem((UINT8 *)AlignedBuffer, (VOID *)AlignedFlashAddress, OffsetHead);
|
||||
}
|
||||
if (OffsetTail != 0) {
|
||||
CopyMem((UINT8 *)AlignedBuffer + OffsetHead + Length, (VOID *)(AlignedFlashAddress + OffsetHead + Length), OffsetTail);
|
||||
}
|
||||
//
|
||||
// Override new buffer
|
||||
//
|
||||
CopyMem((UINT8 *)AlignedBuffer + OffsetHead, Buffer, Length);
|
||||
} else {
|
||||
AlignedFlashAddress = FlashAddress;
|
||||
AlignedBuffer = Buffer;
|
||||
AlignedLength = Length;
|
||||
}
|
||||
|
||||
Status = PerformFlashWrite(
|
||||
PlatformFirmwareTypeSystemFirmware,
|
||||
AlignedFlashAddress,
|
||||
FlashAddressTypeAbsoluteAddress,
|
||||
AlignedBuffer,
|
||||
AlignedLength
|
||||
);
|
||||
if ((OffsetHead != 0) || (OffsetTail != 0)) {
|
||||
FreePool (AlignedBuffer);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Platform Flash Access Lib Constructor.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PerformFlashAccessLibConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
mInternalFdAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)PcdGet32(PcdFlashAreaBaseAddress);
|
||||
DEBUG((DEBUG_INFO, "PcdFlashAreaBaseAddress - 0x%x\n", mInternalFdAddress));
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
## @file
|
||||
# Platform Flash Access library.
|
||||
#
|
||||
# Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD 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 IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PlatformFlashAccessLib
|
||||
FILE_GUID = 31CF9CEC-DA4E-4505-AA20-33364A291A95
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = PlatformFlashAccessLib
|
||||
LIBRARY_CLASS = MicrocodeFlashAccessLib
|
||||
CONSTRUCTOR = PerformFlashAccessLibConstructor
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
PlatformFlashAccessLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
SignedCapsulePkg/SignedCapsulePkg.dec
|
||||
Vlv2TbltDevicePkg/PlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
PcdLib
|
||||
DebugLib
|
||||
FlashDeviceLib
|
||||
MemoryAllocationLib
|
||||
|
||||
[Pcd]
|
||||
gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress
|
Loading…
x
Reference in New Issue
Block a user