summaryrefslogtreecommitdiff
path: root/Platform
diff options
context:
space:
mode:
authorMarcin Wojtas <mw@semihalf.com>2017-05-18 08:26:48 +0200
committerMarcin Wojtas <mw@semihalf.com>2017-10-05 16:58:06 +0200
commit5d3bc1fdd28bcc300adb1290aae9f5e0f71546e9 (patch)
tree083ae7d8b4188588c4e7bf975c4a9c92f731523b /Platform
parenta46a211fe350c74b095f3d83781d778912ac1491 (diff)
downloadedk2-platforms-5d3bc1fdd28bcc300adb1290aae9f5e0f71546e9.tar.xz
Marvell/Drivers: MvSpiFlash: Fix usage of erase size parameter
Although, hitherto support allowed for using configurable EraseSize, the erase command was fixed to CMD_ERASE_64K. Also it was assumed that EraseSize equals SectorSize, which is not true for some flash devices. Fix both issues by adding new PCD (gMarvellTokenSpaceGuid.PcdSpiFlashPageSize) and using this parameter properly in MvSpiFlashUpdate routine instead of the EraseSize. Also erase command is adjusted to the settings. Update PortingGuide accordingly. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Marcin Wojtas <mw@semihalf.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Diffstat (limited to 'Platform')
-rwxr-xr-xPlatform/Marvell/Drivers/Spi/Devices/MvSpiFlash.c26
-rwxr-xr-xPlatform/Marvell/Drivers/Spi/Devices/MvSpiFlash.h2
-rw-r--r--Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf1
-rw-r--r--Platform/Marvell/Marvell.dec1
4 files changed, 24 insertions, 6 deletions
diff --git a/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.c b/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.c
index 9a04493895..7ce1b3e8e0 100755
--- a/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.c
+++ b/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.c
@@ -191,7 +191,21 @@ MvSpiFlashErase (
return EFI_DEVICE_ERROR;
}
- Cmd[0] = CMD_ERASE_64K;
+ switch (EraseSize) {
+ case SIZE_4KB:
+ Cmd[0] = CMD_ERASE_4K;
+ break;
+ case SIZE_32KB:
+ Cmd[0] = CMD_ERASE_32K;
+ break;
+ case SIZE_64KB:
+ Cmd[0] = CMD_ERASE_64K;
+ break;
+ default:
+ DEBUG ((DEBUG_ERROR, "MvSpiFlash: Invalid EraseSize parameter\n"));
+ return EFI_INVALID_PARAMETER;
+ }
+
while (Length) {
EraseAddr = Offset;
@@ -353,14 +367,14 @@ MvSpiFlashUpdate (
)
{
EFI_STATUS Status;
- UINT64 EraseSize, ToUpdate, Scale = 1;
+ UINT64 SectorSize, ToUpdate, Scale = 1;
UINT8 *TmpBuf, *End;
- EraseSize = PcdGet64 (PcdSpiFlashEraseSize);
+ SectorSize = PcdGet64 (PcdSpiFlashSectorSize);
End = Buf + ByteCount;
- TmpBuf = (UINT8 *)AllocateZeroPool (EraseSize);
+ TmpBuf = (UINT8 *)AllocateZeroPool (SectorSize);
if (TmpBuf == NULL) {
DEBUG((DEBUG_ERROR, "SpiFlash: Cannot allocate memory\n"));
return EFI_OUT_OF_RESOURCES;
@@ -370,9 +384,9 @@ MvSpiFlashUpdate (
Scale = (End - Buf) / 100;
for (; Buf < End; Buf += ToUpdate, Offset += ToUpdate) {
- ToUpdate = MIN((UINT64)(End - Buf), EraseSize);
+ ToUpdate = MIN((UINT64)(End - Buf), SectorSize);
Print (L" \rUpdating, %d%%", 100 - (End - Buf) / Scale);
- Status = MvSpiFlashUpdateBlock (Slave, Offset, ToUpdate, Buf, TmpBuf, EraseSize);
+ Status = MvSpiFlashUpdateBlock (Slave, Offset, ToUpdate, Buf, TmpBuf, SectorSize);
if (EFI_ERROR (Status)) {
DEBUG((DEBUG_ERROR, "SpiFlash: Error while updating\n"));
diff --git a/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.h b/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.h
index 3889643aeb..f90abb771e 100755
--- a/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.h
+++ b/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.h
@@ -57,6 +57,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define CMD_READ_ARRAY_FAST 0x0b
#define CMD_PAGE_PROGRAM 0x02
#define CMD_BANK_WRITE 0xc5
+#define CMD_ERASE_4K 0x20
+#define CMD_ERASE_32K 0x52
#define CMD_ERASE_64K 0xd8
#define CMD_4B_ADDR_ENABLE 0xb7
diff --git a/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf b/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf
index d035d47137..4519b02ea5 100644
--- a/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf
+++ b/Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf
@@ -58,6 +58,7 @@
gMarvellTokenSpaceGuid.PcdSpiFlashEraseSize
gMarvellTokenSpaceGuid.PcdSpiFlashPageSize
gMarvellTokenSpaceGuid.PcdSpiFlashPollCmd
+ gMarvellTokenSpaceGuid.PcdSpiFlashSectorSize
[Protocols]
gMarvellSpiMasterProtocolGuid
diff --git a/Platform/Marvell/Marvell.dec b/Platform/Marvell/Marvell.dec
index 869e376861..fc00f1ac83 100644
--- a/Platform/Marvell/Marvell.dec
+++ b/Platform/Marvell/Marvell.dec
@@ -127,6 +127,7 @@
gMarvellTokenSpaceGuid.PcdSpiFlashAddressCycles|0|UINT32|0x3000053
gMarvellTokenSpaceGuid.PcdSpiFlashEraseSize|0|UINT64|0x3000054
gMarvellTokenSpaceGuid.PcdSpiFlashPageSize|0|UINT32|0x3000055
+ gMarvellTokenSpaceGuid.PcdSpiFlashSectorSize|65536|UINT64|0x3000059
gMarvellTokenSpaceGuid.PcdSpiFlashId|0|UINT32|0x3000056
gMarvellTokenSpaceGuid.PcdSpiFlashCs|0|UINT32|0x3000057
gMarvellTokenSpaceGuid.PcdSpiFlashMode|0|UINT32|0x3000058