On Tue, Oct 31, 2017 at 04:59:33AM +0100, Marcin Wojtas wrote:
> 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.

Really an unrelated question, but would we not expect to use capsule
updates instead now? Do we have other uses for this tool?

> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Marcin Wojtas <[email protected]>
> ---
>  Platform/Marvell/Applications/FirmwareUpdate/FUpdate.c |  4 ++--
>  Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c    |  8 ++++----
>  Platform/Marvell/Drivers/Spi/MvSpiDxe.c                | 17 +++++++++--------
>  Platform/Marvell/Drivers/Spi/MvSpiDxe.h                |  1 +
>  Platform/Marvell/Include/Protocol/Spi.h                |  1 +
>  5 files changed, 17 insertions(+), 14 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..1084f68 100644
> --- a/Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c
> +++ b/Platform/Marvell/Applications/SpiTool/SpiFlashCmd.c
> @@ -191,7 +191,7 @@ ShellCommandRunSpiFlash (
>    )
>  {
>  EFI_STATUS              Status;
> -  SPI_DEVICE            *Slave;
> +  STATIC SPI_DEVICE     *Slave;

If this is a safe thing to do, please use a global variable called
mSlave instead, to make it clear that it persists across calls.

>    LIST_ENTRY            *CheckPackage;
>    EFI_PHYSICAL_ADDRESS  Address = 0, Offset = 0;
>    SHELL_FILE_HANDLE     FileHandle = NULL;
> @@ -273,7 +273,7 @@ EFI_STATUS              Status;
>    Cs = PcdGet32 (PcdSpiFlashCs);
>  
>    // Setup new spi device
> -  Slave = SpiMasterProtocol->SetupDevice (SpiMasterProtocol, Cs, Mode);
> +  Slave = SpiMasterProtocol->SetupDevice (SpiMasterProtocol, Slave, Cs, 
> Mode);
>      if (Slave == NULL) {
>        Print(L"sf: Cannot allocate SPI device!\n");
>        return SHELL_ABORTED;
> @@ -285,6 +285,8 @@ EFI_STATUS              Status;
>      Status = FlashProbe (Slave);
>      if (EFI_ERROR(Status)) {
>        // No supported spi flash detected
> +      SpiMasterProtocol->FreeDevice(Slave);

Space before (.

/
    Leif

> +      Slave = NULL;
>        return SHELL_ABORTED;
>      } else {
>        return Status;
> @@ -426,8 +428,6 @@ EFI_STATUS              Status;
>      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 93a8ec0..0cf7914 100644
> --- a/Platform/Marvell/Include/Protocol/Spi.h
> +++ b/Platform/Marvell/Include/Protocol/Spi.h
> @@ -87,6 +87,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
> 
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to