[AMD Official Use Only - General]

This is the auto-gen file. I just give my review tag.

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

> -----Original Message-----
> From: Nickle Wang <nickle.w...@hpe.com>
> Sent: Wednesday, July 27, 2022 9:38 AM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <abner.ch...@amd.com>; Yang, Atom
> <atom.y...@amd.com>; Nick Ramirez <nrami...@nvidia.com>
> Subject: [edk2-staging][PATCH v3 12/15] edk2-staging/RedfishClientPkg:
> Rename Memory feature driver
> 
> [CAUTION: External Email]
> 
> Rename Memory driver by removing Redfish prefix. Update memory feature
> driver and support all properties under Memory schema. Also support
> "Identify" action in this driver. Corresponding changes are made to
> honor newly introduced library and protocol.
> 
> Signed-off-by: Nickle Wang <nickle.w...@hpe.com>
> Cc: Abner Chang <abner.ch...@amd.com>
> Cc: Yang Atom <atom.y...@amd.com>
> Cc: Nick Ramirez <nrami...@nvidia.com>
> ---
>  .../{RedfishMemoryCommon.c => MemoryCommon.c} | 1194 ++++++++++-
> ------
>  .../{RedfishMemoryCommon.h => MemoryCommon.h} |    2 +-
>  .../Dxe/{RedfishMemoryDxe.c => MemoryDxe.c}   |  138 +-
>  .../{RedfishMemoryDxe.inf => MemoryDxe.inf}   |   21 +-
>  .../Include/RedfishResourceCommon.h           |   38 +-
>  RedfishClientPkg/RedfishClient.fdf.inc        |    2 +-
>  .../RedfishClientComponents.dsc.inc           |    2 +-
>  7 files changed, 839 insertions(+), 558 deletions(-)
>  rename
> RedfishClientPkg/Features/Memory/V1_7_1/Common/{RedfishMemoryCo
> mmon.c => MemoryCommon.c} (64%)
>  rename
> RedfishClientPkg/Features/Memory/V1_7_1/Common/{RedfishMemoryCo
> mmon.h => MemoryCommon.h} (89%)
>  rename
> RedfishClientPkg/Features/Memory/V1_7_1/Dxe/{RedfishMemoryDxe.c =>
> MemoryDxe.c} (75%)
>  rename
> RedfishClientPkg/Features/Memory/V1_7_1/Dxe/{RedfishMemoryDxe.inf
> => MemoryDxe.inf} (57%)
> 
> diff --git
> a/RedfishClientPkg/Features/Memory/V1_7_1/Common/RedfishMemoryCo
> mmon.c
> b/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.
> c
> similarity index 64%
> rename from
> RedfishClientPkg/Features/Memory/V1_7_1/Common/RedfishMemoryCom
> mon.c
> rename to
> RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.c
> index 11f738f71c..745c5f9847 100644
> ---
> a/RedfishClientPkg/Features/Memory/V1_7_1/Common/RedfishMemoryCo
> mmon.c
> +++
> b/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.
> c
> @@ -1,45 +1,54 @@
>  /** @file
>    Redfish feature driver implementation - common functions
> 
> -  (C) Copyright 2020-2021 Hewlett Packard Enterprise Development LP<BR>
> +  (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> 
> -#include "RedfishMemoryCommon.h"
> +#include "MemoryCommon.h"
> 
>  CHAR8 MemoryEmptyJson[] = "{\"@odata.id\": \"\", \"@odata.type\":
> \"#Memory.v1_7_1.Memory\", \"Id\": \"\", \"Name\": \"\"}";
> 
>  REDFISH_RESOURCE_COMMON_PRIVATE *mRedfishResourcePrivate =
> NULL;
> 
> +/**
> +  Consume resource from given URI.
> +
> +  @param[in]   This                Pointer to
> REDFISH_RESOURCE_COMMON_PRIVATE instance.
> +  @param[in]   Json                The JSON to consume.
> +  @param[in]   HeaderEtag          The Etag string returned in HTTP header.
> +
> +  @retval EFI_SUCCESS              Value is returned successfully.
> +  @retval Others                   Some error happened.
> +
> +**/
>  EFI_STATUS
>  RedfishConsumeResourceCommon (
>    IN  REDFISH_RESOURCE_COMMON_PRIVATE *Private,
> -  IN  CHAR8                         *MemoryJson
> +  IN  CHAR8                           *Json,
> +  IN  CHAR8                           *HeaderEtag OPTIONAL
>    )
>  {
> -  EFI_STATUS                    Status;
> +  EFI_STATUS                   Status;
>    EFI_REDFISH_MEMORY_V1_7_1     *Memory;
>    EFI_REDFISH_MEMORY_V1_7_1_CS  *MemoryCs;
> -  EFI_STRING                    ConfigureLang;
> -  CHAR8                         *Arraykey;
> -  CHAR8                         *EtagInDb;
> +  EFI_STRING                   ConfigureLang;
> +
> 
> -  if (Private == NULL || IS_EMPTY_STRING (MemoryJson)) {
> +  if (Private == NULL || IS_EMPTY_STRING (Json)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  Memory= NULL;
> +  Memory = NULL;
>    MemoryCs = NULL;
>    ConfigureLang = NULL;
> -  Arraykey = NULL;
> -  EtagInDb = NULL;
> 
>    Status = Private->JsonStructProtocol->ToStructure (
>                                            Private->JsonStructProtocol,
>                                            NULL,
> -                                          MemoryJson,
> +                                          Json,
>                                            (EFI_REST_JSON_STRUCTURE_HEADER 
> **)&Memory
>                                            );
>    if (EFI_ERROR (Status)) {
> @@ -52,24 +61,13 @@ RedfishConsumeResourceCommon (
>    //
>    // Check ETAG to see if we need to consume it
>    //
> -  EtagInDb = GetEtagWithUri (Private->Uri);
> -  if (EtagInDb != NULL && MemoryCs->odata_etag != NULL) {
> -    if (AsciiStrCmp (EtagInDb, MemoryCs->odata_etag) == 0) {
> -      //
> -      // No change
> -      //
> -      DEBUG ((DEBUG_INFO, "%a, ETAG: [%a] no change, ignore consume
> action\n", __FUNCTION__, EtagInDb));
> -      goto ON_RELEASE;
> -    }
> -  }
> -
> -  //
> -  // Find array key from URI
> -  //
> -  Status = GetArraykeyFromUri (Private->Uri, &Arraykey);
> -  if (EFI_ERROR (Status)) {
> -    ASSERT (FALSE);
> -    return Status;
> +  if (CheckEtag (Private->Uri, HeaderEtag, MemoryCs->odata_etag)) {
> +    //
> +    // No change
> +    //
> +    DEBUG ((DEBUG_INFO, "%a, ETAG: %s has no change, ignore consume
> action\n", __FUNCTION__, Private->Uri));
> +    Status = EFI_ALREADY_STARTED;
> +    goto ON_RELEASE;
>    }
> 
>    //
> @@ -77,9 +75,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->AllocationAlignmentMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "AllocationAlignmentMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "AllocationAlignmentMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >AllocationAlignmentMiB);
>        if (EFI_ERROR (Status)) {
> @@ -88,7 +86,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -97,9 +95,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->AllocationIncrementMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "AllocationIncrementMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "AllocationIncrementMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >AllocationIncrementMiB);
>        if (EFI_ERROR (Status)) {
> @@ -108,18 +106,42 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
> +    }
> +  }
> +
> +  //
> +  // Handle ALLOWEDSPEEDSMHZ
> +  //
> +  if (MemoryCs->AllowedSpeedsMHz != NULL) {
> +    //
> +    // Find corresponding configure language for collection resource.
> +    //
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "AllowedSpeedsMHz");
> +    if (ConfigureLang != NULL) {
> +      Status = ApplyFeatureSettingsNumericArrayType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >AllowedSpeedsMHz);
> +      if (EFI_ERROR (Status)) {
> +        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
> +      }
> +
> +      FreePool (ConfigureLang);
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // ASSEMBLY will be handled by feature driver.
> +  //
> +
>    //
>    // Handle BASEMODULETYPE
>    //
>    if (MemoryCs->BaseModuleType != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "BaseModuleType", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "BaseModuleType");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >BaseModuleType);
>        if (EFI_ERROR (Status)) {
> @@ -128,7 +150,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -137,9 +159,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->BusWidthBits != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "BusWidthBits", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "BusWidthBits");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >BusWidthBits);
>        if (EFI_ERROR (Status)) {
> @@ -148,7 +170,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -157,9 +179,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->CacheSizeMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "CacheSizeMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "CacheSizeMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >CacheSizeMiB);
>        if (EFI_ERROR (Status)) {
> @@ -168,7 +190,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -177,9 +199,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->CapacityMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "CapacityMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "CapacityMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >CapacityMiB);
>        if (EFI_ERROR (Status)) {
> @@ -188,7 +210,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -197,9 +219,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->ConfigurationLocked != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "ConfigurationLocked", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "ConfigurationLocked");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >ConfigurationLocked);
>        if (EFI_ERROR (Status)) {
> @@ -208,7 +230,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -217,9 +239,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->DataWidthBits != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "DataWidthBits", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "DataWidthBits");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >DataWidthBits);
>        if (EFI_ERROR (Status)) {
> @@ -228,7 +250,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -237,9 +259,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->DeviceID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "DeviceID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id, "DeviceID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->DeviceID);
>        if (EFI_ERROR (Status)) {
> @@ -248,7 +270,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -257,9 +279,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->DeviceLocator != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "DeviceLocator", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "DeviceLocator");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->DeviceLocator);
>        if (EFI_ERROR (Status)) {
> @@ -268,7 +290,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -277,9 +299,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->ErrorCorrection != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "ErrorCorrection", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "ErrorCorrection");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->ErrorCorrection);
>        if (EFI_ERROR (Status)) {
> @@ -288,7 +310,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -297,9 +319,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->FirmwareApiVersion != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "FirmwareApiVersion", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "FirmwareApiVersion");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >FirmwareApiVersion);
>        if (EFI_ERROR (Status)) {
> @@ -308,7 +330,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -317,9 +339,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->FirmwareRevision != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "FirmwareRevision", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "FirmwareRevision");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >FirmwareRevision);
>        if (EFI_ERROR (Status)) {
> @@ -328,7 +350,27 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
> +    }
> +  }
> +
> +  //
> +  // Handle FUNCTIONCLASSES
> +  //
> +  if (MemoryCs->FunctionClasses != NULL) {
> +    //
> +    // Find corresponding configure language for collection resource.
> +    //
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "FunctionClasses");
> +    if (ConfigureLang != NULL) {
> +      Status = ApplyFeatureSettingsStringArrayType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >FunctionClasses);
> +      if (EFI_ERROR (Status)) {
> +        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
> +      }
> +
> +      FreePool (ConfigureLang);
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -337,9 +379,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->IsRankSpareEnabled != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "IsRankSpareEnabled", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "IsRankSpareEnabled");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >IsRankSpareEnabled);
>        if (EFI_ERROR (Status)) {
> @@ -348,7 +390,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -357,9 +399,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->IsSpareDeviceEnabled != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "IsSpareDeviceEnabled", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "IsSpareDeviceEnabled");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >IsSpareDeviceEnabled);
>        if (EFI_ERROR (Status)) {
> @@ -368,18 +410,22 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // LOCATION is not handled. Defined in
> https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fredfis
> h.dmtf.org%2Fschemas%2Fv1%2FResource.json&amp;data=05%7C01%7Cab
> ner.chang%40amd.com%7Cc5c18ad2dddb46daeae308da6f70b35f%7C3dd896
> 1fe4884e608e11a82d994e183d%7C0%7C0%7C637944827102439368%7CUnkn
> own%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik
> 1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=xlnkJ1Se7yQrRJ
> 48%2BKqY%2FeKKhwnhyrqiswP9J5GBpuI%3D&amp;reserved=0
> +  //
> +
>    //
>    // Handle LOGICALSIZEMIB
>    //
>    if (MemoryCs->LogicalSizeMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "LogicalSizeMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "LogicalSizeMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >LogicalSizeMiB);
>        if (EFI_ERROR (Status)) {
> @@ -388,7 +434,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -397,9 +443,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->Manufacturer != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "Manufacturer", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "Manufacturer");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->Manufacturer);
>        if (EFI_ERROR (Status)) {
> @@ -408,7 +454,27 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
> +    }
> +  }
> +
> +  //
> +  // Handle MAXTDPMILLIWATTS
> +  //
> +  if (MemoryCs->MaxTDPMilliWatts != NULL) {
> +    //
> +    // Find corresponding configure language for collection resource.
> +    //
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MaxTDPMilliWatts");
> +    if (ConfigureLang != NULL) {
> +      Status = ApplyFeatureSettingsNumericArrayType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >MaxTDPMilliWatts);
> +      if (EFI_ERROR (Status)) {
> +        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
> +      }
> +
> +      FreePool (ConfigureLang);
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -417,9 +483,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemoryDeviceType != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemoryDeviceType", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemoryDeviceType");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >MemoryDeviceType);
>        if (EFI_ERROR (Status)) {
> @@ -428,14 +494,14 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
>    //
>    // Handle MEMORYLOCATION
>    //
> -  if(MemoryCs->MemoryLocation == NULL) {
> +  if (MemoryCs->MemoryLocation == NULL) {
>      MemoryCs->MemoryLocation = AllocateZeroPool (sizeof
> (RedfishMemory_V1_7_1_MemoryLocation_CS));
>      ASSERT (MemoryCs->MemoryLocation != NULL);
>    }
> @@ -445,9 +511,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemoryLocation->Channel != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemoryLocation/Channel", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemoryLocation/Channel");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >MemoryLocation->Channel);
>        if (EFI_ERROR (Status)) {
> @@ -456,7 +522,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -465,9 +531,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemoryLocation->MemoryController != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemoryLocation/MemoryController",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemoryLocation/MemoryController");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >MemoryLocation->MemoryController);
>        if (EFI_ERROR (Status)) {
> @@ -476,7 +542,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -485,9 +551,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemoryLocation->Slot != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemoryLocation/Slot", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemoryLocation/Slot");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >MemoryLocation->Slot);
>        if (EFI_ERROR (Status)) {
> @@ -496,7 +562,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -505,9 +571,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemoryLocation->Socket != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemoryLocation/Socket", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemoryLocation/Socket");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >MemoryLocation->Socket);
>        if (EFI_ERROR (Status)) {
> @@ -516,18 +582,26 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // Handle MEMORYMEDIA
> +  //
> +//
> +// ****** Warning ******
> +// Unsupported array type:
> +//
> +
>    //
>    // Handle MEMORYSUBSYSTEMCONTROLLERMANUFACTURERID
>    //
>    if (MemoryCs->MemorySubsystemControllerManufacturerID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> "MemorySubsystemControllerManufacturerID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemorySubsystemControllerManufacturerID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >MemorySubsystemControllerManufacturerID);
>        if (EFI_ERROR (Status)) {
> @@ -536,7 +610,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -545,9 +619,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemorySubsystemControllerProductID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemorySubsystemControllerProductID",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemorySubsystemControllerProductID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >MemorySubsystemControllerProductID);
>        if (EFI_ERROR (Status)) {
> @@ -556,7 +630,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -565,9 +639,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->MemoryType != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "MemoryType", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "MemoryType");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->MemoryType);
>        if (EFI_ERROR (Status)) {
> @@ -576,18 +650,22 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // METRICS will be handled by feature driver.
> +  //
> +
>    //
>    // Handle MODULEMANUFACTURERID
>    //
>    if (MemoryCs->ModuleManufacturerID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "ModuleManufacturerID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "ModuleManufacturerID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >ModuleManufacturerID);
>        if (EFI_ERROR (Status)) {
> @@ -596,7 +674,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -605,9 +683,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->ModuleProductID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "ModuleProductID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "ModuleProductID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >ModuleProductID);
>        if (EFI_ERROR (Status)) {
> @@ -616,7 +694,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -625,9 +703,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->NonVolatileSizeMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "NonVolatileSizeMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "NonVolatileSizeMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >NonVolatileSizeMiB);
>        if (EFI_ERROR (Status)) {
> @@ -636,18 +714,26 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // Handle OPERATINGMEMORYMODES
> +  //
> +//
> +// ****** Warning ******
> +// Unsupported array type:
> +//
> +
>    //
>    // Handle OPERATINGSPEEDMHZ
>    //
>    if (MemoryCs->OperatingSpeedMhz != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "OperatingSpeedMhz", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "OperatingSpeedMhz");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >OperatingSpeedMhz);
>        if (EFI_ERROR (Status)) {
> @@ -656,7 +742,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -665,9 +751,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PartNumber != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "PartNumber", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PartNumber");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->PartNumber);
>        if (EFI_ERROR (Status)) {
> @@ -676,7 +762,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -685,9 +771,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PersistentRegionNumberLimit != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "PersistentRegionNumberLimit", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PersistentRegionNumberLimit");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >PersistentRegionNumberLimit);
>        if (EFI_ERROR (Status)) {
> @@ -696,7 +782,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -705,9 +791,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PersistentRegionSizeLimitMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "PersistentRegionSizeLimitMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PersistentRegionSizeLimitMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >PersistentRegionSizeLimitMiB);
>        if (EFI_ERROR (Status)) {
> @@ -716,7 +802,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -725,9 +811,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PersistentRegionSizeMaxMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "PersistentRegionSizeMaxMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PersistentRegionSizeMaxMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >PersistentRegionSizeMaxMiB);
>        if (EFI_ERROR (Status)) {
> @@ -736,14 +822,14 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
>    //
>    // Handle POWERMANAGEMENTPOLICY
>    //
> -  if(MemoryCs->PowerManagementPolicy == NULL) {
> +  if (MemoryCs->PowerManagementPolicy == NULL) {
>      MemoryCs->PowerManagementPolicy = AllocateZeroPool (sizeof
> (RedfishMemory_V1_7_1_PowerManagementPolicy_CS));
>      ASSERT (MemoryCs->PowerManagementPolicy != NULL);
>    }
> @@ -753,9 +839,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> "PowerManagementPolicy/AveragePowerBudgetMilliWatts", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PowerManagementPolicy/AveragePowerBudgetMilliWatts");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >PowerManagementPolicy->AveragePowerBudgetMilliWatts);
>        if (EFI_ERROR (Status)) {
> @@ -764,7 +850,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -773,9 +859,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PowerManagementPolicy->MaxTDPMilliWatts != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> "PowerManagementPolicy/MaxTDPMilliWatts", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PowerManagementPolicy/MaxTDPMilliWatts");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >PowerManagementPolicy->MaxTDPMilliWatts);
>        if (EFI_ERROR (Status)) {
> @@ -784,7 +870,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -793,9 +879,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PowerManagementPolicy->PeakPowerBudgetMilliWatts !=
> NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> "PowerManagementPolicy/PeakPowerBudgetMilliWatts", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PowerManagementPolicy/PeakPowerBudgetMilliWatts");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >PowerManagementPolicy->PeakPowerBudgetMilliWatts);
>        if (EFI_ERROR (Status)) {
> @@ -804,7 +890,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -813,9 +899,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->PowerManagementPolicy->PolicyEnabled != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "PowerManagementPolicy/PolicyEnabled",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "PowerManagementPolicy/PolicyEnabled");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >PowerManagementPolicy->PolicyEnabled);
>        if (EFI_ERROR (Status)) {
> @@ -824,7 +910,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -833,9 +919,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->RankCount != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "RankCount", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id, "RankCount");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >RankCount);
>        if (EFI_ERROR (Status)) {
> @@ -844,14 +930,22 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // Handle REGIONS
> +  //
> +//
> +// ****** Warning ******
> +// Unsupported array type:
> +//
> +
>    //
>    // Handle SECURITYCAPABILITIES
>    //
> -  if(MemoryCs->SecurityCapabilities == NULL) {
> +  if (MemoryCs->SecurityCapabilities == NULL) {
>      MemoryCs->SecurityCapabilities = AllocateZeroPool (sizeof
> (RedfishMemory_V1_7_1_SecurityCapabilities_CS));
>      ASSERT (MemoryCs->SecurityCapabilities != NULL);
>    }
> @@ -861,9 +955,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SecurityCapabilities->ConfigurationLockCapable != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> "SecurityCapabilities/ConfigurationLockCapable", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SecurityCapabilities/ConfigurationLockCapable");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >SecurityCapabilities->ConfigurationLockCapable);
>        if (EFI_ERROR (Status)) {
> @@ -872,7 +966,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -881,9 +975,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SecurityCapabilities->DataLockCapable != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SecurityCapabilities/DataLockCapable",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SecurityCapabilities/DataLockCapable");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >SecurityCapabilities->DataLockCapable);
>        if (EFI_ERROR (Status)) {
> @@ -892,7 +986,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -901,9 +995,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SecurityCapabilities->MaxPassphraseCount != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SecurityCapabilities/MaxPassphraseCount",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SecurityCapabilities/MaxPassphraseCount");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >SecurityCapabilities->MaxPassphraseCount);
>        if (EFI_ERROR (Status)) {
> @@ -912,7 +1006,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -921,9 +1015,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SecurityCapabilities->PassphraseCapable != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SecurityCapabilities/PassphraseCapable",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SecurityCapabilities/PassphraseCapable");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsBooleanType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (BOOLEAN)*MemoryCs-
> >SecurityCapabilities->PassphraseCapable);
>        if (EFI_ERROR (Status)) {
> @@ -932,7 +1026,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -941,9 +1035,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SecurityCapabilities->PassphraseLockLimit != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SecurityCapabilities/PassphraseLockLimit",
> Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SecurityCapabilities/PassphraseLockLimit");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >SecurityCapabilities->PassphraseLockLimit);
>        if (EFI_ERROR (Status)) {
> @@ -952,18 +1046,26 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> +  //
> +  // Handle SECURITYCAPABILITIES->SECURITYSTATES
> +  //
> +//
> +// ****** Warning ******
> +// Unsupported array type:
> +//
> +
>    //
>    // Handle SECURITYSTATE
>    //
>    if (MemoryCs->SecurityState != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SecurityState", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SecurityState");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->SecurityState);
>        if (EFI_ERROR (Status)) {
> @@ -972,7 +1074,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -981,9 +1083,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SerialNumber != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SerialNumber", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SerialNumber");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->SerialNumber);
>        if (EFI_ERROR (Status)) {
> @@ -992,7 +1094,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1001,9 +1103,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SpareDeviceCount != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SpareDeviceCount", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SpareDeviceCount");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >SpareDeviceCount);
>        if (EFI_ERROR (Status)) {
> @@ -1012,7 +1114,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1021,9 +1123,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SubsystemDeviceID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SubsystemDeviceID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SubsystemDeviceID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >SubsystemDeviceID);
>        if (EFI_ERROR (Status)) {
> @@ -1032,7 +1134,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1041,9 +1143,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->SubsystemVendorID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "SubsystemVendorID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "SubsystemVendorID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs-
> >SubsystemVendorID);
>        if (EFI_ERROR (Status)) {
> @@ -1052,7 +1154,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1061,9 +1163,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->VendorID != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "VendorID", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id, "VendorID");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, MemoryCs->VendorID);
>        if (EFI_ERROR (Status)) {
> @@ -1072,7 +1174,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1081,9 +1183,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->VolatileRegionNumberLimit != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "VolatileRegionNumberLimit", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "VolatileRegionNumberLimit");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >VolatileRegionNumberLimit);
>        if (EFI_ERROR (Status)) {
> @@ -1092,7 +1194,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1101,9 +1203,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->VolatileRegionSizeLimitMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "VolatileRegionSizeLimitMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "VolatileRegionSizeLimitMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >VolatileRegionSizeLimitMiB);
>        if (EFI_ERROR (Status)) {
> @@ -1112,7 +1214,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1121,9 +1223,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->VolatileRegionSizeMaxMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "VolatileRegionSizeMaxMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "VolatileRegionSizeMaxMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >VolatileRegionSizeMaxMiB);
>        if (EFI_ERROR (Status)) {
> @@ -1132,7 +1234,7 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> @@ -1141,9 +1243,9 @@ RedfishConsumeResourceCommon (
>    //
>    if (MemoryCs->VolatileSizeMiB != NULL) {
>      //
> -    // Find corresponding redpath for collection resource.
> +    // Find corresponding configure language for collection resource.
>      //
> -    ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, "VolatileSizeMiB", Arraykey);
> +    ConfigureLang = GetConfigureLang (MemoryCs->odata_id,
> "VolatileSizeMiB");
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsNumericType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, (UINTN)*MemoryCs-
> >VolatileSizeMiB);
>        if (EFI_ERROR (Status)) {
> @@ -1152,26 +1254,16 @@ RedfishConsumeResourceCommon (
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for key:
> %a\n", __FUNCTION__, Arraykey));
> +      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI:
> %s\n", __FUNCTION__, Private->Uri));
>      }
>    }
> 
> 
> -
> -  //
>  ON_RELEASE:
> 
>    //
>    // Release resource.
>    //
> -  if (EtagInDb != NULL) {
> -    FreePool (EtagInDb);
> -  }
> -
> -  if (Arraykey != NULL) {
> -    FreePool (Arraykey);
> -  }
> -
>    Private->JsonStructProtocol->DestoryStructure (
>                                   Private->JsonStructProtocol,
>                                   (EFI_REST_JSON_STRUCTURE_HEADER *)Memory
> @@ -1183,7 +1275,7 @@ ON_RELEASE:
>  EFI_STATUS
>  ProvisioningMemoryProperties (
>    IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
> -  IN  CHAR8                             *IputJson,
> +  IN  CHAR8                             *InputJson,
>    IN  CHAR8                             *ResourceId,  OPTIONAL
>    IN  EFI_STRING                        ConfigureLang,
>    IN  BOOLEAN                           ProvisionMode,
> @@ -1193,28 +1285,31 @@ ProvisioningMemoryProperties (
>    EFI_REDFISH_MEMORY_V1_7_1     *Memory;
>    EFI_REDFISH_MEMORY_V1_7_1_CS  *MemoryCs;
>    EFI_STATUS                    Status;
> +  BOOLEAN                       PropertyChanged;
>    INT64                         *NumericValue;
> -  INT32                         *IntegerValue;
> -  BOOLEAN                       *BooleanValue;
> +  INT64                         *NumericArrayValue;
> +  UINTN                         ArraySize;
>    CHAR8                         *AsciiStringValue;
> -  BOOLEAN                       PropertyChanged;
> -  BOOLEAN                       UnusedProperty;
> +  BOOLEAN                       *BooleanValue;
> +  INT32                         *IntegerValue;
> +  CHAR8                         **AsciiStringArrayValue;
> +
> 
> -  if (JsonStructProtocol == NULL || ResultJson == NULL || IS_EMPTY_STRING
> (IputJson) || IS_EMPTY_STRING (ConfigureLang)) {
> +
> +  if (JsonStructProtocol == NULL || ResultJson == NULL ||
> IS_EMPTY_STRING (InputJson) || IS_EMPTY_STRING (ConfigureLang)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s with: %s\n",
> __FUNCTION__, ConfigureLang, (ProvisionMode ? L"Provision all resource" :
> L"Provision existing resource")));
> +  DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s with: %s\n",
> __FUNCTION__, ConfigureLang, (ProvisionMode ? L"Provision resource" :
> L"Update resource")));
> 
>    *ResultJson = NULL;
>    PropertyChanged = FALSE;
> -  UnusedProperty = TRUE;
> 
>    Memory = NULL;
>    Status = JsonStructProtocol->ToStructure (
>                                   JsonStructProtocol,
>                                   NULL,
> -                                 IputJson,
> +                                 InputJson,
>                                   (EFI_REST_JSON_STRUCTURE_HEADER **)&Memory
>                                   );
>    if (EFI_ERROR (Status)) {
> @@ -1243,7 +1338,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle ALLOCATIONINCREMENTMIB
>    //
> @@ -1256,7 +1350,18 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
> +  //
> +  // Handle ALLOWEDSPEEDSMHZ
> +  //
> +  if (PropertyChecker (MemoryCs->AllowedSpeedsMHz, ProvisionMode)) {
> +    NumericArrayValue = GetPropertyNumericArrayValue
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION,
> L"AllowedSpeedsMHz", ConfigureLang, &ArraySize);
> +    if (NumericArrayValue != NULL) {
> +      if (ProvisionMode || !CompareRedfishNumericArrayValues (MemoryCs-
> >AllowedSpeedsMHz, NumericArrayValue, ArraySize)) {
> +        AddRedfishNumericArray (&MemoryCs->AllowedSpeedsMHz,
> NumericArrayValue, ArraySize);
> +        PropertyChanged = TRUE;
> +      }
> +    }
> +  }
>    //
>    // Handle BASEMODULETYPE
>    //
> @@ -1269,7 +1374,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle BUSWIDTHBITS
>    //
> @@ -1282,7 +1386,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle CACHESIZEMIB
>    //
> @@ -1295,7 +1398,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle CAPACITYMIB
>    //
> @@ -1308,7 +1410,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle CONFIGURATIONLOCKED
>    //
> @@ -1320,11 +1421,11 @@ ProvisioningMemoryProperties (
>          if (IntegerValue != NULL) {
>            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
>            MemoryCs->ConfigurationLocked = IntegerValue;
> +          PropertyChanged = TRUE;
>          }
>        }
>      }
>    }
> -
>    //
>    // Handle DATAWIDTHBITS
>    //
> @@ -1337,7 +1438,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle DEVICEID
>    //
> @@ -1350,7 +1450,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle DEVICELOCATOR
>    //
> @@ -1363,7 +1462,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle ERRORCORRECTION
>    //
> @@ -1376,7 +1474,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle FIRMWAREAPIVERSION
>    //
> @@ -1389,7 +1486,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle FIRMWAREREVISION
>    //
> @@ -1402,7 +1498,18 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
> +  //
> +  // Handle FUNCTIONCLASSES
> +  //
> +  if (PropertyChecker (MemoryCs->FunctionClasses, ProvisionMode)) {
> +    AsciiStringArrayValue = GetPropertyStringArrayValue
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"FunctionClasses",
> ConfigureLang, &ArraySize);
> +    if (AsciiStringArrayValue != NULL) {
> +      if (ProvisionMode || !CompareRedfishStringArrayValues (MemoryCs-
> >FunctionClasses, AsciiStringArrayValue, ArraySize)) {
> +        AddRedfishCharArray (&MemoryCs->FunctionClasses,
> AsciiStringArrayValue, ArraySize);
> +        PropertyChanged = TRUE;
> +      }
> +    }
> +  }
>    //
>    // Handle ISRANKSPAREENABLED
>    //
> @@ -1414,11 +1521,11 @@ ProvisioningMemoryProperties (
>          if (IntegerValue != NULL) {
>            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
>            MemoryCs->IsRankSpareEnabled = IntegerValue;
> +          PropertyChanged = TRUE;
>          }
>        }
>      }
>    }
> -
>    //
>    // Handle ISSPAREDEVICEENABLED
>    //
> @@ -1430,11 +1537,11 @@ ProvisioningMemoryProperties (
>          if (IntegerValue != NULL) {
>            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
>            MemoryCs->IsSpareDeviceEnabled = IntegerValue;
> +          PropertyChanged = TRUE;
>          }
>        }
>      }
>    }
> -
>    //
>    // Handle LOGICALSIZEMIB
>    //
> @@ -1447,7 +1554,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle MANUFACTURER
>    //
> @@ -1460,7 +1566,18 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
> +  //
> +  // Handle MAXTDPMILLIWATTS
> +  //
> +  if (PropertyChecker (MemoryCs->MaxTDPMilliWatts, ProvisionMode)) {
> +    NumericArrayValue = GetPropertyNumericArrayValue
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"MaxTDPMilliWatts",
> ConfigureLang, &ArraySize);
> +    if (NumericArrayValue != NULL) {
> +      if (ProvisionMode || !CompareRedfishNumericArrayValues (MemoryCs-
> >MaxTDPMilliWatts, NumericArrayValue, ArraySize)) {
> +        AddRedfishNumericArray (&MemoryCs->MaxTDPMilliWatts,
> NumericArrayValue, ArraySize);
> +        PropertyChanged = TRUE;
> +      }
> +    }
> +  }
>    //
>    // Handle MEMORYDEVICETYPE
>    //
> @@ -1473,78 +1590,66 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle MEMORYLOCATION
>    //
> -  if(MemoryCs->MemoryLocation == NULL) {
> -    MemoryCs->MemoryLocation = AllocateZeroPool (sizeof
> (RedfishMemory_V1_7_1_MemoryLocation_CS));
> -    ASSERT (MemoryCs->MemoryLocation != NULL);
> -    UnusedProperty = TRUE;
> -  } else {
> -    UnusedProperty = FALSE;
> -  }
> -
> -  //
> -  // Handle MEMORYLOCATION->CHANNEL
> -  //
> -  if (PropertyChecker (MemoryCs->MemoryLocation->Channel,
> ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/Channel",
> ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->MemoryLocation->Channel !=
> *NumericValue) {
> -        MemoryCs->MemoryLocation->Channel = NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +  if (MemoryCs->MemoryLocation != NULL) {
> +    //
> +    // Handle MEMORYLOCATION->CHANNEL
> +    //
> +    if (PropertyChecker (MemoryCs->MemoryLocation->Channel,
> ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/Channel",
> ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->MemoryLocation->Channel !=
> *NumericValue) {
> +          MemoryCs->MemoryLocation->Channel = NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle MEMORYLOCATION->MEMORYCONTROLLER
> -  //
> -  if (PropertyChecker (MemoryCs->MemoryLocation->MemoryController,
> ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/MemoryController",
> ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->MemoryLocation-
> >MemoryController != *NumericValue) {
> -        MemoryCs->MemoryLocation->MemoryController = NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +    //
> +    // Handle MEMORYLOCATION->MEMORYCONTROLLER
> +    //
> +    if (PropertyChecker (MemoryCs->MemoryLocation->MemoryController,
> ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/MemoryController",
> ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->MemoryLocation-
> >MemoryController != *NumericValue) {
> +          MemoryCs->MemoryLocation->MemoryController = NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle MEMORYLOCATION->SLOT
> -  //
> -  if (PropertyChecker (MemoryCs->MemoryLocation->Slot, ProvisionMode))
> {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/Slot", ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->MemoryLocation->Slot !=
> *NumericValue) {
> -        MemoryCs->MemoryLocation->Slot = NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +    //
> +    // Handle MEMORYLOCATION->SLOT
> +    //
> +    if (PropertyChecker (MemoryCs->MemoryLocation->Slot,
> ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/Slot", ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->MemoryLocation->Slot !=
> *NumericValue) {
> +          MemoryCs->MemoryLocation->Slot = NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle MEMORYLOCATION->SOCKET
> -  //
> -  if (PropertyChecker (MemoryCs->MemoryLocation->Socket,
> ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/Socket", ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->MemoryLocation->Socket !=
> *NumericValue) {
> -        MemoryCs->MemoryLocation->Socket = NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +    //
> +    // Handle MEMORYLOCATION->SOCKET
> +    //
> +    if (PropertyChecker (MemoryCs->MemoryLocation->Socket,
> ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemoryLocation/Socket", ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->MemoryLocation->Socket !=
> *NumericValue) {
> +          MemoryCs->MemoryLocation->Socket = NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
>    }
> 
> -  if (UnusedProperty)  {
> -    FreePool (MemoryCs->MemoryLocation);
> -    MemoryCs->MemoryLocation = NULL;
> -  }
> +  //
> +  // Handle MEMORYMEDIA
> +  //
> +//// ****** Warning ******
> +// Unsupported array type:
> +//
> 
>    //
>    // Handle MEMORYSUBSYSTEMCONTROLLERMANUFACTURERID
> @@ -1558,7 +1663,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle MEMORYSUBSYSTEMCONTROLLERPRODUCTID
>    //
> @@ -1571,7 +1675,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle MEMORYTYPE
>    //
> @@ -1584,7 +1687,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle MODULEMANUFACTURERID
>    //
> @@ -1597,7 +1699,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle MODULEPRODUCTID
>    //
> @@ -1610,7 +1711,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle NONVOLATILESIZEMIB
>    //
> @@ -1623,6 +1723,12 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> +  //
> +  // Handle OPERATINGMEMORYMODES
> +  //
> +//// ****** Warning ******
> +// Unsupported array type:
> +//
> 
>    //
>    // Handle OPERATINGSPEEDMHZ
> @@ -1636,7 +1742,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle PARTNUMBER
>    //
> @@ -1649,7 +1754,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle PERSISTENTREGIONNUMBERLIMIT
>    //
> @@ -1662,7 +1766,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle PERSISTENTREGIONSIZELIMITMIB
>    //
> @@ -1675,7 +1778,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle PERSISTENTREGIONSIZEMAXMIB
>    //
> @@ -1688,83 +1790,64 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle POWERMANAGEMENTPOLICY
>    //
> -  if(MemoryCs->PowerManagementPolicy == NULL) {
> -    MemoryCs->PowerManagementPolicy = AllocateZeroPool (sizeof
> (RedfishMemory_V1_7_1_PowerManagementPolicy_CS));
> -    ASSERT (MemoryCs->PowerManagementPolicy != NULL);
> -    UnusedProperty = TRUE;
> -  } else {
> -    UnusedProperty = FALSE;
> -  }
> -
> -  //
> -  // Handle POWERMANAGEMENTPOLICY-
> >AVERAGEPOWERBUDGETMILLIWATTS
> -  //
> -  if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts, ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"PowerManagementPolicy/AveragePowerBudgetMilliWatts",
> ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts != *NumericValue) {
> -        MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts = NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +  if (MemoryCs->PowerManagementPolicy != NULL) {
> +    //
> +    // Handle POWERMANAGEMENTPOLICY-
> >AVERAGEPOWERBUDGETMILLIWATTS
> +    //
> +    if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts, ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"PowerManagementPolicy/AveragePowerBudgetMilliWatts",
> ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts != *NumericValue) {
> +          MemoryCs->PowerManagementPolicy-
> >AveragePowerBudgetMilliWatts = NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle POWERMANAGEMENTPOLICY->MAXTDPMILLIWATTS
> -  //
> -  if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >MaxTDPMilliWatts, ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"PowerManagementPolicy/MaxTDPMilliWatts", ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >MaxTDPMilliWatts != *NumericValue) {
> -        MemoryCs->PowerManagementPolicy->MaxTDPMilliWatts =
> NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +    //
> +    // Handle POWERMANAGEMENTPOLICY->MAXTDPMILLIWATTS
> +    //
> +    if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >MaxTDPMilliWatts, ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"PowerManagementPolicy/MaxTDPMilliWatts", ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >MaxTDPMilliWatts != *NumericValue) {
> +          MemoryCs->PowerManagementPolicy->MaxTDPMilliWatts =
> NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle POWERMANAGEMENTPOLICY-
> >PEAKPOWERBUDGETMILLIWATTS
> -  //
> -  if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >PeakPowerBudgetMilliWatts, ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"PowerManagementPolicy/PeakPowerBudgetMilliWatts", ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >PeakPowerBudgetMilliWatts != *NumericValue) {
> -        MemoryCs->PowerManagementPolicy->PeakPowerBudgetMilliWatts =
> NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +    //
> +    // Handle POWERMANAGEMENTPOLICY-
> >PEAKPOWERBUDGETMILLIWATTS
> +    //
> +    if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >PeakPowerBudgetMilliWatts, ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"PowerManagementPolicy/PeakPowerBudgetMilliWatts", ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >PeakPowerBudgetMilliWatts != *NumericValue) {
> +          MemoryCs->PowerManagementPolicy->PeakPowerBudgetMilliWatts
> = NumericValue;
> +          PropertyChanged = TRUE;
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle POWERMANAGEMENTPOLICY->POLICYENABLED
> -  //
> -  if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >PolicyEnabled, ProvisionMode)) {
> -    BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"PowerManagementPolicy/PolicyEnabled",
> ConfigureLang);
> -    if (BooleanValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >PolicyEnabled != *BooleanValue) {
> -        IntegerValue = AllocatePool (sizeof (*IntegerValue));
> -        if (IntegerValue != NULL) {
> -          *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> -          MemoryCs->PowerManagementPolicy->PolicyEnabled = IntegerValue;
> -          PropertyChanged = TRUE;
> -          UnusedProperty = FALSE;
> +    //
> +    // Handle POWERMANAGEMENTPOLICY->POLICYENABLED
> +    //
> +    if (PropertyChecker (MemoryCs->PowerManagementPolicy-
> >PolicyEnabled, ProvisionMode)) {
> +      BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"PowerManagementPolicy/PolicyEnabled",
> ConfigureLang);
> +      if (BooleanValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->PowerManagementPolicy-
> >PolicyEnabled != *BooleanValue) {
> +          IntegerValue = AllocatePool (sizeof (*IntegerValue));
> +          if (IntegerValue != NULL) {
> +            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> +            MemoryCs->PowerManagementPolicy->PolicyEnabled =
> IntegerValue;
> +            PropertyChanged = TRUE;
> +          }
>          }
>        }
>      }
>    }
> 
> -  if (UnusedProperty)  {
> -    FreePool (MemoryCs->PowerManagementPolicy);
> -    MemoryCs->PowerManagementPolicy = NULL;
> -  }
> -
>    //
>    // Handle RANKCOUNT
>    //
> @@ -1777,103 +1860,96 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
> -  // Handle SECURITYCAPABILITIES
> +  // Handle REGIONS
>    //
> -  if(MemoryCs->SecurityCapabilities == NULL) {
> -    MemoryCs->SecurityCapabilities = AllocateZeroPool (sizeof
> (RedfishMemory_V1_7_1_SecurityCapabilities_CS));
> -    ASSERT (MemoryCs->SecurityCapabilities != NULL);
> -    UnusedProperty = TRUE;
> -  } else {
> -    UnusedProperty = FALSE;
> -  }
> +//// ****** Warning ******
> +// Unsupported array type:
> +//
> 
>    //
> -  // Handle SECURITYCAPABILITIES->CONFIGURATIONLOCKCAPABLE
> +  // Handle SECURITYCAPABILITIES
>    //
> -  if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >ConfigurationLockCapable, ProvisionMode)) {
> -    BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"SecurityCapabilities/ConfigurationLockCapable", ConfigureLang);
> -    if (BooleanValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >ConfigurationLockCapable != *BooleanValue) {
> -        IntegerValue = AllocatePool (sizeof (*IntegerValue));
> -        if (IntegerValue != NULL) {
> -          *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> -          MemoryCs->SecurityCapabilities->ConfigurationLockCapable =
> IntegerValue;
> -          PropertyChanged = TRUE;
> -          UnusedProperty = FALSE;
> +  if (MemoryCs->SecurityCapabilities != NULL) {
> +    //
> +    // Handle SECURITYCAPABILITIES->CONFIGURATIONLOCKCAPABLE
> +    //
> +    if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >ConfigurationLockCapable, ProvisionMode)) {
> +      BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"SecurityCapabilities/ConfigurationLockCapable", ConfigureLang);
> +      if (BooleanValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >ConfigurationLockCapable != *BooleanValue) {
> +          IntegerValue = AllocatePool (sizeof (*IntegerValue));
> +          if (IntegerValue != NULL) {
> +            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> +            MemoryCs->SecurityCapabilities->ConfigurationLockCapable =
> IntegerValue;
> +            PropertyChanged = TRUE;
> +          }
>          }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle SECURITYCAPABILITIES->DATALOCKCAPABLE
> -  //
> -  if (PropertyChecker (MemoryCs->SecurityCapabilities->DataLockCapable,
> ProvisionMode)) {
> -    BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SecurityCapabilities/DataLockCapable",
> ConfigureLang);
> -    if (BooleanValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >DataLockCapable != *BooleanValue) {
> -        IntegerValue = AllocatePool (sizeof (*IntegerValue));
> -        if (IntegerValue != NULL) {
> -          *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> -          MemoryCs->SecurityCapabilities->DataLockCapable = IntegerValue;
> +    //
> +    // Handle SECURITYCAPABILITIES->DATALOCKCAPABLE
> +    //
> +    if (PropertyChecker (MemoryCs->SecurityCapabilities->DataLockCapable,
> ProvisionMode)) {
> +      BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SecurityCapabilities/DataLockCapable",
> ConfigureLang);
> +      if (BooleanValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >DataLockCapable != *BooleanValue) {
> +          IntegerValue = AllocatePool (sizeof (*IntegerValue));
> +          if (IntegerValue != NULL) {
> +            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> +            MemoryCs->SecurityCapabilities->DataLockCapable = IntegerValue;
> +            PropertyChanged = TRUE;
> +          }
> +        }
> +      }
> +    }
> +    //
> +    // Handle SECURITYCAPABILITIES->MAXPASSPHRASECOUNT
> +    //
> +    if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >MaxPassphraseCount, ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"SecurityCapabilities/MaxPassphraseCount", ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >MaxPassphraseCount != *NumericValue) {
> +          MemoryCs->SecurityCapabilities->MaxPassphraseCount =
> NumericValue;
>            PropertyChanged = TRUE;
> -          UnusedProperty = FALSE;
>          }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle SECURITYCAPABILITIES->MAXPASSPHRASECOUNT
> -  //
> -  if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >MaxPassphraseCount, ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"SecurityCapabilities/MaxPassphraseCount", ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >MaxPassphraseCount != *NumericValue) {
> -        MemoryCs->SecurityCapabilities->MaxPassphraseCount =
> NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> +    //
> +    // Handle SECURITYCAPABILITIES->PASSPHRASECAPABLE
> +    //
> +    if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >PassphraseCapable, ProvisionMode)) {
> +      BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SecurityCapabilities/PassphraseCapable",
> ConfigureLang);
> +      if (BooleanValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >PassphraseCapable != *BooleanValue) {
> +          IntegerValue = AllocatePool (sizeof (*IntegerValue));
> +          if (IntegerValue != NULL) {
> +            *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> +            MemoryCs->SecurityCapabilities->PassphraseCapable = IntegerValue;
> +            PropertyChanged = TRUE;
> +          }
> +        }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle SECURITYCAPABILITIES->PASSPHRASECAPABLE
> -  //
> -  if (PropertyChecker (MemoryCs->SecurityCapabilities->PassphraseCapable,
> ProvisionMode)) {
> -    BooleanValue = GetPropertyBooleanValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SecurityCapabilities/PassphraseCapable",
> ConfigureLang);
> -    if (BooleanValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >PassphraseCapable != *BooleanValue) {
> -        IntegerValue = AllocatePool (sizeof (*IntegerValue));
> -        if (IntegerValue != NULL) {
> -          *IntegerValue = (BooleanValue ? 0x01 : 0x00);
> -          MemoryCs->SecurityCapabilities->PassphraseCapable = IntegerValue;
> +    //
> +    // Handle SECURITYCAPABILITIES->PASSPHRASELOCKLIMIT
> +    //
> +    if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >PassphraseLockLimit, ProvisionMode)) {
> +      NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SecurityCapabilities/PassphraseLockLimit",
> ConfigureLang);
> +      if (NumericValue != NULL) {
> +        if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >PassphraseLockLimit != *NumericValue) {
> +          MemoryCs->SecurityCapabilities->PassphraseLockLimit =
> NumericValue;
>            PropertyChanged = TRUE;
> -          UnusedProperty = FALSE;
>          }
>        }
>      }
> -  }
> -
> -  //
> -  // Handle SECURITYCAPABILITIES->PASSPHRASELOCKLIMIT
> +    //
> +    // Handle SECURITYCAPABILITIES->SECURITYSTATES
> +    //
> +  //// ****** Warning ******
> +  // Unsupported array type:
>    //
> -  if (PropertyChecker (MemoryCs->SecurityCapabilities-
> >PassphraseLockLimit, ProvisionMode)) {
> -    NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SecurityCapabilities/PassphraseLockLimit",
> ConfigureLang);
> -    if (NumericValue != NULL) {
> -      if (ProvisionMode || *MemoryCs->SecurityCapabilities-
> >PassphraseLockLimit != *NumericValue) {
> -        MemoryCs->SecurityCapabilities->PassphraseLockLimit = NumericValue;
> -        PropertyChanged = TRUE;
> -        UnusedProperty = FALSE;
> -      }
> -    }
> -  }
> 
> -  if (UnusedProperty)  {
> -    FreePool (MemoryCs->SecurityCapabilities);
> -    MemoryCs->SecurityCapabilities = NULL;
>    }
> 
>    //
> @@ -1888,7 +1964,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle SERIALNUMBER
>    //
> @@ -1901,7 +1976,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle SPAREDEVICECOUNT
>    //
> @@ -1914,7 +1988,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle SUBSYSTEMDEVICEID
>    //
> @@ -1927,7 +2000,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle SUBSYSTEMVENDORID
>    //
> @@ -1940,7 +2012,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle VENDORID
>    //
> @@ -1953,7 +2024,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle VOLATILEREGIONNUMBERLIMIT
>    //
> @@ -1966,7 +2036,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle VOLATILEREGIONSIZELIMITMIB
>    //
> @@ -1979,7 +2048,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle VOLATILEREGIONSIZEMAXMIB
>    //
> @@ -1992,7 +2060,6 @@ ProvisioningMemoryProperties (
>        }
>      }
>    }
> -
>    //
>    // Handle VOLATILESIZEMIB
>    //
> @@ -2006,8 +2073,6 @@ ProvisioningMemoryProperties (
>      }
>    }
> 
> -
> -
>    //
>    // Convert C structure back to JSON text.
>    //
> @@ -2039,18 +2104,17 @@ ProvisioningMemoryResource (
>    IN  EFI_STRING                        ConfigureLang
>    )
>  {
> -  CHAR8       *MemoryJson;
> +  CHAR8       *Json;
>    EFI_STATUS  Status;
> -  CHAR8       *NewResourceLocation;
> -  CHAR8       *NewKey;
> +  EFI_STRING  NewResourceLocation;
>    CHAR8       *EtagStr;
>    CHAR8       ResourceId[16];
> -  CHAR8       NewUri[255];
> 
>    if (IS_EMPTY_STRING (ConfigureLang) || Private == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> +  EtagStr = NULL;
>    AsciiSPrint (ResourceId, sizeof (ResourceId), "%d", Index);
> 
>    Status = ProvisioningMemoryProperties (
> @@ -2059,54 +2123,45 @@ ProvisioningMemoryResource (
>               ResourceId,
>               ConfigureLang,
>               TRUE,
> -             &MemoryJson
> +             &Json
>               );
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, provisioning resource for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
>      return Status;
>    }
> 
> -  Status = CreatePayloadToPostResource (Private->RedfishService, Private-
> >Payload, MemoryJson, &NewResourceLocation, &EtagStr);
> +  Status = CreatePayloadToPostResource (Private->RedfishService, Private-
> >Payload, Json, &NewResourceLocation, &EtagStr);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, post memory resource for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, post Memory resource for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
>      goto RELEASE_RESOURCE;
>    }
> 
> -  NewUri[0] = '\0';
> +  ASSERT (NewResourceLocation != NULL);
> 
>    //
>    // Keep location of new resource.
>    //
>    if (NewResourceLocation != NULL) {
> -    //
> -    // Find key
> -    //
> -    NewKey = AsciiStrStr (NewResourceLocation, RESOURCE_SCHEMA);
> -    if (NewKey != NULL) {
> -      NewKey += 6;
> -      //
> -      // skip '/'
> -      //
> -      if (NewKey[0] == '/') {
> -        NewKey++;
> -      }
> -      SetConfigureLangWithkey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, NewKey, Index);
> -      AsciiSPrint (NewUri, sizeof (NewUri), "%a[%a]", Private->Uri, NewKey);
> -      FreePool (NewResourceLocation);
> -    }
> +    RedfisSetRedfishUri (ConfigureLang, NewResourceLocation);
>    }
> 
>    //
>    // Handle Etag
>    //
>    if (EtagStr != NULL) {
> -    SetEtagWithUri (EtagStr, NewUri);
> +    SetEtagWithUri (EtagStr, NewResourceLocation);
>      FreePool (EtagStr);
>    }
> 
>  RELEASE_RESOURCE:
> 
> -  FreePool (MemoryJson);
> +  if (NewResourceLocation != NULL) {
> +    FreePool (NewResourceLocation);
> +  }
> +
> +  if (Json != NULL) {
> +    FreePool (Json);
> +  }
> 
>    return Status;
>  }
> @@ -2126,12 +2181,17 @@ ProvisioningMemoryResources (
> 
>    Status = RedfishFeatureGetUnifiedArrayTypeConfigureLang
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION,
> REDPATH_ARRAY_PATTERN, &UnifiedConfigureLangList);
>    if (EFI_ERROR (Status) || UnifiedConfigureLangList.Count == 0) {
> -    DEBUG ((DEBUG_ERROR, "%a, No HII question found with redpath: %s:
> %r\n", __FUNCTION__, REDPATH_ARRAY_PATTERN, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, No HII question found with configure
> language: %s: %r\n", __FUNCTION__, REDPATH_ARRAY_PATTERN, Status));
>      return EFI_NOT_FOUND;
>    }
> +  //
> +  // Set the configuration language in the
> RESOURCE_INFORMATION_EXCHANGE.
> +  // This information is sent back to the parent resource (e.g. the 
> collection
> driver).
> +  //
> +  EdkIIRedfishResourceSetConfigureLang (&UnifiedConfigureLangList);
> 
>    for (Index = 0; Index < UnifiedConfigureLangList.Count; Index++) {
> -    DEBUG ((DEBUG_INFO, "[%d] create memory resource from: %s\n",
> UnifiedConfigureLangList.List[Index].Index,
> UnifiedConfigureLangList.List[Index].ConfigureLang));
> +    DEBUG ((DEBUG_INFO, "[%d] create Memory resource from: %s\n",
> UnifiedConfigureLangList.List[Index].Index,
> UnifiedConfigureLangList.List[Index].ConfigureLang));
>      ProvisioningMemoryResource (Private,
> UnifiedConfigureLangList.List[Index].Index,
> UnifiedConfigureLangList.List[Index].ConfigureLang);
>      FreePool (UnifiedConfigureLangList.List[Index].ConfigureLang);
>    }
> @@ -2145,14 +2205,69 @@ ProvisioningMemoryExistResource (
>    IN  REDFISH_RESOURCE_COMMON_PRIVATE  *Private
>    )
>  {
> +  EFI_STATUS Status;
> +  EFI_STRING ConfigureLang;
> +  CHAR8      *EtagStr;
> +  CHAR8      *Json;
> +
>    if (Private == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  Private->Json = JsonDumpString (RedfishJsonInPayload (Private->Payload),
> EDKII_JSON_COMPACT);
> -  ASSERT (Private->Json != NULL);
> +  EtagStr = NULL;
> +  Json = NULL;
> +  ConfigureLang = NULL;
> +
> +  ConfigureLang = RedfishGetConfigLanguage (Private->Uri);
> +  if (ConfigureLang == NULL) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = ProvisioningMemoryProperties (
> +             Private->JsonStructProtocol,
> +             MemoryEmptyJson,
> +             NULL,
> +             ConfigureLang,
> +             TRUE,
> +             &Json
> +             );
> +  if (EFI_ERROR (Status)) {
> +    if (Status == EFI_NOT_FOUND) {
> +      DEBUG ((REDFISH_DEBUG_TRACE, "%a, provisioning existing resource
> for %s ignored. Nothing changed\n", __FUNCTION__, ConfigureLang));
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "%a, provisioning existing resource for %s
> failed: %r\n", __FUNCTION__, ConfigureLang, Status));
> +    }
> +    goto ON_RELEASE;
> +  }
> +
> +  DEBUG ((REDFISH_DEBUG_TRACE, "%a, provisioning existing resource for
> %s\n", __FUNCTION__, ConfigureLang));
> +  //
> +  // PUT back to instance
> +  //
> +  Status = CreatePayloadToPatchResource (Private->RedfishService, Private-
> >Payload, Json, &EtagStr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a, patch resource for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
> +  }
> +
> +  //
> +  // Handle Etag
> +  //
> +  if (EtagStr != NULL) {
> +    SetEtagWithUri (EtagStr, Private->Uri);
> +    FreePool (EtagStr);
> +  }
> +
> +ON_RELEASE:
> 
> -  return RedfishUpdateResourceCommon (Private, Private->Json);
> +  if (Json != NULL) {
> +    FreePool (Json);
> +  }
> +
> +  if (ConfigureLang != NULL) {
> +    FreePool (ConfigureLang);
> +  }
> +
> +  return Status;
>  }
> 
>  /**
> @@ -2200,9 +2315,6 @@ RedfishCheckResourceCommon (
>    EFI_STRING *ConfigureLangList;
>    UINTN      Count;
>    EFI_STRING Property;
> -  CHAR8      *PropertyAscii;
> -  UINTN      BuffSize;
> -  CHAR8      *Match;
> 
>    if (Private == NULL || IS_EMPTY_STRING (Json)) {
>      return EFI_INVALID_PARAMETER;
> @@ -2221,27 +2333,16 @@ RedfishCheckResourceCommon (
>    Status = EFI_SUCCESS;
>    for (Index = 0; Index < Count; Index++) {
> 
> -    Property = GetPropertyFromConfigureLang (ConfigureLangList[Index]);
> +    Property = GetPropertyFromConfigureLang (Private->Uri,
> ConfigureLangList[Index]);
>      if (Property == NULL) {
>        continue;
>      }
> 
> -    DEBUG ((DEBUG_INFO, "[%d] check resource from: %s\n", Index,
> Property));
> -
> -    BuffSize = StrLen (Property) + 1;
> -    PropertyAscii = AllocatePool (BuffSize);
> -    UnicodeStrToAsciiStrS (Property, PropertyAscii, BuffSize);
> -
> -    //
> -    // check to see if it is partial match.
> -    //
> -    Match = AsciiStrStr (Json, PropertyAscii);
> -    if (Match == NULL || AsciiStrnCmp (Match, PropertyAscii, AsciiStrLen
> (PropertyAscii)) != 0) {
> +    DEBUG ((DEBUG_INFO, "%a, [%d] check attribute for: %s\n",
> __FUNCTION__, Index, Property));
> +    if (!MatchPropertyWithJsonContext (Property, Json)) {
> +      DEBUG ((DEBUG_INFO, "%a, property is missing: %s\n", __FUNCTION__,
> Property));
>        Status = EFI_NOT_FOUND;
> -      DEBUG ((DEBUG_ERROR, "%a, property %a is missing\n",
> __FUNCTION__, PropertyAscii));
>      }
> -
> -    FreePool (PropertyAscii);
>    }
> 
>    FreePool (ConfigureLangList);
> @@ -2249,7 +2350,6 @@ RedfishCheckResourceCommon (
>    return Status;
>  }
> 
> -
>  /**
>    Update resource to given URI.
> 
> @@ -2263,40 +2363,34 @@ RedfishCheckResourceCommon (
>  EFI_STATUS
>  RedfishUpdateResourceCommon (
>    IN     REDFISH_RESOURCE_COMMON_PRIVATE  *Private,
> -  IN     CHAR8                            *Json
> +  IN     CHAR8                            *InputJson
>    )
>  {
>    EFI_STATUS Status;
> -  CHAR8      *MemoryJson;
> -  CHAR8      *ArrayKey;
> +  CHAR8      *Json;
>    EFI_STRING ConfigureLang;
>    CHAR8      *EtagStr;
> 
> -  if (Private == NULL || IS_EMPTY_STRING (Json)) {
> +  if (Private == NULL || IS_EMPTY_STRING (InputJson)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  MemoryJson = NULL;
> +  EtagStr = NULL;
> +  Json = NULL;
>    ConfigureLang = NULL;
> -  ArrayKey = NULL;
> 
> -  Status = GetArraykeyFromUri (Private->Uri, &ArrayKey);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  ConfigureLang = GetConfigureLangByKey (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, NULL, ArrayKey);
> +  ConfigureLang = RedfishGetConfigLanguage (Private->Uri);
>    if (ConfigureLang == NULL) {
>      return EFI_NOT_FOUND;
>    }
> 
>    Status = ProvisioningMemoryProperties (
>               Private->JsonStructProtocol,
> -             Json,
> +             InputJson,
>               NULL,
>               ConfigureLang,
>               FALSE,
> -             &MemoryJson
> +             &Json
>               );
>    if (EFI_ERROR (Status)) {
>      if (Status == EFI_NOT_FOUND) {
> @@ -2311,9 +2405,9 @@ RedfishUpdateResourceCommon (
>    //
>    // PUT back to instance
>    //
> -  Status = CreatePayloadToPatchResource (Private->RedfishService, Private-
> >Payload, MemoryJson, &EtagStr);
> +  Status = CreatePayloadToPatchResource (Private->RedfishService, Private-
> >Payload, Json, &EtagStr);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, post memory resource for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, patch resource for %s failed: %r\n",
> __FUNCTION__, ConfigureLang, Status));
>    }
> 
>    //
> @@ -2326,17 +2420,81 @@ RedfishUpdateResourceCommon (
> 
>  ON_RELEASE:
> 
> -  if (MemoryJson != NULL) {
> -    FreePool (MemoryJson);
> +  if (Json != NULL) {
> +    FreePool (Json);
>    }
> 
>    if (ConfigureLang != NULL) {
>      FreePool (ConfigureLang);
>    }
> 
> -  if (ArrayKey != NULL) {
> -    FreePool (ArrayKey);
> +  return Status;
> +}
> +
> +/**
> +  Identify resource from given URI.
> +
> +  @param[in]   This                Pointer to
> REDFISH_RESOURCE_COMMON_PRIVATE instance.
> +  @param[in]   Json                The JSON to consume.
> +
> +  @retval EFI_SUCCESS              Value is returned successfully.
> +  @retval Others                   Some error happened.
> +
> +**/
> +EFI_STATUS
> +RedfishIdentifyResourceCommon (
> +  IN     REDFISH_RESOURCE_COMMON_PRIVATE  *Private,
> +  IN     CHAR8                            *Json
> +  )
> +{
> +  BOOLEAN     Supported;
> +  EFI_STATUS  Status;
> +  EFI_STRING  EndOfChar;
> +  REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST ConfigLangList;
> +
> +  Supported = RedfishIdentifyResource (Private->Uri, Private->Json);
> +  if (Supported) {
> +    Status = RedfishFeatureGetUnifiedArrayTypeConfigureLang
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION,
> REDPATH_ARRAY_PATTERN, &ConfigLangList);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "%a,
> BiosConfigToRedfishGetConfigureLangRegex failed: %r\n", __FUNCTION__,
> Status));
> +      return Status;
> +    }
> +
> +    if (ConfigLangList.Count == 0) {
> +      return EFI_SUCCESS;
> +    }
> +
> +    EndOfChar = StrStr (ConfigLangList.List[0].ConfigureLang, L"}");
> +    if (EndOfChar == NULL) {
> +      ASSERT (FALSE);
> +      return EFI_DEVICE_ERROR;
> +    }
> +
> +    //EndOfChar = StrStr (ConfigLangList.List[0].ConfigureLang, L"}");
> +    Status = IsRedpathArray (ConfigLangList.List[0].ConfigureLang, NULL,
> &EndOfChar);
> +    if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {
> +      ASSERT (FALSE);
> +      return EFI_DEVICE_ERROR;
> +    }
> +    if (Status != EFI_SUCCESS) {
> +      //
> +      // This is not the collection redpath.
> +      //
> +      GetRedpathNodeByIndex (ConfigLangList.List[0].ConfigureLang, 0,
> &EndOfChar);
> +    }
> +    *(++EndOfChar) = '\0';
> +    //
> +    // Keep URI and ConfigLang mapping
> +    //
> +    RedfisSetRedfishUri (ConfigLangList.List[0].ConfigureLang, Private->Uri);
> +    //
> +    // Set the configuration language in the
> RESOURCE_INFORMATION_EXCHANGE.
> +    // This information is sent back to the parent resource (e.g. the 
> collection
> driver).
> +    //
> +    EdkIIRedfishResourceSetConfigureLang (&ConfigLangList);
> +    DestroyConfiglanguageList (&ConfigLangList);
> +    return EFI_SUCCESS;
>    }
> 
> -  return Status;
> +  return EFI_UNSUPPORTED;
>  }
> \ No newline at end of file
> diff --git
> a/RedfishClientPkg/Features/Memory/V1_7_1/Common/RedfishMemoryCo
> mmon.h
> b/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.
> h
> similarity index 89%
> rename from
> RedfishClientPkg/Features/Memory/V1_7_1/Common/RedfishMemoryCom
> mon.h
> rename to
> RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.h
> index e2a4f45681..05c58b3553 100644
> ---
> a/RedfishClientPkg/Features/Memory/V1_7_1/Common/RedfishMemoryCo
> mmon.h
> +++
> b/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.
> h
> @@ -20,7 +20,7 @@
>  #define RESOURCE_SCHEMA_MINOR   "7"
>  #define RESOURCE_SCHEMA_ERRATA  "1"
>  #define RESOURCE_SCHEMA_VERSION "v1_7_1"
> -#define REDPATH_ARRAY_PATTERN   L"/Memory/{.*}/"
> +#define REDPATH_ARRAY_PATTERN   L"/Memory/\\{.*\\}/"
>  #define REDPATH_ARRAY_PREFIX    L"/Memory/"
>  #define RESOURCE_SCHEMA_FULL    "x-uefi-redfish-Memory.v1_7_1"
> 
> diff --git
> a/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.c
> b/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> similarity index 75%
> rename from
> RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.c
> rename to RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> index d1fbf2c237..0a9d344d6f 100644
> ---
> a/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.c
> +++ b/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> @@ -1,16 +1,18 @@
>  /** @file
>    Redfish feature driver implementation - Memory
> 
> -  (C) Copyright 2020-2021 Hewlett Packard Enterprise Development LP<BR>
> +  (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> 
> -#include "../Common/RedfishMemoryCommon.h"
> +#include "../Common/MemoryCommon.h"
> 
>  extern REDFISH_RESOURCE_COMMON_PRIVATE
> *mRedfishResourcePrivate;
> 
> +EFI_HANDLE medfishResourceConfigProtocolHandle;
> +
>  /**
>    Provising redfish resource by given URI.
> 
> @@ -26,8 +28,8 @@ extern REDFISH_RESOURCE_COMMON_PRIVATE
> *mRedfishResourcePrivate;
>  EFI_STATUS
>  RedfishResourceProvisioningResource (
>    IN     EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL    *This,
> -  IN     CHAR8                                   *Uri,
> -  IN     BOOLEAN                                 PostMode
> +  IN     EFI_STRING                                Uri,
> +  IN     BOOLEAN                                   PostMode
>    )
>  {
>    REDFISH_RESOURCE_COMMON_PRIVATE *Private;
> @@ -38,9 +40,7 @@ RedfishResourceProvisioningResource (
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  if (!PostMode) {
> -    return EFI_UNSUPPORTED;
> -  }
> +  DEBUG ((DEBUG_INFO, "%a, provisioning in %s mode\n", __FUNCTION__,
> (PostMode ? L"POST" : L"PATCH")));
> 
>    Private =
> REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTO
> COL (This);
> 
> @@ -48,9 +48,9 @@ RedfishResourceProvisioningResource (
>      return EFI_NOT_READY;
>    }
> 
> -  Status = GetResourceByPath (Private->RedfishService, Uri, &Response);
> +  Status = GetResourceByUri (Private->RedfishService, Uri, &Response);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %a failed\n",
> __FUNCTION__, Uri));
> +    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n",
> __FUNCTION__, Uri));
>      return Status;
>    }
> 
> @@ -58,7 +58,7 @@ RedfishResourceProvisioningResource (
>    Private->Payload = Response.Payload;
>    ASSERT (Private->Payload != NULL);
> 
> -  Status = RedfishProvisioningResourceCommon (Private, FALSE);
> +  Status = RedfishProvisioningResourceCommon (Private, !PostMode);
> 
>    //
>    // Release resource
> @@ -89,12 +89,13 @@ RedfishResourceProvisioningResource (
>  EFI_STATUS
>  RedfishResourceConsumeResource (
>    IN     EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL    *This,
> -  IN     CHAR8                                   *Uri
> +  IN     EFI_STRING                                Uri
>    )
>  {
>    REDFISH_RESOURCE_COMMON_PRIVATE *Private;
>    EFI_STATUS                    Status;
>    REDFISH_RESPONSE              Response;
> +  CHAR8                         *Etag;
> 
>    if (This == NULL || IS_EMPTY_STRING (Uri)) {
>      return EFI_INVALID_PARAMETER;
> @@ -106,9 +107,9 @@ RedfishResourceConsumeResource (
>      return EFI_NOT_READY;
>    }
> 
> -  Status = GetResourceByPath (Private->RedfishService, Uri, &Response);
> +  Status = GetResourceByUri (Private->RedfishService, Uri, &Response);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %a failed\n",
> __FUNCTION__, Uri));
> +    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n",
> __FUNCTION__, Uri));
>      return Status;
>    }
> 
> @@ -119,9 +120,27 @@ RedfishResourceConsumeResource (
>    Private->Json = JsonDumpString (RedfishJsonInPayload (Private->Payload),
> EDKII_JSON_COMPACT);
>    ASSERT (Private->Json != NULL);
> 
> -  Status = RedfishConsumeResourceCommon (Private, Private->Json);
> +  //
> +  // Find etag in HTTP response header
> +  //
> +  Etag = NULL;
> +  Status = GetEtagAndLocation (&Response, &Etag, NULL);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to consume resource from: %a %r\n",
> __FUNCTION__, Uri, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, failed to get ETag from HTTP header\n",
> __FUNCTION__));
> +  }
> +
> +  Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
> +  if (EFI_ERROR (Status)) {
> +    if (Status != EFI_ALREADY_STARTED) {
> +      DEBUG ((DEBUG_ERROR, "%a, failed to consume resource from: %s:
> %r\n", __FUNCTION__, Uri, Status));
> +    }
> +  } else {
> +    //
> +    // Keep etag after consuming pending settings.
> +    //
> +    if (Etag != NULL) {
> +      SetEtagWithUri (Etag, Private->Uri);
> +    }
>    }
> 
>    //
> @@ -193,7 +212,7 @@ RedfishResourceGetInfo (
>  EFI_STATUS
>  RedfishResourceUpdate (
>    IN     EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL    *This,
> -  IN     CHAR8                                   *Uri
> +  IN     EFI_STRING                                Uri
>    )
>  {
>    REDFISH_RESOURCE_COMMON_PRIVATE *Private;
> @@ -210,9 +229,9 @@ RedfishResourceUpdate (
>      return EFI_NOT_READY;
>    }
> 
> -  Status = GetResourceByPath (Private->RedfishService, Uri, &Response);
> +  Status = GetResourceByUri (Private->RedfishService, Uri, &Response);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %a failed\n",
> __FUNCTION__, Uri));
> +    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n",
> __FUNCTION__, Uri));
>      return Status;
>    }
> 
> @@ -225,7 +244,7 @@ RedfishResourceUpdate (
> 
>    Status = RedfishUpdateResourceCommon (Private, Private->Json);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to update resource from: %a %r\n",
> __FUNCTION__, Uri, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, failed to update resource from: %s: %r\n",
> __FUNCTION__, Uri, Status));
>    }
> 
>    //
> @@ -262,7 +281,7 @@ RedfishResourceUpdate (
>  EFI_STATUS
>  RedfishResourceCheck (
>    IN     EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL    *This,
> -  IN     CHAR8                                   *Uri
> +  IN     EFI_STRING                                Uri
>    )
>  {
>    REDFISH_RESOURCE_COMMON_PRIVATE *Private;
> @@ -279,9 +298,9 @@ RedfishResourceCheck (
>      return EFI_NOT_READY;
>    }
> 
> -  Status = GetResourceByPath (Private->RedfishService, Uri, &Response);
> +  Status = GetResourceByUri (Private->RedfishService, Uri, &Response);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %a failed\n",
> __FUNCTION__, Uri));
> +    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n",
> __FUNCTION__, Uri));
>      return Status;
>    }
> 
> @@ -294,7 +313,7 @@ RedfishResourceCheck (
> 
>    Status = RedfishCheckResourceCommon (Private, Private->Json);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %a %r\n",
> __FUNCTION__, Uri, Status));
> +    DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %s: %r\n",
> __FUNCTION__, Uri, Status));
>    }
> 
>    //
> @@ -318,11 +337,82 @@ RedfishResourceCheck (
>    return Status;
>  }
> 
> +/**
> +  Identify resource on given URI.
> +
> +  @param[in]   This                Pointer to
> EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL instance.
> +  @param[in]   Uri                 The target URI to consume.
> +
> +  @retval EFI_SUCCESS              This is target resource which we want to
> handle.
> +  @retval EFI_UNSUPPORTED          This is not the target resource.
> +  @retval Others                   Some error happened.
> +
> +**/
> +
> +EFI_STATUS
> +RedfishResourceIdentify (
> +  IN     EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *This,
> +  IN     EFI_STRING                              Uri
> +  )
> +{
> +  REDFISH_RESOURCE_COMMON_PRIVATE *Private;
> +  EFI_STATUS                    Status;
> +  REDFISH_RESPONSE              Response;
> +
> +  if (This == NULL || IS_EMPTY_STRING (Uri)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Private =
> REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTO
> COL (This);
> +
> +  if (Private->RedfishService == NULL) {
> +    return EFI_NOT_READY;
> +  }
> +
> +  Status = GetResourceByUri (Private->RedfishService, Uri, &Response);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n",
> __FUNCTION__, Uri));
> +    return Status;
> +  }
> +
> +  Private->Uri = Uri;
> +  Private->Payload = Response.Payload;
> +  ASSERT (Private->Payload != NULL);
> +
> +  Private->Json = JsonDumpString (RedfishJsonInPayload (Private->Payload),
> EDKII_JSON_COMPACT);
> +  ASSERT (Private->Json != NULL);
> +
> +  Status = RedfishIdentifyResourceCommon (Private, Private->Json);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a, identify %s failed: %r\n", __FUNCTION__,
> Uri, Status));
> +  }
> +  //
> +  // Release resource
> +  //
> +  if (Private->Payload != NULL) {
> +    RedfishFreeResponse (
> +      Response.StatusCode,
> +      Response.HeaderCount,
> +      Response.Headers,
> +      Response.Payload
> +      );
> +    Private->Payload = NULL;
> +  }
> +
> +  if (Private->Json != NULL) {
> +    FreePool (Private->Json);
> +    Private->Json = NULL;
> +  }
> +
> +  return Status;
> +}
> +
>  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL mRedfishResourceConfig =
> {
>    RedfishResourceProvisioningResource,
>    RedfishResourceConsumeResource,
>    RedfishResourceUpdate,
>    RedfishResourceCheck,
> +  RedfishResourceIdentify,
>    RedfishResourceGetInfo
>  };
> 
> @@ -525,6 +615,8 @@ RedfishResourceEntryPoint (
>      return EFI_ALREADY_STARTED;
>    }
> 
> +  medfishResourceConfigProtocolHandle = ImageHandle;
> +
>    mRedfishResourcePrivate = AllocateZeroPool (sizeof
> (REDFISH_RESOURCE_COMMON_PRIVATE));
>    CopyMem (&mRedfishResourcePrivate->ConfigHandler,
> &mRedfishConfigHandler, sizeof
> (EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL));
>    CopyMem (&mRedfishResourcePrivate->RedfishResourceConfig,
> &mRedfishResourceConfig, sizeof
> (EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL));
> diff --git
> a/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf
> b/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.inf
> similarity index 57%
> rename from
> RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf
> rename to
> RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.inf
> index 30746adaed..ae2e8e8f74 100644
> ---
> a/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf
> +++ b/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.inf
> @@ -1,6 +1,6 @@
>  ## @file
>  #
> -#  (C) Copyright 2020-2021 Hewlett Packard Enterprise Development LP<BR>
> +#  (C) Copyright 2020-2022 Hewlett Packard Enterprise Development
> LP<BR>
>  #
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
> @@ -9,8 +9,8 @@
> 
>  [Defines]
>    INF_VERSION               = 0x00010005
> -  BASE_NAME                 = RedfishMemoryDxe
> -  FILE_GUID                 = f5594d13-ca13-485f-ac3a-80c5074dd8c0
> +  BASE_NAME                 = MemoryDxe
> +  FILE_GUID                 = 69a1a994-ec14-4dd0-ba0d-d1b51b7bab51
>    MODULE_TYPE               = DXE_DRIVER
>    VERSION_STRING            = 1.0
>    ENTRY_POINT               = RedfishResourceEntryPoint
> @@ -23,22 +23,25 @@
>    RedfishClientPkg/RedfishClientPkg.dec
> 
>  [Sources]
> -  ../Common/RedfishMemoryCommon.h
> -  ../Common/RedfishMemoryCommon.c
> -  RedfishMemoryDxe.c
> +  ../Common/MemoryCommon.h
> +  ../Common/MemoryCommon.c
> +  MemoryDxe.c
> 
>  [LibraryClasses]
>    BaseMemoryLib
>    DebugLib
> +  EdkIIRedfishResourceConfigLib
>    RedfishLib
>    RedfishFeatureUtilityLib
> +  RedfishResourceIdentifyLib
>    UefiLib
>    UefiDriverEntryPoint
> 
> +
>  [Protocols]
> -  gEdkIIRedfishConfigHandlerProtocolGuid    ## PRODUCED
> -  gEfiRestJsonStructureProtocolGuid         ## CONSUMED
> -  gEdkIIRedfishResourceConfigProtocolGuid   ## PRODUCED
> +  gEdkIIRedfishConfigHandlerProtocolGuid          ## PRODUCED
> +  gEfiRestJsonStructureProtocolGuid               ## CONSUMED
> +  gEdkIIRedfishResourceConfigProtocolGuid         ## PRODUCED
> 
>  [Pcd]
>    gEfiRedfishClientPkgTokenSpaceGuid.PcdMaxRedfishSchemaStringSize
> diff --git a/RedfishClientPkg/Include/RedfishResourceCommon.h
> b/RedfishClientPkg/Include/RedfishResourceCommon.h
> index 1ba992bb69..af4b809121 100644
> --- a/RedfishClientPkg/Include/RedfishResourceCommon.h
> +++ b/RedfishClientPkg/Include/RedfishResourceCommon.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Redfish feature driver common header file.
> 
> -  (C) Copyright 2020-2021 Hewlett Packard Enterprise Development LP<BR>
> +  (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -11,8 +11,8 @@
>  #define EFI_REDFISH_RESOURCE_COMMON_H_
> 
>  #define MAX_RED_PATH_LEN      128
> -#define IS_EMPTY_STRING(a)    ((a) == NULL || (a)[0] == '\0')
> -#define REDFISH_DEBUG_TRACE   DEBUG_INFO
> +
> +#include <RedfishBase.h>
> 
>  //
>  // Libraries
> @@ -23,14 +23,18 @@
>  #include <Library/PrintLib.h>
>  #include <Library/PcdLib.h>
>  #include <Library/RedfishLib.h>
> +#include <Library/RedfishVersionLib.h>
>  #include <Library/RedfishFeatureUtilityLib.h>
>  #include <Library/RedfishPlatformConfigLib.h>
>  #include <Library/UefiLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
> +#include <Library/RedfishResourceIdentifyLib.h>
> +#include <Library/EdkIIRedfishResourceConfigLib.h>
> 
>  //
>  // Protocols
>  //
> +#include <Protocol/EdkIIRedfishFeature.h>
>  #include <Protocol/EdkIIRedfishConfigHandler.h>
>  #include <Protocol/EdkIIRedfishResourceConfigProtocol.h>
>  #include <Protocol/RestJsonStructure.h>
> @@ -43,9 +47,15 @@ typedef struct
> _REDFISH_RESOURCE_COMMON_PRIVATE {
>    EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  RedfishResourceConfig;
>    EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL   ConfigHandler;
>    EFI_EVENT                               Event;
> -  CHAR8                                   *Uri;
> +  EFI_STRING                              Uri;
>    CHAR8                                   *Json;
>    REDFISH_PAYLOAD                         Payload;
> +  //
> +  //  Below are used for the external resource.
> +  //
> +  EDKII_REDFISH_FEATURE_PROTOCOL          *FeatureProtocol;
> +  RESOURCE_INFORMATION_EXCHANGE           *InformationExchange;
> +  EFI_STRING                              RedfishVersion;
>  } REDFISH_RESOURCE_COMMON_PRIVATE;
> 
>  #define
> REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_CONFIG_PROTOCO
> L(This) \
> @@ -60,6 +70,7 @@ typedef struct
> _REDFISH_RESOURCE_COMMON_PRIVATE {
> 
>    @param[in]   This                Pointer to
> REDFISH_RESOURCE_COMMON_PRIVATE instance.
>    @param[in]   Json                The JSON to consume.
> +  @param[in]   HeaderEtag          The Etag string returned in HTTP header.
> 
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval Others                   Some error happened.
> @@ -68,7 +79,8 @@ typedef struct
> _REDFISH_RESOURCE_COMMON_PRIVATE {
>  EFI_STATUS
>  RedfishConsumeResourceCommon (
>    IN     REDFISH_RESOURCE_COMMON_PRIVATE  *Private,
> -  IN     CHAR8                            *Json
> +  IN     CHAR8                            *Json,
> +  IN     CHAR8                            *HeaderEtag OPTIONAL
>    );
> 
>  /**
> @@ -120,4 +132,20 @@ RedfishUpdateResourceCommon (
>    IN     CHAR8                            *Json
>    );
> 
> +/**
> +  Identify resource from given URI.
> +
> +  @param[in]   This                Pointer to
> REDFISH_RESOURCE_COMMON_PRIVATE instance.
> +  @param[in]   Json                The JSON to consume.
> +
> +  @retval EFI_SUCCESS              Value is returned successfully.
> +  @retval Others                   Some error happened.
> +
> +**/
> +EFI_STATUS
> +RedfishIdentifyResourceCommon (
> +  IN     REDFISH_RESOURCE_COMMON_PRIVATE  *Private,
> +  IN     CHAR8                            *Json
> +  );
> +
>  #endif
> diff --git a/RedfishClientPkg/RedfishClient.fdf.inc
> b/RedfishClientPkg/RedfishClient.fdf.inc
> index 3619d2a20f..5c4b9670b0 100644
> --- a/RedfishClientPkg/RedfishClient.fdf.inc
> +++ b/RedfishClientPkg/RedfishClient.fdf.inc
> @@ -14,7 +14,7 @@
>    INF RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf
>    INF RedfishClientPkg/RedfishETagDxe/RedfishETagDxe.inf
>    INF
> RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf
> -  INF
> RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf
> +  INF RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.inf
>    INF
> RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.inf
> 
>    !include RedfishClientPkg/RedfishJsonStructureDxe.fdf.inc
> diff --git a/RedfishClientPkg/RedfishClientComponents.dsc.inc
> b/RedfishClientPkg/RedfishClientComponents.dsc.inc
> index 5f1aff3c4b..031d87558e 100644
> --- a/RedfishClientPkg/RedfishClientComponents.dsc.inc
> +++ b/RedfishClientPkg/RedfishClientComponents.dsc.inc
> @@ -19,7 +19,7 @@
>    #
>    # Below two modules should be pulled in by build tool.
>    #
> -  RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf
> +  RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.inf
> 
> RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.inf
> 
>    !include RedfishClientPkg/RedfishJsonStructureDxe.dsc.inc
> --
> 2.32.0.windows.2


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91922): https://edk2.groups.io/g/devel/message/91922
Mute This Topic: https://groups.io/mt/92641654/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to