mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
UefiPayloadPkg: Add FlashDeviceLib
This library provides FlashDeviceLib APIs based on SpiFlashLib and consumed by FVB driver. Signed-off-by: Guo Dong <guo.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Maurice Ma <maurice.ma@intel.com> Cc: Benjamin You <benjamin.you@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Benjamin You <benjamin.you@intel.com>
This commit is contained in:
parent
1d66480aa4
commit
04714cef46
108
UefiPayloadPkg/Include/Library/FlashDeviceLib.h
Normal file
108
UefiPayloadPkg/Include/Library/FlashDeviceLib.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/** @file
|
||||||
|
Flash device library class header file.
|
||||||
|
|
||||||
|
Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FLASHDEVICE_LIB_H_
|
||||||
|
#define FLASHDEVICE_LIB_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read NumBytes bytes of data from the address specified by
|
||||||
|
PAddress into Buffer.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of the read.
|
||||||
|
@param[in,out] NumBytes On input, the number of bytes to read. On output, the number
|
||||||
|
of bytes actually read.
|
||||||
|
@param[out] Buffer The destination data buffer for the read.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceRead (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN OUT UINTN *NumBytes,
|
||||||
|
OUT UINT8 *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Write NumBytes bytes of data from Buffer to the address specified by
|
||||||
|
PAddresss.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of the write.
|
||||||
|
@param[in,out] NumBytes On input, the number of bytes to write. On output,
|
||||||
|
the actual number of bytes written.
|
||||||
|
@param[in] Buffer The source data buffer for the write.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceWrite (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN OUT UINTN *NumBytes,
|
||||||
|
IN UINT8 *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Erase the block starting at PAddress.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of the region to be erased.
|
||||||
|
@param[in] LbaLength The length of the region to be erased. This parameter is necessary
|
||||||
|
as the physical block size on a flash device could be different than
|
||||||
|
the logical block size of Firmware Volume Block protocol. Erase on
|
||||||
|
flash chip is always performed block by block. Therefore, the ERASE
|
||||||
|
operation to a logical block is converted a number of ERASE operation
|
||||||
|
(or a partial erase) on the hardware.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceBlockErase (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN UINTN LbaLength
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Lock or unlock the block starting at PAddress.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of region to be (un)locked.
|
||||||
|
@param[in] LbaLength The length of the region to be (un)locked. This parameter is necessary
|
||||||
|
as the physical block size on a flash device could be different than
|
||||||
|
the logical block size of Firmware Volume Block protocol. (Un)Lock on
|
||||||
|
flash chip is always performed block by block. Therefore, the (Un)Lock
|
||||||
|
operation to a logical block is converted a number of (Un)Lock operation
|
||||||
|
(or a partial erase) on the hardware.
|
||||||
|
@param[in] Lock TRUE to lock. FALSE to unlock.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceBlockLock (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN UINTN LbaLength,
|
||||||
|
IN BOOLEAN Lock
|
||||||
|
);
|
||||||
|
|
||||||
|
PHYSICAL_ADDRESS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceMemoryMap (
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
165
UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c
Normal file
165
UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
/** @file
|
||||||
|
Flash Device Library based on SPI Flash library.
|
||||||
|
|
||||||
|
Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved. <BR>
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include <PiDxe.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/SpiFlashLib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initialize spi flash device.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The tested spi flash device is supported.
|
||||||
|
@retval EFI_UNSUPPORTED The tested spi flash device is not supported.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceInit (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return SpiConstructor ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read NumBytes bytes of data from the address specified by
|
||||||
|
PAddress into Buffer.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of the read.
|
||||||
|
@param[in,out] NumBytes On input, the number of bytes to read. On output, the number
|
||||||
|
of bytes actually read.
|
||||||
|
@param[out] Buffer The destination data buffer for the read.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceRead (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN OUT UINTN *NumBytes,
|
||||||
|
OUT UINT8 *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT32 ByteCount;
|
||||||
|
UINT32 RgnSize;
|
||||||
|
UINT32 AddrOffset;
|
||||||
|
|
||||||
|
Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
|
||||||
|
// which equal (PAddress + RgnSize) here.
|
||||||
|
AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
|
||||||
|
ByteCount = (UINT32)*NumBytes;
|
||||||
|
return SpiFlashRead (FlashRegionBios, AddrOffset, ByteCount, Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Write NumBytes bytes of data from Buffer to the address specified by
|
||||||
|
PAddresss.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of the write.
|
||||||
|
@param[in,out] NumBytes On input, the number of bytes to write. On output,
|
||||||
|
the actual number of bytes written.
|
||||||
|
@param[in] Buffer The source data buffer for the write.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceWrite (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN OUT UINTN *NumBytes,
|
||||||
|
IN UINT8 *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT32 ByteCount;
|
||||||
|
UINT32 RgnSize;
|
||||||
|
UINT32 AddrOffset;
|
||||||
|
|
||||||
|
Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
|
||||||
|
// which equal (PAddress + RgnSize) here.
|
||||||
|
AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
|
||||||
|
ByteCount = (UINT32)*NumBytes;
|
||||||
|
return SpiFlashWrite (FlashRegionBios, AddrOffset, ByteCount, Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Erase the block starting at PAddress.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of the block to be erased.
|
||||||
|
This library assume that caller garantee that the PAddress
|
||||||
|
is at the starting address of this block.
|
||||||
|
@param[in] LbaLength The length of the logical block to be erased.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceBlockErase (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN UINTN LbaLength
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT32 RgnSize;
|
||||||
|
UINT32 AddrOffset;
|
||||||
|
|
||||||
|
Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
|
||||||
|
// which equal (PAddress + RgnSize) here.
|
||||||
|
AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
|
||||||
|
return SpiFlashErase (FlashRegionBios, AddrOffset, (UINT32)LbaLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Lock or unlock the block starting at PAddress.
|
||||||
|
|
||||||
|
@param[in] PAddress The starting physical address of region to be (un)locked.
|
||||||
|
@param[in] LbaLength The length of the logical block to be erased.
|
||||||
|
@param[in] Lock TRUE to lock. FALSE to unlock.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS. Opertion is successful.
|
||||||
|
@retval EFI_DEVICE_ERROR If there is any device errors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
LibFvbFlashDeviceBlockLock (
|
||||||
|
IN UINTN PAddress,
|
||||||
|
IN UINTN LbaLength,
|
||||||
|
IN BOOLEAN Lock
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
38
UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf
Normal file
38
UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
## @file
|
||||||
|
# Library instace of Flash Device Library Class
|
||||||
|
#
|
||||||
|
# This library implement the flash device library class for the lakeport platform.
|
||||||
|
#@copyright
|
||||||
|
# Copyright (c) 2014 - 2021 Intel Corporation. All rights reserved
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = FlashDeviceLib
|
||||||
|
FILE_GUID = BA7CA537-1C65-4a90-9379-622A24A08141
|
||||||
|
MODULE_TYPE = DXE_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = FlashDeviceLib | DXE_SMM_DRIVER DXE_RUNTIME_DRIVER
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following information is for reference only and not required by the build tools.
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
FlashDeviceLib.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
UefiPayloadPkg/UefiPayloadPkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
DebugLib
|
||||||
|
BaseMemoryLib
|
||||||
|
SpiFlashLib
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user