/** @file * * Copyright (c) 2011-2015, ARM Limited. All rights reserved. * Copyright (c) 2015, Hisilicon Limited. All rights reserved. * Copyright (c) 2015, Linaro Limited. All rights reserved. * * 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. * **/ #ifndef __FLASH_FVB_DXE_H__ #define __FLASH_FVB_DXE_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FLASH_ERASE_RETRY 10 #define FLASH_DEVICE_COUNT 1 // Device access macros // These are necessary because we use 2 x 16bit parts to make up 32bit data typedef struct { UINTN DeviceBaseAddress; // Start address of the Device Base Address (DBA) UINTN RegionBaseAddress; // Start address of one single region UINTN Size; UINTN BlockSize; EFI_GUID Guid; } FLASH_DESCRIPTION; #define GET_BLOCK_ADDRESS(BaseAddr,Lba,LbaSize)( BaseAddr + (UINTN)((Lba) * LbaSize) ) #define FLASH_SIGNATURE SIGNATURE_32('s', 'p', 'i', '0') #define INSTANCE_FROM_FVB_THIS(a) CR(a, FLASH_INSTANCE, FvbProtocol, FLASH_SIGNATURE) #define INSTANCE_FROM_BLKIO_THIS(a) CR(a, FLASH_INSTANCE, BlockIoProtocol, FLASH_SIGNATURE) typedef struct _FLASH_INSTANCE FLASH_INSTANCE; typedef EFI_STATUS (*FLASH_INITIALIZE) (FLASH_INSTANCE* Instance); typedef struct { VENDOR_DEVICE_PATH Vendor; EFI_DEVICE_PATH_PROTOCOL End; } FLASH_DEVICE_PATH; struct _FLASH_INSTANCE { UINT32 Signature; EFI_HANDLE Handle; BOOLEAN Initialized; FLASH_INITIALIZE Initialize; UINTN DeviceBaseAddress; UINTN RegionBaseAddress; UINTN Size; EFI_LBA StartLba; EFI_BLOCK_IO_PROTOCOL BlockIoProtocol; EFI_BLOCK_IO_MEDIA Media; BOOLEAN SupportFvb; EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol; FLASH_DEVICE_PATH DevicePath; }; // // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks // EFI_STATUS EFIAPI FlashBlockIoReadBlocks ( IN EFI_BLOCK_IO_PROTOCOL* This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSizeInBytes, OUT VOID* Buffer ); // // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks // EFI_STATUS EFIAPI FlashBlockIoWriteBlocks ( IN EFI_BLOCK_IO_PROTOCOL* This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSizeInBytes, IN VOID* Buffer ); // // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks // EFI_STATUS EFIAPI FlashBlockIoFlushBlocks ( IN EFI_BLOCK_IO_PROTOCOL* This ); // // FvbHw.c // EFI_STATUS EFIAPI FvbInitialize ( IN FLASH_INSTANCE* Instance ); EFI_STATUS EFIAPI FvbGetAttributes( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, OUT EFI_FVB_ATTRIBUTES_2* Attributes ); EFI_STATUS EFIAPI FvbSetAttributes( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, IN OUT EFI_FVB_ATTRIBUTES_2* Attributes ); EFI_STATUS EFIAPI FvbGetPhysicalAddress( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, OUT EFI_PHYSICAL_ADDRESS* Address ); EFI_STATUS EFIAPI FvbGetBlockSize( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, IN EFI_LBA Lba, OUT UINTN* BlockSize, OUT UINTN* NumberOfBlocks ); EFI_STATUS EFIAPI FvbRead( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, IN EFI_LBA Lba, IN UINTN Offset, IN OUT UINTN* NumBytes, IN OUT UINT8* Buffer ); EFI_STATUS EFIAPI FvbWrite( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, IN EFI_LBA Lba, IN UINTN Offset, IN OUT UINTN* NumBytes, IN UINT8* Buffer ); EFI_STATUS EFIAPI FvbEraseBlocks( IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL* This, ... ); // // FlashFvbDxe.c // EFI_STATUS FlashUnlockAndEraseSingleBlock ( IN FLASH_INSTANCE* Instance, IN UINTN BlockAddress ); EFI_STATUS FlashWriteBlocks ( IN FLASH_INSTANCE* Instance, IN EFI_LBA Lba, IN UINTN BufferSizeInBytes, IN VOID* Buffer ); EFI_STATUS FlashReadBlocks ( IN FLASH_INSTANCE* Instance, IN EFI_LBA Lba, IN UINTN BufferSizeInBytes, OUT VOID* Buffer ); #endif