From: Marcin Wojtas <mw@semihalf.com>
To: edk2-devel@lists.01.org
Cc: leif.lindholm@linaro.org, ard.biesheuvel@linaro.org,
nadavh@marvell.com, neta@marvell.com, kostap@marvell.com,
jinghua@marvell.com, mw@semihalf.com, jsd@semihalf.com
Subject: [platforms: PATCH v2 4/6] Marvell/Applications: SpiTool: Do not override existing slave device
Date: Fri, 3 Nov 2017 18:57:13 +0100 [thread overview]
Message-ID: <1509731835-5664-5-git-send-email-mw@semihalf.com> (raw)
In-Reply-To: <1509731835-5664-1-git-send-email-mw@semihalf.com>
Current usage of sf command requires running 'sf probe' prior to
executing any other option. Because it is done in two separate steps,
it turned out that SpiMasterProtocol->SetupDevice could easily
overwrite valid Slave pointer when performing second operation.
Fix the issue by allocating Slave device only once and keep it
as global variable in the SpiTool application. This patch
also updates FirmwareUpdate command to follow the modified
SetupDevice operation.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
Platform/Marvell/Applications/FirmwareUpdate/FUpdate.c | 4 ++--
Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c | 21 ++++++++++----------
Platform/Marvell/Drivers/Spi/MvSpiDxe.c | 17 ++++++++--------
Platform/Marvell/Drivers/Spi/MvSpiDxe.h | 1 +
Platform/Marvell/Include/Protocol/Spi.h | 1 +
5 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/Platform/Marvell/Applications/FirmwareUpdate/FUpdate.c b/Platform/Marvell/Applications/FirmwareUpdate/FUpdate.c
index 750e52a..9ccb1c7 100644
--- a/Platform/Marvell/Applications/FirmwareUpdate/FUpdate.c
+++ b/Platform/Marvell/Applications/FirmwareUpdate/FUpdate.c
@@ -240,7 +240,7 @@ ShellCommandRunFUpdate (
)
{
IN SHELL_FILE_HANDLE FileHandle;
- SPI_DEVICE *Slave;
+ SPI_DEVICE *Slave = NULL;
UINT64 FileSize;
UINTN *FileBuffer = NULL;
CHAR16 *ProblemParam;
@@ -302,7 +302,7 @@ ShellCommandRunFUpdate (
}
// Setup and probe SPI flash
- Slave = SpiMasterProtocol->SetupDevice (SpiMasterProtocol, 0, 0);
+ Slave = SpiMasterProtocol->SetupDevice (SpiMasterProtocol, Slave, 0, 0);
if (Slave == NULL) {
Print(L"%s: Cannot allocate SPI device!\n", CMD_NAME_STRING);
goto HeaderError;
diff --git a/Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c b/Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c
index 68a6cf7..cf91581 100644
--- a/Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c
+++ b/Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c
@@ -58,6 +58,8 @@ EFI_HANDLE gShellSfHiiHandle = NULL;
BOOLEAN InitFlag = 1;
+STATIC SPI_DEVICE *mSlave;
+
STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
{L"read", TypeFlag},
{L"readfile", TypeFlag},
@@ -191,7 +193,6 @@ ShellCommandRunSpiFlash (
)
{
EFI_STATUS Status;
- SPI_DEVICE *Slave;
LIST_ENTRY *CheckPackage;
EFI_PHYSICAL_ADDRESS Address = 0, Offset = 0;
SHELL_FILE_HANDLE FileHandle = NULL;
@@ -273,8 +274,8 @@ EFI_STATUS Status;
Cs = PcdGet32 (PcdSpiFlashCs);
// Setup new spi device
- Slave = SpiMasterProtocol->SetupDevice (SpiMasterProtocol, Cs, Mode);
- if (Slave == NULL) {
+ mSlave = SpiMasterProtocol->SetupDevice (SpiMasterProtocol, mSlave, Cs, Mode);
+ if (mSlave == NULL) {
Print(L"sf: Cannot allocate SPI device!\n");
return SHELL_ABORTED;
}
@@ -282,9 +283,11 @@ EFI_STATUS Status;
switch (Flag) {
case PROBE:
// Probe spi bus
- Status = FlashProbe (Slave);
+ Status = FlashProbe (mSlave);
if (EFI_ERROR(Status)) {
// No supported spi flash detected
+ SpiMasterProtocol->FreeDevice(mSlave);
+ mSlave = NULL;
return SHELL_ABORTED;
} else {
return Status;
@@ -411,23 +414,21 @@ EFI_STATUS Status;
switch (Flag) {
case READ:
case READ_FILE:
- Status = SpiFlashProtocol->Read (Slave, Offset, ByteCount, Buffer);
+ Status = SpiFlashProtocol->Read (mSlave, Offset, ByteCount, Buffer);
break;
case ERASE:
- Status = SpiFlashProtocol->Erase (Slave, Offset, ByteCount);
+ Status = SpiFlashProtocol->Erase (mSlave, Offset, ByteCount);
break;
case WRITE:
case WRITE_FILE:
- Status = SpiFlashProtocol->Write (Slave, Offset, ByteCount, Buffer);
+ Status = SpiFlashProtocol->Write (mSlave, Offset, ByteCount, Buffer);
break;
case UPDATE:
case UPDATE_FILE:
- Status = SpiFlashProtocol->Update (Slave, Offset, ByteCount, Buffer);
+ Status = SpiFlashProtocol->Update (mSlave, Offset, ByteCount, Buffer);
break;
}
- SpiMasterProtocol->FreeDevice(Slave);
-
if (EFI_ERROR (Status)) {
Print (L"sf: Error while performing spi transfer\n");
return SHELL_ABORTED;
diff --git a/Platform/Marvell/Drivers/Spi/MvSpiDxe.c b/Platform/Marvell/Drivers/Spi/MvSpiDxe.c
index 3b49147..a7db5f2 100755
--- a/Platform/Marvell/Drivers/Spi/MvSpiDxe.c
+++ b/Platform/Marvell/Drivers/Spi/MvSpiDxe.c
@@ -296,21 +296,22 @@ SPI_DEVICE *
EFIAPI
MvSpiSetupSlave (
IN MARVELL_SPI_MASTER_PROTOCOL *This,
+ IN SPI_DEVICE *Slave,
IN UINTN Cs,
IN SPI_MODE Mode
)
{
- SPI_DEVICE *Slave;
+ if (!Slave) {
+ Slave = AllocateZeroPool (sizeof(SPI_DEVICE));
+ if (Slave == NULL) {
+ DEBUG((DEBUG_ERROR, "Cannot allocate memory\n"));
+ return NULL;
+ }
- Slave = AllocateZeroPool (sizeof(SPI_DEVICE));
- if (Slave == NULL) {
- DEBUG((DEBUG_ERROR, "Cannot allocate memory\n"));
- return NULL;
+ Slave->Cs = Cs;
+ Slave->Mode = Mode;
}
- Slave->Cs = Cs;
- Slave->Mode = Mode;
-
SpiSetupTransfer (This, Slave);
return Slave;
diff --git a/Platform/Marvell/Drivers/Spi/MvSpiDxe.h b/Platform/Marvell/Drivers/Spi/MvSpiDxe.h
index 1401f62..e7e280a 100644
--- a/Platform/Marvell/Drivers/Spi/MvSpiDxe.h
+++ b/Platform/Marvell/Drivers/Spi/MvSpiDxe.h
@@ -125,6 +125,7 @@ SPI_DEVICE *
EFIAPI
MvSpiSetupSlave (
IN MARVELL_SPI_MASTER_PROTOCOL * This,
+ IN SPI_DEVICE *Slave,
IN UINTN Cs,
IN SPI_MODE Mode
);
diff --git a/Platform/Marvell/Include/Protocol/Spi.h b/Platform/Marvell/Include/Protocol/Spi.h
index 6f26a36..98fcc07 100644
--- a/Platform/Marvell/Include/Protocol/Spi.h
+++ b/Platform/Marvell/Include/Protocol/Spi.h
@@ -88,6 +88,7 @@ typedef
SPI_DEVICE *
(EFIAPI *MV_SPI_SETUP_DEVICE) (
IN MARVELL_SPI_MASTER_PROTOCOL *This,
+ IN SPI_DEVICE *Slave,
IN UINTN Cs,
IN SPI_MODE Mode
);
--
2.7.4
next prev parent reply other threads:[~2017-11-03 17:53 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-03 17:57 [platforms: PATCH v2 0/6] Armada 7k/8k SPI improvements pt 2 Marcin Wojtas
2017-11-03 17:57 ` [platforms: PATCH v2 1/6] Marvell/Drivers: MvSpiFlash: Improve ReadId Marcin Wojtas
2017-11-03 17:57 ` [platforms: PATCH v2 2/6] Marvell/Drivers: MvSpiFlash: Enable dynamic SPI Flash detection Marcin Wojtas
2017-11-03 17:57 ` [platforms: PATCH v2 3/6] Marvell/Drivers: MvSpiFlash: Remove duplicated macros Marcin Wojtas
2017-11-03 17:57 ` Marcin Wojtas [this message]
2017-11-03 17:57 ` [platforms: PATCH v2 5/6] Marvell/Drivers: MvSpiFlash: Fix bank selection for Spansion Marcin Wojtas
2017-11-03 17:57 ` [platforms: PATCH v2 6/6] Marvell/Drivers: MvSpiDxe: Keep data in SPI_DEVICE structure Marcin Wojtas
2017-11-05 6:13 ` [platforms: PATCH v2 0/6] Armada 7k/8k SPI improvements pt 2 Leif Lindholm
2017-11-05 7:51 ` Marcin Wojtas
2017-11-07 17:21 ` Leif Lindholm
2017-11-07 18:10 ` Marcin Wojtas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1509731835-5664-5-git-send-email-mw@semihalf.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox