/** @file This driver provides Firmware block services interface in SMM mode ;****************************************************************************** ;* Copyright (c) 2012 - 2020, Insyde Software Corp. All Rights Reserved. ;* ;* You may not reproduce, distribute, publish, display, perform, modify, adapt, ;* transmit, broadcast, present, recite, release, license or otherwise exploit ;* any part of this publication in any form, by any means, without the prior ;* written permission of Insyde Software Corporation. ;* ;****************************************************************************** */ #ifndef _FWBLOCK_SERVICES_SMM_H_ #define _FWBLOCK_SERVICES_SMM_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct { UINT32 Signature; FLASH_DEVICE *FlashDevice; EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL SmmFwbService; UINT8 FlashMode; } SMM_FW_BLOCK_SERVICE_INSTANCE; #define SMM_FW_BLOCK_SERVICE_SIGNATURE SIGNATURE_32 ('s', 'm', 'f', 'b') #define INSTANCE_FROM_EFI_SMM_FW_BLOCK_SERVICE_THIS(a) CR (a, SMM_FW_BLOCK_SERVICE_INSTANCE, SmmFwbService, SMM_FW_BLOCK_SERVICE_SIGNATURE) #define BLOCK_SIZE 0x1000 // // This structure is used for SMM Firmware Block Service. the collected statistics data is saved in SMRAM. It can be got from // SMI handler. The communication buffer should be: // EFI_SMM_COMMUNICATE_HEADER + SMM_FWB_COMMUNICATE_HEADER + payload. // typedef struct { UINTN Function; EFI_STATUS ReturnStatus; UINT8 Data[1]; } SMM_FWB_COMMUNICATE_HEADER; // // Return EFI_UNSUPPORTED directly. // #define SMM_FWB_FUNCTION_DETECT_DEVICE 1 // // The payload for this function is SMM_FWB_COMMUNICATE_ACCESS_FVB. // #define SMM_FWB_FUNCTION_READ 2 // // The payload for this function is SMM_FWB_COMMUNICATE_ACCESS_FVB. // #define SMM_FWB_FUNCTION_WRITE 3 // // The payload for this function is SMM_FWB_COMMUNICATE_ACCESS_FVB. // #define SMM_FWB_FUNCTION_ERASE_BLOCKS 4 // // Return EFI_UNSUPPORTED directly. // #define SMM_FWB_FUNCTION_GET_FLASH_TABLE 5 // // Return EFI_UNSUPPORTED directly. // #define SMM_FWB_FUNCTION_GET_SPI_FLASH_NUMBER 6 // // Return EFI_UNSUPPORTED directly. // #define SMM_FWB_FUNCTION_ONVERT_SPI_ADDRESS 7 typedef struct { UINTN Address; UINTN NumBytes; } SMM_FWB_COMMUNICATE_ACCESS_FVB; /// /// Size of SMM communicate header, without including the payload. /// #define SMM_COMMUNICATE_HEADER_SIZE (OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)) /// /// Size of SMM FWB header, without including the payload. /// #define SMM_FWB_COMMUNICATE_HEADER_SIZE (OFFSET_OF (SMM_FWB_COMMUNICATE_HEADER, Data)) /// /// Size of SMM_FWB_COMMUNICATE_ACCESS_FVB, including header size. /// #define SMM_FWB_COMMUNICATE_ACCESS_FVB_SIZE (SMM_COMMUNICATE_HEADER_SIZE + SMM_FWB_COMMUNICATE_HEADER_SIZE + sizeof (SMM_FWB_COMMUNICATE_ACCESS_FVB)) /** Detect target flash device and copy whole flash device to output buffer. @param[in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param[out] SystemTable Buffer to saved target flash device information @retval EFI_SUCCESS The flash device is recognized successfully. @retval EFI_NOT_FOUND Cannot find supported flash device. @retval EFI_INVALID_PARAMETER Invalid function parameter. **/ EFI_STATUS EFIAPI FlashFdDetectDevice ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, OUT UINT8 *Buffer ); /** Detect target flash device and copy whole flash device to output buffer for ECP driver. @param[in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param[out] SystemTable Buffer to saved target flash device information @retval EFI_SUCCESS The flash device is recognized successfully. @retval EFI_NOT_FOUND Cannot find supported flash device. @retval EFI_INVALID_PARAMETER Invalid function parameter. **/ EFI_STATUS EFIAPI EcpFlashFdDetectDevice ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, OUT UINT8 *Buffer ); /** Reads data beginning at Lba:Offset from FV and places the data in Buffer. The read terminates either when *NumBytes of data have been read, or when a block boundary is reached. *NumBytes is updated to reflect the actual number of bytes read. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in] WriteAddress Start LBA address which want to read. @param [in] Offset Offset in the block at which to begin read @param [in, out] NumBytes IN: The requested read size. OUT: The data size by bytes has been read @param [out] Buffer Data buffer in which to place data read. @retval EFI_SUCCESS Read data successful. @retval EFI_INVALID_PARAMETER Input function parameters are invalid. @retval EFI_UNSUPPORTED The flash device is not supported @retval EFI_DEVICE_ERROR Read data failed caused by device error. **/ EFI_STATUS EFIAPI FlashFdRead ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN WriteAddress, IN UINTN Offset, IN OUT UINTN *NumBytes, OUT UINT8 *Buffer ); /** Writes data beginning at Lba:Offset from FV. The write terminates either when *NumBytes of data have been written, or when a block boundary is reached. *NumBytes is updated to reflect the actual number of bytes written. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in] Offset Start address to be written. @param [in, out] NumBytes IN: The requested write size. OUT: The data size by bytes has been written. @param [out] Buffer Data buffer want to write. @retval EFI_SUCCESS Write data successful. @retval EFI_INVALID_PARAMETER Input function parameters are invalid. @retval EFI_UNSUPPORTED The flash device is not supported @retval EFI_DEVICE_ERROR Write data failed caused by device error. **/ EFI_STATUS EFIAPI FlashFdWrite ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN WriteAddress, IN OUT UINTN *NumBytes, IN UINT8 *Buffer ); /** 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 [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in] LbaWriteAddress Start address to be erased. @param [in, out] NumBytes IN: The requested erase size. OUT: The data size by bytes has been erased. @retval EFI_SUCCESS Erase data successful. @retval EFI_INVALID_PARAMETER Input function parameters are invalid. @retval EFI_UNSUPPORTED The flash device is not supported @retval EFI_DEVICE_ERROR Erase data failed caused by device error. **/ EFI_STATUS EFIAPI FlashFdEraseBlocks ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN WriteAddress, IN UINTN *NumBytes ); /** The GetFlashTable() function get flash region table from platform. if the descriptor is valid, the FlashTable will be filled. if the descriptor is invalid,the FlashTable will be filled RegionTypeEos(0xff) directly. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in, out] FlashTable IN: Input buffer which want to save flash table. OUT: Buffer to save flash table. @retval EFI_SUCCESS Get flash table successful. @retval EFI_UNSUPPORTED Flash device doesn't support this feature. **/ EFI_STATUS EFIAPI FlashFdGetFlashTable ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN OUT UINT8 *FlashTable ); /** Get Platform SPI Flash Number from SPI descriptor @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [out] FlashNumber Number of SPI flash devices returned. @retval EFI_SUCCESS Successfully returns. @retval EFI_UNSUPPORTED Platform is not using SPI flash rom or SPI is not in descriptor mode. **/ EFI_STATUS EFIAPI FlashFdGetSpiFlashNumber ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, OUT UINT8 *FlashNumber ); /** Convert address for SPI descriptor mode @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param[in] MemAddress BIOS memory mapped address. @param[out] SpiAddress Flash ROM start address + BIOS address in flash ROM. @retval EFI_SUCCESS Successfully returns. @retval EFI_UNSUPPORT Platform is not using SPI ROM. The SPI flash is not in Descriptor mode. The input address does not belong to BIOS memory mapped region. **/ EFI_STATUS EFIAPI FlashFdConvertToSpiAddress ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN MemAddress, OUT UINTN *SpiAddress ); /** Detect target flash device and copy whole flash device to output buffer. This function always returns EFI_UNSUPPORTED. @param[in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param[out] SystemTable Buffer to saved target flash device information @retval EFI_UNSUPPORTED Always return EFI_UNSUPPORTED. **/ EFI_STATUS EFIAPI BsFlashFdDetectDevice ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, OUT UINT8 *Buffer ); /** Reads data beginning at Lba:Offset from FV and places the data in Buffer. The read terminates either when *NumBytes of data have been read, or when a block boundary is reached. *NumBytes is updated to reflect the actual number of bytes read. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in] WriteAddress Start LBA address which want to read. @param [in] Offset Offset in the block at which to begin read @param [in, out] NumBytes IN: The requested read size. OUT: The data size by bytes has been read @param [out] Buffer Data buffer in which to place data read. @retval EFI_SUCCESS Read data successful. @retval EFI_INVALID_PARAMETER Input function parameters are invalid. @retval EFI_UNSUPPORTED The flash device is not supported @retval EFI_DEVICE_ERROR Read data failed caused by device error. **/ EFI_STATUS EFIAPI BsFlashFdRead ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN WriteAddress, IN UINTN Offset, IN OUT UINTN *NumBytes, OUT UINT8 *Buffer ); /** Writes data beginning at Lba:Offset from FV. The write terminates either when *NumBytes of data have been written, or when a block boundary is reached. *NumBytes is updated to reflect the actual number of bytes written. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in] Offset Start address to be written. @param [in, out] NumBytes IN: The requested write size. OUT: The data size by bytes has been written. @param [out] Buffer Data buffer want to write. @retval EFI_SUCCESS Write data successful. @retval EFI_INVALID_PARAMETER Input function parameters are invalid. @retval EFI_UNSUPPORTED The flash device is not supported @retval EFI_DEVICE_ERROR Write data failed caused by device error. **/ EFI_STATUS EFIAPI BsFlashFdWrite ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN WriteAddress, IN OUT UINTN *NumBytes, IN UINT8 *Buffer ); /** 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 [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in] LbaWriteAddress Start address to be erased. @param [in, out] NumBytes IN: The requested erase size. OUT: The data size by bytes has been erased. @retval EFI_SUCCESS Erase data successful. @retval EFI_INVALID_PARAMETER Input function parameters are invalid. @retval EFI_UNSUPPORTED The flash device is not supported @retval EFI_DEVICE_ERROR Erase data failed caused by device error. **/ EFI_STATUS EFIAPI BsFlashFdEraseBlocks ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN WriteAddress, IN UINTN *NumBytes ); /** The GetFlashTable() function get flash region table from platform. if the descriptor is valid, the FlashTable will be filled. if the descriptor is invalid,the FlashTable will be filled RegionTypeEos(0xff) directly. This function always returns EFI_UNSUPPORTED. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [in, out] FlashTable IN: Input buffer which want to save flash table. OUT: Buffer to save flash table. @retval EFI_UNSUPPORTED Always return EFI_UNSUPPORTED. **/ EFI_STATUS EFIAPI BsFlashFdGetFlashTable ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN OUT UINT8 *FlashTable ); /** Get Platform SPI Flash Number from SPI descriptor This function always returns EFI_UNSUPPORTED. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param [out] FlashNumber Number of SPI flash devices returned. @retval EFI_UNSUPPORT Always return EFI_UNSUPPORTED. **/ EFI_STATUS EFIAPI BsFlashFdGetSpiFlashNumber ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, OUT UINT8 *FlashNumber ); /** Convert address for SPI descriptor mode This function always returns EFI_UNSUPPORTED. @param [in] This Pointer to EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL instance. @param[in] MemAddress BIOS memory mapped address. @param[out] SpiAddress Flash ROM start address + BIOS address in flash ROM. @retval EFI_UNSUPPORT Always return EFI_UNSUPPORTED. **/ EFI_STATUS EFIAPI BsFlashFdConvertToSpiAddress ( IN EFI_SMM_FW_BLOCK_SERVICE_PROTOCOL *This, IN UINTN MemAddress, OUT UINTN *SpiAddress ); #endif