public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel] [edk2-redfish-client][PATCH v3 2/2] RedfishClientPkg/Edk2RedfishResourceConfigLib: support config2 protocol
@ 2024-03-07  3:24 Nickle Wang via groups.io
  2024-03-07  3:58 ` Chang, Abner via groups.io
  0 siblings, 1 reply; 2+ messages in thread
From: Nickle Wang via groups.io @ 2024-03-07  3:24 UTC (permalink / raw)
  To: devel; +Cc: Abner Chang, Igor Kulchytskyy, Nick Ramirez

-Support Redfish resource config2 protocol in Edk2RedfishResourceConfigLib.
This library will try Redfish resource config2 protocol first. And if
there is no matching protocol found, Redfish resource config protocol will
be used.
-Because EdkIIRedfishResourceConfigLib is updated to support Redfish
resource config2 protocol, update corresponding functions in feature
drivers.

Signed-off-by: Nickle Wang <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Cc: Nick Ramirez <nramirez@nvidia.com>
---
 .../EdkIIRedfishResourceConfigLib.inf         |   4 +-
 .../Library/EdkIIRedfishResourceConfigLib.h   |  33 +-
 .../EdkIIRedfishResourceConfigInternal.h      |  44 ++
 .../Features/Bios/v1_0_9/Common/BiosCommon.c  |  14 +-
 .../BootOptionCollectionDxe.c                 |  14 +-
 .../ComputerSystemCollectionDxe.c             |  16 +-
 .../MemoryCollectionDxe/MemoryCollectionDxe.c |  16 +-
 .../EdkIIRedfishResourceConfigLib.c           | 391 ++++++++++++++----
 8 files changed, 415 insertions(+), 117 deletions(-)
 create mode 100644 RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigInternal.h

diff --git a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.inf b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.inf
index 2d10445f0..998a05c80 100644
--- a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.inf
+++ b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.inf
@@ -22,6 +22,7 @@
 #
 
 [Sources]
+  EdkIIRedfishResourceConfigInternal.h
   EdkIIRedfishResourceConfigLib.c
 
 [Packages]
@@ -42,8 +43,9 @@
   RedfishHttpLib
 
 [Protocols]
-  gEdkIIRedfishResourceConfigProtocolGuid   ## CONSUMES ##
+  gEdkIIRedfishResourceConfigProtocolGuid         ## CONSUMES ##
   gEdkIIRedfishFeatureInterchangeDataProtocolGuid ## CONSUMES ##
+  gEdkIIRedfishResourceConfig2ProtocolGuid        ## CONSUEMS ##
 
 [Pcd]
   gEfiRedfishClientPkgTokenSpaceGuid.PcdMaxRedfishSchemaStringSize
diff --git a/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h b/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
index 3aa953cec..57c7f2b80 100644
--- a/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
+++ b/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
@@ -16,6 +16,7 @@
 #include <RedfishServiceData.h>
 #include <Protocol/RestJsonStructure.h>
 #include <Protocol/EdkIIRedfishResourceConfigProtocol.h>
+#include <Protocol/EdkIIRedfishResourceConfig2Protocol.h>
 #include <Protocol/EdkIIRedfishInterchangeData.h>
 
 /**
@@ -23,6 +24,7 @@
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 Target URI to create resource.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
   @param[in]   InformationExchange Pointer to RESOURCE_INFORMATION_EXCHANGE.
   @param[in]   HttpPostMode        TRUE if resource does not exist, HTTP POST method is used.
                                    FALSE if the resource exist but some of properties are missing,
@@ -33,9 +35,11 @@
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigProvisioning (
   IN     REDFISH_SCHEMA_INFO            *Schema,
   IN     EFI_STRING                     Uri,
+  IN     CHAR8                          *JsonText OPTIONAL,
   IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange,
   IN     BOOLEAN                        HttpPostMode
   );
@@ -45,15 +49,18 @@ EdkIIRedfishResourceConfigProvisioning (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
 
   @retval EFI_SUCCESS              Value is returned successfully.
   @retval Others                   Some error happened.
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigConsume (
   IN     REDFISH_SCHEMA_INFO  *Schema,
-  IN     EFI_STRING           Uri
+  IN     EFI_STRING           Uri,
+  IN     CHAR8                *JsonText OPTIONAL
   );
 
 /**
@@ -61,21 +68,25 @@ EdkIIRedfishResourceConfigConsume (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
 
   @retval EFI_SUCCESS              Value is returned successfully.
   @retval Others                   Some error happened.
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigUpdate (
   IN     REDFISH_SCHEMA_INFO  *Schema,
-  IN     EFI_STRING           Uri
+  IN     EFI_STRING           Uri,
+  IN     CHAR8                *JsonText OPTIONAL
   );
 
 /**
   Check resource on given URI.
 
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
 
   @retval EFI_SUCCESS              Value is returned successfully.
   @retval EFI_UNSUPPORTED          This resource is not owned by feature driver.
@@ -84,9 +95,11 @@ EdkIIRedfishResourceConfigUpdate (
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigCheck (
   IN     REDFISH_SCHEMA_INFO  *Schema,
-  IN     EFI_STRING           Uri
+  IN     EFI_STRING           Uri,
+  IN     CHAR8                *JsonText OPTIONAL
   );
 
 /**
@@ -94,6 +107,7 @@ EdkIIRedfishResourceConfigCheck (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
   @param[in]   InformationExchange Pointer to RESOURCE_INFORMATION_EXCHANGE.
 
   @retval EFI_SUCCESS              This is target resource which we want to handle.
@@ -107,10 +121,12 @@ EdkIIRedfishResourceConfigCheck (
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigIdentify (
   IN     REDFISH_SCHEMA_INFO            *Schema,
   IN     EFI_STRING                     Uri,
-  IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchangeUri
+  IN     CHAR8                          *JsonText OPTIONAL,
+  IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange
   );
 
 /**
@@ -126,6 +142,7 @@ EdkIIRedfishResourceConfigIdentify (
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceSetConfigureLang (
   IN EFI_HANDLE                                   ImageHandle,
   IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST  *ConfigLangList
@@ -133,11 +150,14 @@ EdkIIRedfishResourceSetConfigureLang (
 
 /**
 
-  Get schema information by given protocol and service instance.
+  Get schema information by given protocol and service instance if JsonText
+  is NULL or empty. When JsonText is provided by caller, this function read
+  schema information from JsonText.
 
   @param[in]  RedfishService      Pointer to Redfish service instance.
   @param[in]  JsonStructProtocol  Json Structure protocol instance.
   @param[in]  Uri                 Target URI.
+  @param[in]  JsonText            Redfish data in JSON format. This is optional.
   @param[out] SchemaInfo          Returned schema information.
 
   @retval     EFI_SUCCESS         Schema information is returned successfully.
@@ -145,10 +165,12 @@ EdkIIRedfishResourceSetConfigureLang (
 
 **/
 EFI_STATUS
+EFIAPI
 GetRedfishSchemaInfo (
   IN  REDFISH_SERVICE                   *RedfishService,
   IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
   IN  EFI_STRING                        Uri,
+  IN  CHAR8                             *JsonText OPTIONAL,
   OUT REDFISH_SCHEMA_INFO               *SchemaInfo
   );
 
@@ -164,6 +186,7 @@ GetRedfishSchemaInfo (
 
 **/
 EFI_STATUS
+EFIAPI
 GetSupportedSchemaVersion (
   IN   CHAR8                *Schema,
   OUT  REDFISH_SCHEMA_INFO  *SchemaInfo
diff --git a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigInternal.h b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigInternal.h
new file mode 100644
index 000000000..51984738b
--- /dev/null
+++ b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigInternal.h
@@ -0,0 +1,44 @@
+/** @file
+  Header file of EDKII Redfish Resource Config Library.
+
+  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef REDFISH_RESOURCE_CONFIG_INTERNAL_H_
+#define REDFISH_RESOURCE_CONFIG_INTERNAL_H_
+
+#include <RedfishBase.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/EdkIIRedfishResourceConfigLib.h>
+#include <Library/RedfishFeatureUtilityLib.h>
+#include <Library/RedfishPlatformConfigLib.h>
+#include <Library/RedfishHttpLib.h>
+
+///
+/// Definition of EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOLS
+///
+typedef union {
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL     *ConfigProtocol;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL    *Config2Protocol;
+} EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOLS;
+
+///
+/// Definition of REDFISH_CONFIG_PROTOCOL_CACHE
+///
+typedef struct {
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOLS    RedfishResourceConfig;
+  EFI_HANDLE                                 CachedHandle;
+  REDFISH_SCHEMA_INFO                        SchemaInfoCache;
+} REDFISH_CONFIG_PROTOCOL_CACHE;
+
+#define SCHEMA_NAME_PREFIX         "x-uefi-redfish-"
+#define SCHEMA_NAME_PREFIX_OFFSET  (AsciiStrLen (SCHEMA_NAME_PREFIX))
+
+#endif
diff --git a/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c b/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
index 1f3c30147..1eb269a84 100644
--- a/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
+++ b/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
@@ -782,7 +782,7 @@ HandleResource (
 
   DEBUG ((REDFISH_DEBUG_TRACE, "%a, process resource for: %s\n", __func__, Uri));
 
-  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, &SchemaInfo);
+  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, NULL, &SchemaInfo);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to get schema information from: %s %r\n", __func__, Uri, Status));
     return Status;
@@ -795,7 +795,7 @@ HandleResource (
   DEBUG ((REDFISH_DEBUG_TRACE, "%a Identify for %s\n", __func__, Uri));
   ConfigLang = RedfishGetConfigLanguage (Uri);
   if (ConfigLang == NULL) {
-    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private->InformationExchange);
+    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL, Private->InformationExchange);
     if (EFI_ERROR (Status)) {
       if (Status == EFI_UNSUPPORTED) {
         DEBUG ((DEBUG_MANAGEABILITY, "%a, \"%s\" is not handled by us\n", __func__, Uri));
@@ -811,17 +811,17 @@ HandleResource (
   }
 
   //
-  // Check and see if target property exist or not even when collection memeber exists.
+  // Check and see if target property exist or not even when collection member exists.
   // If not, we sill do provision.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     //
     // The target property does not exist, do the provision to create property.
     //
     DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
-    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, Private->InformationExchange, FALSE);
+    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL, Private->InformationExchange, FALSE);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "%a, failed to provision with GET mode: %r\n", __func__, Status));
     }
@@ -833,7 +833,7 @@ HandleResource (
   // Consume first.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to consume resource for: %s: %r\n", __func__, Uri, Status));
   }
@@ -842,7 +842,7 @@ HandleResource (
   // Patch.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to update resource for: %s: %r\n", __func__, Uri, Status));
   }
diff --git a/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe.c b/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe.c
index 4f94a4495..cd1437f54 100644
--- a/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe.c
+++ b/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe.c
@@ -44,7 +44,7 @@ HandleResource (
 
   DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a: process resource for: %s\n", __func__, Uri));
 
-  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, &SchemaInfo);
+  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, NULL, &SchemaInfo);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to get schema information from: %s %r\n", __func__, Uri, Status));
     return Status;
@@ -58,7 +58,7 @@ HandleResource (
   SystemRestDetected = FALSE;
   ConfigLang         = RedfishGetConfigLanguage (Uri);
   if (ConfigLang == NULL) {
-    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private->InformationExchange);
+    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL, Private->InformationExchange);
     if (EFI_ERROR (Status)) {
       if (Status == EFI_UNSUPPORTED) {
         DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a: \"%s\" is not handled by us\n", __func__, Uri));
@@ -88,7 +88,7 @@ HandleResource (
   // If not, we sill do provision.
   //
   DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     if (Status == EFI_UNSUPPORTED) {
       DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a: \"%s\" is not handled by us\n", __func__, Uri));
@@ -99,7 +99,7 @@ HandleResource (
     // The target property does not exist, do the provision to create property.
     //
     DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
-    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, Private->InformationExchange, FALSE);
+    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL, Private->InformationExchange, FALSE);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "%a: failed to provision with GET mode: %r\n", __func__, Status));
     }
@@ -114,7 +114,7 @@ HandleResource (
     DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a system has been reset to default setting. ignore pending settings because they may be stale values\n", __func__));
   } else {
     DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
-    Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
+    Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "%a: failed to consume resource for: %s: %r\n", __func__, Uri, Status));
     }
@@ -124,7 +124,7 @@ HandleResource (
   // Patch.
   //
   DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to update resource for: %s: %r\n", __func__, Uri, Status));
   }
@@ -262,7 +262,7 @@ CreateCollectionResource (
 
   DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a: supported schema: %a %a.%a.%a\n", __func__, SchemaInfo.Schema, SchemaInfo.Major, SchemaInfo.Minor, SchemaInfo.Errata));
 
-  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, BootOptionUri, Private->InformationExchange, TRUE);
+  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, BootOptionUri, NULL, Private->InformationExchange, TRUE);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to create resource for: %s: %r\n", __func__, BootOptionUri, Status));
   }
diff --git a/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSystemCollectionDxe.c b/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSystemCollectionDxe.c
index 975ba0564..55a6d07db 100644
--- a/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSystemCollectionDxe.c
+++ b/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSystemCollectionDxe.c
@@ -35,7 +35,7 @@ HandleResource (
 
   DEBUG ((REDFISH_DEBUG_TRACE, "%a: process resource for: %s\n", __func__, Uri));
 
-  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, &SchemaInfo);
+  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, NULL, &SchemaInfo);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to get schema information from: %s %r\n", __func__, Uri, Status));
     return Status;
@@ -48,7 +48,7 @@ HandleResource (
   DEBUG ((REDFISH_DEBUG_TRACE, "%a Identify for %s\n", __func__, Uri));
   ConfigLang = RedfishGetConfigLanguage (Uri);
   if (ConfigLang == NULL) {
-    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private->InformationExchange);
+    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL, Private->InformationExchange);
     if (EFI_ERROR (Status)) {
       if (Status == EFI_UNSUPPORTED) {
         DEBUG ((DEBUG_MANAGEABILITY, "%a: \"%s\" is not handled by us\n", __func__, Uri));
@@ -90,11 +90,11 @@ HandleResource (
   }
 
   //
-  // Check and see if target property exist or not even when collection memeber exists.
+  // Check and see if target property exist or not even when collection member exists.
   // If not, we sill do provision.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     if (Status == EFI_UNSUPPORTED) {
       DEBUG ((REDFISH_DEBUG_TRACE, "%a: \"%s\" is not handled by us\n", __func__, Uri));
@@ -105,7 +105,7 @@ HandleResource (
     // The target property does not exist, do the provision to create property.
     //
     DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
-    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, Private->InformationExchange, FALSE);
+    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL, Private->InformationExchange, FALSE);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "%a: failed to provision with PATCH mode: %r\n", __func__, Status));
     }
@@ -117,7 +117,7 @@ HandleResource (
   // Consume first.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to consume resource for: %s: %r\n", __func__, Uri, Status));
   }
@@ -126,7 +126,7 @@ HandleResource (
   // Patch.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to update resource for: %s: %r\n", __func__, Uri, Status));
   }
@@ -236,7 +236,7 @@ CreateCollectionResource (
 
   DEBUG ((REDFISH_DEBUG_TRACE, "%a: supported schema: %a %a.%a.%a\n", __func__, SchemaInfo.Schema, SchemaInfo.Major, SchemaInfo.Minor, SchemaInfo.Errata));
 
-  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private->CollectionUri, Private->InformationExchange, TRUE);
+  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private->CollectionUri, NULL, Private->InformationExchange, TRUE);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a: failed to create resource for: %s: %r\n", __func__, Private->CollectionUri, Status));
   }
diff --git a/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c b/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
index 1b7d74e86..d963fb52a 100644
--- a/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
+++ b/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
@@ -35,7 +35,7 @@ HandleResource (
 
   DEBUG ((REDFISH_DEBUG_TRACE, "%a, process resource for: %s\n", __func__, Uri));
 
-  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, &SchemaInfo);
+  Status = GetRedfishSchemaInfo (Private->RedfishService, Private->JsonStructProtocol, Uri, NULL, &SchemaInfo);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to get schema information from: %s %r\n", __func__, Uri, Status));
     return Status;
@@ -48,7 +48,7 @@ HandleResource (
   DEBUG ((REDFISH_DEBUG_TRACE, "%a Identify for %s\n", __func__, Uri));
   ConfigLang = RedfishGetConfigLanguage (Uri);
   if (ConfigLang == NULL) {
-    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private->InformationExchange);
+    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL, Private->InformationExchange);
     if (EFI_ERROR (Status)) {
       if (Status == EFI_UNSUPPORTED) {
         DEBUG ((DEBUG_MANAGEABILITY, "%a, \"%s\" is not handled by us\n", __func__, Uri));
@@ -86,17 +86,17 @@ HandleResource (
   }
 
   //
-  // Check and see if target property exist or not even when collection memeber exists.
+  // Check and see if target property exist or not even when collection member exists.
   // If not, we sill do provision.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     //
     // The target property does not exist, do the provision to create property.
     //
     DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
-    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, Private->InformationExchange, FALSE);
+    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL, Private->InformationExchange, FALSE);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "%a, failed to provision with GET mode: %r\n", __func__, Status));
     }
@@ -108,7 +108,7 @@ HandleResource (
   // Consume first.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to consume resource for: %s: %r\n", __func__, Uri, Status));
   }
@@ -117,7 +117,7 @@ HandleResource (
   // Patch.
   //
   DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
-  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
+  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to update resource for: %s: %r\n", __func__, Uri, Status));
   }
@@ -227,7 +227,7 @@ CreateCollectionResource (
 
   DEBUG ((REDFISH_DEBUG_TRACE, "%a, supported schema: %a %a.%a.%a\n", __func__, SchemaInfo.Schema, SchemaInfo.Major, SchemaInfo.Minor, SchemaInfo.Errata));
 
-  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private->CollectionUri, Private->InformationExchange, TRUE);
+  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private->CollectionUri, NULL, Private->InformationExchange, TRUE);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "%a, failed to create resource for: %s: %r\n", __func__, Private->CollectionUri, Status));
   }
diff --git a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.c b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.c
index 5d0944f8c..4ba5c309d 100644
--- a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.c
+++ b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourceConfigLib.c
@@ -7,32 +7,23 @@
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
-#include <RedfishBase.h>
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/EdkIIRedfishResourceConfigLib.h>
-#include <Library/RedfishFeatureUtilityLib.h>
-#include <Library/RedfishHttpLib.h>
-#include <Library/RedfishPlatformConfigLib.h>
-
-EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL           *mRedfishResourceConfigProtocol = NULL;
-EFI_HANDLE                                       mCachedHandle;
-EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL  mRedfishFeatureInterchangeData;
-REDFISH_SCHEMA_INFO                              mSchemaInfoCache;
 
-#define SCHEMA_NAME_PREFIX         "x-uefi-redfish-"
-#define SCHEMA_NAME_PREFIX_OFFSET  (AsciiStrLen (SCHEMA_NAME_PREFIX))
+#include "EdkIIRedfishResourceConfigInternal.h"
+
+REDFISH_CONFIG_PROTOCOL_CACHE                    *mRedfishResourceConfigCache  = NULL;
+REDFISH_CONFIG_PROTOCOL_CACHE                    *mRedfishResourceConfig2Cache = NULL;
+EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL  mRedfishFeatureInterchangeData;
 
 /**
 
-  Get schema information by given protocol and service instance.
+  Get schema information by given protocol and service instance if JsonText
+  is NULL or empty. When JsonText is provided by caller, this function read
+  schema information from JsonText.
 
   @param[in]  RedfishService      Pointer to Redfish service instance.
   @param[in]  JsonStructProtocol  Json Structure protocol instance.
   @param[in]  Uri                 Target URI.
+  @param[in]  JsonText            Redfish data in JSON format. This is optional.
   @param[out] SchemaInfo          Returned schema information.
 
   @retval     EFI_SUCCESS         Schema information is returned successfully.
@@ -40,35 +31,45 @@ REDFISH_SCHEMA_INFO                              mSchemaInfoCache;
 
 **/
 EFI_STATUS
+EFIAPI
 GetRedfishSchemaInfo (
   IN  REDFISH_SERVICE                   *RedfishService,
   IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
   IN  EFI_STRING                        Uri,
+  IN  CHAR8                             *JsonText OPTIONAL,
   OUT REDFISH_SCHEMA_INFO               *SchemaInfo
   )
 {
   EFI_STATUS                      Status;
   REDFISH_RESPONSE                Response;
-  REDFISH_PAYLOAD                 Payload;
-  CHAR8                           *JsonText;
+  CHAR8                           *JsonData;
   EFI_REST_JSON_STRUCTURE_HEADER  *Header;
 
   if ((RedfishService == NULL) || (JsonStructProtocol == NULL) || IS_EMPTY_STRING (Uri) || (SchemaInfo == NULL)) {
     return EFI_INVALID_PARAMETER;
   }
 
+  JsonData = NULL;
+  Header   = NULL;
   ZeroMem (&Response, sizeof (Response));
-  Status = RedfishHttpGetResource (RedfishService, Uri, NULL, &Response, TRUE);
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, failed to get resource from %s: %r", __func__, Uri, Status));
-    return Status;
-  }
+  if (IS_EMPTY_STRING (JsonText)) {
+    Status = RedfishHttpGetResource (RedfishService, Uri, NULL, &Response, TRUE);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "%a: failed to get resource from %s: %r", __func__, Uri, Status));
+      return Status;
+    }
 
-  Payload = Response.Payload;
-  ASSERT (Payload != NULL);
+    if (Response.Payload != NULL) {
+      JsonData = JsonDumpString (RedfishJsonInPayload (Response.Payload), EDKII_JSON_COMPACT);
+    }
+  } else {
+    JsonData = AllocateCopyPool (AsciiStrSize (JsonText), JsonText);
+  }
 
-  JsonText = JsonDumpString (RedfishJsonInPayload (Payload), EDKII_JSON_COMPACT);
-  ASSERT (JsonText != NULL);
+  if (IS_EMPTY_STRING (JsonData)) {
+    Status = EFI_NOT_FOUND;
+    goto ON_RELEASE;
+  }
 
   //
   // Convert JSON text to C structure.
@@ -76,17 +77,12 @@ GetRedfishSchemaInfo (
   Status = JsonStructProtocol->ToStructure (
                                  JsonStructProtocol,
                                  NULL,
-                                 JsonText,
+                                 JsonData,
                                  &Header
                                  );
   if (EFI_ERROR (Status)) {
-    if (Status == EFI_UNSUPPORTED) {
-      DEBUG ((DEBUG_ERROR, "%a, No proper JSON to C structure converter for this Redfish resource.\n", __func__));
-    } else {
-      DEBUG ((DEBUG_ERROR, "%a, ToStructure() failed: %r\n", __func__, Status));
-    }
-
-    return Status;
+    DEBUG ((DEBUG_ERROR, "%a: ToStructure() failed: %r\n", __func__, Status));
+    goto ON_RELEASE;
   }
 
   AsciiStrCpyS (SchemaInfo->Schema, REDFISH_SCHEMA_STRING_SIZE, Header->JsonRsrcIdentifier.NameSpace.ResourceTypeName);
@@ -94,14 +90,19 @@ GetRedfishSchemaInfo (
   AsciiStrCpyS (SchemaInfo->Minor, REDFISH_SCHEMA_VERSION_SIZE, Header->JsonRsrcIdentifier.NameSpace.MinorVersion);
   AsciiStrCpyS (SchemaInfo->Errata, REDFISH_SCHEMA_VERSION_SIZE, Header->JsonRsrcIdentifier.NameSpace.ErrataVersion);
 
+ON_RELEASE:
   //
   // Release resource.
   //
   JsonStructProtocol->DestoryStructure (JsonStructProtocol, Header);
-  FreePool (JsonText);
+
+  if (JsonData != NULL) {
+    FreePool (JsonData);
+  }
+
   RedfishHttpFreeResponse (&Response);
 
-  return EFI_SUCCESS;
+  return Status;
 }
 
 /**
@@ -116,6 +117,7 @@ GetRedfishSchemaInfo (
 
 **/
 EFI_STATUS
+EFIAPI
 GetSupportedSchemaVersion (
   IN   CHAR8                *Schema,
   OUT  REDFISH_SCHEMA_INFO  *SchemaInfo
@@ -257,17 +259,17 @@ GetRedfishResourceConfigProtocol (
     return NULL;
   }
 
-  if (mRedfishResourceConfigProtocol != NULL) {
-    if ((AsciiStrCmp (Schema->Schema, mSchemaInfoCache.Schema) == 0) &&
-        (AsciiStrCmp (Schema->Major, mSchemaInfoCache.Major) == 0) &&
-        (AsciiStrCmp (Schema->Minor, mSchemaInfoCache.Minor) == 0) &&
-        (AsciiStrCmp (Schema->Errata, mSchemaInfoCache.Errata) == 0))
+  if ((mRedfishResourceConfigCache != NULL) && (mRedfishResourceConfigCache->RedfishResourceConfig.ConfigProtocol != NULL)) {
+    if ((AsciiStrCmp (Schema->Schema, mRedfishResourceConfigCache->SchemaInfoCache.Schema) == 0) &&
+        (AsciiStrCmp (Schema->Major, mRedfishResourceConfigCache->SchemaInfoCache.Major) == 0) &&
+        (AsciiStrCmp (Schema->Minor, mRedfishResourceConfigCache->SchemaInfoCache.Minor) == 0) &&
+        (AsciiStrCmp (Schema->Errata, mRedfishResourceConfigCache->SchemaInfoCache.Errata) == 0))
     {
       if (Handle != NULL) {
-        *Handle = mCachedHandle;
+        *Handle = mRedfishResourceConfigCache->CachedHandle;
       }
 
-      return mRedfishResourceConfigProtocol;
+      return mRedfishResourceConfigCache->RedfishResourceConfig.ConfigProtocol;
     }
   }
 
@@ -310,9 +312,116 @@ GetRedfishResourceConfigProtocol (
   }
 
   if (Found) {
-    mCachedHandle                  = HandleBuffer[Index];
-    mRedfishResourceConfigProtocol = Protocol;
-    CopyMem (&mSchemaInfoCache, Schema, sizeof (REDFISH_SCHEMA_INFO));
+    if (mRedfishResourceConfigCache != NULL) {
+      mRedfishResourceConfigCache->CachedHandle                         = HandleBuffer[Index];
+      mRedfishResourceConfigCache->RedfishResourceConfig.ConfigProtocol = Protocol;
+      CopyMem (&mRedfishResourceConfigCache->SchemaInfoCache, Schema, sizeof (REDFISH_SCHEMA_INFO));
+    }
+
+    if (Handle != NULL) {
+      *Handle = HandleBuffer[Index];
+    }
+  }
+
+  FreePool (HandleBuffer);
+
+  return (Found ? Protocol : NULL);
+}
+
+/**
+
+  Find Redfish Resource Config2 Protocol that supports given schema and version.
+
+  @param[in]  Schema      Schema name.
+  @param[out] Handle      Pointer to receive the handle that has EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL
+                          installed on it.
+
+  @retval     EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL *    Pointer to protocol
+  @retval     NULL                                         No protocol found.
+
+**/
+EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *
+GetRedfishResourceConfig2Protocol (
+  IN  REDFISH_SCHEMA_INFO  *Schema,
+  OUT EFI_HANDLE           *Handle OPTIONAL
+  )
+{
+  EFI_STATUS                               Status;
+  EFI_HANDLE                               *HandleBuffer;
+  UINTN                                    NumberOfHandles;
+  UINTN                                    Index;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Protocol;
+  REDFISH_SCHEMA_INFO                      SchemaInfo;
+  BOOLEAN                                  Found;
+
+  if (IS_EMPTY_STRING (Schema->Schema) ||
+      IS_EMPTY_STRING (Schema->Major) ||
+      IS_EMPTY_STRING (Schema->Minor) ||
+      IS_EMPTY_STRING (Schema->Errata)
+      )
+  {
+    return NULL;
+  }
+
+  if ((mRedfishResourceConfig2Cache != NULL) && (mRedfishResourceConfig2Cache->RedfishResourceConfig.Config2Protocol != NULL)) {
+    if ((AsciiStrCmp (Schema->Schema, mRedfishResourceConfig2Cache->SchemaInfoCache.Schema) == 0) &&
+        (AsciiStrCmp (Schema->Major, mRedfishResourceConfig2Cache->SchemaInfoCache.Major) == 0) &&
+        (AsciiStrCmp (Schema->Minor, mRedfishResourceConfig2Cache->SchemaInfoCache.Minor) == 0) &&
+        (AsciiStrCmp (Schema->Errata, mRedfishResourceConfig2Cache->SchemaInfoCache.Errata) == 0))
+    {
+      if (Handle != NULL) {
+        *Handle = mRedfishResourceConfig2Cache->CachedHandle;
+      }
+
+      return mRedfishResourceConfig2Cache->RedfishResourceConfig.Config2Protocol;
+    }
+  }
+
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEdkIIRedfishResourceConfig2ProtocolGuid,
+                  NULL,
+                  &NumberOfHandles,
+                  &HandleBuffer
+                  );
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  Found = FALSE;
+
+  for (Index = 0; Index < NumberOfHandles; Index++) {
+    Status = gBS->HandleProtocol (
+                    HandleBuffer[Index],
+                    &gEdkIIRedfishResourceConfig2ProtocolGuid,
+                    (VOID **)&Protocol
+                    );
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+
+    Status = Protocol->GetInfo (Protocol, &SchemaInfo);
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+
+    if ((AsciiStrCmp (Schema->Schema, SchemaInfo.Schema) == 0) &&
+        (AsciiStrCmp (Schema->Major, SchemaInfo.Major) == 0) &&
+        (AsciiStrCmp (Schema->Minor, SchemaInfo.Minor) == 0) &&
+        (AsciiStrCmp (Schema->Errata, SchemaInfo.Errata) == 0))
+    {
+      Found = TRUE;
+      break;
+    }
+  }
+
+  if (Found) {
+    if (mRedfishResourceConfig2Cache != NULL) {
+      mRedfishResourceConfig2Cache->CachedHandle                          = HandleBuffer[Index];
+      mRedfishResourceConfig2Cache->RedfishResourceConfig.Config2Protocol = Protocol;
+      CopyMem (&mRedfishResourceConfig2Cache->SchemaInfoCache, Schema, sizeof (REDFISH_SCHEMA_INFO));
+    }
+
     if (Handle != NULL) {
       *Handle = HandleBuffer[Index];
     }
@@ -379,6 +488,7 @@ InstallInterchangeDataProtocol (
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceSetConfigureLang (
   IN EFI_HANDLE                                   ImageHandle,
   IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST  *ConfigLangList
@@ -411,7 +521,7 @@ EdkIIRedfishResourceSetConfigureLang (
   Interface->ResourceInformationExchage->ReturnedInformation.ConfigureLanguageList.List  =
     AllocateZeroPool (sizeof (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG) * ConfigLangList->Count);
   if (Interface->ResourceInformationExchage->ReturnedInformation.ConfigureLanguageList.List == NULL) {
-    DEBUG ((DEBUG_ERROR, "%a, Fail to allocate memory for REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG.\n", __func__));
+    DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG.\n", __func__));
     return EFI_OUT_OF_RESOURCES;
   }
 
@@ -425,10 +535,11 @@ EdkIIRedfishResourceSetConfigureLang (
 }
 
 /**
-  Provising redfish resource by given URI.
+  Provision redfish resource by given URI.
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 Target URI to create resource.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
   @param[in]   InformationExchange Pointer to RESOURCE_INFORMATION_EXCHANGE.
   @param[in]   HttpPostMode        TRUE if resource does not exist, HTTP POST method is used.
                                    FALSE if the resource exist but some of properties are missing,
@@ -439,18 +550,41 @@ EdkIIRedfishResourceSetConfigureLang (
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigProvisioning (
   IN     REDFISH_SCHEMA_INFO            *Schema,
   IN     EFI_STRING                     Uri,
+  IN     CHAR8                          *JsonText OPTIONAL,
   IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange,
   IN     BOOLEAN                        HttpPostMode
   )
 {
-  EFI_HANDLE                              Handle;
-  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
+  EFI_HANDLE                               Handle;
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
 
-  protocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
-  if ((protocol == NULL) || (Handle == NULL)) {
+  //
+  // Initialization.
+  //
+  Handle          = NULL;
+  ConfigProtocol  = NULL;
+  Config2Protocol = NULL;
+
+  //
+  // Try to use config2 protocol first.
+  //
+  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, &Handle);
+  if ((Config2Protocol != NULL) && (Handle != NULL)) {
+    //
+    // Install EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL on the child
+    // feature driver handle.
+    //
+    InstallInterchangeDataProtocol (Handle, InformationExchange);
+    return Config2Protocol->Provisioning (Config2Protocol, Uri, JsonText, HttpPostMode);
+  }
+
+  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
+  if ((ConfigProtocol == NULL) || (Handle == NULL)) {
     return EFI_DEVICE_ERROR;
   }
 
@@ -459,7 +593,7 @@ EdkIIRedfishResourceConfigProvisioning (
   // feature driver handle.
   //
   InstallInterchangeDataProtocol (Handle, InformationExchange);
-  return protocol->Provisioning (protocol, Uri, HttpPostMode);
+  return ConfigProtocol->Provisioning (ConfigProtocol, Uri, HttpPostMode);
 }
 
 /**
@@ -467,25 +601,43 @@ EdkIIRedfishResourceConfigProvisioning (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
 
   @retval EFI_SUCCESS              Value is returned successfully.
   @retval Others                   Some error happened.
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigConsume (
   IN     REDFISH_SCHEMA_INFO  *Schema,
-  IN     EFI_STRING           Uri
+  IN     EFI_STRING           Uri,
+  IN     CHAR8                *JsonText OPTIONAL
   )
 {
-  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
 
-  protocol = GetRedfishResourceConfigProtocol (Schema, NULL);
-  if (protocol == NULL) {
+  //
+  // Initialization.
+  //
+  ConfigProtocol  = NULL;
+  Config2Protocol = NULL;
+
+  //
+  // Try to use config2 protocol first.
+  //
+  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, NULL);
+  if (Config2Protocol != NULL) {
+    return Config2Protocol->Consume (Config2Protocol, Uri, JsonText);
+  }
+
+  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, NULL);
+  if (ConfigProtocol == NULL) {
     return EFI_DEVICE_ERROR;
   }
 
-  return protocol->Consume (protocol, Uri);
+  return ConfigProtocol->Consume (ConfigProtocol, Uri);
 }
 
 /**
@@ -493,25 +645,43 @@ EdkIIRedfishResourceConfigConsume (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
 
   @retval EFI_SUCCESS              Value is returned successfully.
   @retval Others                   Some error happened.
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigUpdate (
   IN     REDFISH_SCHEMA_INFO  *Schema,
-  IN     EFI_STRING           Uri
+  IN     EFI_STRING           Uri,
+  IN     CHAR8                *JsonText OPTIONAL
   )
 {
-  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
+
+  //
+  // Initialization.
+  //
+  ConfigProtocol  = NULL;
+  Config2Protocol = NULL;
 
-  protocol = GetRedfishResourceConfigProtocol (Schema, NULL);
-  if (protocol == NULL) {
+  //
+  // Try to use config2 protocol first.
+  //
+  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, NULL);
+  if (Config2Protocol != NULL) {
+    return Config2Protocol->Update (Config2Protocol, Uri, JsonText);
+  }
+
+  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, NULL);
+  if (ConfigProtocol == NULL) {
     return EFI_DEVICE_ERROR;
   }
 
-  return protocol->Update (protocol, Uri);
+  return ConfigProtocol->Update (ConfigProtocol, Uri);
 }
 
 /**
@@ -519,25 +689,43 @@ EdkIIRedfishResourceConfigUpdate (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
 
   @retval EFI_SUCCESS              Value is returned successfully.
   @retval Others                   Some error happened.
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigCheck (
   IN     REDFISH_SCHEMA_INFO  *Schema,
-  IN     EFI_STRING           Uri
+  IN     EFI_STRING           Uri,
+  IN     CHAR8                *JsonText OPTIONAL
   )
 {
-  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
+
+  //
+  // Initialization.
+  //
+  ConfigProtocol  = NULL;
+  Config2Protocol = NULL;
+
+  //
+  // Try to use config2 protocol first.
+  //
+  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, NULL);
+  if (Config2Protocol != NULL) {
+    return Config2Protocol->Check (Config2Protocol, Uri, JsonText);
+  }
 
-  protocol = GetRedfishResourceConfigProtocol (Schema, NULL);
-  if (protocol == NULL) {
+  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, NULL);
+  if (ConfigProtocol == NULL) {
     return EFI_DEVICE_ERROR;
   }
 
-  return protocol->Check (protocol, Uri);
+  return ConfigProtocol->Check (ConfigProtocol, Uri);
 }
 
 /**
@@ -545,6 +733,7 @@ EdkIIRedfishResourceConfigCheck (
 
   @param[in]   Schema              Redfish schema information.
   @param[in]   Uri                 The target URI to consume.
+  @param[in]   JsonText            The JSON data in ASCII string format. This is optional.
   @param[in]   InformationExchange Pointer to RESOURCE_INFORMATION_EXCHANGE.
 
   @retval EFI_SUCCESS              This is target resource which we want to handle.
@@ -553,17 +742,40 @@ EdkIIRedfishResourceConfigCheck (
 
 **/
 EFI_STATUS
+EFIAPI
 EdkIIRedfishResourceConfigIdentify (
   IN     REDFISH_SCHEMA_INFO            *Schema,
   IN     EFI_STRING                     Uri,
+  IN     CHAR8                          *JsonText OPTIONAL,
   IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange
   )
 {
-  EFI_HANDLE                              Handle;
-  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
+  EFI_HANDLE                               Handle;
+  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
+  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
+
+  //
+  // Initialization.
+  //
+  Handle          = NULL;
+  ConfigProtocol  = NULL;
+  Config2Protocol = NULL;
+
+  //
+  // Try to use config2 protocol first.
+  //
+  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, &Handle);
+  if ((Config2Protocol != NULL) && (Handle != NULL)) {
+    //
+    // Install EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL on the child
+    // feature driver handle.
+    //
+    InstallInterchangeDataProtocol (Handle, InformationExchange);
+    return Config2Protocol->Identify (Config2Protocol, Uri, JsonText);
+  }
 
-  protocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
-  if (protocol == NULL) {
+  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
+  if (ConfigProtocol == NULL) {
     return EFI_DEVICE_ERROR;
   }
 
@@ -572,17 +784,17 @@ EdkIIRedfishResourceConfigIdentify (
   // feature driver handle.
   //
   InstallInterchangeDataProtocol (Handle, InformationExchange);
-  return protocol->Identify (protocol, Uri);
+  return ConfigProtocol->Identify (ConfigProtocol, Uri);
 }
 
 /**
 
-  Initial resource config library instace.
+  Initial resource config library instance.
 
   @param[in] ImageHandle     The image handle.
   @param[in] SystemTable     The system table.
 
-  @retval  EFI_SUCEESS  Install Boot manager menu success.
+  @retval  EFI_SUCCESS  Install Boot manager menu success.
   @retval  Other        Return error status.
 
 **/
@@ -593,8 +805,17 @@ RedfishResourceConfigConstructor (
   IN EFI_SYSTEM_TABLE  *SystemTable
   )
 {
-  mRedfishResourceConfigProtocol = NULL;
-  ZeroMem (&mSchemaInfoCache, sizeof (REDFISH_SCHEMA_INFO));
+  mRedfishResourceConfigCache = AllocateZeroPool (sizeof (REDFISH_CONFIG_PROTOCOL_CACHE));
+  if (mRedfishResourceConfigCache == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  mRedfishResourceConfig2Cache = AllocateZeroPool (sizeof (REDFISH_CONFIG_PROTOCOL_CACHE));
+  if (mRedfishResourceConfig2Cache == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  ZeroMem (&mRedfishFeatureInterchangeData, sizeof (mRedfishFeatureInterchangeData));
 
   return EFI_SUCCESS;
 }
@@ -615,7 +836,15 @@ RedfishResourceConfigDestructor (
   IN EFI_SYSTEM_TABLE  *SystemTable
   )
 {
-  mRedfishResourceConfigProtocol = NULL;
+  if (mRedfishResourceConfigCache != NULL) {
+    FreePool (mRedfishResourceConfigCache);
+    mRedfishResourceConfigCache = NULL;
+  }
+
+  if (mRedfishResourceConfig2Cache != NULL) {
+    FreePool (mRedfishResourceConfig2Cache);
+    mRedfishResourceConfig2Cache = NULL;
+  }
 
   return EFI_SUCCESS;
 }
-- 
2.34.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116468): https://edk2.groups.io/g/devel/message/116468
Mute This Topic: https://groups.io/mt/104781209/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



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

* Re: [edk2-devel] [edk2-redfish-client][PATCH v3 2/2] RedfishClientPkg/Edk2RedfishResourceConfigLib: support config2 protocol
  2024-03-07  3:24 [edk2-devel] [edk2-redfish-client][PATCH v3 2/2] RedfishClientPkg/Edk2RedfishResourceConfigLib: support config2 protocol Nickle Wang via groups.io
@ 2024-03-07  3:58 ` Chang, Abner via groups.io
  0 siblings, 0 replies; 2+ messages in thread
From: Chang, Abner via groups.io @ 2024-03-07  3:58 UTC (permalink / raw)
  To: Nickle Wang, devel@edk2.groups.io; +Cc: Igor Kulchytskyy, Nick Ramirez

[AMD Official Use Only - General]

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

> -----Original Message-----
> From: Nickle Wang <nicklew@nvidia.com>
> Sent: Thursday, March 7, 2024 11:24 AM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <Abner.Chang@amd.com>; Igor Kulchytskyy
> <igork@ami.com>; Nick Ramirez <nramirez@nvidia.com>
> Subject: [edk2-redfish-client][PATCH v3 2/2]
> RedfishClientPkg/Edk2RedfishResourceConfigLib: support config2 protocol
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> -Support Redfish resource config2 protocol in Edk2RedfishResourceConfigLib.
> This library will try Redfish resource config2 protocol first. And if
> there is no matching protocol found, Redfish resource config protocol will
> be used.
> -Because EdkIIRedfishResourceConfigLib is updated to support Redfish
> resource config2 protocol, update corresponding functions in feature
> drivers.
>
> Signed-off-by: Nickle Wang <nicklew@nvidia.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> Cc: Nick Ramirez <nramirez@nvidia.com>
> ---
>  .../EdkIIRedfishResourceConfigLib.inf         |   4 +-
>  .../Library/EdkIIRedfishResourceConfigLib.h   |  33 +-
>  .../EdkIIRedfishResourceConfigInternal.h      |  44 ++
>  .../Features/Bios/v1_0_9/Common/BiosCommon.c  |  14 +-
>  .../BootOptionCollectionDxe.c                 |  14 +-
>  .../ComputerSystemCollectionDxe.c             |  16 +-
>  .../MemoryCollectionDxe/MemoryCollectionDxe.c |  16 +-
>  .../EdkIIRedfishResourceConfigLib.c           | 391 ++++++++++++++----
>  8 files changed, 415 insertions(+), 117 deletions(-)
>  create mode 100644
> RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishResourc
> eConfigInternal.h
>
> diff --git
> a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.inf
> b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.inf
> index 2d10445f0..998a05c80 100644
> ---
> a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.inf
> +++
> b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.inf
> @@ -22,6 +22,7 @@
>  #
>
>  [Sources]
> +  EdkIIRedfishResourceConfigInternal.h
>    EdkIIRedfishResourceConfigLib.c
>
>  [Packages]
> @@ -42,8 +43,9 @@
>    RedfishHttpLib
>
>  [Protocols]
> -  gEdkIIRedfishResourceConfigProtocolGuid   ## CONSUMES ##
> +  gEdkIIRedfishResourceConfigProtocolGuid         ## CONSUMES ##
>    gEdkIIRedfishFeatureInterchangeDataProtocolGuid ## CONSUMES ##
> +  gEdkIIRedfishResourceConfig2ProtocolGuid        ## CONSUEMS ##
>
>  [Pcd]
>    gEfiRedfishClientPkgTokenSpaceGuid.PcdMaxRedfishSchemaStringSize
> diff --git a/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
> b/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
> index 3aa953cec..57c7f2b80 100644
> --- a/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
> +++ b/RedfishClientPkg/Include/Library/EdkIIRedfishResourceConfigLib.h
> @@ -16,6 +16,7 @@
>  #include <RedfishServiceData.h>
>  #include <Protocol/RestJsonStructure.h>
>  #include <Protocol/EdkIIRedfishResourceConfigProtocol.h>
> +#include <Protocol/EdkIIRedfishResourceConfig2Protocol.h>
>  #include <Protocol/EdkIIRedfishInterchangeData.h>
>
>  /**
> @@ -23,6 +24,7 @@
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 Target URI to create resource.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>    @param[in]   InformationExchange Pointer to
> RESOURCE_INFORMATION_EXCHANGE.
>    @param[in]   HttpPostMode        TRUE if resource does not exist, HTTP POST
> method is used.
>                                     FALSE if the resource exist but some of properties are
> missing,
> @@ -33,9 +35,11 @@
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigProvisioning (
>    IN     REDFISH_SCHEMA_INFO            *Schema,
>    IN     EFI_STRING                     Uri,
> +  IN     CHAR8                          *JsonText OPTIONAL,
>    IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange,
>    IN     BOOLEAN                        HttpPostMode
>    );
> @@ -45,15 +49,18 @@ EdkIIRedfishResourceConfigProvisioning (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval Others                   Some error happened.
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigConsume (
>    IN     REDFISH_SCHEMA_INFO  *Schema,
> -  IN     EFI_STRING           Uri
> +  IN     EFI_STRING           Uri,
> +  IN     CHAR8                *JsonText OPTIONAL
>    );
>
>  /**
> @@ -61,21 +68,25 @@ EdkIIRedfishResourceConfigConsume (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval Others                   Some error happened.
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigUpdate (
>    IN     REDFISH_SCHEMA_INFO  *Schema,
> -  IN     EFI_STRING           Uri
> +  IN     EFI_STRING           Uri,
> +  IN     CHAR8                *JsonText OPTIONAL
>    );
>
>  /**
>    Check resource on given URI.
>
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval EFI_UNSUPPORTED          This resource is not owned by feature
> driver.
> @@ -84,9 +95,11 @@ EdkIIRedfishResourceConfigUpdate (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigCheck (
>    IN     REDFISH_SCHEMA_INFO  *Schema,
> -  IN     EFI_STRING           Uri
> +  IN     EFI_STRING           Uri,
> +  IN     CHAR8                *JsonText OPTIONAL
>    );
>
>  /**
> @@ -94,6 +107,7 @@ EdkIIRedfishResourceConfigCheck (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>    @param[in]   InformationExchange Pointer to
> RESOURCE_INFORMATION_EXCHANGE.
>
>    @retval EFI_SUCCESS              This is target resource which we want to handle.
> @@ -107,10 +121,12 @@ EdkIIRedfishResourceConfigCheck (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigIdentify (
>    IN     REDFISH_SCHEMA_INFO            *Schema,
>    IN     EFI_STRING                     Uri,
> -  IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchangeUri
> +  IN     CHAR8                          *JsonText OPTIONAL,
> +  IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange
>    );
>
>  /**
> @@ -126,6 +142,7 @@ EdkIIRedfishResourceConfigIdentify (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceSetConfigureLang (
>    IN EFI_HANDLE                                   ImageHandle,
>    IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST  *ConfigLangList
> @@ -133,11 +150,14 @@ EdkIIRedfishResourceSetConfigureLang (
>
>  /**
>
> -  Get schema information by given protocol and service instance.
> +  Get schema information by given protocol and service instance if JsonText
> +  is NULL or empty. When JsonText is provided by caller, this function read
> +  schema information from JsonText.
>
>    @param[in]  RedfishService      Pointer to Redfish service instance.
>    @param[in]  JsonStructProtocol  Json Structure protocol instance.
>    @param[in]  Uri                 Target URI.
> +  @param[in]  JsonText            Redfish data in JSON format. This is optional.
>    @param[out] SchemaInfo          Returned schema information.
>
>    @retval     EFI_SUCCESS         Schema information is returned successfully.
> @@ -145,10 +165,12 @@ EdkIIRedfishResourceSetConfigureLang (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  GetRedfishSchemaInfo (
>    IN  REDFISH_SERVICE                   *RedfishService,
>    IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
>    IN  EFI_STRING                        Uri,
> +  IN  CHAR8                             *JsonText OPTIONAL,
>    OUT REDFISH_SCHEMA_INFO               *SchemaInfo
>    );
>
> @@ -164,6 +186,7 @@ GetRedfishSchemaInfo (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  GetSupportedSchemaVersion (
>    IN   CHAR8                *Schema,
>    OUT  REDFISH_SCHEMA_INFO  *SchemaInfo
> diff --git
> a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigInternal.h
> b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigInternal.h
> new file mode 100644
> index 000000000..51984738b
> --- /dev/null
> +++
> b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigInternal.h
> @@ -0,0 +1,44 @@
> +/** @file
> +  Header file of EDKII Redfish Resource Config Library.
> +
> +  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef REDFISH_RESOURCE_CONFIG_INTERNAL_H_
> +#define REDFISH_RESOURCE_CONFIG_INTERNAL_H_
> +
> +#include <RedfishBase.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/EdkIIRedfishResourceConfigLib.h>
> +#include <Library/RedfishFeatureUtilityLib.h>
> +#include <Library/RedfishPlatformConfigLib.h>
> +#include <Library/RedfishHttpLib.h>
> +
> +///
> +/// Definition of EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOLS
> +///
> +typedef union {
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL     *ConfigProtocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL    *Config2Protocol;
> +} EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOLS;
> +
> +///
> +/// Definition of REDFISH_CONFIG_PROTOCOL_CACHE
> +///
> +typedef struct {
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOLS    RedfishResourceConfig;
> +  EFI_HANDLE                                 CachedHandle;
> +  REDFISH_SCHEMA_INFO                        SchemaInfoCache;
> +} REDFISH_CONFIG_PROTOCOL_CACHE;
> +
> +#define SCHEMA_NAME_PREFIX         "x-uefi-redfish-"
> +#define SCHEMA_NAME_PREFIX_OFFSET  (AsciiStrLen
> (SCHEMA_NAME_PREFIX))
> +
> +#endif
> diff --git a/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> b/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> index 1f3c30147..1eb269a84 100644
> --- a/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> +++ b/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> @@ -782,7 +782,7 @@ HandleResource (
>
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a, process resource for: %s\n",
> __func__, Uri));
>
> -  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, &SchemaInfo);
> +  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, NULL, &SchemaInfo);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to get schema information from: %s
> %r\n", __func__, Uri, Status));
>      return Status;
> @@ -795,7 +795,7 @@ HandleResource (
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a Identify for %s\n", __func__, Uri));
>    ConfigLang = RedfishGetConfigLanguage (Uri);
>    if (ConfigLang == NULL) {
> -    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private-
> >InformationExchange);
> +    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL,
> Private->InformationExchange);
>      if (EFI_ERROR (Status)) {
>        if (Status == EFI_UNSUPPORTED) {
>          DEBUG ((DEBUG_MANAGEABILITY, "%a, \"%s\" is not handled by us\n",
> __func__, Uri));
> @@ -811,17 +811,17 @@ HandleResource (
>    }
>
>    //
> -  // Check and see if target property exist or not even when collection
> memeber exists.
> +  // Check and see if target property exist or not even when collection
> member exists.
>    // If not, we sill do provision.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      //
>      // The target property does not exist, do the provision to create property.
>      //
>      DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
> -    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri,
> Private->InformationExchange, FALSE);
> +    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL,
> Private->InformationExchange, FALSE);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((DEBUG_ERROR, "%a, failed to provision with GET mode: %r\n",
> __func__, Status));
>      }
> @@ -833,7 +833,7 @@ HandleResource (
>    // Consume first.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to consume resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> @@ -842,7 +842,7 @@ HandleResource (
>    // Patch.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to update resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> diff --git
> a/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe
> .c
> b/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe
> .c
> index 4f94a4495..cd1437f54 100644
> ---
> a/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe
> .c
> +++
> b/RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe
> .c
> @@ -44,7 +44,7 @@ HandleResource (
>
>    DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a:
> process resource for: %s\n", __func__, Uri));
>
> -  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, &SchemaInfo);
> +  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, NULL, &SchemaInfo);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to get schema information from: %s
> %r\n", __func__, Uri, Status));
>      return Status;
> @@ -58,7 +58,7 @@ HandleResource (
>    SystemRestDetected = FALSE;
>    ConfigLang         = RedfishGetConfigLanguage (Uri);
>    if (ConfigLang == NULL) {
> -    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private-
> >InformationExchange);
> +    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL,
> Private->InformationExchange);
>      if (EFI_ERROR (Status)) {
>        if (Status == EFI_UNSUPPORTED) {
>          DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a:
> \"%s\" is not handled by us\n", __func__, Uri));
> @@ -88,7 +88,7 @@ HandleResource (
>    // If not, we sill do provision.
>    //
>    DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a Check
> for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      if (Status == EFI_UNSUPPORTED) {
>        DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a:
> \"%s\" is not handled by us\n", __func__, Uri));
> @@ -99,7 +99,7 @@ HandleResource (
>      // The target property does not exist, do the provision to create property.
>      //
>      DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a
> provision for %s\n", __func__, Uri));
> -    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri,
> Private->InformationExchange, FALSE);
> +    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL,
> Private->InformationExchange, FALSE);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((DEBUG_ERROR, "%a: failed to provision with GET mode: %r\n",
> __func__, Status));
>      }
> @@ -114,7 +114,7 @@ HandleResource (
>      DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a
> system has been reset to default setting. ignore pending settings because they
> may be stale values\n", __func__));
>    } else {
>      DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a
> consume for %s\n", __func__, Uri));
> -    Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
> +    Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((DEBUG_ERROR, "%a: failed to consume resource for: %s: %r\n",
> __func__, Uri, Status));
>      }
> @@ -124,7 +124,7 @@ HandleResource (
>    // Patch.
>    //
>    DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a update
> for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to update resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> @@ -262,7 +262,7 @@ CreateCollectionResource (
>
>    DEBUG ((REDFISH_BOOT_OPTION_COLLECTION_DEBUG_TRACE, "%a:
> supported schema: %a %a.%a.%a\n", __func__, SchemaInfo.Schema,
> SchemaInfo.Major, SchemaInfo.Minor, SchemaInfo.Errata));
>
> -  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo,
> BootOptionUri, Private->InformationExchange, TRUE);
> +  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo,
> BootOptionUri, NULL, Private->InformationExchange, TRUE);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to create resource for: %s: %r\n",
> __func__, BootOptionUri, Status));
>    }
> diff --git
> a/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSyste
> mCollectionDxe.c
> b/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSyste
> mCollectionDxe.c
> index 975ba0564..55a6d07db 100644
> ---
> a/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSyste
> mCollectionDxe.c
> +++
> b/RedfishClientPkg/Features/ComputerSystemCollectionDxe/ComputerSyste
> mCollectionDxe.c
> @@ -35,7 +35,7 @@ HandleResource (
>
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a: process resource for: %s\n",
> __func__, Uri));
>
> -  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, &SchemaInfo);
> +  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, NULL, &SchemaInfo);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to get schema information from: %s
> %r\n", __func__, Uri, Status));
>      return Status;
> @@ -48,7 +48,7 @@ HandleResource (
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a Identify for %s\n", __func__, Uri));
>    ConfigLang = RedfishGetConfigLanguage (Uri);
>    if (ConfigLang == NULL) {
> -    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private-
> >InformationExchange);
> +    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL,
> Private->InformationExchange);
>      if (EFI_ERROR (Status)) {
>        if (Status == EFI_UNSUPPORTED) {
>          DEBUG ((DEBUG_MANAGEABILITY, "%a: \"%s\" is not handled by us\n",
> __func__, Uri));
> @@ -90,11 +90,11 @@ HandleResource (
>    }
>
>    //
> -  // Check and see if target property exist or not even when collection
> memeber exists.
> +  // Check and see if target property exist or not even when collection
> member exists.
>    // If not, we sill do provision.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      if (Status == EFI_UNSUPPORTED) {
>        DEBUG ((REDFISH_DEBUG_TRACE, "%a: \"%s\" is not handled by us\n",
> __func__, Uri));
> @@ -105,7 +105,7 @@ HandleResource (
>      // The target property does not exist, do the provision to create property.
>      //
>      DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
> -    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri,
> Private->InformationExchange, FALSE);
> +    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL,
> Private->InformationExchange, FALSE);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((DEBUG_ERROR, "%a: failed to provision with PATCH mode: %r\n",
> __func__, Status));
>      }
> @@ -117,7 +117,7 @@ HandleResource (
>    // Consume first.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to consume resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> @@ -126,7 +126,7 @@ HandleResource (
>    // Patch.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to update resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> @@ -236,7 +236,7 @@ CreateCollectionResource (
>
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a: supported schema: %a
> %a.%a.%a\n", __func__, SchemaInfo.Schema, SchemaInfo.Major,
> SchemaInfo.Minor, SchemaInfo.Errata));
>
> -  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private-
> >CollectionUri, Private->InformationExchange, TRUE);
> +  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private-
> >CollectionUri, NULL, Private->InformationExchange, TRUE);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to create resource for: %s: %r\n",
> __func__, Private->CollectionUri, Status));
>    }
> diff --git
> a/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
> b/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
> index 1b7d74e86..d963fb52a 100644
> ---
> a/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
> +++
> b/RedfishClientPkg/Features/MemoryCollectionDxe/MemoryCollectionDxe.c
> @@ -35,7 +35,7 @@ HandleResource (
>
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a, process resource for: %s\n",
> __func__, Uri));
>
> -  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, &SchemaInfo);
> +  Status = GetRedfishSchemaInfo (Private->RedfishService, Private-
> >JsonStructProtocol, Uri, NULL, &SchemaInfo);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to get schema information from: %s
> %r\n", __func__, Uri, Status));
>      return Status;
> @@ -48,7 +48,7 @@ HandleResource (
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a Identify for %s\n", __func__, Uri));
>    ConfigLang = RedfishGetConfigLanguage (Uri);
>    if (ConfigLang == NULL) {
> -    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, Private-
> >InformationExchange);
> +    Status = EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, NULL,
> Private->InformationExchange);
>      if (EFI_ERROR (Status)) {
>        if (Status == EFI_UNSUPPORTED) {
>          DEBUG ((DEBUG_MANAGEABILITY, "%a, \"%s\" is not handled by us\n",
> __func__, Uri));
> @@ -86,17 +86,17 @@ HandleResource (
>    }
>
>    //
> -  // Check and see if target property exist or not even when collection
> memeber exists.
> +  // Check and see if target property exist or not even when collection
> member exists.
>    // If not, we sill do provision.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      //
>      // The target property does not exist, do the provision to create property.
>      //
>      DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, Uri));
> -    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri,
> Private->InformationExchange, FALSE);
> +    Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Uri, NULL,
> Private->InformationExchange, FALSE);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((DEBUG_ERROR, "%a, failed to provision with GET mode: %r\n",
> __func__, Status));
>      }
> @@ -108,7 +108,7 @@ HandleResource (
>    // Consume first.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to consume resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> @@ -117,7 +117,7 @@ HandleResource (
>    // Patch.
>    //
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri));
> -  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri);
> +  Status = EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to update resource for: %s: %r\n",
> __func__, Uri, Status));
>    }
> @@ -227,7 +227,7 @@ CreateCollectionResource (
>
>    DEBUG ((REDFISH_DEBUG_TRACE, "%a, supported schema: %a
> %a.%a.%a\n", __func__, SchemaInfo.Schema, SchemaInfo.Major,
> SchemaInfo.Minor, SchemaInfo.Errata));
>
> -  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private-
> >CollectionUri, Private->InformationExchange, TRUE);
> +  Status = EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Private-
> >CollectionUri, NULL, Private->InformationExchange, TRUE);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to create resource for: %s: %r\n",
> __func__, Private->CollectionUri, Status));
>    }
> diff --git
> a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.c
> b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.c
> index 5d0944f8c..4ba5c309d 100644
> ---
> a/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.c
> +++
> b/RedfishClientPkg/Library/EdkIIRedfishResourceConfigLib/EdkIIRedfishReso
> urceConfigLib.c
> @@ -7,32 +7,23 @@
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
>  **/
> -#include <RedfishBase.h>
> -#include <Library/BaseLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/EdkIIRedfishResourceConfigLib.h>
> -#include <Library/RedfishFeatureUtilityLib.h>
> -#include <Library/RedfishHttpLib.h>
> -#include <Library/RedfishPlatformConfigLib.h>
> -
> -EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL
> *mRedfishResourceConfigProtocol = NULL;
> -EFI_HANDLE                                       mCachedHandle;
> -EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL
> mRedfishFeatureInterchangeData;
> -REDFISH_SCHEMA_INFO                              mSchemaInfoCache;
>
> -#define SCHEMA_NAME_PREFIX         "x-uefi-redfish-"
> -#define SCHEMA_NAME_PREFIX_OFFSET  (AsciiStrLen
> (SCHEMA_NAME_PREFIX))
> +#include "EdkIIRedfishResourceConfigInternal.h"
> +
> +REDFISH_CONFIG_PROTOCOL_CACHE
> *mRedfishResourceConfigCache  = NULL;
> +REDFISH_CONFIG_PROTOCOL_CACHE
> *mRedfishResourceConfig2Cache = NULL;
> +EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL
> mRedfishFeatureInterchangeData;
>
>  /**
>
> -  Get schema information by given protocol and service instance.
> +  Get schema information by given protocol and service instance if JsonText
> +  is NULL or empty. When JsonText is provided by caller, this function read
> +  schema information from JsonText.
>
>    @param[in]  RedfishService      Pointer to Redfish service instance.
>    @param[in]  JsonStructProtocol  Json Structure protocol instance.
>    @param[in]  Uri                 Target URI.
> +  @param[in]  JsonText            Redfish data in JSON format. This is optional.
>    @param[out] SchemaInfo          Returned schema information.
>
>    @retval     EFI_SUCCESS         Schema information is returned successfully.
> @@ -40,35 +31,45 @@ REDFISH_SCHEMA_INFO
> mSchemaInfoCache;
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  GetRedfishSchemaInfo (
>    IN  REDFISH_SERVICE                   *RedfishService,
>    IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
>    IN  EFI_STRING                        Uri,
> +  IN  CHAR8                             *JsonText OPTIONAL,
>    OUT REDFISH_SCHEMA_INFO               *SchemaInfo
>    )
>  {
>    EFI_STATUS                      Status;
>    REDFISH_RESPONSE                Response;
> -  REDFISH_PAYLOAD                 Payload;
> -  CHAR8                           *JsonText;
> +  CHAR8                           *JsonData;
>    EFI_REST_JSON_STRUCTURE_HEADER  *Header;
>
>    if ((RedfishService == NULL) || (JsonStructProtocol == NULL) ||
> IS_EMPTY_STRING (Uri) || (SchemaInfo == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
>
> +  JsonData = NULL;
> +  Header   = NULL;
>    ZeroMem (&Response, sizeof (Response));
> -  Status = RedfishHttpGetResource (RedfishService, Uri, NULL, &Response,
> TRUE);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to get resource from %s: %r",
> __func__, Uri, Status));
> -    return Status;
> -  }
> +  if (IS_EMPTY_STRING (JsonText)) {
> +    Status = RedfishHttpGetResource (RedfishService, Uri, NULL, &Response,
> TRUE);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "%a: failed to get resource from %s: %r",
> __func__, Uri, Status));
> +      return Status;
> +    }
>
> -  Payload = Response.Payload;
> -  ASSERT (Payload != NULL);
> +    if (Response.Payload != NULL) {
> +      JsonData = JsonDumpString (RedfishJsonInPayload (Response.Payload),
> EDKII_JSON_COMPACT);
> +    }
> +  } else {
> +    JsonData = AllocateCopyPool (AsciiStrSize (JsonText), JsonText);
> +  }
>
> -  JsonText = JsonDumpString (RedfishJsonInPayload (Payload),
> EDKII_JSON_COMPACT);
> -  ASSERT (JsonText != NULL);
> +  if (IS_EMPTY_STRING (JsonData)) {
> +    Status = EFI_NOT_FOUND;
> +    goto ON_RELEASE;
> +  }
>
>    //
>    // Convert JSON text to C structure.
> @@ -76,17 +77,12 @@ GetRedfishSchemaInfo (
>    Status = JsonStructProtocol->ToStructure (
>                                   JsonStructProtocol,
>                                   NULL,
> -                                 JsonText,
> +                                 JsonData,
>                                   &Header
>                                   );
>    if (EFI_ERROR (Status)) {
> -    if (Status == EFI_UNSUPPORTED) {
> -      DEBUG ((DEBUG_ERROR, "%a, No proper JSON to C structure converter
> for this Redfish resource.\n", __func__));
> -    } else {
> -      DEBUG ((DEBUG_ERROR, "%a, ToStructure() failed: %r\n", __func__,
> Status));
> -    }
> -
> -    return Status;
> +    DEBUG ((DEBUG_ERROR, "%a: ToStructure() failed: %r\n", __func__,
> Status));
> +    goto ON_RELEASE;
>    }
>
>    AsciiStrCpyS (SchemaInfo->Schema, REDFISH_SCHEMA_STRING_SIZE,
> Header->JsonRsrcIdentifier.NameSpace.ResourceTypeName);
> @@ -94,14 +90,19 @@ GetRedfishSchemaInfo (
>    AsciiStrCpyS (SchemaInfo->Minor, REDFISH_SCHEMA_VERSION_SIZE,
> Header->JsonRsrcIdentifier.NameSpace.MinorVersion);
>    AsciiStrCpyS (SchemaInfo->Errata, REDFISH_SCHEMA_VERSION_SIZE,
> Header->JsonRsrcIdentifier.NameSpace.ErrataVersion);
>
> +ON_RELEASE:
>    //
>    // Release resource.
>    //
>    JsonStructProtocol->DestoryStructure (JsonStructProtocol, Header);
> -  FreePool (JsonText);
> +
> +  if (JsonData != NULL) {
> +    FreePool (JsonData);
> +  }
> +
>    RedfishHttpFreeResponse (&Response);
>
> -  return EFI_SUCCESS;
> +  return Status;
>  }
>
>  /**
> @@ -116,6 +117,7 @@ GetRedfishSchemaInfo (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  GetSupportedSchemaVersion (
>    IN   CHAR8                *Schema,
>    OUT  REDFISH_SCHEMA_INFO  *SchemaInfo
> @@ -257,17 +259,17 @@ GetRedfishResourceConfigProtocol (
>      return NULL;
>    }
>
> -  if (mRedfishResourceConfigProtocol != NULL) {
> -    if ((AsciiStrCmp (Schema->Schema, mSchemaInfoCache.Schema) == 0) &&
> -        (AsciiStrCmp (Schema->Major, mSchemaInfoCache.Major) == 0) &&
> -        (AsciiStrCmp (Schema->Minor, mSchemaInfoCache.Minor) == 0) &&
> -        (AsciiStrCmp (Schema->Errata, mSchemaInfoCache.Errata) == 0))
> +  if ((mRedfishResourceConfigCache != NULL) &&
> (mRedfishResourceConfigCache->RedfishResourceConfig.ConfigProtocol !=
> NULL)) {
> +    if ((AsciiStrCmp (Schema->Schema, mRedfishResourceConfigCache-
> >SchemaInfoCache.Schema) == 0) &&
> +        (AsciiStrCmp (Schema->Major, mRedfishResourceConfigCache-
> >SchemaInfoCache.Major) == 0) &&
> +        (AsciiStrCmp (Schema->Minor, mRedfishResourceConfigCache-
> >SchemaInfoCache.Minor) == 0) &&
> +        (AsciiStrCmp (Schema->Errata, mRedfishResourceConfigCache-
> >SchemaInfoCache.Errata) == 0))
>      {
>        if (Handle != NULL) {
> -        *Handle = mCachedHandle;
> +        *Handle = mRedfishResourceConfigCache->CachedHandle;
>        }
>
> -      return mRedfishResourceConfigProtocol;
> +      return mRedfishResourceConfigCache-
> >RedfishResourceConfig.ConfigProtocol;
>      }
>    }
>
> @@ -310,9 +312,116 @@ GetRedfishResourceConfigProtocol (
>    }
>
>    if (Found) {
> -    mCachedHandle                  = HandleBuffer[Index];
> -    mRedfishResourceConfigProtocol = Protocol;
> -    CopyMem (&mSchemaInfoCache, Schema, sizeof
> (REDFISH_SCHEMA_INFO));
> +    if (mRedfishResourceConfigCache != NULL) {
> +      mRedfishResourceConfigCache->CachedHandle                         =
> HandleBuffer[Index];
> +      mRedfishResourceConfigCache->RedfishResourceConfig.ConfigProtocol =
> Protocol;
> +      CopyMem (&mRedfishResourceConfigCache->SchemaInfoCache, Schema,
> sizeof (REDFISH_SCHEMA_INFO));
> +    }
> +
> +    if (Handle != NULL) {
> +      *Handle = HandleBuffer[Index];
> +    }
> +  }
> +
> +  FreePool (HandleBuffer);
> +
> +  return (Found ? Protocol : NULL);
> +}
> +
> +/**
> +
> +  Find Redfish Resource Config2 Protocol that supports given schema and
> version.
> +
> +  @param[in]  Schema      Schema name.
> +  @param[out] Handle      Pointer to receive the handle that has
> EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL
> +                          installed on it.
> +
> +  @retval     EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL *    Pointer to
> protocol
> +  @retval     NULL                                         No protocol found.
> +
> +**/
> +EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *
> +GetRedfishResourceConfig2Protocol (
> +  IN  REDFISH_SCHEMA_INFO  *Schema,
> +  OUT EFI_HANDLE           *Handle OPTIONAL
> +  )
> +{
> +  EFI_STATUS                               Status;
> +  EFI_HANDLE                               *HandleBuffer;
> +  UINTN                                    NumberOfHandles;
> +  UINTN                                    Index;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Protocol;
> +  REDFISH_SCHEMA_INFO                      SchemaInfo;
> +  BOOLEAN                                  Found;
> +
> +  if (IS_EMPTY_STRING (Schema->Schema) ||
> +      IS_EMPTY_STRING (Schema->Major) ||
> +      IS_EMPTY_STRING (Schema->Minor) ||
> +      IS_EMPTY_STRING (Schema->Errata)
> +      )
> +  {
> +    return NULL;
> +  }
> +
> +  if ((mRedfishResourceConfig2Cache != NULL) &&
> (mRedfishResourceConfig2Cache->RedfishResourceConfig.Config2Protocol !=
> NULL)) {
> +    if ((AsciiStrCmp (Schema->Schema, mRedfishResourceConfig2Cache-
> >SchemaInfoCache.Schema) == 0) &&
> +        (AsciiStrCmp (Schema->Major, mRedfishResourceConfig2Cache-
> >SchemaInfoCache.Major) == 0) &&
> +        (AsciiStrCmp (Schema->Minor, mRedfishResourceConfig2Cache-
> >SchemaInfoCache.Minor) == 0) &&
> +        (AsciiStrCmp (Schema->Errata, mRedfishResourceConfig2Cache-
> >SchemaInfoCache.Errata) == 0))
> +    {
> +      if (Handle != NULL) {
> +        *Handle = mRedfishResourceConfig2Cache->CachedHandle;
> +      }
> +
> +      return mRedfishResourceConfig2Cache-
> >RedfishResourceConfig.Config2Protocol;
> +    }
> +  }
> +
> +  Status = gBS->LocateHandleBuffer (
> +                  ByProtocol,
> +                  &gEdkIIRedfishResourceConfig2ProtocolGuid,
> +                  NULL,
> +                  &NumberOfHandles,
> +                  &HandleBuffer
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    return NULL;
> +  }
> +
> +  Found = FALSE;
> +
> +  for (Index = 0; Index < NumberOfHandles; Index++) {
> +    Status = gBS->HandleProtocol (
> +                    HandleBuffer[Index],
> +                    &gEdkIIRedfishResourceConfig2ProtocolGuid,
> +                    (VOID **)&Protocol
> +                    );
> +    if (EFI_ERROR (Status)) {
> +      continue;
> +    }
> +
> +    Status = Protocol->GetInfo (Protocol, &SchemaInfo);
> +    if (EFI_ERROR (Status)) {
> +      continue;
> +    }
> +
> +    if ((AsciiStrCmp (Schema->Schema, SchemaInfo.Schema) == 0) &&
> +        (AsciiStrCmp (Schema->Major, SchemaInfo.Major) == 0) &&
> +        (AsciiStrCmp (Schema->Minor, SchemaInfo.Minor) == 0) &&
> +        (AsciiStrCmp (Schema->Errata, SchemaInfo.Errata) == 0))
> +    {
> +      Found = TRUE;
> +      break;
> +    }
> +  }
> +
> +  if (Found) {
> +    if (mRedfishResourceConfig2Cache != NULL) {
> +      mRedfishResourceConfig2Cache->CachedHandle                          =
> HandleBuffer[Index];
> +      mRedfishResourceConfig2Cache-
> >RedfishResourceConfig.Config2Protocol = Protocol;
> +      CopyMem (&mRedfishResourceConfig2Cache->SchemaInfoCache,
> Schema, sizeof (REDFISH_SCHEMA_INFO));
> +    }
> +
>      if (Handle != NULL) {
>        *Handle = HandleBuffer[Index];
>      }
> @@ -379,6 +488,7 @@ InstallInterchangeDataProtocol (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceSetConfigureLang (
>    IN EFI_HANDLE                                   ImageHandle,
>    IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST  *ConfigLangList
> @@ -411,7 +521,7 @@ EdkIIRedfishResourceSetConfigureLang (
>    Interface->ResourceInformationExchage-
> >ReturnedInformation.ConfigureLanguageList.List  =
>      AllocateZeroPool (sizeof (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG)
> * ConfigLangList->Count);
>    if (Interface->ResourceInformationExchage-
> >ReturnedInformation.ConfigureLanguageList.List == NULL) {
> -    DEBUG ((DEBUG_ERROR, "%a, Fail to allocate memory for
> REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG.\n", __func__));
> +    DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for
> REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG.\n", __func__));
>      return EFI_OUT_OF_RESOURCES;
>    }
>
> @@ -425,10 +535,11 @@ EdkIIRedfishResourceSetConfigureLang (
>  }
>
>  /**
> -  Provising redfish resource by given URI.
> +  Provision redfish resource by given URI.
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 Target URI to create resource.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>    @param[in]   InformationExchange Pointer to
> RESOURCE_INFORMATION_EXCHANGE.
>    @param[in]   HttpPostMode        TRUE if resource does not exist, HTTP POST
> method is used.
>                                     FALSE if the resource exist but some of properties are
> missing,
> @@ -439,18 +550,41 @@ EdkIIRedfishResourceSetConfigureLang (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigProvisioning (
>    IN     REDFISH_SCHEMA_INFO            *Schema,
>    IN     EFI_STRING                     Uri,
> +  IN     CHAR8                          *JsonText OPTIONAL,
>    IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange,
>    IN     BOOLEAN                        HttpPostMode
>    )
>  {
> -  EFI_HANDLE                              Handle;
> -  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
> +  EFI_HANDLE                               Handle;
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
>
> -  protocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
> -  if ((protocol == NULL) || (Handle == NULL)) {
> +  //
> +  // Initialization.
> +  //
> +  Handle          = NULL;
> +  ConfigProtocol  = NULL;
> +  Config2Protocol = NULL;
> +
> +  //
> +  // Try to use config2 protocol first.
> +  //
> +  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, &Handle);
> +  if ((Config2Protocol != NULL) && (Handle != NULL)) {
> +    //
> +    // Install EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL on
> the child
> +    // feature driver handle.
> +    //
> +    InstallInterchangeDataProtocol (Handle, InformationExchange);
> +    return Config2Protocol->Provisioning (Config2Protocol, Uri, JsonText,
> HttpPostMode);
> +  }
> +
> +  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
> +  if ((ConfigProtocol == NULL) || (Handle == NULL)) {
>      return EFI_DEVICE_ERROR;
>    }
>
> @@ -459,7 +593,7 @@ EdkIIRedfishResourceConfigProvisioning (
>    // feature driver handle.
>    //
>    InstallInterchangeDataProtocol (Handle, InformationExchange);
> -  return protocol->Provisioning (protocol, Uri, HttpPostMode);
> +  return ConfigProtocol->Provisioning (ConfigProtocol, Uri, HttpPostMode);
>  }
>
>  /**
> @@ -467,25 +601,43 @@ EdkIIRedfishResourceConfigProvisioning (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval Others                   Some error happened.
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigConsume (
>    IN     REDFISH_SCHEMA_INFO  *Schema,
> -  IN     EFI_STRING           Uri
> +  IN     EFI_STRING           Uri,
> +  IN     CHAR8                *JsonText OPTIONAL
>    )
>  {
> -  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
>
> -  protocol = GetRedfishResourceConfigProtocol (Schema, NULL);
> -  if (protocol == NULL) {
> +  //
> +  // Initialization.
> +  //
> +  ConfigProtocol  = NULL;
> +  Config2Protocol = NULL;
> +
> +  //
> +  // Try to use config2 protocol first.
> +  //
> +  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, NULL);
> +  if (Config2Protocol != NULL) {
> +    return Config2Protocol->Consume (Config2Protocol, Uri, JsonText);
> +  }
> +
> +  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, NULL);
> +  if (ConfigProtocol == NULL) {
>      return EFI_DEVICE_ERROR;
>    }
>
> -  return protocol->Consume (protocol, Uri);
> +  return ConfigProtocol->Consume (ConfigProtocol, Uri);
>  }
>
>  /**
> @@ -493,25 +645,43 @@ EdkIIRedfishResourceConfigConsume (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval Others                   Some error happened.
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigUpdate (
>    IN     REDFISH_SCHEMA_INFO  *Schema,
> -  IN     EFI_STRING           Uri
> +  IN     EFI_STRING           Uri,
> +  IN     CHAR8                *JsonText OPTIONAL
>    )
>  {
> -  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
> +
> +  //
> +  // Initialization.
> +  //
> +  ConfigProtocol  = NULL;
> +  Config2Protocol = NULL;
>
> -  protocol = GetRedfishResourceConfigProtocol (Schema, NULL);
> -  if (protocol == NULL) {
> +  //
> +  // Try to use config2 protocol first.
> +  //
> +  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, NULL);
> +  if (Config2Protocol != NULL) {
> +    return Config2Protocol->Update (Config2Protocol, Uri, JsonText);
> +  }
> +
> +  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, NULL);
> +  if (ConfigProtocol == NULL) {
>      return EFI_DEVICE_ERROR;
>    }
>
> -  return protocol->Update (protocol, Uri);
> +  return ConfigProtocol->Update (ConfigProtocol, Uri);
>  }
>
>  /**
> @@ -519,25 +689,43 @@ EdkIIRedfishResourceConfigUpdate (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>
>    @retval EFI_SUCCESS              Value is returned successfully.
>    @retval Others                   Some error happened.
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigCheck (
>    IN     REDFISH_SCHEMA_INFO  *Schema,
> -  IN     EFI_STRING           Uri
> +  IN     EFI_STRING           Uri,
> +  IN     CHAR8                *JsonText OPTIONAL
>    )
>  {
> -  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
> +
> +  //
> +  // Initialization.
> +  //
> +  ConfigProtocol  = NULL;
> +  Config2Protocol = NULL;
> +
> +  //
> +  // Try to use config2 protocol first.
> +  //
> +  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, NULL);
> +  if (Config2Protocol != NULL) {
> +    return Config2Protocol->Check (Config2Protocol, Uri, JsonText);
> +  }
>
> -  protocol = GetRedfishResourceConfigProtocol (Schema, NULL);
> -  if (protocol == NULL) {
> +  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, NULL);
> +  if (ConfigProtocol == NULL) {
>      return EFI_DEVICE_ERROR;
>    }
>
> -  return protocol->Check (protocol, Uri);
> +  return ConfigProtocol->Check (ConfigProtocol, Uri);
>  }
>
>  /**
> @@ -545,6 +733,7 @@ EdkIIRedfishResourceConfigCheck (
>
>    @param[in]   Schema              Redfish schema information.
>    @param[in]   Uri                 The target URI to consume.
> +  @param[in]   JsonText            The JSON data in ASCII string format. This is
> optional.
>    @param[in]   InformationExchange Pointer to
> RESOURCE_INFORMATION_EXCHANGE.
>
>    @retval EFI_SUCCESS              This is target resource which we want to handle.
> @@ -553,17 +742,40 @@ EdkIIRedfishResourceConfigCheck (
>
>  **/
>  EFI_STATUS
> +EFIAPI
>  EdkIIRedfishResourceConfigIdentify (
>    IN     REDFISH_SCHEMA_INFO            *Schema,
>    IN     EFI_STRING                     Uri,
> +  IN     CHAR8                          *JsonText OPTIONAL,
>    IN     RESOURCE_INFORMATION_EXCHANGE  *InformationExchange
>    )
>  {
> -  EFI_HANDLE                              Handle;
> -  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL  *protocol;
> +  EFI_HANDLE                               Handle;
> +  EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL   *ConfigProtocol;
> +  EDKII_REDFISH_RESOURCE_CONFIG2_PROTOCOL  *Config2Protocol;
> +
> +  //
> +  // Initialization.
> +  //
> +  Handle          = NULL;
> +  ConfigProtocol  = NULL;
> +  Config2Protocol = NULL;
> +
> +  //
> +  // Try to use config2 protocol first.
> +  //
> +  Config2Protocol = GetRedfishResourceConfig2Protocol (Schema, &Handle);
> +  if ((Config2Protocol != NULL) && (Handle != NULL)) {
> +    //
> +    // Install EDKII_REDFISH_FEATURE_INTERCHANGE_DATA_PROTOCOL on
> the child
> +    // feature driver handle.
> +    //
> +    InstallInterchangeDataProtocol (Handle, InformationExchange);
> +    return Config2Protocol->Identify (Config2Protocol, Uri, JsonText);
> +  }
>
> -  protocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
> -  if (protocol == NULL) {
> +  ConfigProtocol = GetRedfishResourceConfigProtocol (Schema, &Handle);
> +  if (ConfigProtocol == NULL) {
>      return EFI_DEVICE_ERROR;
>    }
>
> @@ -572,17 +784,17 @@ EdkIIRedfishResourceConfigIdentify (
>    // feature driver handle.
>    //
>    InstallInterchangeDataProtocol (Handle, InformationExchange);
> -  return protocol->Identify (protocol, Uri);
> +  return ConfigProtocol->Identify (ConfigProtocol, Uri);
>  }
>
>  /**
>
> -  Initial resource config library instace.
> +  Initial resource config library instance.
>
>    @param[in] ImageHandle     The image handle.
>    @param[in] SystemTable     The system table.
>
> -  @retval  EFI_SUCEESS  Install Boot manager menu success.
> +  @retval  EFI_SUCCESS  Install Boot manager menu success.
>    @retval  Other        Return error status.
>
>  **/
> @@ -593,8 +805,17 @@ RedfishResourceConfigConstructor (
>    IN EFI_SYSTEM_TABLE  *SystemTable
>    )
>  {
> -  mRedfishResourceConfigProtocol = NULL;
> -  ZeroMem (&mSchemaInfoCache, sizeof (REDFISH_SCHEMA_INFO));
> +  mRedfishResourceConfigCache = AllocateZeroPool (sizeof
> (REDFISH_CONFIG_PROTOCOL_CACHE));
> +  if (mRedfishResourceConfigCache == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  mRedfishResourceConfig2Cache = AllocateZeroPool (sizeof
> (REDFISH_CONFIG_PROTOCOL_CACHE));
> +  if (mRedfishResourceConfig2Cache == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  ZeroMem (&mRedfishFeatureInterchangeData, sizeof
> (mRedfishFeatureInterchangeData));
>
>    return EFI_SUCCESS;
>  }
> @@ -615,7 +836,15 @@ RedfishResourceConfigDestructor (
>    IN EFI_SYSTEM_TABLE  *SystemTable
>    )
>  {
> -  mRedfishResourceConfigProtocol = NULL;
> +  if (mRedfishResourceConfigCache != NULL) {
> +    FreePool (mRedfishResourceConfigCache);
> +    mRedfishResourceConfigCache = NULL;
> +  }
> +
> +  if (mRedfishResourceConfig2Cache != NULL) {
> +    FreePool (mRedfishResourceConfig2Cache);
> +    mRedfishResourceConfig2Cache = NULL;
> +  }
>
>    return EFI_SUCCESS;
>  }
> --
> 2.34.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116471): https://edk2.groups.io/g/devel/message/116471
Mute This Topic: https://groups.io/mt/104781209/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



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

end of thread, other threads:[~2024-03-07  3:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-07  3:24 [edk2-devel] [edk2-redfish-client][PATCH v3 2/2] RedfishClientPkg/Edk2RedfishResourceConfigLib: support config2 protocol Nickle Wang via groups.io
2024-03-07  3:58 ` Chang, Abner via groups.io

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