public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [platforms PATCH v2 0/5] Armada capsule support
@ 2018-06-04  5:29 Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 1/5] Marvell/Armada70x0Db: Shift main FV from 0x0 address Marcin Wojtas
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04  5:29 UTC (permalink / raw)
  To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jinghua, jaz, davidsn

Hi,

This is a second version of the Marvell Armada SoCs capsule support.
There are 2 main changes - hiding PEI stack and heap base inside
reserved DRAM region and introducing Progress API handling.
More details can be found in the commit logs and a changelog
below.

The code is also available in the github:
https://github.com/MarvellEmbeddedProcessors/edk2-open-platform/commits/capsule-upstream-r20180604

I am looking forward to the comments/remarks.

Best regards,
Marcin

Changelog:
v1 -> v2:
1/5
  * Add RB
2/5
  * Move PEI stack base to the end of 2MB region reserved for ARM-TF PSCI
3/5
  * New patch adding progress API usage in SPI flash protocol
4/5
  * Add PerformFlashWriteWithProgress

David Sniatkiwicz (1):
  Marvell/Armada7k8k: Introduce capsule FW update implementation

Marcin Wojtas (4):
  Marvell/Armada70x0Db: Shift main FV from 0x0 address
  Marvell/Aramda7k8k: Enable PEI booting stage
  Marvell/Drivers: MvSpiFlashDxe: Add progress API
  Marvell/Armada7k8k: Wire up capsule support

 Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf                                                       |  96 +++++-
 Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc                                                |  46 +++
 Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf                                                |  70 +++++
 Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc                                                        |  81 ++++-
 Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.c           | 329 ++++++++++++++++++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf         |  52 ++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc    |  81 +++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf     |  50 +++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c    |  74 +++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini |  26 ++
 Silicon/Marvell/Drivers/Spi/MvSpiFlashDxe/MvSpiFlashDxe.c                                            |  60 ++++
 Silicon/Marvell/Include/Protocol/SpiFlash.h                                                          |  14 +
 12 files changed, 971 insertions(+), 8 deletions(-)
 create mode 100644 Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
 create mode 100644 Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
 create mode 100644 Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.c
 create mode 100644 Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf
 create mode 100644 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
 create mode 100644 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
 create mode 100644 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
 create mode 100644 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini

-- 
2.7.4



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [platforms PATCH v2 1/5] Marvell/Armada70x0Db: Shift main FV from 0x0 address
  2018-06-04  5:29 [platforms PATCH v2 0/5] Armada capsule support Marcin Wojtas
@ 2018-06-04  5:29 ` Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 2/5] Marvell/Aramda7k8k: Enable PEI booting stage Marcin Wojtas
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04  5:29 UTC (permalink / raw)
  To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jinghua, jaz, davidsn

When using PEI phase, UEFI interprets 0x0 address
of boot FV as an error. In order to avoid it, shift
it to 0x1000 and put a hardcoded 'jump to 0x1000' at
offset 0x0. This patch is a preparation for using PEI
by Armada platforms.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
index befb107..69cb4cd 100644
--- a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
+++ b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
@@ -49,7 +49,21 @@ NumBlocks     = 0x400
 #
 ################################################################################
 
-0x00000000|0x00100000
+#
+# UEFI has trouble dealing with FVs that reside at physical address 0x0.
+# So instead, put a hardcoded 'jump to 0x1000' at offset 0x0, and put the
+# real FV at offset 0x1000
+#
+0x00000000|0x00001000
+DATA = {
+!if $(ARCH) == AARCH64
+  0x00, 0x04, 0x00, 0x14   # 'b 0x1000' in AArch64 ASM
+!else
+  0xfe, 0x03, 0x00, 0xea   # 'b 0x1000' in AArch32 ASM
+!endif
+}
+
+0x00001000|0x000ff000
 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
 FV = FVMAIN_COMPACT
 
@@ -191,7 +205,6 @@ FvNameGuid         = 5eda4200-2c5f-43cb-9da3-0baf74b1b30c
 # PEI phase firmware volume
 [FV.FVMAIN_COMPACT]
 FvAlignment        = 8
-FvForceRebase      = TRUE
 ERASE_POLARITY     = 1
 MEMORY_MAPPED      = TRUE
 STICKY_WRITE       = TRUE
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [platforms PATCH v2 2/5] Marvell/Aramda7k8k: Enable PEI booting stage
  2018-06-04  5:29 [platforms PATCH v2 0/5] Armada capsule support Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 1/5] Marvell/Armada70x0Db: Shift main FV from 0x0 address Marcin Wojtas
@ 2018-06-04  5:29 ` Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 3/5] Marvell/Drivers: MvSpiFlashDxe: Add progress API Marcin Wojtas
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04  5:29 UTC (permalink / raw)
  To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jinghua, jaz, davidsn

PEI phase will allow to use more robust platform initialization,
with new features like the capsule support. Wire up all
dependencies for that purpose.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf | 15 ++++++--
 Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc  | 40 ++++++++++++++++++--
 2 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
index 69cb4cd..bf04f4d 100644
--- a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
+++ b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
@@ -63,7 +63,7 @@ DATA = {
 !endif
 }
 
-0x00001000|0x000ff000
+0x00001000|0x001ff000
 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
 FV = FVMAIN_COMPACT
 
@@ -221,7 +221,14 @@ READ_STATUS        = TRUE
 READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE
 
-  INF ArmPlatformPkg/PrePi/PeiUniCore.inf
+  INF ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf
+  INF MdeModulePkg/Core/Pei/PeiMain.inf
+  INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
+  INF ArmPlatformPkg/PlatformPei/PlatformPeim.inf
+  INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
+  INF ArmPkg/Drivers/CpuPei/CpuPei.inf
+  INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+  INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
   FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
     SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
@@ -264,14 +271,14 @@ READ_LOCK_STATUS   = TRUE
 
 [Rule.Common.PEI_CORE]
   FILE PEI_CORE = $(NAMED_GUID) {
-    TE     TE                           $(INF_OUTPUT)/$(MODULE_NAME).efi
+    TE     TE Align = Auto              $(INF_OUTPUT)/$(MODULE_NAME).efi
     UI     STRING ="$(MODULE_NAME)" Optional
   }
 
 [Rule.Common.PEIM]
   FILE PEIM = $(NAMED_GUID) {
      PEI_DEPEX PEI_DEPEX Optional       $(INF_OUTPUT)/$(MODULE_NAME).depex
-     TE       TE                        $(INF_OUTPUT)/$(MODULE_NAME).efi
+     TE       TE Align = Auto           $(INF_OUTPUT)/$(MODULE_NAME).efi
      UI       STRING="$(MODULE_NAME)" Optional
   }
 
diff --git a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
index 4129742..8fb912b 100644
--- a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
+++ b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
@@ -145,13 +145,28 @@
   MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf
   HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf
   PrePiHobListPointerLib|ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf
-  PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf
   ArmGicArchLib|ArmPkg/Library/ArmGicArchSecLib/ArmGicArchSecLib.inf
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 
 [LibraryClasses.common.SEC, LibraryClasses.common.PEIM]
-  MemoryInitPeiLib|Silicon/Marvell/Armada7k8k/Library/Armada7k8kMemoryInitPeiLib/Armada7k8kMemoryInitPeiLib.inf
   BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+  PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf
+
+[LibraryClasses.common.PEI_CORE, LibraryClasses.common.PEIM]
+  PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
+  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+  HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
+  PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
+  MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
+  ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
+  PeiServicesTablePointerLib|ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
+
+[LibraryClasses.common.PEI_CORE]
+  PeiCoreEntryPoint|MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf
+
+[LibraryClasses.common.PEIM]
+  PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
+  MemoryInitPeiLib|Silicon/Marvell/Armada7k8k/Library/Armada7k8kMemoryInitPeiLib/Armada7k8kMemoryInitPeiLib.inf
 
 [LibraryClasses.common.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -336,8 +351,13 @@
   # ARM Pcds
   gArmTokenSpaceGuid.PcdSystemMemoryBase|0
   gArmTokenSpaceGuid.PcdSystemMemorySize|0x40000000
+
+  gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|36
   gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize|36
 
+  gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase|0x41F0000
+  gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize|0x10000
+
   # Secure region reservation
   gMarvellTokenSpaceGuid.PcdSecureRegionBase|0x4000000
   gMarvellTokenSpaceGuid.PcdSecureRegionSize|0x0200000
@@ -364,7 +384,21 @@
 [Components.common]
 
   # PEI Phase modules
-  ArmPlatformPkg/PrePi/PeiUniCore.inf
+  ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf
+  MdeModulePkg/Core/Pei/PeiMain.inf
+  MdeModulePkg/Universal/PCD/Pei/Pcd.inf {
+    <LibraryClasses>
+      PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+  }
+  ArmPlatformPkg/PlatformPei/PlatformPeim.inf
+  ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
+  ArmPkg/Drivers/CpuPei/CpuPei.inf
+  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+  }
+
 
   # DXE
   MdeModulePkg/Core/Dxe/DxeMain.inf {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [platforms PATCH v2 3/5] Marvell/Drivers: MvSpiFlashDxe: Add progress API
  2018-06-04  5:29 [platforms PATCH v2 0/5] Armada capsule support Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 1/5] Marvell/Armada70x0Db: Shift main FV from 0x0 address Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 2/5] Marvell/Aramda7k8k: Enable PEI booting stage Marcin Wojtas
@ 2018-06-04  5:29 ` Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 4/5] Marvell/Armada7k8k: Introduce capsule FW update implementation Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support Marcin Wojtas
  4 siblings, 0 replies; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04  5:29 UTC (permalink / raw)
  To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jinghua, jaz, davidsn

In order to support new API of the PlatformFlashAccessLib, which
passes and optional Progress() function, introduce new callback
for updating data in the SPI flash, that can utilize it.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 Silicon/Marvell/Drivers/Spi/MvSpiFlashDxe/MvSpiFlashDxe.c | 60 ++++++++++++++++++++
 Silicon/Marvell/Include/Protocol/SpiFlash.h               | 14 +++++
 2 files changed, 74 insertions(+)

diff --git a/Silicon/Marvell/Drivers/Spi/MvSpiFlashDxe/MvSpiFlashDxe.c b/Silicon/Marvell/Drivers/Spi/MvSpiFlashDxe/MvSpiFlashDxe.c
index a2ce975..d81f6e3 100755
--- a/Silicon/Marvell/Drivers/Spi/MvSpiFlashDxe/MvSpiFlashDxe.c
+++ b/Silicon/Marvell/Drivers/Spi/MvSpiFlashDxe/MvSpiFlashDxe.c
@@ -397,6 +397,65 @@ MvSpiFlashUpdate (
 }
 
 EFI_STATUS
+MvSpiFlashUpdateWithProgress (
+  IN SPI_DEVICE                                    *Slave,
+  IN UINT32                                         Offset,
+  IN UINTN                                          ByteCount,
+  IN UINT8                                         *Buffer,
+  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,        OPTIONAL
+  IN UINTN                                          StartPercentage,
+  IN UINTN                                          EndPercentage
+  )
+{
+  EFI_STATUS Status;
+  UINTN SectorSize;
+  UINTN SectorNum;
+  UINTN ToUpdate;
+  UINTN Index;
+  UINT8 *TmpBuf;
+
+  SectorSize = Slave->Info->SectorSize;
+  SectorNum = ByteCount / SectorSize;
+  ToUpdate = SectorSize;
+
+  TmpBuf = (UINT8 *)AllocateZeroPool (SectorSize);
+  if (TmpBuf == NULL) {
+    DEBUG ((DEBUG_ERROR, "%a: Cannot allocate memory\n", __FUNCTION__));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  for (Index = 0; Index < SectorNum; Index++) {
+    if (Progress != NULL) {
+      Progress (StartPercentage +
+                ((Index * (EndPercentage - StartPercentage)) / SectorNum));
+    }
+
+    // In the last chunk update only an actual number of remaining bytes.
+    if (Index + 1 == SectorNum) {
+      ToUpdate = ByteCount % SectorSize;
+    }
+
+    Status = MvSpiFlashUpdateBlock (Slave,
+               Offset + Index * SectorSize,
+               ToUpdate,
+               Buffer + Index * SectorSize,
+               TmpBuf,
+               SectorSize);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "%a: Error while updating\n", __FUNCTION__));
+      return Status;
+    }
+  }
+  FreePool (TmpBuf);
+
+  if (Progress != NULL) {
+    Progress (EndPercentage);
+  }
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
 EFIAPI
 MvSpiFlashReadId (
   IN     SPI_DEVICE *SpiDev,
@@ -500,6 +559,7 @@ MvSpiFlashInitProtocol (
   SpiFlashProtocol->Write = MvSpiFlashWrite;
   SpiFlashProtocol->Erase = MvSpiFlashErase;
   SpiFlashProtocol->Update = MvSpiFlashUpdate;
+  SpiFlashProtocol->UpdateWithProgress = MvSpiFlashUpdateWithProgress;
 
   return EFI_SUCCESS;
 }
diff --git a/Silicon/Marvell/Include/Protocol/SpiFlash.h b/Silicon/Marvell/Include/Protocol/SpiFlash.h
index 4ba29ba..e703330 100644
--- a/Silicon/Marvell/Include/Protocol/SpiFlash.h
+++ b/Silicon/Marvell/Include/Protocol/SpiFlash.h
@@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef __MV_SPI_FLASH__
 #define __MV_SPI_FLASH__
 
+#include <Protocol/FirmwareManagement.h>
 #include <Protocol/Spi.h>
 
 extern EFI_GUID gMarvellSpiFlashProtocolGuid;
@@ -89,6 +90,18 @@ EFI_STATUS
   IN UINT8      *Buffer
   );
 
+typedef
+EFI_STATUS
+(EFIAPI *MV_SPI_FLASH_UPDATE_WITH_PROGRESS) (
+  IN SPI_DEVICE                                    *Slave,
+  IN UINT32                                         Offset,
+  IN UINTN                                          ByteCount,
+  IN UINT8                                         *Buffer,
+  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,        OPTIONAL
+  IN UINTN                                          StartPercentage,
+  IN UINTN                                          EndPercentage
+  );
+
 struct _MARVELL_SPI_FLASH_PROTOCOL {
   MV_SPI_FLASH_INIT    Init;
   MV_SPI_FLASH_READ_ID ReadId;
@@ -96,6 +109,7 @@ struct _MARVELL_SPI_FLASH_PROTOCOL {
   MV_SPI_FLASH_WRITE   Write;
   MV_SPI_FLASH_ERASE   Erase;
   MV_SPI_FLASH_UPDATE  Update;
+  MV_SPI_FLASH_UPDATE_WITH_PROGRESS  UpdateWithProgress;
 };
 
 #endif // __MV_SPI_FLASH__
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [platforms PATCH v2 4/5] Marvell/Armada7k8k: Introduce capsule FW update implementation
  2018-06-04  5:29 [platforms PATCH v2 0/5] Armada capsule support Marcin Wojtas
                   ` (2 preceding siblings ...)
  2018-06-04  5:29 ` [platforms PATCH v2 3/5] Marvell/Drivers: MvSpiFlashDxe: Add progress API Marcin Wojtas
@ 2018-06-04  5:29 ` Marcin Wojtas
  2018-06-04  5:29 ` [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support Marcin Wojtas
  4 siblings, 0 replies; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04  5:29 UTC (permalink / raw)
  To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jinghua, jaz, davidsn

From: David Sniatkiwicz <davidsn@marvell.com>

This patch adds necessary code that allows to update
firmware on Armada7k8k platforms, using generic gRT->UpdateCapsule,
i.e.
  * PlatformFlashAccessLib implementation to write data to SPI flash
  * SystemFirmwareDescriptor for FMP protocol
  * SystemFirmwareUpdateConfig to specify binary description
    within SystemFirmwareFile

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: David Sniatkiwicz <davidsn@marvell.com>
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.c           | 329 ++++++++++++++++++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf         |  52 ++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc    |  81 +++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf     |  50 +++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c    |  74 +++++
 Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini |  26 ++
 6 files changed, 612 insertions(+)

diff --git a/Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.c b/Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.c
new file mode 100644
index 0000000..f62cf57
--- /dev/null
+++ b/Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.c
@@ -0,0 +1,329 @@
+/** @file
+  Platform flash device access library for Marvell Armada 7k8k Platforms
+
+  Copyright (c) 2018 Marvell International Ltd.<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
+  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 <PiDxe.h>
+
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PlatformFlashAccessLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+#include <Protocol/Spi.h>
+#include <Protocol/SpiFlash.h>
+
+#define MAIN_HDR_MAGIC        0xB105B002
+
+STATIC MARVELL_SPI_FLASH_PROTOCOL *SpiFlashProtocol;
+STATIC MARVELL_SPI_MASTER_PROTOCOL *SpiMasterProtocol;
+
+typedef struct {              // Bytes
+  UINT32  Magic;              //  0-3
+  UINT32  PrologSize;         //  4-7
+  UINT32  PrologChecksum;     //  8-11
+  UINT32  BootImageSize;      // 12-15
+  UINT32  BootImageChecksum;  // 16-19
+  UINT32  Reserved0;          // 20-23
+  UINT32  LoadAddr;           // 24-27
+  UINT32  ExecAddr;           // 28-31
+  UINT8   UartConfig;         //  32
+  UINT8   Baudrate;           //  33
+  UINT8   ExtCount;           //  34
+  UINT8   AuxFlags;           //  35
+  UINT32  IoArg0;             // 36-39
+  UINT32  IoArg1;             // 40-43
+  UINT32  IoArg2;             // 43-47
+  UINT32  IoArg3;             // 48-51
+  UINT32  Reserved1;          // 52-55
+  UINT32  Reserved2;          // 56-59
+  UINT32  Reserved3;          // 60-63
+} MV_FIRMWARE_IMAGE_HEADER;
+
+STATIC
+EFI_STATUS
+SpiFlashProbe (
+  IN SPI_DEVICE    *SpiFlash
+  )
+{
+  EFI_STATUS       Status;
+
+  // Read SPI flash ID
+  Status = SpiFlashProtocol->ReadId (SpiFlash, FALSE);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = SpiFlashProtocol->Init (SpiFlashProtocol, SpiFlash);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: Cannot initialize flash device\n", __FUNCTION__));
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+CheckImageHeader (
+  IN OUT VOID     *ImageBuffer
+  )
+{
+  MV_FIRMWARE_IMAGE_HEADER *Header;
+  UINT32 HeaderLength, Checksum, ChecksumBackup;
+
+  Header = (MV_FIRMWARE_IMAGE_HEADER *)ImageBuffer;
+  HeaderLength = Header->PrologSize;
+  ChecksumBackup = Header->PrologChecksum;
+
+  // Compare magic number
+  if (Header->Magic != MAIN_HDR_MAGIC) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: Bad Image magic 0x%08x != 0x%08x\n",
+      __FUNCTION__,
+      Header->Magic,
+      MAIN_HDR_MAGIC));
+    return EFI_VOLUME_CORRUPTED;
+  }
+
+  // The checksum field is discarded from calculation
+  Header->PrologChecksum = 0;
+
+  Checksum = CalculateSum32 ((UINT32 *)Header, HeaderLength);
+  if (Checksum != ChecksumBackup) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: Bad Image checksum. 0x%x != 0x%x\n",
+      __FUNCTION__,
+      Checksum,
+      ChecksumBackup));
+    return EFI_VOLUME_CORRUPTED;
+  }
+
+  // Restore checksum backup
+  Header->PrologChecksum = ChecksumBackup;
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Perform flash write operation with progress indicator.  The start and end
+  completion percentage values are passed into this function.  If the requested
+  flash write operation is broken up, then completion percentage between the
+  start and end values may be passed to the provided Progress function.  The
+  caller of this function is required to call the Progress function for the
+  start and end completion percentage values.  This allows the Progress,
+  StartPercentage, and EndPercentage parameters to be ignored if the requested
+  flash write operation can not be broken up
+
+  @param[in] FirmwareType      The type of firmware.
+  @param[in] FlashAddress      The address of flash device to be accessed.
+  @param[in] FlashAddressType  The type of flash device address.
+  @param[in] Buffer            The pointer to the data buffer.
+  @param[in] Length            The length of data buffer in bytes.
+  @param[in] Progress          A function used report the progress of the
+                               firmware update.  This is an optional parameter
+                               that may be NULL.
+  @param[in] StartPercentage   The start completion percentage value that may
+                               be used to report progress during the flash
+                               write operation.
+  @param[in] EndPercentage     The end completion percentage value that may
+                               be used to report progress during the flash
+                               write operation.
+
+  @retval EFI_SUCCESS           The operation returns successfully.
+  @retval EFI_WRITE_PROTECTED   The flash device is read only.
+  @retval EFI_UNSUPPORTED       The flash device access is unsupported.
+  @retval EFI_INVALID_PARAMETER The input parameter is not valid.
+**/
+EFI_STATUS
+EFIAPI
+PerformFlashWriteWithProgress (
+  IN PLATFORM_FIRMWARE_TYPE                         FirmwareType,
+  IN EFI_PHYSICAL_ADDRESS                           FlashAddress,
+  IN FLASH_ADDRESS_TYPE                             FlashAddressType,
+  IN VOID                                           *Buffer,
+  IN UINTN                                          Length,
+  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,        OPTIONAL
+  IN UINTN                                          StartPercentage,
+  IN UINTN                                          EndPercentage
+  )
+{
+  EFI_STATUS              Status;
+  VOID                    *ImageBuffer;
+  SPI_DEVICE              *SpiFlash = NULL;
+  BOOLEAN                 BufferAligned = TRUE;
+
+  // Verify Firmware data
+  if (FlashAddressType != FlashAddressTypeAbsoluteAddress) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: only FlashAddressTypeAbsoluteAddress supported\n",
+      __FUNCTION__));
+
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (FirmwareType != PlatformFirmwareTypeSystemFirmware) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: only PlatformFirmwareTypeSystemFirmware supported\n",
+      __FUNCTION__));
+
+    return EFI_INVALID_PARAMETER;
+  }
+
+  // Locate SPI protocols
+  Status = gBS->LocateProtocol (&gMarvellSpiFlashProtocolGuid,
+                  NULL,
+                  (VOID **)&SpiFlashProtocol);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: Cannot locate SpiFlash protocol\n",
+      __FUNCTION__));
+    return Status;
+  }
+
+  Status = gBS->LocateProtocol (&gMarvellSpiMasterProtocolGuid,
+                  NULL,
+                  (VOID **)&SpiMasterProtocol);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: Cannot locate SpiMaster protocol\n",
+      __FUNCTION__));
+    return Status;
+  }
+
+  //
+  // Counting checksum in the header verification requires
+  // the buffer address alignment.
+  // It is not guaranteed by the generic capsule handling code,
+  // so use an auxiliary buffer in such case.
+  //
+  if (((UINTN) Buffer & 0x3) != 0) {
+    ImageBuffer = AllocateCopyPool (Length, Buffer);
+    if (ImageBuffer == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+    BufferAligned = FALSE;
+  } else {
+    ImageBuffer = Buffer;
+  }
+
+  // Check image checksum and magic
+  Status = CheckImageHeader (ImageBuffer);
+  if (EFI_ERROR (Status)) {
+    goto HeaderError;
+  }
+
+  // Setup and probe SPI flash
+  SpiFlash = SpiMasterProtocol->SetupDevice (SpiMasterProtocol,
+                                  SpiFlash,
+                                  PcdGet32 (PcdSpiFlashCs),
+                                  PcdGet32 (PcdSpiFlashMode));
+  if (SpiFlash == NULL) {
+    DEBUG ((DEBUG_ERROR, "%a: Cannot allocate SPI device!\n", __FUNCTION__));
+    Status = EFI_DEVICE_ERROR;
+    goto HeaderError;
+  }
+
+  Status = SpiFlashProbe (SpiFlash);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: Error while performing SPI flash probe\n",
+      __FUNCTION__));
+    goto FlashProbeError;
+  }
+
+  // Update firmware image in flash
+  if (Progress != NULL) {
+    Status = SpiFlashProtocol->UpdateWithProgress (SpiFlash,
+                                 FlashAddress,
+                                 Length,
+                                 (UINT8 *)ImageBuffer,
+                                 Progress,
+                                 StartPercentage,
+                                 EndPercentage);
+  } else {
+    Status = SpiFlashProtocol->Update (SpiFlash,
+                                 FlashAddress,
+                                 Length,
+                                 (UINT8 *)ImageBuffer);
+  }
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR,
+      "%a: Error while performing flash update\n",
+      __FUNCTION__));
+    goto FlashProbeError;
+  }
+
+  DEBUG ((DEBUG_ERROR,
+    "%a: Update %d bytes at offset 0x%x succeeded!\n",
+    __FUNCTION__,
+    FlashAddress,
+    Length));
+
+  // Release resources
+  SpiMasterProtocol->FreeDevice (SpiFlash);
+
+  if (!BufferAligned) {
+    FreePool (ImageBuffer);
+  }
+
+  return EFI_SUCCESS;
+
+FlashProbeError:
+  SpiMasterProtocol->FreeDevice (SpiFlash);
+HeaderError:
+  if (!BufferAligned) {
+    FreePool (ImageBuffer);
+  }
+
+  return Status;
+}
+
+/**
+  Perform flash write operation.
+
+  @param[in] FirmwareType      The type of firmware.
+  @param[in] FlashAddress      The address of flash device to be accessed.
+  @param[in] FlashAddressType  The type of flash device address.
+  @param[in] Buffer            The pointer to the data buffer.
+  @param[in] Length            The length of data buffer in bytes.
+
+  @retval EFI_SUCCESS           The operation returns successfully.
+  @retval EFI_WRITE_PROTECTED   The flash device is read only.
+  @retval EFI_UNSUPPORTED       The flash device access is unsupported.
+  @retval EFI_INVALID_PARAMETER The input parameter is not valid.
+**/
+EFI_STATUS
+EFIAPI
+PerformFlashWrite (
+  IN PLATFORM_FIRMWARE_TYPE       FirmwareType,
+  IN EFI_PHYSICAL_ADDRESS         FlashAddress,
+  IN FLASH_ADDRESS_TYPE           FlashAddressType,
+  IN VOID                         *Buffer,
+  IN UINTN                        Length
+  )
+{
+  return PerformFlashWriteWithProgress (
+           FirmwareType,
+           FlashAddress,
+           FlashAddressType,
+           Buffer,
+           Length,
+           NULL,
+           0,
+           0
+           );
+}
diff --git a/Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf b/Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf
new file mode 100644
index 0000000..fd94759
--- /dev/null
+++ b/Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf
@@ -0,0 +1,52 @@
+## @file
+#  Platform flash device access library.
+#
+#  Copyright (c) 2017, Linaro, Ltd. All rights reserved.<BR>
+#  Copyright (c) 2018, Marvell International, 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
+#  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.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010019
+  BASE_NAME                      = PlatformFlashAccessLib
+  FILE_GUID                      = c3f314d8-2995-4f0c-a8d6-e10298de4bde
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PlatformFlashAccessLib|DXE_DRIVER
+
+[Sources]
+  PlatformFlashAccessLib.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  SignedCapsulePkg/SignedCapsulePkg.dec
+  Silicon/Marvell/Marvell.dec
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+  DxeServicesTableLib
+  MemoryAllocationLib
+  PcdLib
+  UefiBootServicesTableLib
+  UefiLib
+  UefiRuntimeServicesTableLib
+
+[Pcd]
+ gMarvellTokenSpaceGuid.PcdSpiFlashCs
+ gMarvellTokenSpaceGuid.PcdSpiFlashMode
+
+[Protocols]
+ gMarvellSpiFlashProtocolGuid
+ gMarvellSpiMasterProtocolGuid
diff --git a/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
new file mode 100644
index 0000000..fbccdc2
--- /dev/null
+++ b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
@@ -0,0 +1,81 @@
+/** @file
+  System Firmware descriptor.
+
+  Copyright (c) 2018, Marvell International Limited. All rights reserved.
+  Copyright (c) 2018, Linaro Limited. All rights reserved.
+  Copyright (c) 2016, Intel Corporation. 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
+  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 <PiPei.h>
+#include <Guid/EdkiiSystemFmpCapsule.h>
+#include <Protocol/FirmwareManagement.h>
+
+#define PACKAGE_VERSION                     0xFFFFFFFF
+#define PACKAGE_VERSION_STRING              L"Unknown"
+
+#define CURRENT_FIRMWARE_VERSION            0x00000002
+#define CURRENT_FIRMWARE_VERSION_STRING     L"0x00000002"
+#define LOWEST_SUPPORTED_FIRMWARE_VERSION   0x00000001
+
+#define IMAGE_ID                            SIGNATURE_64('M','V','E', 'B', 'U', '_', 'I', 'D')
+#define IMAGE_ID_STRING                     L"MvebuPlatform"
+
+// PcdSystemFmpCapsuleImageTypeIdGuid
+#define IMAGE_TYPE_ID_GUID                  { 0x757fc475, 0x6b22, 0x4482, { 0x86, 0x8e, 0xde, 0xd2, 0x86, 0xf3, 0x09, 0x40 } }
+
+typedef struct {
+  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  Descriptor;
+  // real string data
+  CHAR16                                  ImageIdNameStr[ARRAY_SIZE (IMAGE_ID_STRING)];
+  CHAR16                                  VersionNameStr[ARRAY_SIZE (CURRENT_FIRMWARE_VERSION_STRING)];
+  CHAR16                                  PackageVersionNameStr[ARRAY_SIZE (PACKAGE_VERSION_STRING)];
+} IMAGE_DESCRIPTOR;
+
+IMAGE_DESCRIPTOR mImageDescriptor =
+{
+  {
+    EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE,
+    sizeof (EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR),
+    sizeof (IMAGE_DESCRIPTOR),
+    PACKAGE_VERSION,                                       // PackageVersion
+    OFFSET_OF (IMAGE_DESCRIPTOR, PackageVersionNameStr),   // PackageVersionName
+    1,                                                     // ImageIndex;
+    {0x0},                                                 // Reserved
+    IMAGE_TYPE_ID_GUID,                                    // ImageTypeId;
+    IMAGE_ID,                                              // ImageId;
+    OFFSET_OF (IMAGE_DESCRIPTOR, ImageIdNameStr),          // ImageIdName;
+    CURRENT_FIRMWARE_VERSION,                              // Version;
+    OFFSET_OF (IMAGE_DESCRIPTOR, VersionNameStr),          // VersionName;
+    {0x0},                                                 // Reserved2
+    FixedPcdGet32 (PcdFdSize),                             // Size;
+    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
+      IMAGE_ATTRIBUTE_RESET_REQUIRED |
+      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
+      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSupported;
+    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
+      IMAGE_ATTRIBUTE_RESET_REQUIRED |
+      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
+      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSetting;
+    0x0,                                                   // Compatibilities;
+    LOWEST_SUPPORTED_FIRMWARE_VERSION,                     // LowestSupportedImageVersion;
+    0x00000000,                                            // LastAttemptVersion;
+    0,                                                     // LastAttemptStatus;
+    {0x0},                                                 // Reserved3
+    0,                                                     // HardwareInstance;
+  },
+  // real string data
+  {IMAGE_ID_STRING},
+  {CURRENT_FIRMWARE_VERSION_STRING},
+  {PACKAGE_VERSION_STRING},
+};
+
+VOID* CONST ReferenceAcpiTable = &mImageDescriptor;
diff --git a/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
new file mode 100644
index 0000000..e6967b2
--- /dev/null
+++ b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
@@ -0,0 +1,50 @@
+## @file
+#  System Firmware descriptor.
+#
+#  Copyright (c) 2018, Marvell International Limited. All rights reserved.
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.
+#  Copyright (c) 2016, Intel Corporation. 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
+#  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.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = SystemFirmwareDescriptor
+  FILE_GUID                      = 90B2B846-CA6D-4D6E-A8D3-C140A8E110AC
+  MODULE_TYPE                    = PEIM
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = SystemFirmwareDescriptorPeimEntry
+
+[Sources]
+  SystemFirmwareDescriptorPei.c
+  SystemFirmwareDescriptor.aslc
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  SignedCapsulePkg/SignedCapsulePkg.dec
+
+[LibraryClasses]
+  DebugLib
+  PcdLib
+  PeimEntryPoint
+  PeiServicesLib
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdFdSize
+
+[Pcd]
+  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor
+
+[Depex]
+  TRUE
diff --git a/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
new file mode 100644
index 0000000..c55c4d9
--- /dev/null
+++ b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
@@ -0,0 +1,74 @@
+/** @file
+  System Firmware descriptor producer.
+
+  Copyright (c) 2018, Marvell International, Ltd. All rights reserved.
+  Copyright (c) 2018, Linaro Limited. All rights reserved.
+  Copyright (c) 2016, Intel Corporation. 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
+  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 <PiPei.h>
+#include <Guid/EdkiiSystemFmpCapsule.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Protocol/FirmwareManagement.h>
+
+/**
+  Entrypoint for SystemFirmwareDescriptor PEIM.
+
+  @param[in]  FileHandle  Handle of the file being invoked.
+  @param[in]  PeiServices Describes the list of possible PEI Services.
+
+  @retval EFI_SUCCESS            PPI successfully installed.
+**/
+EFI_STATUS
+EFIAPI
+SystemFirmwareDescriptorPeimEntry (
+  IN EFI_PEI_FILE_HANDLE     FileHandle,
+  IN CONST EFI_PEI_SERVICES  **PeiServices
+  )
+{
+  EFI_STATUS                              Status;
+  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  *Descriptor;
+  UINTN                                   Size;
+  UINTN                                   Index;
+  UINT32                                  AuthenticationStatus;
+
+  //
+  // Search RAW section.
+  //
+
+  Index = 0;
+  while (TRUE) {
+    Status = PeiServicesFfsFindSectionData3 (EFI_SECTION_RAW,
+               Index,
+               FileHandle,
+               (VOID **)&Descriptor,
+               &AuthenticationStatus);
+    if (EFI_ERROR (Status)) {
+      // Should not happen, must something wrong in FDF.
+      ASSERT(FALSE);
+      return EFI_NOT_FOUND;
+    }
+    if (Descriptor->Signature == EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE) {
+      break;
+    }
+    Index++;
+  }
+
+  DEBUG ((DEBUG_INFO, "EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR size - 0x%x\n", Descriptor->Length));
+
+  Size = Descriptor->Length;
+  PcdSetPtrS (PcdEdkiiSystemFirmwareImageDescriptor, &Size, Descriptor);
+
+  return EFI_SUCCESS;
+}
diff --git a/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
new file mode 100644
index 0000000..fb0bd0b
--- /dev/null
+++ b/Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
@@ -0,0 +1,26 @@
+## @file
+#
+#  Copyright (c) 2018, Marvell International Ltd.<BR>
+#  Copyright (c) 2016, Intel Corporation. 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
+#  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.
+#
+##
+
+[Head]
+NumOfUpdate = 1
+NumOfRecovery = 0
+Update0 = MvFvMain
+
+[MvFvMain]
+FirmwareType  = 0             # SystemFirmware
+AddressType   = 1             # 0 - relative address, 1 - absolute address.
+BaseAddress   = 0x0           # Base address offset on flash
+Length        = 0x00300000    # Length, need to fix the length
+ImageOffset   = 0x00100000    # Image offset of this SystemFirmware image
+FileGuid      = b3890e02-c46b-4970-9536-57787a9e06c7  # PcdEdkiiSystemFirmwareFileGuid
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support
  2018-06-04  5:29 [platforms PATCH v2 0/5] Armada capsule support Marcin Wojtas
                   ` (3 preceding siblings ...)
  2018-06-04  5:29 ` [platforms PATCH v2 4/5] Marvell/Armada7k8k: Introduce capsule FW update implementation Marcin Wojtas
@ 2018-06-04  5:29 ` Marcin Wojtas
  2018-06-04 10:08   ` Leif Lindholm
  4 siblings, 1 reply; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04  5:29 UTC (permalink / raw)
  To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jinghua, jaz, davidsn

All required components are in place, so we can now
add all necessary dependencies to build and use capsule support
for Armada7k8k platforms. It is conditionally enabled
with '-D CAPSULE_ENABLE' flag added during build time.

Because the capsule generation must be sequential,
due to boot requirements and glueing all binaries
(BLE, ARM-TF, BL33) externally, introduce additional
.dsc and .fdf file solely for creating the capsule.
Prior to this step 'flash-image.bin' binary must be placed
under Platform/Marvell path.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
Signed-off-by: David Sniatkiwicz <davidsn@marvell.com>
---
 Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf        | 66 ++++++++++++++++++
 Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc | 46 +++++++++++++
 Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf | 70 ++++++++++++++++++++
 Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc         | 41 ++++++++++++
 4 files changed, 223 insertions(+)

diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
index bf04f4d..e5e5443 100644
--- a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
+++ b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
@@ -201,6 +201,15 @@ FvNameGuid         = 5eda4200-2c5f-43cb-9da3-0baf74b1b30c
   INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
   INF MdeModulePkg/Application/UiApp/UiApp.inf
 
+!if $(CAPSULE_ENABLE)
+  # Firmware update
+  INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
+  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
+  FILE FREEFORM = PCD(gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiPkcs7TestPublicKeyFileGuid) {
+     SECTION RAW = BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer
+     SECTION UI = "Pkcs7TestRoot"
+  }
+!endif
 
 # PEI phase firmware volume
 [FV.FVMAIN_COMPACT]
@@ -228,6 +237,11 @@ READ_LOCK_STATUS   = TRUE
   INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
   INF ArmPkg/Drivers/CpuPei/CpuPei.inf
   INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+!if $(CAPSULE_ENABLE)
+  INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
+  INF MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
+  INF RuleOverride = FMP_IMAGE_DESC Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
+!endif
   INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
   FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
@@ -236,6 +250,49 @@ READ_LOCK_STATUS   = TRUE
     }
   }
 
+!if $(CAPSULE_ENABLE)
+[FV.SystemFirmwareDescriptor]
+FvAlignment        = 8
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  INF RuleOverride = FMP_IMAGE_DESC Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
+
+[FV.CapsuleDispatchFv]
+FvAlignment        = 8
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  INF  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
+
+!endif
+
 ################################################################################
 #
 # Rules are use with the [FV] section's module INF type to define
@@ -331,3 +388,12 @@ READ_LOCK_STATUS   = TRUE
     UI     STRING ="$(MODULE_NAME)" Optional
     PE32   PE32                         $(INF_OUTPUT)/$(MODULE_NAME).efi
   }
+
+[Rule.Common.PEIM.FMP_IMAGE_DESC]
+  FILE PEIM = $(NAMED_GUID) {
+     RAW BIN                  |.acpi
+     PEI_DEPEX PEI_DEPEX Optional        $(INF_OUTPUT)/$(MODULE_NAME).depex
+     PE32      PE32    Align=4K          $(INF_OUTPUT)/$(MODULE_NAME).efi
+     UI       STRING="$(MODULE_NAME)" Optional
+     VERSION  STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+  }
diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
new file mode 100644
index 0000000..a7d1382
--- /dev/null
+++ b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
@@ -0,0 +1,46 @@
+#Copyright (C) 2018 Marvell International Ltd.
+#
+#Marvell BSD License Option
+#
+#If you received this File from Marvell, you may opt to use, redistribute and/or
+#modify this File under the following licensing terms.
+#Redistribution and use in source and binary forms, with or without modification,
+#are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Marvell nor the names of its contributors may be
+# used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+#ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+  PLATFORM_NAME                  = Armada70x0Db
+  PLATFORM_GUID                  = 982e2ab1-26ca-4617-92e6-061bd6ba9ae3
+  PLATFORM_VERSION               = 0.1
+  DSC_SPECIFICATION              = 0x00010019
+  OUTPUT_DIRECTORY               = Build/$(PLATFORM_NAME)-$(ARCH)
+  SUPPORTED_ARCHITECTURES        = AARCH64|ARM
+  BUILD_TARGETS                  = DEBUG|RELEASE
+  SKUID_IDENTIFIER               = DEFAULT
+  FLASH_DEFINITION               = Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
new file mode 100644
index 0000000..e5a9c68
--- /dev/null
+++ b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
@@ -0,0 +1,70 @@
+#
+#  Copyright (C) Marvell International Ltd. and its affiliates
+#
+#  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.
+#
+
+[FD.Armada_Capsule]
+BaseAddress   = 0x00000000 #|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
+Size          = 0x00400000 #|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
+ErasePolarity = 1
+
+0x00000000|0x00010000
+FILE = $(WORKSPACE)/$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/SYSTEMFIRMWAREDESCRIPTOR.Fv
+
+0x00100000|0x00300000
+FILE = Platform/Marvell/flash-image.bin
+
+[FV.SystemFirmwareUpdateCargo]
+FvAlignment        = 8
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  FILE RAW = b3890e02-c46b-4970-9536-57787a9e06c7 { # PcdEdkiiSystemFirmwareFileGuid
+     FD = Armada_Capsule
+  }
+
+  FILE RAW = ce57b167-b0e4-41e8-a897-5f4feb781d40 { # gEdkiiSystemFmpCapsuleDriverFvFileGuid
+    $(WORKSPACE)/$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/CAPSULEDISPATCHFV.Fv
+  }
+
+  FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
+    Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
+  }
+
+[FmpPayload.FmpPayloadSystemFirmwarePkcs7]
+IMAGE_HEADER_INIT_VERSION = 0x02
+IMAGE_TYPE_ID             = 757fc475-6b22-4482-868e-ded286f30940 # PcdSystemFmpCapsuleImageTypeIdGuid
+IMAGE_INDEX               = 0x1
+HARDWARE_INSTANCE         = 0x0
+MONOTONIC_COUNT           = 0x1
+CERTIFICATE_GUID          = 4AAFD29D-68DF-49EE-8AA9-347D375665A7 # PKCS7
+
+  FV = SystemFirmwareUpdateCargo
+
+[Capsule.MvFirmwareUpdateCapsuleFmpPkcs7]
+CAPSULE_GUID                = 6dcbd5ed-e82d-4c44-bda1-7194199ad92a # gEfiFmpCapsuleGuid
+CAPSULE_HEADER_SIZE         = 0x20
+CAPSULE_HEADER_INIT_VERSION = 0x1
+
+  FMP_PAYLOAD = FmpPayloadSystemFirmwarePkcs7
+
diff --git a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
index 8fb912b..75fa3d4 100644
--- a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
+++ b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
@@ -42,8 +42,23 @@
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
   DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
 
+!if $(CAPSULE_ENABLE)
+  OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
+  IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
+  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
+  EdkiiSystemCapsuleLib|SignedCapsulePkg/Library/EdkiiSystemCapsuleLib/EdkiiSystemCapsuleLib.inf
+  FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
+  IniParsingLib|SignedCapsulePkg/Library/IniParsingLib/IniParsingLib.inf
+  PlatformFlashAccessLib|Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf
+!endif
+
 # Basic utility libraries
   BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+!if $(CAPSULE_ENABLE)
+  BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
+  SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
+!endif
   SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
   PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
@@ -199,7 +214,11 @@
 [LibraryClasses.common.DXE_RUNTIME_DRIVER]
   HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
   MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+!if $(CAPSULE_ENABLE)
+  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
+!else
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+!endif
 !if $(TARGET) != RELEASE
   DebugLib|MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf
 !endif
@@ -376,6 +395,13 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0xF93E0000
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00010000
 
+!if $(CAPSULE_ENABLE)
+[PcdsDynamicExDefault.common.DEFAULT]
+  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor|{0x0}|VOID*|0x100
+  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareFileGuid|{0x02, 0x0e, 0x89, 0xb3, 0x6b, 0xc4, 0x70, 0x49, 0x95, 0x36, 0x57, 0x78, 0x7a, 0x9e, 0x06, 0xc7}
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x75, 0xc4, 0x7f, 0x75, 0x22, 0x6b, 0x82, 0x44, 0x86, 0x8e, 0xde, 0xd2, 0x86, 0xf3, 0x09, 0x40}
+!endif
+
 ################################################################################
 #
 # Components Section - list of all EDK II Modules needed by this Platform
@@ -394,6 +420,11 @@
   ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
   ArmPkg/Drivers/CpuPei/CpuPei.inf
   MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+!if $(CAPSULE_ENABLE)
+  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
+  MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
+  Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
+!endif
   MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
@@ -503,6 +534,16 @@
       NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
   }
 
+!if $(CAPSULE_ENABLE)
+  MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
+  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
+  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf {
+    <LibraryClasses>
+      FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
+  }
+  MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
+!endif
+
   #
   # Variable services
   #
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support
  2018-06-04  5:29 ` [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support Marcin Wojtas
@ 2018-06-04 10:08   ` Leif Lindholm
  2018-06-04 11:44     ` Marcin Wojtas
  0 siblings, 1 reply; 8+ messages in thread
From: Leif Lindholm @ 2018-06-04 10:08 UTC (permalink / raw)
  To: Marcin Wojtas; +Cc: edk2-devel, ard.biesheuvel, jsd, jinghua, jaz, davidsn

On Mon, Jun 04, 2018 at 07:29:35AM +0200, Marcin Wojtas wrote:
> All required components are in place, so we can now
> add all necessary dependencies to build and use capsule support
> for Armada7k8k platforms. It is conditionally enabled
> with '-D CAPSULE_ENABLE' flag added during build time.
> 
> Because the capsule generation must be sequential,
> due to boot requirements and glueing all binaries
> (BLE, ARM-TF, BL33) externally, introduce additional
> .dsc and .fdf file solely for creating the capsule.
> Prior to this step 'flash-image.bin' binary must be placed
> under Platform/Marvell path.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
> Signed-off-by: David Sniatkiwicz <davidsn@marvell.com>
> ---
>  Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf        | 66 ++++++++++++++++++
>  Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc | 46 +++++++++++++
>  Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf | 70 ++++++++++++++++++++
>  Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc         | 41 ++++++++++++
>  4 files changed, 223 insertions(+)
> 
> diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
> index bf04f4d..e5e5443 100644
> --- a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
> +++ b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
> @@ -201,6 +201,15 @@ FvNameGuid         = 5eda4200-2c5f-43cb-9da3-0baf74b1b30c
>    INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
>    INF MdeModulePkg/Application/UiApp/UiApp.inf
>  
> +!if $(CAPSULE_ENABLE)
> +  # Firmware update
> +  INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
> +  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
> +  FILE FREEFORM = PCD(gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiPkcs7TestPublicKeyFileGuid) {
> +     SECTION RAW = BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer
> +     SECTION UI = "Pkcs7TestRoot"
> +  }
> +!endif
>  
>  # PEI phase firmware volume
>  [FV.FVMAIN_COMPACT]
> @@ -228,6 +237,11 @@ READ_LOCK_STATUS   = TRUE
>    INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
>    INF ArmPkg/Drivers/CpuPei/CpuPei.inf
>    INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
> +!if $(CAPSULE_ENABLE)
> +  INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
> +  INF MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
> +  INF RuleOverride = FMP_IMAGE_DESC Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> +!endif
>    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>  
>    FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
> @@ -236,6 +250,49 @@ READ_LOCK_STATUS   = TRUE
>      }
>    }
>  
> +!if $(CAPSULE_ENABLE)
> +[FV.SystemFirmwareDescriptor]
> +FvAlignment        = 8
> +ERASE_POLARITY     = 1
> +MEMORY_MAPPED      = TRUE
> +STICKY_WRITE       = TRUE
> +LOCK_CAP           = TRUE
> +LOCK_STATUS        = TRUE
> +WRITE_DISABLED_CAP = TRUE
> +WRITE_ENABLED_CAP  = TRUE
> +WRITE_STATUS       = TRUE
> +WRITE_LOCK_CAP     = TRUE
> +WRITE_LOCK_STATUS  = TRUE
> +READ_DISABLED_CAP  = TRUE
> +READ_ENABLED_CAP   = TRUE
> +READ_STATUS        = TRUE
> +READ_LOCK_CAP      = TRUE
> +READ_LOCK_STATUS   = TRUE
> +
> +  INF RuleOverride = FMP_IMAGE_DESC Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> +
> +[FV.CapsuleDispatchFv]
> +FvAlignment        = 8
> +ERASE_POLARITY     = 1
> +MEMORY_MAPPED      = TRUE
> +STICKY_WRITE       = TRUE
> +LOCK_CAP           = TRUE
> +LOCK_STATUS        = TRUE
> +WRITE_DISABLED_CAP = TRUE
> +WRITE_ENABLED_CAP  = TRUE
> +WRITE_STATUS       = TRUE
> +WRITE_LOCK_CAP     = TRUE
> +WRITE_LOCK_STATUS  = TRUE
> +READ_DISABLED_CAP  = TRUE
> +READ_ENABLED_CAP   = TRUE
> +READ_STATUS        = TRUE
> +READ_LOCK_CAP      = TRUE
> +READ_LOCK_STATUS   = TRUE
> +
> +  INF  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
> +
> +!endif
> +
>  ################################################################################
>  #
>  # Rules are use with the [FV] section's module INF type to define
> @@ -331,3 +388,12 @@ READ_LOCK_STATUS   = TRUE
>      UI     STRING ="$(MODULE_NAME)" Optional
>      PE32   PE32                         $(INF_OUTPUT)/$(MODULE_NAME).efi
>    }
> +
> +[Rule.Common.PEIM.FMP_IMAGE_DESC]
> +  FILE PEIM = $(NAMED_GUID) {
> +     RAW BIN                  |.acpi
> +     PEI_DEPEX PEI_DEPEX Optional        $(INF_OUTPUT)/$(MODULE_NAME).depex
> +     PE32      PE32    Align=4K          $(INF_OUTPUT)/$(MODULE_NAME).efi
> +     UI       STRING="$(MODULE_NAME)" Optional
> +     VERSION  STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
> +  }
> diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
> new file mode 100644
> index 0000000..a7d1382
> --- /dev/null
> +++ b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
> @@ -0,0 +1,46 @@
> +#Copyright (C) 2018 Marvell International Ltd.
> +#
> +#Marvell BSD License Option
> +#
> +#If you received this File from Marvell, you may opt to use, redistribute and/or
> +#modify this File under the following licensing terms.
> +#Redistribution and use in source and binary forms, with or without modification,
> +#are permitted provided that the following conditions are met:
> +#
> +# * Redistributions of source code must retain the above copyright notice,
> +# this list of conditions and the following disclaimer.
> +#
> +# * Redistributions in binary form must reproduce the above copyright
> +# notice, this list of conditions and the following disclaimer in the
> +# documentation and/or other materials provided with the distribution.
> +#
> +# * Neither the name of Marvell nor the names of its contributors may be
> +# used to endorse or promote products derived from this software without
> +# specific prior written permission.
> +#
> +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
> +#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
> +#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
> +#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> +#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
> +#ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> +#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +#
> +################################################################################
> +#
> +# Defines Section - statements that will be processed to create a Makefile.
> +#
> +################################################################################
> +[Defines]
> +  PLATFORM_NAME                  = Armada70x0Db
> +  PLATFORM_GUID                  = 982e2ab1-26ca-4617-92e6-061bd6ba9ae3
> +  PLATFORM_VERSION               = 0.1
> +  DSC_SPECIFICATION              = 0x00010019
> +  OUTPUT_DIRECTORY               = Build/$(PLATFORM_NAME)-$(ARCH)
> +  SUPPORTED_ARCHITECTURES        = AARCH64|ARM
> +  BUILD_TARGETS                  = DEBUG|RELEASE
> +  SKUID_IDENTIFIER               = DEFAULT
> +  FLASH_DEFINITION               = Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
> diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
> new file mode 100644
> index 0000000..e5a9c68
> --- /dev/null
> +++ b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
> @@ -0,0 +1,70 @@
> +#
> +#  Copyright (C) Marvell International Ltd. and its affiliates
> +#
> +#  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.
> +#
> +
> +[FD.Armada_Capsule]
> +BaseAddress   = 0x00000000 #|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
> +Size          = 0x00400000 #|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
> +ErasePolarity = 1
> +
> +0x00000000|0x00010000
> +FILE = $(WORKSPACE)/$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/SYSTEMFIRMWAREDESCRIPTOR.Fv
> +
> +0x00100000|0x00300000
> +FILE = Platform/Marvell/flash-image.bin

So, I'm happy with everything in this set other than the line above.
(You can take this as Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
for 1-4/5.)

Mandating magic copying into the source tree of special binaries (that
can then not be used to build separate DEBUG/RELEASE images in one
session without deleting them in the meantime) is out.

When I integrated arm-tf build support into uefi-tools, I did the
following, to allow the build artefacts to all reside within the Build
directory:
https://git.linaro.org/uefi/uefi-tools.git/tree/atf-build.sh#n201

Ard hates this, because it makes assumptions about the internals of
the EDK2 build environment not overriding things in Conf/target.txt
(which is admittedly valid when then turning edk2 back into a consumer
of the output - the above was only ever used for publishing purposes).

His preference is replacing the "Platform/Marvell/" bit with a -D
option to tell the build system in which directory to look for the
file. I could go along with that.

So the question remaining is what do we call the option?
Since this situation is likely to reappear for other platforms, let's
keep it generic. ARM_TRUSTED_FIRMWARE_IMAGE_PREFIX or suchlike.

/
    Leif

> +
> +[FV.SystemFirmwareUpdateCargo]
> +FvAlignment        = 8
> +ERASE_POLARITY     = 1
> +MEMORY_MAPPED      = TRUE
> +STICKY_WRITE       = TRUE
> +LOCK_CAP           = TRUE
> +LOCK_STATUS        = TRUE
> +WRITE_DISABLED_CAP = TRUE
> +WRITE_ENABLED_CAP  = TRUE
> +WRITE_STATUS       = TRUE
> +WRITE_LOCK_CAP     = TRUE
> +WRITE_LOCK_STATUS  = TRUE
> +READ_DISABLED_CAP  = TRUE
> +READ_ENABLED_CAP   = TRUE
> +READ_STATUS        = TRUE
> +READ_LOCK_CAP      = TRUE
> +READ_LOCK_STATUS   = TRUE
> +
> +  FILE RAW = b3890e02-c46b-4970-9536-57787a9e06c7 { # PcdEdkiiSystemFirmwareFileGuid
> +     FD = Armada_Capsule
> +  }
> +
> +  FILE RAW = ce57b167-b0e4-41e8-a897-5f4feb781d40 { # gEdkiiSystemFmpCapsuleDriverFvFileGuid
> +    $(WORKSPACE)/$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/CAPSULEDISPATCHFV.Fv
> +  }
> +
> +  FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
> +    Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
> +  }
> +
> +[FmpPayload.FmpPayloadSystemFirmwarePkcs7]
> +IMAGE_HEADER_INIT_VERSION = 0x02
> +IMAGE_TYPE_ID             = 757fc475-6b22-4482-868e-ded286f30940 # PcdSystemFmpCapsuleImageTypeIdGuid
> +IMAGE_INDEX               = 0x1
> +HARDWARE_INSTANCE         = 0x0
> +MONOTONIC_COUNT           = 0x1
> +CERTIFICATE_GUID          = 4AAFD29D-68DF-49EE-8AA9-347D375665A7 # PKCS7
> +
> +  FV = SystemFirmwareUpdateCargo
> +
> +[Capsule.MvFirmwareUpdateCapsuleFmpPkcs7]
> +CAPSULE_GUID                = 6dcbd5ed-e82d-4c44-bda1-7194199ad92a # gEfiFmpCapsuleGuid
> +CAPSULE_HEADER_SIZE         = 0x20
> +CAPSULE_HEADER_INIT_VERSION = 0x1
> +
> +  FMP_PAYLOAD = FmpPayloadSystemFirmwarePkcs7
> +
> diff --git a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
> index 8fb912b..75fa3d4 100644
> --- a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
> +++ b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc
> @@ -42,8 +42,23 @@
>    DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
>    DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
>  
> +!if $(CAPSULE_ENABLE)
> +  OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
> +  IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> +  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> +  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
> +  EdkiiSystemCapsuleLib|SignedCapsulePkg/Library/EdkiiSystemCapsuleLib/EdkiiSystemCapsuleLib.inf
> +  FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
> +  IniParsingLib|SignedCapsulePkg/Library/IniParsingLib/IniParsingLib.inf
> +  PlatformFlashAccessLib|Silicon/Marvell/Armada7k8k/Feature/Capsule/PlatformFlashAccessLib/PlatformFlashAccessLib.inf
> +!endif
> +
>  # Basic utility libraries
>    BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
> +!if $(CAPSULE_ENABLE)
> +  BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
> +  SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
> +!endif
>    SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>    PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
>    PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
> @@ -199,7 +214,11 @@
>  [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>    MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> +!if $(CAPSULE_ENABLE)
> +  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
> +!else
>    CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
> +!endif
>  !if $(TARGET) != RELEASE
>    DebugLib|MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf
>  !endif
> @@ -376,6 +395,13 @@
>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0xF93E0000
>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00010000
>  
> +!if $(CAPSULE_ENABLE)
> +[PcdsDynamicExDefault.common.DEFAULT]
> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor|{0x0}|VOID*|0x100
> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareFileGuid|{0x02, 0x0e, 0x89, 0xb3, 0x6b, 0xc4, 0x70, 0x49, 0x95, 0x36, 0x57, 0x78, 0x7a, 0x9e, 0x06, 0xc7}
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x75, 0xc4, 0x7f, 0x75, 0x22, 0x6b, 0x82, 0x44, 0x86, 0x8e, 0xde, 0xd2, 0x86, 0xf3, 0x09, 0x40}
> +!endif
> +
>  ################################################################################
>  #
>  # Components Section - list of all EDK II Modules needed by this Platform
> @@ -394,6 +420,11 @@
>    ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
>    ArmPkg/Drivers/CpuPei/CpuPei.inf
>    MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
> +!if $(CAPSULE_ENABLE)
> +  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
> +  MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
> +  Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> +!endif
>    MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
>      <LibraryClasses>
>        NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
> @@ -503,6 +534,16 @@
>        NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
>    }
>  
> +!if $(CAPSULE_ENABLE)
> +  MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
> +  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
> +  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf {
> +    <LibraryClasses>
> +      FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
> +  }
> +  MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> +!endif
> +
>    #
>    # Variable services
>    #
> -- 
> 2.7.4
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support
  2018-06-04 10:08   ` Leif Lindholm
@ 2018-06-04 11:44     ` Marcin Wojtas
  0 siblings, 0 replies; 8+ messages in thread
From: Marcin Wojtas @ 2018-06-04 11:44 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: edk2-devel-01, Ard Biesheuvel, semihalf-dabros-jan, Hua Jing,
	Grzegorz Jaszczyk, David Sniatkiwicz

Hi Leif,

2018-06-04 12:08 GMT+02:00 Leif Lindholm <leif.lindholm@linaro.org>:
>
> On Mon, Jun 04, 2018 at 07:29:35AM +0200, Marcin Wojtas wrote:
> > All required components are in place, so we can now
> > add all necessary dependencies to build and use capsule support
> > for Armada7k8k platforms. It is conditionally enabled
> > with '-D CAPSULE_ENABLE' flag added during build time.
> >
> > Because the capsule generation must be sequential,
> > due to boot requirements and glueing all binaries
> > (BLE, ARM-TF, BL33) externally, introduce additional
> > .dsc and .fdf file solely for creating the capsule.
> > Prior to this step 'flash-image.bin' binary must be placed
> > under Platform/Marvell path.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Marcin Wojtas <mw@semihalf.com>
> > Signed-off-by: David Sniatkiwicz <davidsn@marvell.com>
> > ---
> >  Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf        | 66 ++++++++++++++++++
> >  Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc | 46 +++++++++++++
> >  Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf | 70 ++++++++++++++++++++
> >  Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc         | 41 ++++++++++++
> >  4 files changed, 223 insertions(+)
> >
> > diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
> > index bf04f4d..e5e5443 100644
> > --- a/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
> > +++ b/Platform/Marvell/Armada70x0Db/Armada70x0Db.fdf
> > @@ -201,6 +201,15 @@ FvNameGuid         = 5eda4200-2c5f-43cb-9da3-0baf74b1b30c
> >    INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> >    INF MdeModulePkg/Application/UiApp/UiApp.inf
> >
> > +!if $(CAPSULE_ENABLE)
> > +  # Firmware update
> > +  INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
> > +  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
> > +  FILE FREEFORM = PCD(gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiPkcs7TestPublicKeyFileGuid) {
> > +     SECTION RAW = BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer
> > +     SECTION UI = "Pkcs7TestRoot"
> > +  }
> > +!endif
> >
> >  # PEI phase firmware volume
> >  [FV.FVMAIN_COMPACT]
> > @@ -228,6 +237,11 @@ READ_LOCK_STATUS   = TRUE
> >    INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
> >    INF ArmPkg/Drivers/CpuPei/CpuPei.inf
> >    INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
> > +!if $(CAPSULE_ENABLE)
> > +  INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
> > +  INF MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
> > +  INF RuleOverride = FMP_IMAGE_DESC Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> > +!endif
> >    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> >
> >    FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
> > @@ -236,6 +250,49 @@ READ_LOCK_STATUS   = TRUE
> >      }
> >    }
> >
> > +!if $(CAPSULE_ENABLE)
> > +[FV.SystemFirmwareDescriptor]
> > +FvAlignment        = 8
> > +ERASE_POLARITY     = 1
> > +MEMORY_MAPPED      = TRUE
> > +STICKY_WRITE       = TRUE
> > +LOCK_CAP           = TRUE
> > +LOCK_STATUS        = TRUE
> > +WRITE_DISABLED_CAP = TRUE
> > +WRITE_ENABLED_CAP  = TRUE
> > +WRITE_STATUS       = TRUE
> > +WRITE_LOCK_CAP     = TRUE
> > +WRITE_LOCK_STATUS  = TRUE
> > +READ_DISABLED_CAP  = TRUE
> > +READ_ENABLED_CAP   = TRUE
> > +READ_STATUS        = TRUE
> > +READ_LOCK_CAP      = TRUE
> > +READ_LOCK_STATUS   = TRUE
> > +
> > +  INF RuleOverride = FMP_IMAGE_DESC Silicon/Marvell/Armada7k8k/Feature/Capsule/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> > +
> > +[FV.CapsuleDispatchFv]
> > +FvAlignment        = 8
> > +ERASE_POLARITY     = 1
> > +MEMORY_MAPPED      = TRUE
> > +STICKY_WRITE       = TRUE
> > +LOCK_CAP           = TRUE
> > +LOCK_STATUS        = TRUE
> > +WRITE_DISABLED_CAP = TRUE
> > +WRITE_ENABLED_CAP  = TRUE
> > +WRITE_STATUS       = TRUE
> > +WRITE_LOCK_CAP     = TRUE
> > +WRITE_LOCK_STATUS  = TRUE
> > +READ_DISABLED_CAP  = TRUE
> > +READ_ENABLED_CAP   = TRUE
> > +READ_STATUS        = TRUE
> > +READ_LOCK_CAP      = TRUE
> > +READ_LOCK_STATUS   = TRUE
> > +
> > +  INF  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
> > +
> > +!endif
> > +
> >  ################################################################################
> >  #
> >  # Rules are use with the [FV] section's module INF type to define
> > @@ -331,3 +388,12 @@ READ_LOCK_STATUS   = TRUE
> >      UI     STRING ="$(MODULE_NAME)" Optional
> >      PE32   PE32                         $(INF_OUTPUT)/$(MODULE_NAME).efi
> >    }
> > +
> > +[Rule.Common.PEIM.FMP_IMAGE_DESC]
> > +  FILE PEIM = $(NAMED_GUID) {
> > +     RAW BIN                  |.acpi
> > +     PEI_DEPEX PEI_DEPEX Optional        $(INF_OUTPUT)/$(MODULE_NAME).depex
> > +     PE32      PE32    Align=4K          $(INF_OUTPUT)/$(MODULE_NAME).efi
> > +     UI       STRING="$(MODULE_NAME)" Optional
> > +     VERSION  STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
> > +  }
> > diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
> > new file mode 100644
> > index 0000000..a7d1382
> > --- /dev/null
> > +++ b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.dsc
> > @@ -0,0 +1,46 @@
> > +#Copyright (C) 2018 Marvell International Ltd.
> > +#
> > +#Marvell BSD License Option
> > +#
> > +#If you received this File from Marvell, you may opt to use, redistribute and/or
> > +#modify this File under the following licensing terms.
> > +#Redistribution and use in source and binary forms, with or without modification,
> > +#are permitted provided that the following conditions are met:
> > +#
> > +# * Redistributions of source code must retain the above copyright notice,
> > +# this list of conditions and the following disclaimer.
> > +#
> > +# * Redistributions in binary form must reproduce the above copyright
> > +# notice, this list of conditions and the following disclaimer in the
> > +# documentation and/or other materials provided with the distribution.
> > +#
> > +# * Neither the name of Marvell nor the names of its contributors may be
> > +# used to endorse or promote products derived from this software without
> > +# specific prior written permission.
> > +#
> > +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
> > +#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
> > +#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> > +#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
> > +#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> > +#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> > +#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
> > +#ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> > +#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> > +#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> > +#
> > +################################################################################
> > +#
> > +# Defines Section - statements that will be processed to create a Makefile.
> > +#
> > +################################################################################
> > +[Defines]
> > +  PLATFORM_NAME                  = Armada70x0Db
> > +  PLATFORM_GUID                  = 982e2ab1-26ca-4617-92e6-061bd6ba9ae3
> > +  PLATFORM_VERSION               = 0.1
> > +  DSC_SPECIFICATION              = 0x00010019
> > +  OUTPUT_DIRECTORY               = Build/$(PLATFORM_NAME)-$(ARCH)
> > +  SUPPORTED_ARCHITECTURES        = AARCH64|ARM
> > +  BUILD_TARGETS                  = DEBUG|RELEASE
> > +  SKUID_IDENTIFIER               = DEFAULT
> > +  FLASH_DEFINITION               = Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
> > diff --git a/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
> > new file mode 100644
> > index 0000000..e5a9c68
> > --- /dev/null
> > +++ b/Platform/Marvell/Armada70x0Db/Armada70x0DbCapsule.fdf
> > @@ -0,0 +1,70 @@
> > +#
> > +#  Copyright (C) Marvell International Ltd. and its affiliates
> > +#
> > +#  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.
> > +#
> > +
> > +[FD.Armada_Capsule]
> > +BaseAddress   = 0x00000000 #|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
> > +Size          = 0x00400000 #|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
> > +ErasePolarity = 1
> > +
> > +0x00000000|0x00010000
> > +FILE = $(WORKSPACE)/$(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/FV/SYSTEMFIRMWAREDESCRIPTOR.Fv
> > +
> > +0x00100000|0x00300000
> > +FILE = Platform/Marvell/flash-image.bin
>
> So, I'm happy with everything in this set other than the line above.
> (You can take this as Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
> for 1-4/5.)
>
> Mandating magic copying into the source tree of special binaries (that
> can then not be used to build separate DEBUG/RELEASE images in one
> session without deleting them in the meantime) is out.
>
> When I integrated arm-tf build support into uefi-tools, I did the
> following, to allow the build artefacts to all reside within the Build
> directory:
> https://git.linaro.org/uefi/uefi-tools.git/tree/atf-build.sh#n201
>
> Ard hates this, because it makes assumptions about the internals of
> the EDK2 build environment not overriding things in Conf/target.txt
> (which is admittedly valid when then turning edk2 back into a consumer
> of the output - the above was only ever used for publishing purposes).
>
> His preference is replacing the "Platform/Marvell/" bit with a -D
> option to tell the build system in which directory to look for the
> file. I could go along with that.
>
> So the question remaining is what do we call the option?
> Since this situation is likely to reappear for other platforms, let's
> keep it generic. ARM_TRUSTED_FIRMWARE_IMAGE_PREFIX or suchlike.
>

Sure, I think -D
ARM_TRUSTED_FIRMWARE_IMAGE_PREFIX=<path/to/flash-image.bin> would
work.

Also after internal review I was asked for a change - how about making
a common Armada7k8kCapsule.dsc / .fdf and simply pick the platform
with -D PLATFORM_NAME option?

Thanks,
Marcin


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-06-04 11:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-04  5:29 [platforms PATCH v2 0/5] Armada capsule support Marcin Wojtas
2018-06-04  5:29 ` [platforms PATCH v2 1/5] Marvell/Armada70x0Db: Shift main FV from 0x0 address Marcin Wojtas
2018-06-04  5:29 ` [platforms PATCH v2 2/5] Marvell/Aramda7k8k: Enable PEI booting stage Marcin Wojtas
2018-06-04  5:29 ` [platforms PATCH v2 3/5] Marvell/Drivers: MvSpiFlashDxe: Add progress API Marcin Wojtas
2018-06-04  5:29 ` [platforms PATCH v2 4/5] Marvell/Armada7k8k: Introduce capsule FW update implementation Marcin Wojtas
2018-06-04  5:29 ` [platforms PATCH v2 5/5] Marvell/Armada7k8k: Wire up capsule support Marcin Wojtas
2018-06-04 10:08   ` Leif Lindholm
2018-06-04 11:44     ` Marcin Wojtas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox