[edk2-devel] [edk2-redfish-client][PATCH V2] RedfishClientPkg/FeatureDriver: ComputerSystem_1_5_0 driver

Chang, Abner via groups.io posted 1 patch 9 months, 2 weeks ago
Failed in applying to current master (apply log)
.../v1_5_0/Dxe/ComputerSystemDxe.inf          |   1 +
.../v1_5_0/Common/ComputerSystemCommon.c      | 347 ++++++++++++------
.../v1_5_0/Dxe/ComputerSystemDxe.c            |  64 ++--
3 files changed, 271 insertions(+), 141 deletions(-)
[edk2-devel] [edk2-redfish-client][PATCH V2] RedfishClientPkg/FeatureDriver: ComputerSystem_1_5_0 driver
Posted by Chang, Abner via groups.io 9 months, 2 weeks ago
From: Abner Chang <abner.chang@amd.com>

Update Redfish ComputerSystem_1_5_0 feature
driver to align the implementation with latest
code. This driver handles all of ComputerSystem
v1_5_0 properties and incorporate with Redfish simualtor.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Igor Kulchytskyy <igork@ami.com>
---
 .../v1_5_0/Dxe/ComputerSystemDxe.inf          |   1 +
 .../v1_5_0/Common/ComputerSystemCommon.c      | 347 ++++++++++++------
 .../v1_5_0/Dxe/ComputerSystemDxe.c            |  64 ++--
 3 files changed, 271 insertions(+), 141 deletions(-)

diff --git a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.inf b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.inf
index 36cbe06211..4e7dc5c7c5 100644
--- a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.inf
+++ b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.inf
@@ -37,6 +37,7 @@
   RedfishResourceIdentifyLib
   UefiLib
   UefiDriverEntryPoint
+  RedfishAddendumLib
   RedfishHttpCacheLib
 
 [Protocols]
diff --git a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSystemCommon.c b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSystemCommon.c
index 3ace03bd4c..a67ef3dac2 100644
--- a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSystemCommon.c
+++ b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSystemCommon.c
@@ -53,7 +53,7 @@ RedfishConsumeResourceCommon (
                                           (EFI_REST_JSON_STRUCTURE_HEADER **)&ComputerSystem
                                           );
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, ToStructure() failed: %r\n", __func__, Status));
+    DEBUG ((DEBUG_ERROR, "%a: ToStructure() failed: %r\n", __func__, Status));
     return Status;
   }
 
@@ -66,8 +66,8 @@ RedfishConsumeResourceCommon (
     //
     // No change
     //
-    DEBUG ((DEBUG_MANAGEABILITY, "%a, ETAG: %s has no change, ignore consume action\n", __func__, Private->Uri));
-    Status = EFI_ALREADY_STARTED;
+    DEBUG ((DEBUG_MANAGEABILITY, "%a: ETAG: %s has no change, ignore consume action\n", __func__, Private->Uri));
+    Status = EFI_SUCCESS;
     goto ON_RELEASE;
   }
 
@@ -154,12 +154,12 @@ RedfishConsumeResourceCommon (
     if (ConfigureLang != NULL) {
       Status = ApplyFeatureSettingsStringArrayType (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot->BootOrder);
       if (EFI_ERROR (Status)) {
-        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
+        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
       }
 
       FreePool (ConfigureLang);
     } else {
-      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n", __func__, Private->Uri));
+      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI: %s\n", __func__, Private->Uri));
     }
   }
 
@@ -174,12 +174,12 @@ RedfishConsumeResourceCommon (
     if (ConfigureLang != NULL) {
       Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot->BootSourceOverrideEnabled);
       if (EFI_ERROR (Status)) {
-        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
+        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
       }
 
       FreePool (ConfigureLang);
     } else {
-      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n", __func__, Private->Uri));
+      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI: %s\n", __func__, Private->Uri));
     }
   }
 
@@ -194,12 +194,12 @@ RedfishConsumeResourceCommon (
     if (ConfigureLang != NULL) {
       Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot->BootSourceOverrideMode);
       if (EFI_ERROR (Status)) {
-        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
+        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
       }
 
       FreePool (ConfigureLang);
     } else {
-      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n", __func__, Private->Uri));
+      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI: %s\n", __func__, Private->Uri));
     }
   }
 
@@ -234,12 +234,12 @@ RedfishConsumeResourceCommon (
     if (ConfigureLang != NULL) {
       Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot->UefiTargetBootSourceOverride);
       if (EFI_ERROR (Status)) {
-        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
+        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n", __func__, ConfigureLang, Status));
       }
 
       FreePool (ConfigureLang);
     } else {
-      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n", __func__, Private->Uri));
+      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI: %s\n", __func__, Private->Uri));
     }
   }
 
@@ -742,9 +742,9 @@ ON_RELEASE:
 
 EFI_STATUS
 ProvisioningComputerSystemProperties (
-  IN  EFI_REST_JSON_STRUCTURE_PROTOCOL *JsonStructProtocol,
-  IN  CHAR8 *InputJson,
-  IN  CHAR8 *ResourceId, OPTIONAL
+  IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
+  IN  CHAR8                             *InputJson,
+  IN  CHAR8                             *ResourceId OPTIONAL,
   IN  EFI_STRING                        ConfigureLang,
   IN  BOOLEAN                           ProvisionMode,
   OUT CHAR8                             **ResultJson
@@ -752,6 +752,8 @@ ProvisioningComputerSystemProperties (
 {
   EFI_REDFISH_COMPUTERSYSTEM_V1_5_0     *ComputerSystem;
   EFI_REDFISH_COMPUTERSYSTEM_V1_5_0_CS  *ComputerSystemCs;
+  EFI_REDFISH_COMPUTERSYSTEM_V1_5_0     *ComputerSystemEmpty;
+  EFI_REDFISH_COMPUTERSYSTEM_V1_5_0_CS  *ComputerSystemCsEmpty;
   EFI_STATUS                            Status;
   BOOLEAN                               PropertyChanged;
   CHAR8                                 *AsciiStringValue;
@@ -778,17 +780,33 @@ ProvisioningComputerSystemProperties (
                                          (EFI_REST_JSON_STRUCTURE_HEADER **)&ComputerSystem
                                          );
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, ToStructure failure: %r\n", __func__, Status));
+    DEBUG ((DEBUG_ERROR, "%a: ToStructure failure: %r\n", __func__, Status));
+    return Status;
+  }
+
+  ComputerSystemEmpty = NULL;
+  Status              = JsonStructProtocol->ToStructure (
+                                              JsonStructProtocol,
+                                              NULL,
+                                              ComputerSystemEmptyJson,
+                                              (EFI_REST_JSON_STRUCTURE_HEADER **)&ComputerSystemEmpty
+                                              );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: ToStructure failure: %r\n", __func__, Status));
     return Status;
   }
 
   ComputerSystemCs = ComputerSystem->ComputerSystem;
+  //
+  // Initial an empty ComputerSystemCS
+  //
+  ComputerSystemCsEmpty = ComputerSystemEmpty->ComputerSystem;
 
   //
   // ID
   //
   if ((ComputerSystemCs->Id == NULL) && !IS_EMPTY_STRING (ResourceId)) {
-    ComputerSystemCs->Id = AllocateCopyPool (AsciiStrSize (ResourceId), ResourceId);
+    ComputerSystemCsEmpty->Id = AllocateCopyPool (AsciiStrSize (ResourceId), ResourceId);
   }
 
   //
@@ -798,8 +816,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"AssetTag", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->AssetTag, AsciiStringValue) != 0)) {
-        ComputerSystemCs->AssetTag = AsciiStringValue;
-        PropertyChanged            = TRUE;
+        ComputerSystemCsEmpty->AssetTag = AsciiStringValue;
+        PropertyChanged                 = TRUE;
       }
     }
   }
@@ -811,8 +829,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"BiosVersion", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->BiosVersion, AsciiStringValue) != 0)) {
-        ComputerSystemCs->BiosVersion = AsciiStringValue;
-        PropertyChanged               = TRUE;
+        ComputerSystemCsEmpty->BiosVersion = AsciiStringValue;
+        PropertyChanged                    = TRUE;
       }
     }
   }
@@ -828,8 +846,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Boot/BootNext", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot->BootNext, AsciiStringValue) != 0)) {
-          ComputerSystemCs->Boot->BootNext = AsciiStringValue;
-          PropertyChanged                  = TRUE;
+          ComputerSystemCsEmpty->Boot->BootNext = AsciiStringValue;
+          PropertyChanged                       = TRUE;
         }
       }
     }
@@ -841,7 +859,7 @@ ProvisioningComputerSystemProperties (
       AsciiStringArrayValue = GetPropertyStringArrayValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Boot/BootOrder", ConfigureLang, &ArraySize);
       if (AsciiStringArrayValue != NULL) {
         if (ProvisionMode || !CompareRedfishStringArrayValues (ComputerSystemCs->Boot->BootOrder, AsciiStringArrayValue, ArraySize)) {
-          AddRedfishCharArray (&ComputerSystemCs->Boot->BootOrder, AsciiStringArrayValue, ArraySize);
+          AddRedfishCharArray (&ComputerSystemCsEmpty->Boot->BootOrder, AsciiStringArrayValue, ArraySize);
           PropertyChanged = TRUE;
         }
       }
@@ -854,8 +872,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Boot/BootSourceOverrideEnabled", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot->BootSourceOverrideEnabled, AsciiStringValue) != 0)) {
-          ComputerSystemCs->Boot->BootSourceOverrideEnabled = AsciiStringValue;
-          PropertyChanged                                   = TRUE;
+          ComputerSystemCsEmpty->Boot->BootSourceOverrideEnabled = AsciiStringValue;
+          PropertyChanged                                        = TRUE;
         }
       }
     }
@@ -867,8 +885,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Boot/BootSourceOverrideMode", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot->BootSourceOverrideMode, AsciiStringValue) != 0)) {
-          ComputerSystemCs->Boot->BootSourceOverrideMode = AsciiStringValue;
-          PropertyChanged                                = TRUE;
+          ComputerSystemCsEmpty->Boot->BootSourceOverrideMode = AsciiStringValue;
+          PropertyChanged                                     = TRUE;
         }
       }
     }
@@ -880,8 +898,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Boot/BootSourceOverrideTarget", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot->BootSourceOverrideTarget, AsciiStringValue) != 0)) {
-          ComputerSystemCs->Boot->BootSourceOverrideTarget = AsciiStringValue;
-          PropertyChanged                                  = TRUE;
+          ComputerSystemCsEmpty->Boot->BootSourceOverrideTarget = AsciiStringValue;
+          PropertyChanged                                       = TRUE;
         }
       }
     }
@@ -893,8 +911,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Boot/UefiTargetBootSourceOverride", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot->UefiTargetBootSourceOverride, AsciiStringValue) != 0)) {
-          ComputerSystemCs->Boot->UefiTargetBootSourceOverride = AsciiStringValue;
-          PropertyChanged                                      = TRUE;
+          ComputerSystemCsEmpty->Boot->UefiTargetBootSourceOverride = AsciiStringValue;
+          PropertyChanged                                           = TRUE;
         }
       }
     }
@@ -907,8 +925,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"HostName", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->HostName, AsciiStringValue) != 0)) {
-        ComputerSystemCs->HostName = AsciiStringValue;
-        PropertyChanged            = TRUE;
+        ComputerSystemCsEmpty->HostName = AsciiStringValue;
+        PropertyChanged                 = TRUE;
       }
     }
   }
@@ -926,9 +944,9 @@ ProvisioningComputerSystemProperties (
         if (ProvisionMode || (*ComputerSystemCs->HostWatchdogTimer->FunctionEnabled != *BooleanValue)) {
           IntegerValue = AllocatePool (sizeof (*IntegerValue));
           if (IntegerValue != NULL) {
-            *IntegerValue                                        = (BooleanValue ? 0x01 : 0x00);
-            ComputerSystemCs->HostWatchdogTimer->FunctionEnabled = IntegerValue;
-            PropertyChanged                                      = TRUE;
+            *IntegerValue                                             = (BooleanValue ? 0x01 : 0x00);
+            ComputerSystemCsEmpty->HostWatchdogTimer->FunctionEnabled = IntegerValue;
+            PropertyChanged                                           = TRUE;
           }
         }
       }
@@ -941,8 +959,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"HostWatchdogTimer/TimeoutAction", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->HostWatchdogTimer->TimeoutAction, AsciiStringValue) != 0)) {
-          ComputerSystemCs->HostWatchdogTimer->TimeoutAction = AsciiStringValue;
-          PropertyChanged                                    = TRUE;
+          ComputerSystemCsEmpty->HostWatchdogTimer->TimeoutAction = AsciiStringValue;
+          PropertyChanged                                         = TRUE;
         }
       }
     }
@@ -954,8 +972,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"HostWatchdogTimer/WarningAction", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->HostWatchdogTimer->WarningAction, AsciiStringValue) != 0)) {
-          ComputerSystemCs->HostWatchdogTimer->WarningAction = AsciiStringValue;
-          PropertyChanged                                    = TRUE;
+          ComputerSystemCsEmpty->HostWatchdogTimer->WarningAction = AsciiStringValue;
+          PropertyChanged                                         = TRUE;
         }
       }
     }
@@ -964,7 +982,7 @@ ProvisioningComputerSystemProperties (
   //
   // Handle HOSTEDSERVICES
   //
-  if (ComputerSystemCs->HostedServices != NULL) {
+  if (ComputerSystemCsEmpty->HostedServices != NULL) {
   }
 
   //
@@ -981,8 +999,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"IndicatorLED", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->IndicatorLED, AsciiStringValue) != 0)) {
-        ComputerSystemCs->IndicatorLED = AsciiStringValue;
-        PropertyChanged                = TRUE;
+        ComputerSystemCsEmpty->IndicatorLED = AsciiStringValue;
+        PropertyChanged                     = TRUE;
       }
     }
   }
@@ -994,8 +1012,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Manufacturer", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Manufacturer, AsciiStringValue) != 0)) {
-        ComputerSystemCs->Manufacturer = AsciiStringValue;
-        PropertyChanged                = TRUE;
+        ComputerSystemCsEmpty->Manufacturer = AsciiStringValue;
+        PropertyChanged                     = TRUE;
       }
     }
   }
@@ -1011,8 +1029,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"MemorySummary/MemoryMirroring", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->MemorySummary->MemoryMirroring, AsciiStringValue) != 0)) {
-          ComputerSystemCs->MemorySummary->MemoryMirroring = AsciiStringValue;
-          PropertyChanged                                  = TRUE;
+          ComputerSystemCsEmpty->MemorySummary->MemoryMirroring = AsciiStringValue;
+          PropertyChanged                                       = TRUE;
         }
       }
     }
@@ -1024,8 +1042,8 @@ ProvisioningComputerSystemProperties (
       NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"MemorySummary/TotalSystemMemoryGiB", ConfigureLang);
       if (NumericValue != NULL) {
         if (ProvisionMode || (*ComputerSystemCs->MemorySummary->TotalSystemMemoryGiB != *NumericValue)) {
-          ComputerSystemCs->MemorySummary->TotalSystemMemoryGiB = NumericValue;
-          PropertyChanged                                       = TRUE;
+          ComputerSystemCsEmpty->MemorySummary->TotalSystemMemoryGiB = NumericValue;
+          PropertyChanged                                            = TRUE;
         }
       }
     }
@@ -1037,8 +1055,8 @@ ProvisioningComputerSystemProperties (
       NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"MemorySummary/TotalSystemPersistentMemoryGiB", ConfigureLang);
       if (NumericValue != NULL) {
         if (ProvisionMode || (*ComputerSystemCs->MemorySummary->TotalSystemPersistentMemoryGiB != *NumericValue)) {
-          ComputerSystemCs->MemorySummary->TotalSystemPersistentMemoryGiB = NumericValue;
-          PropertyChanged                                                 = TRUE;
+          ComputerSystemCsEmpty->MemorySummary->TotalSystemPersistentMemoryGiB = NumericValue;
+          PropertyChanged                                                      = TRUE;
         }
       }
     }
@@ -1051,8 +1069,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"Model", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Model, AsciiStringValue) != 0)) {
-        ComputerSystemCs->Model = AsciiStringValue;
-        PropertyChanged         = TRUE;
+        ComputerSystemCsEmpty->Model = AsciiStringValue;
+        PropertyChanged              = TRUE;
       }
     }
   }
@@ -1078,8 +1096,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"PartNumber", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->PartNumber, AsciiStringValue) != 0)) {
-        ComputerSystemCs->PartNumber = AsciiStringValue;
-        PropertyChanged              = TRUE;
+        ComputerSystemCsEmpty->PartNumber = AsciiStringValue;
+        PropertyChanged                   = TRUE;
       }
     }
   }
@@ -1091,8 +1109,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"PowerState", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->PowerState, AsciiStringValue) != 0)) {
-        ComputerSystemCs->PowerState = AsciiStringValue;
-        PropertyChanged              = TRUE;
+        ComputerSystemCsEmpty->PowerState = AsciiStringValue;
+        PropertyChanged                   = TRUE;
       }
     }
   }
@@ -1108,8 +1126,8 @@ ProvisioningComputerSystemProperties (
       NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"ProcessorSummary/Count", ConfigureLang);
       if (NumericValue != NULL) {
         if (ProvisionMode || (*ComputerSystemCs->ProcessorSummary->Count != *NumericValue)) {
-          ComputerSystemCs->ProcessorSummary->Count = NumericValue;
-          PropertyChanged                           = TRUE;
+          ComputerSystemCsEmpty->ProcessorSummary->Count = NumericValue;
+          PropertyChanged                                = TRUE;
         }
       }
     }
@@ -1121,8 +1139,8 @@ ProvisioningComputerSystemProperties (
       NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"ProcessorSummary/LogicalProcessorCount", ConfigureLang);
       if (NumericValue != NULL) {
         if (ProvisionMode || (*ComputerSystemCs->ProcessorSummary->LogicalProcessorCount != *NumericValue)) {
-          ComputerSystemCs->ProcessorSummary->LogicalProcessorCount = NumericValue;
-          PropertyChanged                                           = TRUE;
+          ComputerSystemCsEmpty->ProcessorSummary->LogicalProcessorCount = NumericValue;
+          PropertyChanged                                                = TRUE;
         }
       }
     }
@@ -1134,8 +1152,8 @@ ProvisioningComputerSystemProperties (
       AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"ProcessorSummary/Model", ConfigureLang);
       if (AsciiStringValue != NULL) {
         if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->ProcessorSummary->Model, AsciiStringValue) != 0)) {
-          ComputerSystemCs->ProcessorSummary->Model = AsciiStringValue;
-          PropertyChanged                           = TRUE;
+          ComputerSystemCsEmpty->ProcessorSummary->Model = AsciiStringValue;
+          PropertyChanged                                = TRUE;
         }
       }
     }
@@ -1155,8 +1173,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"SKU", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SKU, AsciiStringValue) != 0)) {
-        ComputerSystemCs->SKU = AsciiStringValue;
-        PropertyChanged       = TRUE;
+        ComputerSystemCsEmpty->SKU = AsciiStringValue;
+        PropertyChanged            = TRUE;
       }
     }
   }
@@ -1168,8 +1186,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"SerialNumber", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SerialNumber, AsciiStringValue) != 0)) {
-        ComputerSystemCs->SerialNumber = AsciiStringValue;
-        PropertyChanged                = TRUE;
+        ComputerSystemCsEmpty->SerialNumber = AsciiStringValue;
+        PropertyChanged                     = TRUE;
       }
     }
   }
@@ -1181,8 +1199,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"SubModel", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SubModel, AsciiStringValue) != 0)) {
-        ComputerSystemCs->SubModel = AsciiStringValue;
-        PropertyChanged            = TRUE;
+        ComputerSystemCsEmpty->SubModel = AsciiStringValue;
+        PropertyChanged                 = TRUE;
       }
     }
   }
@@ -1194,8 +1212,8 @@ ProvisioningComputerSystemProperties (
     AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, L"SystemType", ConfigureLang);
     if (AsciiStringValue != NULL) {
       if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SystemType, AsciiStringValue) != 0)) {
-        ComputerSystemCs->SystemType = AsciiStringValue;
-        PropertyChanged              = TRUE;
+        ComputerSystemCsEmpty->SystemType = AsciiStringValue;
+        PropertyChanged                   = TRUE;
       }
     }
   }
@@ -1212,14 +1230,24 @@ ProvisioningComputerSystemProperties (
   //
   Status = JsonStructProtocol->ToJson (
                                  JsonStructProtocol,
-                                 (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystem,
+                                 (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystemEmpty,
                                  ResultJson
                                  );
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, ToJson() failed: %r\n", __func__, Status));
+    DEBUG ((DEBUG_ERROR, "%a: ToJson() failed: %r\n", __func__, Status));
     return Status;
   }
 
+  if (PropertyChanged) {
+    // Remove Redfish unchangeable properties.
+    Status = RedfishRemoveUnchangeableProperties (ResultJson);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "%a: Fail to remove Redfish unchangeable properties from ResultJson.\n", __func__));
+      *ResultJson = NULL;
+      return Status;
+    }
+  }
+
   //
   // Release resource.
   //
@@ -1228,6 +1256,17 @@ ProvisioningComputerSystemProperties (
                         (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystem
                         );
 
+  //
+  // Free memory allocated for Computersystem empty CS
+  //
+  if (ComputerSystemCsEmpty->Boot->BootOrder != NULL) {
+    DestoryRedfishCharArray (ComputerSystemCsEmpty->Boot->BootOrder, ArraySize);
+  }
+
+  JsonStructProtocol->DestoryStructure (
+                        JsonStructProtocol,
+                        (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystemEmpty
+                        );
   return (PropertyChanged ? EFI_SUCCESS : EFI_NOT_FOUND);
 }
 
@@ -1239,6 +1278,7 @@ ProvisioningComputerSystemResource (
   )
 {
   CHAR8       *Json;
+  CHAR8       *JsonWithAddendum;
   EFI_STATUS  Status;
   EFI_STRING  NewResourceLocation;
   CHAR8       *EtagStr;
@@ -1260,13 +1300,45 @@ ProvisioningComputerSystemResource (
              &Json
              );
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, provisioning resource for %s failed: %r\n", __func__, ConfigureLang, Status));
+    DEBUG ((DEBUG_ERROR, "%a: provisioning resource for %s failed: %r\n", __func__, ConfigureLang, Status));
     return Status;
   }
 
+  //
+  // Check and see if platform has OEM data or not
+  //
+  Status = RedfishGetOemData (
+             Private->Uri,
+             RESOURCE_SCHEMA,
+             RESOURCE_SCHEMA_VERSION,
+             Json,
+             &JsonWithAddendum
+             );
+  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
+    FreePool (Json);
+    Json             = JsonWithAddendum;
+    JsonWithAddendum = NULL;
+  }
+
+  //
+  // Check and see if platform has addendum data or not
+  //
+  Status = RedfishGetAddendumData (
+             Private->Uri,
+             RESOURCE_SCHEMA,
+             RESOURCE_SCHEMA_VERSION,
+             Json,
+             &JsonWithAddendum
+             );
+  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
+    FreePool (Json);
+    Json             = JsonWithAddendum;
+    JsonWithAddendum = NULL;
+  }
+
   Status = CreatePayloadToPostResource (Private->RedfishService, Private->Payload, Json, &NewResourceLocation, &EtagStr);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, post ComputerSystem resource for %s failed: %r\n", __func__, ConfigureLang, Status));
+    DEBUG ((DEBUG_ERROR, "%a: post ComputerSystem resource for %s failed: %r\n", __func__, ConfigureLang, Status));
     goto RELEASE_RESOURCE;
   }
 
@@ -1279,16 +1351,12 @@ ProvisioningComputerSystemResource (
     RedfishSetRedfishUri (ConfigureLang, NewResourceLocation);
   }
 
-  //
-  // Handle Etag
-  //
+RELEASE_RESOURCE:
+
   if (EtagStr != NULL) {
-    SetEtagWithUri (EtagStr, NewResourceLocation);
     FreePool (EtagStr);
   }
 
-RELEASE_RESOURCE:
-
   if (NewResourceLocation != NULL) {
     FreePool (NewResourceLocation);
   }
@@ -1315,7 +1383,7 @@ ProvisioningComputerSystemResources (
 
   Status = RedfishFeatureGetUnifiedArrayTypeConfigureLang (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, REDPATH_ARRAY_PATTERN, &UnifiedConfigureLangList);
   if (EFI_ERROR (Status) || (UnifiedConfigureLangList.Count == 0)) {
-    DEBUG ((DEBUG_ERROR, "%a, No HII question found with configure language: %s: %r\n", __func__, REDPATH_ARRAY_PATTERN, Status));
+    DEBUG ((DEBUG_ERROR, "%a: No HII question found with configure language: %s: %r\n", __func__, REDPATH_ARRAY_PATTERN, Status));
     return EFI_NOT_FOUND;
   }
 
@@ -1341,14 +1409,13 @@ ProvisioningComputerSystemExistResource (
 {
   EFI_STATUS  Status;
   EFI_STRING  ConfigureLang;
-  CHAR8       *EtagStr;
   CHAR8       *Json;
+  CHAR8       *JsonWithAddendum;
 
   if (Private == NULL) {
     return EFI_INVALID_PARAMETER;
   }
 
-  EtagStr       = NULL;
   Json          = NULL;
   ConfigureLang = NULL;
 
@@ -1367,29 +1434,55 @@ ProvisioningComputerSystemExistResource (
              );
   if (EFI_ERROR (Status)) {
     if (Status == EFI_NOT_FOUND) {
-      DEBUG ((REDFISH_DEBUG_TRACE, "%a, provisioning existing resource for %s ignored. Nothing changed\n", __func__, ConfigureLang));
+      DEBUG ((DEBUG_MANAGEABILITY, "%a: provisioning existing resource for %s ignored. Nothing changed\n", __func__, ConfigureLang));
+      Status = EFI_SUCCESS;
     } else {
-      DEBUG ((DEBUG_ERROR, "%a, provisioning existing resource for %s failed: %r\n", __func__, ConfigureLang, Status));
+      DEBUG ((DEBUG_ERROR, "%a: provisioning existing resource for %s failed: %r\n", __func__, ConfigureLang, Status));
     }
 
     goto ON_RELEASE;
   }
 
-  DEBUG ((REDFISH_DEBUG_TRACE, "%a, provisioning existing resource for %s\n", __func__, ConfigureLang));
   //
-  // PUT back to instance
+  // Check and see if platform has OEM data or not
   //
-  Status = CreatePayloadToPatchResource (Private->RedfishService, Private->Payload, Json, &EtagStr);
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, patch resource for %s failed: %r\n", __func__, ConfigureLang, Status));
+  Status = RedfishGetOemData (
+             Private->Uri,
+             RESOURCE_SCHEMA,
+             RESOURCE_SCHEMA_VERSION,
+             Json,
+             &JsonWithAddendum
+             );
+  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
+    FreePool (Json);
+    Json             = JsonWithAddendum;
+    JsonWithAddendum = NULL;
   }
 
   //
-  // Handle Etag
+  // Check and see if platform has addendum data or not
   //
-  if (EtagStr != NULL) {
-    SetEtagWithUri (EtagStr, Private->Uri);
-    FreePool (EtagStr);
+  Status = RedfishGetAddendumData (
+             Private->Uri,
+             RESOURCE_SCHEMA,
+             RESOURCE_SCHEMA_VERSION,
+             Json,
+             &JsonWithAddendum
+             );
+  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
+    FreePool (Json);
+    Json             = JsonWithAddendum;
+    JsonWithAddendum = NULL;
+  }
+
+  DEBUG ((DEBUG_MANAGEABILITY, "%a: provisioning existing resource for %s\n", __func__, ConfigureLang));
+
+  //
+  // PUT back to instance
+  //
+  Status = CreatePayloadToPatchResource (Private->RedfishService, Private->Payload, Json, NULL);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: patch resource for %s failed: %r\n", __func__, ConfigureLang, Status));
   }
 
 ON_RELEASE:
@@ -1458,7 +1551,7 @@ RedfishCheckResourceCommon (
   }
 
   //
-  // Check ETAG to see if we need to check this resource again or not.
+  // Check ETAG to see if we need to check it
   //
   if (CheckEtag (Private->Uri, HeaderEtag, NULL)) {
     //
@@ -1470,12 +1563,12 @@ RedfishCheckResourceCommon (
 
   Status = RedfishPlatformConfigGetConfigureLang (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, REDPATH_ARRAY_PATTERN, &ConfigureLangList, &Count);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, RedfishPlatformConfigGetConfigureLang failed: %r\n", __func__, Status));
+    DEBUG ((DEBUG_ERROR, "%a: failed: %r\n", __func__, Status));
     return Status;
   }
 
   if (Count == 0) {
-    return EFI_NOT_FOUND;
+    return EFI_UNSUPPORTED;
   }
 
   Status = EFI_SUCCESS;
@@ -1485,9 +1578,9 @@ RedfishCheckResourceCommon (
       continue;
     }
 
-    DEBUG ((DEBUG_MANAGEABILITY, "%a, [%d] check attribute for: %s\n", __func__, Index, Property));
+    DEBUG ((DEBUG_MANAGEABILITY, "%a: [%d] check attribute for: %s\n", __func__, Index, Property));
     if (!MatchPropertyWithJsonContext (Property, Json)) {
-      DEBUG ((DEBUG_MANAGEABILITY, "%a, property is missing: %s\n", __func__, Property));
+      DEBUG ((DEBUG_MANAGEABILITY, "%a: property is missing: %s\n", __func__, Property));
       Status = EFI_NOT_FOUND;
     }
   }
@@ -1515,14 +1608,13 @@ RedfishUpdateResourceCommon (
 {
   EFI_STATUS  Status;
   CHAR8       *Json;
+  CHAR8       *JsonWithAddendum;
   EFI_STRING  ConfigureLang;
-  CHAR8       *EtagStr;
 
   if ((Private == NULL) || IS_EMPTY_STRING (InputJson)) {
     return EFI_INVALID_PARAMETER;
   }
 
-  EtagStr       = NULL;
   Json          = NULL;
   ConfigureLang = NULL;
 
@@ -1541,29 +1633,55 @@ RedfishUpdateResourceCommon (
              );
   if (EFI_ERROR (Status)) {
     if (Status == EFI_NOT_FOUND) {
-      DEBUG ((REDFISH_DEBUG_TRACE, "%a, update resource for %s ignored. Nothing changed\n", __func__, ConfigureLang));
+      DEBUG ((DEBUG_MANAGEABILITY, "%a: update resource for %s ignored. Nothing changed\n", __func__, ConfigureLang));
+      Status = EFI_SUCCESS;
     } else {
-      DEBUG ((DEBUG_ERROR, "%a, update resource for %s failed: %r\n", __func__, ConfigureLang, Status));
+      DEBUG ((DEBUG_ERROR, "%a: update resource for %s failed: %r\n", __func__, ConfigureLang, Status));
     }
 
     goto ON_RELEASE;
   }
 
-  DEBUG ((REDFISH_DEBUG_TRACE, "%a, update resource for %s\n", __func__, ConfigureLang));
   //
-  // PUT back to instance
+  // Check and see if platform has OEM data or not
   //
-  Status = CreatePayloadToPatchResource (Private->RedfishService, Private->Payload, Json, &EtagStr);
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, patch resource for %s failed: %r\n", __func__, ConfigureLang, Status));
+  Status = RedfishGetOemData (
+             Private->Uri,
+             RESOURCE_SCHEMA,
+             RESOURCE_SCHEMA_VERSION,
+             Json,
+             &JsonWithAddendum
+             );
+  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
+    FreePool (Json);
+    Json             = JsonWithAddendum;
+    JsonWithAddendum = NULL;
   }
 
   //
-  // Handle Etag
+  // Check and see if platform has addendum data or not
   //
-  if (EtagStr != NULL) {
-    SetEtagWithUri (EtagStr, Private->Uri);
-    FreePool (EtagStr);
+  Status = RedfishGetAddendumData (
+             Private->Uri,
+             RESOURCE_SCHEMA,
+             RESOURCE_SCHEMA_VERSION,
+             Json,
+             &JsonWithAddendum
+             );
+  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
+    FreePool (Json);
+    Json             = JsonWithAddendum;
+    JsonWithAddendum = NULL;
+  }
+
+  DEBUG ((REDFISH_DEBUG_TRACE, "%a: update resource for %s\n", __func__, ConfigureLang));
+
+  //
+  // PUT back to instance
+  //
+  Status = CreatePayloadToPatchResource (Private->RedfishService, Private->Payload, Json, NULL);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: patch resource for %s failed: %r\n", __func__, ConfigureLang, Status));
   }
 
 ON_RELEASE:
@@ -1604,11 +1722,12 @@ RedfishIdentifyResourceCommon (
   if (Supported) {
     Status = RedfishFeatureGetUnifiedArrayTypeConfigureLang (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION, REDPATH_ARRAY_PATTERN, &ConfigLangList);
     if (EFI_ERROR (Status)) {
-      DEBUG ((DEBUG_ERROR, "%a, RedfishFeatureGetUnifiedArrayTypeConfigureLang failed: %r\n", __func__, Status));
+      DEBUG ((DEBUG_ERROR, "%a: RedfishFeatureGetUnifiedArrayTypeConfigureLang failed: %r\n", __func__, Status));
       return Status;
     }
 
     if (ConfigLangList.Count == 0) {
+      DEBUG ((DEBUG_MANAGEABILITY, "%a:  No platform Redfish ConfigureLang found for %s\n", __func__, Private->Uri));
       return EFI_SUCCESS;
     }
 
diff --git a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.c b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.c
index 04ff5c8270..174a8176a8 100644
--- a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.c
+++ b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDxe.c
@@ -15,7 +15,7 @@ extern REDFISH_RESOURCE_COMMON_PRIVATE  *mRedfishResourcePrivate;
 extern EFI_HANDLE                       mRedfishResourceConfigProtocolHandle;
 
 /**
-  Provisioning redfish resource by given URI.
+  Provision redfish resource by given URI.
 
   @param[in]   This                Pointer to EFI_HP_REDFISH_HII_PROTOCOL instance.
   @param[in]   Uri                 Target URI to create resource.
@@ -42,7 +42,7 @@ RedfishResourceProvisioningResource (
     return EFI_INVALID_PARAMETER;
   }
 
-  DEBUG ((DEBUG_MANAGEABILITY, "%a, provisioning in %s mode\n", __func__, (PostMode ? L"POST" : L"PATCH")));
+  DEBUG ((DEBUG_MANAGEABILITY, "%a: provisioning in %s mode\n", __func__, (PostMode ? L"POST" : L"PATCH")));
 
   Private = REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL (This);
 
@@ -53,7 +53,7 @@ RedfishResourceProvisioningResource (
   ZeroMem (&Response, sizeof (Response));
   Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response, TRUE);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__, Uri));
+    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func__, Uri));
     return Status;
   }
 
@@ -62,6 +62,14 @@ RedfishResourceProvisioningResource (
   ASSERT (Private->Payload != NULL);
 
   Status = RedfishProvisioningResourceCommon (Private, !PostMode);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: failed to provision resource to: %s: %r\n", __func__, Uri, Status));
+  } else {
+    //
+    // Get latest ETag on URI and keep it in variable.
+    //
+    SetEtagFromUri (Private->RedfishService, Private->Uri, TRUE);
+  }
 
   //
   // Release resource
@@ -73,7 +81,6 @@ RedfishResourceProvisioningResource (
       Response.Headers,
       Response.Payload
       );
-    RedfishHttpResetResource (Uri);
     Private->Payload = NULL;
   }
 
@@ -118,7 +125,7 @@ RedfishResourceConsumeResource (
   ZeroMem (&Response, sizeof (Response));
   Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response, TRUE);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__, Uri));
+    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func__, Uri));
     return Status;
   }
 
@@ -137,6 +144,7 @@ RedfishResourceConsumeResource (
     Private->Uri     = PendingSettingUri;
     ExpectedResponse = &PendingSettingResponse;
   } else {
+    DEBUG ((REDFISH_DEBUG_TRACE, "%a: No @Redfish.Settings is found\n", __func__));
     Private->Uri     = Uri;
     ExpectedResponse = &Response;
   }
@@ -154,16 +162,14 @@ RedfishResourceConsumeResource (
   GetHttpResponseEtag (ExpectedResponse, &Etag);
   Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
   if (EFI_ERROR (Status)) {
-    if (Status != EFI_ALREADY_STARTED) {
-      DEBUG ((DEBUG_ERROR, "%a, failed to consume resource from: %s: %r\n", __func__, Uri, Status));
-    }
-  } else {
-    //
-    // Keep etag after consuming pending settings.
-    //
-    if (Etag != NULL) {
-      SetEtagWithUri (Etag, Private->Uri);
-    }
+    DEBUG ((DEBUG_ERROR, "%a: failed to consume resource from: %s: %r\n", __func__, Private->Uri, Status));
+  }
+
+  //
+  // Release resource
+  //
+  if (Etag != NULL) {
+    FreePool (Etag);
   }
 
   //
@@ -196,10 +202,6 @@ RedfishResourceConsumeResource (
     Private->Json = NULL;
   }
 
-  if (Etag != NULL) {
-    FreePool (Etag);
-  }
-
   return Status;
 }
 
@@ -269,7 +271,7 @@ RedfishResourceUpdate (
   ZeroMem (&Response, sizeof (Response));
   Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response, TRUE);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__, Uri));
+    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func__, Uri));
     return Status;
   }
 
@@ -282,7 +284,12 @@ RedfishResourceUpdate (
 
   Status = RedfishUpdateResourceCommon (Private, Private->Json);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, failed to update resource from: %s: %r\n", __func__, Uri, Status));
+    DEBUG ((DEBUG_ERROR, "%a: failed to update resource to: %s: %r\n", __func__, Uri, Status));
+  } else {
+    //
+    // Get latest ETag on URI and keep it in variable.
+    //
+    SetEtagFromUri (Private->RedfishService, Private->Uri, TRUE);
   }
 
   //
@@ -342,7 +349,7 @@ RedfishResourceCheck (
   ZeroMem (&Response, sizeof (Response));
   Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response, TRUE);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__, Uri));
+    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func__, Uri));
     return Status;
   }
 
@@ -360,12 +367,16 @@ RedfishResourceCheck (
   GetHttpResponseEtag (&Response, &Etag);
   Status = RedfishCheckResourceCommon (Private, Private->Json, Etag);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %s: %r\n", __func__, Uri, Status));
+    DEBUG ((DEBUG_ERROR, "%a: failed to check resource from: %s: %r\n", __func__, Uri, Status));
   }
 
   //
   // Release resource
   //
+  if (Etag != NULL) {
+    FreePool (Etag);
+  }
+
   if (Private->Payload != NULL) {
     RedfishFreeResponse (
       Response.StatusCode,
@@ -419,7 +430,7 @@ RedfishResourceIdentify (
   ZeroMem (&Response, sizeof (Response));
   Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response, TRUE);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__, Uri));
+    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func__, Uri));
     return Status;
   }
 
@@ -432,7 +443,7 @@ RedfishResourceIdentify (
 
   Status = RedfishIdentifyResourceCommon (Private, Private->Json);
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, identify %s failed: %r\n", __func__, Uri, Status));
+    DEBUG ((DEBUG_ERROR, "%a: identify %s failed: %r\n", __func__, Uri, Status));
   }
 
   //
@@ -570,7 +581,7 @@ EfiRestJasonStructureProtocolIsReady (
                   (VOID **)&mRedfishResourcePrivate->JsonStructProtocol
                   );
   if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a, failed to locate gEfiRestJsonStructureProtocolGuid: %r\n", __func__, Status));
+    DEBUG ((DEBUG_ERROR, "%a: failed to locate gEfiRestJsonStructureProtocolGuid: %r\n", __func__, Status));
   }
 
   gBS->CloseEvent (Event);
@@ -645,7 +656,6 @@ RedfishResourceUnload (
   @param[in]   SystemTable      A pointer to the EFI System Table.
 
   @retval EFI_SUCCESS           The operation completed successfully.
-  @retval EFI_ACCESS_DENIED     EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly.
   @retval Others                Other errors as indicated.
 **/
 EFI_STATUS
-- 
2.37.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114486): https://edk2.groups.io/g/devel/message/114486
Mute This Topic: https://groups.io/mt/103968965/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [edk2-redfish-client][PATCH V2] RedfishClientPkg/FeatureDriver: ComputerSystem_1_5_0 driver
Posted by Nickle Wang via groups.io 9 months, 2 weeks ago
Reviewed-by: Nickle Wang <nicklew@nvidia.com>

Regards,
Nickle

> -----Original Message-----
> From: abner.chang@amd.com <abner.chang@amd.com>
> Sent: Friday, January 26, 2024 10:29 AM
> To: devel@edk2.groups.io
> Cc: Nickle Wang <nicklew@nvidia.com>; Igor Kulchytskyy <igork@ami.com>
> Subject: [edk2-redfish-client][PATCH V2] RedfishClientPkg/FeatureDriver:
> ComputerSystem_1_5_0 driver
> 
> External email: Use caution opening links or attachments
> 
> 
> From: Abner Chang <abner.chang@amd.com>
> 
> Update Redfish ComputerSystem_1_5_0 feature driver to align the
> implementation with latest code. This driver handles all of ComputerSystem
> v1_5_0 properties and incorporate with Redfish simualtor.
> 
> Signed-off-by: Abner Chang <abner.chang@amd.com>
> Cc: Nickle Wang <nicklew@nvidia.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> ---
>  .../v1_5_0/Dxe/ComputerSystemDxe.inf          |   1 +
>  .../v1_5_0/Common/ComputerSystemCommon.c      | 347 ++++++++++++------
>  .../v1_5_0/Dxe/ComputerSystemDxe.c            |  64 ++--
>  3 files changed, 271 insertions(+), 141 deletions(-)
> 
> diff --git
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDx
> e.inf
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDx
> e.inf
> index 36cbe06211..4e7dc5c7c5 100644
> ---
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDx
> e.inf
> +++
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystem
> +++ Dxe.inf
> @@ -37,6 +37,7 @@
>    RedfishResourceIdentifyLib
>    UefiLib
>    UefiDriverEntryPoint
> +  RedfishAddendumLib
>    RedfishHttpCacheLib
> 
>  [Protocols]
> diff --git
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSyste
> mCommon.c
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSyste
> mCommon.c
> index 3ace03bd4c..a67ef3dac2 100644
> ---
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSyste
> mCommon.c
> +++
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/ComputerSys
> +++ temCommon.c
> @@ -53,7 +53,7 @@ RedfishConsumeResourceCommon (
>                                            (EFI_REST_JSON_STRUCTURE_HEADER
> **)&ComputerSystem
>                                            );
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, ToStructure() failed: %r\n", __func__, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: ToStructure() failed: %r\n", __func__,
> + Status));
>      return Status;
>    }
> 
> @@ -66,8 +66,8 @@ RedfishConsumeResourceCommon (
>      //
>      // No change
>      //
> -    DEBUG ((DEBUG_MANAGEABILITY, "%a, ETAG: %s has no change, ignore
> consume action\n", __func__, Private->Uri));
> -    Status = EFI_ALREADY_STARTED;
> +    DEBUG ((DEBUG_MANAGEABILITY, "%a: ETAG: %s has no change, ignore
> consume action\n", __func__, Private->Uri));
> +    Status = EFI_SUCCESS;
>      goto ON_RELEASE;
>    }
> 
> @@ -154,12 +154,12 @@ RedfishConsumeResourceCommon (
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringArrayType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot-
> >BootOrder);
>        if (EFI_ERROR (Status)) {
> -        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__,
> ConfigureLang, Status));
> +        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>        }
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n",
> __func__, Private->Uri));
> +      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI:
> + %s\n", __func__, Private->Uri));
>      }
>    }
> 
> @@ -174,12 +174,12 @@ RedfishConsumeResourceCommon (
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot-
> >BootSourceOverrideEnabled);
>        if (EFI_ERROR (Status)) {
> -        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__,
> ConfigureLang, Status));
> +        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>        }
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n",
> __func__, Private->Uri));
> +      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI:
> + %s\n", __func__, Private->Uri));
>      }
>    }
> 
> @@ -194,12 +194,12 @@ RedfishConsumeResourceCommon (
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot-
> >BootSourceOverrideMode);
>        if (EFI_ERROR (Status)) {
> -        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__,
> ConfigureLang, Status));
> +        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>        }
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n",
> __func__, Private->Uri));
> +      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI:
> + %s\n", __func__, Private->Uri));
>      }
>    }
> 
> @@ -234,12 +234,12 @@ RedfishConsumeResourceCommon (
>      if (ConfigureLang != NULL) {
>        Status = ApplyFeatureSettingsStringType (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, ConfigureLang, ComputerSystemCs->Boot-
> >UefiTargetBootSourceOverride);
>        if (EFI_ERROR (Status)) {
> -        DEBUG ((DEBUG_ERROR, "%a, apply setting for %s failed: %r\n", __func__,
> ConfigureLang, Status));
> +        DEBUG ((DEBUG_ERROR, "%a: apply setting for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>        }
> 
>        FreePool (ConfigureLang);
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, can not get configure language for URI: %s\n",
> __func__, Private->Uri));
> +      DEBUG ((DEBUG_ERROR, "%a: can not get configure language for URI:
> + %s\n", __func__, Private->Uri));
>      }
>    }
> 
> @@ -742,9 +742,9 @@ ON_RELEASE:
> 
>  EFI_STATUS
>  ProvisioningComputerSystemProperties (
> -  IN  EFI_REST_JSON_STRUCTURE_PROTOCOL *JsonStructProtocol,
> -  IN  CHAR8 *InputJson,
> -  IN  CHAR8 *ResourceId, OPTIONAL
> +  IN  EFI_REST_JSON_STRUCTURE_PROTOCOL  *JsonStructProtocol,
> +  IN  CHAR8                             *InputJson,
> +  IN  CHAR8                             *ResourceId OPTIONAL,
>    IN  EFI_STRING                        ConfigureLang,
>    IN  BOOLEAN                           ProvisionMode,
>    OUT CHAR8                             **ResultJson
> @@ -752,6 +752,8 @@ ProvisioningComputerSystemProperties (  {
>    EFI_REDFISH_COMPUTERSYSTEM_V1_5_0     *ComputerSystem;
>    EFI_REDFISH_COMPUTERSYSTEM_V1_5_0_CS  *ComputerSystemCs;
> +  EFI_REDFISH_COMPUTERSYSTEM_V1_5_0     *ComputerSystemEmpty;
> +  EFI_REDFISH_COMPUTERSYSTEM_V1_5_0_CS  *ComputerSystemCsEmpty;
>    EFI_STATUS                            Status;
>    BOOLEAN                               PropertyChanged;
>    CHAR8                                 *AsciiStringValue;
> @@ -778,17 +780,33 @@ ProvisioningComputerSystemProperties (
>                                           (EFI_REST_JSON_STRUCTURE_HEADER
> **)&ComputerSystem
>                                           );
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, ToStructure failure: %r\n", __func__, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: ToStructure failure: %r\n", __func__, Status));
> +    return Status;
> +  }
> +
> +  ComputerSystemEmpty = NULL;
> +  Status              = JsonStructProtocol->ToStructure (
> +                                              JsonStructProtocol,
> +                                              NULL,
> +                                              ComputerSystemEmptyJson,
> +                                              (EFI_REST_JSON_STRUCTURE_HEADER
> **)&ComputerSystemEmpty
> +                                              );  if (EFI_ERROR
> + (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a: ToStructure failure: %r\n", __func__,
> + Status));
>      return Status;
>    }
> 
>    ComputerSystemCs = ComputerSystem->ComputerSystem;
> +  //
> +  // Initial an empty ComputerSystemCS
> +  //
> +  ComputerSystemCsEmpty = ComputerSystemEmpty->ComputerSystem;
> 
>    //
>    // ID
>    //
>    if ((ComputerSystemCs->Id == NULL) && !IS_EMPTY_STRING (ResourceId)) {
> -    ComputerSystemCs->Id = AllocateCopyPool (AsciiStrSize (ResourceId),
> ResourceId);
> +    ComputerSystemCsEmpty->Id = AllocateCopyPool (AsciiStrSize
> + (ResourceId), ResourceId);
>    }
> 
>    //
> @@ -798,8 +816,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"AssetTag", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->AssetTag,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->AssetTag = AsciiStringValue;
> -        PropertyChanged            = TRUE;
> +        ComputerSystemCsEmpty->AssetTag = AsciiStringValue;
> +        PropertyChanged                 = TRUE;
>        }
>      }
>    }
> @@ -811,8 +829,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"BiosVersion", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->BiosVersion,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->BiosVersion = AsciiStringValue;
> -        PropertyChanged               = TRUE;
> +        ComputerSystemCsEmpty->BiosVersion = AsciiStringValue;
> +        PropertyChanged                    = TRUE;
>        }
>      }
>    }
> @@ -828,8 +846,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Boot/BootNext", ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot->BootNext,
> AsciiStringValue) != 0)) {
> -          ComputerSystemCs->Boot->BootNext = AsciiStringValue;
> -          PropertyChanged                  = TRUE;
> +          ComputerSystemCsEmpty->Boot->BootNext = AsciiStringValue;
> +          PropertyChanged                       = TRUE;
>          }
>        }
>      }
> @@ -841,7 +859,7 @@ ProvisioningComputerSystemProperties (
>        AsciiStringArrayValue = GetPropertyStringArrayValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Boot/BootOrder", ConfigureLang, &ArraySize);
>        if (AsciiStringArrayValue != NULL) {
>          if (ProvisionMode || !CompareRedfishStringArrayValues
> (ComputerSystemCs->Boot->BootOrder, AsciiStringArrayValue, ArraySize)) {
> -          AddRedfishCharArray (&ComputerSystemCs->Boot->BootOrder,
> AsciiStringArrayValue, ArraySize);
> +          AddRedfishCharArray (&ComputerSystemCsEmpty->Boot->BootOrder,
> + AsciiStringArrayValue, ArraySize);
>            PropertyChanged = TRUE;
>          }
>        }
> @@ -854,8 +872,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Boot/BootSourceOverrideEnabled",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot-
> >BootSourceOverrideEnabled, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->Boot->BootSourceOverrideEnabled =
> AsciiStringValue;
> -          PropertyChanged                                   = TRUE;
> +          ComputerSystemCsEmpty->Boot->BootSourceOverrideEnabled =
> AsciiStringValue;
> +          PropertyChanged                                        = TRUE;
>          }
>        }
>      }
> @@ -867,8 +885,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Boot/BootSourceOverrideMode",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot-
> >BootSourceOverrideMode, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->Boot->BootSourceOverrideMode = AsciiStringValue;
> -          PropertyChanged                                = TRUE;
> +          ComputerSystemCsEmpty->Boot->BootSourceOverrideMode =
> AsciiStringValue;
> +          PropertyChanged                                     = TRUE;
>          }
>        }
>      }
> @@ -880,8 +898,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Boot/BootSourceOverrideTarget",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot-
> >BootSourceOverrideTarget, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->Boot->BootSourceOverrideTarget = AsciiStringValue;
> -          PropertyChanged                                  = TRUE;
> +          ComputerSystemCsEmpty->Boot->BootSourceOverrideTarget =
> AsciiStringValue;
> +          PropertyChanged                                       = TRUE;
>          }
>        }
>      }
> @@ -893,8 +911,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Boot/UefiTargetBootSourceOverride",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Boot-
> >UefiTargetBootSourceOverride, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->Boot->UefiTargetBootSourceOverride =
> AsciiStringValue;
> -          PropertyChanged                                      = TRUE;
> +          ComputerSystemCsEmpty->Boot->UefiTargetBootSourceOverride =
> AsciiStringValue;
> +          PropertyChanged                                           = TRUE;
>          }
>        }
>      }
> @@ -907,8 +925,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"HostName", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->HostName,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->HostName = AsciiStringValue;
> -        PropertyChanged            = TRUE;
> +        ComputerSystemCsEmpty->HostName = AsciiStringValue;
> +        PropertyChanged                 = TRUE;
>        }
>      }
>    }
> @@ -926,9 +944,9 @@ ProvisioningComputerSystemProperties (
>          if (ProvisionMode || (*ComputerSystemCs->HostWatchdogTimer-
> >FunctionEnabled != *BooleanValue)) {
>            IntegerValue = AllocatePool (sizeof (*IntegerValue));
>            if (IntegerValue != NULL) {
> -            *IntegerValue                                        = (BooleanValue ? 0x01 : 0x00);
> -            ComputerSystemCs->HostWatchdogTimer->FunctionEnabled =
> IntegerValue;
> -            PropertyChanged                                      = TRUE;
> +            *IntegerValue                                             = (BooleanValue ? 0x01 : 0x00);
> +            ComputerSystemCsEmpty->HostWatchdogTimer->FunctionEnabled =
> IntegerValue;
> +            PropertyChanged                                           = TRUE;
>            }
>          }
>        }
> @@ -941,8 +959,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"HostWatchdogTimer/TimeoutAction",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs-
> >HostWatchdogTimer->TimeoutAction, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->HostWatchdogTimer->TimeoutAction =
> AsciiStringValue;
> -          PropertyChanged                                    = TRUE;
> +          ComputerSystemCsEmpty->HostWatchdogTimer->TimeoutAction =
> AsciiStringValue;
> +          PropertyChanged                                         = TRUE;
>          }
>        }
>      }
> @@ -954,8 +972,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"HostWatchdogTimer/WarningAction",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs-
> >HostWatchdogTimer->WarningAction, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->HostWatchdogTimer->WarningAction =
> AsciiStringValue;
> -          PropertyChanged                                    = TRUE;
> +          ComputerSystemCsEmpty->HostWatchdogTimer->WarningAction =
> AsciiStringValue;
> +          PropertyChanged                                         = TRUE;
>          }
>        }
>      }
> @@ -964,7 +982,7 @@ ProvisioningComputerSystemProperties (
>    //
>    // Handle HOSTEDSERVICES
>    //
> -  if (ComputerSystemCs->HostedServices != NULL) {
> +  if (ComputerSystemCsEmpty->HostedServices != NULL) {
>    }
> 
>    //
> @@ -981,8 +999,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"IndicatorLED", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->IndicatorLED,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->IndicatorLED = AsciiStringValue;
> -        PropertyChanged                = TRUE;
> +        ComputerSystemCsEmpty->IndicatorLED = AsciiStringValue;
> +        PropertyChanged                     = TRUE;
>        }
>      }
>    }
> @@ -994,8 +1012,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Manufacturer", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Manufacturer,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->Manufacturer = AsciiStringValue;
> -        PropertyChanged                = TRUE;
> +        ComputerSystemCsEmpty->Manufacturer = AsciiStringValue;
> +        PropertyChanged                     = TRUE;
>        }
>      }
>    }
> @@ -1011,8 +1029,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemorySummary/MemoryMirroring",
> ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->MemorySummary-
> >MemoryMirroring, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->MemorySummary->MemoryMirroring =
> AsciiStringValue;
> -          PropertyChanged                                  = TRUE;
> +          ComputerSystemCsEmpty->MemorySummary->MemoryMirroring =
> AsciiStringValue;
> +          PropertyChanged                                       = TRUE;
>          }
>        }
>      }
> @@ -1024,8 +1042,8 @@ ProvisioningComputerSystemProperties (
>        NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"MemorySummary/TotalSystemMemoryGiB",
> ConfigureLang);
>        if (NumericValue != NULL) {
>          if (ProvisionMode || (*ComputerSystemCs->MemorySummary-
> >TotalSystemMemoryGiB != *NumericValue)) {
> -          ComputerSystemCs->MemorySummary->TotalSystemMemoryGiB =
> NumericValue;
> -          PropertyChanged                                       = TRUE;
> +          ComputerSystemCsEmpty->MemorySummary->TotalSystemMemoryGiB =
> NumericValue;
> +          PropertyChanged                                            = TRUE;
>          }
>        }
>      }
> @@ -1037,8 +1055,8 @@ ProvisioningComputerSystemProperties (
>        NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION,
> L"MemorySummary/TotalSystemPersistentMemoryGiB", ConfigureLang);
>        if (NumericValue != NULL) {
>          if (ProvisionMode || (*ComputerSystemCs->MemorySummary-
> >TotalSystemPersistentMemoryGiB != *NumericValue)) {
> -          ComputerSystemCs->MemorySummary-
> >TotalSystemPersistentMemoryGiB = NumericValue;
> -          PropertyChanged                                                 = TRUE;
> +          ComputerSystemCsEmpty->MemorySummary-
> >TotalSystemPersistentMemoryGiB = NumericValue;
> +          PropertyChanged                                                      = TRUE;
>          }
>        }
>      }
> @@ -1051,8 +1069,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"Model", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->Model,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->Model = AsciiStringValue;
> -        PropertyChanged         = TRUE;
> +        ComputerSystemCsEmpty->Model = AsciiStringValue;
> +        PropertyChanged              = TRUE;
>        }
>      }
>    }
> @@ -1078,8 +1096,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"PartNumber", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->PartNumber,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->PartNumber = AsciiStringValue;
> -        PropertyChanged              = TRUE;
> +        ComputerSystemCsEmpty->PartNumber = AsciiStringValue;
> +        PropertyChanged                   = TRUE;
>        }
>      }
>    }
> @@ -1091,8 +1109,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"PowerState", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->PowerState,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->PowerState = AsciiStringValue;
> -        PropertyChanged              = TRUE;
> +        ComputerSystemCsEmpty->PowerState = AsciiStringValue;
> +        PropertyChanged                   = TRUE;
>        }
>      }
>    }
> @@ -1108,8 +1126,8 @@ ProvisioningComputerSystemProperties (
>        NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"ProcessorSummary/Count", ConfigureLang);
>        if (NumericValue != NULL) {
>          if (ProvisionMode || (*ComputerSystemCs->ProcessorSummary->Count !=
> *NumericValue)) {
> -          ComputerSystemCs->ProcessorSummary->Count = NumericValue;
> -          PropertyChanged                           = TRUE;
> +          ComputerSystemCsEmpty->ProcessorSummary->Count = NumericValue;
> +          PropertyChanged                                = TRUE;
>          }
>        }
>      }
> @@ -1121,8 +1139,8 @@ ProvisioningComputerSystemProperties (
>        NumericValue = GetPropertyNumericValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"ProcessorSummary/LogicalProcessorCount",
> ConfigureLang);
>        if (NumericValue != NULL) {
>          if (ProvisionMode || (*ComputerSystemCs->ProcessorSummary-
> >LogicalProcessorCount != *NumericValue)) {
> -          ComputerSystemCs->ProcessorSummary->LogicalProcessorCount =
> NumericValue;
> -          PropertyChanged                                           = TRUE;
> +          ComputerSystemCsEmpty->ProcessorSummary->LogicalProcessorCount =
> NumericValue;
> +          PropertyChanged                                                = TRUE;
>          }
>        }
>      }
> @@ -1134,8 +1152,8 @@ ProvisioningComputerSystemProperties (
>        AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"ProcessorSummary/Model", ConfigureLang);
>        if (AsciiStringValue != NULL) {
>          if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->ProcessorSummary-
> >Model, AsciiStringValue) != 0)) {
> -          ComputerSystemCs->ProcessorSummary->Model = AsciiStringValue;
> -          PropertyChanged                           = TRUE;
> +          ComputerSystemCsEmpty->ProcessorSummary->Model = AsciiStringValue;
> +          PropertyChanged                                = TRUE;
>          }
>        }
>      }
> @@ -1155,8 +1173,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SKU", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SKU,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->SKU = AsciiStringValue;
> -        PropertyChanged       = TRUE;
> +        ComputerSystemCsEmpty->SKU = AsciiStringValue;
> +        PropertyChanged            = TRUE;
>        }
>      }
>    }
> @@ -1168,8 +1186,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SerialNumber", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SerialNumber,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->SerialNumber = AsciiStringValue;
> -        PropertyChanged                = TRUE;
> +        ComputerSystemCsEmpty->SerialNumber = AsciiStringValue;
> +        PropertyChanged                     = TRUE;
>        }
>      }
>    }
> @@ -1181,8 +1199,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SubModel", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SubModel,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->SubModel = AsciiStringValue;
> -        PropertyChanged            = TRUE;
> +        ComputerSystemCsEmpty->SubModel = AsciiStringValue;
> +        PropertyChanged                 = TRUE;
>        }
>      }
>    }
> @@ -1194,8 +1212,8 @@ ProvisioningComputerSystemProperties (
>      AsciiStringValue = GetPropertyStringValue (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, L"SystemType", ConfigureLang);
>      if (AsciiStringValue != NULL) {
>        if (ProvisionMode || (AsciiStrCmp (ComputerSystemCs->SystemType,
> AsciiStringValue) != 0)) {
> -        ComputerSystemCs->SystemType = AsciiStringValue;
> -        PropertyChanged              = TRUE;
> +        ComputerSystemCsEmpty->SystemType = AsciiStringValue;
> +        PropertyChanged                   = TRUE;
>        }
>      }
>    }
> @@ -1212,14 +1230,24 @@ ProvisioningComputerSystemProperties (
>    //
>    Status = JsonStructProtocol->ToJson (
>                                   JsonStructProtocol,
> -                                 (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystem,
> +                                 (EFI_REST_JSON_STRUCTURE_HEADER
> + *)ComputerSystemEmpty,
>                                   ResultJson
>                                   );
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, ToJson() failed: %r\n", __func__, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: ToJson() failed: %r\n", __func__,
> + Status));
>      return Status;
>    }
> 
> +  if (PropertyChanged) {
> +    // Remove Redfish unchangeable properties.
> +    Status = RedfishRemoveUnchangeableProperties (ResultJson);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "%a: Fail to remove Redfish unchangeable
> properties from ResultJson.\n", __func__));
> +      *ResultJson = NULL;
> +      return Status;
> +    }
> +  }
> +
>    //
>    // Release resource.
>    //
> @@ -1228,6 +1256,17 @@ ProvisioningComputerSystemProperties (
>                          (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystem
>                          );
> 
> +  //
> +  // Free memory allocated for Computersystem empty CS  //  if
> + (ComputerSystemCsEmpty->Boot->BootOrder != NULL) {
> +    DestoryRedfishCharArray (ComputerSystemCsEmpty->Boot->BootOrder,
> + ArraySize);  }
> +
> +  JsonStructProtocol->DestoryStructure (
> +                        JsonStructProtocol,
> +                        (EFI_REST_JSON_STRUCTURE_HEADER *)ComputerSystemEmpty
> +                        );
>    return (PropertyChanged ? EFI_SUCCESS : EFI_NOT_FOUND);  }
> 
> @@ -1239,6 +1278,7 @@ ProvisioningComputerSystemResource (
>    )
>  {
>    CHAR8       *Json;
> +  CHAR8       *JsonWithAddendum;
>    EFI_STATUS  Status;
>    EFI_STRING  NewResourceLocation;
>    CHAR8       *EtagStr;
> @@ -1260,13 +1300,45 @@ ProvisioningComputerSystemResource (
>               &Json
>               );
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, provisioning resource for %s failed: %r\n",
> __func__, ConfigureLang, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: provisioning resource for %s failed:
> + %r\n", __func__, ConfigureLang, Status));
>      return Status;
>    }
> 
> +  //
> +  // Check and see if platform has OEM data or not  //  Status =
> + RedfishGetOemData (
> +             Private->Uri,
> +             RESOURCE_SCHEMA,
> +             RESOURCE_SCHEMA_VERSION,
> +             Json,
> +             &JsonWithAddendum
> +             );
> +  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
> +    FreePool (Json);
> +    Json             = JsonWithAddendum;
> +    JsonWithAddendum = NULL;
> +  }
> +
> +  //
> +  // Check and see if platform has addendum data or not  //  Status =
> + RedfishGetAddendumData (
> +             Private->Uri,
> +             RESOURCE_SCHEMA,
> +             RESOURCE_SCHEMA_VERSION,
> +             Json,
> +             &JsonWithAddendum
> +             );
> +  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
> +    FreePool (Json);
> +    Json             = JsonWithAddendum;
> +    JsonWithAddendum = NULL;
> +  }
> +
>    Status = CreatePayloadToPostResource (Private->RedfishService, Private-
> >Payload, Json, &NewResourceLocation, &EtagStr);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, post ComputerSystem resource for %s failed:
> %r\n", __func__, ConfigureLang, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: post ComputerSystem resource for %s
> + failed: %r\n", __func__, ConfigureLang, Status));
>      goto RELEASE_RESOURCE;
>    }
> 
> @@ -1279,16 +1351,12 @@ ProvisioningComputerSystemResource (
>      RedfishSetRedfishUri (ConfigureLang, NewResourceLocation);
>    }
> 
> -  //
> -  // Handle Etag
> -  //
> +RELEASE_RESOURCE:
> +
>    if (EtagStr != NULL) {
> -    SetEtagWithUri (EtagStr, NewResourceLocation);
>      FreePool (EtagStr);
>    }
> 
> -RELEASE_RESOURCE:
> -
>    if (NewResourceLocation != NULL) {
>      FreePool (NewResourceLocation);
>    }
> @@ -1315,7 +1383,7 @@ ProvisioningComputerSystemResources (
> 
>    Status = RedfishFeatureGetUnifiedArrayTypeConfigureLang
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION,
> REDPATH_ARRAY_PATTERN, &UnifiedConfigureLangList);
>    if (EFI_ERROR (Status) || (UnifiedConfigureLangList.Count == 0)) {
> -    DEBUG ((DEBUG_ERROR, "%a, No HII question found with configure language:
> %s: %r\n", __func__, REDPATH_ARRAY_PATTERN, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: No HII question found with configure
> + language: %s: %r\n", __func__, REDPATH_ARRAY_PATTERN, Status));
>      return EFI_NOT_FOUND;
>    }
> 
> @@ -1341,14 +1409,13 @@ ProvisioningComputerSystemExistResource (  {
>    EFI_STATUS  Status;
>    EFI_STRING  ConfigureLang;
> -  CHAR8       *EtagStr;
>    CHAR8       *Json;
> +  CHAR8       *JsonWithAddendum;
> 
>    if (Private == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  EtagStr       = NULL;
>    Json          = NULL;
>    ConfigureLang = NULL;
> 
> @@ -1367,29 +1434,55 @@ ProvisioningComputerSystemExistResource (
>               );
>    if (EFI_ERROR (Status)) {
>      if (Status == EFI_NOT_FOUND) {
> -      DEBUG ((REDFISH_DEBUG_TRACE, "%a, provisioning existing resource for %s
> ignored. Nothing changed\n", __func__, ConfigureLang));
> +      DEBUG ((DEBUG_MANAGEABILITY, "%a: provisioning existing resource for
> %s ignored. Nothing changed\n", __func__, ConfigureLang));
> +      Status = EFI_SUCCESS;
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, provisioning existing resource for %s failed:
> %r\n", __func__, ConfigureLang, Status));
> +      DEBUG ((DEBUG_ERROR, "%a: provisioning existing resource for %s
> + failed: %r\n", __func__, ConfigureLang, Status));
>      }
> 
>      goto ON_RELEASE;
>    }
> 
> -  DEBUG ((REDFISH_DEBUG_TRACE, "%a, provisioning existing resource for
> %s\n", __func__, ConfigureLang));
>    //
> -  // PUT back to instance
> +  // Check and see if platform has OEM data or not
>    //
> -  Status = CreatePayloadToPatchResource (Private->RedfishService, Private-
> >Payload, Json, &EtagStr);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, patch resource for %s failed: %r\n", __func__,
> ConfigureLang, Status));
> +  Status = RedfishGetOemData (
> +             Private->Uri,
> +             RESOURCE_SCHEMA,
> +             RESOURCE_SCHEMA_VERSION,
> +             Json,
> +             &JsonWithAddendum
> +             );
> +  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
> +    FreePool (Json);
> +    Json             = JsonWithAddendum;
> +    JsonWithAddendum = NULL;
>    }
> 
>    //
> -  // Handle Etag
> +  // Check and see if platform has addendum data or not
>    //
> -  if (EtagStr != NULL) {
> -    SetEtagWithUri (EtagStr, Private->Uri);
> -    FreePool (EtagStr);
> +  Status = RedfishGetAddendumData (
> +             Private->Uri,
> +             RESOURCE_SCHEMA,
> +             RESOURCE_SCHEMA_VERSION,
> +             Json,
> +             &JsonWithAddendum
> +             );
> +  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
> +    FreePool (Json);
> +    Json             = JsonWithAddendum;
> +    JsonWithAddendum = NULL;
> +  }
> +
> +  DEBUG ((DEBUG_MANAGEABILITY, "%a: provisioning existing resource for
> + %s\n", __func__, ConfigureLang));
> +
> +  //
> +  // PUT back to instance
> +  //
> +  Status = CreatePayloadToPatchResource (Private->RedfishService,
> + Private->Payload, Json, NULL);  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a: patch resource for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>    }
> 
>  ON_RELEASE:
> @@ -1458,7 +1551,7 @@ RedfishCheckResourceCommon (
>    }
> 
>    //
> -  // Check ETAG to see if we need to check this resource again or not.
> +  // Check ETAG to see if we need to check it
>    //
>    if (CheckEtag (Private->Uri, HeaderEtag, NULL)) {
>      //
> @@ -1470,12 +1563,12 @@ RedfishCheckResourceCommon (
> 
>    Status = RedfishPlatformConfigGetConfigureLang (RESOURCE_SCHEMA,
> RESOURCE_SCHEMA_VERSION, REDPATH_ARRAY_PATTERN, &ConfigureLangList,
> &Count);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, RedfishPlatformConfigGetConfigureLang failed:
> %r\n", __func__, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: failed: %r\n", __func__, Status));
>      return Status;
>    }
> 
>    if (Count == 0) {
> -    return EFI_NOT_FOUND;
> +    return EFI_UNSUPPORTED;
>    }
> 
>    Status = EFI_SUCCESS;
> @@ -1485,9 +1578,9 @@ RedfishCheckResourceCommon (
>        continue;
>      }
> 
> -    DEBUG ((DEBUG_MANAGEABILITY, "%a, [%d] check attribute for: %s\n",
> __func__, Index, Property));
> +    DEBUG ((DEBUG_MANAGEABILITY, "%a: [%d] check attribute for: %s\n",
> + __func__, Index, Property));
>      if (!MatchPropertyWithJsonContext (Property, Json)) {
> -      DEBUG ((DEBUG_MANAGEABILITY, "%a, property is missing: %s\n",
> __func__, Property));
> +      DEBUG ((DEBUG_MANAGEABILITY, "%a: property is missing: %s\n",
> + __func__, Property));
>        Status = EFI_NOT_FOUND;
>      }
>    }
> @@ -1515,14 +1608,13 @@ RedfishUpdateResourceCommon (  {
>    EFI_STATUS  Status;
>    CHAR8       *Json;
> +  CHAR8       *JsonWithAddendum;
>    EFI_STRING  ConfigureLang;
> -  CHAR8       *EtagStr;
> 
>    if ((Private == NULL) || IS_EMPTY_STRING (InputJson)) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  EtagStr       = NULL;
>    Json          = NULL;
>    ConfigureLang = NULL;
> 
> @@ -1541,29 +1633,55 @@ RedfishUpdateResourceCommon (
>               );
>    if (EFI_ERROR (Status)) {
>      if (Status == EFI_NOT_FOUND) {
> -      DEBUG ((REDFISH_DEBUG_TRACE, "%a, update resource for %s ignored.
> Nothing changed\n", __func__, ConfigureLang));
> +      DEBUG ((DEBUG_MANAGEABILITY, "%a: update resource for %s ignored.
> Nothing changed\n", __func__, ConfigureLang));
> +      Status = EFI_SUCCESS;
>      } else {
> -      DEBUG ((DEBUG_ERROR, "%a, update resource for %s failed: %r\n",
> __func__, ConfigureLang, Status));
> +      DEBUG ((DEBUG_ERROR, "%a: update resource for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>      }
> 
>      goto ON_RELEASE;
>    }
> 
> -  DEBUG ((REDFISH_DEBUG_TRACE, "%a, update resource for %s\n", __func__,
> ConfigureLang));
>    //
> -  // PUT back to instance
> +  // Check and see if platform has OEM data or not
>    //
> -  Status = CreatePayloadToPatchResource (Private->RedfishService, Private-
> >Payload, Json, &EtagStr);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, patch resource for %s failed: %r\n", __func__,
> ConfigureLang, Status));
> +  Status = RedfishGetOemData (
> +             Private->Uri,
> +             RESOURCE_SCHEMA,
> +             RESOURCE_SCHEMA_VERSION,
> +             Json,
> +             &JsonWithAddendum
> +             );
> +  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
> +    FreePool (Json);
> +    Json             = JsonWithAddendum;
> +    JsonWithAddendum = NULL;
>    }
> 
>    //
> -  // Handle Etag
> +  // Check and see if platform has addendum data or not
>    //
> -  if (EtagStr != NULL) {
> -    SetEtagWithUri (EtagStr, Private->Uri);
> -    FreePool (EtagStr);
> +  Status = RedfishGetAddendumData (
> +             Private->Uri,
> +             RESOURCE_SCHEMA,
> +             RESOURCE_SCHEMA_VERSION,
> +             Json,
> +             &JsonWithAddendum
> +             );
> +  if (!EFI_ERROR (Status) && (JsonWithAddendum != NULL)) {
> +    FreePool (Json);
> +    Json             = JsonWithAddendum;
> +    JsonWithAddendum = NULL;
> +  }
> +
> +  DEBUG ((REDFISH_DEBUG_TRACE, "%a: update resource for %s\n",
> + __func__, ConfigureLang));
> +
> +  //
> +  // PUT back to instance
> +  //
> +  Status = CreatePayloadToPatchResource (Private->RedfishService,
> + Private->Payload, Json, NULL);  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a: patch resource for %s failed: %r\n",
> + __func__, ConfigureLang, Status));
>    }
> 
>  ON_RELEASE:
> @@ -1604,11 +1722,12 @@ RedfishIdentifyResourceCommon (
>    if (Supported) {
>      Status = RedfishFeatureGetUnifiedArrayTypeConfigureLang
> (RESOURCE_SCHEMA, RESOURCE_SCHEMA_VERSION,
> REDPATH_ARRAY_PATTERN, &ConfigLangList);
>      if (EFI_ERROR (Status)) {
> -      DEBUG ((DEBUG_ERROR, "%a,
> RedfishFeatureGetUnifiedArrayTypeConfigureLang failed: %r\n", __func__,
> Status));
> +      DEBUG ((DEBUG_ERROR, "%a:
> + RedfishFeatureGetUnifiedArrayTypeConfigureLang failed: %r\n",
> + __func__, Status));
>        return Status;
>      }
> 
>      if (ConfigLangList.Count == 0) {
> +      DEBUG ((DEBUG_MANAGEABILITY, "%a:  No platform Redfish
> + ConfigureLang found for %s\n", __func__, Private->Uri));
>        return EFI_SUCCESS;
>      }
> 
> diff --git
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDx
> e.c
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDx
> e.c
> index 04ff5c8270..174a8176a8 100644
> ---
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystemDx
> e.c
> +++
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSystem
> +++ Dxe.c
> @@ -15,7 +15,7 @@ extern REDFISH_RESOURCE_COMMON_PRIVATE
> *mRedfishResourcePrivate;
>  extern EFI_HANDLE                       mRedfishResourceConfigProtocolHandle;
> 
>  /**
> -  Provisioning redfish resource by given URI.
> +  Provision redfish resource by given URI.
> 
>    @param[in]   This                Pointer to EFI_HP_REDFISH_HII_PROTOCOL
> instance.
>    @param[in]   Uri                 Target URI to create resource.
> @@ -42,7 +42,7 @@ RedfishResourceProvisioningResource (
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  DEBUG ((DEBUG_MANAGEABILITY, "%a, provisioning in %s mode\n", __func__,
> (PostMode ? L"POST" : L"PATCH")));
> +  DEBUG ((DEBUG_MANAGEABILITY, "%a: provisioning in %s mode\n",
> + __func__, (PostMode ? L"POST" : L"PATCH")));
> 
>    Private =
> REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL
> (This);
> 
> @@ -53,7 +53,7 @@ RedfishResourceProvisioningResource (
>    ZeroMem (&Response, sizeof (Response));
>    Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response,
> TRUE);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__,
> Uri));
> +    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n",
> + __func__, Uri));
>      return Status;
>    }
> 
> @@ -62,6 +62,14 @@ RedfishResourceProvisioningResource (
>    ASSERT (Private->Payload != NULL);
> 
>    Status = RedfishProvisioningResourceCommon (Private, !PostMode);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a: failed to provision resource to: %s:
> + %r\n", __func__, Uri, Status));  } else {
> +    //
> +    // Get latest ETag on URI and keep it in variable.
> +    //
> +    SetEtagFromUri (Private->RedfishService, Private->Uri, TRUE);  }
> 
>    //
>    // Release resource
> @@ -73,7 +81,6 @@ RedfishResourceProvisioningResource (
>        Response.Headers,
>        Response.Payload
>        );
> -    RedfishHttpResetResource (Uri);
>      Private->Payload = NULL;
>    }
> 
> @@ -118,7 +125,7 @@ RedfishResourceConsumeResource (
>    ZeroMem (&Response, sizeof (Response));
>    Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response,
> TRUE);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__,
> Uri));
> +    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n",
> + __func__, Uri));
>      return Status;
>    }
> 
> @@ -137,6 +144,7 @@ RedfishResourceConsumeResource (
>      Private->Uri     = PendingSettingUri;
>      ExpectedResponse = &PendingSettingResponse;
>    } else {
> +    DEBUG ((REDFISH_DEBUG_TRACE, "%a: No @Redfish.Settings is found\n",
> + __func__));
>      Private->Uri     = Uri;
>      ExpectedResponse = &Response;
>    }
> @@ -154,16 +162,14 @@ RedfishResourceConsumeResource (
>    GetHttpResponseEtag (ExpectedResponse, &Etag);
>    Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
> -    if (Status != EFI_ALREADY_STARTED) {
> -      DEBUG ((DEBUG_ERROR, "%a, failed to consume resource from: %s: %r\n",
> __func__, Uri, Status));
> -    }
> -  } else {
> -    //
> -    // Keep etag after consuming pending settings.
> -    //
> -    if (Etag != NULL) {
> -      SetEtagWithUri (Etag, Private->Uri);
> -    }
> +    DEBUG ((DEBUG_ERROR, "%a: failed to consume resource from: %s:
> + %r\n", __func__, Private->Uri, Status));  }
> +
> +  //
> +  // Release resource
> +  //
> +  if (Etag != NULL) {
> +    FreePool (Etag);
>    }
> 
>    //
> @@ -196,10 +202,6 @@ RedfishResourceConsumeResource (
>      Private->Json = NULL;
>    }
> 
> -  if (Etag != NULL) {
> -    FreePool (Etag);
> -  }
> -
>    return Status;
>  }
> 
> @@ -269,7 +271,7 @@ RedfishResourceUpdate (
>    ZeroMem (&Response, sizeof (Response));
>    Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response,
> TRUE);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__,
> Uri));
> +    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n",
> + __func__, Uri));
>      return Status;
>    }
> 
> @@ -282,7 +284,12 @@ RedfishResourceUpdate (
> 
>    Status = RedfishUpdateResourceCommon (Private, Private->Json);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to update resource from: %s: %r\n",
> __func__, Uri, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: failed to update resource to: %s: %r\n",
> + __func__, Uri, Status));  } else {
> +    //
> +    // Get latest ETag on URI and keep it in variable.
> +    //
> +    SetEtagFromUri (Private->RedfishService, Private->Uri, TRUE);
>    }
> 
>    //
> @@ -342,7 +349,7 @@ RedfishResourceCheck (
>    ZeroMem (&Response, sizeof (Response));
>    Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response,
> TRUE);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__,
> Uri));
> +    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n",
> + __func__, Uri));
>      return Status;
>    }
> 
> @@ -360,12 +367,16 @@ RedfishResourceCheck (
>    GetHttpResponseEtag (&Response, &Etag);
>    Status = RedfishCheckResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %s: %r\n",
> __func__, Uri, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: failed to check resource from: %s: %r\n",
> + __func__, Uri, Status));
>    }
> 
>    //
>    // Release resource
>    //
> +  if (Etag != NULL) {
> +    FreePool (Etag);
> +  }
> +
>    if (Private->Payload != NULL) {
>      RedfishFreeResponse (
>        Response.StatusCode,
> @@ -419,7 +430,7 @@ RedfishResourceIdentify (
>    ZeroMem (&Response, sizeof (Response));
>    Status = RedfishHttpGetResource (Private->RedfishService, Uri, &Response,
> TRUE);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, get resource from: %s failed\n", __func__,
> Uri));
> +    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n",
> + __func__, Uri));
>      return Status;
>    }
> 
> @@ -432,7 +443,7 @@ RedfishResourceIdentify (
> 
>    Status = RedfishIdentifyResourceCommon (Private, Private->Json);
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, identify %s failed: %r\n", __func__, Uri,
> Status));
> +    DEBUG ((DEBUG_ERROR, "%a: identify %s failed: %r\n", __func__, Uri,
> + Status));
>    }
> 
>    //
> @@ -570,7 +581,7 @@ EfiRestJasonStructureProtocolIsReady (
>                    (VOID **)&mRedfishResourcePrivate->JsonStructProtocol
>                    );
>    if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to locate
> gEfiRestJsonStructureProtocolGuid: %r\n", __func__, Status));
> +    DEBUG ((DEBUG_ERROR, "%a: failed to locate
> + gEfiRestJsonStructureProtocolGuid: %r\n", __func__, Status));
>    }
> 
>    gBS->CloseEvent (Event);
> @@ -645,7 +656,6 @@ RedfishResourceUnload (
>    @param[in]   SystemTable      A pointer to the EFI System Table.
> 
>    @retval EFI_SUCCESS           The operation completed successfully.
> -  @retval EFI_ACCESS_DENIED     EFI_ISCSI_INITIATOR_NAME_PROTOCOL was
> installed unexpectedly.
>    @retval Others                Other errors as indicated.
>  **/
>  EFI_STATUS
> --
> 2.37.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114489): https://edk2.groups.io/g/devel/message/114489
Mute This Topic: https://groups.io/mt/103968965/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-