2011-02-01 06:41:42 +01:00
|
|
|
/** @file NorFlashBlockIoDxe.c
|
|
|
|
|
2012-02-28 18:32:47 +01:00
|
|
|
Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
|
|
|
|
|
2011-02-01 06:41:42 +01:00
|
|
|
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.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include <Library/BaseMemoryLib.h>
|
|
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
|
|
|
|
|
|
#include "NorFlashDxe.h"
|
|
|
|
|
|
|
|
//
|
|
|
|
// 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));
|
|
|
|
|
2012-02-28 18:32:47 +01:00
|
|
|
return NorFlashReset (Instance);
|
2011-02-01 06:41:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// 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
|
|
|
|
)
|
|
|
|
{
|
2011-06-03 11:35:57 +02:00
|
|
|
NOR_FLASH_INSTANCE *Instance;
|
|
|
|
EFI_STATUS Status;
|
2011-02-01 06:41:42 +01:00
|
|
|
|
|
|
|
Instance = INSTANCE_FROM_BLKIO_THIS(This);
|
|
|
|
|
|
|
|
DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer));
|
|
|
|
|
2011-06-03 11:35:57 +02:00
|
|
|
if( !This->Media->MediaPresent ) {
|
|
|
|
Status = EFI_NO_MEDIA;
|
|
|
|
} else if( This->Media->MediaId != MediaId ) {
|
|
|
|
Status = EFI_MEDIA_CHANGED;
|
|
|
|
} else {
|
2012-02-28 18:32:47 +01:00
|
|
|
Status = NorFlashReadBlocks (Instance,Lba,BufferSizeInBytes,Buffer);
|
2011-06-03 11:35:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
2011-02-01 06:41:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// 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
|
|
|
|
)
|
|
|
|
{
|
2011-06-03 11:35:57 +02:00
|
|
|
NOR_FLASH_INSTANCE *Instance;
|
|
|
|
EFI_STATUS Status;
|
2011-02-01 06:41:42 +01:00
|
|
|
|
|
|
|
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));
|
|
|
|
|
2011-06-03 11:35:57 +02:00
|
|
|
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 {
|
2012-02-28 18:32:47 +01:00
|
|
|
Status = NorFlashWriteBlocks (Instance,Lba,BufferSizeInBytes,Buffer);
|
2011-06-03 11:35:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
2011-02-01 06:41:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
NorFlashBlockIoFlushBlocks (
|
|
|
|
IN EFI_BLOCK_IO_PROTOCOL *This
|
|
|
|
)
|
|
|
|
{
|
|
|
|
// No Flush required for the NOR Flash driver
|
|
|
|
// because cache operations are not permitted.
|
|
|
|
|
|
|
|
DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoFlushBlocks: Function NOT IMPLEMENTED (not required).\n"));
|
|
|
|
|
|
|
|
// Nothing to do so just return without error
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|