return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (Instance->Media.ReadOnly == TRUE) {\r
- return EFI_WRITE_PROTECTED;\r
- }\r
-\r
// We must have some bytes to read\r
DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BufferSizeInBytes=0x%x\n", BufferSizeInBytes));\r
if (BufferSizeInBytes == 0) {\r
}\r
\r
// The size of the buffer must be a multiple of the block size\r
- DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BlockSize in bytes =0x%x\n", Instance->Media.BlockSize));\r
- if ((BufferSizeInBytes % Instance->Media.BlockSize) != 0) {\r
+ DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BlockSize in bytes =0x%x\n", Instance->BlockSize));\r
+ if ((BufferSizeInBytes % Instance->BlockSize) != 0) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
\r
// All blocks must be within the device\r
- NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->Media.BlockSize;\r
+ NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->BlockSize;\r
\r
- DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: NumBlocks=%d, LastBlock=%ld, Lba=%ld.\n", NumBlocks, Instance->Media.LastBlock, Lba));\r
+ DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: NumBlocks=%d, LastBlock=%ld, Lba=%ld.\n", NumBlocks, Instance->LastBlock, Lba));\r
\r
- if ((Lba + NumBlocks) > (Instance->Media.LastBlock + 1)) {\r
+ if ((Lba + NumBlocks) > (Instance->LastBlock + 1)) {\r
DEBUG ((DEBUG_ERROR, "NorFlashWriteBlocks: ERROR - Write will exceed last block.\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- BlockSizeInWords = Instance->Media.BlockSize / 4;\r
+ BlockSizeInWords = Instance->BlockSize / 4;\r
\r
// Because the target *Buffer is a pointer to VOID, we must put all the data into a pointer\r
// to a proper data type, so use *ReadBuffer\r
DEBUG_BLKIO,\r
"NorFlashReadBlocks: BufferSize=0x%xB BlockSize=0x%xB LastBlock=%ld, Lba=%ld.\n",\r
BufferSizeInBytes,\r
- Instance->Media.BlockSize,\r
- Instance->Media.LastBlock,\r
+ Instance->BlockSize,\r
+ Instance->LastBlock,\r
Lba\r
));\r
\r
}\r
\r
// The size of the buffer must be a multiple of the block size\r
- if ((BufferSizeInBytes % Instance->Media.BlockSize) != 0) {\r
+ if ((BufferSizeInBytes % Instance->BlockSize) != 0) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
\r
// All blocks must be within the device\r
- NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->Media.BlockSize;\r
+ NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->BlockSize;\r
\r
- if ((Lba + NumBlocks) > (Instance->Media.LastBlock + 1)) {\r
+ if ((Lba + NumBlocks) > (Instance->LastBlock + 1)) {\r
DEBUG ((DEBUG_ERROR, "NorFlashReadBlocks: ERROR - Read will exceed last block\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
StartAddress = GET_NOR_BLOCK_ADDRESS (\r
Instance->RegionBaseAddress,\r
Lba,\r
- Instance->Media.BlockSize\r
+ Instance->BlockSize\r
);\r
\r
// Put the device into Read Array mode\r
return EFI_SUCCESS;\r
}\r
\r
- if (((Lba * Instance->Media.BlockSize) + Offset + BufferSizeInBytes) > Instance->Size) {\r
+ if (((Lba * Instance->BlockSize) + Offset + BufferSizeInBytes) > Instance->Size) {\r
DEBUG ((DEBUG_ERROR, "NorFlashRead: ERROR - Read will exceed device size.\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
StartAddress = GET_NOR_BLOCK_ADDRESS (\r
Instance->RegionBaseAddress,\r
Lba,\r
- Instance->Media.BlockSize\r
+ Instance->BlockSize\r
);\r
\r
// Put the device into Read Array mode\r
\r
/*\r
Write a full or portion of a block. It must not span block boundaries; that is,\r
- Offset + *NumBytes <= Instance->Media.BlockSize.\r
+ Offset + *NumBytes <= Instance->BlockSize.\r
*/\r
EFI_STATUS\r
NorFlashWriteSingleBlock (\r
\r
DEBUG ((DEBUG_BLKIO, "NorFlashWriteSingleBlock(Parameters: Lba=%ld, Offset=0x%x, *NumBytes=0x%x, Buffer @ 0x%08x)\n", Lba, Offset, *NumBytes, Buffer));\r
\r
- // Detect WriteDisabled state\r
- if (Instance->Media.ReadOnly == TRUE) {\r
- DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleBlock: ERROR - Can not write: Device is in WriteDisabled state.\n"));\r
- // It is in WriteDisabled state, return an error right away\r
- return EFI_ACCESS_DENIED;\r
- }\r
-\r
// Cache the block size to avoid de-referencing pointers all the time\r
- BlockSize = Instance->Media.BlockSize;\r
+ BlockSize = Instance->BlockSize;\r
\r
// The write must not span block boundaries.\r
// We need to check each variable individually because adding two large values together overflows.\r
EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->DeviceBaseAddress);\r
EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->RegionBaseAddress);\r
\r
- // Convert BlockIo protocol\r
- EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->BlockIoProtocol.FlushBlocks);\r
- EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->BlockIoProtocol.ReadBlocks);\r
- EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->BlockIoProtocol.Reset);\r
- EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->BlockIoProtocol.WriteBlocks);\r
-\r
// Convert Fvb\r
EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.EraseBlocks);\r
EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetAttributes);\r
\r
#include <Guid/EventGroup.h>\r
\r
-#include <Protocol/BlockIo.h>\r
#include <Protocol/FirmwareVolumeBlock.h>\r
\r
#include <Library/DebugLib.h>\r
#define P30_CMD_READ_CONFIGURATION_REGISTER 0x0003\r
\r
#define NOR_FLASH_SIGNATURE SIGNATURE_32('n', 'o', 'r', '0')\r
-#define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE, FvbProtocol, NOR_FLASH_SIGNATURE)\r
-#define INSTANCE_FROM_BLKIO_THIS(a) CR(a, NOR_FLASH_INSTANCE, BlockIoProtocol, NOR_FLASH_SIGNATURE)\r
+#define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE, FvbProtocol, NOR_FLASH_SIGNATURE)\r
\r
typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE;\r
\r
UINTN RegionBaseAddress;\r
UINTN Size;\r
EFI_LBA StartLba;\r
-\r
- EFI_BLOCK_IO_PROTOCOL BlockIoProtocol;\r
- EFI_BLOCK_IO_MEDIA Media;\r
+ EFI_LBA LastBlock;\r
+ UINT32 BlockSize;\r
\r
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol;\r
VOID *ShadowBuffer;\r
IN UINT32 *Buffer\r
);\r
\r
-//\r
-// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-NorFlashBlockIoReset (\r
- IN EFI_BLOCK_IO_PROTOCOL *This,\r
- IN BOOLEAN ExtendedVerification\r
- );\r
-\r
-//\r
-// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-NorFlashBlockIoReadBlocks (\r
- IN EFI_BLOCK_IO_PROTOCOL *This,\r
- IN UINT32 MediaId,\r
- IN EFI_LBA Lba,\r
- IN UINTN BufferSizeInBytes,\r
- OUT VOID *Buffer\r
- );\r
-\r
-//\r
-// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-NorFlashBlockIoWriteBlocks (\r
- IN EFI_BLOCK_IO_PROTOCOL *This,\r
- IN UINT32 MediaId,\r
- IN EFI_LBA Lba,\r
- IN UINTN BufferSizeInBytes,\r
- IN VOID *Buffer\r
- );\r
-\r
-//\r
-// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-NorFlashBlockIoFlushBlocks (\r
- IN EFI_BLOCK_IO_PROTOCOL *This\r
- );\r
-\r
//\r
// NorFlashFvbDxe.c\r
//\r
0, // RegionBaseAddress ... NEED TO BE FILLED\r
0, // Size ... NEED TO BE FILLED\r
0, // StartLba\r
-\r
- {\r
- EFI_BLOCK_IO_PROTOCOL_REVISION2, // Revision\r
- NULL, // Media ... NEED TO BE FILLED\r
- NorFlashBlockIoReset, // Reset;\r
- NorFlashBlockIoReadBlocks, // ReadBlocks\r
- NorFlashBlockIoWriteBlocks, // WriteBlocks\r
- NorFlashBlockIoFlushBlocks // FlushBlocks\r
- }, // BlockIoProtocol\r
-\r
- {\r
- 0, // MediaId ... NEED TO BE FILLED\r
- FALSE, // RemovableMedia\r
- TRUE, // MediaPresent\r
- FALSE, // LogicalPartition\r
- FALSE, // ReadOnly\r
- FALSE, // WriteCaching;\r
- 0, // BlockSize ... NEED TO BE FILLED\r
- 4, // IoAlign\r
- 0, // LastBlock ... NEED TO BE FILLED\r
- 0, // LowestAlignedLba\r
- 1, // LogicalBlocksPerPhysicalBlock\r
- }, // Media;\r
+ 0, // LastBlock\r
+ 0, // BlockSize\r
\r
{\r
FvbGetAttributes, // GetAttributes\r
Instance->DeviceBaseAddress = NorFlashDeviceBase;\r
Instance->RegionBaseAddress = NorFlashRegionBase;\r
Instance->Size = NorFlashSize;\r
-\r
- Instance->BlockIoProtocol.Media = &Instance->Media;\r
- Instance->Media.MediaId = Index;\r
- Instance->Media.BlockSize = BlockSize;\r
- Instance->Media.LastBlock = (NorFlashSize / BlockSize)-1;\r
+ Instance->BlockSize = BlockSize;\r
+ Instance->LastBlock = (NorFlashSize / BlockSize) - 1;\r
\r
CopyGuid (&Instance->DevicePath.Vendor.Guid, &gEfiCallerIdGuid);\r
Instance->DevicePath.Index = (UINT8)Index;\r
&Instance->Handle,\r
&gEfiDevicePathProtocolGuid,\r
&Instance->DevicePath,\r
- &gEfiBlockIoProtocolGuid,\r
- &Instance->BlockIoProtocol,\r
&gEfiFirmwareVolumeBlockProtocolGuid,\r
&Instance->FvbProtocol,\r
NULL\r
&Instance->Handle,\r
&gEfiDevicePathProtocolGuid,\r
&Instance->DevicePath,\r
- &gEfiBlockIoProtocolGuid,\r
- &Instance->BlockIoProtocol,\r
NULL\r
);\r
if (EFI_ERROR (Status)) {\r
PcdGet64 (PcdFlashNvStorageVariableBase64) : PcdGet32 (PcdFlashNvStorageVariableBase);\r
\r
// Set the index of the first LBA for the FVB\r
- Instance->StartLba = (mFlashNvStorageVariableBase - Instance->RegionBaseAddress) / Instance->Media.BlockSize;\r
+ Instance->StartLba = (mFlashNvStorageVariableBase - Instance->RegionBaseAddress) / Instance->BlockSize;\r
\r
BootMode = GetBootModeHob ();\r
if (BootMode == BOOT_WITH_DEFAULT_SETTINGS) {\r
));\r
\r
// Erase all the NorFlash that is reserved for variable storage\r
- FvbNumLba = (PcdGet32 (PcdFlashNvStorageVariableSize) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) + PcdGet32 (PcdFlashNvStorageFtwSpareSize)) / Instance->Media.BlockSize;\r
+ FvbNumLba = (PcdGet32 (PcdFlashNvStorageVariableSize) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) + PcdGet32 (PcdFlashNvStorageFtwSpareSize)) / Instance->BlockSize;\r
\r
Status = FvbEraseBlocks (&Instance->FvbProtocol, (EFI_LBA)0, FvbNumLba, EFI_LBA_LIST_TERMINATOR);\r
if (EFI_ERROR (Status)) {\r
[Sources.common]\r
VirtNorFlash.c\r
VirtNorFlash.h\r
- VirtNorFlashBlockIoDxe.c\r
VirtNorFlashDxe.c\r
VirtNorFlashFvb.c\r
\r
}\r
\r
// Check if the size of the area is at least one block size\r
- if ((NvStorageVariableSize <= 0) || (NvStorageVariableSize / Instance->Media.BlockSize <= 0)) {\r
+ if ((NvStorageVariableSize <= 0) || (NvStorageVariableSize / Instance->BlockSize <= 0)) {\r
DEBUG ((\r
DEBUG_ERROR,\r
"%a: NvStorageVariableSize is 0x%x, should be atleast one block size\n",\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if ((NvStorageFtwWorkingSize <= 0) || (NvStorageFtwWorkingSize / Instance->Media.BlockSize <= 0)) {\r
+ if ((NvStorageFtwWorkingSize <= 0) || (NvStorageFtwWorkingSize / Instance->BlockSize <= 0)) {\r
DEBUG ((\r
DEBUG_ERROR,\r
"%a: NvStorageFtwWorkingSize is 0x%x, should be atleast one block size\n",\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if ((NvStorageFtwSpareSize <= 0) || (NvStorageFtwSpareSize / Instance->Media.BlockSize <= 0)) {\r
+ if ((NvStorageFtwSpareSize <= 0) || (NvStorageFtwSpareSize / Instance->BlockSize <= 0)) {\r
DEBUG ((\r
DEBUG_ERROR,\r
"%a: NvStorageFtwSpareSize is 0x%x, should be atleast one block size\n",\r
}\r
\r
// Ensure the Variable area Base Addresses are aligned on a block size boundaries\r
- if ((NvStorageVariableBase % Instance->Media.BlockSize != 0) ||\r
- (NvStorageFtwWorkingBase % Instance->Media.BlockSize != 0) ||\r
- (NvStorageFtwSpareBase % Instance->Media.BlockSize != 0))\r
+ if ((NvStorageVariableBase % Instance->BlockSize != 0) ||\r
+ (NvStorageFtwWorkingBase % Instance->BlockSize != 0) ||\r
+ (NvStorageFtwSpareBase % Instance->BlockSize != 0))\r
{\r
DEBUG ((DEBUG_ERROR, "%a: NvStorage Base addresses must be aligned to block size boundaries", __FUNCTION__));\r
return EFI_INVALID_PARAMETER;\r
);\r
FirmwareVolumeHeader->HeaderLength = sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY);\r
FirmwareVolumeHeader->Revision = EFI_FVH_REVISION;\r
- FirmwareVolumeHeader->BlockMap[0].NumBlocks = Instance->Media.LastBlock + 1;\r
- FirmwareVolumeHeader->BlockMap[0].Length = Instance->Media.BlockSize;\r
+ FirmwareVolumeHeader->BlockMap[0].NumBlocks = Instance->LastBlock + 1;\r
+ FirmwareVolumeHeader->BlockMap[0].Length = Instance->BlockSize;\r
FirmwareVolumeHeader->BlockMap[1].NumBlocks = 0;\r
FirmwareVolumeHeader->BlockMap[1].Length = 0;\r
FirmwareVolumeHeader->Checksum = CalculateCheckSum16 ((UINT16 *)FirmwareVolumeHeader, FirmwareVolumeHeader->HeaderLength);\r
)\r
{\r
EFI_FVB_ATTRIBUTES_2 FlashFvbAttributes;\r
- NOR_FLASH_INSTANCE *Instance;\r
-\r
- Instance = INSTANCE_FROM_FVB_THIS (This);\r
\r
FlashFvbAttributes = (EFI_FVB_ATTRIBUTES_2)(\r
\r
EFI_FVB2_READ_STATUS | // Reads are currently enabled\r
EFI_FVB2_STICKY_WRITE | // A block erase is required to flip bits into EFI_FVB2_ERASE_POLARITY\r
EFI_FVB2_MEMORY_MAPPED | // It is memory mapped\r
- EFI_FVB2_ERASE_POLARITY // After erasure all bits take this value (i.e. '1')\r
+ EFI_FVB2_ERASE_POLARITY | // After erasure all bits take this value (i.e. '1')\r
+ EFI_FVB2_WRITE_STATUS | // Writes are currently enabled\r
+ EFI_FVB2_WRITE_ENABLED_CAP // Writes may be enabled\r
\r
);\r
\r
- // Check if it is write protected\r
- if (Instance->Media.ReadOnly != TRUE) {\r
- FlashFvbAttributes = FlashFvbAttributes |\r
- EFI_FVB2_WRITE_STATUS | // Writes are currently enabled\r
- EFI_FVB2_WRITE_ENABLED_CAP; // Writes may be enabled\r
- }\r
-\r
*Attributes = FlashFvbAttributes;\r
\r
DEBUG ((DEBUG_BLKIO, "FvbGetAttributes(0x%X)\n", *Attributes));\r
\r
Instance = INSTANCE_FROM_FVB_THIS (This);\r
\r
- DEBUG ((DEBUG_BLKIO, "FvbGetBlockSize(Lba=%ld, BlockSize=0x%x, LastBlock=%ld)\n", Lba, Instance->Media.BlockSize, Instance->Media.LastBlock));\r
+ DEBUG ((DEBUG_BLKIO, "FvbGetBlockSize(Lba=%ld, BlockSize=0x%x, LastBlock=%ld)\n", Lba, Instance->BlockSize, Instance->LastBlock));\r
\r
- if (Lba > Instance->Media.LastBlock) {\r
- DEBUG ((DEBUG_ERROR, "FvbGetBlockSize: ERROR - Parameter LBA %ld is beyond the last Lba (%ld).\n", Lba, Instance->Media.LastBlock));\r
+ if (Lba > Instance->LastBlock) {\r
+ DEBUG ((DEBUG_ERROR, "FvbGetBlockSize: ERROR - Parameter LBA %ld is beyond the last Lba (%ld).\n", Lba, Instance->LastBlock));\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
// This is easy because in this platform each NorFlash device has equal sized blocks.\r
- *BlockSize = (UINTN)Instance->Media.BlockSize;\r
- *NumberOfBlocks = (UINTN)(Instance->Media.LastBlock - Lba + 1);\r
+ *BlockSize = (UINTN)Instance->BlockSize;\r
+ *NumberOfBlocks = (UINTN)(Instance->LastBlock - Lba + 1);\r
\r
DEBUG ((DEBUG_BLKIO, "FvbGetBlockSize: *BlockSize=0x%x, *NumberOfBlocks=0x%x.\n", *BlockSize, *NumberOfBlocks));\r
\r
TempStatus = EFI_SUCCESS;\r
\r
// Cache the block size to avoid de-referencing pointers all the time\r
- BlockSize = Instance->Media.BlockSize;\r
+ BlockSize = Instance->BlockSize;\r
\r
DEBUG ((DEBUG_BLKIO, "FvbRead: Check if (Offset=0x%x + NumBytes=0x%x) <= BlockSize=0x%x\n", Offset, *NumBytes, BlockSize));\r
\r
\r
Status = EFI_SUCCESS;\r
\r
- // Detect WriteDisabled state\r
- if (Instance->Media.ReadOnly == TRUE) {\r
- // Firmware volume is in WriteDisabled state\r
- DEBUG ((DEBUG_ERROR, "FvbEraseBlocks: ERROR - Device is in WriteDisabled state.\n"));\r
- return EFI_ACCESS_DENIED;\r
- }\r
-\r
// Before erasing, check the entire list of parameters to ensure all specified blocks are valid\r
\r
VA_START (Args, This);\r
"FvbEraseBlocks: Check if: ( StartingLba=%ld + NumOfLba=%Lu - 1 ) > LastBlock=%ld.\n",\r
Instance->StartLba + StartingLba,\r
(UINT64)NumOfLba,\r
- Instance->Media.LastBlock\r
+ Instance->LastBlock\r
));\r
- if ((NumOfLba == 0) || ((Instance->StartLba + StartingLba + NumOfLba - 1) > Instance->Media.LastBlock)) {\r
+ if ((NumOfLba == 0) || ((Instance->StartLba + StartingLba + NumOfLba - 1) > Instance->LastBlock)) {\r
VA_END (Args);\r
DEBUG ((DEBUG_ERROR, "FvbEraseBlocks: ERROR - Lba range goes past the last Lba.\n"));\r
Status = EFI_INVALID_PARAMETER;\r
BlockAddress = GET_NOR_BLOCK_ADDRESS (\r
Instance->RegionBaseAddress,\r
Instance->StartLba + StartingLba,\r
- Instance->Media.BlockSize\r
+ Instance->BlockSize\r
);\r
\r
// Erase it\r