Hi Mike
It is great to see this feature. Thanks for doing this.

Some thought below:
1) Do we must add V1 as suffix for the FmpPayloadHeaderLib?
I think we can just use that FmpPayloadHeaderLib.
If we have second version, we can use FmpPayloadHeaderLibV2.

2) The check in GetFmpPayloadHeaderSize() seems weird.

  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < 
(UINTN)FmpPayloadHeader ||

If we just want to add overflow check, I suggest we use below.
  if ((UINTN)FmpPayloadHeader > (MAX_ADDRESS - sizeof (FMP_PAYLOAD_HEADER)) ||

I think it is more readable.

3) For FmpDeviceLib, the interface definition seems not consistent.

Most of them return EFI_STATUS, such as:
EFI_STATUS
EFIAPI
FmpDeviceGetLowestSupportedVersion (
  OUT UINT32  *LowestSupportedVersion
  )

But some return data directly, such as:
CHAR16 *
EFIAPI
FmpDeviceGetVersionString (
  VOID
  )

Can we make them consistent to return EFI_STATUS for all? Such as
EFI_STATUS
EFIAPI
FmpDeviceGetVersionString (
  OUT CHAR16 **VersionString
  )

4) Do we need GetPackageVersion() and GetPackageVersionName() ?

5) I found FmpDxe driver returns unsupported for GetPackageInfo() and 
SetPackageInfo().
It means that an implementation cannot use FmpDxe driver as template, if it 
wants to support those 2.

Is there any design limitation ?

6) for variable set, I do not think we need get and compare.
I think variable driver already did that for us. The caller can just set the 
variable.

VOID
SetVersionInVariable (
   UINT32  Version
  )
{
  EFI_STATUS  Status;
  UINT32      Current;

  Status = EFI_SUCCESS;

  Current = GetVersionFromVariable();
  if (Current != Version) {
    Status = gRT->SetVariable (
                    VARNAME_VERSION,
                    &gEfiCallerIdGuid,
                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
                    sizeof (Version),
                    &Version
                    );

7) for LockAllVars(), I found it only happens in non flash_update boot mode.
I think we should also do in flash_update boot mode, after the capsule is 
processed.

Or there will be a hole, for the non-reset capsule.

  //
  // If the boot mode isn't flash update then we must lock all vars.
  // If it is flash update leave them unlocked as the system will not
  // boot all the way in flash update mode
  //
  if (BOOT_ON_FLASH_UPDATE != GetBootModeHob ()) {
    LockAllVars ();
  }

8) I am surprised that we support "*" as variable name. Will it lock all 
variables with gEfiCallerIdGuid?

Status = Protocol->RequestToLock (Protocol, L"*", &gEfiCallerIdGuid);


Thank you
Yao Jiewen


> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, April 5, 2018 5:29 AM
> To: edk2-devel@lists.01.org
> Cc: Sean Brogan <sean.bro...@microsoft.com>; Yao, Jiewen
> <jiewen....@intel.com>
> Subject: [RFC 0/4] Add FmpDevicePkg
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=922
> 
> Based on content from the following branch:
> 
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsu
> leUpdatePkg
> 
> Branch for review:
> 
> https://github.com/mdkinney/edk2/tree/Bug_922_FmpDevicePkg
> 
> This package provides an implementation of a Firmware Management Protocol
> instance that supports the update of firmware storage devices using UEFI
> Capsules.  The behavior of the Firmware Management Protocol instance is
> customized using libraries and PCDs.
> 
> Cc: Sean Brogan <sean.bro...@microsoft.com>
> Cc: Jiewen Yao <jiewen....@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Michael D Kinney <michael.d.kin...@intel.com>
> 
> Kinney, Michael D (4):
>   FmpDevicePkg: Add package, library classes, and PCDs
>   FmpDevicePkg: Add library instances
>   FmpDevicePkg: Add FmpDxe module
>   FmpDevicePkg: Add DSC file to build all package components
> 
>  FmpDevicePkg/FmpDevicePkg.dec                      |  126 ++
>  FmpDevicePkg/FmpDevicePkg.dsc                      |  119 ++
>  FmpDevicePkg/FmpDevicePkg.uni                      |   75 +
>  FmpDevicePkg/FmpDevicePkgExtra.uni                 |   18 +
>  FmpDevicePkg/FmpDxe/FmpDxe.c                       | 1533
> ++++++++++++++++++++
>  FmpDevicePkg/FmpDxe/FmpDxe.inf                     |   96 ++
>  FmpDevicePkg/FmpDxe/FmpDxe.uni                     |   20 +
>  FmpDevicePkg/FmpDxe/FmpDxeExtra.uni                |   18 +
>  FmpDevicePkg/FmpDxe/FmpDxeLib.inf                  |   93 ++
>  FmpDevicePkg/FmpDxe/VariableSupport.c              |  431 ++++++
>  FmpDevicePkg/FmpDxe/VariableSupport.h              |  180 +++
>  .../Include/Library/CapsuleUpdatePolicyLib.h       |  120 ++
>  FmpDevicePkg/Include/Library/FmpDeviceLib.h        |  385 +++++
>  FmpDevicePkg/Include/Library/FmpPayloadHeaderLib.h |  100 ++
>  .../CapsuleUpdatePolicyLibNull.c                   |  136 ++
>  .../CapsuleUpdatePolicyLibNull.inf                 |   45 +
>  .../CapsuleUpdatePolicyLibNull.uni                 |   17 +
>  .../Library/FmpDeviceLibNull/FmpDeviceLib.c        |  395 +++++
>  .../Library/FmpDeviceLibNull/FmpDeviceLibNull.inf  |   48 +
>  .../Library/FmpDeviceLibNull/FmpDeviceLibNull.uni  |   18 +
>  .../FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c    |  188 +++
>  .../FmpPayloadHeaderLibV1.inf                      |   48 +
>  .../FmpPayloadHeaderLibV1.uni                      |   21 +
>  23 files changed, 4230 insertions(+)
>  create mode 100644 FmpDevicePkg/FmpDevicePkg.dec
>  create mode 100644 FmpDevicePkg/FmpDevicePkg.dsc
>  create mode 100644 FmpDevicePkg/FmpDevicePkg.uni
>  create mode 100644 FmpDevicePkg/FmpDevicePkgExtra.uni
>  create mode 100644 FmpDevicePkg/FmpDxe/FmpDxe.c
>  create mode 100644 FmpDevicePkg/FmpDxe/FmpDxe.inf
>  create mode 100644 FmpDevicePkg/FmpDxe/FmpDxe.uni
>  create mode 100644 FmpDevicePkg/FmpDxe/FmpDxeExtra.uni
>  create mode 100644 FmpDevicePkg/FmpDxe/FmpDxeLib.inf
>  create mode 100644 FmpDevicePkg/FmpDxe/VariableSupport.c
>  create mode 100644 FmpDevicePkg/FmpDxe/VariableSupport.h
>  create mode 100644 FmpDevicePkg/Include/Library/CapsuleUpdatePolicyLib.h
>  create mode 100644 FmpDevicePkg/Include/Library/FmpDeviceLib.h
>  create mode 100644 FmpDevicePkg/Include/Library/FmpPayloadHeaderLib.h
>  create mode 100644
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull
> .c
>  create mode 100644
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull
> .inf
>  create mode 100644
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull
> .uni
>  create mode 100644
> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c
>  create mode 100644
> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf
>  create mode 100644
> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.uni
>  create mode 100644
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
>  create mode 100644
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf
>  create mode 100644
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.uni
> 
> --
> 2.14.2.windows.3

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to