ArmPlatformPkg/NorFlashDxe: Fixed CFI NOR Flash driver

CFI Flash differentiates DeviceBaseAddress with BlockAddress in
its protocol. The DeviceBaseAddress was not considered in the
previous version of this driver.
This version also fixes some bugs in the implementation of the
CFI protocol.

This new version also uses the Boot Mode Hob to reinitialized the
FVB when Boot Mode is equal to BOOT_WITH_DEFAULT_SETTINGS.



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13064 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin
2012-02-28 17:32:47 +00:00
parent e34114ea3f
commit 68dda854c6
9 changed files with 375 additions and 360 deletions

View File

@@ -1,6 +1,7 @@
/** @file NorFlashBlockIoDxe.c
Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
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
@@ -16,47 +17,6 @@
#include "NorFlashDxe.h"
EFI_STATUS
EFIAPI
NorFlashBlkIoInitialize (
IN NOR_FLASH_INSTANCE* Instance
)
{
UINT32 Reply;
EFI_STATUS Status = EFI_SUCCESS;
DEBUG((DEBUG_BLKIO,"NorFlashBlkIoInitialize()\n"));
//
// Verify that there is a physical hardware device where we expect it to be.
//
// Read a specific CFI query that returns back "QRY"
// This ensures that there is really a device present there
SEND_NOR_COMMAND (Instance->BaseAddress, 0, P30_CMD_READ_CFI_QUERY);
// Read CFI 'QRY' data
Status = NorFlashReadCfiData (Instance->BaseAddress, P30_CFI_ADDR_QUERY_UNIQUE_QRY, 3, &Reply);
if (EFI_ERROR(Status)) {
return Status;
}
if (Reply != CFI_QRY) {
DEBUG((EFI_D_ERROR, "NorFlashBlkIoInitialize: CFI QRY=0x%x (expected 0x595251)\n", Reply));
return EFI_DEVICE_ERROR;
}
// Reset the device
Status = NorFlashBlockIoReset (&Instance->BlockIoProtocol, FALSE);
if (EFI_ERROR(Status)) {
return Status;
}
Instance->Initialized = TRUE;
return EFI_SUCCESS;
}
//
// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset
//
@@ -73,7 +33,7 @@ NorFlashBlockIoReset (
DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReset(MediaId=0x%x)\n", This->Media->MediaId));
return NorFlashReset(Instance);
return NorFlashReset (Instance);
}
//
@@ -101,7 +61,7 @@ NorFlashBlockIoReadBlocks (
} else if( This->Media->MediaId != MediaId ) {
Status = EFI_MEDIA_CHANGED;
} else {
Status = NorFlashReadBlocks(Instance,Lba,BufferSizeInBytes,Buffer);
Status = NorFlashReadBlocks (Instance,Lba,BufferSizeInBytes,Buffer);
}
return Status;
@@ -134,7 +94,7 @@ NorFlashBlockIoWriteBlocks (
} else if( This->Media->ReadOnly ) {
Status = EFI_WRITE_PROTECTED;
} else {
Status = NorFlashWriteBlocks(Instance,Lba,BufferSizeInBytes,Buffer);
Status = NorFlashWriteBlocks (Instance,Lba,BufferSizeInBytes,Buffer);
}
return Status;