public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chang, Abner" <abner.chang@amd.com>
To: Nickle Wang <nicklew@nvidia.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Igor Kulchytskyy <igork@ami.com>, Nick Ramirez <nramirez@nvidia.com>
Subject: Re: [edk2-staging][PATCH v2 1/1] RedfishClientPkg: Add mechanism to reboot system if config is changed
Date: Wed, 1 Mar 2023 13:25:04 +0000	[thread overview]
Message-ID: <MN2PR12MB3966344DA6B4389678450E76EAAD9@MN2PR12MB3966.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20230301131554.92-1-nicklew@nvidia.com>

[AMD Official Use Only - General]

Reviewed-by: Abner Chang <abner.chang@amd.com>

> -----Original Message-----
> From: Nickle Wang <nicklew@nvidia.com>
> Sent: Wednesday, March 1, 2023 9:16 PM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <Abner.Chang@amd.com>; Igor Kulchytskyy
> <igork@ami.com>; Nick Ramirez <nramirez@nvidia.com>
> Subject: [edk2-staging][PATCH v2 1/1] RedfishClientPkg: Add mechanism to
> reboot system if config is changed
> 
> Caution: This message originated from an External Source. Use proper
> caution when opening attachments, clicking links, or responding.
> 
> 
> When system configuration is updated from RESTful interface, we need a
> system reboot so that the changes can be applied. Introduce PCD
> "PcdSystemRebootRequired" to RedfishClientPkg. RedfishFeatureUtility
> library will enable this flag when system config is updated.
> RedfishFeatureCore driver will check this flag and perform cold reboot
> after all Redfish operations are finished. PCD "PcdSystemRebootTimeout"
> is used to specify how many second BIOS will wait before reboot system.
> 
> Signed-off-by: Nickle Wang <nicklew@nvidia.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> Cc: Nick Ramirez <nramirez@nvidia.com>
> ---
>  .../Library/RedfishFeatureUtilityLib.h        |  240 ++--
>  .../RedfishFeatureUtilityLib.c                | 1111 +++++++++--------
>  .../RedfishFeatureUtilityLib.inf              |    3 +
>  RedfishClientPkg/RedfishClientPkg.dec         |    8 +-
>  .../RedfishFeatureCoreDxe.c                   |  315 +++--
>  .../RedfishFeatureCoreDxe.h                   |    3 +
>  .../RedfishFeatureCoreDxe.inf                 |    5 +
>  7 files changed, 935 insertions(+), 750 deletions(-)
> 
> diff --git a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> index 1325976d8c..1429643272 100644
> --- a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> +++ b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> @@ -2,6 +2,7 @@
>    This file defines the Redfish Feature Utility Library interface.
> 
>    (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> +  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -14,20 +15,22 @@
>  #include <Protocol/EdkIIRedfishPlatformConfig.h>
>  #include <RedfishJsonStructure/RedfishCsCommon.h>
> 
> +#define REDFISH_ENABLE_SYSTEM_REBOOT()
> PcdSetBoolS(PcdRedfishSystemRebootRequired, TRUE)
> +
>  //
>  // Definition of REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG
>  //
>  typedef struct {
> -  UINTN       Index;
> -  EFI_STRING  ConfigureLang;
> +  UINTN         Index;
> +  EFI_STRING    ConfigureLang;
>  } REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG;
> 
>  //
>  // Definition of REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
>  //
>  typedef struct {
> -  UINTN                                   Count;
> -  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG  *List;
> +  UINTN                                     Count;
> +  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG    *List;
>  } REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST;
> 
>  /**
> @@ -44,9 +47,9 @@ typedef struct {
>  **/
>  EFI_STATUS
>  GetResourceByUri (
> -  IN  REDFISH_SERVICE           *Service,
> -  IN  EFI_STRING                ResourceUri,
> -  OUT REDFISH_RESPONSE          *Response
> +  IN  REDFISH_SERVICE   *Service,
> +  IN  EFI_STRING        ResourceUri,
> +  OUT REDFISH_RESPONSE  *Response
>    );
> 
>  /**
> @@ -66,9 +69,9 @@ GetResourceByUri (
>  **/
>  EFI_STATUS
>  IsRedpathArray (
> -  IN EFI_STRING ConfigureLang,
> -  OUT EFI_STRING *ArraySignatureOpen,
> -  OUT EFI_STRING *ArraySignatureClose
> +  IN EFI_STRING   ConfigureLang,
> +  OUT EFI_STRING  *ArraySignatureOpen,
> +  OUT EFI_STRING  *ArraySignatureClose
>    );
> 
>  /**
> @@ -106,8 +109,8 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang (
>  **/
>  EFI_STATUS
>  CopyConfiglanguageList (
> -  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *SourceConfigureLangList,
> -  OUT  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *DestConfigureLangList
> +  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *SourceConfigureLangList,
> +  OUT  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *DestConfigureLangList
>    );
> 
>  /**
> @@ -121,7 +124,7 @@ CopyConfiglanguageList (
>  **/
>  UINTN
>  GetNumberOfRedpathNodes (
> -  IN EFI_STRING NodeString
> +  IN EFI_STRING  NodeString
>    );
> 
>  /**
> @@ -138,9 +141,9 @@ GetNumberOfRedpathNodes (
>  **/
>  EFI_STRING
>  GetRedpathNodeByIndex (
> -  IN  EFI_STRING   NodeString,
> -  IN  UINTN        Index,
> -  OUT EFI_STRING   *EndOfNodePtr OPTIONAL
> +  IN  EFI_STRING  NodeString,
> +  IN  UINTN       Index,
> +  OUT EFI_STRING  *EndOfNodePtr OPTIONAL
>    );
> 
>  /**
> @@ -159,9 +162,9 @@ GetRedpathNodeByIndex (
>  **/
>  EFI_STATUS
>  GetArrayIndexFromArrayTypeConfigureLang (
> -  IN  CHAR16 *ConfigureLang,
> -  OUT CHAR16 **UnifiedConfigureLang,
> -  OUT UINTN  *Index
> +  IN  CHAR16  *ConfigureLang,
> +  OUT CHAR16  **UnifiedConfigureLang,
> +  OUT UINTN   *Index
>    );
> 
>  /**
> @@ -175,7 +178,7 @@ GetArrayIndexFromArrayTypeConfigureLang (
>  **/
>  UINTN
>  ConfiglanguageGetInstanceIndex (
> -  IN EFI_STRING ConfigureLang
> +  IN EFI_STRING  ConfigureLang
>    );
> 
>  /**
> @@ -191,7 +194,7 @@ ConfiglanguageGetInstanceIndex (
>  **/
>  EFI_STATUS
>  DestroyConfiglanguageList (
> -  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *ConfigureLangList
> +  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *ConfigureLangList
>    );
> 
>  /**
> @@ -211,9 +214,9 @@ DestroyConfiglanguageList (
>  **/
>  EFI_STATUS
>  SetResourceConfigLangMemberInstance (
> -  IN EFI_STRING                               *DestConfigLang,
> -  IN UINTN                                    MaxtLengthConfigLang,
> -  IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG   *ConfigLangInstance
> +  IN EFI_STRING                              *DestConfigLang,
> +  IN UINTN                                   MaxtLengthConfigLang,
> +  IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG  *ConfigLangInstance
>    );
> 
>  /**
> @@ -229,8 +232,8 @@ SetResourceConfigLangMemberInstance (
>  **/
>  EFI_STATUS
>  GetArraykeyFromUri (
> -  IN  CHAR8   *Uri,
> -  OUT CHAR8   **ArrayKey
> +  IN  CHAR8  *Uri,
> +  OUT CHAR8  **ArrayKey
>    );
> 
>  /**
> @@ -248,10 +251,10 @@ GetArraykeyFromUri (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsStringType (
> -  IN  CHAR8      *Schema,
> -  IN  CHAR8      *Version,
> -  IN  EFI_STRING ConfigureLang,
> -  IN  CHAR8      *FeatureValue
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  ConfigureLang,
> +  IN  CHAR8       *FeatureValue
>    );
> 
>  /**
> @@ -269,10 +272,10 @@ ApplyFeatureSettingsStringType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsNumericType (
> -  IN  CHAR8      *Schema,
> -  IN  CHAR8      *Version,
> -  IN  EFI_STRING ConfigureLang,
> -  IN  INTN       FeatureValue
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  ConfigureLang,
> +  IN  INTN        FeatureValue
>    );
> 
>  /**
> @@ -290,10 +293,10 @@ ApplyFeatureSettingsNumericType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsBooleanType (
> -  IN  CHAR8      *Schema,
> -  IN  CHAR8      *Version,
> -  IN  EFI_STRING ConfigureLang,
> -  IN  BOOLEAN    FeatureValue
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  ConfigureLang,
> +  IN  BOOLEAN     FeatureValue
>    );
> 
>  /**
> @@ -312,11 +315,11 @@ ApplyFeatureSettingsBooleanType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsVagueType (
> -  IN  CHAR8                             *Schema,
> -  IN  CHAR8                             *Version,
> -  IN  EFI_STRING                        ConfigureLang,
> -  IN  RedfishCS_EmptyProp_KeyValue      *VagueValuePtr,
> -  IN  UINT32                            NumberOfVagueValues
> +  IN  CHAR8                         *Schema,
> +  IN  CHAR8                         *Version,
> +  IN  EFI_STRING                    ConfigureLang,
> +  IN  RedfishCS_EmptyProp_KeyValue  *VagueValuePtr,
> +  IN  UINT32                        NumberOfVagueValues
>    );
> 
>  /**
> @@ -355,9 +358,9 @@ ApplyFeatureSettingsStringArrayType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsNumericArrayType (
> -  IN  CHAR8                 *Schema,
> -  IN  CHAR8                 *Version,
> -  IN  EFI_STRING            ConfigureLang,
> +  IN  CHAR8                  *Schema,
> +  IN  CHAR8                  *Version,
> +  IN  EFI_STRING             ConfigureLang,
>    IN  RedfishCS_int64_Array  *ArrayHead
>    );
> 
> @@ -398,11 +401,11 @@ ApplyFeatureSettingsBooleanArrayType (
>  **/
>  EFI_STATUS
>  CreatePayloadToPostResource (
> -  IN  REDFISH_SERVICE *Service,
> -  IN  REDFISH_PAYLOAD *TargetPayload,
> -  IN  CHAR8           *Json,
> -  OUT EFI_STRING      *Location,
> -  OUT CHAR8           **Etag
> +  IN  REDFISH_SERVICE  *Service,
> +  IN  REDFISH_PAYLOAD  *TargetPayload,
> +  IN  CHAR8            *Json,
> +  OUT EFI_STRING       *Location,
> +  OUT CHAR8            **Etag
>    );
> 
>  /**
> @@ -420,10 +423,10 @@ CreatePayloadToPostResource (
>  **/
>  EFI_STATUS
>  CreatePayloadToPatchResource (
> -  IN  REDFISH_SERVICE *Service,
> -  IN  REDFISH_PAYLOAD *TargetPayload,
> -  IN  CHAR8           *Json,
> -  OUT CHAR8           **Etag
> +  IN  REDFISH_SERVICE  *Service,
> +  IN  REDFISH_PAYLOAD  *TargetPayload,
> +  IN  CHAR8            *Json,
> +  OUT CHAR8            **Etag
>    );
> 
>  /**
> @@ -456,8 +459,8 @@ RedfisSetRedfishUri (
>  **/
>  EFI_STRING
>  GetPropertyFromConfigureLang (
> -  IN EFI_STRING ResourceUri,
> -  IN EFI_STRING ConfigureLang
> +  IN EFI_STRING  ResourceUri,
> +  IN EFI_STRING  ConfigureLang
>    );
> 
>  /**
> @@ -475,10 +478,10 @@ GetPropertyFromConfigureLang (
>  **/
>  CHAR8 *
>  GetPropertyStringValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang
>    );
> 
>  /**
> @@ -496,10 +499,10 @@ GetPropertyStringValue (
>  **/
>  INT64 *
>  GetPropertyNumericValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang
>    );
> 
>  /**
> @@ -516,10 +519,10 @@ GetPropertyNumericValue (
>  **/
>  BOOLEAN *
>  GetPropertyBooleanValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang
>    );
> 
>  /**
> @@ -535,8 +538,8 @@ GetPropertyBooleanValue (
>  **/
>  BOOLEAN
>  PropertyChecker (
> -  IN VOID         *PropertyBuffer,
> -  IN BOOLEAN      ProvisionMode
> +  IN VOID     *PropertyBuffer,
> +  IN BOOLEAN  ProvisionMode
>    );
> 
>  /**
> @@ -583,7 +586,7 @@ GetEtagWithUri (
>  **/
>  EFI_STRING
>  GetOdataId (
> -  IN  REDFISH_PAYLOAD *Payload
> +  IN  REDFISH_PAYLOAD  *Payload
>    );
> 
>  /**
> @@ -599,8 +602,8 @@ GetOdataId (
>  **/
>  EFI_STRING
>  GetConfigureLang (
> -  IN  CHAR8 *Uri,
> -  IN  CHAR8 *PropertyName   OPTIONAL
> +  IN  CHAR8  *Uri,
> +  IN  CHAR8  *PropertyName   OPTIONAL
>    );
> 
>  /**
> @@ -615,7 +618,7 @@ GetConfigureLang (
>  **/
>  EFI_STRING
>  RedfishGetUri (
> -  IN  EFI_STRING ConfigLang
> +  IN  EFI_STRING  ConfigLang
>    );
> 
>  /**
> @@ -630,7 +633,7 @@ RedfishGetUri (
>  **/
>  EFI_STRING
>  RedfishGetConfigLanguage (
> -  IN  EFI_STRING Uri
> +  IN  EFI_STRING  Uri
>    );
> 
>  /**
> @@ -645,7 +648,7 @@ RedfishGetConfigLanguage (
>  **/
>  CHAR8 *
>  StrUnicodeToAscii (
> -  IN EFI_STRING   UnicodeStr
> +  IN EFI_STRING  UnicodeStr
>    );
> 
>  /**
> @@ -677,9 +680,9 @@ StrAsciiToUnicode (
>  **/
>  BOOLEAN
>  CheckEtag (
> -  IN EFI_STRING Uri,
> -  IN CHAR8      *EtagInHeader,
> -  IN CHAR8      *EtagInJson
> +  IN EFI_STRING  Uri,
> +  IN CHAR8       *EtagInHeader,
> +  IN CHAR8       *EtagInJson
>    );
> 
>  /**
> @@ -697,11 +700,11 @@ CheckEtag (
>  **/
>  CHAR8 **
>  GetPropertyStringArrayValue (
> -  IN  CHAR8               *Schema,
> -  IN  CHAR8               *Version,
> -  IN  EFI_STRING          PropertyName,
> -  IN  EFI_STRING          ConfigureLang,
> -  OUT UINTN               *ArraySize
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  PropertyName,
> +  IN  EFI_STRING  ConfigureLang,
> +  OUT UINTN       *ArraySize
>    );
> 
>  /**
> @@ -719,11 +722,11 @@ GetPropertyStringArrayValue (
>  **/
>  INT64 *
>  GetPropertyNumericArrayValue (
> -  IN  CHAR8               *Schema,
> -  IN  CHAR8               *Version,
> -  IN  EFI_STRING          PropertyName,
> -  IN  EFI_STRING          ConfigureLang,
> -  OUT UINTN               *ArraySize
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  PropertyName,
> +  IN  EFI_STRING  ConfigureLang,
> +  OUT UINTN       *ArraySize
>    );
> 
>  /**
> @@ -741,11 +744,11 @@ GetPropertyNumericArrayValue (
>  **/
>  BOOLEAN *
>  GetPropertyBooleanArrayValue (
> -  IN  CHAR8               *Schema,
> -  IN  CHAR8               *Version,
> -  IN  EFI_STRING          PropertyName,
> -  IN  EFI_STRING          ConfigureLang,
> -  OUT UINTN               *ArraySize
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  PropertyName,
> +  IN  EFI_STRING  ConfigureLang,
> +  OUT UINTN       *ArraySize
>    );
> 
>  /**
> @@ -764,11 +767,11 @@ GetPropertyBooleanArrayValue (
>  **/
>  RedfishCS_EmptyProp_KeyValue *
>  GetPropertyVagueValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang,
> -  OUT UINT32    *NumberOfValues
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang,
> +  OUT UINT32     *NumberOfValues
>    );
> 
>  /**
> @@ -780,7 +783,7 @@ GetPropertyVagueValue (
>  **/
>  VOID
>  FreeEmptyPropKeyValueList (
> -  RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueListHead
> +  RedfishCS_EmptyProp_KeyValue  *EmptyPropKeyValueListHead
>    );
> 
>  /**
> @@ -798,7 +801,7 @@ BOOLEAN
>  MatchPropertyWithJsonContext (
>    IN  EFI_STRING  Property,
>    IN  CHAR8       *Json
> -);
> +  );
> 
>  /**
> 
> @@ -814,7 +817,7 @@ MatchPropertyWithJsonContext (
>  **/
>  EFI_STATUS
>  AddRedfishCharArray (
> -  IN OUT  RedfishCS_char_Array **Head,
> +  IN OUT  RedfishCS_char_Array  **Head,
>    IN      CHAR8                 **StringArray,
>    IN      UINTN                 ArraySize
>    );
> @@ -833,9 +836,9 @@ AddRedfishCharArray (
>  **/
>  EFI_STATUS
>  AddRedfishNumericArray (
> -  IN OUT  RedfishCS_int64_Array **Head,
> -  IN      INT64                 *NumericArray,
> -  IN      UINTN                 ArraySize
> +  IN OUT  RedfishCS_int64_Array  **Head,
> +  IN      INT64                  *NumericArray,
> +  IN      UINTN                  ArraySize
>    );
> 
>  /**
> @@ -856,6 +859,7 @@ AddRedfishBooleanArray (
>    IN      BOOLEAN               *BooleanArray,
>    IN      UINTN                 ArraySize
>    );
> +
>  /**
> 
>    Check and see if value in Redfish string array are all the same as the one
> @@ -872,9 +876,9 @@ AddRedfishBooleanArray (
>  **/
>  BOOLEAN
>  CompareRedfishStringArrayValues (
> -  IN RedfishCS_char_Array *Head,
> -  IN CHAR8                **StringArray,
> -  IN UINTN                ArraySize
> +  IN RedfishCS_char_Array  *Head,
> +  IN CHAR8                 **StringArray,
> +  IN UINTN                 ArraySize
>    );
> 
>  /**
> @@ -893,9 +897,9 @@ CompareRedfishStringArrayValues (
>  **/
>  BOOLEAN
>  CompareRedfishNumericArrayValues (
> -  IN RedfishCS_int64_Array *Head,
> -  IN INT64                 *NumericArray,
> -  IN UINTN                 ArraySize
> +  IN RedfishCS_int64_Array  *Head,
> +  IN INT64                  *NumericArray,
> +  IN UINTN                  ArraySize
>    );
> 
>  /**
> @@ -935,10 +939,10 @@ CompareRedfishBooleanArrayValues (
>  **/
>  BOOLEAN
>  CompareRedfishPropertyVagueValues (
> -  IN RedfishCS_EmptyProp_KeyValue *RedfishVagueKeyValuePtr,
> -  IN UINT32                       RedfishVagueKeyValueNumber,
> -  IN RedfishCS_EmptyProp_KeyValue *ConfigVagueKeyValuePtr,
> -  IN UINT32                       ConfigVagueKeyValueNumber
> +  IN RedfishCS_EmptyProp_KeyValue  *RedfishVagueKeyValuePtr,
> +  IN UINT32                        RedfishVagueKeyValueNumber,
> +  IN RedfishCS_EmptyProp_KeyValue  *ConfigVagueKeyValuePtr,
> +  IN UINT32                        ConfigVagueKeyValueNumber
>    );
> 
>  /**
> @@ -955,8 +959,8 @@ CompareRedfishPropertyVagueValues (
>  **/
>  EFI_STATUS
>  GetEtagAndLocation (
> -  IN  REDFISH_RESPONSE  *Response,
> -  OUT CHAR8             **Etag,       OPTIONAL
> +  IN  REDFISH_RESPONSE *Response,
> +  OUT CHAR8 **Etag, OPTIONAL
>    OUT EFI_STRING        *Location    OPTIONAL
>    );
> 
> diff --git
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .c
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .c
> index bfd6fff2a7..ed8a021cf2 100644
> ---
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .c
> +++
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .c
> @@ -2,7 +2,7 @@
>    Redfish feature utility library implementation
> 
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> +  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -10,7 +10,7 @@
> 
>  #include "RedfishFeatureUtilityInternal.h"
> 
> -EDKII_REDFISH_ETAG_PROTOCOL             *mEtagProtocol = NULL;
> +EDKII_REDFISH_ETAG_PROTOCOL             *mEtagProtocol          = NULL;
>  EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL
> *mConfigLangMapProtocol = NULL;
> 
>  /**
> @@ -33,7 +33,7 @@ RedfishLocateProtocol (
>  {
>    EFI_STATUS  Status;
> 
> -  if (ProtocolInstance == NULL || ProtocolGuid == NULL) {
> +  if ((ProtocolInstance == NULL) || (ProtocolGuid == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -62,14 +62,14 @@ RedfishLocateProtocol (
>  **/
>  EFI_STATUS
>  GetArraykeyFromUri (
> -  IN  CHAR8   *Uri,
> -  OUT CHAR8   **ArrayKey
> +  IN  CHAR8  *Uri,
> +  OUT CHAR8  **ArrayKey
>    )
>  {
> -  CHAR8      *LeftBracket;
> -  UINTN      Index;
> +  CHAR8  *LeftBracket;
> +  UINTN  Index;
> 
> -  if (IS_EMPTY_STRING (Uri) || ArrayKey == NULL) {
> +  if (IS_EMPTY_STRING (Uri) || (ArrayKey == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -207,19 +207,19 @@ GetEtagWithUri (
>  **/
>  CHAR8 *
>  StrUnicodeToAscii (
> -  IN EFI_STRING   UnicodeStr
> +  IN EFI_STRING  UnicodeStr
>    )
>  {
> -  CHAR8 *AsciiStr;
> -  UINTN AsciiStrSize;
> -  EFI_STATUS Status;
> +  CHAR8       *AsciiStr;
> +  UINTN       AsciiStrSize;
> +  EFI_STATUS  Status;
> 
>    if (IS_EMPTY_STRING (UnicodeStr)) {
>      return NULL;
>    }
> 
>    AsciiStrSize = StrLen (UnicodeStr) + 1;
> -  AsciiStr = AllocatePool (AsciiStrSize);
> +  AsciiStr     = AllocatePool (AsciiStrSize);
>    if (AsciiStr == NULL) {
>      return NULL;
>    }
> @@ -258,7 +258,7 @@ StrAsciiToUnicode (
>    }
> 
>    UnicodeStrSize = (AsciiStrLen (AsciiStr) + 1) * sizeof (CHAR16);
> -  UnicodeStr = AllocatePool (UnicodeStrSize);
> +  UnicodeStr     = AllocatePool (UnicodeStrSize);
>    if (UnicodeStr == NULL) {
>      return NULL;
>    }
> @@ -288,16 +288,16 @@ StrAsciiToUnicode (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsStringType (
> -  IN  CHAR8      *Schema,
> -  IN  CHAR8      *Version,
> -  IN  EFI_STRING ConfigureLang,
> -  IN  CHAR8      *FeatureValue
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  ConfigureLang,
> +  IN  CHAR8       *FeatureValue
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || FeatureValue == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || (FeatureValue == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -308,9 +308,8 @@ ApplyFeatureSettingsStringType (
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>    } else {
> -
>      if (RedfishValue.Type != REDFISH_VALUE_TYPE_STRING) {
> -       DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
> +      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
>        return EFI_DEVICE_ERROR;
>      }
> 
> @@ -324,7 +323,12 @@ ApplyFeatureSettingsStringType (
>        RedfishValue.Value.Buffer = FeatureValue;
> 
>        Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureLang, RedfishValue);
> -      if (EFI_ERROR (Status)) {
> +      if (!EFI_ERROR (Status)) {
> +        //
> +        // Configuration changed. Enable system reboot flag.
> +        //
> +        REDFISH_ENABLE_SYSTEM_REBOOT ();
> +      } else {
>          DEBUG ((DEBUG_ERROR, "%a, apply %s to %s failed: %r\n",
> __FUNCTION__, ConfigureLang, FeatureValue, Status));
>        }
>      } else {
> @@ -350,14 +354,14 @@ ApplyFeatureSettingsStringType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsNumericType (
> -  IN  CHAR8      *Schema,
> -  IN  CHAR8      *Version,
> -  IN  EFI_STRING ConfigureLang,
> -  IN  INTN       FeatureValue
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  ConfigureLang,
> +  IN  INTN        FeatureValue
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> 
>    if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang)) {
>      return EFI_INVALID_PARAMETER;
> @@ -368,11 +372,10 @@ ApplyFeatureSettingsNumericType (
>    //
>    Status = RedfishPlatformConfigGetValue (Schema, Version, ConfigureLang,
> &RedfishValue);
>    if (EFI_ERROR (Status)) {
> -   DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>    } else {
> -
>      if (RedfishValue.Type != REDFISH_VALUE_TYPE_INTEGER) {
> -       DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not numeric type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
> +      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not numeric type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
>        return EFI_DEVICE_ERROR;
>      }
> 
> @@ -385,7 +388,12 @@ ApplyFeatureSettingsNumericType (
>        RedfishValue.Value.Integer = (INT64)FeatureValue;
> 
>        Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureLang, RedfishValue);
> -      if (EFI_ERROR (Status)) {
> +      if (!EFI_ERROR (Status)) {
> +        //
> +        // Configuration changed. Enable system reboot flag.
> +        //
> +        REDFISH_ENABLE_SYSTEM_REBOOT ();
> +      } else {
>          DEBUG ((DEBUG_ERROR, "%a, apply %s to 0x%x failed: %r\n",
> __FUNCTION__, ConfigureLang, FeatureValue, Status));
>        }
>      } else {
> @@ -411,14 +419,14 @@ ApplyFeatureSettingsNumericType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsBooleanType (
> -  IN  CHAR8      *Schema,
> -  IN  CHAR8      *Version,
> -  IN  EFI_STRING ConfigureLang,
> -  IN  BOOLEAN    FeatureValue
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  ConfigureLang,
> +  IN  BOOLEAN     FeatureValue
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> 
>    if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang)) {
>      return EFI_INVALID_PARAMETER;
> @@ -429,11 +437,10 @@ ApplyFeatureSettingsBooleanType (
>    //
>    Status = RedfishPlatformConfigGetValue (Schema, Version, ConfigureLang,
> &RedfishValue);
>    if (EFI_ERROR (Status)) {
> -   DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>    } else {
> -
>      if (RedfishValue.Type != REDFISH_VALUE_TYPE_BOOLEAN) {
> -       DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not boolean type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
> +      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not boolean type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
>        return EFI_DEVICE_ERROR;
>      }
> 
> @@ -446,7 +453,12 @@ ApplyFeatureSettingsBooleanType (
>        RedfishValue.Value.Boolean = FeatureValue;
> 
>        Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureLang, RedfishValue);
> -      if (EFI_ERROR (Status)) {
> +      if (!EFI_ERROR (Status)) {
> +        //
> +        // Configuration changed. Enable system reboot flag.
> +        //
> +        REDFISH_ENABLE_SYSTEM_REBOOT ();
> +      } else {
>          DEBUG ((DEBUG_ERROR, "%a, apply %s to %a failed: %r\n",
> __FUNCTION__, ConfigureLang, (FeatureValue ? "True" : "False"), Status));
>        }
>      } else {
> @@ -473,23 +485,23 @@ ApplyFeatureSettingsBooleanType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsVagueType (
> -  IN  CHAR8                             *Schema,
> -  IN  CHAR8                             *Version,
> -  IN  EFI_STRING                        ConfigureLang,
> -  IN  RedfishCS_EmptyProp_KeyValue      *VagueValuePtr,
> -  IN  UINT32                            NumberOfVagueValues
> +  IN  CHAR8                         *Schema,
> +  IN  CHAR8                         *Version,
> +  IN  EFI_STRING                    ConfigureLang,
> +  IN  RedfishCS_EmptyProp_KeyValue  *VagueValuePtr,
> +  IN  UINT32                        NumberOfVagueValues
>    )
>  {
> -  EFI_STATUS                Status;
> -  UINTN                     StrSize;
> -  CHAR8                     *ConfigureLangAscii;
> -  CHAR8                     *ConfigureLangKeyAscii;
> -  EFI_STRING                ConfigureKeyLang;
> -  EDKII_REDFISH_VALUE       RedfishValue;
> -  EDKII_REDFISH_VALUE_TYPES PropertyDatatype;
> -  RedfishCS_EmptyProp_KeyValue *CurrentVagueValuePtr;
> -
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || VagueValuePtr == NULL ||
> NumberOfVagueValues == 0) {
> +  EFI_STATUS                    Status;
> +  UINTN                         StrSize;
> +  CHAR8                         *ConfigureLangAscii;
> +  CHAR8                         *ConfigureLangKeyAscii;
> +  EFI_STRING                    ConfigureKeyLang;
> +  EDKII_REDFISH_VALUE           RedfishValue;
> +  EDKII_REDFISH_VALUE_TYPES     PropertyDatatype;
> +  RedfishCS_EmptyProp_KeyValue  *CurrentVagueValuePtr;
> +
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || (VagueValuePtr == NULL) ||
> (NumberOfVagueValues == 0)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -499,6 +511,7 @@ ApplyFeatureSettingsVagueType (
>      DEBUG ((DEBUG_ERROR, "%a, Allocate memory for generate
> ConfigureLang of vague key of %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>      return Status;
>    }
> +
>    Status = UnicodeStrToAsciiStrS (ConfigureLang, ConfigureLangAscii, StrLen
> (ConfigureLang) + 1);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, Convert the configureLang of vague key of
> %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang,
> Status));
> @@ -510,18 +523,19 @@ ApplyFeatureSettingsVagueType (
>      //
>      // Generate ConfigureLang with the key name
>      //
> -    //ConfigureKeyLang = GetConfigureLang (ConfigureLangAscii,
> CurrentVagueValuePtr->KeyNamePtr);
> -    StrSize = AsciiStrLen (ConfigureLangAscii) + AsciiStrLen
> (CurrentVagueValuePtr->KeyNamePtr) + 2;
> +    // ConfigureKeyLang = GetConfigureLang (ConfigureLangAscii,
> CurrentVagueValuePtr->KeyNamePtr);
> +    StrSize               = AsciiStrLen (ConfigureLangAscii) + AsciiStrLen
> (CurrentVagueValuePtr->KeyNamePtr) + 2;
>      ConfigureLangKeyAscii = AllocateZeroPool (StrSize);
> -    ConfigureKeyLang = AllocateZeroPool (StrSize * sizeof (CHAR16));
> -    if (ConfigureLangKeyAscii == NULL || ConfigureKeyLang == NULL) {
> -        DEBUG ((DEBUG_ERROR, "%a, Generate ConfigureLang of vague key of
> %a.%a %s %a failed!\n", __FUNCTION__, Schema, Version, ConfigureLang,
> CurrentVagueValuePtr->KeyNamePtr));
> -        goto ErrorContinue;
> +    ConfigureKeyLang      = AllocateZeroPool (StrSize * sizeof (CHAR16));
> +    if ((ConfigureLangKeyAscii == NULL) || (ConfigureKeyLang == NULL)) {
> +      DEBUG ((DEBUG_ERROR, "%a, Generate ConfigureLang of vague key of
> %a.%a %s %a failed!\n", __FUNCTION__, Schema, Version, ConfigureLang,
> CurrentVagueValuePtr->KeyNamePtr));
> +      goto ErrorContinue;
>      }
> -    AsciiStrCatS(ConfigureLangKeyAscii, StrSize, ConfigureLangAscii);
> -    AsciiStrCatS(ConfigureLangKeyAscii, StrSize, "/");
> -    AsciiStrCatS(ConfigureLangKeyAscii, StrSize, CurrentVagueValuePtr-
> >KeyNamePtr);
> -    AsciiStrToUnicodeStrS(ConfigureLangKeyAscii, ConfigureKeyLang, StrSize);
> +
> +    AsciiStrCatS (ConfigureLangKeyAscii, StrSize, ConfigureLangAscii);
> +    AsciiStrCatS (ConfigureLangKeyAscii, StrSize, "/");
> +    AsciiStrCatS (ConfigureLangKeyAscii, StrSize, CurrentVagueValuePtr-
> >KeyNamePtr);
> +    AsciiStrToUnicodeStrS (ConfigureLangKeyAscii, ConfigureKeyLang,
> StrSize);
>      FreePool (ConfigureLangKeyAscii);
>      ConfigureLangKeyAscii = NULL;
>      //
> @@ -534,7 +548,7 @@ ApplyFeatureSettingsVagueType (
>      } else if (CurrentVagueValuePtr->Value->DataType ==
> RedfishCS_Vague_DataType_Int64) {
>        PropertyDatatype = REDFISH_VALUE_TYPE_INTEGER;
>      } else {
> -      DEBUG((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property
> data type\n", __FUNCTION__, Schema, Version, ConfigureLang));
> +      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property
> data type\n", __FUNCTION__, Schema, Version, ConfigureLang));
>        goto ErrorContinue;
>      }
> 
> @@ -546,9 +560,10 @@ ApplyFeatureSettingsVagueType (
>        DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureKeyLang, Status));
>      } else {
>        if (RedfishValue.Type != PropertyDatatype) {
> -        DEBUG((DEBUG_ERROR, "%a, %a.%a %s mismatched data type\n",
> __FUNCTION__, Schema, Version, ConfigureKeyLang));
> +        DEBUG ((DEBUG_ERROR, "%a, %a.%a %s mismatched data type\n",
> __FUNCTION__, Schema, Version, ConfigureKeyLang));
>          goto ErrorContinue;
>        }
> +
>        if (PropertyDatatype == REDFISH_VALUE_TYPE_STRING) {
>          //
>          // This is a string property.
> @@ -560,8 +575,13 @@ ApplyFeatureSettingsVagueType (
>            DEBUG ((DEBUG_INFO, "%a, %a.%a apply %s from %a to %a\n",
> __FUNCTION__, Schema, Version, ConfigureKeyLang,
> RedfishValue.Value.Buffer, CurrentVagueValuePtr->Value-
> >DataValue.CharPtr));
>            FreePool (RedfishValue.Value.Buffer);
>            RedfishValue.Value.Buffer = CurrentVagueValuePtr->Value-
> >DataValue.CharPtr;
> -          Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureKeyLang, RedfishValue);
> -          if (EFI_ERROR (Status)) {
> +          Status                    = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureKeyLang, RedfishValue);
> +          if (!EFI_ERROR (Status)) {
> +            //
> +            // Configuration changed. Enable system reboot flag.
> +            //
> +            REDFISH_ENABLE_SYSTEM_REBOOT ();
> +          } else {
>              DEBUG ((DEBUG_ERROR, "%a, apply %a to %a failed: %r\n",
> __FUNCTION__, ConfigureKeyLang, CurrentVagueValuePtr->Value-
> >DataValue.CharPtr, Status));
>            }
>          } else {
> @@ -575,17 +595,25 @@ ApplyFeatureSettingsVagueType (
>            //
>            // Apply settings from redfish
>            //
> -          DEBUG ((DEBUG_INFO, "%a, %a.%a apply %s from %a to %a\n",
> -                  __FUNCTION__,
> -                  Schema,
> -                  Version,
> -                  ConfigureKeyLang,
> -                  (RedfishValue.Value.Boolean ? "True" : "False"),
> -                  (*CurrentVagueValuePtr->Value->DataValue.BoolPtr ? "True" :
> "False")));
> +          DEBUG ((
> +            DEBUG_INFO,
> +            "%a, %a.%a apply %s from %a to %a\n",
> +            __FUNCTION__,
> +            Schema,
> +            Version,
> +            ConfigureKeyLang,
> +            (RedfishValue.Value.Boolean ? "True" : "False"),
> +            (*CurrentVagueValuePtr->Value->DataValue.BoolPtr ? "True" :
> "False")
> +            ));
> 
>            RedfishValue.Value.Boolean = (BOOLEAN)*CurrentVagueValuePtr-
> >Value->DataValue.BoolPtr;
> -          Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureKeyLang, RedfishValue);
> -          if (EFI_ERROR (Status)) {
> +          Status                     = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureKeyLang, RedfishValue);
> +          if (!EFI_ERROR (Status)) {
> +            //
> +            // Configuration changed. Enable system reboot flag.
> +            //
> +            REDFISH_ENABLE_SYSTEM_REBOOT ();
> +          } else {
>              DEBUG ((DEBUG_ERROR, "%a, apply %s to %a failed: %r\n",
> __FUNCTION__, ConfigureKeyLang, (*CurrentVagueValuePtr->Value-
> >DataValue.BoolPtr ? "True" : "False"), Status));
>            }
>          } else {
> @@ -602,15 +630,20 @@ ApplyFeatureSettingsVagueType (
>            DEBUG ((DEBUG_INFO, "%a, %a.%a apply %s from 0x%x to 0x%x\n",
> __FUNCTION__, Schema, Version, ConfigureKeyLang,
> RedfishValue.Value.Integer, *CurrentVagueValuePtr->Value-
> >DataValue.Int64Ptr));
> 
>            RedfishValue.Value.Integer = (INT64)*CurrentVagueValuePtr->Value-
> >DataValue.Int64Ptr;
> -          Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureKeyLang, RedfishValue);
> -          if (EFI_ERROR (Status)) {
> +          Status                     = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureKeyLang, RedfishValue);
> +          if (!EFI_ERROR (Status)) {
> +            //
> +            // Configuration changed. Enable system reboot flag.
> +            //
> +            REDFISH_ENABLE_SYSTEM_REBOOT ();
> +          } else {
>              DEBUG ((DEBUG_ERROR, "%a, apply %s to 0x%x failed: %r\n",
> __FUNCTION__, ConfigureKeyLang, *CurrentVagueValuePtr->Value-
> >DataValue.Int64Ptr, Status));
>            }
>          } else {
>            DEBUG ((DEBUG_INFO, "%a, %a.%a %s value is: 0x%x\n",
> __FUNCTION__, Schema, Version, ConfigureKeyLang,
> RedfishValue.Value.Integer, Status));
>          }
>        } else {
> -        DEBUG((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property
> data type\n", __FUNCTION__, Schema, Version, ConfigureLang));
> +        DEBUG ((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish
> property data type\n", __FUNCTION__, Schema, Version, ConfigureLang));
>          goto ErrorContinue;
>        }
>      }
> @@ -620,22 +653,27 @@ ErrorContinue:;
>        FreePool (ConfigureLangKeyAscii);
>        ConfigureLangKeyAscii = NULL;
>      }
> +
>      if (ConfigureKeyLang != NULL) {
>        FreePool (ConfigureKeyLang);
>        ConfigureKeyLang = NULL;
>      }
> +
>      CurrentVagueValuePtr = CurrentVagueValuePtr->NextKeyValuePtr;
> -  };
> +  }
> 
>    if (ConfigureLangAscii != NULL) {
>      FreePool (ConfigureLangAscii);
>    }
> +
>    if (ConfigureLangKeyAscii != NULL) {
>      FreePool (ConfigureLangKeyAscii);
>    }
> +
>    if (ConfigureKeyLang != NULL) {
>      FreePool (ConfigureKeyLang);
>    }
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -648,16 +686,16 @@ ErrorContinue:;
>  **/
>  VOID
>  FreeArrayTypeRedfishValue (
> -  EDKII_REDFISH_VALUE *RedfishValue
> +  EDKII_REDFISH_VALUE  *RedfishValue
>    )
>  {
> -  UINTN Index;
> +  UINTN  Index;
> 
>    if (RedfishValue == NULL) {
>      return;
>    }
> 
> -  if (RedfishValue->Type != REDFISH_VALUE_TYPE_INTEGER_ARRAY &&
> RedfishValue->Type != REDFISH_VALUE_TYPE_STRING_ARRAY) {
> +  if ((RedfishValue->Type != REDFISH_VALUE_TYPE_INTEGER_ARRAY) &&
> (RedfishValue->Type != REDFISH_VALUE_TYPE_STRING_ARRAY)) {
>      return;
>    }
> 
> @@ -666,6 +704,7 @@ FreeArrayTypeRedfishValue (
>        for (Index = 0; Index < RedfishValue->ArrayCount; Index++) {
>          FreePool (RedfishValue->Value.StringArray[Index]);
>        }
> +
>        FreePool (RedfishValue->Value.StringArray);
>        RedfishValue->Value.StringArray = NULL;
>        break;
> @@ -687,7 +726,6 @@ FreeArrayTypeRedfishValue (
>    RedfishValue->ArrayCount = 0;
>  }
> 
> -
>  /**
> 
>    Apply property value to UEFI HII database in string array type.
> @@ -714,7 +752,7 @@ ApplyFeatureSettingsStringArrayType (
>    UINTN                 Index;
>    RedfishCS_char_Array  *Buffer;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || ArrayHead == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || (ArrayHead == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -725,9 +763,8 @@ ApplyFeatureSettingsStringArrayType (
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>    } else {
> -
>      if (RedfishValue.Type != REDFISH_VALUE_TYPE_STRING_ARRAY) {
> -       DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
> +      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
>        return EFI_DEVICE_ERROR;
>      }
> 
> @@ -745,10 +782,10 @@ ApplyFeatureSettingsStringArrayType (
>        // Convert array from RedfishCS_char_Array to EDKII_REDFISH_VALUE
>        //
>        RedfishValue.ArrayCount = 0;
> -      Buffer = ArrayHead;
> +      Buffer                  = ArrayHead;
>        while (Buffer != NULL) {
>          RedfishValue.ArrayCount += 1;
> -        Buffer = Buffer->Next;
> +        Buffer                   = Buffer->Next;
>        }
> 
>        //
> @@ -761,13 +798,14 @@ ApplyFeatureSettingsStringArrayType (
>        }
> 
>        Buffer = ArrayHead;
> -      Index = 0;
> +      Index  = 0;
>        while (Buffer != NULL) {
>          RedfishValue.Value.StringArray[Index] = AllocateCopyPool (AsciiStrSize
> (Buffer->ArrayValue), Buffer->ArrayValue);
>          if (RedfishValue.Value.StringArray[Index] == NULL) {
>            ASSERT (FALSE);
>            return EFI_OUT_OF_RESOURCES;
>          }
> +
>          Buffer = Buffer->Next;
>          Index++;
>        }
> @@ -775,7 +813,12 @@ ApplyFeatureSettingsStringArrayType (
>        ASSERT (Index <= RedfishValue.ArrayCount);
> 
>        Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureLang, RedfishValue);
> -      if (EFI_ERROR (Status)) {
> +      if (!EFI_ERROR (Status)) {
> +        //
> +        // Configuration changed. Enable system reboot flag.
> +        //
> +        REDFISH_ENABLE_SYSTEM_REBOOT ();
> +      } else {
>          DEBUG ((DEBUG_ERROR, "%a, apply %s array failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
>        }
>      } else {
> @@ -801,18 +844,18 @@ ApplyFeatureSettingsStringArrayType (
>  **/
>  EFI_STATUS
>  ApplyFeatureSettingsNumericArrayType (
> -  IN  CHAR8                 *Schema,
> -  IN  CHAR8                 *Version,
> -  IN  EFI_STRING            ConfigureLang,
> +  IN  CHAR8                  *Schema,
> +  IN  CHAR8                  *Version,
> +  IN  EFI_STRING             ConfigureLang,
>    IN  RedfishCS_int64_Array  *ArrayHead
>    )
>  {
> -  EFI_STATUS            Status;
> -  EDKII_REDFISH_VALUE   RedfishValue;
> -  UINTN                 Index;
> -  RedfishCS_int64_Array *Buffer;
> +  EFI_STATUS             Status;
> +  EDKII_REDFISH_VALUE    RedfishValue;
> +  UINTN                  Index;
> +  RedfishCS_int64_Array  *Buffer;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || ArrayHead == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || (ArrayHead == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -823,7 +866,6 @@ ApplyFeatureSettingsNumericArrayType (
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>    } else {
> -
>      if (RedfishValue.Type != REDFISH_VALUE_TYPE_INTEGER_ARRAY) {
>        DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
>        return EFI_DEVICE_ERROR;
> @@ -843,10 +885,10 @@ ApplyFeatureSettingsNumericArrayType (
>        // Convert array from RedfishCS_int64_Array to EDKII_REDFISH_VALUE
>        //
>        RedfishValue.ArrayCount = 0;
> -      Buffer = ArrayHead;
> +      Buffer                  = ArrayHead;
>        while (Buffer != NULL) {
>          RedfishValue.ArrayCount += 1;
> -        Buffer = Buffer->Next;
> +        Buffer                   = Buffer->Next;
>        }
> 
>        //
> @@ -859,17 +901,22 @@ ApplyFeatureSettingsNumericArrayType (
>        }
> 
>        Buffer = ArrayHead;
> -      Index = 0;
> +      Index  = 0;
>        while (Buffer != NULL) {
>          RedfishValue.Value.IntegerArray[Index] = (INT64)*Buffer->ArrayValue;
> -        Buffer = Buffer->Next;
> +        Buffer                                 = Buffer->Next;
>          Index++;
>        }
> 
>        ASSERT (Index <= RedfishValue.ArrayCount);
> 
>        Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureLang, RedfishValue);
> -      if (EFI_ERROR (Status)) {
> +      if (!EFI_ERROR (Status)) {
> +        //
> +        // Configuration changed. Enable system reboot flag.
> +        //
> +        REDFISH_ENABLE_SYSTEM_REBOOT ();
> +      } else {
>          DEBUG ((DEBUG_ERROR, "%a, apply %s array failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
>        }
>      } else {
> @@ -904,9 +951,9 @@ ApplyFeatureSettingsBooleanArrayType (
>    EFI_STATUS            Status;
>    EDKII_REDFISH_VALUE   RedfishValue;
>    UINTN                 Index;
> -  RedfishCS_bool_Array *Buffer;
> +  RedfishCS_bool_Array  *Buffer;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || ArrayHead == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || (ArrayHead == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -917,7 +964,6 @@ ApplyFeatureSettingsBooleanArrayType (
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__,
> Schema, Version, ConfigureLang, Status));
>    } else {
> -
>      if (RedfishValue.Type != REDFISH_VALUE_TYPE_BOOLEAN_ARRAY) {
>        DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n",
> __FUNCTION__, Schema, Version, ConfigureLang));
>        return EFI_DEVICE_ERROR;
> @@ -937,10 +983,10 @@ ApplyFeatureSettingsBooleanArrayType (
>        // Convert array from RedfishCS_int64_Array to EDKII_REDFISH_VALUE
>        //
>        RedfishValue.ArrayCount = 0;
> -      Buffer = ArrayHead;
> +      Buffer                  = ArrayHead;
>        while (Buffer != NULL) {
>          RedfishValue.ArrayCount += 1;
> -        Buffer = Buffer->Next;
> +        Buffer                   = Buffer->Next;
>        }
> 
>        //
> @@ -953,17 +999,22 @@ ApplyFeatureSettingsBooleanArrayType (
>        }
> 
>        Buffer = ArrayHead;
> -      Index = 0;
> +      Index  = 0;
>        while (Buffer != NULL) {
>          RedfishValue.Value.BooleanArray[Index] = (BOOLEAN)*Buffer-
> >ArrayValue;
> -        Buffer = Buffer->Next;
> +        Buffer                                 = Buffer->Next;
>          Index++;
>        }
> 
>        ASSERT (Index <= RedfishValue.ArrayCount);
> 
>        Status = RedfishPlatformConfigSetValue (Schema, Version,
> ConfigureLang, RedfishValue);
> -      if (EFI_ERROR (Status)) {
> +      if (!EFI_ERROR (Status)) {
> +        //
> +        // Configuration changed. Enable system reboot flag.
> +        //
> +        REDFISH_ENABLE_SYSTEM_REBOOT ();
> +      } else {
>          DEBUG ((DEBUG_ERROR, "%a, apply %s array failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
>        }
>      } else {
> @@ -988,15 +1039,15 @@ ApplyFeatureSettingsBooleanArrayType (
>  **/
>  EFI_STATUS
>  GetResourceByUri (
> -  IN  REDFISH_SERVICE           *Service,
> -  IN  EFI_STRING                ResourceUri,
> -  OUT REDFISH_RESPONSE          *Response
> +  IN  REDFISH_SERVICE   *Service,
> +  IN  EFI_STRING        ResourceUri,
> +  OUT REDFISH_RESPONSE  *Response
>    )
>  {
>    EFI_STATUS  Status;
>    CHAR8       *AsciiResourceUri;
> 
> -  if (Service == NULL || Response == NULL || IS_EMPTY_STRING
> (ResourceUri)) {
> +  if ((Service == NULL) || (Response == NULL) || IS_EMPTY_STRING
> (ResourceUri)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -1051,9 +1102,9 @@ GetResourceByUri (
>  **/
>  EFI_STATUS
>  IsRedpathArray (
> -  IN EFI_STRING ConfigureLang,
> -  OUT EFI_STRING *ArraySignatureOpen OPTIONAL,
> -  OUT EFI_STRING *ArraySignatureClose OPTIONAL
> +  IN EFI_STRING   ConfigureLang,
> +  OUT EFI_STRING  *ArraySignatureOpen OPTIONAL,
> +  OUT EFI_STRING  *ArraySignatureClose OPTIONAL
>    )
>  {
>    CHAR16  *IndexString;
> @@ -1061,9 +1112,11 @@ IsRedpathArray (
>    if (ConfigureLang == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    if (ArraySignatureOpen != NULL) {
>      *ArraySignatureOpen = NULL;
>    }
> +
>    if (ArraySignatureClose != NULL) {
>      *ArraySignatureClose = NULL;
>    }
> @@ -1076,6 +1129,7 @@ IsRedpathArray (
>      if (ArraySignatureOpen != NULL) {
>        *ArraySignatureOpen = IndexString;
>      }
> +
>      //
>      // Skip "{"
>      //
> @@ -1087,11 +1141,14 @@ IsRedpathArray (
>      if (IndexString == NULL) {
>        return EFI_INVALID_PARAMETER;
>      }
> +
>      if (ArraySignatureClose != NULL) {
>        *ArraySignatureClose = IndexString;
>      }
> +
>      return EFI_SUCCESS;
>    }
> +
>    return EFI_NOT_FOUND;
>  }
> 
> @@ -1106,23 +1163,25 @@ IsRedpathArray (
>  **/
>  UINTN
>  GetNumberOfRedpathNodes (
> -  IN EFI_STRING NodeString
> +  IN EFI_STRING  NodeString
>    )
>  {
> -  UINTN Index;
> -  UINTN NumberNodes;
> -  UINTN StringLen;
> +  UINTN  Index;
> +  UINTN  NumberNodes;
> +  UINTN  StringLen;
> 
>    NumberNodes = 0;
> -  StringLen = StrLen (NodeString);
> -  Index = 1; // ConfigLang always starts with '/'.
> +  StringLen   = StrLen (NodeString);
> +  Index       = 1; // ConfigLang always starts with '/'.
>    while (Index < StringLen) {
>      if (*(NodeString + Index) == L'/') {
> -      NumberNodes ++;
> +      NumberNodes++;
>      }
> -    Index ++;
> -  };
> -  NumberNodes ++;
> +
> +    Index++;
> +  }
> +
> +  NumberNodes++;
> 
>    return (NumberNodes);
>  }
> @@ -1141,24 +1200,25 @@ GetNumberOfRedpathNodes (
>  **/
>  EFI_STRING
>  GetRedpathNodeByIndex (
> -  IN  EFI_STRING   NodeString,
> -  IN  UINTN        Index,
> -  OUT EFI_STRING   *EndOfNodePtr OPTIONAL
> +  IN  EFI_STRING  NodeString,
> +  IN  UINTN       Index,
> +  OUT EFI_STRING  *EndOfNodePtr OPTIONAL
>    )
>  {
> -  UINTN NumberNodes;
> -  UINTN StringLen;
> -  UINTN StringIndex;
> -  EFI_STRING NodeStart;
> -  EFI_STRING NodeEnd;
> +  UINTN       NumberNodes;
> +  UINTN       StringLen;
> +  UINTN       StringIndex;
> +  EFI_STRING  NodeStart;
> +  EFI_STRING  NodeEnd;
> 
>    NumberNodes = 0;
> -  StringLen = StrLen (NodeString);
> +  StringLen   = StrLen (NodeString);
>    StringIndex = 1; // ConfigLang always starts with '/'.
> -  NodeStart = NodeString;
> +  NodeStart   = NodeString;
>    if (EndOfNodePtr != NULL) {
>      *EndOfNodePtr = NULL;
>    }
> +
>    while (StringIndex < StringLen) {
>      if (*(NodeString + StringIndex) == L'/') {
>        NodeEnd = NodeString + StringIndex - 1;
> @@ -1166,14 +1226,17 @@ GetRedpathNodeByIndex (
>          if (EndOfNodePtr != NULL) {
>            *EndOfNodePtr = NodeEnd;
>          }
> +
>          return NodeStart;
>        } else {
>          NodeStart = NodeString + StringIndex + 1;
>        }
>      }
> -    StringIndex ++;
> -  };
> - return (NULL);
> +
> +    StringIndex++;
> +  }
> +
> +  return (NULL);
>  }
> 
>  /**
> @@ -1192,18 +1255,18 @@ GetRedpathNodeByIndex (
>  **/
>  EFI_STATUS
>  GetArrayIndexFromArrayTypeConfigureLang (
> -  IN  CHAR16 *ConfigureLang,
> -  OUT CHAR16 **UnifiedConfigureLang,
> -  OUT UINTN  *Index
> +  IN  CHAR16  *ConfigureLang,
> +  OUT CHAR16  **UnifiedConfigureLang,
> +  OUT UINTN   *Index
>    )
>  {
> -  EFI_STATUS Status;
> -  CHAR16  *TmpConfigureLang;
> -  CHAR16  *ArrayOpenStr;
> -  CHAR16  *ArrayCloseStr;
> -  INTN    StringIndex;
> +  EFI_STATUS  Status;
> +  CHAR16      *TmpConfigureLang;
> +  CHAR16      *ArrayOpenStr;
> +  CHAR16      *ArrayCloseStr;
> +  INTN        StringIndex;
> 
> -  if (ConfigureLang == NULL || UnifiedConfigureLang == NULL || Index ==
> NULL) {
> +  if ((ConfigureLang == NULL) || (UnifiedConfigureLang == NULL) || (Index
> == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -1227,28 +1290,30 @@ GetArrayIndexFromArrayTypeConfigureLang (
>      //
>      // Resotre the '}' character and remove rest of string.
>      //
> -    ArrayCloseStr[0] = L'}';
> -    ArrayCloseStr[1] = '\0';
> +    ArrayCloseStr[0]      = L'}';
> +    ArrayCloseStr[1]      = '\0';
>      *UnifiedConfigureLang = TmpConfigureLang;
>    } else {
>      if (Status == EFI_NOT_FOUND) {
>        //
>        // This is not the redpath array. Search "/" for the parent root.
>        //
> -      *Index = 0;
> +      *Index      = 0;
>        StringIndex = StrLen (TmpConfigureLang) - 1;
>        while (StringIndex >= 0 && *(TmpConfigureLang + StringIndex) != '/') {
> -        StringIndex --;
> -      };
> +        StringIndex--;
> +      }
> +
>        if (StringIndex >= 0 ) {
>          *(TmpConfigureLang + StringIndex) = '\0';
> -        *UnifiedConfigureLang = TmpConfigureLang;
> -        Status = EFI_SUCCESS;
> +        *UnifiedConfigureLang             = TmpConfigureLang;
> +        Status                            = EFI_SUCCESS;
>        } else {
>          Status = EFI_INVALID_PARAMETER;
>        }
>      }
>    }
> +
>    return Status;
>  }
> 
> @@ -1265,27 +1330,30 @@ GetArrayIndexFromArrayTypeConfigureLang (
>  **/
>  EFI_STATUS
>  CopyConfiglanguageList (
> -  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *SourceConfigureLangList,
> -  OUT  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *DestConfigureLangList
> +  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *SourceConfigureLangList,
> +  OUT  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *DestConfigureLangList
>    )
>  {
> -  UINTN Index;
> +  UINTN  Index;
> 
> -  if (SourceConfigureLangList == NULL || DestConfigureLangList == NULL) {
> +  if ((SourceConfigureLangList == NULL) || (DestConfigureLangList == NULL))
> {
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    DestConfigureLangList->Count = SourceConfigureLangList->Count;
> -  DestConfigureLangList->List =
> -      (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *)AllocateZeroPool
> (sizeof (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG) *
> DestConfigureLangList->Count);
> +  DestConfigureLangList->List  =
> +    (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *)AllocateZeroPool
> (sizeof (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG) *
> DestConfigureLangList->Count);
>    if (DestConfigureLangList->List == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, Fail to allocate memory for
> REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG.\n", __FUNCTION__));
>      return EFI_OUT_OF_RESOURCES;
>    }
> +
>    for (Index = 0; Index < SourceConfigureLangList->Count; Index++) {
> -    DestConfigureLangList->List [Index].Index = SourceConfigureLangList-
> >List[Index].Index;
> -    DestConfigureLangList->List [Index].ConfigureLang =
> -      (EFI_STRING)AllocateCopyPool(StrSize(SourceConfigureLangList-
> >List[Index].ConfigureLang), (VOID *)SourceConfigureLangList-
> >List[Index].ConfigureLang);
> +    DestConfigureLangList->List[Index].Index         = SourceConfigureLangList-
> >List[Index].Index;
> +    DestConfigureLangList->List[Index].ConfigureLang =
> +      (EFI_STRING)AllocateCopyPool (StrSize (SourceConfigureLangList-
> >List[Index].ConfigureLang), (VOID *)SourceConfigureLangList-
> >List[Index].ConfigureLang);
>    }
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -1300,39 +1368,45 @@ CopyConfiglanguageList (
>  **/
>  UINTN
>  ConfiglanguageGetInstanceIndex (
> -  IN EFI_STRING ConfigureLang
> +  IN EFI_STRING  ConfigureLang
>    )
>  {
> -  INTN LeftBracketIndex;
> -  INTN RightBracketIndex;
> -  INTN Index;
> -  UINT64 Instance;
> -  EFI_STATUS Status;
> +  INTN        LeftBracketIndex;
> +  INTN        RightBracketIndex;
> +  INTN        Index;
> +  UINT64      Instance;
> +  EFI_STATUS  Status;
> 
>    if (ConfigureLang == NULL) {
>      return 0;
>    }
> -  LeftBracketIndex = 0;
> +
> +  LeftBracketIndex  = 0;
>    RightBracketIndex = 0;
> -  Index = StrLen (ConfigureLang) - 1;
> +  Index             = StrLen (ConfigureLang) - 1;
>    while (Index >= 0) {
>      if (*(ConfigureLang + Index) == L'{') {
>        LeftBracketIndex = Index;
>        break;
>      }
> +
>      if (*(ConfigureLang + Index) == L'}') {
>        RightBracketIndex = Index;
>      }
> -    Index --;
> -  };
> +
> +    Index--;
> +  }
> +
>    if ((RightBracketIndex - LeftBracketIndex) <= 1) {
>      return 0;
>    }
> +
>    *(ConfigureLang + RightBracketIndex) = 0;
> -  Status = StrDecimalToUint64S (ConfigureLang + LeftBracketIndex + 1, NULL,
> &Instance);
> -  if (EFI_ERROR(Status)) {
> +  Status                               = StrDecimalToUint64S (ConfigureLang +
> LeftBracketIndex + 1, NULL, &Instance);
> +  if (EFI_ERROR (Status)) {
>      Instance = 0;
>    }
> +
>    //
>    // Restore right curly bracket.
>    //
> @@ -1353,20 +1427,22 @@ ConfiglanguageGetInstanceIndex (
>  **/
>  EFI_STATUS
>  DestroyConfiglanguageList (
> -  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *ConfigureLangList
> +  IN   REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *ConfigureLangList
>    )
>  {
> -  UINTN Index;
> +  UINTN  Index;
> 
>    if (ConfigureLangList == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    if (ConfigureLangList->List != NULL) {
>      for (Index = 0; Index < ConfigureLangList->Count; Index++) {
> -      if (ConfigureLangList->List [Index].ConfigureLang != NULL) {
> -        FreePool (ConfigureLangList->List [Index].ConfigureLang);
> +      if (ConfigureLangList->List[Index].ConfigureLang != NULL) {
> +        FreePool (ConfigureLangList->List[Index].ConfigureLang);
>        }
>      }
> +
>      FreePool (ConfigureLangList->List);
>      ConfigureLangList->List = NULL;
>    }
> @@ -1391,56 +1467,60 @@ DestroyConfiglanguageList (
>  **/
>  EFI_STATUS
>  SetResourceConfigLangMemberInstance (
> -  IN EFI_STRING                               *DestConfigLang,
> -  IN UINTN                                    MaxtLengthConfigLang,
> -  IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG   *ConfigLangInstance
> +  IN EFI_STRING                              *DestConfigLang,
> +  IN UINTN                                   MaxtLengthConfigLang,
> +  IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG  *ConfigLangInstance
>    )
>  {
> -  EFI_STRING ThisConfigLang;
> -  EFI_STRING NewConfigLang;
> -  CHAR16 InstanceStr [10];
> -  INTN Index;
> -  UINTN Length;
> -  UINTN MaxStrLength;
> -
> -  if (DestConfigLang == NULL || ConfigLangInstance == NULL) {
> +  EFI_STRING  ThisConfigLang;
> +  EFI_STRING  NewConfigLang;
> +  CHAR16      InstanceStr[10];
> +  INTN        Index;
> +  UINTN       Length;
> +  UINTN       MaxStrLength;
> +
> +  if ((DestConfigLang == NULL) || (ConfigLangInstance == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    UnicodeSPrint ((CHAR16 *)&InstanceStr, 10, L"%d", ConfigLangInstance-
> >Index);
> 
>    ThisConfigLang = *DestConfigLang;
> -  if (ThisConfigLang [0] == 0) {
> +  if (ThisConfigLang[0] == 0) {
>      //
>      // Return ConfigLangInstance->ConfigureLang
>      //
>      if (ConfigLangInstance->ConfigureLang == NULL) {
>        return EFI_INVALID_PARAMETER;
>      } else {
> -      StrCatS(*DestConfigLang, MaxtLengthConfigLang, ConfigLangInstance-
> >ConfigureLang);
> +      StrCatS (*DestConfigLang, MaxtLengthConfigLang, ConfigLangInstance-
> >ConfigureLang);
>        return EFI_SUCCESS;
>      }
>    }
> 
> -  MaxStrLength = StrSize (ThisConfigLang) + StrSize
> ((EFI_STRING)&InstanceStr);
> +  MaxStrLength  = StrSize (ThisConfigLang) + StrSize
> ((EFI_STRING)&InstanceStr);
>    NewConfigLang = ThisConfigLang;
>    if (MaxtLengthConfigLang < MaxStrLength) {
> -    NewConfigLang = (EFI_STRING)AllocateZeroPool(MaxStrLength);
> +    NewConfigLang = (EFI_STRING)AllocateZeroPool (MaxStrLength);
>      if (NewConfigLang == NULL) {
>        DEBUG ((DEBUG_ERROR, "%a, Fail to allocate memory for
> NewConfigLang.\n", __FUNCTION__));
>        return EFI_OUT_OF_RESOURCES;
>      }
>    }
> +
>    //
>    // Search the last "{"
>    //
>    Index = StrLen (ThisConfigLang) - 1;
>    while ((ThisConfigLang[Index] != '{') && (Index >= 0)) {
> -    Index --;
> -  };
> +    Index--;
> +  }
> +
>    if (Index == -1) {
>      if (NewConfigLang != ThisConfigLang) {
> -      FreePool(NewConfigLang);
> +      FreePool (NewConfigLang);
>      }
> +
>      return EFI_NOT_FOUND;
>    }
> 
> @@ -1449,15 +1529,17 @@ SetResourceConfigLangMemberInstance (
>    //
>    Length = 0;
>    while (Index >= 0) {
> -    NewConfigLang [Index] = ThisConfigLang[Index];
> -    Index --;
> -    Length ++;
> -  };
> +    NewConfigLang[Index] = ThisConfigLang[Index];
> +    Index--;
> +    Length++;
> +  }
> +
>    UnicodeSPrint ((CHAR16 *)(NewConfigLang + Length), MaxStrLength,
> L"%d", ConfigLangInstance->Index);
>    StrCatS (NewConfigLang, MaxStrLength, L"}");
>    if (NewConfigLang != ThisConfigLang) {
>      FreePool (ThisConfigLang);
>    }
> +
>    *DestConfigLang = NewConfigLang;
>    return EFI_SUCCESS;
>  }
> @@ -1478,28 +1560,28 @@ SetResourceConfigLangMemberInstance (
>  **/
>  EFI_STATUS
>  RedfishFeatureGetUnifiedArrayTypeConfigureLang (
> -  IN     CHAR8                                        *Schema,
> -  IN     CHAR8                                        *Version,
> -  IN     EFI_STRING                                   Pattern,  OPTIONAL
> +  IN     CHAR8 *Schema,
> +  IN     CHAR8 *Version,
> +  IN     EFI_STRING Pattern, OPTIONAL
>    OUT    REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST
> *UnifiedConfigureLangList
>    )
>  {
> -  EFI_STATUS Status;
> -  EFI_STRING *ConfigureLangList;
> -  UINTN      Count;
> -  UINTN      Index;
> -  UINTN      Index2;
> -  UINTN      ArrayIndex;
> -  EFI_STRING UnifiedConfigureLang;
> -  BOOLEAN    Duplicated;
> -  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG
> UnifiedConfigureLangPool[BIOS_CONFIG_TO_REDFISH_REDPATH_POOL_SIZ
> E];
> -
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> UnifiedConfigureLangList == NULL) {
> +  EFI_STATUS                              Status;
> +  EFI_STRING                              *ConfigureLangList;
> +  UINTN                                   Count;
> +  UINTN                                   Index;
> +  UINTN                                   Index2;
> +  UINTN                                   ArrayIndex;
> +  EFI_STRING                              UnifiedConfigureLang;
> +  BOOLEAN                                 Duplicated;
> +  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG
> UnifiedConfigureLangPool[BIOS_CONFIG_TO_REDFISH_REDPATH_POOL_SIZ
> E];
> +
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> (UnifiedConfigureLangList == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
>    UnifiedConfigureLangList->Count = 0;
> -  UnifiedConfigureLangList->List = NULL;
> +  UnifiedConfigureLangList->List  = NULL;
>    ZeroMem (UnifiedConfigureLangPool, sizeof (UnifiedConfigureLangPool));
> 
>    Status = RedfishPlatformConfigGetConfigureLang (Schema, Version,
> Pattern, &ConfigureLangList, &Count);
> @@ -1514,7 +1596,7 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang
> (
> 
>    for (Index = 0; Index < Count; Index++) {
>      Status = GetArrayIndexFromArrayTypeConfigureLang
> (ConfigureLangList[Index], &UnifiedConfigureLang, &ArrayIndex);
> -    if (EFI_ERROR (Status) && Status == EFI_INVALID_PARAMETER) {
> +    if (EFI_ERROR (Status) && (Status == EFI_INVALID_PARAMETER)) {
>        ASSERT (FALSE);
>        continue;
>      }
> @@ -1550,7 +1632,7 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang
> (
>      //
> 
>      UnifiedConfigureLangPool[UnifiedConfigureLangList-
> >Count].ConfigureLang = UnifiedConfigureLang;
> -    UnifiedConfigureLangPool[UnifiedConfigureLangList->Count].Index =
> ArrayIndex;
> +    UnifiedConfigureLangPool[UnifiedConfigureLangList->Count].Index         =
> ArrayIndex;
>      ++UnifiedConfigureLangList->Count;
>    }
> 
> @@ -1578,23 +1660,23 @@
> RedfishFeatureGetUnifiedArrayTypeConfigureLang (
>  **/
>  EFI_STATUS
>  GetEtagAndLocation (
> -  IN  REDFISH_RESPONSE  *Response,
> -  OUT CHAR8             **Etag,       OPTIONAL
> +  IN  REDFISH_RESPONSE *Response,
> +  OUT CHAR8 **Etag, OPTIONAL
>    OUT EFI_STRING        *Location    OPTIONAL
>    )
>  {
> -  EDKII_JSON_VALUE   JsonValue;
> -  EDKII_JSON_VALUE   OdataValue;
> -  CHAR8              *OdataString;
> -  CHAR8              *AsciiLocation;
> -  EFI_HTTP_HEADER    *Header;
> -  EFI_STATUS         Status;
> +  EDKII_JSON_VALUE  JsonValue;
> +  EDKII_JSON_VALUE  OdataValue;
> +  CHAR8             *OdataString;
> +  CHAR8             *AsciiLocation;
> +  EFI_HTTP_HEADER   *Header;
> +  EFI_STATUS        Status;
> 
>    if (Response == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  if (Etag == NULL && Location == NULL) {
> +  if ((Etag == NULL) && (Location == NULL)) {
>      return EFI_SUCCESS;
>    }
> 
> @@ -1614,7 +1696,7 @@ GetEtagAndLocation (
>      //
>      // No header is returned. Search payload for location.
>      //
> -    if (*Etag == NULL && Response->Payload != NULL) {
> +    if ((*Etag == NULL) && (Response->Payload != NULL)) {
>        JsonValue = RedfishJsonInPayload (Response->Payload);
>        if (JsonValue != NULL) {
>          OdataValue = JsonObjectGetValue (JsonValueGetObject (JsonValue),
> "@odata.etag");
> @@ -1649,7 +1731,7 @@ GetEtagAndLocation (
>      //
>      // No header is returned. Search payload for location.
>      //
> -    if (*Location == NULL && Response->Payload != NULL) {
> +    if ((*Location == NULL) && (Response->Payload != NULL)) {
>        JsonValue = RedfishJsonInPayload (Response->Payload);
>        if (JsonValue != NULL) {
>          OdataValue = JsonObjectGetValue (JsonValueGetObject (JsonValue),
> "@odata.id");
> @@ -1675,6 +1757,7 @@ GetEtagAndLocation (
> 
>    return Status;
>  }
> +
>  /**
> 
>    Create HTTP payload and send them to redfish service with PATCH method.
> @@ -1690,25 +1773,25 @@ GetEtagAndLocation (
>  **/
>  EFI_STATUS
>  CreatePayloadToPatchResource (
> -  IN  REDFISH_SERVICE *Service,
> -  IN  REDFISH_PAYLOAD *TargetPayload,
> -  IN  CHAR8           *Json,
> -  OUT CHAR8           **Etag
> +  IN  REDFISH_SERVICE  *Service,
> +  IN  REDFISH_PAYLOAD  *TargetPayload,
> +  IN  CHAR8            *Json,
> +  OUT CHAR8            **Etag
>    )
>  {
> -  REDFISH_PAYLOAD    Payload;
> -  EDKII_JSON_VALUE   ResourceJsonValue;
> -  REDFISH_RESPONSE   PostResponse;
> -  EFI_STATUS         Status;
> +  REDFISH_PAYLOAD   Payload;
> +  EDKII_JSON_VALUE  ResourceJsonValue;
> +  REDFISH_RESPONSE  PostResponse;
> +  EFI_STATUS        Status;
> 
> -  if (Service == NULL || TargetPayload == NULL || IS_EMPTY_STRING (Json)
> || Etag == NULL) {
> +  if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING
> (Json) || (Etag == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
>    ResourceJsonValue = JsonLoadString (Json, 0, NULL);
> -  Payload = RedfishCreatePayload (ResourceJsonValue, Service);
> +  Payload           = RedfishCreatePayload (ResourceJsonValue, Service);
>    if (Payload == NULL) {
> -    DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from
> JSON value!\n",__FUNCTION__, __LINE__));
> +    DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from
> JSON value!\n", __FUNCTION__, __LINE__));
>      Status =  EFI_DEVICE_ERROR;
>      goto EXIT_FREE_JSON_VALUE;
>    }
> @@ -1716,7 +1799,7 @@ CreatePayloadToPatchResource (
>    ZeroMem (&PostResponse, sizeof (REDFISH_RESPONSE));
>    Status = RedfishPatchToPayload (TargetPayload, Payload, &PostResponse);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a:%d Failed to PATCH payload to Redfish
> service.\n",__FUNCTION__, __LINE__));
> +    DEBUG ((DEBUG_ERROR, "%a:%d Failed to PATCH payload to Redfish
> service.\n", __FUNCTION__, __LINE__));
>      goto EXIT_FREE_JSON_VALUE;
>    }
> 
> @@ -1761,26 +1844,26 @@ EXIT_FREE_JSON_VALUE:
>  **/
>  EFI_STATUS
>  CreatePayloadToPostResource (
> -  IN  REDFISH_SERVICE *Service,
> -  IN  REDFISH_PAYLOAD *TargetPayload,
> -  IN  CHAR8           *Json,
> -  OUT EFI_STRING      *Location,
> -  OUT CHAR8           **Etag
> +  IN  REDFISH_SERVICE  *Service,
> +  IN  REDFISH_PAYLOAD  *TargetPayload,
> +  IN  CHAR8            *Json,
> +  OUT EFI_STRING       *Location,
> +  OUT CHAR8            **Etag
>    )
>  {
> -  REDFISH_PAYLOAD    Payload;
> -  EDKII_JSON_VALUE   ResourceJsonValue;
> -  REDFISH_RESPONSE   PostResponse;
> -  EFI_STATUS         Status;
> +  REDFISH_PAYLOAD   Payload;
> +  EDKII_JSON_VALUE  ResourceJsonValue;
> +  REDFISH_RESPONSE  PostResponse;
> +  EFI_STATUS        Status;
> 
> -  if (Service == NULL || TargetPayload == NULL || IS_EMPTY_STRING (Json)
> || Location == NULL || Etag == NULL) {
> +  if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING
> (Json) || (Location == NULL) || (Etag == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
>    ResourceJsonValue = JsonLoadString (Json, 0, NULL);
> -  Payload = RedfishCreatePayload (ResourceJsonValue, Service);
> +  Payload           = RedfishCreatePayload (ResourceJsonValue, Service);
>    if (Payload == NULL) {
> -    DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from
> JSON value!\n",__FUNCTION__, __LINE__));
> +    DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from
> JSON value!\n", __FUNCTION__, __LINE__));
>      Status =  EFI_DEVICE_ERROR;
>      goto EXIT_FREE_JSON_VALUE;
>    }
> @@ -1788,7 +1871,7 @@ CreatePayloadToPostResource (
>    ZeroMem (&PostResponse, sizeof (REDFISH_RESPONSE));
>    Status = RedfishPostToPayload (TargetPayload, Payload, &PostResponse);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a:%d Failed to POST Attribute Registry to
> Redfish service.\n",__FUNCTION__, __LINE__));
> +    DEBUG ((DEBUG_ERROR, "%a:%d Failed to POST Attribute Registry to
> Redfish service.\n", __FUNCTION__, __LINE__));
>      goto EXIT_FREE_JSON_VALUE;
>    }
> 
> @@ -1827,19 +1910,19 @@ EXIT_FREE_JSON_VALUE:
>  **/
>  EFI_STRING
>  RedfishGetUri (
> -  IN  EFI_STRING ConfigLang
> +  IN  EFI_STRING  ConfigLang
>    )
>  {
> -  EFI_STATUS Status;
> -  EFI_STRING Target;
> -  EFI_STRING Found;
> -  EFI_STRING TempStr;
> -  EFI_STRING ResultStr;
> -  EFI_STRING Head;
> -  EFI_STRING CloseBracket;
> -  UINTN      TempStrSize;
> -  UINTN      RemainingLen;
> -  UINTN      ConfigLangLen;
> +  EFI_STATUS  Status;
> +  EFI_STRING  Target;
> +  EFI_STRING  Found;
> +  EFI_STRING  TempStr;
> +  EFI_STRING  ResultStr;
> +  EFI_STRING  Head;
> +  EFI_STRING  CloseBracket;
> +  UINTN       TempStrSize;
> +  UINTN       RemainingLen;
> +  UINTN       ConfigLangLen;
> 
>    Status = RedfishLocateProtocol ((VOID **)&mConfigLangMapProtocol,
> &gEdkIIRedfishConfigLangMapProtocolGuid);
>    if (EFI_ERROR (Status)) {
> @@ -1875,7 +1958,7 @@ RedfishGetUri (
>    //
>    do {
>      ConfigLangLen = StrLen (Head);
> -    Target = CloseBracket;
> +    Target        = CloseBracket;
> 
>      //
>      // Look for next ConfigLang
> @@ -1895,13 +1978,14 @@ RedfishGetUri (
>      //
>      // Copy current ConfigLang to temporary string and do a query
>      //
> -    Target += 1;
> +    Target      += 1;
>      RemainingLen = StrLen (Target);
> -    TempStrSize = (ConfigLangLen - RemainingLen + 1) * sizeof (CHAR16);
> -    TempStr = AllocateCopyPool (TempStrSize, Head);
> +    TempStrSize  = (ConfigLangLen - RemainingLen + 1) * sizeof (CHAR16);
> +    TempStr      = AllocateCopyPool (TempStrSize, Head);
>      if (TempStr == NULL) {
>        return NULL;
>      }
> +
>      TempStr[ConfigLangLen - RemainingLen] = '\0';
> 
>      Status = mConfigLangMapProtocol->Get (
> @@ -1926,7 +2010,7 @@ RedfishGetUri (
>      //
>      // Prepare for next ConfigLang
>      //
> -    Head = Target;
> +    Head         = Target;
>      CloseBracket = StrStr (Head, L"{");
>    } while (CloseBracket != NULL);
> 
> @@ -1954,7 +2038,7 @@ RedfishGetUri (
>  **/
>  EFI_STRING
>  RedfishGetConfigLanguage (
> -  IN  EFI_STRING Uri
> +  IN  EFI_STRING  Uri
>    )
>  {
>    EFI_STATUS  Status;
> @@ -1973,13 +2057,12 @@ RedfishGetConfigLanguage (
>    }
> 
>    ConfigLang = NULL;
> -  Status = mConfigLangMapProtocol->Get (
> -                                     mConfigLangMapProtocol,
> -                                     RedfishGetTypeUri,
> -                                     Uri,
> -                                     &ConfigLang
> -                                     );
> -
> +  Status     = mConfigLangMapProtocol->Get (
> +                                         mConfigLangMapProtocol,
> +                                         RedfishGetTypeUri,
> +                                         Uri,
> +                                         &ConfigLang
> +                                         );
> 
>    return ConfigLang;
>  }
> @@ -1997,8 +2080,8 @@ RedfishGetConfigLanguage (
>  **/
>  EFI_STRING
>  GetConfigureLang (
> -  IN  CHAR8 *Uri,
> -  IN  CHAR8 *PropertyName   OPTIONAL
> +  IN  CHAR8  *Uri,
> +  IN  CHAR8  *PropertyName   OPTIONAL
>    )
>  {
>    EFI_STRING  ConfigLang;
> @@ -2032,7 +2115,7 @@ GetConfigureLang (
>    }
> 
>    StringSize = StrSize (ConfigLang) + ((AsciiStrLen (PropertyName) + 1) *
> sizeof (CHAR16));
> -  ResultStr = AllocatePool (StringSize);
> +  ResultStr  = AllocatePool (StringSize);
>    if (ResultStr == NULL) {
>      return NULL;
>    }
> @@ -2059,7 +2142,7 @@ RedfisSetRedfishUri (
>    IN    EFI_STRING  Uri
>    )
>  {
> -  EFI_STATUS Status;
> +  EFI_STATUS  Status;
> 
>    if (IS_EMPTY_STRING (ConfigLang) || IS_EMPTY_STRING (Uri)) {
>      return EFI_INVALID_PARAMETER;
> @@ -2088,12 +2171,12 @@ RedfisSetRedfishUri (
>  **/
>  EFI_STRING
>  GetOdataId (
> -  IN  REDFISH_PAYLOAD *Payload
> +  IN  REDFISH_PAYLOAD  *Payload
>    )
>  {
> -  EDKII_JSON_VALUE *JsonValue;
> -  EDKII_JSON_VALUE *OdataId;
> -  EFI_STRING       OdataIdString;
> +  EDKII_JSON_VALUE  *JsonValue;
> +  EDKII_JSON_VALUE  *OdataId;
> +  EFI_STRING        OdataIdString;
> 
>    if (Payload == NULL) {
>      return NULL;
> @@ -2117,7 +2200,6 @@ GetOdataId (
>    return AllocateCopyPool (StrSize (OdataIdString), OdataIdString);
>  }
> 
> -
>  /**
> 
>    Get the property name by given Configure Langauge.
> @@ -2131,25 +2213,27 @@ GetOdataId (
>  **/
>  EFI_STRING
>  GetPropertyFromConfigureLang (
> -  IN EFI_STRING ResourceUri,
> -  IN EFI_STRING ConfigureLang
> +  IN EFI_STRING  ResourceUri,
> +  IN EFI_STRING  ConfigureLang
>    )
>  {
>    EFI_STATUS  Status;
>    EFI_STRING  TempString;
> 
> -  if (ConfigureLang == NULL || ResourceUri == NULL) {
> +  if ((ConfigureLang == NULL) || (ResourceUri == NULL)) {
>      return NULL;
>    }
> 
>    Status = IsRedpathArray (ConfigureLang, NULL, &TempString);
> -  if (!EFI_ERROR(Status)) {
> +  if (!EFI_ERROR (Status)) {
>      TempString += 2; // Advance two characters for '}' and '/'
>      return TempString;
>    }
> +
>    if (Status != EFI_NOT_FOUND) {
>      return NULL;
>    }
> +
>    //
>    // The ConigLang has no '{}'
>    //
> @@ -2160,6 +2244,7 @@ GetPropertyFromConfigureLang (
>    if (GetRedpathNodeByIndex (ConfigureLang, 0, &TempString) == NULL) {
>      return NULL;
>    }
> +
>    //
>    // Advance two characters to the starting
>    // pointer of next node.
> @@ -2182,17 +2267,17 @@ GetPropertyFromConfigureLang (
>  **/
>  CHAR8 *
>  GetPropertyStringValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> -  EFI_STRING          ConfigureLangBuffer;
> -  UINTN               BufferSize;
> -  CHAR8               *AsciiStringValue;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> +  EFI_STRING           ConfigureLangBuffer;
> +  UINTN                BufferSize;
> +  CHAR8                *AsciiStringValue;
> 
>    if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) {
>      return NULL;
> @@ -2201,7 +2286,7 @@ GetPropertyStringValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      return NULL;
> @@ -2240,17 +2325,17 @@ GetPropertyStringValue (
>  **/
>  INT64 *
>  GetPropertyNumericValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> -  EFI_STRING          ConfigureLangBuffer;
> -  UINTN               BufferSize;
> -  INT64               *ResultValue;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> +  EFI_STRING           ConfigureLangBuffer;
> +  UINTN                BufferSize;
> +  INT64                *ResultValue;
> 
>    if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) {
>      return NULL;
> @@ -2259,7 +2344,7 @@ GetPropertyNumericValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      return NULL;
> @@ -2302,17 +2387,17 @@ GetPropertyNumericValue (
>  **/
>  BOOLEAN *
>  GetPropertyBooleanValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> -  EFI_STRING          ConfigureLangBuffer;
> -  UINTN               BufferSize;
> -  BOOLEAN             *ResultValue;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> +  EFI_STRING           ConfigureLangBuffer;
> +  UINTN                BufferSize;
> +  BOOLEAN              *ResultValue;
> 
>    if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) {
>      return NULL;
> @@ -2321,7 +2406,7 @@ GetPropertyBooleanValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      return NULL;
> @@ -2366,8 +2451,8 @@ GetAttributeNameFromConfigLanguage (
>    IN  EFI_STRING  ConfigureLanguage
>    )
>  {
> -  UINTN StringLen;
> -  UINTN Index;
> +  UINTN  StringLen;
> +  UINTN  Index;
> 
>    if (IS_EMPTY_STRING (ConfigureLanguage)) {
>      return NULL;
> @@ -2398,21 +2483,21 @@ GetAttributeNameFromConfigLanguage (
>  **/
>  CHAR8 **
>  GetPropertyStringArrayValue (
> -  IN  CHAR8               *Schema,
> -  IN  CHAR8               *Version,
> -  IN  EFI_STRING          PropertyName,
> -  IN  EFI_STRING          ConfigureLang,
> -  OUT UINTN               *ArraySize
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  PropertyName,
> +  IN  EFI_STRING  ConfigureLang,
> +  OUT UINTN       *ArraySize
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> -  EFI_STRING          ConfigureLangBuffer;
> -  UINTN               BufferSize;
> -  CHAR8               **StringArray;
> -  UINTN               Index;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> +  EFI_STRING           ConfigureLangBuffer;
> +  UINTN                BufferSize;
> +  CHAR8                **StringArray;
> +  UINTN                Index;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)
> || ArraySize == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)
> || (ArraySize == NULL)) {
>      return NULL;
>    }
> 
> @@ -2421,7 +2506,7 @@ GetPropertyStringArrayValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));
> @@ -2469,21 +2554,21 @@ GetPropertyStringArrayValue (
>  **/
>  INT64 *
>  GetPropertyNumericArrayValue (
> -  IN  CHAR8               *Schema,
> -  IN  CHAR8               *Version,
> -  IN  EFI_STRING          PropertyName,
> -  IN  EFI_STRING          ConfigureLang,
> -  OUT UINTN               *ArraySize
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  PropertyName,
> +  IN  EFI_STRING  ConfigureLang,
> +  OUT UINTN       *ArraySize
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> -  EFI_STRING          ConfigureLangBuffer;
> -  UINTN               BufferSize;
> -  INT64               *IntegerArray;
> -  UINTN               Index;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> +  EFI_STRING           ConfigureLangBuffer;
> +  UINTN                BufferSize;
> +  INT64                *IntegerArray;
> +  UINTN                Index;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)
> || ArraySize == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)
> || (ArraySize == NULL)) {
>      return NULL;
>    }
> 
> @@ -2492,7 +2577,7 @@ GetPropertyNumericArrayValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));
> @@ -2540,21 +2625,21 @@ GetPropertyNumericArrayValue (
>  **/
>  BOOLEAN *
>  GetPropertyBooleanArrayValue (
> -  IN  CHAR8               *Schema,
> -  IN  CHAR8               *Version,
> -  IN  EFI_STRING          PropertyName,
> -  IN  EFI_STRING          ConfigureLang,
> -  OUT UINTN               *ArraySize
> +  IN  CHAR8       *Schema,
> +  IN  CHAR8       *Version,
> +  IN  EFI_STRING  PropertyName,
> +  IN  EFI_STRING  ConfigureLang,
> +  OUT UINTN       *ArraySize
>    )
>  {
> -  EFI_STATUS          Status;
> -  EDKII_REDFISH_VALUE RedfishValue;
> -  EFI_STRING          ConfigureLangBuffer;
> -  UINTN               BufferSize;
> -  BOOLEAN             *BooleanArray;
> -  UINTN               Index;
> +  EFI_STATUS           Status;
> +  EDKII_REDFISH_VALUE  RedfishValue;
> +  EFI_STRING           ConfigureLangBuffer;
> +  UINTN                BufferSize;
> +  BOOLEAN              *BooleanArray;
> +  UINTN                Index;
> 
> -  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)
> || ArraySize == NULL) {
> +  if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)
> || (ArraySize == NULL)) {
>      return NULL;
>    }
> 
> @@ -2563,7 +2648,7 @@ GetPropertyBooleanArrayValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));
> @@ -2605,25 +2690,28 @@ GetPropertyBooleanArrayValue (
>  **/
>  VOID
>  FreeEmptyPropKeyValueList (
> -  RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueListHead
> +  RedfishCS_EmptyProp_KeyValue  *EmptyPropKeyValueListHead
>    )
>  {
> -  RedfishCS_EmptyProp_KeyValue *NextEmptyPropKeyValueList;
> +  RedfishCS_EmptyProp_KeyValue  *NextEmptyPropKeyValueList;
> 
>    while (EmptyPropKeyValueListHead != NULL) {
>      NextEmptyPropKeyValueList = EmptyPropKeyValueListHead-
> >NextKeyValuePtr;
>      if (EmptyPropKeyValueListHead->Value->DataValue.CharPtr != NULL) {
> -      FreePool(EmptyPropKeyValueListHead->Value->DataValue.CharPtr);
> +      FreePool (EmptyPropKeyValueListHead->Value->DataValue.CharPtr);
>      }
> +
>      if (EmptyPropKeyValueListHead->Value != NULL) {
> -      FreePool(EmptyPropKeyValueListHead->Value);
> +      FreePool (EmptyPropKeyValueListHead->Value);
>      }
> +
>      if (EmptyPropKeyValueListHead->KeyNamePtr != NULL) {
> -      FreePool(EmptyPropKeyValueListHead->KeyNamePtr);
> +      FreePool (EmptyPropKeyValueListHead->KeyNamePtr);
>      }
> +
>      FreePool (EmptyPropKeyValueListHead);
>      EmptyPropKeyValueListHead = NextEmptyPropKeyValueList;
> -  };
> +  }
>  }
> 
>  /**
> @@ -2640,26 +2728,28 @@ FreeEmptyPropKeyValueList (
>  RedfishCS_EmptyProp_KeyValue *
>  NewEmptyPropKeyValueFromRedfishValue (
>    IN  EFI_STRING           KeyName,
> -  IN  EDKII_REDFISH_VALUE *RedfishValue
> +  IN  EDKII_REDFISH_VALUE  *RedfishValue
>    )
>  {
> -  RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValue;
> -  RedfishCS_Vague              *VagueValue;
> -  RedfishCS_char               *KeyNameChar;
> -  VOID                         *Data;
> -  UINTN                        DataSize;
> -  INT32                        Bool32;
> -
> -  KeyNameChar = StrUnicodeToAscii(KeyName);
> +  RedfishCS_EmptyProp_KeyValue  *EmptyPropKeyValue;
> +  RedfishCS_Vague               *VagueValue;
> +  RedfishCS_char                *KeyNameChar;
> +  VOID                          *Data;
> +  UINTN                         DataSize;
> +  INT32                         Bool32;
> +
> +  KeyNameChar = StrUnicodeToAscii (KeyName);
>    if (KeyNameChar == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, Failed to convert unicode to ASCII.\n",
> __FUNCTION__));
>      return NULL;
>    }
> +
>    EmptyPropKeyValue = (RedfishCS_EmptyProp_KeyValue
> *)AllocateZeroPool (sizeof (RedfishCS_EmptyProp_KeyValue));
>    if (EmptyPropKeyValue == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for
> EmptyPropKeyValue\n", __FUNCTION__));
>      return NULL;
>    }
> +
>    VagueValue = (RedfishCS_Vague *)AllocateZeroPool (sizeof
> (RedfishCS_Vague));
>    if (VagueValue == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for
> VagueValue\n", __FUNCTION__));
> @@ -2669,29 +2759,30 @@ NewEmptyPropKeyValueFromRedfishValue (
> 
>    if (RedfishValue->Type == REDFISH_VALUE_TYPE_BOOLEAN) {
>      VagueValue->DataType = RedfishCS_Vague_DataType_Bool;
> -    DataSize = sizeof (BOOLEAN);
> +    DataSize             = sizeof (BOOLEAN);
>      //
>      // Redfish JSON to C strcuture converter uses
>      // "int" for the BOOLEAN.
>      //
>      Bool32 = (INT32)RedfishValue->Value.Boolean;
> -    Data = (VOID *)&Bool32;
> +    Data   = (VOID *)&Bool32;
>    } else if (RedfishValue->Type == REDFISH_VALUE_TYPE_INTEGER) {
>      VagueValue->DataType = RedfishCS_Vague_DataType_Int64;
> -    DataSize = sizeof (INT64);
> -    Data = (VOID *)&RedfishValue->Value.Integer;
> +    DataSize             = sizeof (INT64);
> +    Data                 = (VOID *)&RedfishValue->Value.Integer;
>    } else if (RedfishValue->Type == REDFISH_VALUE_TYPE_STRING) {
>      VagueValue->DataType = RedfishCS_Vague_DataType_String;
> -    DataSize = AsciiStrSize(RedfishValue->Value.Buffer);
> -    Data = (VOID *)RedfishValue->Value.Buffer;
> +    DataSize             = AsciiStrSize (RedfishValue->Value.Buffer);
> +    Data                 = (VOID *)RedfishValue->Value.Buffer;
>    } else {
>      DEBUG ((DEBUG_ERROR, "%a, wrong type of RedfishValue: %x\n",
> __FUNCTION__, RedfishValue->Type));
>      FreePool (VagueValue);
>      FreePool (EmptyPropKeyValue);
>      return NULL;
>    }
> -  VagueValue->DataValue.CharPtr = (RedfishCS_char
> *)AllocateCopyPool(DataSize, Data);
> -  EmptyPropKeyValue->Value = VagueValue;
> +
> +  VagueValue->DataValue.CharPtr = (RedfishCS_char *)AllocateCopyPool
> (DataSize, Data);
> +  EmptyPropKeyValue->Value      = VagueValue;
>    EmptyPropKeyValue->KeyNamePtr = KeyNameChar;
>    return EmptyPropKeyValue;
>  }
> @@ -2712,25 +2803,25 @@ NewEmptyPropKeyValueFromRedfishValue (
>  **/
>  RedfishCS_EmptyProp_KeyValue *
>  GetPropertyVagueValue (
> -  IN CHAR8      *Schema,
> -  IN CHAR8      *Version,
> -  IN EFI_STRING PropertyName,
> -  IN EFI_STRING ConfigureLang,
> -  OUT UINT32    *NumberOfValues
> +  IN CHAR8       *Schema,
> +  IN CHAR8       *Version,
> +  IN EFI_STRING  PropertyName,
> +  IN EFI_STRING  ConfigureLang,
> +  OUT UINT32     *NumberOfValues
>    )
>  {
> -  EFI_STATUS                   Status;
> -  RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueList;
> -  RedfishCS_EmptyProp_KeyValue *PreEmptyPropKeyValueList;
> -  RedfishCS_EmptyProp_KeyValue *FirstEmptyPropKeyValueList;
> -  EDKII_REDFISH_VALUE          RedfishValue;
> -  EFI_STRING                   ConfigureLangBuffer;
> -  EFI_STRING                   KeyName;
> -  EFI_STRING                   *ConfigureLangList;
> -  EFI_STRING                   SearchPattern;
> -  UINTN                        BufferSize;
> -  UINTN                        ConfigListCount;
> -  UINTN                        ConfigListCountIndex;
> +  EFI_STATUS                    Status;
> +  RedfishCS_EmptyProp_KeyValue  *EmptyPropKeyValueList;
> +  RedfishCS_EmptyProp_KeyValue  *PreEmptyPropKeyValueList;
> +  RedfishCS_EmptyProp_KeyValue  *FirstEmptyPropKeyValueList;
> +  EDKII_REDFISH_VALUE           RedfishValue;
> +  EFI_STRING                    ConfigureLangBuffer;
> +  EFI_STRING                    KeyName;
> +  EFI_STRING                    *ConfigureLangList;
> +  EFI_STRING                    SearchPattern;
> +  UINTN                         BufferSize;
> +  UINTN                         ConfigListCount;
> +  UINTN                         ConfigListCountIndex;
> 
>    if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) ||
> IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) {
>      return NULL;
> @@ -2739,24 +2830,26 @@ GetPropertyVagueValue (
>    //
>    // Configure Language buffer.
>    //
> -  BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
> +  BufferSize          = sizeof (CHAR16) * MAX_CONF_LANG_LEN;
>    ConfigureLangBuffer = AllocatePool (BufferSize);
>    if (ConfigureLangBuffer == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for
> ConfigureLangBuffer\n", __FUNCTION__));
>      return NULL;
>    }
> +
>    UnicodeSPrint (ConfigureLangBuffer, BufferSize, L"%s/%s", ConfigureLang,
> PropertyName);
> 
>    //
>    // Initial search pattern
>    //
> -  BufferSize = (StrLen (ConfigureLangBuffer) + StrLen (L"/.*") + 1) * sizeof
> (CHAR16); // Increase one for the NULL terminator.
> +  BufferSize    = (StrLen (ConfigureLangBuffer) + StrLen (L"/.*") + 1) * sizeof
> (CHAR16); // Increase one for the NULL terminator.
>    SearchPattern = AllocatePool (BufferSize);
>    if (SearchPattern == NULL) {
>      DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for
> SearchPattern\n", __FUNCTION__));
>      FreePool (ConfigureLangBuffer);
>      return NULL;
>    }
> +
>    BufferSize = BufferSize / sizeof (CHAR16);
>    StrCpyS (SearchPattern, BufferSize, ConfigureLangBuffer);
>    StrCatS (SearchPattern, BufferSize, L"/.*");
> @@ -2769,28 +2862,30 @@ GetPropertyVagueValue (
>    //
>    // Build up the list of RedfishCS_EmptyProp_KeyValue.
>    //
> -  ConfigListCountIndex = 0;
> -  PreEmptyPropKeyValueList = NULL;
> +  ConfigListCountIndex       = 0;
> +  PreEmptyPropKeyValueList   = NULL;
>    FirstEmptyPropKeyValueList = NULL;
>    while (ConfigListCountIndex < ConfigListCount) {
> -    Status = RedfishPlatformConfigGetValue(Schema, Version,
> ConfigureLangList [ConfigListCountIndex], &RedfishValue);
> +    Status = RedfishPlatformConfigGetValue (Schema, Version,
> ConfigureLangList[ConfigListCountIndex], &RedfishValue);
>      if (EFI_ERROR (Status)) {
> -      DEBUG ((DEBUG_ERROR, "%a, %a.%a query current setting for %s failed:
> %r\n", __FUNCTION__, Schema, Version, ConfigureLangList
> [ConfigListCountIndex], Status));
> +      DEBUG ((DEBUG_ERROR, "%a, %a.%a query current setting for %s failed:
> %r\n", __FUNCTION__, Schema, Version,
> ConfigureLangList[ConfigListCountIndex], Status));
>        goto ErrorLeave;
>      }
> +
>      //
>      // Get the key name.
>      //
> -    KeyName = GetAttributeNameFromConfigLanguage (ConfigureLangList
> [ConfigListCountIndex]);
> +    KeyName = GetAttributeNameFromConfigLanguage
> (ConfigureLangList[ConfigListCountIndex]);
>      //
>      // Create an entry of RedfishCS_EmptyProp_KeyValue.
>      //
>      EmptyPropKeyValueList = NewEmptyPropKeyValueFromRedfishValue
> (KeyName, &RedfishValue);
>      if (EmptyPropKeyValueList == NULL) {
>        DEBUG ((DEBUG_ERROR, "%a, Failed to create an entry of
> EmptyPropKeyValueList\n", __FUNCTION__));
> -      ConfigListCountIndex ++;
> +      ConfigListCountIndex++;
>        continue;
>      }
> +
>      //
>      // Link the RedfishCS_EmptyProp_KeyValue list.
>      //
> @@ -2799,24 +2894,29 @@ GetPropertyVagueValue (
>      } else {
>        FirstEmptyPropKeyValueList = EmptyPropKeyValueList;
>      }
> +
>      PreEmptyPropKeyValueList = EmptyPropKeyValueList;
> -    ConfigListCountIndex ++;
> -  };
> +    ConfigListCountIndex++;
> +  }
> +
>    goto LeaveFunction;
> 
>  ErrorLeave:;
>    if (FirstEmptyPropKeyValueList != NULL) {
>      FreeEmptyPropKeyValueList (FirstEmptyPropKeyValueList);
>    }
> +
>    FirstEmptyPropKeyValueList = NULL;
> 
>  LeaveFunction:
>    if (SearchPattern != NULL) {
>      FreePool (SearchPattern);
>    }
> +
>    if (ConfigureLangBuffer != NULL) {
>      FreePool (ConfigureLangBuffer);
>    }
> +
>    FreePool (ConfigureLangList);
> 
>    *NumberOfValues = (UINT32)ConfigListCount;
> @@ -2836,15 +2936,15 @@ LeaveFunction:
>  **/
>  BOOLEAN
>  PropertyChecker (
> -  IN VOID         *PropertyBuffer,
> -  IN BOOLEAN      ProvisionMode
> +  IN VOID     *PropertyBuffer,
> +  IN BOOLEAN  ProvisionMode
>    )
>  {
>    if (ProvisionMode) {
>      return TRUE;
>    }
> 
> -  if (!ProvisionMode && PropertyBuffer != NULL) {
> +  if (!ProvisionMode && (PropertyBuffer != NULL)) {
>      return TRUE;
>    }
> 
> @@ -2865,12 +2965,12 @@ PropertyChecker (
>  **/
>  BOOLEAN
>  CheckEtag (
> -  IN EFI_STRING Uri,
> -  IN CHAR8      *EtagInHeader,
> -  IN CHAR8      *EtagInJson
> +  IN EFI_STRING  Uri,
> +  IN CHAR8       *EtagInHeader,
> +  IN CHAR8       *EtagInJson
>    )
>  {
> -  CHAR8 *EtagInDb;
> +  CHAR8  *EtagInDb;
> 
>    if (IS_EMPTY_STRING (Uri)) {
>      return FALSE;
> @@ -2920,15 +3020,15 @@ CheckEtag (
>  **/
>  EDKII_JSON_VALUE *
>  MatchJsonObject (
> -  IN EDKII_JSON_VALUE *JsonObj,
> -  IN CHAR8            *ObjectName
> +  IN EDKII_JSON_VALUE  *JsonObj,
> +  IN CHAR8             *ObjectName
>    )
>  {
>    EDKII_JSON_VALUE  N;
>    CHAR8             *Key;
>    EDKII_JSON_VALUE  Value;
> 
> -  if (JsonObj == NULL || IS_EMPTY_STRING (ObjectName)) {
> +  if ((JsonObj == NULL) || IS_EMPTY_STRING (ObjectName)) {
>      return NULL;
>    }
> 
> @@ -2962,11 +3062,11 @@ MatchPropertyWithJsonContext (
>    IN  CHAR8       *Json
>    )
>  {
> -  CHAR8 *AsciiProperty;
> -  CHAR8 *PropertyNode;
> -  UINTN Index;
> -  EDKII_JSON_VALUE *JsonObj;
> -  EDKII_JSON_VALUE *MatchObj;
> +  CHAR8             *AsciiProperty;
> +  CHAR8             *PropertyNode;
> +  UINTN             Index;
> +  EDKII_JSON_VALUE  *JsonObj;
> +  EDKII_JSON_VALUE  *MatchObj;
>    EDKII_JSON_TYPE   JsonType;
> 
>    if (IS_EMPTY_STRING (Property) || IS_EMPTY_STRING (Json)) {
> @@ -2974,7 +3074,7 @@ MatchPropertyWithJsonContext (
>    }
> 
>    JsonObj = JsonLoadString (Json, 0, NULL);
> -  if (JsonObj == NULL || !JsonValueIsObject (JsonObj)) {
> +  if ((JsonObj == NULL) || !JsonValueIsObject (JsonObj)) {
>      return FALSE;
>    }
> 
> @@ -2983,18 +3083,17 @@ MatchPropertyWithJsonContext (
>      return FALSE;
>    }
> 
> -  Index = 0;
> +  Index        = 0;
>    PropertyNode = AsciiProperty;
> -  MatchObj = JsonObj;
> +  MatchObj     = JsonObj;
> 
>    //
>    // Walk through property and find corresponding object in JSON input
>    //
>    while (AsciiProperty[Index] != '\0') {
> -
>      if (AsciiProperty[Index] == '/') {
>        AsciiProperty[Index] = '\0';
> -      MatchObj = MatchJsonObject (MatchObj, PropertyNode);
> +      MatchObj             = MatchJsonObject (MatchObj, PropertyNode);
>        if (MatchObj == NULL) {
>          PropertyNode = NULL;
>          break;
> @@ -3023,16 +3122,19 @@ MatchPropertyWithJsonContext (
>          if (JsonValueIsNull (MatchObj)) {
>            MatchObj = NULL;
>          }
> +
>          break;
>        case EdkiiJsonTypeArray:
>          if (JsonArrayCount (MatchObj) == 0) {
>            MatchObj = NULL;
>          }
> +
>          break;
>        case EdkiiJsonTypeString:
>          if (IS_EMPTY_STRING (JsonValueGetString (MatchObj))) {
>            MatchObj = NULL;
>          }
> +
>          break;
>        case EdkiiJsonTypeNull:
>          MatchObj = NULL;
> @@ -3061,16 +3163,16 @@ MatchPropertyWithJsonContext (
>  **/
>  EFI_STATUS
>  AddRedfishCharArray (
> -  IN OUT  RedfishCS_char_Array **Head,
> +  IN OUT  RedfishCS_char_Array  **Head,
>    IN      CHAR8                 **StringArray,
>    IN      UINTN                 ArraySize
>    )
>  {
> -  UINTN                                 Index;
> -  RedfishCS_char_Array                  *CharArrayBuffer;
> -  RedfishCS_char_Array                  *PreArrayBuffer;
> +  UINTN                 Index;
> +  RedfishCS_char_Array  *CharArrayBuffer;
> +  RedfishCS_char_Array  *PreArrayBuffer;
> 
> -  if (Head == NULL || StringArray == NULL || ArraySize == 0) {
> +  if ((Head == NULL) || (StringArray == NULL) || (ArraySize == 0)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -3083,14 +3185,15 @@ AddRedfishCharArray (
>      }
> 
>      if (Index == 0) {
> -     *Head = CharArrayBuffer;
> +      *Head = CharArrayBuffer;
>      }
> 
>      CharArrayBuffer->ArrayValue = StringArray[Index];
> -    CharArrayBuffer->Next = NULL;
> +    CharArrayBuffer->Next       = NULL;
>      if (PreArrayBuffer != NULL) {
>        PreArrayBuffer->Next = CharArrayBuffer;
>      }
> +
>      PreArrayBuffer = CharArrayBuffer;
>    }
> 
> @@ -3111,16 +3214,16 @@ AddRedfishCharArray (
>  **/
>  EFI_STATUS
>  AddRedfishNumericArray (
> -  IN OUT  RedfishCS_int64_Array **Head,
> -  IN      INT64                 *NumericArray,
> -  IN      UINTN                 ArraySize
> +  IN OUT  RedfishCS_int64_Array  **Head,
> +  IN      INT64                  *NumericArray,
> +  IN      UINTN                  ArraySize
>    )
>  {
> -  UINTN                                 Index;
> -  RedfishCS_int64_Array                 *NumericArrayBuffer;
> -  RedfishCS_int64_Array                 *PreArrayBuffer;
> +  UINTN                  Index;
> +  RedfishCS_int64_Array  *NumericArrayBuffer;
> +  RedfishCS_int64_Array  *PreArrayBuffer;
> 
> -  if (Head == NULL || NumericArray == NULL || ArraySize == 0) {
> +  if ((Head == NULL) || (NumericArray == NULL) || (ArraySize == 0)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -3133,18 +3236,21 @@ AddRedfishNumericArray (
>      }
> 
>      if (Index == 0) {
> -     *Head = NumericArrayBuffer;
> +      *Head = NumericArrayBuffer;
>      }
> +
>      NumericArrayBuffer->ArrayValue =  AllocatePool (sizeof
> (RedfishCS_int64));
>      if (NumericArrayBuffer->ArrayValue == NULL) {
>        ASSERT (NumericArrayBuffer->ArrayValue != NULL);
>        continue;
>      }
> +
>      *NumericArrayBuffer->ArrayValue = NumericArray[Index];
> -    NumericArrayBuffer->Next = NULL;
> +    NumericArrayBuffer->Next        = NULL;
>      if (PreArrayBuffer != NULL) {
>        PreArrayBuffer->Next = NumericArrayBuffer;
>      }
> +
>      PreArrayBuffer = NumericArrayBuffer;
>    }
> 
> @@ -3170,11 +3276,11 @@ AddRedfishBooleanArray (
>    IN      UINTN                 ArraySize
>    )
>  {
> -  UINTN                                 Index;
> -  RedfishCS_bool_Array                 *BooleanArrayBuffer;
> -  RedfishCS_bool_Array                 *PreArrayBuffer;
> +  UINTN                 Index;
> +  RedfishCS_bool_Array  *BooleanArrayBuffer;
> +  RedfishCS_bool_Array  *PreArrayBuffer;
> 
> -  if (Head == NULL || BooleanArray == NULL || ArraySize == 0) {
> +  if ((Head == NULL) || (BooleanArray == NULL) || (ArraySize == 0)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -3187,7 +3293,7 @@ AddRedfishBooleanArray (
>      }
> 
>      if (Index == 0) {
> -     *Head = BooleanArrayBuffer;
> +      *Head = BooleanArrayBuffer;
>      }
> 
>      BooleanArrayBuffer->ArrayValue =  AllocatePool (sizeof (RedfishCS_bool));
> @@ -3195,11 +3301,13 @@ AddRedfishBooleanArray (
>        ASSERT (BooleanArrayBuffer->ArrayValue != NULL);
>        continue;
>      }
> +
>      *BooleanArrayBuffer->ArrayValue = BooleanArray[Index];
> -    BooleanArrayBuffer->Next = NULL;
> +    BooleanArrayBuffer->Next        = NULL;
>      if (PreArrayBuffer != NULL) {
>        PreArrayBuffer->Next = BooleanArrayBuffer;
>      }
> +
>      PreArrayBuffer = BooleanArrayBuffer;
>    }
> 
> @@ -3222,22 +3330,21 @@ AddRedfishBooleanArray (
>  **/
>  BOOLEAN
>  CompareRedfishStringArrayValues (
> -  IN RedfishCS_char_Array *Head,
> -  IN CHAR8                **StringArray,
> -  IN UINTN                ArraySize
> +  IN RedfishCS_char_Array  *Head,
> +  IN CHAR8                 **StringArray,
> +  IN UINTN                 ArraySize
>    )
>  {
>    UINTN                 Index;
>    RedfishCS_char_Array  *CharArrayBuffer;
> 
> -  if (Head == NULL || StringArray == NULL || ArraySize == 0) {
> +  if ((Head == NULL) || (StringArray == NULL) || (ArraySize == 0)) {
>      return FALSE;
>    }
> 
>    CharArrayBuffer = Head;
> -  Index = 0;
> +  Index           = 0;
>    while (CharArrayBuffer != NULL && Index < ArraySize) {
> -
>      if (AsciiStrCmp (StringArray[Index], CharArrayBuffer->ArrayValue) != 0) {
>        break;
>      }
> @@ -3246,7 +3353,7 @@ CompareRedfishStringArrayValues (
>      CharArrayBuffer = CharArrayBuffer->Next;
>    }
> 
> -  if (CharArrayBuffer != NULL || Index < ArraySize) {
> +  if ((CharArrayBuffer != NULL) || (Index < ArraySize)) {
>      return FALSE;
>    }
> 
> @@ -3269,20 +3376,20 @@ CompareRedfishStringArrayValues (
>  **/
>  BOOLEAN
>  CompareRedfishNumericArrayValues (
> -  IN RedfishCS_int64_Array *Head,
> -  IN INT64                 *NumericArray,
> -  IN UINTN                 ArraySize
> +  IN RedfishCS_int64_Array  *Head,
> +  IN INT64                  *NumericArray,
> +  IN UINTN                  ArraySize
>    )
>  {
>    UINTN                  Index;
>    RedfishCS_int64_Array  *NumericArrayBuffer;
> 
> -  if (Head == NULL || NumericArray == NULL || ArraySize == 0) {
> +  if ((Head == NULL) || (NumericArray == NULL) || (ArraySize == 0)) {
>      return FALSE;
>    }
> 
>    NumericArrayBuffer = Head;
> -  Index = 0;
> +  Index              = 0;
>    while (NumericArrayBuffer != NULL && Index < ArraySize) {
>      if (NumericArray[Index] != *NumericArrayBuffer->ArrayValue) {
>        break;
> @@ -3292,7 +3399,7 @@ CompareRedfishNumericArrayValues (
>      NumericArrayBuffer = NumericArrayBuffer->Next;
>    }
> 
> -  if (NumericArrayBuffer != NULL || Index < ArraySize) {
> +  if ((NumericArrayBuffer != NULL) || (Index < ArraySize)) {
>      return FALSE;
>    }
> 
> @@ -3320,15 +3427,15 @@ CompareRedfishBooleanArrayValues (
>    IN UINTN                 ArraySize
>    )
>  {
> -  UINTN                  Index;
> +  UINTN                 Index;
>    RedfishCS_bool_Array  *BooleanArrayBuffer;
> 
> -  if (Head == NULL || BooleanArray == NULL || ArraySize == 0) {
> +  if ((Head == NULL) || (BooleanArray == NULL) || (ArraySize == 0)) {
>      return FALSE;
>    }
> 
>    BooleanArrayBuffer = Head;
> -  Index = 0;
> +  Index              = 0;
>    while (BooleanArrayBuffer != NULL && Index < ArraySize) {
>      if (BooleanArray[Index] != *BooleanArrayBuffer->ArrayValue) {
>        break;
> @@ -3338,7 +3445,7 @@ CompareRedfishBooleanArrayValues (
>      BooleanArrayBuffer = BooleanArrayBuffer->Next;
>    }
> 
> -  if (BooleanArrayBuffer != NULL || Index < ArraySize) {
> +  if ((BooleanArrayBuffer != NULL) || (Index < ArraySize)) {
>      return FALSE;
>    }
> 
> @@ -3361,12 +3468,12 @@ CompareRedfishBooleanArrayValues (
>  **/
>  BOOLEAN
>  CompareRedfishPropertyVagueValues (
> -  IN RedfishCS_EmptyProp_KeyValue *RedfishVagueKeyValuePtr,
> -  IN UINT32                       RedfishVagueKeyValueNumber,
> -  IN RedfishCS_EmptyProp_KeyValue *ConfigVagueKeyValuePtr,
> -  IN UINT32                       ConfigVagueKeyValueNumber
> +  IN RedfishCS_EmptyProp_KeyValue  *RedfishVagueKeyValuePtr,
> +  IN UINT32                        RedfishVagueKeyValueNumber,
> +  IN RedfishCS_EmptyProp_KeyValue  *ConfigVagueKeyValuePtr,
> +  IN UINT32                        ConfigVagueKeyValueNumber
>    )
> -  {
> +{
>    RedfishCS_EmptyProp_KeyValue  *ThisConfigVagueKeyValuePtr;
>    RedfishCS_EmptyProp_KeyValue  *ThisRedfishVagueKeyValuePtr;
> 
> @@ -3384,13 +3491,14 @@ CompareRedfishPropertyVagueValues (
>      // Loop through all key/value on Redfish service..
>      //
>      while (ThisRedfishVagueKeyValuePtr != NULL) {
> -      if (AsciiStrCmp(ThisConfigVagueKeyValuePtr->KeyNamePtr,
> ThisRedfishVagueKeyValuePtr->KeyNamePtr) == 0) {
> +      if (AsciiStrCmp (ThisConfigVagueKeyValuePtr->KeyNamePtr,
> ThisRedfishVagueKeyValuePtr->KeyNamePtr) == 0) {
>          //
>          // Check the type of value.
>          //
>          if (ThisConfigVagueKeyValuePtr->Value->DataType !=
> ThisRedfishVagueKeyValuePtr->Value->DataType) {
>            return FALSE;
>          }
> +
>          //
>          // Check the value.
>          //
> @@ -3398,11 +3506,13 @@ CompareRedfishPropertyVagueValues (
>            //
>            // Is the string identical?
>            //
> -          if (AsciiStrCmp (ThisConfigVagueKeyValuePtr->Value-
> >DataValue.CharPtr,
> -                           ThisRedfishVagueKeyValuePtr->Value->DataValue.CharPtr
> -                           ) == 0) {
> +          if (AsciiStrCmp (
> +                ThisConfigVagueKeyValuePtr->Value->DataValue.CharPtr,
> +                ThisRedfishVagueKeyValuePtr->Value->DataValue.CharPtr
> +                ) == 0)
> +          {
>              break;
> -          } else{
> +          } else {
>              return FALSE;
>            }
>          } else if (ThisConfigVagueKeyValuePtr->Value->DataType ==
> RedfishCS_Vague_DataType_Int64) {
> @@ -3421,16 +3531,20 @@ CompareRedfishPropertyVagueValues (
>            return FALSE;
>          }
>        }
> +
>        ThisRedfishVagueKeyValuePtr = ThisRedfishVagueKeyValuePtr-
> >NextKeyValuePtr;
> -    };
> +    }
> +
>      if (ThisRedfishVagueKeyValuePtr == NULL) {
>        //
>        // No matched key name. Threat these two vague value set is different.
>        //
>        return FALSE;
>      }
> +
>      ThisConfigVagueKeyValuePtr = ThisConfigVagueKeyValuePtr-
> >NextKeyValuePtr;
> -  };
> +  }
> +
>    return TRUE;
>  }
> 
> @@ -3448,11 +3562,10 @@ CompareRedfishPropertyVagueValues (
>  EFI_STATUS
>  EFIAPI
>  RedfishFeatureUtilityLibConstructor (
> -  IN EFI_HANDLE                            ImageHandle,
> -  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
>    )
>  {
> -
>    return EFI_SUCCESS;
>  }
> 
> @@ -3468,8 +3581,8 @@ RedfishFeatureUtilityLibConstructor (
>  EFI_STATUS
>  EFIAPI
>  RedfishFeatureUtilityLibDestructor (
> -  IN EFI_HANDLE                            ImageHandle,
> -  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
>    )
>  {
>    return EFI_SUCCESS;
> diff --git
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .inf
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .inf
> index 84f338e680..66d5dce6c2 100644
> ---
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .inf
> +++
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib
> .inf
> @@ -1,6 +1,8 @@
>  ## @file
> +#  INF for Redfish feature utility library.
>  #
>  #  (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
> +#  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
>  #
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
> @@ -49,6 +51,7 @@
>    gEdkIIRedfishConfigLangMapProtocolGuid  ## CONSUMED ##
> 
>  [Pcd]
> +  gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootRequired
> 
>  [Guids]
> 
> diff --git a/RedfishClientPkg/RedfishClientPkg.dec
> b/RedfishClientPkg/RedfishClientPkg.dec
> index d3c97ecf68..c0ab30ab8b 100644
> --- a/RedfishClientPkg/RedfishClientPkg.dec
> +++ b/RedfishClientPkg/RedfishClientPkg.dec
> @@ -2,7 +2,7 @@
>  # Redfish Client Package
>  #
>  # (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> -# Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +# Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
>  #
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
>  ##
> @@ -65,3 +65,9 @@
> 
> gEfiRedfishClientPkgTokenSpaceGuid.PcdEdkIIRedfishFeatureDriverStartupE
> ventGuid|{0xB3, 0x8F, 0xE8, 0x7C, 0xD7, 0x4B, 0x79, 0x46, 0x87, 0xA8, 0xA8,
> 0xD8, 0xDE, 0xE5, 0x0D, 0x2B}|VOID*|0x10000003
>    ## Default Redfish version string
> 
> gEfiRedfishClientPkgTokenSpaceGuid.PcdDefaultRedfishVersion|L"v1"|VOID
> *|0x10000004
> +  ## The number of seconds that the firmware will wait before system
> reboot
> +
> gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootTimeout|5|
> UINT16|0x20000002
> +
> +[PcdsDynamicEx]
> +  ## The flag used to indicate that system reboot is required due to system
> configuration change
> +
> gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootRequired|FA
> LSE|BOOLEAN|0x20000001
> diff --git
> a/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.c
> b/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.c
> index 3414f0c942..5a3a9e4c5a 100644
> --- a/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.c
> +++ b/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.c
> @@ -3,6 +3,7 @@
>    for EDK2 Redfish Feature driver registration.
> 
>    (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> +  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -10,10 +11,10 @@
> 
>  #include <RedfishFeatureCoreDxe.h>
> 
> -EFI_EVENT mEdkIIRedfishFeatureDriverStartupEvent;
> -REDFISH_FEATURE_STARTUP_CONTEXT mFeatureDriverStartupContext;
> -REDFISH_FEATURE_INTERNAL_DATA *ResourceUriNodeList;
> -RESOURCE_INFORMATION_EXCHANGE *mInformationExchange;
> +EFI_EVENT                        mEdkIIRedfishFeatureDriverStartupEvent;
> +REDFISH_FEATURE_STARTUP_CONTEXT  mFeatureDriverStartupContext;
> +REDFISH_FEATURE_INTERNAL_DATA    *ResourceUriNodeList;
> +RESOURCE_INFORMATION_EXCHANGE    *mInformationExchange;
> 
>  /**
>    Setup the information to deliver to child feature/collection driver.
> @@ -24,19 +25,21 @@ RESOURCE_INFORMATION_EXCHANGE
> *mInformationExchange;
>  **/
>  EFI_STATUS
>  SetupExchangeInformationInfo (
> -  IN REDFISH_FEATURE_INTERNAL_DATA *ThisList,
> -  IN EFI_STRING                    ParentConfgLanguageUri
> +  IN REDFISH_FEATURE_INTERNAL_DATA  *ThisList,
> +  IN EFI_STRING                     ParentConfgLanguageUri
>    )
>  {
>    ThisList->InformationExchange->SendInformation.ParentUri =
> (EFI_STRING)AllocateZeroPool (MaxParentUriLength * sizeof (CHAR16));
>    if (ThisList->InformationExchange->SendInformation.ParentUri == NULL) {
>      return EFI_OUT_OF_RESOURCES;
>    }
> -  ThisList->InformationExchange->SendInformation.PropertyName =
> (EFI_STRING)AllocateZeroPool(MaxNodeNameLength * sizeof (CHAR16));
> +
> +  ThisList->InformationExchange->SendInformation.PropertyName =
> (EFI_STRING)AllocateZeroPool (MaxNodeNameLength * sizeof (CHAR16));
>    if (ThisList->InformationExchange->SendInformation.PropertyName ==
> NULL) {
>      return EFI_OUT_OF_RESOURCES;
>    }
> -  ThisList->InformationExchange->SendInformation.FullUri =
> (EFI_STRING)AllocateZeroPool(MaxParentUriLength * sizeof (CHAR16));
> +
> +  ThisList->InformationExchange->SendInformation.FullUri =
> (EFI_STRING)AllocateZeroPool (MaxParentUriLength * sizeof (CHAR16));
>    if (ThisList->InformationExchange->SendInformation.FullUri == NULL) {
>      return EFI_OUT_OF_RESOURCES;
>    }
> @@ -54,13 +57,15 @@ SetupExchangeInformationInfo (
>    //
>    // Full config language URI
>    //
> -  StrCpyS (ThisList->InformationExchange->SendInformation.FullUri,
> -           MaxParentUriLength,
> -           ThisList->InformationExchange->SendInformation.ParentUri
> -           );
> +  StrCpyS (
> +    ThisList->InformationExchange->SendInformation.FullUri,
> +    MaxParentUriLength,
> +    ThisList->InformationExchange->SendInformation.ParentUri
> +    );
>    if (StrLen (ThisList->InformationExchange->SendInformation.FullUri) != 0) {
>      StrCatS (ThisList->InformationExchange->SendInformation.FullUri,
> MaxParentUriLength, L"/");
>    }
> +
>    StrCatS (ThisList->InformationExchange->SendInformation.FullUri,
> MaxParentUriLength, ThisList->InformationExchange-
> >SendInformation.PropertyName);
>    return EFI_SUCCESS;
>  }
> @@ -73,20 +78,21 @@ SetupExchangeInformationInfo (
>  **/
>  EFI_STATUS
>  DestroryExchangeInformation (
> -  IN REDFISH_FEATURE_INTERNAL_DATA *ThisList
> +  IN REDFISH_FEATURE_INTERNAL_DATA  *ThisList
>    )
>  {
> -
>    if (ThisList->InformationExchange != NULL) {
>      if (ThisList->InformationExchange->SendInformation.Type ==
> InformationTypeCollectionMemberUri) {
>        if (ThisList->InformationExchange->SendInformation.ParentUri != NULL) {
>          FreePool (ThisList->InformationExchange->SendInformation.ParentUri);
>          ThisList->InformationExchange->SendInformation.ParentUri = NULL;
>        }
> +
>        if (ThisList->InformationExchange->SendInformation.PropertyName !=
> NULL) {
>          FreePool (ThisList->InformationExchange-
> >SendInformation.PropertyName);
>          ThisList->InformationExchange->SendInformation.PropertyName =
> NULL;
>        }
> +
>        if (ThisList->InformationExchange->SendInformation.FullUri != NULL) {
>          FreePool (ThisList->InformationExchange->SendInformation.FullUri);
>          ThisList->InformationExchange->SendInformation.FullUri = NULL;
> @@ -97,10 +103,10 @@ DestroryExchangeInformation (
>        DestroyConfiglanguageList (&ThisList->InformationExchange-
> >ReturnedInformation.ConfigureLanguageList);
>      }
> 
> -    ThisList->InformationExchange->SendInformation.Type =
> InformationTypeNone;
> +    ThisList->InformationExchange->SendInformation.Type     =
> InformationTypeNone;
>      ThisList->InformationExchange->ReturnedInformation.Type =
> InformationTypeNone;
> -
>    }
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -114,44 +120,47 @@ DestroryExchangeInformation (
>  **/
>  VOID
>  StartUpFeatureDriver (
> -  IN REDFISH_FEATURE_INTERNAL_DATA *ThisFeatureDriverList,
> -  IN EFI_STRING                    CurrentConfigLanguageUri,
> -  IN REDFISH_FEATURE_STARTUP_CONTEXT *StartupContext
> -)
> +  IN REDFISH_FEATURE_INTERNAL_DATA    *ThisFeatureDriverList,
> +  IN EFI_STRING                       CurrentConfigLanguageUri,
> +  IN REDFISH_FEATURE_STARTUP_CONTEXT  *StartupContext
> +  )
>  {
> -  EFI_STATUS Status;
> -  UINTN Index;
> -  REDFISH_FEATURE_INTERNAL_DATA *ThisList;
> -  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST ConfigLangList;
> -  EFI_STRING NextParentUri;
> +  EFI_STATUS                                   Status;
> +  UINTN                                        Index;
> +  REDFISH_FEATURE_INTERNAL_DATA                *ThisList;
> +  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST  ConfigLangList;
> +  EFI_STRING                                   NextParentUri;
> 
>    NextParentUri = (EFI_STRING)AllocateZeroPool (MaxParentUriLength *
> sizeof (CHAR16));
>    if (NextParentUri == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: Fail to allocate memory for parent configure
> language.\n", __FUNCTION__));
> +    DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for parent
> configure language.\n", __FUNCTION__));
>      return;
>    }
> +
>    if (CurrentConfigLanguageUri != NULL) {
> -    StrCpyS(NextParentUri, MaxParentUriLength, CurrentConfigLanguageUri);
> +    StrCpyS (NextParentUri, MaxParentUriLength,
> CurrentConfigLanguageUri);
>    }
> 
>    ThisList = ThisFeatureDriverList;
>    while (TRUE) {
>      if (ThisList->Callback != NULL) {
>        ThisList->InformationExchange = mInformationExchange;
> -      Status = SetupExchangeInformationInfo (ThisList, NextParentUri);
> +      Status                        = SetupExchangeInformationInfo (ThisList,
> NextParentUri);
>        if (!EFI_ERROR (Status)) {
> -        Status = ThisList->Callback(
> -                               StartupContext->This,
> -                               StartupContext->Action,
> -                               ThisList->Context,
> -                               ThisList->InformationExchange
> -                               );
> +        Status = ThisList->Callback (
> +                             StartupContext->This,
> +                             StartupContext->Action,
> +                             ThisList->Context,
> +                             ThisList->InformationExchange
> +                             );
>        }
> +
>        if (EFI_ERROR (Status)) {
> -        DEBUG((DEBUG_ERROR, "%a: Callback to EDK2 Redfish feature driver
> fail: %s.\n", __FUNCTION__, ThisList->InformationExchange-
> >SendInformation.FullUri));
> +        DEBUG ((DEBUG_ERROR, "%a: Callback to EDK2 Redfish feature driver
> fail: %s.\n", __FUNCTION__, ThisList->InformationExchange-
> >SendInformation.FullUri));
>        }
>      }
> -    if (!EFI_ERROR (Status) && ThisList->Callback != NULL && ThisList-
> >ChildList != NULL) {
> +
> +    if (!EFI_ERROR (Status) && (ThisList->Callback != NULL) && (ThisList-
> >ChildList != NULL)) {
>        //
>        // Go through child list only when the parent node is managed by feature
> driver.
>        //
> @@ -165,52 +174,56 @@ StartUpFeatureDriver (
>            // Copy RESOURCE_INFORMATION_RETURNED then destroy the
> exchange information.
>            //
>            CopyConfiglanguageList (&ThisList->InformationExchange-
> >ReturnedInformation.ConfigureLanguageList, &ConfigLangList);
> -          DestroryExchangeInformation(ThisList);
> +          DestroryExchangeInformation (ThisList);
>            //
>            // Modify the collection instance according to the returned
> InformationTypeCollectionMemberConfigLanguage.
>            //
> -          for (Index = 0; Index < ConfigLangList.Count; Index ++) {
> +          for (Index = 0; Index < ConfigLangList.Count; Index++) {
>              StrCatS (NextParentUri, MaxParentUriLength, ThisList->NodeName);
>              StrCatS (NextParentUri, MaxParentUriLength,
> NodeIsCollectionSymbol);
>              SetResourceConfigLangMemberInstance (&NextParentUri,
> MaxParentUriLength, (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG
> *)&ConfigLangList.List[Index]);
> -            StartUpFeatureDriver(ThisList->ChildList, NextParentUri,
> StartupContext);
> +            StartUpFeatureDriver (ThisList->ChildList, NextParentUri,
> StartupContext);
>            }
> +
>            DestroyConfiglanguageList (&ConfigLangList);
>          } else {
> -          DEBUG((DEBUG_ERROR, "%a: No
> InformationTypeCollectionMemberConfigLanguage of %s returned.\n",
> __FUNCTION__, ThisList->InformationExchange->SendInformation.FullUri));
> -          DEBUG((DEBUG_ERROR, "%a: Redfish service maybe not connected or
> the network has problems.\n", __FUNCTION__));
> +          DEBUG ((DEBUG_ERROR, "%a: No
> InformationTypeCollectionMemberConfigLanguage of %s returned.\n",
> __FUNCTION__, ThisList->InformationExchange->SendInformation.FullUri));
> +          DEBUG ((DEBUG_ERROR, "%a: Redfish service maybe not connected
> or the network has problems.\n", __FUNCTION__));
>            return;
>          }
>        } else {
>          StrCatS (NextParentUri, MaxParentUriLength, ThisList->NodeName);
> -        StartUpFeatureDriver(ThisList->ChildList, NextParentUri,
> StartupContext);
> +        StartUpFeatureDriver (ThisList->ChildList, NextParentUri,
> StartupContext);
>        }
> +
>        //
>        // Restore the parent configure language URI for this level.
>        //
>        if (CurrentConfigLanguageUri != NULL) {
> -        StrCpyS(NextParentUri, MaxParentUriLength,
> CurrentConfigLanguageUri);
> -      } else{
> -        NextParentUri [0] = 0;
> +        StrCpyS (NextParentUri, MaxParentUriLength,
> CurrentConfigLanguageUri);
> +      } else {
> +        NextParentUri[0] = 0;
>        }
>      } else {
>        DestroryExchangeInformation (ThisList);
>      }
> +
>      //
>      // Check sibling Redfish feature driver.
>      //
>      if (ThisList->SiblingList == NULL) {
>        break;
>      }
> +
>      //
>      // Go next sibling Redfish feature driver.
>      //
>      ThisList = ThisList->SiblingList;
> -  };
> +  }
> +
>    if (NextParentUri != NULL) {
>      FreePool (NextParentUri);
>    }
> -
>  }
> 
>  /**
> @@ -224,14 +237,16 @@ StartUpFeatureDriver (
>  **/
>  VOID
>  EFIAPI
> -RedfishFeatureDriverStartup(
> -  IN  EFI_EVENT                Event,
> -  IN  VOID                     *Context
> +RedfishFeatureDriverStartup (
> +  IN  EFI_EVENT  Event,
> +  IN  VOID       *Context
>    )
>  {
> -  REDFISH_FEATURE_STARTUP_CONTEXT *StartupContext;
> +  REDFISH_FEATURE_STARTUP_CONTEXT  *StartupContext;
> +  UINT16                           RebootTimeout;
> 
>    StartupContext = (REDFISH_FEATURE_STARTUP_CONTEXT *)Context;
> +  RebootTimeout  = PcdGet16 (PcdRedfishSystemRebootTimeout);
>    //
>    // Invoke EDK2 Redfish feature driver callback to start up
>    // the Redfish operations.
> @@ -245,10 +260,15 @@ RedfishFeatureDriverStartup(
>    //
>    mInformationExchange = (RESOURCE_INFORMATION_EXCHANGE
> *)AllocateZeroPool (sizeof (RESOURCE_INFORMATION_EXCHANGE));
>    if (mInformationExchange == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: Fail to allocate memory for exchange
> information.\n", __FUNCTION__));
> +    DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for exchange
> information.\n", __FUNCTION__));
>      return;
>    }
> 
> +  //
> +  // Reset PcdRedfishSystemRebootRequired flag
> +  //
> +  PcdSetBoolS (PcdRedfishSystemRebootRequired, FALSE);
> +
>    //
>    // Signal event before doing provisioning
>    //
> @@ -263,6 +283,16 @@ RedfishFeatureDriverStartup(
>    // Signal event after provisioning finished
>    //
>    SignalAfterProvisioningEvent ();
> +
> +  //
> +  // If system configuration is changed, reboot system.
> +  //
> +  if (PcdGetBool (PcdRedfishSystemRebootRequired)) {
> +    Print (L"System configuration is changed from RESTful interface. Reboot
> system in %d seconds...\n", RebootTimeout);
> +    gBS->Stall (RebootTimeout * 1000000U);
> +    gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
> +    CpuDeadLoop ();
> +  }
>  }
> 
>  /**
> @@ -281,31 +311,33 @@ RedfishFeatureDriverStartup(
>  **/
>  EFI_STATUS
>  NewInternalInstance (
> -  IN OUT REDFISH_FEATURE_INTERNAL_DATA **PtrToNewInternalData,
> -  IN EFI_STRING NodeName,
> -  IN BOOLEAN NodeIsCollection
> +  IN OUT REDFISH_FEATURE_INTERNAL_DATA  **PtrToNewInternalData,
> +  IN EFI_STRING                         NodeName,
> +  IN BOOLEAN                            NodeIsCollection
>    )
>  {
> -  REDFISH_FEATURE_INTERNAL_DATA *NewInternalData;
> +  REDFISH_FEATURE_INTERNAL_DATA  *NewInternalData;
> 
> -  if (PtrToNewInternalData == NULL || NodeName == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: Inproper given parameters\n",
> __FUNCTION__));
> +  if ((PtrToNewInternalData == NULL) || (NodeName == NULL)) {
> +    DEBUG ((DEBUG_ERROR, "%a: Inproper given parameters\n",
> __FUNCTION__));
>      return EFI_INVALID_PARAMETER;
>    }
> 
>    *PtrToNewInternalData = NULL;
> -  NewInternalData = AllocateZeroPool (sizeof
> (REDFISH_FEATURE_INTERNAL_DATA));
> +  NewInternalData       = AllocateZeroPool (sizeof
> (REDFISH_FEATURE_INTERNAL_DATA));
>    if (NewInternalData == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: No memory for
> REDFISH_FEATURE_INTERNAL_DATA\n", __FUNCTION__));
> +    DEBUG ((DEBUG_ERROR, "%a: No memory for
> REDFISH_FEATURE_INTERNAL_DATA\n", __FUNCTION__));
>      return EFI_OUT_OF_RESOURCES;
>    }
> +
>    NewInternalData->NodeName = AllocateZeroPool (StrSize (NodeName));
>    StrnCpyS (NewInternalData->NodeName, StrSize (NodeName), (CONST
> CHAR16 *)NodeName, StrLen (NodeName));
>    NewInternalData->SiblingList = NULL;
> -  NewInternalData->ChildList = NULL;
> +  NewInternalData->ChildList   = NULL;
>    if (NodeIsCollection) {
>      NewInternalData->Flags |=
> REDFISH_FEATURE_INTERNAL_DATA_IS_COLLECTION;
>    }
> +
>    *PtrToNewInternalData = NewInternalData;
>    return EFI_SUCCESS;
>  }
> @@ -338,18 +370,19 @@ InsertRedfishFeatureUriNode (
>    OUT REDFISH_FEATURE_INTERNAL_DATA     **MatchNodeEntry
>    )
>  {
> -  EFI_STATUS Status;
> -  REDFISH_FEATURE_INTERNAL_DATA *NewInternalData;
> -  REDFISH_FEATURE_INTERNAL_DATA *ThisInternalData;
> -  REDFISH_FEATURE_INTERNAL_DATA *SiblingList;
> +  EFI_STATUS                     Status;
> +  REDFISH_FEATURE_INTERNAL_DATA  *NewInternalData;
> +  REDFISH_FEATURE_INTERNAL_DATA  *ThisInternalData;
> +  REDFISH_FEATURE_INTERNAL_DATA  *SiblingList;
> 
>    *MatchNodeEntry = NULL;
>    if (NodeName == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: Node name is NULL.\n", __FUNCTION__));
> +    DEBUG ((DEBUG_ERROR, "%a: Node name is NULL.\n", __FUNCTION__));
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    if (NextNodeEntry == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: NextNodeEntry can't be NULL.\n",
> __FUNCTION__));
> +    DEBUG ((DEBUG_ERROR, "%a: NextNodeEntry can't be NULL.\n",
> __FUNCTION__));
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -358,27 +391,31 @@ InsertRedfishFeatureUriNode (
>      if (EFI_ERROR (Status)) {
>        return Status;
>      }
> -    if (HeadEntryToInsert == NULL && ResourceUriNodeList == NULL) {
> +
> +    if ((HeadEntryToInsert == NULL) && (ResourceUriNodeList == NULL)) {
>        ResourceUriNodeList = NewInternalData;
>      } else {
>        (*PrevisouEntry)->ChildList = NewInternalData;
>      }
> +
>      *PrevisouEntry = NewInternalData;
>      *NextNodeEntry = NewInternalData->ChildList;
>      return EFI_SUCCESS;
>    }
> +
>    //
>    // Go through sibling list to find the entry.
>    //
>    ThisInternalData = HeadEntryToInsert;
> -  SiblingList = ThisInternalData->SiblingList;
> +  SiblingList      = ThisInternalData->SiblingList;
>    while (TRUE) {
> -    if (StrCmp((CONST CHAR16 *)ThisInternalData->NodeName, (CONST
> CHAR16 *)NodeName) == 0) {
> +    if (StrCmp ((CONST CHAR16 *)ThisInternalData->NodeName, (CONST
> CHAR16 *)NodeName) == 0) {
>        *MatchNodeEntry = ThisInternalData;
> -      *NextNodeEntry = ThisInternalData->ChildList;
> -      *PrevisouEntry = ThisInternalData;
> +      *NextNodeEntry  = ThisInternalData->ChildList;
> +      *PrevisouEntry  = ThisInternalData;
>        return EFI_SUCCESS;
>      }
> +
>      //
>      // If sibing exist?
>      //
> @@ -387,14 +424,17 @@ InsertRedfishFeatureUriNode (
>        if (EFI_ERROR (Status)) {
>          return Status;
>        }
> +
>        ThisInternalData->SiblingList = NewInternalData;
> -      *PrevisouEntry = NewInternalData;
> -      *NextNodeEntry = NewInternalData->ChildList;
> +      *PrevisouEntry                = NewInternalData;
> +      *NextNodeEntry                = NewInternalData->ChildList;
>        return EFI_SUCCESS;
>      }
> +
>      ThisInternalData = SiblingList;
> -    SiblingList = ThisInternalData->SiblingList;
> -  };
> +    SiblingList      = ThisInternalData->SiblingList;
> +  }
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -432,66 +472,74 @@ RedfishFeatureRegister (
>    IN EFI_STRING                      FeatureManagedUri,
>    IN REDFISH_FEATURE_CALLBACK        Callback,
>    IN VOID                            *Context
> -)
> +  )
>  {
> -  CHAR16 NodeName [MaxNodeNameLength];
> -  EFI_STATUS Status;
> -  UINTN Index;
> -  UINTN AnchorIndex;
> -  UINTN UriLength;
> -  BOOLEAN NewUri;
> -  REDFISH_FEATURE_INTERNAL_DATA *ThisUriNode;
> -  REDFISH_FEATURE_INTERNAL_DATA *PreUriNode;
> -  REDFISH_FEATURE_INTERNAL_DATA *NewUriNode;
> -  REDFISH_FEATURE_INTERNAL_DATA *MatchNodeEntry;
> -  BOOLEAN ItsCollection;
> -
> -  if (FeatureManagedUri == NULL || Callback == NULL) {
> -    DEBUG((DEBUG_ERROR, "%a: The given parameter is invalid\n",
> __FUNCTION__));
> +  CHAR16                         NodeName[MaxNodeNameLength];
> +  EFI_STATUS                     Status;
> +  UINTN                          Index;
> +  UINTN                          AnchorIndex;
> +  UINTN                          UriLength;
> +  BOOLEAN                        NewUri;
> +  REDFISH_FEATURE_INTERNAL_DATA  *ThisUriNode;
> +  REDFISH_FEATURE_INTERNAL_DATA  *PreUriNode;
> +  REDFISH_FEATURE_INTERNAL_DATA  *NewUriNode;
> +  REDFISH_FEATURE_INTERNAL_DATA  *MatchNodeEntry;
> +  BOOLEAN                        ItsCollection;
> +
> +  if ((FeatureManagedUri == NULL) || (Callback == NULL)) {
> +    DEBUG ((DEBUG_ERROR, "%a: The given parameter is invalid\n",
> __FUNCTION__));
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    //
>    // Walk through URI which managed by this EDK2 Redfish feature driver.
>    //
> -  UriLength = StrLen (FeatureManagedUri) + 1; // Add one NULL for the last
> node.
> -  Index = 0;
> +  UriLength   = StrLen (FeatureManagedUri) + 1; // Add one NULL for the last
> node.
> +  Index       = 0;
>    AnchorIndex = 0;
>    ThisUriNode = ResourceUriNodeList;
> -  PreUriNode = ResourceUriNodeList;
> -  NewUri = FALSE;
> +  PreUriNode  = ResourceUriNodeList;
> +  NewUri      = FALSE;
>    while ((Index < UriLength)) {
> -    if ((Index - AnchorIndex + 1) >= MaxNodeNameLength) { // Increase one
> for the NULL terminator
> -      DEBUG((DEBUG_ERROR, "%a: the length of node name is >=
> MaxNodeNameLength\n", __FUNCTION__));
> +    if ((Index - AnchorIndex + 1) >= MaxNodeNameLength) {
> +      // Increase one for the NULL terminator
> +      DEBUG ((DEBUG_ERROR, "%a: the length of node name is >=
> MaxNodeNameLength\n", __FUNCTION__));
>        ASSERT (FALSE);
>      }
> +
>      NodeName[Index - AnchorIndex] = *(FeatureManagedUri + Index);
> -    if (NodeName [Index - AnchorIndex] == NodeSeperator || NodeName
> [Index - AnchorIndex] == UriSeperator || NodeName [Index - AnchorIndex]
> == (CHAR16)0) {
> -      if (NodeName [Index - AnchorIndex] == UriSeperator) {
> +    if ((NodeName[Index - AnchorIndex] == NodeSeperator) ||
> (NodeName[Index - AnchorIndex] == UriSeperator) || (NodeName[Index -
> AnchorIndex] == (CHAR16)0)) {
> +      if (NodeName[Index - AnchorIndex] == UriSeperator) {
>          NewUri = TRUE;
>        }
> -      NodeName [Index - AnchorIndex] = 0;
> -      AnchorIndex = Index + 1;
> +
> +      NodeName[Index - AnchorIndex] = 0;
> +      AnchorIndex                   = Index + 1;
>        //
>        // Insert node
>        //
> -      if (StrLen(NodeName) != 0) {
> +      if (StrLen (NodeName) != 0) {
>          ItsCollection = FALSE;
> -        if ((Index + StrLen(NodeIsCollectionSymbol)) < UriLength &&
> -            *(FeatureManagedUri + Index + 1) == NodeIsCollectionLeftBracket
> &&
> -            *(FeatureManagedUri + Index + 2) == NodeIsCollectionRightBracket) {
> -          Index += (StrLen(NodeIsCollectionSymbol));
> -          AnchorIndex += (StrLen(NodeIsCollectionSymbol));
> +        if (((Index + StrLen (NodeIsCollectionSymbol)) < UriLength) &&
> +            (*(FeatureManagedUri + Index + 1) == NodeIsCollectionLeftBracket)
> &&
> +            (*(FeatureManagedUri + Index + 2) == NodeIsCollectionRightBracket))
> +        {
> +          Index        += (StrLen (NodeIsCollectionSymbol));
> +          AnchorIndex  += (StrLen (NodeIsCollectionSymbol));
>            ItsCollection = TRUE;
>            if (*(FeatureManagedUri + Index) == UriSeperator) {
> -            NewUri = TRUE;;
> +            NewUri = TRUE;
>            }
>          }
> -        Status = InsertRedfishFeatureUriNode(ThisUriNode, &PreUriNode,
> NodeName, ItsCollection, &NewUriNode, &MatchNodeEntry);
> +
> +        Status = InsertRedfishFeatureUriNode (ThisUriNode, &PreUriNode,
> NodeName, ItsCollection, &NewUriNode, &MatchNodeEntry);
>          if (EFI_ERROR (Status)) {
>            return Status;
>          }
> +
>          ThisUriNode = NewUriNode;
>        }
> +
>        if (NewUri || ((Index + 1) >= UriLength)) {
>          //
>          // Setup the callabck and restart the searching for the
> @@ -499,28 +547,31 @@ RedfishFeatureRegister (
>          //
>          if (MatchNodeEntry != NULL) {
>            MatchNodeEntry->Callback = Callback;
> -          MatchNodeEntry->Context = Context;
> -          MatchNodeEntry = NULL;
> +          MatchNodeEntry->Context  = Context;
> +          MatchNodeEntry           = NULL;
>          } else {
>            PreUriNode->Callback = Callback;
> -          PreUriNode->Context = Context;
> +          PreUriNode->Context  = Context;
>          }
> -        NewUri = FALSE;
> +
> +        NewUri      = FALSE;
>          ThisUriNode = ResourceUriNodeList;
> -        Index ++;
> +        Index++;
>          continue;
>        }
>      }
> -    Index ++;
> -  };
> +
> +    Index++;
> +  }
> 
>    if (ThisUriNode == NULL) {
>      //
>      // No URI node was created
>      //
> -    DEBUG((DEBUG_ERROR, "%a: No URI node is added\n", __FUNCTION__));
> +    DEBUG ((DEBUG_ERROR, "%a: No URI node is added\n",
> __FUNCTION__));
>      return EFI_INVALID_PARAMETER;
>    }
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -545,12 +596,12 @@ RedfishFeatureUnregister (
>    IN     EDKII_REDFISH_FEATURE_PROTOCOL  *This,
>    IN     EFI_STRING                      FeatureManagedUri,
>    IN     VOID                            *Context
> -)
> +  )
>  {
>    return EFI_UNSUPPORTED;
>  }
> 
> -EDKII_REDFISH_FEATURE_PROTOCOL mRedfishFeatureProtocol = {
> +EDKII_REDFISH_FEATURE_PROTOCOL  mRedfishFeatureProtocol = {
>    RedfishFeatureRegister,
>    RedfishFeatureUnregister
>  };
> @@ -567,30 +618,30 @@ EDKII_REDFISH_FEATURE_PROTOCOL
> mRedfishFeatureProtocol = {
>  EFI_STATUS
>  EFIAPI
>  RedfishFeatureCoreEntryPoint (
> -  IN EFI_HANDLE         ImageHandle,
> -  IN EFI_SYSTEM_TABLE   *SystemTable
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
>    )
>  {
>    EFI_STATUS  Status;
>    EFI_HANDLE  Handle;
> -  EFI_GUID *EventGuid;
> +  EFI_GUID    *EventGuid;
> 
> -  Handle = NULL;
> +  Handle              = NULL;
>    ResourceUriNodeList = NULL;
> -  EventGuid = (EFI_GUID *)PcdGetPtr
> (PcdEdkIIRedfishFeatureDriverStartupEventGuid);
> +  EventGuid           = (EFI_GUID *)PcdGetPtr
> (PcdEdkIIRedfishFeatureDriverStartupEventGuid);
> 
>    ZeroMem ((VOID *)&mFeatureDriverStartupContext, sizeof
> (REDFISH_FEATURE_STARTUP_CONTEXT));
> -  mFeatureDriverStartupContext.This = &mRedfishFeatureProtocol;
> +  mFeatureDriverStartupContext.This   = &mRedfishFeatureProtocol;
>    mFeatureDriverStartupContext.Action = CallbackActionStartOperation;
> 
>    Status = gBS->CreateEventEx (
> -                EVT_NOTIFY_SIGNAL,
> -                TPL_CALLBACK,
> -                RedfishFeatureDriverStartup,
> -                (CONST VOID *)&mFeatureDriverStartupContext,
> -                EventGuid,
> -                &mEdkIIRedfishFeatureDriverStartupEvent
> -                );
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  RedfishFeatureDriverStartup,
> +                  (CONST VOID *)&mFeatureDriverStartupContext,
> +                  EventGuid,
> +                  &mEdkIIRedfishFeatureDriverStartupEvent
> +                  );
>    if (EFI_ERROR (Status)) {
>      return Status;
>    }
> diff --git
> a/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.h
> b/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.h
> index 84b5e456d1..af274c01ca 100644
> --- a/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.h
> +++ b/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.h
> @@ -2,6 +2,7 @@
>    Definitions of RedfishFeatureCoreDxe
> 
>    (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> +  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -17,6 +18,8 @@
>  #include <Library/DebugLib.h>
>  #include <Library/MemoryAllocationLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
>  #include <Library/RedfishEventLib.h>
>  #include <Library/RedfishFeatureUtilityLib.h>
> 
> diff --git
> a/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf
> b/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf
> index ddcf991006..c67525eedd 100644
> --- a/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf
> +++ b/RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf
> @@ -4,6 +4,8 @@
>  #  drivers for the registration.
>  #
>  #  (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> +#  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +#
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
>  ##
> @@ -40,6 +42,7 @@
>    RedfishFeatureUtilityLib
>    UefiBootServicesTableLib
>    UefiDriverEntryPoint
> +  UefiRuntimeServicesTableLib
>    UefiLib
> 
>  [Protocols]
> @@ -47,6 +50,8 @@
> 
>  [Pcd]
> 
> gEfiRedfishClientPkgTokenSpaceGuid.PcdEdkIIRedfishFeatureDriverStartupE
> ventGuid
> +  gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootRequired
> +  gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootTimeout
> 
>  [Depex]
>    TRUE
> --
> 2.39.2.windows.1

      reply	other threads:[~2023-03-01 13:25 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-01 13:15 [edk2-staging][PATCH v2 1/1] RedfishClientPkg: Add mechanism to reboot system if config is changed Nickle Wang
2023-03-01 13:25 ` Chang, Abner [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MN2PR12MB3966344DA6B4389678450E76EAAD9@MN2PR12MB3966.namprd12.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox