From c40f7cc7fd75e5fff9915ceedb1c10584c98e581 Mon Sep 17 00:00:00 2001 From: Eric Jin Date: Sun, 11 Aug 2019 13:36:46 +0800 Subject: FmpDevicePkg: Add Capsule Update Policy Protocol REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1525 * Add Capsule Update Policy Protocol to FmpDevicePkg * Add CapsuleUpdatePolicyLib instance that uses the services of the Capsule Update Policy Protocol * Add module that produces the Capsule Update Policy Protocol using the services of the CapsuleUpdatePolicyLib class. * Update FmpDevicePkg DSC to build the new library instance and the new module and update builds of FmpDxe modules to demonstrate the use of the different CapsuleUpdatePolicyLib instances. Cc: Sean Brogan Cc: Bret Barkelew Cc: Liming Gao Signed-off-by: Michael D Kinney Signed-off-by: Wang Fan Reviewed-by: Eric Jin Reviewed-by: Liming Gao --- .../CapsuleUpdatePolicyLibOnProtocol.c | 171 +++++++++++++++++++++ .../CapsuleUpdatePolicyLibOnProtocol.inf | 40 +++++ .../CapsuleUpdatePolicyLibOnProtocol.uni | 15 ++ 3 files changed, 226 insertions(+) create mode 100644 FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.c create mode 100644 FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf create mode 100644 FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.uni (limited to 'FmpDevicePkg/Library') diff --git a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.c b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.c new file mode 100644 index 0000000000..2c7c37fa92 --- /dev/null +++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.c @@ -0,0 +1,171 @@ +/** @file + Provides platform policy services used during a capsule update that uses the + services of the EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL. If the + EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL is not available, then assume the + platform is in a state that supports a firmware update. + + Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+ Copyright (c) 2018-2019, Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include + +/// +/// Pointer to the EDK II Capsule Update Policy Protocol instances that is +/// optionally installed by a platform. +/// +EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL *mCapsuleUpdatePolicy = NULL; + +/** + Lookup the EDK II Capsule Update Policy Protocol. +**/ +BOOLEAN +LookupCapsuleUpdatePolicyProtocol ( + VOID + ) +{ + EFI_STATUS Status; + + if (mCapsuleUpdatePolicy != NULL) { + return TRUE; + } + Status = gBS->LocateProtocol ( + &gEdkiiCapuleUpdatePolicyProtocolGuid, + NULL, + (VOID **)&mCapsuleUpdatePolicy + ); + if (EFI_ERROR (Status)) { + mCapsuleUpdatePolicy = NULL; + return FALSE; + } + return TRUE; +} + +/** + Determine if the system power state supports a capsule update. + + @param[out] Good Returns TRUE if system power state supports a capsule + update. Returns FALSE if system power state does not + support a capsule update. Return value is only valid if + return status is EFI_SUCCESS. + + @retval EFI_SUCCESS Good parameter has been updated with result. + @retval EFI_INVALID_PARAMETER Good is NULL. + @retval EFI_DEVICE_ERROR System power state can not be determined. + +**/ +EFI_STATUS +EFIAPI +CheckSystemPower ( + OUT BOOLEAN *Good + ) +{ + if (LookupCapsuleUpdatePolicyProtocol ()) { + return mCapsuleUpdatePolicy->CheckSystemPower (mCapsuleUpdatePolicy, Good); + } + *Good = TRUE; + return EFI_SUCCESS; +} + +/** + Determines if the system thermal state supports a capsule update. + + @param[out] Good Returns TRUE if system thermal state supports a capsule + update. Returns FALSE if system thermal state does not + support a capsule update. Return value is only valid if + return status is EFI_SUCCESS. + + @retval EFI_SUCCESS Good parameter has been updated with result. + @retval EFI_INVALID_PARAMETER Good is NULL. + @retval EFI_DEVICE_ERROR System thermal state can not be determined. + +**/ +EFI_STATUS +EFIAPI +CheckSystemThermal ( + OUT BOOLEAN *Good + ) +{ + if (LookupCapsuleUpdatePolicyProtocol ()) { + return mCapsuleUpdatePolicy->CheckSystemThermal (mCapsuleUpdatePolicy, Good); + } + *Good = TRUE; + return EFI_SUCCESS; +} + +/** + Determines if the system environment state supports a capsule update. + + @param[out] Good Returns TRUE if system environment state supports a capsule + update. Returns FALSE if system environment state does not + support a capsule update. Return value is only valid if + return status is EFI_SUCCESS. + + @retval EFI_SUCCESS Good parameter has been updated with result. + @retval EFI_INVALID_PARAMETER Good is NULL. + @retval EFI_DEVICE_ERROR System environment state can not be determined. + +**/ +EFI_STATUS +EFIAPI +CheckSystemEnvironment ( + OUT BOOLEAN *Good + ) +{ + if (LookupCapsuleUpdatePolicyProtocol ()) { + return mCapsuleUpdatePolicy->CheckSystemEnvironment (mCapsuleUpdatePolicy, Good); + } + *Good = TRUE; + return EFI_SUCCESS; +} + +/** + Determines if the Lowest Supported Version checks should be performed. The + expected result from this function is TRUE. A platform can choose to return + FALSE (e.g. during manufacturing or servicing) to allow a capsule update to a + version below the current Lowest Supported Version. + + @retval TRUE The lowest supported version check is required. + @retval FALSE Do not perform lowest support version check. + +**/ +BOOLEAN +EFIAPI +IsLowestSupportedVersionCheckRequired ( + VOID + ) +{ + if (LookupCapsuleUpdatePolicyProtocol ()) { + return mCapsuleUpdatePolicy->IsLowestSupportedVersionCheckRequired (mCapsuleUpdatePolicy); + } + return TRUE; +} + +/** + Determines if the FMP device should be locked when the event specified by + PcdFmpDeviceLockEventGuid is signaled. The expected result from this function + is TRUE so the FMP device is always locked. A platform can choose to return + FALSE (e.g. during manufacturing) to allow FMP devices to remain unlocked. + + @retval TRUE The FMP device lock action is required at lock event guid. + @retval FALSE Do not perform FMP device lock at lock event guid. + +**/ +BOOLEAN +EFIAPI +IsLockFmpDeviceAtLockEventGuidRequired ( + VOID + ) +{ + if (LookupCapsuleUpdatePolicyProtocol ()) { + return mCapsuleUpdatePolicy->IsLockFmpDeviceAtLockEventGuidRequired (mCapsuleUpdatePolicy); + } + return TRUE; +} diff --git a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf new file mode 100644 index 0000000000..042daaabce --- /dev/null +++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf @@ -0,0 +1,40 @@ +## @file +# Provides platform policy services used during a capsule update that uses the +# services of the EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL. If the +# EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL is not available, then assume the +# platform is in a state that supports a firmware update. +# +# Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+# Copyright (c) 2018-2019, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = CapsuleUpdatePolicyLibOnProtocol + MODULE_UNI_FILE = CapsuleUpdatePolicyLibOnProtocol.uni + FILE_GUID = 0EA4C03F-D91B-4929-AAA5-B2FC8D69E2F4 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = CapsuleUpdatePolicyLib + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + CapsuleUpdatePolicyLibOnProtocol.c + +[Packages] + MdePkg/MdePkg.dec + FmpDevicePkg/FmpDevicePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + UefiBootServicesTableLib + +[Protocols] + gEdkiiCapuleUpdatePolicyProtocolGuid ## CONSUMES diff --git a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.uni b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.uni new file mode 100644 index 0000000000..58d0783126 --- /dev/null +++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.uni @@ -0,0 +1,15 @@ +// /** @file +// Provides platform policy services used during a capsule update that uses the +// services of the EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL. If the +// EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL is not available, then assume the +// platform is in a state that supports a firmware update. +// +// Copyright (c) 2018-2019, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Provides platform policy services used during a capsule update that uses the services of the EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL." + +#string STR_MODULE_DESCRIPTION #language en-US "Provides platform policy services used during a capsule update that uses the services of the EDKII_CAPSULE_UPDATE_POLICY_PROTOCOL." -- cgit