// // 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 ) { FLASH_INSTANCE* Instance; EFI_STATUS Status; Instance = INSTANCE_FROM_BLKIO_THIS(This); //DEBUG ((EFI_D_ERROR, "FlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer)); if ( !This->Media->MediaPresent ) { Status = EFI_NO_MEDIA; } else if ( This->Media->MediaId != MediaId ) { Status = EFI_MEDIA_CHANGED; } else { Status = FlashReadBlocks (Instance, Lba, BufferSizeInBytes, Buffer); } return Status; }
// // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks // EFI_STATUS EFIAPI NorFlashBlockIoWriteBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSizeInBytes, IN VOID *Buffer ) { NOR_FLASH_INSTANCE *Instance; EFI_STATUS Status; Instance = INSTANCE_FROM_BLKIO_THIS(This); DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoWriteBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer)); if( !This->Media->MediaPresent ) { Status = EFI_NO_MEDIA; } else if( This->Media->MediaId != MediaId ) { Status = EFI_MEDIA_CHANGED; } else if( This->Media->ReadOnly ) { Status = EFI_WRITE_PROTECTED; } else { Status = NorFlashWriteBlocks (Instance,Lba,BufferSizeInBytes,Buffer); } return Status; }
// // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset // EFI_STATUS EFIAPI NorFlashBlockIoReset ( IN EFI_BLOCK_IO_PROTOCOL *This, IN BOOLEAN ExtendedVerification ) { NOR_FLASH_INSTANCE *Instance; Instance = INSTANCE_FROM_BLKIO_THIS(This); DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReset(MediaId=0x%x)\n", This->Media->MediaId)); return NorFlashReset (Instance); }
// // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks // EFI_STATUS EFIAPI NorFlashBlockIoReadBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSizeInBytes, OUT VOID *Buffer ) { NOR_FLASH_INSTANCE *Instance; EFI_STATUS Status; EFI_BLOCK_IO_MEDIA *Media; if (This == NULL) { return EFI_INVALID_PARAMETER; } Instance = INSTANCE_FROM_BLKIO_THIS(This); Media = This->Media; DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer)); if (!Media) { Status = EFI_INVALID_PARAMETER; } else if (!Media->MediaPresent) { Status = EFI_NO_MEDIA; } else if (Media->MediaId != MediaId) { Status = EFI_MEDIA_CHANGED; } else if ((Media->IoAlign > 2) && (((UINTN)Buffer & (Media->IoAlign - 1)) != 0)) { Status = EFI_INVALID_PARAMETER; } else { Status = NorFlashReadBlocks (Instance, Lba, BufferSizeInBytes, Buffer); } return Status; }