[AMD Official Use Only - General]

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

> -----Original Message-----
> From: Nickle Wang <nick...@nvidia.com>
> Sent: Thursday, March 7, 2024 11:24 AM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <abner.ch...@amd.com>; Igor Kulchytskyy
> <ig...@ami.com>; Nick Ramirez <nrami...@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 <nick...@nvidia.com>
> Cc: Abner Chang <abner.ch...@amd.com>
> Cc: Igor Kulchytskyy <ig...@ami.com>
> Cc: Nick Ramirez <nrami...@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/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to