mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-30 12:43:41 +01:00
7c0aa811ec
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
239 lines
8.6 KiB
C
239 lines
8.6 KiB
C
/** @file
|
|
Firmware Volume Block protocol functions.
|
|
Consumes FV hobs and creates appropriate block protocols.
|
|
|
|
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef _FWVOL_BLOCK_H_
|
|
#define _FWVOL_BLOCK_H_
|
|
|
|
|
|
#define FVB_DEVICE_SIGNATURE SIGNATURE_32('_','F','V','B')
|
|
|
|
|
|
typedef struct {
|
|
UINTN Base;
|
|
UINTN Length;
|
|
} LBA_CACHE;
|
|
|
|
typedef struct {
|
|
MEMMAP_DEVICE_PATH MemMapDevPath;
|
|
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
|
} FV_MEMMAP_DEVICE_PATH;
|
|
|
|
//
|
|
// UEFI Specification define FV device path format if FV provide name guid in extension header
|
|
//
|
|
typedef struct {
|
|
MEDIA_FW_VOL_DEVICE_PATH FvDevPath;
|
|
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
|
} FV_PIWG_DEVICE_PATH;
|
|
|
|
typedef struct {
|
|
UINTN Signature;
|
|
EFI_HANDLE Handle;
|
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
|
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
|
|
UINTN NumBlocks;
|
|
LBA_CACHE *LbaCache;
|
|
UINT32 FvbAttributes;
|
|
EFI_PHYSICAL_ADDRESS BaseAddress;
|
|
UINT32 AuthenticationStatus;
|
|
} EFI_FW_VOL_BLOCK_DEVICE;
|
|
|
|
|
|
#define FVB_DEVICE_FROM_THIS(a) \
|
|
CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
|
|
|
|
|
|
/**
|
|
Retrieves Volume attributes. No polarity translations are done.
|
|
|
|
@param This Calling context
|
|
@param Attributes output buffer which contains attributes
|
|
|
|
@retval EFI_SUCCESS The firmware volume attributes were returned.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockGetAttributes (
|
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
Modifies the current settings of the firmware volume according to the input parameter.
|
|
|
|
@param This Calling context
|
|
@param Attributes input buffer which contains attributes
|
|
|
|
@retval EFI_SUCCESS The firmware volume attributes were returned.
|
|
@retval EFI_INVALID_PARAMETER The attributes requested are in conflict with
|
|
the capabilities as declared in the firmware
|
|
volume header.
|
|
@retval EFI_UNSUPPORTED Not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockSetAttributes (
|
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
IN CONST EFI_FVB_ATTRIBUTES_2 *Attributes
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
The EraseBlock() function erases one or more blocks as denoted by the
|
|
variable argument list. The entire parameter list of blocks must be verified
|
|
prior to erasing any blocks. If a block is requested that does not exist
|
|
within the associated firmware volume (it has a larger index than the last
|
|
block of the firmware volume), the EraseBlock() function must return
|
|
EFI_INVALID_PARAMETER without modifying the contents of the firmware volume.
|
|
|
|
@param This Calling context
|
|
@param ... Starting LBA followed by Number of Lba to erase.
|
|
a -1 to terminate the list.
|
|
|
|
@retval EFI_SUCCESS The erase request was successfully completed.
|
|
@retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled
|
|
state.
|
|
@retval EFI_DEVICE_ERROR The block device is not functioning correctly
|
|
and could not be written. The firmware device
|
|
may have been partially erased.
|
|
@retval EFI_INVALID_PARAMETER One or more of the LBAs listed in the variable
|
|
argument list do
|
|
@retval EFI_UNSUPPORTED Not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockEraseBlock (
|
|
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
...
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
Read the specified number of bytes from the block to the input buffer.
|
|
|
|
@param This Indicates the calling context.
|
|
@param Lba The starting logical block index to read.
|
|
@param Offset Offset into the block at which to begin reading.
|
|
@param NumBytes Pointer to a UINT32. At entry, *NumBytes
|
|
contains the total size of the buffer. At exit,
|
|
*NumBytes contains the total number of bytes
|
|
actually read.
|
|
@param Buffer Pinter to a caller-allocated buffer that
|
|
contains the destine for the read.
|
|
|
|
@retval EFI_SUCCESS The firmware volume was read successfully.
|
|
@retval EFI_BAD_BUFFER_SIZE The read was attempted across an LBA boundary.
|
|
@retval EFI_ACCESS_DENIED Access denied.
|
|
@retval EFI_DEVICE_ERROR The block device is malfunctioning and could not
|
|
be read.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockReadBlock (
|
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
IN CONST EFI_LBA Lba,
|
|
IN CONST UINTN Offset,
|
|
IN OUT UINTN *NumBytes,
|
|
IN OUT UINT8 *Buffer
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
Writes the specified number of bytes from the input buffer to the block.
|
|
|
|
@param This Indicates the calling context.
|
|
@param Lba The starting logical block index to write to.
|
|
@param Offset Offset into the block at which to begin writing.
|
|
@param NumBytes Pointer to a UINT32. At entry, *NumBytes
|
|
contains the total size of the buffer. At exit,
|
|
*NumBytes contains the total number of bytes
|
|
actually written.
|
|
@param Buffer Pinter to a caller-allocated buffer that
|
|
contains the source for the write.
|
|
|
|
@retval EFI_SUCCESS The firmware volume was written successfully.
|
|
@retval EFI_BAD_BUFFER_SIZE The write was attempted across an LBA boundary.
|
|
On output, NumBytes contains the total number of
|
|
bytes actually written.
|
|
@retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled
|
|
state.
|
|
@retval EFI_DEVICE_ERROR The block device is malfunctioning and could not
|
|
be written.
|
|
@retval EFI_UNSUPPORTED Not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockWriteBlock (
|
|
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
IN EFI_LBA Lba,
|
|
IN UINTN Offset,
|
|
IN OUT UINTN *NumBytes,
|
|
IN UINT8 *Buffer
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
Get Fvb's base address.
|
|
|
|
@param This Indicates the calling context.
|
|
@param Address Fvb device base address.
|
|
|
|
@retval EFI_SUCCESS Successfully got Fvb's base address.
|
|
@retval EFI_UNSUPPORTED Not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockGetPhysicalAddress (
|
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
OUT EFI_PHYSICAL_ADDRESS *Address
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
Retrieves the size in bytes of a specific block within a firmware volume.
|
|
|
|
@param This Indicates the calling context.
|
|
@param Lba Indicates the block for which to return the
|
|
size.
|
|
@param BlockSize Pointer to a caller-allocated UINTN in which the
|
|
size of the block is returned.
|
|
@param NumberOfBlocks Pointer to a caller-allocated UINTN in which the
|
|
number of consecutive blocks starting with Lba
|
|
is returned. All blocks in this range have a
|
|
size of BlockSize.
|
|
|
|
@retval EFI_SUCCESS The firmware volume base address is returned.
|
|
@retval EFI_INVALID_PARAMETER The requested LBA is out of range.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FwVolBlockGetBlockSize (
|
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
|
IN CONST EFI_LBA Lba,
|
|
IN OUT UINTN *BlockSize,
|
|
IN OUT UINTN *NumberOfBlocks
|
|
);
|
|
|
|
|
|
#endif
|