[edk2][PATCH] edk2/RedfishPkg: Update Redfish Platform Config Protocol


Nickle Wang
 

Update EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL and add array type of
value support to EDKII_REDFISH_VALUE in order to support ordered list
op-code in HII. Modify corresponding function to support new type of
data structure.

Signed-off-by: Nickle Wang <nickle.wang@...>
Cc: Abner Chang <abner.chang@...>
Cc: Yang Atom <Atom.Yang@...>
Cc: Nick Ramirez <nramirez@...>
---
.../Protocol/EdkIIRedfishPlatformConfig.h | 301 +-
.../RedfishPlatformConfigDxe.c | 3087 ++++++++++-------
.../RedfishPlatformConfigDxe.h | 128 +-
.../RedfishPlatformConfigDxe.inf | 104 +-
.../RedfishPlatformConfigImpl.c | 2528 +++++++-------
.../RedfishPlatformConfigImpl.h | 571 +--
6 files changed, 3638 insertions(+), 3081 deletions(-)

diff --git a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h b/Red=
fishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
index 895b010227..bbbab90b03 100644
--- a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
+++ b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
@@ -1,147 +1,154 @@
-/** @file
- This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_H_
-
-typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL EDKII_REDFISH_PLATF=
ORM_CONFIG_PROTOCOL;
-
-/**
- Definition of EDKII_REDFISH_TYPE_VALUE
- **/
-typedef union {
- INT64 Integer;
- BOOLEAN Boolean;
- CHAR8 *Buffer;
-} EDKII_REDFISH_TYPE_VALUE;
-
-/**
- Definition of EDKII_REDFISH_VALUE_TYPES
- **/
-typedef enum {
- REDFISH_VALUE_TYPE_UNKNOWN =3D 0,
- REDFISH_VALUE_TYPE_INTEGER,
- REDFISH_VALUE_TYPE_BOOLEAN,
- REDFISH_VALUE_TYPE_STRING,
- REDFISH_VALUE_TYPE_MAX
-} EDKII_REDFISH_VALUE_TYPES;
-
-/**
- Definition of EDKII_REDFISH_VALUE
- **/
-typedef struct {
- EDKII_REDFISH_VALUE_TYPES Type;
- EDKII_REDFISH_TYPE_VALUE Value;
-} EDKII_REDFISH_VALUE;
-
-/**
- Get Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this confi=
gure Language.
- @param[out] Value The returned value.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- OUT EDKII_REDFISH_VALUE *Value
- );
-
-/**
- Set Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this confi=
gure Language.
- @param[in] Value The value to set.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- IN EDKII_REDFISH_VALUE Value
- );
-
-/**
- Get the list of Configure Language from platform configuration by the gi=
ven Schema and Pattern.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] Pattern The target Configure Language pattern.
- @param[out] ConfigureLangList The list of Configure Language.
- @param[out] Count The number of Configure Language in Con=
figureLangList.
-
- @retval EFI_SUCCESS ConfigureLangList is returned successfu=
lly.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING Pattern,
- OUT EFI_STRING **ConfigureLangList,
- OUT UINTN *Count
- );
-
-
-/**
- Get the list of supported Redfish schema from platform configuration on =
the give HII handle.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] HiiHandle The target handle to search. If handle =
is NULL,
- this function returns all schema from H=
II database.
- @param[out] SupportedSchema The supported schema list which is sepa=
rated by ';'.
- For example: "x-uefi-redfish-Memory.v1_=
7_1;x-uefi-redfish-Boot.v1_0_1"
- The SupportedSchema is allocated by the=
callee. It's caller's
- responsibility to free this buffer usin=
g FreePool().
-
- @retval EFI_SUCCESS Schema is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN EFI_HII_HANDLE HiiHandle, OPTION=
AL
- OUT CHAR8 **SupportedSchema
- );
-
-struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL {
- EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue;
- EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue;
- EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG GetConfigureLang;
- EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA GetSupportedSchema;
-};
-
-extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid;
-
-#endif
+/** @file=0D
+ This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL interface.=
=0D
+=0D
+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+**/=0D
+=0D
+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_=0D
+#define EDKII_REDFISH_PLATFORM_CONFIG_H_=0D
+=0D
+typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL EDKII_REDFISH_PLATF=
ORM_CONFIG_PROTOCOL;=0D
+=0D
+/**=0D
+ Definition of EDKII_REDFISH_TYPE_VALUE=0D
+ **/=0D
+typedef union {=0D
+ INT64 Integer;=0D
+ BOOLEAN Boolean;=0D
+ CHAR8 *Buffer;=0D
+ CHAR8 **StringArray;=0D
+ INT64 *IntegerArray;=0D
+ BOOLEAN *BooleanArray;=0D
+} EDKII_REDFISH_TYPE_VALUE;=0D
+=0D
+/**=0D
+ Definition of EDKII_REDFISH_VALUE_TYPES=0D
+ **/=0D
+typedef enum {=0D
+ REDFISH_VALUE_TYPE_UNKNOWN =3D 0,=0D
+ REDFISH_VALUE_TYPE_INTEGER,=0D
+ REDFISH_VALUE_TYPE_BOOLEAN,=0D
+ REDFISH_VALUE_TYPE_STRING,=0D
+ REDFISH_VALUE_TYPE_STRING_ARRAY,=0D
+ REDFISH_VALUE_TYPE_INTEGER_ARRAY,=0D
+ REDFISH_VALUE_TYPE_BOOLEAN_ARRAY,=0D
+ REDFISH_VALUE_TYPE_MAX=0D
+} EDKII_REDFISH_VALUE_TYPES;=0D
+=0D
+/**=0D
+ Definition of EDKII_REDFISH_VALUE=0D
+ **/=0D
+typedef struct {=0D
+ EDKII_REDFISH_VALUE_TYPES Type;=0D
+ EDKII_REDFISH_TYPE_VALUE Value;=0D
+ UINTN ArrayCount;=0D
+} EDKII_REDFISH_VALUE;=0D
+=0D
+/**=0D
+ Get Redfish value with the given Schema and Configure Language.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] Schema The Redfish schema to query.=0D
+ @param[in] Version The Redfish version to query.=0D
+ @param[in] ConfigureLang The target value which match this confi=
gure Language.=0D
+ @param[out] Value The returned value.=0D
+=0D
+ @retval EFI_SUCCESS Value is returned successfully.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+typedef=0D
+EFI_STATUS=0D
+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version,=0D
+ IN EFI_STRING ConfigureLang,=0D
+ OUT EDKII_REDFISH_VALUE *Value=0D
+ );=0D
+=0D
+/**=0D
+ Set Redfish value with the given Schema and Configure Language.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] Schema The Redfish schema to query.=0D
+ @param[in] Version The Redfish version to query.=0D
+ @param[in] ConfigureLang The target value which match this confi=
gure Language.=0D
+ @param[in] Value The value to set.=0D
+=0D
+ @retval EFI_SUCCESS Value is returned successfully.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+typedef=0D
+EFI_STATUS=0D
+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version,=0D
+ IN EFI_STRING ConfigureLang,=0D
+ IN EDKII_REDFISH_VALUE Value=0D
+ );=0D
+=0D
+/**=0D
+ Get the list of Configure Language from platform configuration by the gi=
ven Schema and RegexPattern.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] Schema The Redfish schema to query.=0D
+ @param[in] Version The Redfish version to query.=0D
+ @param[in] RegexPattern The target Configure Language pattern. =
This is used for regular expression matching.=0D
+ @param[out] ConfigureLangList The list of Configure Language.=0D
+ @param[out] Count The number of Configure Language in Con=
figureLangList.=0D
+=0D
+ @retval EFI_SUCCESS ConfigureLangList is returned successfu=
lly.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+typedef=0D
+EFI_STATUS=0D
+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version,=0D
+ IN EFI_STRING RegexPattern,=0D
+ OUT EFI_STRING **ConfigureLangList,=0D
+ OUT UINTN *Count=0D
+ );=0D
+=0D
+=0D
+/**=0D
+ Get the list of supported Redfish schema from platform configuration on =
the give HII handle.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] HiiHandle The target handle to search. If handle =
is NULL,=0D
+ this function returns all schema from H=
II database.=0D
+ @param[out] SupportedSchema The supported schema list which is sepa=
rated by ';'.=0D
+ For example: "x-uefi-redfish-Memory.v1_=
7_1;x-uefi-redfish-Boot.v1_0_1"=0D
+ The SupportedSchema is allocated by the=
callee. It's caller's=0D
+ responsibility to free this buffer usin=
g FreePool().=0D
+=0D
+ @retval EFI_SUCCESS Schema is returned successfully.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+typedef=0D
+EFI_STATUS=0D
+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA) (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN EFI_HII_HANDLE HiiHandle, OPTION=
AL=0D
+ OUT CHAR8 **SupportedSchema=0D
+ );=0D
+=0D
+struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL {=0D
+ EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue;=0D
+ EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue;=0D
+ EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG GetConfigureLang;=0D
+ EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA GetSupportedSchema;=
=0D
+};=0D
+=0D
+extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid;=0D
+=0D
+#endif=0D
diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c=
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
index 67818cccd2..971035f27d 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
@@ -1,1304 +1,1783 @@
-/** @file
-
- The implementation of EDKII Redfidh Platform Config Protocol.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "RedfishPlatformConfigDxe.h"
-#include "RedfishPlatformConfigImpl.h"
-
-REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =3D NULL;
-
-/**
- Compare two value in HII statement format.
-
- @param[in] Value1 Firt value to compare.
- @param[in] Value2 Second value to be compared.
-
- @retval UINTN 0 is retuned when two values are equal.
- 1 is returned when first value is greater than sec=
ond value.
- -1 is returned when second value is greater than f=
irst value.
-
-**/
-UINTN
-CompareHiiStatementValue (
- IN HII_STATEMENT_VALUE *Value1,
- IN HII_STATEMENT_VALUE *Value2
- )
-{
- INTN Result;
- UINT64 Data1;
- UINT64 Data2;
-
- if (Value1 =3D=3D NULL || Value2 =3D=3D NULL) {
- return 0xFF;
- }
-
- switch (Value1->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- Data1 =3D Value1->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- Data1 =3D Value1->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- Data1 =3D Value1->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- Data1 =3D Value1->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- Data1 =3D (Value1->Value.b ? 1 : 0);
- break;
- default:
- return 0xFF;
- }
-
- switch (Value2->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- Data2 =3D Value2->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- Data2 =3D Value2->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- Data2 =3D Value2->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- Data2 =3D Value2->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- Data2 =3D (Value2->Value.b ? 1 : 0);
- break;
- default:
- return 0xFF;
- }
-
- Result =3D (Data1 =3D=3D Data2 ? 0 : (Data1 > Data2 ? 1 : -1));
-
- return Result;
-}
-
-/**
- Convert HII value to the string in HII one-of opcode.
-
- @param[in] Statement Statement private instance
-
- @retval EFI_STRING_ID The string ID in HII database.
- 0 is returned when something goes wrong.
-
-**/
-EFI_STRING_ID
-HiiValueToOneOfOptionStringId (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement
- )
-{
- LIST_ENTRY *Link;
- HII_QUESTION_OPTION *Option;
-
- if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) {
- return 0;
- }
-
- if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {
- return 0;
- }
-
- Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead);
- while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {
- Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);
-
- if (CompareHiiStatementValue (&Statement->HiiStatement->Value, &Option=
->Value) =3D=3D 0) {
- return Option->Text;
- }
-
- Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link);
- }
-
- return 0;
-}
-
-/**
- Convert HII string to the value in HII one-of opcode.
-
- @param[in] Statement Statement private instance
- @param[in] Schema Schema string
- @param[in] HiiString Input string
- @param[out] Value Value returned
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-HiiStringToOneOfOptionValue (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,
- IN CHAR8 *Schema,
- IN EFI_STRING HiiString,
- OUT HII_STATEMENT_VALUE *Value
- )
-{
- LIST_ENTRY *Link;
- HII_QUESTION_OPTION *Option;
- EFI_STRING TmpString;
- BOOLEAN Found;
-
- if (Statement =3D=3D NULL || IS_EMPTY_STRING (HiiString) || Value =3D=3D=
NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) {
- return EFI_UNSUPPORTED;
- }
-
- if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {
- return EFI_NOT_FOUND;
- }
-
- Found =3D FALSE;
- Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead);
- while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {
- Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);
-
- TmpString =3D HiiGetRedfishString (Statement->ParentForm->ParentFormse=
t->HiiHandle, Schema, Option->Text);
- if (TmpString !=3D NULL) {
- if (StrCmp (TmpString, HiiString) =3D=3D 0) {
- CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));
- Found =3D TRUE;
- }
- FreePool (TmpString);
- }
-
- if (Found) {
- return EFI_SUCCESS;
- }
-
- Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link);
- }
-
- return EFI_NOT_FOUND;
-}
-
-/**
- Convert HII value to numeric value in Redfish format.
-
- @param[in] Value Value to be converted.
- @param[out] RedfishValue Value in Redfish format.
-
- @retval EFI_SUCCESS Redfish value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-HiiValueToRedfishNumeric (
- IN HII_STATEMENT_VALUE *Value,
- OUT EDKII_REDFISH_VALUE *RedfishValue
- )
-{
- if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- switch (Value->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer =3D (INT64)Value->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer =3D (INT64)Value->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer =3D (INT64)Value->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer =3D (INT64)Value->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- RedfishValue->Type =3D REDFISH_VALUE_TYPE_BOOLEAN;
- RedfishValue->Value.Boolean =3D Value->Value.b;
- break;
- default:
- RedfishValue->Type =3D REDFISH_VALUE_TYPE_UNKNOWN;
- break;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert numeric value in Redfish format to HII value.
-
- @param[in] RedfishValue Value in Redfish format to be converted.
- @param[out] Value HII value returned.
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishNumericToHiiValue (
- IN EDKII_REDFISH_VALUE *RedfishValue,
- OUT HII_STATEMENT_VALUE *Value
- )
-{
- if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- switch (RedfishValue->Type) {
- case REDFISH_VALUE_TYPE_INTEGER:
- Value->Type =3D EFI_IFR_TYPE_NUM_SIZE_64;
- Value->Value.u64 =3D (UINT64)RedfishValue->Value.Integer;
- break;
- case REDFISH_VALUE_TYPE_BOOLEAN:
- Value->Type =3D EFI_IFR_TYPE_BOOLEAN;
- Value->Value.b =3D RedfishValue->Value.Boolean;
- break;
- default:
- Value->Type =3D EFI_IFR_TYPE_UNDEFINED;
- break;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Return the full Redfish schema string from the given Schema and Version.
-
- Returned schema string is: Schema + '.' + Version
-
- @param[in] Schema Schema string
- @param[in] Version Schema version string
-
- @retval CHAR8 * Schema string. NULL when errors occur.
-
-**/
-CHAR8 *
-GetFullSchemaString (
- IN CHAR8 *Schema,
- IN CHAR8 *Version
- )
-{
- UINTN Size;
- CHAR8 *FullName;
-
- if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) {
- return NULL;
- }
-
- Size =3D AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize (Schema)=
+ AsciiStrSize (Version);
-
- FullName =3D AllocatePool (Size);
- if (FullName =3D=3D NULL) {
- DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__));
- return NULL;
- }
-
- AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX, Schem=
a, Version);
-
- return FullName;
-}
-
-/**
- Common implementation to get statement private instance.
-
- @param[in] RedfishPlatformConfigPrivate Private instance.
- @param[in] Schema Redfish schema string.
- @param[in] ConfigureLang Configure language that refe=
rs to this statement.
- @param[out] Statement Statement instance
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigGetStatementCommon (
- IN REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfig=
Private,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
-
- if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schema)=
|| IS_EMPTY_STRING (ConfigureLang) || Statement =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Statement =3D NULL;
-
- Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));
- return Status;
- }
-
- TargetStatement =3D GetStatementPrivateByConfigureLang (&RedfishPlatform=
ConfigPrivate->FormsetList, Schema, ConfigureLang);
- if (TargetStatement =3D=3D NULL) {
- DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the given=
%s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));
- return EFI_NOT_FOUND;
- }
-
- //
- // Find current HII question value.
- //
- Status =3D GetQuestionValue (
- TargetStatement->ParentForm->ParentFormset->HiiFormSet,
- TargetStatement->ParentForm->HiiForm,
- TargetStatement->HiiStatement,
- GetSetValueWithHiiDriver
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n",=
__FUNCTION__, Status));
- return Status;
- }
-
-
- if (TargetStatement->HiiStatement->Value.Type =3D=3D EFI_IFR_TYPE_UNDEFI=
NED) {
- return EFI_DEVICE_ERROR;
- }
-
- //
- // Return Value.
- //
- *Statement =3D TargetStatement;
-
- return EFI_SUCCESS;
-}
-
-/**
- Get Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this confi=
gure Language.
- @param[out] Value The returned value.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetValue (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- OUT EDKII_REDFISH_VALUE *Value
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
- EFI_STRING_ID StringId;
- CHAR8 *FullSchema;
- EFI_STRING HiiString;
- UINTN Size;
-
- if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Ver=
sion) || IS_EMPTY_STRING (ConfigureLang) || Value =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);
- Value->Type =3D REDFISH_VALUE_TYPE_UNKNOWN;
- FullSchema =3D NULL;
- HiiString =3D NULL;
-
- FullSchema =3D GetFullSchemaString (Schema, Version);
- if (FullSchema =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status =3D RedfishPlatformConfigGetStatementCommon (RedfishPlatformConfi=
gPrivate, FullSchema, ConfigureLang, &TargetStatement);
- if (EFI_ERROR (Status)) {
- goto RELEASE_RESOURCE;
- }
-
- switch (TargetStatement->HiiStatement->Operand) {
- case EFI_IFR_ONE_OF_OP:
- StringId =3D HiiValueToOneOfOptionStringId (TargetStatement);
- if (StringId =3D=3D 0) {
- ASSERT (FALSE);
- Status =3D EFI_DEVICE_ERROR;
- goto RELEASE_RESOURCE;
- }
-
- HiiString =3D HiiGetRedfishString (TargetStatement->ParentForm->Pare=
ntFormset->HiiHandle, FullSchema, StringId);
- if (HiiString =3D=3D NULL) {
- DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n",=
__FUNCTION__, StringId, FullSchema));
- Status =3D EFI_NOT_FOUND;
- goto RELEASE_RESOURCE;
- }
-
- Size =3D StrLen (HiiString) + 1;
- Value->Value.Buffer =3D AllocatePool (Size);
- if (Value->Value.Buffer =3D=3D NULL) {
- Status =3D EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
-
- UnicodeStrToAsciiStrS (HiiString, Value->Value.Buffer, Size);
- Value->Type =3D REDFISH_VALUE_TYPE_STRING;
-
- break;
- case EFI_IFR_STRING_OP:
- if (TargetStatement->HiiStatement->Value.Type !=3D EFI_IFR_TYPE_STRI=
NG) {
- ASSERT (FALSE);
- Status =3D EFI_DEVICE_ERROR;
- goto RELEASE_RESOURCE;
- }
-
- Value->Type =3D REDFISH_VALUE_TYPE_STRING;
- Value->Value.Buffer =3D AllocateCopyPool (StrSize ((CHAR16 *)TargetS=
tatement->HiiStatement->Value.Buffer), TargetStatement->HiiStatement->Value=
.Buffer);
- if (Value->Value.Buffer =3D=3D NULL) {
- Status =3D EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
- break;
- case EFI_IFR_CHECKBOX_OP:
- case EFI_IFR_NUMERIC_OP:
- Status =3D HiiValueToRedfishNumeric (&TargetStatement->HiiStatement-=
Value, Value);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish v=
alue: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
- break;
- default:
- DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please conta=
ct with author if we need to support this type.\n", __FUNCTION__, TargetSta=
tement->HiiStatement->Operand));
- ASSERT (FALSE);
- Status =3D EFI_UNSUPPORTED;
- goto RELEASE_RESOURCE;
- }
-
-RELEASE_RESOURCE:
-
- if (FullSchema !=3D NULL) {
- FreePool (FullSchema);
- }
-
- if (HiiString !=3D NULL) {
- FreePool (HiiString);
- }
-
- return Status;
-}
-
-/**
- Function to save question value into HII database.
-
- @param[in] HiiFormset HII form-set instance
- @param[in] HiiForm HII form instance
- @param[in] HiiStatement HII statement that keeps new value.
- @param[in] Value New value to applyu.
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigSaveQuestionValue (
- IN HII_FORMSET *HiiFormset,
- IN HII_FORM *HiiForm,
- IN HII_STATEMENT *HiiStatement,
- IN HII_STATEMENT_VALUE *Value
- )
-{
- EFI_STATUS Status;
-
- if (HiiFormset =3D=3D NULL || HiiForm =3D=3D NULL || HiiStatement =3D=3D=
NULL || Value =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status =3D SetQuestionValue (
- HiiFormset,
- HiiForm,
- HiiStatement,
- Value
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n", __FUNCT=
ION__, Status));
- return Status;
- }
-
- Status =3D SubmitForm (HiiFormset, HiiForm);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n", __FUNCTION__, =
Status));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Common implementation to set statement private instance.
-
- @param[in] RedfishPlatformConfigPrivate Private instance.
- @param[in] Schema Redfish schema string.
- @param[in] ConfigureLang Configure language that refe=
rs to this statement.
- @param[in] Statement Statement instance
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigSetStatementCommon (
- IN REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang,
- IN HII_STATEMENT_VALUE *StatementValue
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
- EFI_STRING TempBuffer;
-
- if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schema)=
|| IS_EMPTY_STRING (ConfigureLang) || StatementValue =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- TempBuffer =3D NULL;
-
- Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));
- return Status;
- }
-
- TargetStatement =3D GetStatementPrivateByConfigureLang (&RedfishPlatform=
ConfigPrivate->FormsetList, Schema, ConfigureLang);
- if (TargetStatement =3D=3D NULL) {
- DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the given=
%s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));
- return EFI_NOT_FOUND;
- }
-
- if (StatementValue->Type !=3D TargetStatement->HiiStatement->Value.Type)=
{
- //
- // We treat one-of type as string in Redfish. But one-of statement is =
not
- // in string format from HII point of view. Do a patch here.
- //
- if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_ONE_OF_OP &&=
StatementValue->Type =3D=3D EFI_IFR_TYPE_STRING) {
- TempBuffer =3D AllocatePool (StatementValue->BufferLen * sizeof (CHA=
R16));
- if (TempBuffer =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- AsciiStrToUnicodeStrS (StatementValue->Buffer, TempBuffer, Statement=
Value->BufferLen);
- FreePool (StatementValue->Buffer);
- StatementValue->Buffer =3D NULL;
- StatementValue->BufferLen =3D 0;
-
- Status =3D HiiStringToOneOfOptionValue (TargetStatement, Schema, Tem=
pBuffer, StatementValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the given=
%s\n", __FUNCTION__, TempBuffer));
- FreePool (TempBuffer);
- return EFI_NOT_FOUND;
- }
-
- FreePool (TempBuffer);
- } else if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_NUMER=
IC_OP && StatementValue->Type =3D=3D EFI_IFR_TYPE_NUM_SIZE_64) {
- //
- // Redfish only has numeric value type and it does not care about th=
e value size.
- // Do a patch here so we have proper value size applied.
- //
- StatementValue->Type =3D TargetStatement->HiiStatement->Value.Type;
- } else {
- DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type: 0x%=
x but target value type: 0x%x\n", __FUNCTION__, StatementValue->Type, Targe=
tStatement->HiiStatement->Value.Type));
- ASSERT (FALSE);
- }
- }
-
- Status =3D RedfishPlatformConfigSaveQuestionValue (
- TargetStatement->ParentForm->ParentFormset->HiiFormSet,
- TargetStatement->ParentForm->HiiForm,
- TargetStatement->HiiStatement,
- StatementValue
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n", __FUNC=
TION__, Status));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Set Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this confi=
gure Language.
- @param[in] Value The value to set.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolSetValue (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- IN EDKII_REDFISH_VALUE Value
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate;
- CHAR8 *FullSchema;
- HII_STATEMENT_VALUE NewValue;
-
- if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Ver=
sion) || IS_EMPTY_STRING (ConfigureLang)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Value.Type =3D=3D REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=3D REDF=
ISH_VALUE_TYPE_MAX) {
- return EFI_INVALID_PARAMETER;
- }
-
- RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);
- FullSchema =3D NULL;
-
- FullSchema =3D GetFullSchemaString (Schema, Version);
- if (FullSchema =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE));
-
- switch (Value.Type) {
- case REDFISH_VALUE_TYPE_INTEGER:
- case REDFISH_VALUE_TYPE_BOOLEAN:
- Status =3D RedfishNumericToHiiValue (&Value, &NewValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii v=
alue: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
- break;
- case REDFISH_VALUE_TYPE_STRING:
- NewValue.Type =3D EFI_IFR_TYPE_STRING;
- NewValue.BufferLen =3D (UINT16)AsciiStrSize (Value.Value.Buffer);
- NewValue.Buffer =3D AllocateCopyPool (NewValue.BufferLen, Value.Valu=
e.Buffer);
- if (NewValue.Buffer =3D=3D NULL) {
- Status =3D EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
- break;
- default:
- ASSERT (FALSE);
- break;
- }
-
- Status =3D RedfishPlatformConfigSetStatementCommon (RedfishPlatformConfi=
gPrivate, FullSchema, ConfigureLang, &NewValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n", __F=
UNCTION__, Status));
- }
-
-RELEASE_RESOURCE:
-
- if (FullSchema !=3D NULL) {
- FreePool (FullSchema);
- }
-
- return Status;
-}
-
-/**
- Get the list of Configure Language from platform configuration by the gi=
ven Schema and Pattern.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] Pattern The target Configure Language pattern.
- @param[out] ConfigureLangList The list of Configure Language.
- @param[out] Count The number of Configure Language in Con=
figureLangList.
-
- @retval EFI_SUCCESS ConfigureLangList is returned successfu=
lly.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetConfigureLang (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING Pattern,
- OUT EFI_STRING **ConfigureLangList,
- OUT UINTN *Count
- )
-{
- REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPr=
ivate;
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
- LIST_ENTRY *NextLink;
- EFI_STRING TmpString;
- EFI_STRING *TmpConfigureLangList;
- UINTN Index;
- CHAR8 *FullSchema;
-
- if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Ver=
sion) || Count =3D=3D NULL || ConfigureLangList =3D=3D NULL || IS_EMPTY_STR=
ING (Pattern)) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Count =3D 0;
- *ConfigureLangList =3D NULL;
- FullSchema =3D NULL;
- RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);
-
- Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));
- return Status;
- }
-
- FullSchema =3D GetFullSchemaString (Schema, Version);
- if (FullSchema =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status =3D GetStatementPrivateByConfigureLangRegex (
- RedfishPlatformConfigPrivate->RegularExpressionProtocol,
- &RedfishPlatformConfigPrivate->FormsetList,
- FullSchema,
- Pattern,
- &StatementList
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, GetStatementPrivateByConfigureLangRegex fail=
ure: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
-
- if (!IsListEmpty (&StatementList.StatementList)) {
-
- TmpConfigureLangList =3D AllocateZeroPool (sizeof (CHAR16 *) * Stateme=
ntList.Count);
- if (TmpConfigureLangList =3D=3D NULL) {
- Status =3D EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
-
- Index =3D 0;
- NextLink =3D GetFirstNode (&StatementList.StatementList);
- while (!IsNull (&StatementList.StatementList, NextLink)) {
- StatementRef =3D REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (Ne=
xtLink);
- NextLink =3D GetNextNode (&StatementList.StatementList, NextLink);
-
- ASSERT (StatementRef->Statement->Description !=3D 0);
- if (StatementRef->Statement->Description !=3D 0) {
- TmpString =3D HiiGetRedfishString (StatementRef->Statement->Parent=
Form->ParentFormset->HiiHandle, FullSchema, StatementRef->Statement->Descri=
ption);
- ASSERT (TmpString !=3D NULL);
- if (TmpString !=3D NULL) {
- TmpConfigureLangList[Index] =3D AllocateCopyPool (StrSize (TmpSt=
ring), TmpString);
- ASSERT (TmpConfigureLangList[Index] !=3D NULL);
- FreePool (TmpString);
- ++Index;
- }
- }
- }
- }
-
- *Count =3D StatementList.Count;
- *ConfigureLangList =3D TmpConfigureLangList;
-
-RELEASE_RESOURCE:
-
- if (FullSchema !=3D NULL) {
- FreePool (FullSchema);
- }
-
- ReleaseStatementList (&StatementList);
-
- return Status;
-}
-
-
-/**
- Get the list of supported Redfish schema from paltform configuration on =
give HII handle.
-
- @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.
- @param[in] HiiHandle The target handle to search. If handle =
is NULL,
- this function return all schema from HI=
I database.
- @param[out] SupportedSchema The supported schema list which is sepa=
rated by ';'.
- The SupportedSchema is allocated by the=
callee. It's caller's
- responsibility to free this buffer usin=
g FreePool().
-
- @retval EFI_SUCCESS Schema is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetSupportedSchema (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN EFI_HII_HANDLE HiiHandle, OPTIONAL
- OUT CHAR8 **SupportedSchema
- )
-{
- REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate;
- EFI_STATUS Status;
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- UINTN Index;
- UINTN StringSize;
- CHAR8 *StringBuffer;
- UINTN StringIndex;
-
- if (This =3D=3D NULL || SupportedSchema =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *SupportedSchema =3D NULL;
-
- RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);
-
- Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));
- return Status;
- }
-
- if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Calculate for string buffer size.
- //
- StringSize =3D 0;
- HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate->FormsetL=
ist);
- while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, HiiFormsetLi=
nk)) {
- HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate->For=
msetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHandle=
) {
- HiiFormsetLink =3D HiiFormsetNextLink;
- continue;
- }
-
- if (HiiFormsetPrivate->SupportedSchema.Count > 0) {
- for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count; =
Index++) {
- StringSize +=3D AsciiStrSize (HiiFormsetPrivate->SupportedSchema.S=
chemaList[Index]);
- }
- }
-
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- if (StringSize =3D=3D 0) {
- return EFI_NOT_FOUND;
- }
-
- StringBuffer =3D AllocatePool (StringSize);
- if (StringBuffer =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- StringIndex =3D 0;
- HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate->FormsetL=
ist);
- while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, HiiFormsetLi=
nk)) {
- HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate->For=
msetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHandle=
) {
- HiiFormsetLink =3D HiiFormsetNextLink;
- continue;
- }
-
- if (HiiFormsetPrivate->SupportedSchema.Count > 0) {
- for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count; =
Index++) {
- AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringInde=
x), HiiFormsetPrivate->SupportedSchema.SchemaList[Index]);
- StringIndex +=3D AsciiStrLen (HiiFormsetPrivate->SupportedSchema.S=
chemaList[Index]);
- StringBuffer[StringIndex] =3D ';';
- ++StringIndex;
- }
- }
-
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- StringBuffer[--StringIndex] =3D '\0';
-
- *SupportedSchema =3D StringBuffer;
-
- return EFI_SUCCESS;
-}
-
-/**
- Functions which are registered to receive notification of
- database events have this prototype. The actual event is encoded
- in NotifyType. The following table describes how PackageType,
- PackageGuid, Handle, and Package are used for each of the
- notification types.
-
- @param[in] PackageType Package type of the notification.
- @param[in] PackageGuid If PackageType is
- EFI_HII_PACKAGE_TYPE_GUID, then this is
- the pointer to the GUID from the Guid
- field of EFI_HII_PACKAGE_GUID_HEADER.
- Otherwise, it must be NULL.
- @param[in] Package Points to the package referred to by the
- notification Handle The handle of the package
- list which contains the specified package.
- @param[in] Handle The HII handle.
- @param[in] NotifyType The type of change concerning the
- database. See
- EFI_HII_DATABASE_NOTIFY_TYPE.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigFormUpdateNotify (
- IN UINT8 PackageType,
- IN CONST EFI_GUID *PackageGuid,
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle,
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
- )
-{
- EFI_STATUS Status;
-
- if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType =3D=
=3D EFI_HII_DATABASE_NOTIFY_ADD_PACK) {
- //
- // HII formset on this handle is updated by driver during run-time. Th=
e formset needs to be reloaded.
- //
- Status =3D NotifyFormsetUpdate (Handle, &mRedfishPlatformConfigPrivate=
->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII ha=
ndle: 0x%x\n", __FUNCTION__, Handle));
- return Status;
- }
- } else if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) {
- //
- // HII resource is removed. The formset is no longer exist.
- //
- Status =3D NotifyFormsetDeleted (Handle, &mRedfishPlatformConfigPrivat=
e->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII ha=
ndle: 0x%x\n", __FUNCTION__, Handle));
- return Status;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- This is a EFI_HII_STRING_PROTOCOL notification event handler.
-
- Install HII package notification.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-HiiStringProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate HII database protocol.
- //
- Status =3D gBS->LocateProtocol (
- &gEfiHiiStringProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->HiiString
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure: %r\n=
", __FUNCTION__, Status));
- return;
- }
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D NULL;
-}
-
-/**
- This is a EFI_HII_DATABASE_PROTOCOL notification event handler.
-
- Install HII package notification.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-HiiDatabaseProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate HII database protocol.
- //
- Status =3D gBS->LocateProtocol (
- &gEfiHiiDatabaseProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL failure: %r=
\n", __FUNCTION__, Status));
- return;
- }
-
- //
- // Register package notification when new form package is installed.
- //
- Status =3D mRedfishPlatformConfigPrivate->HiiDatabase->RegisterPackageNo=
tify (
- mRedfishPlatformConfigPrivate=
->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpda=
teNotify,
- EFI_HII_DATABASE_NOTIFY_NEW_P=
ACK,
- &mRedfishPlatformConfigPrivat=
e->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for EFI_HII_DATABASE_N=
OTIFY_NEW_PACK failure: %r\n", __FUNCTION__, Status));
- }
-
- //
- // Register package notification when new form package is updated.
- //
- Status =3D mRedfishPlatformConfigPrivate->HiiDatabase->RegisterPackageNo=
tify (
- mRedfishPlatformConfigPrivate=
->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpda=
teNotify,
- EFI_HII_DATABASE_NOTIFY_ADD_P=
ACK,
- &mRedfishPlatformConfigPrivat=
e->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for EFI_HII_DATABASE_N=
OTIFY_NEW_PACK failure: %r\n", __FUNCTION__, Status));
- }
-
-#if REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET
- //
- // Register package notification when new form package is removed.
- //
- Status =3D mRedfishPlatformConfigPrivate->HiiDatabase->RegisterPackageNo=
tify (
- mRedfishPlatformConfigPrivate=
->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpda=
teNotify,
- EFI_HII_DATABASE_NOTIFY_REMOV=
E_PACK,
- &mRedfishPlatformConfigPrivat=
e->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for EFI_HII_DATABASE_N=
OTIFY_NEW_PACK failure: %r\n", __FUNCTION__, Status));
- }
-#endif
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D NULL;
-
-}
-
-/**
- This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-RegexProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate regular expression protocol.
- //
- Status =3D gBS->LocateProtocol (
- &gEfiRegularExpressionProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->RegularExpressi=
onProtocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_REGULAR_EXPRESSION_PROTOCOL failu=
re: %r\n", __FUNCTION__, Status));
- return;
- }
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D NULL;
-
-}
-
-/**
- Unloads an image.
-
- @param ImageHandle Handle that identifies the image to be unl=
oaded.
-
- @retval EFI_SUCCESS The image has been unloaded.
- @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigDxeUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- EFI_STATUS Status;
-
- if (mRedfishPlatformConfigPrivate !=3D NULL) {
- Status =3D gBS->UninstallProtocolInterface (
- mRedfishPlatformConfigPrivate->ImageHandle,
- &gEdkIIRedfishPlatformConfigProtocolGuid,
- (VOID*)&mRedfishPlatformConfigPrivate->Protocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, can not uninstall gEdkIIRedfishPlatformCon=
figProtocolGuid: %r\n", __FUNCTION__, Status));
- ASSERT (FALSE);
- }
-
- //
- // Close events
- //
- if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent !=3D NULL=
) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate->HiiDbNotify.Protocol=
Event);
- }
- if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent !=3D =
NULL) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate->HiiStringNotify.Prot=
ocolEvent);
- }
- if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent !=3D NULL=
) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate->RegexNotify.Protocol=
Event);
- }
-
- //
- // Unregister package notification.
- //
- if (mRedfishPlatformConfigPrivate->NotifyHandle !=3D NULL) {
- mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotify (
- mRedfishPlatformConfigPrivate->H=
iiDatabase,
- mRedfishPlatformConfigPrivate->N=
otifyHandle
- );
- }
-
- ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList);
- FreePool (mRedfishPlatformConfigPrivate);
- mRedfishPlatformConfigPrivate =3D NULL;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- This is the declaration of an EFI image entry point. This entry point is
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers includ=
ing
- both device drivers and bus drivers.
-
- @param ImageHandle The firmware allocated handle for the UEFI=
image.
- @param SystemTable A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval Others An unexpected error occurred.
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigDxeEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
-
- mRedfishPlatformConfigPrivate =3D (REDFISH_PLATFORM_CONFIG_PRIVATE *)All=
ocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE));
- if (mRedfishPlatformConfigPrivate =3D=3D NULL) {
- DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for REDFISH_PLATFORM_C=
ONFIG_PRIVATE\n", __FUNCTION__));
- ASSERT (FALSE);
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Protocol initialization
- //
- mRedfishPlatformConfigPrivate->ImageHandle =3D ImageHandle;
- mRedfishPlatformConfigPrivate->Protocol.GetValue =3D RedfishPlatformConf=
igProtocolGetValue;
- mRedfishPlatformConfigPrivate->Protocol.SetValue =3D RedfishPlatformConf=
igProtocolSetValue;
- mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =3D RedfishPlat=
formConfigProtocolGetConfigureLang;
- mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =3D RedfishPl=
atformConfigProtocolGetSupportedSchema;
-
- InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList);
- InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList);
-
- Status =3D gBS->InstallProtocolInterface (
- &ImageHandle,
- &gEdkIIRedfishPlatformConfigProtocolGuid,
- EFI_NATIVE_INTERFACE,
- (VOID*)&mRedfishPlatformConfigPrivate->Protocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, can not install gEdkIIRedfishPlatformConfigP=
rotocolGuid: %r\n", __FUNCTION__, Status));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if HII database protocol is installed.
- //
- mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D EfiCreatePr=
otocolNotifyEvent (
- &gEfiHiiData=
baseProtocolGuid,
- TPL_CALLBACK,
- HiiDatabaseP=
rotocolInstalled,
- NULL,
- &mRedfishPla=
tformConfigPrivate->HiiDbNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D=3D NULL=
) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for g=
EfiHiiDatabaseProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if HII string protocol is installed.
- //
- mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D EfiCrea=
teProtocolNotifyEvent (
- &gEfiHii=
StringProtocolGuid,
- TPL_CALL=
BACK,
- HiiStrin=
gProtocolInstalled,
- NULL,
- &mRedfis=
hPlatformConfigPrivate->HiiStringNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D=3D =
NULL) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for g=
EfiHiiStringProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if regular expression protocol is insta=
lled.
- //
- mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D EfiCreatePr=
otocolNotifyEvent (
- &gEfiRegular=
ExpressionProtocolGuid,
- TPL_CALLBACK,
- RegexProtoco=
lInstalled,
- NULL,
- &mRedfishPla=
tformConfigPrivate->RegexNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D=3D NULL=
) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for g=
EfiRegularExpressionProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- return EFI_SUCCESS;
-}
+/** @file=0D
+=0D
+ The implementation of EDKII Redfidh Platform Config Protocol.=0D
+=0D
+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+**/=0D
+=0D
+#include "RedfishPlatformConfigDxe.h"=0D
+#include "RedfishPlatformConfigImpl.h"=0D
+=0D
+REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =3D NULL;=0D
+=0D
+=0D
+/**=0D
+ Zero extend integer/boolean to UINT64 for comparing.=0D
+=0D
+ @param Value HII Value to be converted.=0D
+=0D
+**/=0D
+UINT64=0D
+ExtendHiiValueToU64 (=0D
+ IN HII_STATEMENT_VALUE *Value=0D
+ )=0D
+{=0D
+ UINT64 Temp;=0D
+=0D
+ Temp =3D 0;=0D
+ switch (Value->Type) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ Temp =3D Value->Value.u8;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ Temp =3D Value->Value.u16;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ Temp =3D Value->Value.u32;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_BOOLEAN:=0D
+ Temp =3D Value->Value.b;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_TIME:=0D
+ case EFI_IFR_TYPE_DATE:=0D
+ default:=0D
+ break;=0D
+ }=0D
+=0D
+ return Temp;=0D
+}=0D
+=0D
+/**=0D
+ Set value of a data element in an Array by its Index in ordered list buf=
fer.=0D
+=0D
+ @param Array The data array.=0D
+ @param Type Type of the data in this array.=0D
+ @param Index Zero based index for data in this array.=
=0D
+ @param Value The value to be set.=0D
+=0D
+**/=0D
+VOID=0D
+OrderedListSetArrayData (=0D
+ IN VOID *Array,=0D
+ IN UINT8 Type,=0D
+ IN UINTN Index,=0D
+ IN UINT64 Value=0D
+ )=0D
+{=0D
+=0D
+ ASSERT (Array !=3D NULL);=0D
+=0D
+ switch (Type) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ *(((UINT8 *) Array) + Index) =3D (UINT8) Value;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ *(((UINT16 *) Array) + Index) =3D (UINT16) Value;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ *(((UINT32 *) Array) + Index) =3D (UINT32) Value;=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_64:=0D
+ *(((UINT64 *) Array) + Index) =3D (UINT64) Value;=0D
+ break;=0D
+=0D
+ default:=0D
+ break;=0D
+ }=0D
+}=0D
+=0D
+/**=0D
+ Return data element in an Array by its Index in ordered list array buffe=
r.=0D
+=0D
+ @param Array The data array.=0D
+ @param Type Type of the data in this array.=0D
+ @param Index Zero based index for data in this array.=
=0D
+=0D
+ @retval Value The data to be returned=0D
+=0D
+**/=0D
+UINT64=0D
+OrderedListGetArrayData (=0D
+ IN VOID *Array,=0D
+ IN UINT8 Type,=0D
+ IN UINTN Index=0D
+ )=0D
+{=0D
+ UINT64 Data;=0D
+=0D
+ ASSERT (Array !=3D NULL);=0D
+=0D
+ Data =3D 0;=0D
+ switch (Type) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ Data =3D (UINT64) *(((UINT8 *) Array) + Index);=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ Data =3D (UINT64) *(((UINT16 *) Array) + Index);=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ Data =3D (UINT64) *(((UINT32 *) Array) + Index);=0D
+ break;=0D
+=0D
+ case EFI_IFR_TYPE_NUM_SIZE_64:=0D
+ Data =3D (UINT64) *(((UINT64 *) Array) + Index);=0D
+ break;=0D
+=0D
+ default:=0D
+ break;=0D
+ }=0D
+=0D
+ return Data;=0D
+}=0D
+=0D
+/**=0D
+ Find string ID of option if its value equals to given value.=0D
+=0D
+ @param[in] HiiStatement Statement to search.=0D
+ @param[in] Value Target value.=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STRING_ID=0D
+OrderedListOptionValueToStringId (=0D
+ IN HII_STATEMENT *HiiStatement,=0D
+ IN UINT64 Value=0D
+ )=0D
+{=0D
+ LIST_ENTRY *Link;=0D
+ HII_QUESTION_OPTION *Option;=0D
+ BOOLEAN Found;=0D
+ UINT64 CurrentValue;=0D
+=0D
+ if (HiiStatement =3D=3D NULL) {=0D
+ return 0;=0D
+ }=0D
+=0D
+ if (HiiStatement->Operand !=3D EFI_IFR_ORDERED_LIST_OP) {=0D
+ return 0;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&HiiStatement->OptionListHead)) {=0D
+ return 0;=0D
+ }=0D
+=0D
+ Found =3D FALSE;=0D
+ Link =3D GetFirstNode (&HiiStatement->OptionListHead);=0D
+ while (!IsNull (&HiiStatement->OptionListHead, Link)) {=0D
+ Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);=0D
+=0D
+ CurrentValue =3D ExtendHiiValueToU64 (&Option->Value);=0D
+ if (Value =3D=3D CurrentValue) {=0D
+ return Option->Text;=0D
+ }=0D
+=0D
+ Link =3D GetNextNode (&HiiStatement->OptionListHead, Link);=0D
+ }=0D
+=0D
+ return 0;=0D
+}=0D
+=0D
+/**=0D
+ Compare two value in HII statement format.=0D
+=0D
+ @param[in] Value1 Firt value to compare.=0D
+ @param[in] Value2 Second value to be compared.=0D
+=0D
+ @retval INTN 0 is retuned when two values are equal.=0D
+ 1 is returned when first value is greater than sec=
ond value.=0D
+ -1 is returned when second value is greater than f=
irst value.=0D
+=0D
+**/=0D
+INTN=0D
+CompareHiiStatementValue (=0D
+ IN HII_STATEMENT_VALUE *Value1,=0D
+ IN HII_STATEMENT_VALUE *Value2=0D
+ )=0D
+{=0D
+ INTN Result;=0D
+ UINT64 Data1;=0D
+ UINT64 Data2;=0D
+=0D
+ if (Value1 =3D=3D NULL || Value2 =3D=3D NULL) {=0D
+ return -1;=0D
+ }=0D
+=0D
+ switch (Value1->Type) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ Data1 =3D Value1->Value.u8;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ Data1 =3D Value1->Value.u16;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ Data1 =3D Value1->Value.u32;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_64:=0D
+ Data1 =3D Value1->Value.u64;=0D
+ break;=0D
+ case EFI_IFR_TYPE_BOOLEAN:=0D
+ Data1 =3D (Value1->Value.b ? 1 : 0);=0D
+ break;=0D
+ default:=0D
+ return -1;=0D
+ }=0D
+=0D
+ switch (Value2->Type) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ Data2 =3D Value2->Value.u8;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ Data2 =3D Value2->Value.u16;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ Data2 =3D Value2->Value.u32;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_64:=0D
+ Data2 =3D Value2->Value.u64;=0D
+ break;=0D
+ case EFI_IFR_TYPE_BOOLEAN:=0D
+ Data2 =3D (Value2->Value.b ? 1 : 0);=0D
+ break;=0D
+ default:=0D
+ return -1;=0D
+ }=0D
+=0D
+ Result =3D (Data1 =3D=3D Data2 ? 0 : (Data1 > Data2 ? 1 : -1));=0D
+=0D
+ return Result;=0D
+}=0D
+=0D
+/**=0D
+ Convert HII value to the string in HII one-of opcode.=0D
+=0D
+ @param[in] Statement Statement private instance=0D
+=0D
+ @retval EFI_STRING_ID The string ID in HII database.=0D
+ 0 is returned when something goes wrong.=0D
+=0D
+**/=0D
+EFI_STRING_ID=0D
+HiiValueToOneOfOptionStringId (=0D
+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement=0D
+ )=0D
+{=0D
+ LIST_ENTRY *Link;=0D
+ HII_QUESTION_OPTION *Option;=0D
+=0D
+ if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) {=0D
+ return 0;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {=0D
+ return 0;=0D
+ }=0D
+=0D
+ Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead);=0D
+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {=0D
+ Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);=0D
+=0D
+ if (CompareHiiStatementValue (&Statement->HiiStatement->Value, &Option=
->Value) =3D=3D 0) {=0D
+ return Option->Text;=0D
+ }=0D
+=0D
+ Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link);=
=0D
+ }=0D
+=0D
+ return 0;=0D
+}=0D
+=0D
+/**=0D
+ Convert HII string to the value in HII one-of opcode.=0D
+=0D
+ @param[in] Statement Statement private instance=0D
+ @param[in] Schema Schema string=0D
+ @param[in] HiiString Input string=0D
+ @param[out] Value Value returned=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+HiiStringToOneOfOptionValue (=0D
+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING HiiString,=0D
+ OUT HII_STATEMENT_VALUE *Value=0D
+ )=0D
+{=0D
+ LIST_ENTRY *Link;=0D
+ HII_QUESTION_OPTION *Option;=0D
+ EFI_STRING TmpString;=0D
+ BOOLEAN Found;=0D
+=0D
+ if (Statement =3D=3D NULL || IS_EMPTY_STRING (HiiString) || Value =3D=3D=
NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) {=0D
+ return EFI_UNSUPPORTED;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ Found =3D FALSE;=0D
+ Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead);=0D
+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {=0D
+ Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);=0D
+=0D
+ TmpString =3D HiiGetRedfishString (Statement->ParentForm->ParentFormse=
t->HiiHandle, Schema, Option->Text);=0D
+ if (TmpString !=3D NULL) {=0D
+ if (StrCmp (TmpString, HiiString) =3D=3D 0) {=0D
+ CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));=0D
+ Found =3D TRUE;=0D
+ }=0D
+ FreePool (TmpString);=0D
+ }=0D
+=0D
+ if (Found) {=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link);=
=0D
+ }=0D
+=0D
+ return EFI_NOT_FOUND;=0D
+}=0D
+=0D
+/**=0D
+ Convert HII value to numeric value in Redfish format.=0D
+=0D
+ @param[in] Value Value to be converted.=0D
+ @param[out] RedfishValue Value in Redfish format.=0D
+=0D
+ @retval EFI_SUCCESS Redfish value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+HiiValueToRedfishNumeric (=0D
+ IN HII_STATEMENT_VALUE *Value,=0D
+ OUT EDKII_REDFISH_VALUE *RedfishValue=0D
+ )=0D
+{=0D
+ if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ switch (Value->Type) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;=0D
+ RedfishValue->Value.Integer =3D (INT64)Value->Value.u8;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;=0D
+ RedfishValue->Value.Integer =3D (INT64)Value->Value.u16;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;=0D
+ RedfishValue->Value.Integer =3D (INT64)Value->Value.u32;=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_64:=0D
+ RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER;=0D
+ RedfishValue->Value.Integer =3D (INT64)Value->Value.u64;=0D
+ break;=0D
+ case EFI_IFR_TYPE_BOOLEAN:=0D
+ RedfishValue->Type =3D REDFISH_VALUE_TYPE_BOOLEAN;=0D
+ RedfishValue->Value.Boolean =3D Value->Value.b;=0D
+ break;=0D
+ default:=0D
+ RedfishValue->Type =3D REDFISH_VALUE_TYPE_UNKNOWN;=0D
+ break;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Convert numeric value in Redfish format to HII value.=0D
+=0D
+ @param[in] RedfishValue Value in Redfish format to be converted.=0D
+ @param[out] Value HII value returned.=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+RedfishNumericToHiiValue (=0D
+ IN EDKII_REDFISH_VALUE *RedfishValue,=0D
+ OUT HII_STATEMENT_VALUE *Value=0D
+ )=0D
+{=0D
+ if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ switch (RedfishValue->Type) {=0D
+ case REDFISH_VALUE_TYPE_INTEGER:=0D
+ Value->Type =3D EFI_IFR_TYPE_NUM_SIZE_64;=0D
+ Value->Value.u64 =3D (UINT64)RedfishValue->Value.Integer;=0D
+ break;=0D
+ case REDFISH_VALUE_TYPE_BOOLEAN:=0D
+ Value->Type =3D EFI_IFR_TYPE_BOOLEAN;=0D
+ Value->Value.b =3D RedfishValue->Value.Boolean;=0D
+ break;=0D
+ default:=0D
+ Value->Type =3D EFI_IFR_TYPE_UNDEFINED;=0D
+ break;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Dump the value in ordered list buffer.=0D
+=0D
+ @param[in] OrderedListStatement Ordered list statement.=0D
+=0D
+**/=0D
+VOID=0D
+DumpOrderedListValue (=0D
+ IN HII_STATEMENT *OrderedListStatement=0D
+ )=0D
+{=0D
+ UINT8 *Value8;=0D
+ UINT16 *Value16;=0D
+ UINT32 *Value32;=0D
+ UINT64 *Value64;=0D
+ UINTN Count;=0D
+ UINTN Index;=0D
+=0D
+ if (OrderedListStatement =3D=3D NULL || OrderedListStatement->Operand !=
=3D EFI_IFR_ORDERED_LIST_OP) {=0D
+ return;=0D
+ }=0D
+=0D
+ DEBUG ((DEBUG_ERROR, "Value.Type=3D 0x%x\n", OrderedListStatement->Value=
.Type));=0D
+ DEBUG ((DEBUG_ERROR, "Value.BufferValueType=3D 0x%x\n", OrderedListState=
ment->Value.BufferValueType));=0D
+ DEBUG ((DEBUG_ERROR, "Value.BufferLen=3D 0x%x\n", OrderedListStatement->=
Value.BufferLen));=0D
+ DEBUG ((DEBUG_ERROR, "Value.Buffer=3D 0x%x\n", OrderedListStatement->Val=
ue.Buffer));=0D
+ DEBUG ((DEBUG_ERROR, "Value.MaxContainers=3D 0x%x\n", OrderedListStateme=
nt->ExtraData.OrderListData.MaxContainers));=0D
+ DEBUG ((DEBUG_ERROR, "StorageWidth=3D 0x%x\n", OrderedListStatement->Sto=
rageWidth));=0D
+=0D
+ if (OrderedListStatement->Value.Buffer =3D=3D NULL) {=0D
+ return;=0D
+ }=0D
+=0D
+ Value8 =3D NULL;=0D
+ Value16 =3D NULL;=0D
+ Value32 =3D NULL;=0D
+ Value64 =3D NULL;=0D
+ Count =3D 0;=0D
+=0D
+ switch (OrderedListStatement->Value.BufferValueType) {=0D
+ case EFI_IFR_TYPE_NUM_SIZE_8:=0D
+ Value8 =3D (UINT8 *)OrderedListStatement->Value.Buffer;=0D
+ Count =3D OrderedListStatement->StorageWidth / sizeof (UINT8);=0D
+ for (Index =3D 0; Index < Count; Index++) {=0D
+ DEBUG ((DEBUG_ERROR, "%d ", Value8[Index]));=0D
+ }=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_16:=0D
+ Value16 =3D (UINT16 *)OrderedListStatement->Value.Buffer;=0D
+ Count =3D OrderedListStatement->StorageWidth / sizeof (UINT16);=0D
+ for (Index =3D 0; Index < Count; Index++) {=0D
+ DEBUG ((DEBUG_ERROR, "%d ", Value16[Index]));=0D
+ }=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_32:=0D
+ Value32 =3D (UINT32 *)OrderedListStatement->Value.Buffer;=0D
+ Count =3D OrderedListStatement->StorageWidth / sizeof (UINT32);=0D
+ for (Index =3D 0; Index < Count; Index++) {=0D
+ DEBUG ((DEBUG_ERROR, "%d ", Value32[Index]));=0D
+ }=0D
+ break;=0D
+ case EFI_IFR_TYPE_NUM_SIZE_64:=0D
+ Value64 =3D (UINT64 *)OrderedListStatement->Value.Buffer;=0D
+ Count =3D OrderedListStatement->StorageWidth / sizeof (UINT64);=0D
+ for (Index =3D 0; Index < Count; Index++) {=0D
+ DEBUG ((DEBUG_ERROR, "%d ", Value64[Index]));=0D
+ }=0D
+ break;=0D
+ default:=0D
+ Value8 =3D (UINT8 *)OrderedListStatement->Value.Buffer;=0D
+ Count =3D OrderedListStatement->StorageWidth / sizeof (UINT8);=0D
+ for (Index =3D 0; Index < Count; Index++) {=0D
+ DEBUG ((DEBUG_ERROR, "%d ", Value8[Index]));=0D
+ }=0D
+ break;=0D
+ }=0D
+=0D
+ DEBUG ((DEBUG_ERROR, "\n"));=0D
+}=0D
+=0D
+/**=0D
+ Convert HII value to the string in HII ordered list opcode. It's caller'=
s=0D
+ responsibility to free returned buffer using FreePool().=0D
+=0D
+ @param[in] Statement Statement private instance=0D
+ @param[out] ReturnSize The size of returned array=0D
+=0D
+ @retval EFI_STRING_ID The string ID array for options in ordered lis=
t.=0D
+=0D
+**/=0D
+EFI_STRING_ID *=0D
+HiiValueToOrderedListOptionStringId (=0D
+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,=0D
+ OUT UINTN *ReturnSize=0D
+ )=0D
+{=0D
+ LIST_ENTRY *Link;=0D
+ HII_QUESTION_OPTION *Option;=0D
+ UINTN OptionCount;=0D
+ EFI_STRING_ID *ReturnedArray;=0D
+ UINTN Index;=0D
+ UINT64 Value;=0D
+=0D
+ if (Statement =3D=3D NULL || ReturnSize =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ *ReturnSize =3D 0;=0D
+=0D
+ if (Statement->HiiStatement->Operand !=3D EFI_IFR_ORDERED_LIST_OP) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ DEBUG_CODE (=0D
+ DumpOrderedListValue (Statement->HiiStatement);=0D
+ );=0D
+=0D
+ OptionCount =3D 0;=0D
+ Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead);=0D
+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {=0D
+ Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);=0D
+=0D
+ ++OptionCount;=0D
+=0D
+ Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link);=
=0D
+ }=0D
+=0D
+ *ReturnSize =3D OptionCount;=0D
+ ReturnedArray =3D AllocatePool (sizeof (EFI_STRING_ID) * OptionCount);=0D
+ if (ReturnedArray =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));=0D
+ *ReturnSize =3D 0;=0D
+ return NULL;=0D
+ }=0D
+=0D
+ for (Index =3D 0; Index < OptionCount; Index++) {=0D
+ Value =3D OrderedListGetArrayData (Statement->HiiStatement->Value.Buff=
er, Statement->HiiStatement->Value.BufferValueType, Index);=0D
+ ReturnedArray[Index] =3D OrderedListOptionValueToStringId (Statement->=
HiiStatement, Value);=0D
+ }=0D
+=0D
+ return ReturnedArray;=0D
+}=0D
+=0D
+/**=0D
+ Convert HII string to the value in HII ordered list opcode.=0D
+=0D
+ @param[in] Statement Statement private instance=0D
+ @param[in] Schema Schema string=0D
+ @param[in] HiiString Input string=0D
+ @param[out] Value Value returned=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+HiiStringToOrderedListOptionValue (=0D
+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING HiiString,=0D
+ OUT UINT64 *Value=0D
+ )=0D
+{=0D
+ LIST_ENTRY *Link;=0D
+ HII_QUESTION_OPTION *Option;=0D
+ EFI_STRING TmpString;=0D
+ BOOLEAN Found;=0D
+=0D
+ if (Statement =3D=3D NULL || IS_EMPTY_STRING (HiiString) || Value =3D=3D=
NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ *Value =3D 0;=0D
+=0D
+ if (Statement->HiiStatement->Operand !=3D EFI_IFR_ORDERED_LIST_OP) {=0D
+ return EFI_UNSUPPORTED;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ Found =3D FALSE;=0D
+ Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead);=0D
+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {=0D
+ Option =3D HII_QUESTION_OPTION_FROM_LINK (Link);=0D
+=0D
+ TmpString =3D HiiGetRedfishString (Statement->ParentForm->ParentFormse=
t->HiiHandle, Schema, Option->Text);=0D
+ if (TmpString !=3D NULL) {=0D
+ if (StrCmp (TmpString, HiiString) =3D=3D 0) {=0D
+ *Value =3D ExtendHiiValueToU64 (&Option->Value);=0D
+ Found =3D TRUE;=0D
+ }=0D
+ FreePool (TmpString);=0D
+ }=0D
+=0D
+ if (Found) {=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link);=
=0D
+ }=0D
+=0D
+ return EFI_NOT_FOUND;=0D
+}=0D
+=0D
+/**=0D
+ Convert input ascii string to unicode string. It's caller's=0D
+ responsibility to free returned buffer using FreePool().=0D
+=0D
+ @param[in] AsciiString Ascii string to be converted.=0D
+=0D
+ @retval CHAR16 * Unicode string on return.=0D
+=0D
+**/=0D
+EFI_STRING=0D
+StrToUnicodeStr (=0D
+ IN CHAR8 *AsciiString=0D
+ )=0D
+{=0D
+ UINTN StringLen;=0D
+ EFI_STRING Buffer;=0D
+ EFI_STATUS Status;=0D
+=0D
+ if (AsciiString =3D=3D NULL || AsciiString[0] =3D=3D '\0') {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ StringLen =3D AsciiStrLen (AsciiString) + 1;=0D
+ Buffer =3D AllocatePool (StringLen * sizeof (CHAR16));=0D
+ if (Buffer =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ Status =3D AsciiStrToUnicodeStrS (AsciiString, Buffer, StringLen);=0D
+ if (EFI_ERROR (Status)) {=0D
+ FreePool (Buffer);=0D
+ return NULL;=0D
+ }=0D
+=0D
+ return Buffer;=0D
+}=0D
+=0D
+/**=0D
+ Return the full Redfish schema string from the given Schema and Version.=
=0D
+=0D
+ Returned schema string is: Schema + '.' + Version=0D
+=0D
+ @param[in] Schema Schema string=0D
+ @param[in] Version Schema version string=0D
+=0D
+ @retval CHAR8 * Schema string. NULL when errors occur.=0D
+=0D
+**/=0D
+CHAR8 *=0D
+GetFullSchemaString (=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version=0D
+ )=0D
+{=0D
+ UINTN Size;=0D
+ CHAR8 *FullName;=0D
+=0D
+ if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ Size =3D AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize (Schema)=
+ AsciiStrSize (Version);=0D
+=0D
+ FullName =3D AllocatePool (Size);=0D
+ if (FullName =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__));=0D
+ return NULL;=0D
+ }=0D
+=0D
+ AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX, Schem=
a, Version);=0D
+=0D
+ return FullName;=0D
+}=0D
+=0D
+/**=0D
+ Common implementation to get statement private instance.=0D
+=0D
+ @param[in] RedfishPlatformConfigPrivate Private instance.=0D
+ @param[in] Schema Redfish schema string.=0D
+ @param[in] ConfigureLang Configure language that refe=
rs to this statement.=0D
+ @param[out] Statement Statement instance=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+RedfishPlatformConfigGetStatementCommon (=0D
+ IN REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfig=
Private,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING ConfigureLang,=0D
+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;=0D
+=0D
+ if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schema)=
|| IS_EMPTY_STRING (ConfigureLang) || Statement =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ *Statement =3D NULL;=0D
+=0D
+ Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ TargetStatement =3D GetStatementPrivateByConfigureLang (&RedfishPlatform=
ConfigPrivate->FormsetList, Schema, ConfigureLang);=0D
+ if (TargetStatement =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the given=
%s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ //=0D
+ // Find current HII question value.=0D
+ //=0D
+ Status =3D GetQuestionValue (=0D
+ TargetStatement->ParentForm->ParentFormset->HiiFormSet,=0D
+ TargetStatement->ParentForm->HiiForm,=0D
+ TargetStatement->HiiStatement,=0D
+ GetSetValueWithHiiDriver=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n",=
__FUNCTION__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+=0D
+ if (TargetStatement->HiiStatement->Value.Type =3D=3D EFI_IFR_TYPE_UNDEFI=
NED) {=0D
+ return EFI_DEVICE_ERROR;=0D
+ }=0D
+=0D
+ //=0D
+ // Return Value.=0D
+ //=0D
+ *Statement =3D TargetStatement;=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Get Redfish value with the given Schema and Configure Language.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] Schema The Redfish schema to query.=0D
+ @param[in] Version The Redfish version to query.=0D
+ @param[in] ConfigureLang The target value which match this confi=
gure Language.=0D
+ @param[out] Value The returned value.=0D
+=0D
+ @retval EFI_SUCCESS Value is returned successfully.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigProtocolGetValue (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version,=0D
+ IN EFI_STRING ConfigureLang,=0D
+ OUT EDKII_REDFISH_VALUE *Value=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate;=
=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;=0D
+ EFI_STRING_ID StringId;=0D
+ EFI_STRING_ID *StringIdArray;=0D
+ CHAR8 *FullSchema;=0D
+ EFI_STRING HiiString;=0D
+ UINTN Count;=0D
+ UINTN Index;=0D
+=0D
+ if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Ver=
sion) || IS_EMPTY_STRING (ConfigureLang) || Value =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);=0D
+ Value->Type =3D REDFISH_VALUE_TYPE_UNKNOWN;=0D
+ Value->ArrayCount =3D 0;=0D
+ Count =3D 0;=0D
+ FullSchema =3D NULL;=0D
+ HiiString =3D NULL;=0D
+ StringIdArray =3D NULL;=0D
+=0D
+ FullSchema =3D GetFullSchemaString (Schema, Version);=0D
+ if (FullSchema =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ Status =3D RedfishPlatformConfigGetStatementCommon (RedfishPlatformConfi=
gPrivate, FullSchema, ConfigureLang, &TargetStatement);=0D
+ if (EFI_ERROR (Status)) {=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ switch (TargetStatement->HiiStatement->Operand) {=0D
+ case EFI_IFR_ONE_OF_OP:=0D
+ StringId =3D HiiValueToOneOfOptionStringId (TargetStatement);=0D
+ if (StringId =3D=3D 0) {=0D
+ ASSERT (FALSE);=0D
+ Status =3D EFI_DEVICE_ERROR;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ Value->Value.Buffer =3D HiiGetRedfishAsciiString (TargetStatement->P=
arentForm->ParentFormset->HiiHandle, FullSchema, StringId);=0D
+ if (Value->Value.Buffer =3D=3D NULL) {=0D
+ Status =3D EFI_OUT_OF_RESOURCES;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ Value->Type =3D REDFISH_VALUE_TYPE_STRING;=0D
+ break;=0D
+ case EFI_IFR_STRING_OP:=0D
+ if (TargetStatement->HiiStatement->Value.Type !=3D EFI_IFR_TYPE_STRI=
NG) {=0D
+ ASSERT (FALSE);=0D
+ Status =3D EFI_DEVICE_ERROR;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ Value->Type =3D REDFISH_VALUE_TYPE_STRING;=0D
+ Value->Value.Buffer =3D AllocatePool (StrLen ((CHAR16 *)TargetStatem=
ent->HiiStatement->Value.Buffer) + 1);=0D
+ UnicodeStrToAsciiStrS ((CHAR16 *)TargetStatement->HiiStatement->Valu=
e.Buffer, Value->Value.Buffer, StrLen ((CHAR16 *)TargetStatement->HiiStatem=
ent->Value.Buffer) + 1);=0D
+ break;=0D
+ case EFI_IFR_CHECKBOX_OP:=0D
+ case EFI_IFR_NUMERIC_OP:=0D
+ Status =3D HiiValueToRedfishNumeric (&TargetStatement->HiiStatement-=
Value, Value);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish v=
alue: %r\n", __FUNCTION__, Status));=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+ break;=0D
+ case EFI_IFR_ACTION_OP:=0D
+ if (TargetStatement->HiiStatement->Value.Type !=3D EFI_IFR_TYPE_ACTI=
ON) {=0D
+ ASSERT (FALSE);=0D
+ Status =3D EFI_DEVICE_ERROR;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ //=0D
+ // Action has no value. Just return unknown type.=0D
+ //=0D
+ Value->Type =3D REDFISH_VALUE_TYPE_UNKNOWN;=0D
+ break;=0D
+ case EFI_IFR_ORDERED_LIST_OP:=0D
+ StringIdArray =3D HiiValueToOrderedListOptionStringId (TargetStateme=
nt, &Count);=0D
+ if (StringIdArray =3D=3D NULL) {=0D
+ ASSERT (FALSE);=0D
+ Status =3D EFI_DEVICE_ERROR;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ Value->Value.StringArray =3D AllocatePool (sizeof (CHAR8 *) * Count)=
;=0D
+ if (Value->Value.StringArray =3D=3D NULL) {=0D
+ ASSERT (FALSE);=0D
+ Status =3D EFI_OUT_OF_RESOURCES;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ for (Index =3D 0; Index < Count; Index++) {=0D
+ ASSERT (StringIdArray[Index] !=3D 0);=0D
+ Value->Value.StringArray[Index] =3D HiiGetRedfishAsciiString (Targ=
etStatement->ParentForm->ParentFormset->HiiHandle, FullSchema, StringIdArra=
y[Index]);=0D
+ }=0D
+=0D
+ Value->ArrayCount =3D Count;=0D
+ Value->Type =3D REDFISH_VALUE_TYPE_STRING_ARRAY;=0D
+ break;=0D
+ default:=0D
+ DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please conta=
ct with author if we need to support this type.\n", __FUNCTION__, TargetSta=
tement->HiiStatement->Operand));=0D
+ ASSERT (FALSE);=0D
+ Status =3D EFI_UNSUPPORTED;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+RELEASE_RESOURCE:=0D
+=0D
+ if (FullSchema !=3D NULL) {=0D
+ FreePool (FullSchema);=0D
+ }=0D
+=0D
+ if (HiiString !=3D NULL) {=0D
+ FreePool (HiiString);=0D
+ }=0D
+=0D
+ if (StringIdArray !=3D NULL) {=0D
+ FreePool (StringIdArray);=0D
+ }=0D
+=0D
+ return Status;=0D
+}=0D
+=0D
+/**=0D
+ Function to save question value into HII database.=0D
+=0D
+ @param[in] HiiFormset HII form-set instance=0D
+ @param[in] HiiForm HII form instance=0D
+ @param[in] HiiStatement HII statement that keeps new value.=0D
+ @param[in] Value New value to applyu.=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+RedfishPlatformConfigSaveQuestionValue (=0D
+ IN HII_FORMSET *HiiFormset,=0D
+ IN HII_FORM *HiiForm,=0D
+ IN HII_STATEMENT *HiiStatement,=0D
+ IN HII_STATEMENT_VALUE *Value=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ if (HiiFormset =3D=3D NULL || HiiForm =3D=3D NULL || HiiStatement =3D=3D=
NULL || Value =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ Status =3D SetQuestionValue (=0D
+ HiiFormset,=0D
+ HiiForm,=0D
+ HiiStatement,=0D
+ Value=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n", __FUNCT=
ION__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ Status =3D SubmitForm (HiiFormset, HiiForm);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n", __FUNCTION__, =
Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Common implementation to set statement private instance.=0D
+=0D
+ @param[in] RedfishPlatformConfigPrivate Private instance.=0D
+ @param[in] Schema Redfish schema string.=0D
+ @param[in] ConfigureLang Configure language that refe=
rs to this statement.=0D
+ @param[in] Statement Statement instance=0D
+=0D
+ @retval EFI_SUCCESS HII value is returned successfully.=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+RedfishPlatformConfigSetStatementCommon (=0D
+ IN REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING ConfigureLang,=0D
+ IN HII_STATEMENT_VALUE *StatementValue=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;=0D
+ EFI_STRING TempBuffer;=0D
+ UINT8 *StringArray;=0D
+ UINTN Index;=0D
+ UINT64 Value;=0D
+ CHAR8 **CharArray;=0D
+=0D
+ if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schema)=
|| IS_EMPTY_STRING (ConfigureLang) || StatementValue =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ TempBuffer =3D NULL;=0D
+ StringArray =3D NULL;=0D
+=0D
+ Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ TargetStatement =3D GetStatementPrivateByConfigureLang (&RedfishPlatform=
ConfigPrivate->FormsetList, Schema, ConfigureLang);=0D
+ if (TargetStatement =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the given=
%s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ if (StatementValue->Type !=3D TargetStatement->HiiStatement->Value.Type)=
{=0D
+ //=0D
+ // We treat one-of type as string in Redfish. But one-of statement is =
not=0D
+ // in string format from HII point of view. Do a patch here.=0D
+ //=0D
+ if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_ONE_OF_OP &&=
StatementValue->Type =3D=3D EFI_IFR_TYPE_STRING) {=0D
+=0D
+ TempBuffer =3D StrToUnicodeStr ((CHAR8 *)StatementValue->Buffer);=0D
+ if (TempBuffer =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+ FreePool (StatementValue->Buffer);=0D
+ StatementValue->Buffer =3D NULL;=0D
+ StatementValue->BufferLen =3D 0;=0D
+=0D
+ Status =3D HiiStringToOneOfOptionValue (TargetStatement, Schema, Tem=
pBuffer, StatementValue);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the given=
%s\n", __FUNCTION__, TempBuffer));=0D
+ FreePool (TempBuffer);=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ FreePool (TempBuffer);=0D
+ } else if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_ORDER=
ED_LIST_OP && StatementValue->Type =3D=3D EFI_IFR_TYPE_STRING) {=0D
+ //=0D
+ // We treat ordered list type as string in Redfish. But ordered list=
statement is not=0D
+ // in string format from HII point of view. Do a patch here.=0D
+ //=0D
+ StringArray =3D AllocateZeroPool (TargetStatement->HiiStatement->Sto=
rageWidth);=0D
+ if (StringArray =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ //=0D
+ // Arrage new option order from input string array=0D
+ //=0D
+ CharArray =3D (CHAR8 **)StatementValue->Buffer;=0D
+ for (Index =3D 0; Index < StatementValue->BufferLen; Index++) {=0D
+ TempBuffer =3D StrToUnicodeStr (CharArray[Index]);=0D
+ if (TempBuffer =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ Status =3D HiiStringToOrderedListOptionValue (TargetStatement, Sch=
ema, TempBuffer, &Value);=0D
+ if (EFI_ERROR (Status)) {=0D
+ ASSERT (FALSE);=0D
+ continue;=0D
+ }=0D
+ FreePool (TempBuffer);=0D
+ OrderedListSetArrayData (StringArray, TargetStatement->HiiStatemen=
t->Value.BufferValueType, Index, Value);=0D
+ }=0D
+=0D
+ StatementValue->Type =3D EFI_IFR_TYPE_BUFFER;=0D
+ StatementValue->Buffer =3D StringArray;=0D
+ StatementValue->BufferLen =3D TargetStatement->HiiStatement->Storage=
Width;=0D
+ StatementValue->BufferValueType =3D TargetStatement->HiiStatement->V=
alue.BufferValueType;=0D
+ } else if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_NUMER=
IC_OP && StatementValue->Type =3D=3D EFI_IFR_TYPE_NUM_SIZE_64) {=0D
+ //=0D
+ // Redfish only has numeric value type and it does not care about th=
e value size.=0D
+ // Do a patch here so we have proper value size applied.=0D
+ //=0D
+ StatementValue->Type =3D TargetStatement->HiiStatement->Value.Type;=
=0D
+ } else {=0D
+ DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type: 0x%=
x but target value type: 0x%x\n", __FUNCTION__, StatementValue->Type, Targe=
tStatement->HiiStatement->Value.Type));=0D
+ ASSERT (FALSE);=0D
+ }=0D
+ }=0D
+=0D
+ Status =3D RedfishPlatformConfigSaveQuestionValue (=0D
+ TargetStatement->ParentForm->ParentFormset->HiiFormSet,=0D
+ TargetStatement->ParentForm->HiiForm,=0D
+ TargetStatement->HiiStatement,=0D
+ StatementValue=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n", __FUNC=
TION__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Set Redfish value with the given Schema and Configure Language.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] Schema The Redfish schema to query.=0D
+ @param[in] Version The Redfish version to query.=0D
+ @param[in] ConfigureLang The target value which match this confi=
gure Language.=0D
+ @param[in] Value The value to set.=0D
+=0D
+ @retval EFI_SUCCESS Value is returned successfully.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigProtocolSetValue (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version,=0D
+ IN EFI_STRING ConfigureLang,=0D
+ IN EDKII_REDFISH_VALUE Value=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate;=
=0D
+ CHAR8 *FullSchema;=0D
+ HII_STATEMENT_VALUE NewValue;=0D
+=0D
+ if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Ver=
sion) || IS_EMPTY_STRING (ConfigureLang)) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (Value.Type =3D=3D REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=3D REDF=
ISH_VALUE_TYPE_MAX) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);=0D
+ FullSchema =3D NULL;=0D
+=0D
+ FullSchema =3D GetFullSchemaString (Schema, Version);=0D
+ if (FullSchema =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE));=0D
+=0D
+ switch (Value.Type) {=0D
+ case REDFISH_VALUE_TYPE_INTEGER:=0D
+ case REDFISH_VALUE_TYPE_BOOLEAN:=0D
+ Status =3D RedfishNumericToHiiValue (&Value, &NewValue);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii v=
alue: %r\n", __FUNCTION__, Status));=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+ break;=0D
+ case REDFISH_VALUE_TYPE_STRING:=0D
+ NewValue.Type =3D EFI_IFR_TYPE_STRING;=0D
+ NewValue.BufferLen =3D (UINT16)AsciiStrSize (Value.Value.Buffer);=0D
+ NewValue.Buffer =3D AllocateCopyPool (NewValue.BufferLen, Value.Valu=
e.Buffer);=0D
+ if (NewValue.Buffer =3D=3D NULL) {=0D
+ Status =3D EFI_OUT_OF_RESOURCES;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+ break;=0D
+ case REDFISH_VALUE_TYPE_STRING_ARRAY:=0D
+ NewValue.Type =3D EFI_IFR_TYPE_STRING;=0D
+ NewValue.BufferLen =3D (UINT16)Value.ArrayCount;=0D
+ NewValue.Buffer =3D (UINT8 *)Value.Value.StringArray;=0D
+ break;=0D
+ default:=0D
+ ASSERT (FALSE);=0D
+ break;=0D
+ }=0D
+=0D
+ Status =3D RedfishPlatformConfigSetStatementCommon (RedfishPlatformConfi=
gPrivate, FullSchema, ConfigureLang, &NewValue);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n", __F=
UNCTION__, Status));=0D
+ }=0D
+=0D
+RELEASE_RESOURCE:=0D
+=0D
+ if (FullSchema !=3D NULL) {=0D
+ FreePool (FullSchema);=0D
+ }=0D
+=0D
+ return Status;=0D
+}=0D
+=0D
+/**=0D
+ Get the list of Configure Language from platform configuration by the gi=
ven Schema and RegexPattern.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] Schema The Redfish schema to query.=0D
+ @param[in] Version The Redfish version to query.=0D
+ @param[in] RegexPattern The target Configure Language pattern. =
This is used for regular expression matching.=0D
+ @param[out] ConfigureLangList The list of Configure Language.=0D
+ @param[out] Count The number of Configure Language in Con=
figureLangList.=0D
+=0D
+ @retval EFI_SUCCESS ConfigureLangList is returned successfu=
lly.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigProtocolGetConfigureLang (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN CHAR8 *Schema,=0D
+ IN CHAR8 *Version,=0D
+ IN EFI_STRING RegexPattern,=0D
+ OUT EFI_STRING **ConfigureLangList,=0D
+ OUT UINTN *Count=0D
+ )=0D
+{=0D
+ REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPr=
ivate;=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;=0D
+ LIST_ENTRY *NextLink;=0D
+ EFI_STRING TmpString;=0D
+ EFI_STRING *TmpConfigureLangList;=0D
+ UINTN Index;=0D
+ CHAR8 *FullSchema;=0D
+=0D
+ if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Ver=
sion) || Count =3D=3D NULL || ConfigureLangList =3D=3D NULL || IS_EMPTY_STR=
ING (RegexPattern)) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ *Count =3D 0;=0D
+ *ConfigureLangList =3D NULL;=0D
+ FullSchema =3D NULL;=0D
+ RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);=0D
+=0D
+ Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ FullSchema =3D GetFullSchemaString (Schema, Version);=0D
+ if (FullSchema =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ Status =3D GetStatementPrivateByConfigureLangRegex (=0D
+ RedfishPlatformConfigPrivate->RegularExpressionProtocol,=0D
+ &RedfishPlatformConfigPrivate->FormsetList,=0D
+ FullSchema,=0D
+ RegexPattern,=0D
+ &StatementList=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, GetStatementPrivateByConfigureLangRegex fail=
ure: %r\n", __FUNCTION__, Status));=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ if (!IsListEmpty (&StatementList.StatementList)) {=0D
+=0D
+ TmpConfigureLangList =3D AllocateZeroPool (sizeof (CHAR16 *) * Stateme=
ntList.Count);=0D
+ if (TmpConfigureLangList =3D=3D NULL) {=0D
+ Status =3D EFI_OUT_OF_RESOURCES;=0D
+ goto RELEASE_RESOURCE;=0D
+ }=0D
+=0D
+ Index =3D 0;=0D
+ NextLink =3D GetFirstNode (&StatementList.StatementList);=0D
+ while (!IsNull (&StatementList.StatementList, NextLink)) {=0D
+ StatementRef =3D REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (Ne=
xtLink);=0D
+ NextLink =3D GetNextNode (&StatementList.StatementList, NextLink);=0D
+=0D
+ ASSERT (StatementRef->Statement->Description !=3D 0);=0D
+ if (StatementRef->Statement->Description !=3D 0) {=0D
+ TmpString =3D HiiGetRedfishString (StatementRef->Statement->Parent=
Form->ParentFormset->HiiHandle, FullSchema, StatementRef->Statement->Descri=
ption);=0D
+ ASSERT (TmpString !=3D NULL);=0D
+ if (TmpString !=3D NULL) {=0D
+ TmpConfigureLangList[Index] =3D AllocateCopyPool (StrSize (TmpSt=
ring), TmpString);=0D
+ ASSERT (TmpConfigureLangList[Index] !=3D NULL);=0D
+ FreePool (TmpString);=0D
+ ++Index;=0D
+ }=0D
+ }=0D
+ }=0D
+ }=0D
+=0D
+ *Count =3D StatementList.Count;=0D
+ *ConfigureLangList =3D TmpConfigureLangList;=0D
+=0D
+RELEASE_RESOURCE:=0D
+=0D
+ if (FullSchema !=3D NULL) {=0D
+ FreePool (FullSchema);=0D
+ }=0D
+=0D
+ ReleaseStatementList (&StatementList);=0D
+=0D
+ return Status;=0D
+}=0D
+=0D
+/**=0D
+ Get the list of supported Redfish schema from paltform configuration on =
give HII handle.=0D
+=0D
+ @param[in] This Pointer to EDKII_REDFISH_PLATFORM_CONFI=
G_PROTOCOL instance.=0D
+ @param[in] HiiHandle The target handle to search. If handle =
is NULL,=0D
+ this function return all schema from HI=
I database.=0D
+ @param[out] SupportedSchema The supported schema list which is sepa=
rated by ';'.=0D
+ The SupportedSchema is allocated by the=
callee. It's caller's=0D
+ responsibility to free this buffer usin=
g FreePool().=0D
+=0D
+ @retval EFI_SUCCESS Schema is returned successfully.=0D
+ @retval Others Some error happened.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigProtocolGetSupportedSchema (=0D
+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,=0D
+ IN EFI_HII_HANDLE HiiHandle, OPTIONA=
L=0D
+ OUT CHAR8 **SupportedSchema=0D
+ )=0D
+{=0D
+ REDFISH_PLATFORM_CONFIG_PRIVATE *RedfishPlatformConfigPrivate;=
=0D
+ EFI_STATUS Status;=0D
+ LIST_ENTRY *HiiFormsetLink;=0D
+ LIST_ENTRY *HiiFormsetNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;=0D
+ UINTN Index;=0D
+ UINTN StringSize;=0D
+ CHAR8 *StringBuffer;=0D
+ UINTN StringIndex;=0D
+=0D
+ if (This =3D=3D NULL || SupportedSchema =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ *SupportedSchema =3D NULL;=0D
+=0D
+ RedfishPlatformConfigPrivate =3D REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_TH=
IS (This);=0D
+=0D
+ Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetLis=
t, &RedfishPlatformConfigPrivate->PendingList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", __FUNCTIO=
N__, Status));=0D
+ return Status;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ //=0D
+ // Calculate for string buffer size.=0D
+ //=0D
+ StringSize =3D 0;=0D
+ HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate->FormsetL=
ist);=0D
+ while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, HiiFormsetLi=
nk)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate->For=
msetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHandle=
) {=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ continue;=0D
+ }=0D
+=0D
+ if (HiiFormsetPrivate->SupportedSchema.Count > 0) {=0D
+ for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count; =
Index++) {=0D
+ StringSize +=3D AsciiStrSize (HiiFormsetPrivate->SupportedSchema.S=
chemaList[Index]);=0D
+ }=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ if (StringSize =3D=3D 0) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ StringBuffer =3D AllocatePool (StringSize);=0D
+ if (StringBuffer =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ StringIndex =3D 0;=0D
+ HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate->FormsetL=
ist);=0D
+ while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, HiiFormsetLi=
nk)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate->For=
msetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHandle=
) {=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ continue;=0D
+ }=0D
+=0D
+ if (HiiFormsetPrivate->SupportedSchema.Count > 0) {=0D
+ for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count; =
Index++) {=0D
+ AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringInde=
x), HiiFormsetPrivate->SupportedSchema.SchemaList[Index]);=0D
+ StringIndex +=3D AsciiStrLen (HiiFormsetPrivate->SupportedSchema.S=
chemaList[Index]);=0D
+ StringBuffer[StringIndex] =3D ';';=0D
+ ++StringIndex;=0D
+ }=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ StringBuffer[--StringIndex] =3D '\0';=0D
+=0D
+ *SupportedSchema =3D StringBuffer;=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Functions which are registered to receive notification of=0D
+ database events have this prototype. The actual event is encoded=0D
+ in NotifyType. The following table describes how PackageType,=0D
+ PackageGuid, Handle, and Package are used for each of the=0D
+ notification types.=0D
+=0D
+ @param[in] PackageType Package type of the notification.=0D
+ @param[in] PackageGuid If PackageType is=0D
+ EFI_HII_PACKAGE_TYPE_GUID, then this is=0D
+ the pointer to the GUID from the Guid=0D
+ field of EFI_HII_PACKAGE_GUID_HEADER.=0D
+ Otherwise, it must be NULL.=0D
+ @param[in] Package Points to the package referred to by the=0D
+ notification Handle The handle of the package=0D
+ list which contains the specified package.=0D
+ @param[in] Handle The HII handle.=0D
+ @param[in] NotifyType The type of change concerning the=0D
+ database. See=0D
+ EFI_HII_DATABASE_NOTIFY_TYPE.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigFormUpdateNotify (=0D
+ IN UINT8 PackageType,=0D
+ IN CONST EFI_GUID *PackageGuid,=0D
+ IN CONST EFI_HII_PACKAGE_HEADER *Package,=0D
+ IN EFI_HII_HANDLE Handle,=0D
+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType =3D=
=3D EFI_HII_DATABASE_NOTIFY_ADD_PACK) {=0D
+ //=0D
+ // HII formset on this handle is updated by driver during run-time. Th=
e formset needs to be reloaded.=0D
+ //=0D
+ Status =3D NotifyFormsetUpdate (Handle, &mRedfishPlatformConfigPrivate=
->PendingList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII ha=
ndle: 0x%x\n", __FUNCTION__, Handle));=0D
+ return Status;=0D
+ }=0D
+ } else if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) {=0D
+ //=0D
+ // HII resource is removed. The formset is no longer exist.=0D
+ //=0D
+ Status =3D NotifyFormsetDeleted (Handle, &mRedfishPlatformConfigPrivat=
e->PendingList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII ha=
ndle: 0x%x\n", __FUNCTION__, Handle));=0D
+ return Status;=0D
+ }=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ This is a EFI_HII_STRING_PROTOCOL notification event handler.=0D
+=0D
+ Install HII package notification.=0D
+=0D
+ @param[in] Event Event whose notification function is being invoked.=
=0D
+ @param[in] Context Pointer to the notification function's context.=0D
+=0D
+**/=0D
+VOID=0D
+EFIAPI=0D
+HiiStringProtocolInstalled (=0D
+ IN EFI_EVENT Event,=0D
+ IN VOID *Context=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ //=0D
+ // Locate HII database protocol.=0D
+ //=0D
+ Status =3D gBS->LocateProtocol (=0D
+ &gEfiHiiStringProtocolGuid,=0D
+ NULL,=0D
+ (VOID **)&mRedfishPlatformConfigPrivate->HiiString=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure: %r\n=
", __FUNCTION__, Status));=0D
+ return;=0D
+ }=0D
+=0D
+ gBS->CloseEvent (Event);=0D
+ mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D NULL;=0D
+}=0D
+=0D
+/**=0D
+ This is a EFI_HII_DATABASE_PROTOCOL notification event handler.=0D
+=0D
+ Install HII package notification.=0D
+=0D
+ @param[in] Event Event whose notification function is being invoked.=
=0D
+ @param[in] Context Pointer to the notification function's context.=0D
+=0D
+**/=0D
+VOID=0D
+EFIAPI=0D
+HiiDatabaseProtocolInstalled (=0D
+ IN EFI_EVENT Event,=0D
+ IN VOID *Context=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ //=0D
+ // Locate HII database protocol.=0D
+ //=0D
+ Status =3D gBS->LocateProtocol (=0D
+ &gEfiHiiDatabaseProtocolGuid,=0D
+ NULL,=0D
+ (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL failure: %r=
\n", __FUNCTION__, Status));=0D
+ return;=0D
+ }=0D
+=0D
+ //=0D
+ // Register package notification when new form package is installed.=0D
+ //=0D
+ Status =3D mRedfishPlatformConfigPrivate->HiiDatabase->RegisterPackageNo=
tify (=0D
+ mRedfishPlatformConfigPrivate=
->HiiDatabase,=0D
+ EFI_HII_PACKAGE_FORMS,=0D
+ NULL,=0D
+ RedfishPlatformConfigFormUpda=
teNotify,=0D
+ EFI_HII_DATABASE_NOTIFY_NEW_P=
ACK,=0D
+ &mRedfishPlatformConfigPrivat=
e->NotifyHandle=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for EFI_HII_DATABASE_N=
OTIFY_NEW_PACK failure: %r\n", __FUNCTION__, Status));=0D
+ }=0D
+=0D
+ //=0D
+ // Register package notification when new form package is updated.=0D
+ //=0D
+ Status =3D mRedfishPlatformConfigPrivate->HiiDatabase->RegisterPackageNo=
tify (=0D
+ mRedfishPlatformConfigPrivate=
->HiiDatabase,=0D
+ EFI_HII_PACKAGE_FORMS,=0D
+ NULL,=0D
+ RedfishPlatformConfigFormUpda=
teNotify,=0D
+ EFI_HII_DATABASE_NOTIFY_ADD_P=
ACK,=0D
+ &mRedfishPlatformConfigPrivat=
e->NotifyHandle=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for EFI_HII_DATABASE_N=
OTIFY_NEW_PACK failure: %r\n", __FUNCTION__, Status));=0D
+ }=0D
+=0D
+ gBS->CloseEvent (Event);=0D
+ mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D NULL;=0D
+=0D
+}=0D
+=0D
+/**=0D
+ This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler.=0D
+=0D
+ @param[in] Event Event whose notification function is being invoked.=
=0D
+ @param[in] Context Pointer to the notification function's context.=0D
+=0D
+**/=0D
+VOID=0D
+EFIAPI=0D
+RegexProtocolInstalled (=0D
+ IN EFI_EVENT Event,=0D
+ IN VOID *Context=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ //=0D
+ // Locate regular expression protocol.=0D
+ //=0D
+ Status =3D gBS->LocateProtocol (=0D
+ &gEfiRegularExpressionProtocolGuid,=0D
+ NULL,=0D
+ (VOID **)&mRedfishPlatformConfigPrivate->RegularExpressi=
onProtocol=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_REGULAR_EXPRESSION_PROTOCOL failu=
re: %r\n", __FUNCTION__, Status));=0D
+ return;=0D
+ }=0D
+=0D
+ gBS->CloseEvent (Event);=0D
+ mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D NULL;=0D
+=0D
+}=0D
+=0D
+/**=0D
+ Unloads an image.=0D
+=0D
+ @param ImageHandle Handle that identifies the image to be unl=
oaded.=0D
+=0D
+ @retval EFI_SUCCESS The image has been unloaded.=0D
+ @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigDxeUnload (=0D
+ IN EFI_HANDLE ImageHandle=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ if (mRedfishPlatformConfigPrivate !=3D NULL) {=0D
+ Status =3D gBS->UninstallProtocolInterface (=0D
+ mRedfishPlatformConfigPrivate->ImageHandle,=0D
+ &gEdkIIRedfishPlatformConfigProtocolGuid,=0D
+ (VOID*)&mRedfishPlatformConfigPrivate->Protocol=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, can not uninstall gEdkIIRedfishPlatformCon=
figProtocolGuid: %r\n", __FUNCTION__, Status));=0D
+ ASSERT (FALSE);=0D
+ }=0D
+=0D
+ //=0D
+ // Close events=0D
+ //=0D
+ if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent !=3D NULL=
) {=0D
+ gBS->CloseEvent (mRedfishPlatformConfigPrivate->HiiDbNotify.Protocol=
Event);=0D
+ }=0D
+ if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent !=3D =
NULL) {=0D
+ gBS->CloseEvent (mRedfishPlatformConfigPrivate->HiiStringNotify.Prot=
ocolEvent);=0D
+ }=0D
+ if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent !=3D NULL=
) {=0D
+ gBS->CloseEvent (mRedfishPlatformConfigPrivate->RegexNotify.Protocol=
Event);=0D
+ }=0D
+=0D
+ //=0D
+ // Unregister package notification.=0D
+ //=0D
+ if (mRedfishPlatformConfigPrivate->NotifyHandle !=3D NULL) {=0D
+ mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotify =
(=0D
+ mRedfishPlatformConfigPrivate->H=
iiDatabase,=0D
+ mRedfishPlatformConfigPrivate->N=
otifyHandle=0D
+ );=0D
+ }=0D
+=0D
+ ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList);=0D
+ FreePool (mRedfishPlatformConfigPrivate);=0D
+ mRedfishPlatformConfigPrivate =3D NULL;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ This is the declaration of an EFI image entry point. This entry point is=
=0D
+ the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers includ=
ing=0D
+ both device drivers and bus drivers.=0D
+=0D
+ @param ImageHandle The firmware allocated handle for the UEFI=
image.=0D
+ @param SystemTable A pointer to the EFI System Table.=0D
+=0D
+ @retval EFI_SUCCESS The operation completed successfully.=0D
+ @retval Others An unexpected error occurred.=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+RedfishPlatformConfigDxeEntryPoint (=0D
+ IN EFI_HANDLE ImageHandle,=0D
+ IN EFI_SYSTEM_TABLE *SystemTable=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+=0D
+ mRedfishPlatformConfigPrivate =3D (REDFISH_PLATFORM_CONFIG_PRIVATE *)All=
ocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE));=0D
+ if (mRedfishPlatformConfigPrivate =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for REDFISH_PLATFORM_C=
ONFIG_PRIVATE\n", __FUNCTION__));=0D
+ ASSERT (FALSE);=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ //=0D
+ // Protocol initialization=0D
+ //=0D
+ mRedfishPlatformConfigPrivate->ImageHandle =3D ImageHandle;=0D
+ mRedfishPlatformConfigPrivate->Protocol.GetValue =3D RedfishPlatformConf=
igProtocolGetValue;=0D
+ mRedfishPlatformConfigPrivate->Protocol.SetValue =3D RedfishPlatformConf=
igProtocolSetValue;=0D
+ mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =3D RedfishPlat=
formConfigProtocolGetConfigureLang;=0D
+ mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =3D RedfishPl=
atformConfigProtocolGetSupportedSchema;=0D
+=0D
+ InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList);=0D
+ InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList);=0D
+=0D
+ Status =3D gBS->InstallProtocolInterface (=0D
+ &ImageHandle,=0D
+ &gEdkIIRedfishPlatformConfigProtocolGuid,=0D
+ EFI_NATIVE_INTERFACE,=0D
+ (VOID*)&mRedfishPlatformConfigPrivate->Protocol=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, can not install gEdkIIRedfishPlatformConfigP=
rotocolGuid: %r\n", __FUNCTION__, Status));=0D
+ ASSERT (FALSE);=0D
+ }=0D
+=0D
+ //=0D
+ // Install protocol notification if HII database protocol is installed.=
=0D
+ //=0D
+ mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D EfiCreatePr=
otocolNotifyEvent (=0D
+ &gEfiHiiData=
baseProtocolGuid,=0D
+ TPL_CALLBACK=
,=0D
+ HiiDatabaseP=
rotocolInstalled,=0D
+ NULL,=0D
+ &mRedfishPla=
tformConfigPrivate->HiiDbNotify.Registration=0D
+ );=0D
+ if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D=3D NULL=
) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for g=
EfiHiiDatabaseProtocolGuid\n", __FUNCTION__));=0D
+ ASSERT (FALSE);=0D
+ }=0D
+=0D
+ //=0D
+ // Install protocol notification if HII string protocol is installed.=0D
+ //=0D
+ mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D EfiCrea=
teProtocolNotifyEvent (=0D
+ &gEfiHii=
StringProtocolGuid,=0D
+ TPL_CALL=
BACK,=0D
+ HiiStrin=
gProtocolInstalled,=0D
+ NULL,=0D
+ &mRedfis=
hPlatformConfigPrivate->HiiStringNotify.Registration=0D
+ );=0D
+ if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D=3D =
NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for g=
EfiHiiStringProtocolGuid\n", __FUNCTION__));=0D
+ ASSERT (FALSE);=0D
+ }=0D
+=0D
+ //=0D
+ // Install protocol notification if regular expression protocol is insta=
lled.=0D
+ //=0D
+ mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D EfiCreatePr=
otocolNotifyEvent (=0D
+ &gEfiRegular=
ExpressionProtocolGuid,=0D
+ TPL_CALLBACK=
,=0D
+ RegexProtoco=
lInstalled,=0D
+ NULL,=0D
+ &mRedfishPla=
tformConfigPrivate->RegexNotify.Registration=0D
+ );=0D
+ if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D=3D NULL=
) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for g=
EfiRegularExpressionProtocolGuid\n", __FUNCTION__));=0D
+ ASSERT (FALSE);=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h=
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
index 99a613d229..d3f7af55ad 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
@@ -1,64 +1,64 @@
-/** @file
- This file defines the EDKII Redfish Platform Config Protocol interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_
-
-#include <Uefi.h>
-
-//
-// Libraries
-//
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/PrintLib.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-
-//
-// Produced Protocols
-//
-#include <Protocol/EdkIIRedfishPlatformConfig.h>
-#include <Protocol/HiiDatabase.h>
-#include <Protocol/HiiString.h>
-#include <Protocol/RegularExpressionProtocol.h>
-
-//
-// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY.
-//
-typedef struct {
- EFI_EVENT ProtocolEvent; // Protocol notification ev=
ent.
- VOID *Registration; // Protocol notification re=
gistration.
-} REDFISH_PLATFORM_CONFIG_NOTIFY;
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
-//
-typedef struct {
- EFI_HANDLE ImageHandle; //=
Driver image handle.
- EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol;
- REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify;
- EFI_HII_DATABASE_PROTOCOL *HiiDatabase; //=
The HII database protocol.
- REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify;
- EFI_HII_STRING_PROTOCOL *HiiString; //=
HII String Protocol.
- REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify;
- EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol; //=
Regular Expression Protocol.
- EFI_HANDLE NotifyHandle; //=
The notify handle.
- LIST_ENTRY FormsetList; //=
The list to keep cached HII formset.
- LIST_ENTRY PendingList; //=
The list to keep updated HII handle.
-} REDFISH_PLATFORM_CONFIG_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR (a, REDFISH_=
PLATFORM_CONFIG_PRIVATE, Protocol)
-#define REGULAR_EXPRESSION_INCLUDE_ALL L".*"
-#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-"
-
-#endif
+/** @file=0D
+ This file defines the EDKII Redfish Platform Config Protocol interface.=
=0D
+=0D
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+**/=0D
+=0D
+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_=0D
+#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_=0D
+=0D
+#include <Uefi.h>=0D
+=0D
+//=0D
+// Libraries=0D
+//=0D
+#include <Library/BaseLib.h>=0D
+#include <Library/BaseMemoryLib.h>=0D
+#include <Library/DebugLib.h>=0D
+#include <Library/MemoryAllocationLib.h>=0D
+#include <Library/PrintLib.h>=0D
+#include <Library/UefiLib.h>=0D
+#include <Library/UefiBootServicesTableLib.h>=0D
+#include <Library/UefiDriverEntryPoint.h>=0D
+=0D
+//=0D
+// Produced Protocols=0D
+//=0D
+#include <Protocol/EdkIIRedfishPlatformConfig.h>=0D
+#include <Protocol/HiiDatabase.h>=0D
+#include <Protocol/HiiString.h>=0D
+#include <Protocol/RegularExpressionProtocol.h>=0D
+=0D
+//=0D
+// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY.=0D
+//=0D
+typedef struct {=0D
+ EFI_EVENT ProtocolEvent; // Protocol notification ev=
ent.=0D
+ VOID *Registration; // Protocol notification re=
gistration.=0D
+} REDFISH_PLATFORM_CONFIG_NOTIFY;=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.=0D
+//=0D
+typedef struct {=0D
+ EFI_HANDLE ImageHandle; //=
Driver image handle.=0D
+ EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol;=0D
+ REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify;=0D
+ EFI_HII_DATABASE_PROTOCOL *HiiDatabase; //=
The HII database protocol.=0D
+ REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify;=0D
+ EFI_HII_STRING_PROTOCOL *HiiString; //=
HII String Protocol.=0D
+ REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify;=0D
+ EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol; //=
Regular Expression Protocol.=0D
+ EFI_HANDLE NotifyHandle; //=
The notify handle.=0D
+ LIST_ENTRY FormsetList; //=
The list to keep cached HII formset.=0D
+ LIST_ENTRY PendingList; //=
The list to keep updated HII handle.=0D
+} REDFISH_PLATFORM_CONFIG_PRIVATE;=0D
+=0D
+#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR (a, REDFISH_=
PLATFORM_CONFIG_PRIVATE, Protocol)=0D
+#define REGULAR_EXPRESSION_INCLUDE_ALL L".*"=0D
+#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-"=0D
+=0D
+#endif=0D
diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.i=
nf b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
index 16739bef7a..81b22e03c3 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
@@ -1,53 +1,53 @@
-## @file
-# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL interfaces.
-#
-# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION =3D 0x00010005
- BASE_NAME =3D RedfishPlatformConfigDxe
- FILE_GUID =3D BEAEFFE1-0633-41B5-913C-9389339C2927
- MODULE_TYPE =3D DXE_DRIVER
- VERSION_STRING =3D 1.0
- ENTRY_POINT =3D RedfishPlatformConfigDxeEntryPoint
- UNLOAD_IMAGE =3D RedfishPlatformConfigDxeUnload
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
- RedfishPkg/RedfishPkg.dec
-
-[Sources]
- RedfishPlatformConfigDxe.h
- RedfishPlatformConfigDxe.c
- RedfishPlatformConfigImpl.h
- RedfishPlatformConfigImpl.c
-
-[LibraryClasses]
- BaseLib
- BaseMemoryLib
- DebugLib
- DevicePathLib
- HiiLib
- HiiUtilityLib
- MemoryAllocationLib
- PrintLib
- UefiLib
- UefiBootServicesTableLib
- UefiRuntimeServicesTableLib
- UefiDriverEntryPoint
-
-[Protocols]
- gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED
- gEfiHiiDatabaseProtocolGuid ## CONSUMED
- gEfiHiiStringProtocolGuid ## CONSUMED
- gEfiRegularExpressionProtocolGuid ## CONSUMED
-
-[Guids]
- gEfiRegexSyntaxTypePerlGuid ## CONSUMED
-
-[Depex]
+## @file=0D
+# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL interfaces.=0D
+#=0D
+# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>=0D
+# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+#=0D
+##=0D
+=0D
+[Defines]=0D
+ INF_VERSION =3D 0x00010005=0D
+ BASE_NAME =3D RedfishPlatformConfigDxe=0D
+ FILE_GUID =3D BEAEFFE1-0633-41B5-913C-9389339C2927=0D
+ MODULE_TYPE =3D DXE_DRIVER=0D
+ VERSION_STRING =3D 1.0=0D
+ ENTRY_POINT =3D RedfishPlatformConfigDxeEntryPoint=0D
+ UNLOAD_IMAGE =3D RedfishPlatformConfigDxeUnload=0D
+=0D
+[Packages]=0D
+ MdePkg/MdePkg.dec=0D
+ MdeModulePkg/MdeModulePkg.dec=0D
+ RedfishPkg/RedfishPkg.dec=0D
+=0D
+[Sources]=0D
+ RedfishPlatformConfigDxe.h=0D
+ RedfishPlatformConfigDxe.c=0D
+ RedfishPlatformConfigImpl.h=0D
+ RedfishPlatformConfigImpl.c=0D
+=0D
+[LibraryClasses]=0D
+ BaseLib=0D
+ BaseMemoryLib=0D
+ DebugLib=0D
+ DevicePathLib=0D
+ HiiLib=0D
+ HiiUtilityLib=0D
+ MemoryAllocationLib=0D
+ PrintLib=0D
+ UefiLib=0D
+ UefiBootServicesTableLib=0D
+ UefiRuntimeServicesTableLib=0D
+ UefiDriverEntryPoint=0D
+=0D
+[Protocols]=0D
+ gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED=0D
+ gEfiHiiDatabaseProtocolGuid ## CONSUMED=0D
+ gEfiHiiStringProtocolGuid ## CONSUMED=0D
+ gEfiRegularExpressionProtocolGuid ## CONSUMED=0D
+=0D
+[Guids]=0D
+ gEfiRegexSyntaxTypePerlGuid ## CONSUMED=0D
+=0D
+[Depex]=0D
TRUE
\ No newline at end of file
diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.=
c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
index d9eab6c883..917f946656 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
@@ -1,1240 +1,1288 @@
-/** @file
-
- The implementation of EDKII Redfidh Platform Config Protocol.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-#include "RedfishPlatformConfigDxe.h"
-#include "RedfishPlatformConfigImpl.h"
-
-extern REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate;
-
-/**
- Debug dump HII string
-
- @param[in] HiiHandle HII handle instance
- @param[in] StringId HII string to dump
-
- @retval EFI_SUCCESS Dump HII string successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpHiiString (
- IN EFI_HII_HANDLE HiiHandle,
- IN EFI_STRING_ID StringId
- )
-{
- EFI_STRING String;
-
- if (HiiHandle =3D=3D NULL || StringId =3D=3D 0) {
- DEBUG ((DEBUG_INFO, "???"));
- return EFI_INVALID_PARAMETER;
- }
-
- String =3D HiiGetString (HiiHandle, StringId, NULL);
- if (String =3D=3D NULL) {
- return EFI_NOT_FOUND;
- }
-
- DEBUG ((DEBUG_INFO, "%s", String));
- FreePool (String);
-
- return EFI_SUCCESS;
-}
-
-/**
- Debug dump HII form-set data
-
- @param[in] FormsetPrivate HII form-set private instance.
-
- @retval EFI_SUCCESS Dump form-set successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpFormset (
- IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
- UINTN Index;
-
- if (FormsetPrivate =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Index =3D 0;
- HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList);
- while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLink=
);
- HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, HiiForm=
Link);
-
- DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPrivate=
->Id));
- DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title);
- DEBUG ((DEBUG_INFO, "\n"));
-
- HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK =
(HiiStatementLink);
- HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementList=
, HiiStatementLink);
-
- DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate->Q=
uestionId));
- DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate->Descr=
iption);
- DEBUG ((DEBUG_INFO, "\n"));
-
- HiiStatementLink =3D HiiNextStatementLink;
- }
-
- HiiFormLink =3D HiiNextFormLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Debug dump HII form-set list
-
- @param[in] FormsetList Form-set list instance
-
- @retval EFI_SUCCESS Dump list successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpFormsetList (
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- UINTN Index;
-
- if (FormsetList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (FormsetList)) {
- DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__));
- return EFI_SUCCESS;
- }
-
- Index =3D 0;
- HiiFormsetLink =3D GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n", ++Ind=
ex, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid, HiiFormsetPriva=
te->DevicePathStr));
- DumpFormset (HiiFormsetPrivate);
-
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Retrieves a string from a string package in a English language. The
- returned string is allocated using AllocatePool(). The caller is respon=
sible
- for freeing the allocated buffer using FreePool().
-
- If HiiHandle is NULL, then ASSERT().
- If StringId is 0, then ASSET.
-
- @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.
- @param[in] HiiHandle A handle that was previously registered in=
the HII Database.
- @param[in] StringId The identifier of the string to retrieved =
from the string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the st=
ring package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetRedfishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN CHAR8 *Language,
- IN EFI_STRING_ID StringId
- )
-{
- EFI_STATUS Status;
- UINTN StringSize;
- CHAR16 TempString;
- EFI_STRING String;
-
- if (mRedfishPlatformConfigPrivate->HiiString =3D=3D NULL || HiiHandle =
=3D=3D NULL || StringId =3D=3D 0 || IS_EMPTY_STRING (Language)) {
- ASSERT (FALSE);
- return NULL;
- }
-
- //
- // Retrieve the size of the string in the string package for the BestLan=
guage
- //
- StringSize =3D 0;
- Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString (
- mRedfishPlatformConfigPrivate=
->HiiString,
- Language,
- HiiHandle,
- StringId,
- &TempString,
- &StringSize,
- NULL
- );
- //
- // If GetString() returns EFI_SUCCESS for a zero size,
- // then there are no supported languages registered for HiiHandle. If G=
etString()
- // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is n=
ot present
- // in the HII Database
- //
- if (Status !=3D EFI_BUFFER_TOO_SMALL) {
- return NULL;
- }
-
- //
- // Allocate a buffer for the return string
- //
- String =3D AllocateZeroPool (StringSize);
- if (String =3D=3D NULL) {
- return NULL;
- }
-
- //
- // Retrieve the string from the string package
- //
- Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString (
- mRedfishPlatformConfigPrivate=
->HiiString,
- Language,
- HiiHandle,
- StringId,
- String,
- &StringSize,
- NULL
- );
- if (EFI_ERROR (Status)) {
- //
- // Free the buffer and return NULL if the supported languages can not =
be retrieved.
- //
- FreePool (String);
- String =3D NULL;
- }
-
- //
- // Return the Null-terminated Unicode string
- //
- return String;
-}
-
-/**
- Get string from HII database in English language.
-
- @param[in] HiiHandle A handle that was previously registered in=
the HII Database.
- @param[in] StringId The identifier of the string to retrieved =
from the string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the st=
ring package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetEnglishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN EFI_STRING_ID StringId
- )
-{
- return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE, StringId);
-}
-
-/**
- Check and see if this is supported schema or not.
-
- @param[in] SupportedSchema The list of supported schema.
- @param[in] Schema Schema string to be checked.
-
- @retval BOOLEAN TRUE if this is supported schema. FALSE ot=
herwise.
-
-**/
-BOOLEAN
-CheckSupportedSchema (
- IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema,
- IN CHAR8 *Schema
- )
-{
- UINTN Index;
-
- if (SupportedSchema =3D=3D NULL || IS_EMPTY_STRING (Schema)) {
- return FALSE;
- }
-
- if (SupportedSchema->Count =3D=3D 0) {
- return FALSE;
- }
-
- for (Index =3D 0; Index < SupportedSchema->Count; Index++) {
- if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) =3D=3D 0)=
{
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Get the list of supported schema from the given HII handle.
-
- @param[in] HiiHandle HII handle instance.
- @param[out] SupportedSchema Supported schema on this HII handle.
-
- @retval EFI_SUCCESS Schema list is returned.
- @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema is NU=
LL.
- @retval EFI_NOT_FOUND No supported schema found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetSupportedSchema (
- IN EFI_HII_HANDLE HiiHandle,
- OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema
- )
-{
- CHAR8 *SupportedLanguages;
- UINTN Index;
- UINTN LangIndex;
- UINTN Count;
- UINTN StrSize;
- UINTN ListIndex;
-
- if (HiiHandle =3D=3D NULL || SupportedSchema =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- SupportedSchema->Count =3D 0;
-
- SupportedLanguages =3D HiiGetSupportedLanguages (HiiHandle);
- if (SupportedLanguages =3D=3D NULL) {
- return EFI_NOT_FOUND;
- }
-
- Index =3D 0;
- LangIndex =3D 0;
- Count =3D 0;
- while (TRUE) {
- if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index] =
=3D=3D '\0') {
- if (AsciiStrnCmp (&SupportedLanguages[LangIndex], X_UEFI_SCHEMA_PREF=
IX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) {
- ++Count;
- }
- LangIndex =3D Index + 1;
- }
-
- if (SupportedLanguages[Index] =3D=3D '\0') {
- break;
- }
-
- ++Index;
- }
-
- if (Count =3D=3D 0) {
- return EFI_NOT_FOUND;
- }
-
- SupportedSchema->Count =3D Count;
- SupportedSchema->SchemaList =3D AllocatePool (sizeof (CHAR8 *) * Count);
- if (SupportedSchema->SchemaList =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Index =3D 0;
- LangIndex =3D 0;
- ListIndex =3D 0;
- while (TRUE) {
-
- if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index] =
=3D=3D '\0') {
- if (AsciiStrnCmp (&SupportedLanguages[LangIndex], X_UEFI_SCHEMA_PREF=
IX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) {
- StrSize =3D Index - LangIndex;
- SupportedSchema->SchemaList[ListIndex] =3D AllocateCopyPool ((StrS=
ize + 1), &SupportedLanguages[LangIndex]);
- SupportedSchema->SchemaList[ListIndex][StrSize] =3D '\0';
- ++ListIndex;
- }
-
- LangIndex =3D Index + 1;
- }
-
- if (SupportedLanguages[Index] =3D=3D '\0') {
- break;
- }
-
- ++Index;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Search and find statement private instance by given regular expression p=
atthern
- which describes the Configure Language.
-
- @param[in] RegularExpressionProtocol Regular express protocol.
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] Pattern Regular expression pattern.
- @param[out] StatementList Statement list that match above =
pattern.
-
- @retval EFI_SUCCESS Statement list is returned.
- @retval EFI_INVALID_PARAMETER Input parameter is NULL.
- @retval EFI_NOT_READY Regular express protocol is NULL.
- @retval EFI_NOT_FOUND No statement is found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetStatementPrivateByConfigureLangRegex (
- IN EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionPr=
otocol,
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING Pattern,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
- EFI_STRING TmpString;
- UINTN CaptureCount;
- BOOLEAN IsMatch;
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
-
- if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRI=
NG (Pattern) || StatementList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (RegularExpressionProtocol =3D=3D NULL) {
- return EFI_NOT_READY;
- }
-
- StatementList->Count =3D 0;
- InitializeListHead (&StatementList->StatementList);
-
- if (IsListEmpty (FormsetList)) {
- return EFI_NOT_FOUND;
- }
-
- HiiFormsetLink =3D GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- //
- // Performance check.
- // If there is no desired Redfish schema found, skip this formset.
- //
- if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, Schema=
)) {
- HiiFormsetLink =3D HiiFormsetNextLink;
- continue;
- }
-
- HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList);
- while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, Hi=
iFormLink);
- HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLi=
nk);
-
- HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi=
st, HiiStatementLink);
- HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LIN=
K (HiiStatementLink);
-
- if (HiiStatementPrivate->Description !=3D 0) {
- TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,=
Schema, HiiStatementPrivate->Description);
- if (TmpString !=3D NULL) {
- Status =3D RegularExpressionProtocol->MatchString (
- RegularExpressionProtoco=
l,
- TmpString,
- Pattern,
- &gEfiRegexSyntaxTypePerl=
Guid,
- &IsMatch,
- NULL,
- &CaptureCount
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n", =
__FUNCTION__, Pattern, Status));
- ASSERT (FALSE);
- return Status;
- }
-
- //
- // Found
- //
- if (IsMatch) {
- StatementRef =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_=
CONFIG_STATEMENT_PRIVATE_REF));
- if (StatementRef =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- StatementRef->Statement =3D HiiStatementPrivate;
- InsertTailList (&StatementList->StatementList, &StatementRef=
->Link);
- ++StatementList->Count;
- }
-
- FreePool (TmpString);
- }
- }
-
- HiiStatementLink =3D HiiNextStatementLink;
- }
-
- HiiFormLink =3D HiiNextFormLink;
- }
-
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Get statement private instance by the given configure language.
-
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] ConfigureLang Configure language.
-
- @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to stateme=
nt private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *
-GetStatementPrivateByConfigureLang (
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
- EFI_STRING TmpString;
-
- if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRI=
NG (ConfigureLang)) {
- return NULL;
- }
-
- if (IsListEmpty (FormsetList)) {
- return NULL;
- }
-
- HiiFormsetLink =3D GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- //
- // Performance check.
- // If there is no desired Redfish schema found, skip this formset.
- //
- if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, Schema=
)) {
- HiiFormsetLink =3D HiiFormsetNextLink;
- continue;
- }
-
- HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList);
- while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, Hi=
iFormLink);
- HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLi=
nk);
-
- HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi=
st, HiiStatementLink);
- HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LIN=
K (HiiStatementLink);
-
- DEBUG_CODE (
- STATIC UINTN Index =3D 0;
- DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%x =
formset: %g\n", __FUNCTION__, ++Index, ConfigureLang, HiiStatementPrivate->=
QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate->Guid));
- );
-
- if (HiiStatementPrivate->Description !=3D 0) {
- TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,=
Schema, HiiStatementPrivate->Description);
- if (TmpString !=3D NULL) {
- if (StrCmp (TmpString, ConfigureLang) =3D=3D 0) {
- FreePool (TmpString);
- return HiiStatementPrivate;
- }
-
- FreePool (TmpString);
- }
- }
-
- HiiStatementLink =3D HiiNextStatementLink;
- }
-
- HiiFormLink =3D HiiNextFormLink;
- }
-
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- return NULL;
-}
-
-/**
- Get form-set private instance by the given HII handle.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] FormsetList Form-set list to search.
-
- @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to form-set=
private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *
-GetFormsetPrivateByHiiHandle (
- IN EFI_HII_HANDLE HiiHandle,
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
-
- if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) {
- return NULL;
- }
-
- if (IsListEmpty (FormsetList)) {
- return NULL;
- }
-
- HiiFormsetLink =3D GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- if (HiiFormsetPrivate->HiiHandle =3D=3D HiiHandle) {
- return HiiFormsetPrivate;
- }
-
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- return NULL;
-}
-
-/**
- Release formset and all the forms and statements that belong to this for=
mset.
-
- @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormset (
- IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
- UINTN Index;
-
- if (FormsetPrivate =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList);
- while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLink=
);
- HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, HiiForm=
Link);
-
- HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK =
(HiiStatementLink);
- HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementList=
, HiiStatementLink);
-
- //
- // HiiStatementPrivate->HiiStatement will be released in DestroyForm=
Set().
- //
-
- if (HiiStatementPrivate->DesStringCache !=3D NULL) {
- FreePool (HiiStatementPrivate->DesStringCache);
- HiiStatementPrivate->DesStringCache =3D NULL;
- }
-
- RemoveEntryList (&HiiStatementPrivate->Link);
- FreePool (HiiStatementPrivate);
- HiiStatementLink =3D HiiNextStatementLink;
- }
-
- //
- // HiiStatementPrivate->HiiForm will be released in DestroyFormSet().
- //
-
- RemoveEntryList (&HiiFormPrivate->Link);
- FreePool (HiiFormPrivate);
- HiiFormLink =3D HiiNextFormLink;
- }
-
- if (FormsetPrivate->HiiFormSet !=3D NULL) {
- DestroyFormSet (FormsetPrivate->HiiFormSet);
- FormsetPrivate->HiiFormSet =3D NULL;
- }
-
- FreePool (FormsetPrivate->DevicePathStr);
-
- //
- // Release schema list
- //
- if (FormsetPrivate->SupportedSchema.SchemaList !=3D NULL) {
- for (Index =3D 0; Index < FormsetPrivate->SupportedSchema.Count; Index=
++) {
- FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]);
- }
-
- FreePool (FormsetPrivate->SupportedSchema.SchemaList);
- FormsetPrivate->SupportedSchema.SchemaList =3D NULL;
- FormsetPrivate->SupportedSchema.Count =3D 0;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Create new form-set instance.
-
- @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to newly cr=
eated form-set private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *
-NewFormsetPrivate (
- VOID
- )
-{
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate;
-
- NewFormsetPrivate =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_=
FORM_SET_PRIVATE));
- if (NewFormsetPrivate =3D=3D NULL) {
- return NULL;
- }
-
- //
- // Initial newly created formset private data.
- //
- InitializeListHead (&NewFormsetPrivate->HiiFormList);
-
- return NewFormsetPrivate;
-}
-
-/**
- Load the HII formset from the given HII handle.
-
- @param[in] HiiHandle Target HII handle to load.
- @param[out] FormsetPrivate The formset private data.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormset (
- IN EFI_HII_HANDLE HiiHandle,
- OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- EFI_STATUS Status;
- HII_FORMSET *HiiFormSet;
- HII_FORM *HiiForm;
- LIST_ENTRY *HiiFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- HII_STATEMENT *HiiStatement;
- LIST_ENTRY *HiiStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
- EFI_GUID ZeroGuid;
-
- if (HiiHandle =3D=3D NULL || FormsetPrivate =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
-
- HiiFormSet =3D AllocateZeroPool (sizeof (HII_FORMSET));
- if (HiiFormSet =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Find HII formset by the given HII handle.
- //
- ZeroMem (&ZeroGuid, sizeof (ZeroGuid));
- Status =3D CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);
- if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {
- Status =3D EFI_NOT_FOUND;
- goto ErrorExit;
- }
-
- //
- // Initialize formset
- //
- InitializeFormSet (HiiFormSet);
-
- //
- // Initialize formset private data.
- //
- FormsetPrivate->HiiFormSet =3D HiiFormSet;
- FormsetPrivate->HiiHandle =3D HiiHandle;
- CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid);
- FormsetPrivate->DevicePathStr =3D ConvertDevicePathToText (HiiFormSet->D=
evicePath, FALSE, FALSE);
- Status =3D GetSupportedSchema (FormsetPrivate->HiiHandle, &FormsetPrivat=
e->SupportedSchema);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found: %r\n",=
__FUNCTION__, FormsetPrivate->HiiHandle, Status));
- }
-
- HiiFormLink =3D GetFirstNode (&HiiFormSet->FormListHead);
- while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) {
- HiiForm =3D HII_FORM_FROM_LINK (HiiFormLink);
-
- HiiFormPrivate =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_F=
ORM_PRIVATE));
- if (HiiFormPrivate =3D=3D NULL) {
- Status =3D EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
-
- //
- // Initialize form private data.
- //
- HiiFormPrivate->HiiForm =3D HiiForm;
- HiiFormPrivate->Id =3D HiiForm->FormId;
- HiiFormPrivate->Title =3D HiiForm->FormTitle;
- HiiFormPrivate->ParentFormset =3D FormsetPrivate;
- InitializeListHead (&HiiFormPrivate->StatementList);
-
- HiiStatementLink =3D GetFirstNode (&HiiForm->StatementListHead);
- while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) {
- HiiStatement =3D HII_STATEMENT_FROM_LINK (HiiStatementLink);
-
- HiiStatementPrivate =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_C=
ONFIG_STATEMENT_PRIVATE));
- if (HiiStatementPrivate =3D=3D NULL) {
- Status =3D EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
- //
- // Initialize statement private data.
- //
- HiiStatementPrivate->HiiStatement =3D HiiStatement;
- HiiStatementPrivate->QuestionId =3D HiiStatement->QuestionId;
- HiiStatementPrivate->Description =3D HiiStatement->Prompt;
- HiiStatementPrivate->ParentForm =3D HiiFormPrivate;
-
- //
- // Attach to statement list.
- //
- InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate=
->Link);
- HiiStatementLink =3D GetNextNode (&HiiForm->StatementListHead, HiiSt=
atementLink);
- }
- //
- // Attach to form list.
- //
- InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link);
- HiiFormLink =3D GetNextNode (&HiiFormSet->FormListHead, HiiFormLink);
- }
-
- return EFI_SUCCESS;
-
-ErrorExit:
-
- //
- // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate yet.
- //
- if (HiiFormSet !=3D NULL && FormsetPrivate->HiiFormSet !=3D HiiFormSet) {
- DestroyFormSet (HiiFormSet);
- }
-
- //
- // Release resource when error happens.
- //
- ReleaseFormset (FormsetPrivate);
-
- return Status;
-}
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormsetList (
- IN EFI_HII_HANDLE *HiiHandle,
- OUT LIST_ENTRY *FormsetList
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;
-
- if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- FormsetPrivate =3D GetFormsetPrivateByHiiHandle (HiiHandle, FormsetList);
- if (FormsetPrivate !=3D NULL) {
- return EFI_ALREADY_STARTED;
- }
-
- FormsetPrivate =3D NewFormsetPrivate ();
- if (FormsetPrivate =3D=3D NULL) {
- DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Load formset on the given HII handle.
- //
- Status =3D LoadFormset (HiiHandle, FormsetPrivate);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n", __FUNCTION__,=
Status));
- FreePool (FormsetPrivate);
- return Status;
- }
-
- //
- // Attach to cache list.
- //
- InsertTailList (FormsetList, &FormsetPrivate->Link);
-
- DEBUG_CODE (
- DumpFormsetList (FormsetList);
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormsetList (
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
-
- if (FormsetList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (FormsetList)) {
- return EFI_SUCCESS;
- }
-
- HiiFormsetLink =3D GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);
-
- //
- // Detach from list.
- //
- RemoveEntryList (&HiiFormsetPrivate->Link);
- ReleaseFormset (HiiFormsetPrivate);
- FreePool (HiiFormsetPrivate);
- HiiFormsetLink =3D HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Get all pending list.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep pending data.
-
- @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to pending list=
data.
-
-**/
-REDFISH_PLATFORM_CONFIG_PENDING_LIST *
-GetPendingList (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- LIST_ENTRY *PendingListLink;
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;
-
- if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) {
- return NULL;
- }
-
- if (IsListEmpty (PendingList)) {
- return NULL;
- }
-
- PendingListLink =3D GetFirstNode (PendingList);
- while (!IsNull (PendingList, PendingListLink)) {
- Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK (PendingList=
Link);
-
- if (Target->HiiHandle =3D=3D HiiHandle) {
- return Target;
- }
-
- PendingListLink =3D GetNextNode (PendingList, PendingListLink);
- }
-
- return NULL;
-}
-
-/**
- When HII database is updated. Keep updated HII handle into pending list =
so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetUpdate (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;
-
- if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check and see if this HII handle is processed already.
- //
- TargetPendingList =3D GetPendingList (HiiHandle, PendingList);
- if (TargetPendingList !=3D NULL) {
- TargetPendingList->IsDeleted =3D FALSE;
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n", __FUNCTION__,=
HiiHandle));
- );
- return EFI_SUCCESS;
- }
-
- TargetPendingList=3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_P=
ENDING_LIST));
- if (TargetPendingList =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TargetPendingList->HiiHandle =3D HiiHandle;
- TargetPendingList->IsDeleted =3D FALSE;
-
- InsertTailList (PendingList, &TargetPendingList->Link);
-
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n", __FUNCTION__,=
HiiHandle));
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- When HII database is updated and form-set is deleted. Keep deleted HII h=
andle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetDeleted (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;
-
- if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check and see if this HII handle is processed already.
- //
- TargetPendingList =3D GetPendingList (HiiHandle, PendingList);
- if (TargetPendingList !=3D NULL) {
- TargetPendingList->IsDeleted =3D TRUE;
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n",=
__FUNCTION__, HiiHandle));
- );
- return EFI_SUCCESS;
- }
-
- TargetPendingList=3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_P=
ENDING_LIST));
- if (TargetPendingList =3D=3D NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TargetPendingList->HiiHandle =3D HiiHandle;
- TargetPendingList->IsDeleted =3D TRUE;
-
- InsertTailList (PendingList, &TargetPendingList->Link);
-
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n", __FUNCTION__,=
HiiHandle));
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- There are HII database update and we need to process them accordingly so=
that we
- won't use stale data. This function will parse updated HII handle again =
in order
- to get updated data-set.
-
- @param[in] FormsetList List to keep HII form-set.
- @param[in] PendingList List to keep HII handle that is updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is NU=
LL.
-
-**/
-EFI_STATUS
-ProcessPendingList (
- IN LIST_ENTRY *FormsetList,
- IN LIST_ENTRY *PendingList
- )
-{
- LIST_ENTRY *PendingListLink;
- LIST_ENTRY *PendingListNextLink;
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;
- EFI_STATUS Status;
-
-
- if (FormsetList =3D=3D NULL || PendingList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (PendingList)) {
- return EFI_SUCCESS;
- }
-
- PendingListLink =3D GetFirstNode (PendingList);
- while (!IsNull (PendingList, PendingListLink)) {
- PendingListNextLink =3D GetNextNode (PendingList, PendingListLink);
- Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK (PendingList=
Link);
-
- if (Target->IsDeleted) {
- //
- // The HII resource on this HII handle is removed. Release the forms=
et.
- //
- FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle, =
FormsetList);
- if (FormsetPrivate !=3D NULL) {
- DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver rel=
ease HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid));
- RemoveEntryList (&FormsetPrivate->Link);
- ReleaseFormset (FormsetPrivate);
- FreePool (FormsetPrivate);
- } else {
- DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was removed al=
ready\n", __FUNCTION__, Target->HiiHandle));
- }
- } else {
- //
- // The HII resource on this HII handle is updated/removed.
- //
- FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle, =
FormsetList);
- if (FormsetPrivate !=3D NULL) {
- //
- // HII formset already exist, release it and query again.
- //
- DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current f=
ormset\n", __FUNCTION__, &FormsetPrivate->Guid));
- RemoveEntryList (&FormsetPrivate->Link);
- ReleaseFormset (FormsetPrivate);
- FreePool (FormsetPrivate);
- }
-
- Status =3D LoadFormsetList (Target->HiiHandle, FormsetList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x faile=
d: %r\n", __FUNCTION__, Target->HiiHandle, Status));
- }
- }
-
- //
- // Detach it from list first.
- //
- RemoveEntryList (&Target->Link);
- FreePool (Target);
-
- PendingListLink =3D PendingListNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Release all resource in statement list.
-
- @param[in] StatementList Statement list to be released.
-
- @retval EFI_SUCCESS All resource are released.
- @retval EFI_INVALID_PARAMETER StatementList is NULL.
-
-**/
-EFI_STATUS
-ReleaseStatementList (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList
- )
-{
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
- LIST_ENTRY *NextLink;
-
- if (StatementList =3D=3D NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (&StatementList->StatementList)) {
- return EFI_SUCCESS;
- }
-
- NextLink =3D GetFirstNode (&StatementList->StatementList);
- while (!IsNull (&StatementList->StatementList, NextLink)) {
- StatementRef =3D REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (Next=
Link);
- NextLink =3D GetNextNode (&StatementList->StatementList, NextLink);
-
- RemoveEntryList (&StatementRef->Link);
- FreePool (StatementRef);
- }
-
- return EFI_SUCCESS;
-}
+/** @file=0D
+=0D
+ The implementation of EDKII Redfidh Platform Config Protocol.=0D
+=0D
+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+**/=0D
+#include "RedfishPlatformConfigDxe.h"=0D
+#include "RedfishPlatformConfigImpl.h"=0D
+=0D
+extern REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate;=0D
+=0D
+/**=0D
+ Debug dump HII string=0D
+=0D
+ @param[in] HiiHandle HII handle instance=0D
+ @param[in] StringId HII string to dump=0D
+=0D
+ @retval EFI_SUCCESS Dump HII string successfully=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+DumpHiiString (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN EFI_STRING_ID StringId=0D
+ )=0D
+{=0D
+ EFI_STRING String;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || StringId =3D=3D 0) {=0D
+ DEBUG ((DEBUG_INFO, "???"));=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ String =3D HiiGetString (HiiHandle, StringId, NULL);=0D
+ if (String =3D=3D NULL) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ DEBUG ((DEBUG_INFO, "%s", String));=0D
+ FreePool (String);=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Debug dump HII form-set data=0D
+=0D
+ @param[in] FormsetPrivate HII form-set private instance.=0D
+=0D
+ @retval EFI_SUCCESS Dump form-set successfully=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+DumpFormset (=0D
+ IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormLink;=0D
+ LIST_ENTRY *HiiNextFormLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;=0D
+ LIST_ENTRY *HiiStatementLink;=0D
+ LIST_ENTRY *HiiNextStatementLink;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;=0D
+ UINTN Index;=0D
+=0D
+ if (FormsetPrivate =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ Index =3D 0;=0D
+ HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList);=0D
+ while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {=0D
+ HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLink=
);=0D
+ HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, HiiForm=
Link);=0D
+=0D
+ DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPrivate=
->Id));=0D
+ DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title);=0D
+ DEBUG ((DEBUG_INFO, "\n"));=0D
+=0D
+ HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList);=0D
+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {=0D
+ HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK =
(HiiStatementLink);=0D
+ HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementList=
, HiiStatementLink);=0D
+=0D
+ DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate->Q=
uestionId));=0D
+ DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate->Descr=
iption);=0D
+ DEBUG ((DEBUG_INFO, "\n"));=0D
+=0D
+ HiiStatementLink =3D HiiNextStatementLink;=0D
+ }=0D
+=0D
+ HiiFormLink =3D HiiNextFormLink;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Debug dump HII form-set list=0D
+=0D
+ @param[in] FormsetList Form-set list instance=0D
+=0D
+ @retval EFI_SUCCESS Dump list successfully=0D
+ @retval Others Errors occur=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+DumpFormsetList (=0D
+ IN LIST_ENTRY *FormsetList=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormsetLink;=0D
+ LIST_ENTRY *HiiFormsetNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;=0D
+ UINTN Index;=0D
+=0D
+ if (FormsetList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (IsListEmpty (FormsetList)) {=0D
+ DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__));=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ Index =3D 0;=0D
+ HiiFormsetLink =3D GetFirstNode (FormsetList);=0D
+ while (!IsNull (FormsetList, HiiFormsetLink)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n", ++Ind=
ex, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid, HiiFormsetPriva=
te->DevicePathStr));=0D
+ DumpFormset (HiiFormsetPrivate);=0D
+=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Retrieves a string from a string package in a English language. The=0D
+ returned string is allocated using AllocatePool(). The caller is respon=
sible=0D
+ for freeing the allocated buffer using FreePool().=0D
+=0D
+ If HiiHandle is NULL, then ASSERT().=0D
+ If StringId is 0, then ASSET.=0D
+=0D
+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.=0D
+ @param[in] HiiHandle A handle that was previously registered in=
the HII Database.=0D
+ @param[in] StringId The identifier of the string to retrieved =
from the string=0D
+ package associated with HiiHandle.=0D
+=0D
+ @retval NULL The string specified by StringId is not present in the st=
ring package.=0D
+ @retval Other The string was returned.=0D
+=0D
+**/=0D
+EFI_STRING=0D
+HiiGetRedfishString (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN CHAR8 *Language,=0D
+ IN EFI_STRING_ID StringId=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ UINTN StringSize;=0D
+ CHAR16 TempString;=0D
+ EFI_STRING String;=0D
+=0D
+ if (mRedfishPlatformConfigPrivate->HiiString =3D=3D NULL || HiiHandle =
=3D=3D NULL || StringId =3D=3D 0 || IS_EMPTY_STRING (Language)) {=0D
+ ASSERT (FALSE);=0D
+ return NULL;=0D
+ }=0D
+=0D
+ //=0D
+ // Retrieve the size of the string in the string package for the BestLan=
guage=0D
+ //=0D
+ StringSize =3D 0;=0D
+ Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString (=0D
+ mRedfishPlatformConfigPrivate=
->HiiString,=0D
+ Language,=0D
+ HiiHandle,=0D
+ StringId,=0D
+ &TempString,=0D
+ &StringSize,=0D
+ NULL=0D
+ );=0D
+ //=0D
+ // If GetString() returns EFI_SUCCESS for a zero size,=0D
+ // then there are no supported languages registered for HiiHandle. If G=
etString()=0D
+ // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is n=
ot present=0D
+ // in the HII Database=0D
+ //=0D
+ if (Status !=3D EFI_BUFFER_TOO_SMALL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ //=0D
+ // Allocate a buffer for the return string=0D
+ //=0D
+ String =3D AllocateZeroPool (StringSize);=0D
+ if (String =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ //=0D
+ // Retrieve the string from the string package=0D
+ //=0D
+ Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString (=0D
+ mRedfishPlatformConfigPrivate=
->HiiString,=0D
+ Language,=0D
+ HiiHandle,=0D
+ StringId,=0D
+ String,=0D
+ &StringSize,=0D
+ NULL=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ //=0D
+ // Free the buffer and return NULL if the supported languages can not =
be retrieved.=0D
+ //=0D
+ FreePool (String);=0D
+ String =3D NULL;=0D
+ }=0D
+=0D
+ //=0D
+ // Return the Null-terminated Unicode string=0D
+ //=0D
+ return String;=0D
+}=0D
+=0D
+/**=0D
+ Retrieves a string from a string package in a English language. The=0D
+ returned string is allocated using AllocatePool(). The caller is respon=
sible=0D
+ for freeing the allocated buffer using FreePool().=0D
+=0D
+ If HiiHandle is NULL, then ASSERT().=0D
+ If StringId is 0, then ASSET.=0D
+=0D
+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.=0D
+ @param[in] HiiHandle A handle that was previously registered in=
the HII Database.=0D
+ @param[in] StringId The identifier of the string to retrieved =
from the string=0D
+ package associated with HiiHandle.=0D
+=0D
+ @retval NULL The string specified by StringId is not present in the st=
ring package.=0D
+ @retval Other The string was returned.=0D
+=0D
+**/=0D
+CHAR8 *=0D
+HiiGetRedfishAsciiString (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN CHAR8 *Language,=0D
+ IN EFI_STRING_ID StringId=0D
+ )=0D
+{=0D
+ EFI_STRING HiiString;=0D
+ UINTN StringSize;=0D
+ CHAR8 *AsciiString;=0D
+=0D
+ HiiString =3D HiiGetRedfishString (HiiHandle, Language, StringId);=0D
+ if (HiiString =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n", __F=
UNCTION__, StringId, Language));=0D
+ return NULL;=0D
+ }=0D
+=0D
+ StringSize =3D (StrLen (HiiString) + 1) * sizeof (CHAR8);=0D
+ AsciiString =3D AllocatePool (StringSize);=0D
+ if (AsciiString =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ UnicodeStrToAsciiStrS (HiiString, AsciiString, StringSize);=0D
+=0D
+ FreePool (HiiString);=0D
+ return AsciiString;=0D
+}=0D
+=0D
+/**=0D
+ Get string from HII database in English language.=0D
+=0D
+ @param[in] HiiHandle A handle that was previously registered in=
the HII Database.=0D
+ @param[in] StringId The identifier of the string to retrieved =
from the string=0D
+ package associated with HiiHandle.=0D
+=0D
+ @retval NULL The string specified by StringId is not present in the st=
ring package.=0D
+ @retval Other The string was returned.=0D
+=0D
+**/=0D
+EFI_STRING=0D
+HiiGetEnglishString (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN EFI_STRING_ID StringId=0D
+ )=0D
+{=0D
+ return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE, StringId);=
=0D
+}=0D
+=0D
+/**=0D
+ Check and see if this is supported schema or not.=0D
+=0D
+ @param[in] SupportedSchema The list of supported schema.=0D
+ @param[in] Schema Schema string to be checked.=0D
+=0D
+ @retval BOOLEAN TRUE if this is supported schema. FALSE ot=
herwise.=0D
+=0D
+**/=0D
+BOOLEAN=0D
+CheckSupportedSchema (=0D
+ IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema,=0D
+ IN CHAR8 *Schema=0D
+ )=0D
+{=0D
+ UINTN Index;=0D
+=0D
+ if (SupportedSchema =3D=3D NULL || IS_EMPTY_STRING (Schema)) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ if (SupportedSchema->Count =3D=3D 0) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ for (Index =3D 0; Index < SupportedSchema->Count; Index++) {=0D
+ if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) =3D=3D 0)=
{=0D
+ return TRUE;=0D
+ }=0D
+ }=0D
+=0D
+ return FALSE;=0D
+}=0D
+=0D
+/**=0D
+ Get the list of supported schema from the given HII handle.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[out] SupportedSchema Supported schema on this HII handle.=0D
+=0D
+ @retval EFI_SUCCESS Schema list is returned.=0D
+ @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema is NU=
LL.=0D
+ @retval EFI_NOT_FOUND No supported schema found.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+GetSupportedSchema (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema=0D
+ )=0D
+{=0D
+ CHAR8 *SupportedLanguages;=0D
+ UINTN Index;=0D
+ UINTN LangIndex;=0D
+ UINTN Count;=0D
+ UINTN StrSize;=0D
+ UINTN ListIndex;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || SupportedSchema =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ SupportedSchema->Count =3D 0;=0D
+=0D
+ SupportedLanguages =3D HiiGetSupportedLanguages (HiiHandle);=0D
+ if (SupportedLanguages =3D=3D NULL) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ Index =3D 0;=0D
+ LangIndex =3D 0;=0D
+ Count =3D 0;=0D
+ while (TRUE) {=0D
+ if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index] =
=3D=3D '\0') {=0D
+ if (AsciiStrnCmp (&SupportedLanguages[LangIndex], X_UEFI_SCHEMA_PREF=
IX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) {=0D
+ ++Count;=0D
+ }=0D
+ LangIndex =3D Index + 1;=0D
+ }=0D
+=0D
+ if (SupportedLanguages[Index] =3D=3D '\0') {=0D
+ break;=0D
+ }=0D
+=0D
+ ++Index;=0D
+ }=0D
+=0D
+ if (Count =3D=3D 0) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ SupportedSchema->Count =3D Count;=0D
+ SupportedSchema->SchemaList =3D AllocatePool (sizeof (CHAR8 *) * Count);=
=0D
+ if (SupportedSchema->SchemaList =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ Index =3D 0;=0D
+ LangIndex =3D 0;=0D
+ ListIndex =3D 0;=0D
+ while (TRUE) {=0D
+=0D
+ if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index] =
=3D=3D '\0') {=0D
+ if (AsciiStrnCmp (&SupportedLanguages[LangIndex], X_UEFI_SCHEMA_PREF=
IX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) {=0D
+ StrSize =3D Index - LangIndex;=0D
+ SupportedSchema->SchemaList[ListIndex] =3D AllocateCopyPool ((StrS=
ize + 1), &SupportedLanguages[LangIndex]);=0D
+ SupportedSchema->SchemaList[ListIndex][StrSize] =3D '\0';=0D
+ ++ListIndex;=0D
+ }=0D
+=0D
+ LangIndex =3D Index + 1;=0D
+ }=0D
+=0D
+ if (SupportedLanguages[Index] =3D=3D '\0') {=0D
+ break;=0D
+ }=0D
+=0D
+ ++Index;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Search and find statement private instance by given regular expression p=
atthern=0D
+ which describes the Configure Language.=0D
+=0D
+ @param[in] RegularExpressionProtocol Regular express protocol.=0D
+ @param[in] FormsetList Form-set list to search.=0D
+ @param[in] Schema Schema to be matched.=0D
+ @param[in] Pattern Regular expression pattern.=0D
+ @param[out] StatementList Statement list that match above =
pattern.=0D
+=0D
+ @retval EFI_SUCCESS Statement list is returned.=0D
+ @retval EFI_INVALID_PARAMETER Input parameter is NULL.=0D
+ @retval EFI_NOT_READY Regular express protocol is NULL.=0D
+ @retval EFI_NOT_FOUND No statement is found.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+GetStatementPrivateByConfigureLangRegex (=0D
+ IN EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionPr=
otocol,=0D
+ IN LIST_ENTRY *FormsetList,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING Pattern,=0D
+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormsetLink;=0D
+ LIST_ENTRY *HiiFormsetNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;=0D
+ LIST_ENTRY *HiiFormLink;=0D
+ LIST_ENTRY *HiiNextFormLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;=0D
+ LIST_ENTRY *HiiStatementLink;=0D
+ LIST_ENTRY *HiiNextStatementLink;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;=0D
+ EFI_STRING TmpString;=0D
+ UINTN CaptureCount;=0D
+ BOOLEAN IsMatch;=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;=0D
+=0D
+ if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRI=
NG (Pattern) || StatementList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (RegularExpressionProtocol =3D=3D NULL) {=0D
+ return EFI_NOT_READY;=0D
+ }=0D
+=0D
+ StatementList->Count =3D 0;=0D
+ InitializeListHead (&StatementList->StatementList);=0D
+=0D
+ if (IsListEmpty (FormsetList)) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D GetFirstNode (FormsetList);=0D
+ while (!IsNull (FormsetList, HiiFormsetLink)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ //=0D
+ // Performance check.=0D
+ // If there is no desired Redfish schema found, skip this formset.=0D
+ //=0D
+ if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, Schema=
)) {=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ continue;=0D
+ }=0D
+=0D
+ HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList);=0D
+ while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {=0D
+ HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, Hi=
iFormLink);=0D
+ HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLi=
nk);=0D
+=0D
+ HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList);=0D
+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {=
=0D
+ HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi=
st, HiiStatementLink);=0D
+ HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LIN=
K (HiiStatementLink);=0D
+=0D
+ if (HiiStatementPrivate->Description !=3D 0) {=0D
+ TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,=
Schema, HiiStatementPrivate->Description);=0D
+ if (TmpString !=3D NULL) {=0D
+ Status =3D RegularExpressionProtocol->MatchString (=0D
+ RegularExpressionProtoco=
l,=0D
+ TmpString,=0D
+ Pattern,=0D
+ &gEfiRegexSyntaxTypePerl=
Guid,=0D
+ &IsMatch,=0D
+ NULL,=0D
+ &CaptureCount=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n", =
__FUNCTION__, Pattern, Status));=0D
+ ASSERT (FALSE);=0D
+ return Status;=0D
+ }=0D
+=0D
+ //=0D
+ // Found=0D
+ //=0D
+ if (IsMatch) {=0D
+ StatementRef =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_=
CONFIG_STATEMENT_PRIVATE_REF));=0D
+ if (StatementRef =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ StatementRef->Statement =3D HiiStatementPrivate;=0D
+ InsertTailList (&StatementList->StatementList, &StatementRef=
->Link);=0D
+ ++StatementList->Count;=0D
+ }=0D
+=0D
+ FreePool (TmpString);=0D
+ }=0D
+ }=0D
+=0D
+ HiiStatementLink =3D HiiNextStatementLink;=0D
+ }=0D
+=0D
+ HiiFormLink =3D HiiNextFormLink;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Get statement private instance by the given configure language.=0D
+=0D
+ @param[in] FormsetList Form-set list to search.=0D
+ @param[in] Schema Schema to be matched.=0D
+ @param[in] ConfigureLang Configure language.=0D
+=0D
+ @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to stateme=
nt private instance.=0D
+=0D
+**/=0D
+REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *=0D
+GetStatementPrivateByConfigureLang (=0D
+ IN LIST_ENTRY *FormsetList,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING ConfigureLang=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormsetLink;=0D
+ LIST_ENTRY *HiiFormsetNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;=0D
+ LIST_ENTRY *HiiFormLink;=0D
+ LIST_ENTRY *HiiNextFormLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;=0D
+ LIST_ENTRY *HiiStatementLink;=0D
+ LIST_ENTRY *HiiNextStatementLink;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;=0D
+ EFI_STRING TmpString;=0D
+=0D
+ if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRI=
NG (ConfigureLang)) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ if (IsListEmpty (FormsetList)) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D GetFirstNode (FormsetList);=0D
+ while (!IsNull (FormsetList, HiiFormsetLink)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ //=0D
+ // Performance check.=0D
+ // If there is no desired Redfish schema found, skip this formset.=0D
+ //=0D
+ if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, Schema=
)) {=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ continue;=0D
+ }=0D
+=0D
+ HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList);=0D
+ while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {=0D
+ HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, Hi=
iFormLink);=0D
+ HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLi=
nk);=0D
+=0D
+ HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList);=0D
+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {=
=0D
+ HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi=
st, HiiStatementLink);=0D
+ HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LIN=
K (HiiStatementLink);=0D
+=0D
+ DEBUG_CODE (=0D
+ STATIC UINTN Index =3D 0;=0D
+ DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%x =
formset: %g\n", __FUNCTION__, ++Index, ConfigureLang, HiiStatementPrivate->=
QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate->Guid));=0D
+ );=0D
+=0D
+ if (HiiStatementPrivate->Description !=3D 0) {=0D
+ TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,=
Schema, HiiStatementPrivate->Description);=0D
+ if (TmpString !=3D NULL) {=0D
+ if (StrCmp (TmpString, ConfigureLang) =3D=3D 0) {=0D
+ FreePool (TmpString);=0D
+ return HiiStatementPrivate;=0D
+ }=0D
+=0D
+ FreePool (TmpString);=0D
+ }=0D
+ }=0D
+=0D
+ HiiStatementLink =3D HiiNextStatementLink;=0D
+ }=0D
+=0D
+ HiiFormLink =3D HiiNextFormLink;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ return NULL;=0D
+}=0D
+=0D
+/**=0D
+ Get form-set private instance by the given HII handle.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[in] FormsetList Form-set list to search.=0D
+=0D
+ @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to form-set=
private instance.=0D
+=0D
+**/=0D
+REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *=0D
+GetFormsetPrivateByHiiHandle (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN LIST_ENTRY *FormsetList=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormsetLink;=0D
+ LIST_ENTRY *HiiFormsetNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ if (IsListEmpty (FormsetList)) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D GetFirstNode (FormsetList);=0D
+ while (!IsNull (FormsetList, HiiFormsetLink)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ if (HiiFormsetPrivate->HiiHandle =3D=3D HiiHandle) {=0D
+ return HiiFormsetPrivate;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ return NULL;=0D
+}=0D
+=0D
+/**=0D
+ Release formset and all the forms and statements that belong to this for=
mset.=0D
+=0D
+ @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE=0D
+=0D
+ @retval EFI_STATUS=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ReleaseFormset (=0D
+ IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormLink;=0D
+ LIST_ENTRY *HiiNextFormLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;=0D
+ LIST_ENTRY *HiiStatementLink;=0D
+ LIST_ENTRY *HiiNextStatementLink;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;=0D
+ UINTN Index;=0D
+=0D
+ if (FormsetPrivate =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList);=0D
+ while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {=0D
+ HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK (HiiFormLink=
);=0D
+ HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, HiiForm=
Link);=0D
+=0D
+ HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList);=0D
+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {=0D
+ HiiStatementPrivate =3D REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK =
(HiiStatementLink);=0D
+ HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementList=
, HiiStatementLink);=0D
+=0D
+ //=0D
+ // HiiStatementPrivate->HiiStatement will be released in DestroyForm=
Set().=0D
+ //=0D
+=0D
+ if (HiiStatementPrivate->DesStringCache !=3D NULL) {=0D
+ FreePool (HiiStatementPrivate->DesStringCache);=0D
+ HiiStatementPrivate->DesStringCache =3D NULL;=0D
+ }=0D
+=0D
+ RemoveEntryList (&HiiStatementPrivate->Link);=0D
+ FreePool (HiiStatementPrivate);=0D
+ HiiStatementLink =3D HiiNextStatementLink;=0D
+ }=0D
+=0D
+ //=0D
+ // HiiStatementPrivate->HiiForm will be released in DestroyFormSet().=
=0D
+ //=0D
+=0D
+ RemoveEntryList (&HiiFormPrivate->Link);=0D
+ FreePool (HiiFormPrivate);=0D
+ HiiFormLink =3D HiiNextFormLink;=0D
+ }=0D
+=0D
+ if (FormsetPrivate->HiiFormSet !=3D NULL) {=0D
+ DestroyFormSet (FormsetPrivate->HiiFormSet);=0D
+ FormsetPrivate->HiiFormSet =3D NULL;=0D
+ }=0D
+=0D
+ if (FormsetPrivate->DevicePathStr !=3D NULL) {=0D
+ FreePool(FormsetPrivate->DevicePathStr);=0D
+ }=0D
+=0D
+ //=0D
+ // Release schema list=0D
+ //=0D
+ if (FormsetPrivate->SupportedSchema.SchemaList !=3D NULL) {=0D
+ for (Index =3D 0; Index < FormsetPrivate->SupportedSchema.Count; Index=
++) {=0D
+ FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]);=0D
+ }=0D
+=0D
+ FreePool (FormsetPrivate->SupportedSchema.SchemaList);=0D
+ FormsetPrivate->SupportedSchema.SchemaList =3D NULL;=0D
+ FormsetPrivate->SupportedSchema.Count =3D 0;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Create new form-set instance.=0D
+=0D
+ @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to newly cr=
eated form-set private instance.=0D
+=0D
+**/=0D
+REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *=0D
+NewFormsetPrivate (=0D
+ VOID=0D
+ )=0D
+{=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate;=0D
+=0D
+ NewFormsetPrivate =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_=
FORM_SET_PRIVATE));=0D
+ if (NewFormsetPrivate =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ //=0D
+ // Initial newly created formset private data.=0D
+ //=0D
+ InitializeListHead (&NewFormsetPrivate->HiiFormList);=0D
+=0D
+ return NewFormsetPrivate;=0D
+}=0D
+=0D
+/**=0D
+ Load the HII formset from the given HII handle.=0D
+=0D
+ @param[in] HiiHandle Target HII handle to load.=0D
+ @param[out] FormsetPrivate The formset private data.=0D
+=0D
+ @retval EFI_STATUS=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+LoadFormset (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ HII_FORMSET *HiiFormSet;=0D
+ HII_FORM *HiiForm;=0D
+ LIST_ENTRY *HiiFormLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;=0D
+ HII_STATEMENT *HiiStatement;=0D
+ LIST_ENTRY *HiiStatementLink;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;=0D
+ EFI_GUID ZeroGuid;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || FormsetPrivate =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+=0D
+ HiiFormSet =3D AllocateZeroPool (sizeof (HII_FORMSET));=0D
+ if (HiiFormSet =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ //=0D
+ // Find HII formset by the given HII handle.=0D
+ //=0D
+ ZeroMem (&ZeroGuid, sizeof (ZeroGuid));=0D
+ Status =3D CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet)=
;=0D
+ if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {=0D
+ Status =3D EFI_NOT_FOUND;=0D
+ goto ErrorExit;=0D
+ }=0D
+=0D
+ //=0D
+ // Initialize formset=0D
+ //=0D
+ InitializeFormSet (HiiFormSet);=0D
+=0D
+ //=0D
+ // Initialize formset private data.=0D
+ //=0D
+ FormsetPrivate->HiiFormSet =3D HiiFormSet;=0D
+ FormsetPrivate->HiiHandle =3D HiiHandle;=0D
+ CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid);=0D
+ FormsetPrivate->DevicePathStr =3D ConvertDevicePathToText (HiiFormSet->D=
evicePath, FALSE, FALSE);=0D
+ Status =3D GetSupportedSchema (FormsetPrivate->HiiHandle, &FormsetPrivat=
e->SupportedSchema);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found: %r\n",=
__FUNCTION__, FormsetPrivate->HiiHandle, Status));=0D
+ }=0D
+=0D
+ HiiFormLink =3D GetFirstNode (&HiiFormSet->FormListHead);=0D
+ while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) {=0D
+ HiiForm =3D HII_FORM_FROM_LINK (HiiFormLink);=0D
+=0D
+ HiiFormPrivate =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_F=
ORM_PRIVATE));=0D
+ if (HiiFormPrivate =3D=3D NULL) {=0D
+ Status =3D EFI_OUT_OF_RESOURCES;=0D
+ goto ErrorExit;=0D
+ }=0D
+=0D
+ //=0D
+ // Initialize form private data.=0D
+ //=0D
+ HiiFormPrivate->HiiForm =3D HiiForm;=0D
+ HiiFormPrivate->Id =3D HiiForm->FormId;=0D
+ HiiFormPrivate->Title =3D HiiForm->FormTitle;=0D
+ HiiFormPrivate->ParentFormset =3D FormsetPrivate;=0D
+ InitializeListHead (&HiiFormPrivate->StatementList);=0D
+=0D
+ HiiStatementLink =3D GetFirstNode (&HiiForm->StatementListHead);=0D
+ while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) {=0D
+ HiiStatement =3D HII_STATEMENT_FROM_LINK (HiiStatementLink);=0D
+=0D
+ HiiStatementPrivate =3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_C=
ONFIG_STATEMENT_PRIVATE));=0D
+ if (HiiStatementPrivate =3D=3D NULL) {=0D
+ Status =3D EFI_OUT_OF_RESOURCES;=0D
+ goto ErrorExit;=0D
+ }=0D
+ //=0D
+ // Initialize statement private data.=0D
+ //=0D
+ HiiStatementPrivate->HiiStatement =3D HiiStatement;=0D
+ HiiStatementPrivate->QuestionId =3D HiiStatement->QuestionId;=0D
+ HiiStatementPrivate->Description =3D HiiStatement->Prompt;=0D
+ HiiStatementPrivate->ParentForm =3D HiiFormPrivate;=0D
+=0D
+ //=0D
+ // Attach to statement list.=0D
+ //=0D
+ InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate=
->Link);=0D
+ HiiStatementLink =3D GetNextNode (&HiiForm->StatementListHead, HiiSt=
atementLink);=0D
+ }=0D
+ //=0D
+ // Attach to form list.=0D
+ //=0D
+ InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link);=
=0D
+ HiiFormLink =3D GetNextNode (&HiiFormSet->FormListHead, HiiFormLink);=
=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+=0D
+ErrorExit:=0D
+=0D
+ //=0D
+ // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate yet.=
=0D
+ //=0D
+ if (HiiFormSet !=3D NULL && FormsetPrivate->HiiFormSet !=3D HiiFormSet) =
{=0D
+ DestroyFormSet (HiiFormSet);=0D
+ }=0D
+=0D
+ //=0D
+ // Release resource when error happens.=0D
+ //=0D
+ ReleaseFormset (FormsetPrivate);=0D
+=0D
+ return Status;=0D
+}=0D
+=0D
+/**=0D
+ Release formset list and all the forms that belong to this formset.=0D
+=0D
+ @param[in] FormsetList Pointer to formst list that needs to be=0D
+ released.=0D
+=0D
+ @retval EFI_STATUS=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+LoadFormsetList (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ OUT LIST_ENTRY *FormsetList=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ FormsetPrivate =3D GetFormsetPrivateByHiiHandle (HiiHandle, FormsetList)=
;=0D
+ if (FormsetPrivate !=3D NULL) {=0D
+ return EFI_ALREADY_STARTED;=0D
+ }=0D
+=0D
+ FormsetPrivate =3D NewFormsetPrivate ();=0D
+ if (FormsetPrivate =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ //=0D
+ // Load formset on the given HII handle.=0D
+ //=0D
+ Status =3D LoadFormset (HiiHandle, FormsetPrivate);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n", __FUNCTION__,=
Status));=0D
+ FreePool (FormsetPrivate);=0D
+ return Status;=0D
+ }=0D
+=0D
+ //=0D
+ // Attach to cache list.=0D
+ //=0D
+ InsertTailList (FormsetList, &FormsetPrivate->Link);=0D
+=0D
+ DEBUG_CODE (=0D
+ DumpFormsetList (FormsetList);=0D
+ );=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Release formset list and all the forms that belong to this formset.=0D
+=0D
+ @param[in] FormsetList Pointer to formst list that needs to be=0D
+ released.=0D
+=0D
+ @retval EFI_STATUS=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ReleaseFormsetList (=0D
+ IN LIST_ENTRY *FormsetList=0D
+ )=0D
+{=0D
+ LIST_ENTRY *HiiFormsetLink;=0D
+ LIST_ENTRY *HiiFormsetNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;=0D
+=0D
+ if (FormsetList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (IsListEmpty (FormsetList)) {=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ HiiFormsetLink =3D GetFirstNode (FormsetList);=0D
+ while (!IsNull (FormsetList, HiiFormsetLink)) {=0D
+ HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink);=0D
+ HiiFormsetPrivate =3D REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFo=
rmsetLink);=0D
+=0D
+ //=0D
+ // Detach from list.=0D
+ //=0D
+ RemoveEntryList (&HiiFormsetPrivate->Link);=0D
+ ReleaseFormset (HiiFormsetPrivate);=0D
+ FreePool (HiiFormsetPrivate);=0D
+ HiiFormsetLink =3D HiiFormsetNextLink;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Get all pending list.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[in] PendingList Pending list to keep pending data.=0D
+=0D
+ @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to pending list=
data.=0D
+=0D
+**/=0D
+REDFISH_PLATFORM_CONFIG_PENDING_LIST *=0D
+GetPendingList (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ IN LIST_ENTRY *PendingList=0D
+ )=0D
+{=0D
+ LIST_ENTRY *PendingListLink;=0D
+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ if (IsListEmpty (PendingList)) {=0D
+ return NULL;=0D
+ }=0D
+=0D
+ PendingListLink =3D GetFirstNode (PendingList);=0D
+ while (!IsNull (PendingList, PendingListLink)) {=0D
+ Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK (PendingList=
Link);=0D
+=0D
+ if (Target->HiiHandle =3D=3D HiiHandle) {=0D
+ return Target;=0D
+ }=0D
+=0D
+ PendingListLink =3D GetNextNode (PendingList, PendingListLink);=0D
+ }=0D
+=0D
+ return NULL;=0D
+}=0D
+=0D
+/**=0D
+ When HII database is updated. Keep updated HII handle into pending list =
so=0D
+ we can process them later.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.=0D
+=0D
+ @retval EFI_SUCCESS HII handle is saved in pending list.=0D
+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL=
.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+NotifyFormsetUpdate (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ IN LIST_ENTRY *PendingList=0D
+ )=0D
+{=0D
+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ //=0D
+ // Check and see if this HII handle is processed already.=0D
+ //=0D
+ TargetPendingList =3D GetPendingList (HiiHandle, PendingList);=0D
+ if (TargetPendingList !=3D NULL) {=0D
+ TargetPendingList->IsDeleted =3D FALSE;=0D
+ DEBUG_CODE (=0D
+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n", __FUNCTION__,=
HiiHandle));=0D
+ );=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ TargetPendingList=3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_P=
ENDING_LIST));=0D
+ if (TargetPendingList =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ TargetPendingList->HiiHandle =3D HiiHandle;=0D
+ TargetPendingList->IsDeleted =3D FALSE;=0D
+=0D
+ InsertTailList (PendingList, &TargetPendingList->Link);=0D
+=0D
+ DEBUG_CODE (=0D
+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n", __FUNCTION__,=
HiiHandle));=0D
+ );=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ When HII database is updated and form-set is deleted. Keep deleted HII h=
andle into pending list so=0D
+ we can process them later.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.=0D
+=0D
+ @retval EFI_SUCCESS HII handle is saved in pending list.=0D
+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL=
.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+NotifyFormsetDeleted (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ IN LIST_ENTRY *PendingList=0D
+ )=0D
+{=0D
+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;=0D
+=0D
+ if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ //=0D
+ // Check and see if this HII handle is processed already.=0D
+ //=0D
+ TargetPendingList =3D GetPendingList (HiiHandle, PendingList);=0D
+ if (TargetPendingList !=3D NULL) {=0D
+ TargetPendingList->IsDeleted =3D TRUE;=0D
+ DEBUG_CODE (=0D
+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n",=
__FUNCTION__, HiiHandle));=0D
+ );=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ TargetPendingList=3D AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_P=
ENDING_LIST));=0D
+ if (TargetPendingList =3D=3D NULL) {=0D
+ return EFI_OUT_OF_RESOURCES;=0D
+ }=0D
+=0D
+ TargetPendingList->HiiHandle =3D HiiHandle;=0D
+ TargetPendingList->IsDeleted =3D TRUE;=0D
+=0D
+ InsertTailList (PendingList, &TargetPendingList->Link);=0D
+=0D
+ DEBUG_CODE (=0D
+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n", __FUNCTION__,=
HiiHandle));=0D
+ );=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ There are HII database update and we need to process them accordingly so=
that we=0D
+ won't use stale data. This function will parse updated HII handle again =
in order=0D
+ to get updated data-set.=0D
+=0D
+ @param[in] FormsetList List to keep HII form-set.=0D
+ @param[in] PendingList List to keep HII handle that is updated.=0D
+=0D
+ @retval EFI_SUCCESS HII handle is saved in pending list.=0D
+ @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is NU=
LL.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ProcessPendingList (=0D
+ IN LIST_ENTRY *FormsetList,=0D
+ IN LIST_ENTRY *PendingList=0D
+ )=0D
+{=0D
+ LIST_ENTRY *PendingListLink;=0D
+ LIST_ENTRY *PendingListNextLink;=0D
+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;=0D
+ EFI_STATUS Status;=0D
+=0D
+=0D
+ if (FormsetList =3D=3D NULL || PendingList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (IsListEmpty (PendingList)) {=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ PendingListLink =3D GetFirstNode (PendingList);=0D
+ while (!IsNull (PendingList, PendingListLink)) {=0D
+ PendingListNextLink =3D GetNextNode (PendingList, PendingListLink);=0D
+ Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK (PendingList=
Link);=0D
+=0D
+ if (Target->IsDeleted) {=0D
+ //=0D
+ // The HII resource on this HII handle is removed. Release the forms=
et.=0D
+ //=0D
+ FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle, =
FormsetList);=0D
+ if (FormsetPrivate !=3D NULL) {=0D
+ DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver rel=
ease HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid));=0D
+ RemoveEntryList (&FormsetPrivate->Link);=0D
+ ReleaseFormset (FormsetPrivate);=0D
+ FreePool (FormsetPrivate);=0D
+ } else {=0D
+ DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was removed al=
ready\n", __FUNCTION__, Target->HiiHandle));=0D
+ }=0D
+ } else {=0D
+ //=0D
+ // The HII resource on this HII handle is updated/removed.=0D
+ //=0D
+ FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle, =
FormsetList);=0D
+ if (FormsetPrivate !=3D NULL) {=0D
+ //=0D
+ // HII formset already exist, release it and query again.=0D
+ //=0D
+ DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current f=
ormset\n", __FUNCTION__, &FormsetPrivate->Guid));=0D
+ RemoveEntryList (&FormsetPrivate->Link);=0D
+ ReleaseFormset (FormsetPrivate);=0D
+ FreePool (FormsetPrivate);=0D
+ }=0D
+=0D
+ Status =3D LoadFormsetList (Target->HiiHandle, FormsetList);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x faile=
d: %r\n", __FUNCTION__, Target->HiiHandle, Status));=0D
+ }=0D
+ }=0D
+=0D
+ //=0D
+ // Detach it from list first.=0D
+ //=0D
+ RemoveEntryList (&Target->Link);=0D
+ FreePool (Target);=0D
+=0D
+ PendingListLink =3D PendingListNextLink;=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Release all resource in statement list.=0D
+=0D
+ @param[in] StatementList Statement list to be released.=0D
+=0D
+ @retval EFI_SUCCESS All resource are released.=0D
+ @retval EFI_INVALID_PARAMETER StatementList is NULL.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ReleaseStatementList (=0D
+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList=0D
+ )=0D
+{=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;=0D
+ LIST_ENTRY *NextLink;=0D
+=0D
+ if (StatementList =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ if (IsListEmpty (&StatementList->StatementList)) {=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+=0D
+ NextLink =3D GetFirstNode (&StatementList->StatementList);=0D
+ while (!IsNull (&StatementList->StatementList, NextLink)) {=0D
+ StatementRef =3D REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (Next=
Link);=0D
+ NextLink =3D GetNextNode (&StatementList->StatementList, NextLink);=0D
+=0D
+ RemoveEntryList (&StatementRef->Link);=0D
+ FreePool (StatementRef);=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.=
h b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
index e0ba0fb2d3..be2f63df8d 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
@@ -1,274 +1,297 @@
-/** @file
- This file defines the EDKII Redfish Platform Config Protocol interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_
-
-#include <Uefi.h>
-
-//
-// Libraries
-//
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/HiiUtilityLib.h>
-#include <Library/HiiLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-
-#define REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET 0x00
-#define IS_EMPTY_STRING(a) (a =3D=3D NULL ||=
a[0] =3D=3D L'\0')
-#define ENGLISH_LANGUAGE_CODE "en-US"
-#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
-//
-typedef struct {
- LIST_ENTRY Link;
- EFI_HII_HANDLE HiiHandle;
- BOOLEAN IsDeleted;
-} REDFISH_PLATFORM_CONFIG_PENDING_LIST;
-
-#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a) BASE_CR (a, RED=
FISH_PLATFORM_CONFIG_PENDING_LIST, Link)
-
-typedef struct {
- UINTN Count; // Number of schema in list
- CHAR8 **SchemaList; // Schema list
-} REDFISH_PLATFORM_CONFIG_SCHEMA;
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- HII_FORMSET *HiiFormSet; // Pointer to HII forms=
et data.
- EFI_GUID Guid; // Formset GUID.
- EFI_HII_HANDLE HiiHandle; // Hii Handle of this f=
ormset.
- LIST_ENTRY HiiFormList; // Form list that keep =
form data under this formset.
- CHAR16 *DevicePathStr; // Device path of this =
formset.
- REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema that is suppo=
rted in this formset.
-} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR (a, REDFISH_=
PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- UINT16 Id; // Form ID.
- EFI_STRING_ID Title; // String toke=
n of form title.
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset;
- HII_FORM *HiiForm; // Pointer to =
HII form data.
- LIST_ENTRY StatementList; // Statement l=
ist that keep statement under this form.
-} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a, REDFISH_PLA=
TFORM_CONFIG_FORM_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;
- HII_STATEMENT *HiiStatement; // Pointer to HII =
statement data.
- EFI_QUESTION_ID QuestionId; // Question ID of =
this statement.
- EFI_STRING_ID Description; // String token of=
this question.
- EFI_STRING DesStringCache; // The string cach=
e for search function.
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a) BASE_CR (a, REDFIS=
H_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
-//
-typedef struct {
- LIST_ENTRY Link;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement;
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF;
-
-#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a) BASE_CR (a, RE=
DFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
-//
-typedef struct {
- LIST_ENTRY StatementList; // List of REDFISH_PLATFORM_CONFIG_STA=
TEMENT_PRIVATE_REF
- UINTN Count;
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST;
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormsetList (
- IN LIST_ENTRY *FormsetList
- );
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormsetList (
- IN EFI_HII_HANDLE *HiiHandle,
- OUT LIST_ENTRY *FormsetList
- );
-
-/**
- When HII database is updated. Keep updated HII handle into pending list =
so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetUpdate (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- When HII database is updated and form-set is deleted. Keep deleted HII h=
andle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetDeleted (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- Get statement private instance by the given configure language.
-
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] ConfigureLang Configure language.
-
- @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to stateme=
nt private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *
-GetStatementPrivateByConfigureLang (
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang
- );
-
-/**
- Search and find statement private instance by given regular expression p=
atthern
- which describes the Configure Language.
-
- @param[in] RegularExpressionProtocol Regular express protocol.
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] Pattern Regular expression pattern.
- @param[out] StatementList Statement list that match above =
pattern.
-
- @retval EFI_SUCCESS Statement list is returned.
- @retval EFI_INVALID_PARAMETER Input parameter is NULL.
- @retval EFI_NOT_READY Regular express protocol is NULL.
- @retval EFI_NOT_FOUND No statement is found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetStatementPrivateByConfigureLangRegex (
- IN EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionPr=
otocol,
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING Pattern,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList
- );
-
-/**
- There are HII database update and we need to process them accordingly so=
that we
- won't use stale data. This function will parse updated HII handle again =
in order
- to get updated data-set.
-
- @param[in] FormsetList List to keep HII form-set.
- @param[in] PendingList List to keep HII handle that is updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is NU=
LL.
-
-**/
-EFI_STATUS
-ProcessPendingList (
- IN LIST_ENTRY *FormsetList,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- Retrieves a string from a string package in a English language. The
- returned string is allocated using AllocatePool(). The caller is respon=
sible
- for freeing the allocated buffer using FreePool().
-
- If HiiHandle is NULL, then ASSERT().
- If StringId is 0, then ASSET.
-
- @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.
- @param[in] HiiHandle A handle that was previously registered in=
the HII Database.
- @param[in] StringId The identifier of the string to retrieved =
from the string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the st=
ring package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetRedfishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN CHAR8 *Language,
- IN EFI_STRING_ID StringId
- );
-
-/**
- Release all resource in statement list.
-
- @param[in] StatementList Statement list to be released.
-
- @retval EFI_SUCCESS All resource are released.
- @retval EFI_INVALID_PARAMETER StatementList is NULL.
-
-**/
-EFI_STATUS
-ReleaseStatementList (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList
- );
-
-#endif
+/** @file=0D
+ This file defines the EDKII Redfish Platform Config Protocol interface.=
=0D
+=0D
+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+**/=0D
+=0D
+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_=0D
+#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_=0D
+=0D
+#include <Uefi.h>=0D
+=0D
+//=0D
+// Libraries=0D
+//=0D
+#include <Library/BaseLib.h>=0D
+#include <Library/BaseMemoryLib.h>=0D
+#include <Library/DebugLib.h>=0D
+#include <Library/DevicePathLib.h>=0D
+#include <Library/HiiUtilityLib.h>=0D
+#include <Library/HiiLib.h>=0D
+#include <Library/MemoryAllocationLib.h>=0D
+#include <Library/UefiBootServicesTableLib.h>=0D
+#include <Library/UefiLib.h>=0D
+=0D
+#define IS_EMPTY_STRING(a) (a =3D=3D NULL ||=
a[0] =3D=3D L'\0')=0D
+#define ENGLISH_LANGUAGE_CODE "en-US"=0D
+#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"=
=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.=0D
+//=0D
+typedef struct {=0D
+ LIST_ENTRY Link;=0D
+ EFI_HII_HANDLE HiiHandle;=0D
+ BOOLEAN IsDeleted;=0D
+} REDFISH_PLATFORM_CONFIG_PENDING_LIST;=0D
+=0D
+#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a) BASE_CR (a, RED=
FISH_PLATFORM_CONFIG_PENDING_LIST, Link)=0D
+=0D
+typedef struct {=0D
+ UINTN Count; // Number of schema in lis=
t=0D
+ CHAR8 **SchemaList; // Schema list=0D
+} REDFISH_PLATFORM_CONFIG_SCHEMA;=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE=0D
+//=0D
+typedef struct {=0D
+ LIST_ENTRY Link;=0D
+ HII_FORMSET *HiiFormSet; // Pointer to HII forms=
et data.=0D
+ EFI_GUID Guid; // Formset GUID.=0D
+ EFI_HII_HANDLE HiiHandle; // Hii Handle of this f=
ormset.=0D
+ LIST_ENTRY HiiFormList; // Form list that keep =
form data under this formset.=0D
+ CHAR16 *DevicePathStr; // Device path of this =
formset.=0D
+ REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema that is suppo=
rted in this formset.=0D
+} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;=0D
+=0D
+#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR (a, REDFISH_=
PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE=0D
+//=0D
+typedef struct {=0D
+ LIST_ENTRY Link;=0D
+ UINT16 Id; // Form ID.=0D
+ EFI_STRING_ID Title; // String toke=
n of form title.=0D
+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset;=0D
+ HII_FORM *HiiForm; // Pointer to =
HII form data.=0D
+ LIST_ENTRY StatementList; // Statement l=
ist that keep statement under this form.=0D
+} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE;=0D
+=0D
+#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a, REDFISH_PLA=
TFORM_CONFIG_FORM_PRIVATE, Link)=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE=0D
+//=0D
+typedef struct {=0D
+ LIST_ENTRY Link;=0D
+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;=0D
+ HII_STATEMENT *HiiStatement; // Pointer to HII =
statement data.=0D
+ EFI_QUESTION_ID QuestionId; // Question ID of =
this statement.=0D
+ EFI_STRING_ID Description; // String token of=
this question.=0D
+ EFI_STRING DesStringCache; // The string cach=
e for search function.=0D
+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;=0D
+=0D
+#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a) BASE_CR (a, REDFIS=
H_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF=0D
+//=0D
+typedef struct {=0D
+ LIST_ENTRY Link;=0D
+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement;=0D
+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF;=0D
+=0D
+#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a) BASE_CR (a, RE=
DFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link)=0D
+=0D
+//=0D
+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST=0D
+//=0D
+typedef struct {=0D
+ LIST_ENTRY StatementList; // List of REDFISH_PLATFORM_CONFIG_STA=
TEMENT_PRIVATE_REF=0D
+ UINTN Count;=0D
+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST;=0D
+=0D
+/**=0D
+ Release formset list and all the forms that belong to this formset.=0D
+=0D
+ @param[in] FormsetList Pointer to formst list that needs to be=0D
+ released.=0D
+=0D
+ @retval EFI_STATUS=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ReleaseFormsetList (=0D
+ IN LIST_ENTRY *FormsetList=0D
+ );=0D
+=0D
+/**=0D
+ Release formset list and all the forms that belong to this formset.=0D
+=0D
+ @param[in] FormsetList Pointer to formst list that needs to be=0D
+ released.=0D
+=0D
+ @retval EFI_STATUS=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+LoadFormsetList (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ OUT LIST_ENTRY *FormsetList=0D
+ );=0D
+=0D
+/**=0D
+ When HII database is updated. Keep updated HII handle into pending list =
so=0D
+ we can process them later.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.=0D
+=0D
+ @retval EFI_SUCCESS HII handle is saved in pending list.=0D
+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL=
.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+NotifyFormsetUpdate (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ IN LIST_ENTRY *PendingList=0D
+ );=0D
+=0D
+/**=0D
+ When HII database is updated and form-set is deleted. Keep deleted HII h=
andle into pending list so=0D
+ we can process them later.=0D
+=0D
+ @param[in] HiiHandle HII handle instance.=0D
+ @param[in] PendingList Pending list to keep HII handle which is recentl=
y updated.=0D
+=0D
+ @retval EFI_SUCCESS HII handle is saved in pending list.=0D
+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is NULL=
.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+NotifyFormsetDeleted (=0D
+ IN EFI_HII_HANDLE *HiiHandle,=0D
+ IN LIST_ENTRY *PendingList=0D
+ );=0D
+=0D
+/**=0D
+ Get statement private instance by the given configure language.=0D
+=0D
+ @param[in] FormsetList Form-set list to search.=0D
+ @param[in] Schema Schema to be matched.=0D
+ @param[in] ConfigureLang Configure language.=0D
+=0D
+ @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to stateme=
nt private instance.=0D
+=0D
+**/=0D
+REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *=0D
+GetStatementPrivateByConfigureLang (=0D
+ IN LIST_ENTRY *FormsetList,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING ConfigureLang=0D
+ );=0D
+=0D
+/**=0D
+ Search and find statement private instance by given regular expression p=
atthern=0D
+ which describes the Configure Language.=0D
+=0D
+ @param[in] RegularExpressionProtocol Regular express protocol.=0D
+ @param[in] FormsetList Form-set list to search.=0D
+ @param[in] Schema Schema to be matched.=0D
+ @param[in] Pattern Regular expression pattern.=0D
+ @param[out] StatementList Statement list that match above =
pattern.=0D
+=0D
+ @retval EFI_SUCCESS Statement list is returned.=0D
+ @retval EFI_INVALID_PARAMETER Input parameter is NULL.=0D
+ @retval EFI_NOT_READY Regular express protocol is NULL.=0D
+ @retval EFI_NOT_FOUND No statement is found.=0D
+ @retval EFI_OUT_OF_RESOURCES System is out of memory.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+GetStatementPrivateByConfigureLangRegex (=0D
+ IN EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionPr=
otocol,=0D
+ IN LIST_ENTRY *FormsetList,=0D
+ IN CHAR8 *Schema,=0D
+ IN EFI_STRING Pattern,=0D
+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList=0D
+ );=0D
+=0D
+/**=0D
+ There are HII database update and we need to process them accordingly so=
that we=0D
+ won't use stale data. This function will parse updated HII handle again =
in order=0D
+ to get updated data-set.=0D
+=0D
+ @param[in] FormsetList List to keep HII form-set.=0D
+ @param[in] PendingList List to keep HII handle that is updated.=0D
+=0D
+ @retval EFI_SUCCESS HII handle is saved in pending list.=0D
+ @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is NU=
LL.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ProcessPendingList (=0D
+ IN LIST_ENTRY *FormsetList,=0D
+ IN LIST_ENTRY *PendingList=0D
+ );=0D
+=0D
+/**=0D
+ Retrieves a string from a string package in a English language. The=0D
+ returned string is allocated using AllocatePool(). The caller is respon=
sible=0D
+ for freeing the allocated buffer using FreePool().=0D
+=0D
+ If HiiHandle is NULL, then ASSERT().=0D
+ If StringId is 0, then ASSET.=0D
+=0D
+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.=0D
+ @param[in] HiiHandle A handle that was previously registered in=
the HII Database.=0D
+ @param[in] StringId The identifier of the string to retrieved =
from the string=0D
+ package associated with HiiHandle.=0D
+=0D
+ @retval NULL The string specified by StringId is not present in the st=
ring package.=0D
+ @retval Other The string was returned.=0D
+=0D
+**/=0D
+EFI_STRING=0D
+HiiGetRedfishString (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN CHAR8 *Language,=0D
+ IN EFI_STRING_ID StringId=0D
+ );=0D
+=0D
+/**=0D
+ Retrieves a string from a string package in a English language. The=0D
+ returned string is allocated using AllocatePool(). The caller is respon=
sible=0D
+ for freeing the allocated buffer using FreePool().=0D
+=0D
+ If HiiHandle is NULL, then ASSERT().=0D
+ If StringId is 0, then ASSET.=0D
+=0D
+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.=0D
+ @param[in] HiiHandle A handle that was previously registered in=
the HII Database.=0D
+ @param[in] StringId The identifier of the string to retrieved =
from the string=0D
+ package associated with HiiHandle.=0D
+=0D
+ @retval NULL The string specified by StringId is not present in the st=
ring package.=0D
+ @retval Other The string was returned.=0D
+=0D
+**/=0D
+CHAR8 *=0D
+HiiGetRedfishAsciiString (=0D
+ IN EFI_HII_HANDLE HiiHandle,=0D
+ IN CHAR8 *Language,=0D
+ IN EFI_STRING_ID StringId=0D
+ );=0D
+=0D
+/**=0D
+ Release all resource in statement list.=0D
+=0D
+ @param[in] StatementList Statement list to be released.=0D
+=0D
+ @retval EFI_SUCCESS All resource are released.=0D
+ @retval EFI_INVALID_PARAMETER StatementList is NULL.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+ReleaseStatementList (=0D
+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList=0D
+ );=0D
+=0D
+#endif=0D
--=20
2.32.0.windows.2


Chang, Abner
 

[AMD Official Use Only - General]

Hi Nickle,
I found there are many redundant blank lines in the patch. Could you please check it?

Thanks
Abner

-----Original Message-----
From: Nickle Wang <nickle.wang@...>
Sent: Tuesday, July 12, 2022 8:20 PM
To: devel@edk2.groups.io
Cc: Chang, Abner <Abner.Chang@...>; Yang, Atom
<Atom.Yang@...>; Nick Ramirez <nramirez@...>
Subject: [edk2][PATCH] edk2/RedfishPkg: Update Redfish Platform Config
Protocol

[CAUTION: External Email]

Update EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL and add array type
of
value support to EDKII_REDFISH_VALUE in order to support ordered list
op-code in HII. Modify corresponding function to support new type of
data structure.

Signed-off-by: Nickle Wang <nickle.wang@...>
Cc: Abner Chang <abner.chang@...>
Cc: Yang Atom <Atom.Yang@...>
Cc: Nick Ramirez <nramirez@...>
---
.../Protocol/EdkIIRedfishPlatformConfig.h | 301 +-
.../RedfishPlatformConfigDxe.c | 3087 ++++++++++-------
.../RedfishPlatformConfigDxe.h | 128 +-
.../RedfishPlatformConfigDxe.inf | 104 +-
.../RedfishPlatformConfigImpl.c | 2528 +++++++-------
.../RedfishPlatformConfigImpl.h | 571 +--
6 files changed, 3638 insertions(+), 3081 deletions(-)

diff --git a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
index 895b010227..bbbab90b03 100644
--- a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
+++ b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
@@ -1,147 +1,154 @@
-/** @file
- This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_H_
-
-typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL;
-
-/**
- Definition of EDKII_REDFISH_TYPE_VALUE
- **/
-typedef union {
- INT64 Integer;
- BOOLEAN Boolean;
- CHAR8 *Buffer;
-} EDKII_REDFISH_TYPE_VALUE;
-
-/**
- Definition of EDKII_REDFISH_VALUE_TYPES
- **/
-typedef enum {
- REDFISH_VALUE_TYPE_UNKNOWN = 0,
- REDFISH_VALUE_TYPE_INTEGER,
- REDFISH_VALUE_TYPE_BOOLEAN,
- REDFISH_VALUE_TYPE_STRING,
- REDFISH_VALUE_TYPE_MAX
-} EDKII_REDFISH_VALUE_TYPES;
-
-/**
- Definition of EDKII_REDFISH_VALUE
- **/
-typedef struct {
- EDKII_REDFISH_VALUE_TYPES Type;
- EDKII_REDFISH_TYPE_VALUE Value;
-} EDKII_REDFISH_VALUE;
-
-/**
- Get Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[out] Value The returned value.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- OUT EDKII_REDFISH_VALUE *Value
- );
-
-/**
- Set Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[in] Value The value to set.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- IN EDKII_REDFISH_VALUE Value
- );
-
-/**
- Get the list of Configure Language from platform configuration by the given
Schema and Pattern.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] Pattern The target Configure Language pattern.
- @param[out] ConfigureLangList The list of Configure Language.
- @param[out] Count The number of Configure Language in
ConfigureLangList.
-
- @retval EFI_SUCCESS ConfigureLangList is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING Pattern,
- OUT EFI_STRING **ConfigureLangList,
- OUT UINTN *Count
- );
-
-
-/**
- Get the list of supported Redfish schema from platform configuration on
the give HII handle.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] HiiHandle The target handle to search. If handle is NULL,
- this function returns all schema from HII database.
- @param[out] SupportedSchema The supported schema list which is
separated by ';'.
- For example: "x-uefi-redfish-Memory.v1_7_1;x-uefi-
redfish-Boot.v1_0_1"
- The SupportedSchema is allocated by the callee. It's caller's
- responsibility to free this buffer using FreePool().
-
- @retval EFI_SUCCESS Schema is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA)
(
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN EFI_HII_HANDLE HiiHandle, OPTIONAL
- OUT CHAR8 **SupportedSchema
- );
-
-struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL {
- EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue;
- EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue;
- EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG
GetConfigureLang;
- EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA
GetSupportedSchema;
-};
-
-extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid;
-
-#endif
+/** @file

+ This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interface.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_

+#define EDKII_REDFISH_PLATFORM_CONFIG_H_

+

+typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL;

+

+/**

+ Definition of EDKII_REDFISH_TYPE_VALUE

+ **/

+typedef union {

+ INT64 Integer;

+ BOOLEAN Boolean;

+ CHAR8 *Buffer;

+ CHAR8 **StringArray;

+ INT64 *IntegerArray;

+ BOOLEAN *BooleanArray;

+} EDKII_REDFISH_TYPE_VALUE;

+

+/**

+ Definition of EDKII_REDFISH_VALUE_TYPES

+ **/

+typedef enum {

+ REDFISH_VALUE_TYPE_UNKNOWN = 0,

+ REDFISH_VALUE_TYPE_INTEGER,

+ REDFISH_VALUE_TYPE_BOOLEAN,

+ REDFISH_VALUE_TYPE_STRING,

+ REDFISH_VALUE_TYPE_STRING_ARRAY,

+ REDFISH_VALUE_TYPE_INTEGER_ARRAY,

+ REDFISH_VALUE_TYPE_BOOLEAN_ARRAY,

+ REDFISH_VALUE_TYPE_MAX

+} EDKII_REDFISH_VALUE_TYPES;

+

+/**

+ Definition of EDKII_REDFISH_VALUE

+ **/

+typedef struct {

+ EDKII_REDFISH_VALUE_TYPES Type;

+ EDKII_REDFISH_TYPE_VALUE Value;

+ UINTN ArrayCount;

+} EDKII_REDFISH_VALUE;

+

+/**

+ Get Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[out] Value The returned value.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ OUT EDKII_REDFISH_VALUE *Value

+ );

+

+/**

+ Set Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[in] Value The value to set.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ IN EDKII_REDFISH_VALUE Value

+ );

+

+/**

+ Get the list of Configure Language from platform configuration by the
given Schema and RegexPattern.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] RegexPattern The target Configure Language pattern.
This is used for regular expression matching.

+ @param[out] ConfigureLangList The list of Configure Language.

+ @param[out] Count The number of Configure Language in
ConfigureLangList.

+

+ @retval EFI_SUCCESS ConfigureLangList is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING RegexPattern,

+ OUT EFI_STRING **ConfigureLangList,

+ OUT UINTN *Count

+ );

+

+

+/**

+ Get the list of supported Redfish schema from platform configuration on
the give HII handle.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] HiiHandle The target handle to search. If handle is NULL,

+ this function returns all schema from HII database.

+ @param[out] SupportedSchema The supported schema list which is
separated by ';'.

+ For example: "x-uefi-redfish-Memory.v1_7_1;x-uefi-
redfish-Boot.v1_0_1"

+ The SupportedSchema is allocated by the callee. It's
caller's

+ responsibility to free this buffer using FreePool().

+

+ @retval EFI_SUCCESS Schema is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA)
(

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN EFI_HII_HANDLE HiiHandle, OPTIONAL

+ OUT CHAR8 **SupportedSchema

+ );

+

+struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL {

+ EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue;

+ EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue;

+ EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG
GetConfigureLang;

+ EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA
GetSupportedSchema;

+};

+

+extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid;

+

+#endif

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
index 67818cccd2..971035f27d 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
@@ -1,1304 +1,1783 @@
-/** @file
-
- The implementation of EDKII Redfidh Platform Config Protocol.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "RedfishPlatformConfigDxe.h"
-#include "RedfishPlatformConfigImpl.h"
-
-REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =
NULL;
-
-/**
- Compare two value in HII statement format.
-
- @param[in] Value1 Firt value to compare.
- @param[in] Value2 Second value to be compared.
-
- @retval UINTN 0 is retuned when two values are equal.
- 1 is returned when first value is greater than second value.
- -1 is returned when second value is greater than first value.
-
-**/
-UINTN
-CompareHiiStatementValue (
- IN HII_STATEMENT_VALUE *Value1,
- IN HII_STATEMENT_VALUE *Value2
- )
-{
- INTN Result;
- UINT64 Data1;
- UINT64 Data2;
-
- if (Value1 == NULL || Value2 == NULL) {
- return 0xFF;
- }
-
- switch (Value1->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- Data1 = Value1->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- Data1 = Value1->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- Data1 = Value1->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- Data1 = Value1->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- Data1 = (Value1->Value.b ? 1 : 0);
- break;
- default:
- return 0xFF;
- }
-
- switch (Value2->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- Data2 = Value2->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- Data2 = Value2->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- Data2 = Value2->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- Data2 = Value2->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- Data2 = (Value2->Value.b ? 1 : 0);
- break;
- default:
- return 0xFF;
- }
-
- Result = (Data1 == Data2 ? 0 : (Data1 > Data2 ? 1 : -1));
-
- return Result;
-}
-
-/**
- Convert HII value to the string in HII one-of opcode.
-
- @param[in] Statement Statement private instance
-
- @retval EFI_STRING_ID The string ID in HII database.
- 0 is returned when something goes wrong.
-
-**/
-EFI_STRING_ID
-HiiValueToOneOfOptionStringId (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement
- )
-{
- LIST_ENTRY *Link;
- HII_QUESTION_OPTION *Option;
-
- if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {
- return 0;
- }
-
- if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {
- return 0;
- }
-
- Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);
- while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {
- Option = HII_QUESTION_OPTION_FROM_LINK (Link);
-
- if (CompareHiiStatementValue (&Statement->HiiStatement->Value,
&Option->Value) == 0) {
- return Option->Text;
- }
-
- Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);
- }
-
- return 0;
-}
-
-/**
- Convert HII string to the value in HII one-of opcode.
-
- @param[in] Statement Statement private instance
- @param[in] Schema Schema string
- @param[in] HiiString Input string
- @param[out] Value Value returned
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-HiiStringToOneOfOptionValue (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,
- IN CHAR8 *Schema,
- IN EFI_STRING HiiString,
- OUT HII_STATEMENT_VALUE *Value
- )
-{
- LIST_ENTRY *Link;
- HII_QUESTION_OPTION *Option;
- EFI_STRING TmpString;
- BOOLEAN Found;
-
- if (Statement == NULL || IS_EMPTY_STRING (HiiString) || Value == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {
- return EFI_UNSUPPORTED;
- }
-
- if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {
- return EFI_NOT_FOUND;
- }
-
- Found = FALSE;
- Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);
- while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {
- Option = HII_QUESTION_OPTION_FROM_LINK (Link);
-
- TmpString = HiiGetRedfishString (Statement->ParentForm-
ParentFormset->HiiHandle, Schema, Option->Text);
- if (TmpString != NULL) {
- if (StrCmp (TmpString, HiiString) == 0) {
- CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));
- Found = TRUE;
- }
- FreePool (TmpString);
- }
-
- if (Found) {
- return EFI_SUCCESS;
- }
-
- Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);
- }
-
- return EFI_NOT_FOUND;
-}
-
-/**
- Convert HII value to numeric value in Redfish format.
-
- @param[in] Value Value to be converted.
- @param[out] RedfishValue Value in Redfish format.
-
- @retval EFI_SUCCESS Redfish value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-HiiValueToRedfishNumeric (
- IN HII_STATEMENT_VALUE *Value,
- OUT EDKII_REDFISH_VALUE *RedfishValue
- )
-{
- if (Value == NULL || RedfishValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- switch (Value->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- RedfishValue->Type = REDFISH_VALUE_TYPE_BOOLEAN;
- RedfishValue->Value.Boolean = Value->Value.b;
- break;
- default:
- RedfishValue->Type = REDFISH_VALUE_TYPE_UNKNOWN;
- break;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert numeric value in Redfish format to HII value.
-
- @param[in] RedfishValue Value in Redfish format to be converted.
- @param[out] Value HII value returned.
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishNumericToHiiValue (
- IN EDKII_REDFISH_VALUE *RedfishValue,
- OUT HII_STATEMENT_VALUE *Value
- )
-{
- if (Value == NULL || RedfishValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- switch (RedfishValue->Type) {
- case REDFISH_VALUE_TYPE_INTEGER:
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
- Value->Value.u64 = (UINT64)RedfishValue->Value.Integer;
- break;
- case REDFISH_VALUE_TYPE_BOOLEAN:
- Value->Type = EFI_IFR_TYPE_BOOLEAN;
- Value->Value.b = RedfishValue->Value.Boolean;
- break;
- default:
- Value->Type = EFI_IFR_TYPE_UNDEFINED;
- break;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Return the full Redfish schema string from the given Schema and Version.
-
- Returned schema string is: Schema + '.' + Version
-
- @param[in] Schema Schema string
- @param[in] Version Schema version string
-
- @retval CHAR8 * Schema string. NULL when errors occur.
-
-**/
-CHAR8 *
-GetFullSchemaString (
- IN CHAR8 *Schema,
- IN CHAR8 *Version
- )
-{
- UINTN Size;
- CHAR8 *FullName;
-
- if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) {
- return NULL;
- }
-
- Size = AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize (Schema)
+ AsciiStrSize (Version);
-
- FullName = AllocatePool (Size);
- if (FullName == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__));
- return NULL;
- }
-
- AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX,
Schema, Version);
-
- return FullName;
-}
-
-/**
- Common implementation to get statement private instance.
-
- @param[in] RedfishPlatformConfigPrivate Private instance.
- @param[in] Schema Redfish schema string.
- @param[in] ConfigureLang Configure language that refers to this
statement.
- @param[out] Statement Statement instance
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigGetStatementCommon (
- IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
-
- if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || Statement == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Statement = NULL;
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);
- if (TargetStatement == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));
- return EFI_NOT_FOUND;
- }
-
- //
- // Find current HII question value.
- //
- Status = GetQuestionValue (
- TargetStatement->ParentForm->ParentFormset->HiiFormSet,
- TargetStatement->ParentForm->HiiForm,
- TargetStatement->HiiStatement,
- GetSetValueWithHiiDriver
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
-
- if (TargetStatement->HiiStatement->Value.Type ==
EFI_IFR_TYPE_UNDEFINED) {
- return EFI_DEVICE_ERROR;
- }
-
- //
- // Return Value.
- //
- *Statement = TargetStatement;
-
- return EFI_SUCCESS;
-}
-
-/**
- Get Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[out] Value The returned value.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetValue (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- OUT EDKII_REDFISH_VALUE *Value
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
- EFI_STRING_ID StringId;
- CHAR8 *FullSchema;
- EFI_STRING HiiString;
- UINTN Size;
-
- if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang) || Value == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
- Value->Type = REDFISH_VALUE_TYPE_UNKNOWN;
- FullSchema = NULL;
- HiiString = NULL;
-
- FullSchema = GetFullSchemaString (Schema, Version);
- if (FullSchema == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = RedfishPlatformConfigGetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang,
&TargetStatement);
- if (EFI_ERROR (Status)) {
- goto RELEASE_RESOURCE;
- }
-
- switch (TargetStatement->HiiStatement->Operand) {
- case EFI_IFR_ONE_OF_OP:
- StringId = HiiValueToOneOfOptionStringId (TargetStatement);
- if (StringId == 0) {
- ASSERT (FALSE);
- Status = EFI_DEVICE_ERROR;
- goto RELEASE_RESOURCE;
- }
-
- HiiString = HiiGetRedfishString (TargetStatement->ParentForm-
ParentFormset->HiiHandle, FullSchema, StringId);
- if (HiiString == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n",
__FUNCTION__, StringId, FullSchema));
- Status = EFI_NOT_FOUND;
- goto RELEASE_RESOURCE;
- }
-
- Size = StrLen (HiiString) + 1;
- Value->Value.Buffer = AllocatePool (Size);
- if (Value->Value.Buffer == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
-
- UnicodeStrToAsciiStrS (HiiString, Value->Value.Buffer, Size);
- Value->Type = REDFISH_VALUE_TYPE_STRING;
-
- break;
- case EFI_IFR_STRING_OP:
- if (TargetStatement->HiiStatement->Value.Type !=
EFI_IFR_TYPE_STRING) {
- ASSERT (FALSE);
- Status = EFI_DEVICE_ERROR;
- goto RELEASE_RESOURCE;
- }
-
- Value->Type = REDFISH_VALUE_TYPE_STRING;
- Value->Value.Buffer = AllocateCopyPool (StrSize ((CHAR16
*)TargetStatement->HiiStatement->Value.Buffer), TargetStatement-
HiiStatement->Value.Buffer);
- if (Value->Value.Buffer == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
- break;
- case EFI_IFR_CHECKBOX_OP:
- case EFI_IFR_NUMERIC_OP:
- Status = HiiValueToRedfishNumeric (&TargetStatement->HiiStatement-
Value, Value);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish
value: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
- break;
- default:
- DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please
contact with author if we need to support this type.\n", __FUNCTION__,
TargetStatement->HiiStatement->Operand));
- ASSERT (FALSE);
- Status = EFI_UNSUPPORTED;
- goto RELEASE_RESOURCE;
- }
-
-RELEASE_RESOURCE:
-
- if (FullSchema != NULL) {
- FreePool (FullSchema);
- }
-
- if (HiiString != NULL) {
- FreePool (HiiString);
- }
-
- return Status;
-}
-
-/**
- Function to save question value into HII database.
-
- @param[in] HiiFormset HII form-set instance
- @param[in] HiiForm HII form instance
- @param[in] HiiStatement HII statement that keeps new value.
- @param[in] Value New value to applyu.
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigSaveQuestionValue (
- IN HII_FORMSET *HiiFormset,
- IN HII_FORM *HiiForm,
- IN HII_STATEMENT *HiiStatement,
- IN HII_STATEMENT_VALUE *Value
- )
-{
- EFI_STATUS Status;
-
- if (HiiFormset == NULL || HiiForm == NULL || HiiStatement == NULL ||
Value == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = SetQuestionValue (
- HiiFormset,
- HiiForm,
- HiiStatement,
- Value
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- Status = SubmitForm (HiiFormset, HiiForm);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Common implementation to set statement private instance.
-
- @param[in] RedfishPlatformConfigPrivate Private instance.
- @param[in] Schema Redfish schema string.
- @param[in] ConfigureLang Configure language that refers to this
statement.
- @param[in] Statement Statement instance
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigSetStatementCommon (
- IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang,
- IN HII_STATEMENT_VALUE *StatementValue
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
- EFI_STRING TempBuffer;
-
- if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || StatementValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- TempBuffer = NULL;
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);
- if (TargetStatement == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));
- return EFI_NOT_FOUND;
- }
-
- if (StatementValue->Type != TargetStatement->HiiStatement->Value.Type)
{
- //
- // We treat one-of type as string in Redfish. But one-of statement is not
- // in string format from HII point of view. Do a patch here.
- //
- if (TargetStatement->HiiStatement->Operand == EFI_IFR_ONE_OF_OP
&& StatementValue->Type == EFI_IFR_TYPE_STRING) {
- TempBuffer = AllocatePool (StatementValue->BufferLen * sizeof
(CHAR16));
- if (TempBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- AsciiStrToUnicodeStrS (StatementValue->Buffer, TempBuffer,
StatementValue->BufferLen);
- FreePool (StatementValue->Buffer);
- StatementValue->Buffer = NULL;
- StatementValue->BufferLen = 0;
-
- Status = HiiStringToOneOfOptionValue (TargetStatement, Schema,
TempBuffer, StatementValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the given
%s\n", __FUNCTION__, TempBuffer));
- FreePool (TempBuffer);
- return EFI_NOT_FOUND;
- }
-
- FreePool (TempBuffer);
- } else if (TargetStatement->HiiStatement->Operand ==
EFI_IFR_NUMERIC_OP && StatementValue->Type ==
EFI_IFR_TYPE_NUM_SIZE_64) {
- //
- // Redfish only has numeric value type and it does not care about the
value size.
- // Do a patch here so we have proper value size applied.
- //
- StatementValue->Type = TargetStatement->HiiStatement->Value.Type;
- } else {
- DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type:
0x%x but target value type: 0x%x\n", __FUNCTION__, StatementValue-
Type, TargetStatement->HiiStatement->Value.Type));
- ASSERT (FALSE);
- }
- }
-
- Status = RedfishPlatformConfigSaveQuestionValue (
- TargetStatement->ParentForm->ParentFormset->HiiFormSet,
- TargetStatement->ParentForm->HiiForm,
- TargetStatement->HiiStatement,
- StatementValue
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Set Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[in] Value The value to set.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolSetValue (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- IN EDKII_REDFISH_VALUE Value
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- CHAR8 *FullSchema;
- HII_STATEMENT_VALUE NewValue;
-
- if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Value.Type == REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=
REDFISH_VALUE_TYPE_MAX) {
- return EFI_INVALID_PARAMETER;
- }
-
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
- FullSchema = NULL;
-
- FullSchema = GetFullSchemaString (Schema, Version);
- if (FullSchema == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE));
-
- switch (Value.Type) {
- case REDFISH_VALUE_TYPE_INTEGER:
- case REDFISH_VALUE_TYPE_BOOLEAN:
- Status = RedfishNumericToHiiValue (&Value, &NewValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii
value: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
- break;
- case REDFISH_VALUE_TYPE_STRING:
- NewValue.Type = EFI_IFR_TYPE_STRING;
- NewValue.BufferLen = (UINT16)AsciiStrSize (Value.Value.Buffer);
- NewValue.Buffer = AllocateCopyPool (NewValue.BufferLen,
Value.Value.Buffer);
- if (NewValue.Buffer == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
- break;
- default:
- ASSERT (FALSE);
- break;
- }
-
- Status = RedfishPlatformConfigSetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, &NewValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n",
__FUNCTION__, Status));
- }
-
-RELEASE_RESOURCE:
-
- if (FullSchema != NULL) {
- FreePool (FullSchema);
- }
-
- return Status;
-}
-
-/**
- Get the list of Configure Language from platform configuration by the given
Schema and Pattern.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] Pattern The target Configure Language pattern.
- @param[out] ConfigureLangList The list of Configure Language.
- @param[out] Count The number of Configure Language in
ConfigureLangList.
-
- @retval EFI_SUCCESS ConfigureLangList is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetConfigureLang (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING Pattern,
- OUT EFI_STRING **ConfigureLangList,
- OUT UINTN *Count
- )
-{
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
- LIST_ENTRY *NextLink;
- EFI_STRING TmpString;
- EFI_STRING *TmpConfigureLangList;
- UINTN Index;
- CHAR8 *FullSchema;
-
- if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || Count == NULL || ConfigureLangList == NULL ||
IS_EMPTY_STRING (Pattern)) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Count = 0;
- *ConfigureLangList = NULL;
- FullSchema = NULL;
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- FullSchema = GetFullSchemaString (Schema, Version);
- if (FullSchema == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = GetStatementPrivateByConfigureLangRegex (
- RedfishPlatformConfigPrivate->RegularExpressionProtocol,
- &RedfishPlatformConfigPrivate->FormsetList,
- FullSchema,
- Pattern,
- &StatementList
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a,
GetStatementPrivateByConfigureLangRegex failure: %r\n", __FUNCTION__,
Status));
- goto RELEASE_RESOURCE;
- }
-
- if (!IsListEmpty (&StatementList.StatementList)) {
-
- TmpConfigureLangList = AllocateZeroPool (sizeof (CHAR16 *) *
StatementList.Count);
- if (TmpConfigureLangList == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
-
- Index = 0;
- NextLink = GetFirstNode (&StatementList.StatementList);
- while (!IsNull (&StatementList.StatementList, NextLink)) {
- StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);
- NextLink = GetNextNode (&StatementList.StatementList, NextLink);
-
- ASSERT (StatementRef->Statement->Description != 0);
- if (StatementRef->Statement->Description != 0) {
- TmpString = HiiGetRedfishString (StatementRef->Statement-
ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef-
Statement->Description);
- ASSERT (TmpString != NULL);
- if (TmpString != NULL) {
- TmpConfigureLangList[Index] = AllocateCopyPool (StrSize (TmpString),
TmpString);
- ASSERT (TmpConfigureLangList[Index] != NULL);
- FreePool (TmpString);
- ++Index;
- }
- }
- }
- }
-
- *Count = StatementList.Count;
- *ConfigureLangList = TmpConfigureLangList;
-
-RELEASE_RESOURCE:
-
- if (FullSchema != NULL) {
- FreePool (FullSchema);
- }
-
- ReleaseStatementList (&StatementList);
-
- return Status;
-}
-
-
-/**
- Get the list of supported Redfish schema from paltform configuration on
give HII handle.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] HiiHandle The target handle to search. If handle is NULL,
- this function return all schema from HII database.
- @param[out] SupportedSchema The supported schema list which is
separated by ';'.
- The SupportedSchema is allocated by the callee. It's caller's
- responsibility to free this buffer using FreePool().
-
- @retval EFI_SUCCESS Schema is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetSupportedSchema (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN EFI_HII_HANDLE HiiHandle, OPTIONAL
- OUT CHAR8 **SupportedSchema
- )
-{
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- EFI_STATUS Status;
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- UINTN Index;
- UINTN StringSize;
- CHAR8 *StringBuffer;
- UINTN StringIndex;
-
- if (This == NULL || SupportedSchema == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *SupportedSchema = NULL;
-
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Calculate for string buffer size.
- //
- StringSize = 0;
- HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
- while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- if (HiiFormsetPrivate->SupportedSchema.Count > 0) {
- for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {
- StringSize += AsciiStrSize (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
- }
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- if (StringSize == 0) {
- return EFI_NOT_FOUND;
- }
-
- StringBuffer = AllocatePool (StringSize);
- if (StringBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- StringIndex = 0;
- HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
- while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- if (HiiFormsetPrivate->SupportedSchema.Count > 0) {
- for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {
- AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringIndex),
HiiFormsetPrivate->SupportedSchema.SchemaList[Index]);
- StringIndex += AsciiStrLen (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
- StringBuffer[StringIndex] = ';';
- ++StringIndex;
- }
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- StringBuffer[--StringIndex] = '\0';
-
- *SupportedSchema = StringBuffer;
-
- return EFI_SUCCESS;
-}
-
-/**
- Functions which are registered to receive notification of
- database events have this prototype. The actual event is encoded
- in NotifyType. The following table describes how PackageType,
- PackageGuid, Handle, and Package are used for each of the
- notification types.
-
- @param[in] PackageType Package type of the notification.
- @param[in] PackageGuid If PackageType is
- EFI_HII_PACKAGE_TYPE_GUID, then this is
- the pointer to the GUID from the Guid
- field of EFI_HII_PACKAGE_GUID_HEADER.
- Otherwise, it must be NULL.
- @param[in] Package Points to the package referred to by the
- notification Handle The handle of the package
- list which contains the specified package.
- @param[in] Handle The HII handle.
- @param[in] NotifyType The type of change concerning the
- database. See
- EFI_HII_DATABASE_NOTIFY_TYPE.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigFormUpdateNotify (
- IN UINT8 PackageType,
- IN CONST EFI_GUID *PackageGuid,
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle,
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
- )
-{
- EFI_STATUS Status;
-
- if (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK) {
- //
- // HII formset on this handle is updated by driver during run-time. The
formset needs to be reloaded.
- //
- Status = NotifyFormsetUpdate (Handle, &mRedfishPlatformConfigPrivate-
PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));
- return Status;
- }
- } else if (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) {
- //
- // HII resource is removed. The formset is no longer exist.
- //
- Status = NotifyFormsetDeleted (Handle,
&mRedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));
- return Status;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- This is a EFI_HII_STRING_PROTOCOL notification event handler.
-
- Install HII package notification.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-HiiStringProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate HII database protocol.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiStringProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->HiiString
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure:
%r\n", __FUNCTION__, Status));
- return;
- }
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent = NULL;
-}
-
-/**
- This is a EFI_HII_DATABASE_PROTOCOL notification event handler.
-
- Install HII package notification.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-HiiDatabaseProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate HII database protocol.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiDatabaseProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL
failure: %r\n", __FUNCTION__, Status));
- return;
- }
-
- //
- // Register package notification when new form package is installed.
- //
- Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
- mRedfishPlatformConfigPrivate->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpdateNotify,
- EFI_HII_DATABASE_NOTIFY_NEW_PACK,
- &mRedfishPlatformConfigPrivate->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));
- }
-
- //
- // Register package notification when new form package is updated.
- //
- Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
- mRedfishPlatformConfigPrivate->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpdateNotify,
- EFI_HII_DATABASE_NOTIFY_ADD_PACK,
- &mRedfishPlatformConfigPrivate->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));
- }
-
-#if REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET
- //
- // Register package notification when new form package is removed.
- //
- Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
- mRedfishPlatformConfigPrivate->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpdateNotify,
- EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,
- &mRedfishPlatformConfigPrivate->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));
- }
-#endif
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent = NULL;
-
-}
-
-/**
- This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-RegexProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate regular expression protocol.
- //
- Status = gBS->LocateProtocol (
- &gEfiRegularExpressionProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate-
RegularExpressionProtocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate
EFI_REGULAR_EXPRESSION_PROTOCOL failure: %r\n", __FUNCTION__,
Status));
- return;
- }
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent = NULL;
-
-}
-
-/**
- Unloads an image.
-
- @param ImageHandle Handle that identifies the image to be
unloaded.
-
- @retval EFI_SUCCESS The image has been unloaded.
- @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigDxeUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- EFI_STATUS Status;
-
- if (mRedfishPlatformConfigPrivate != NULL) {
- Status = gBS->UninstallProtocolInterface (
- mRedfishPlatformConfigPrivate->ImageHandle,
- &gEdkIIRedfishPlatformConfigProtocolGuid,
- (VOID*)&mRedfishPlatformConfigPrivate->Protocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, can not uninstall
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));
- ASSERT (FALSE);
- }
-
- //
- // Close events
- //
- if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent != NULL) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiDbNotify.ProtocolEvent);
- }
- if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent != NULL)
{
- gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiStringNotify.ProtocolEvent);
- }
- if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent != NULL) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate-
RegexNotify.ProtocolEvent);
- }
-
- //
- // Unregister package notification.
- //
- if (mRedfishPlatformConfigPrivate->NotifyHandle != NULL) {
- mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotify
(
- mRedfishPlatformConfigPrivate->HiiDatabase,
- mRedfishPlatformConfigPrivate->NotifyHandle
- );
- }
-
- ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList);
- FreePool (mRedfishPlatformConfigPrivate);
- mRedfishPlatformConfigPrivate = NULL;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- This is the declaration of an EFI image entry point. This entry point is
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
- both device drivers and bus drivers.
-
- @param ImageHandle The firmware allocated handle for the UEFI
image.
- @param SystemTable A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval Others An unexpected error occurred.
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigDxeEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
-
- mRedfishPlatformConfigPrivate = (REDFISH_PLATFORM_CONFIG_PRIVATE
*)AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE));
- if (mRedfishPlatformConfigPrivate == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for
REDFISH_PLATFORM_CONFIG_PRIVATE\n", __FUNCTION__));
- ASSERT (FALSE);
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Protocol initialization
- //
- mRedfishPlatformConfigPrivate->ImageHandle = ImageHandle;
- mRedfishPlatformConfigPrivate->Protocol.GetValue =
RedfishPlatformConfigProtocolGetValue;
- mRedfishPlatformConfigPrivate->Protocol.SetValue =
RedfishPlatformConfigProtocolSetValue;
- mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =
RedfishPlatformConfigProtocolGetConfigureLang;
- mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =
RedfishPlatformConfigProtocolGetSupportedSchema;
-
- InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList);
- InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList);
-
- Status = gBS->InstallProtocolInterface (
- &ImageHandle,
- &gEdkIIRedfishPlatformConfigProtocolGuid,
- EFI_NATIVE_INTERFACE,
- (VOID*)&mRedfishPlatformConfigPrivate->Protocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, can not install
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if HII database protocol is installed.
- //
- mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (
- &gEfiHiiDatabaseProtocolGuid,
- TPL_CALLBACK,
- HiiDatabaseProtocolInstalled,
- NULL,
- &mRedfishPlatformConfigPrivate-
HiiDbNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiDatabaseProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if HII string protocol is installed.
- //
- mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (
- &gEfiHiiStringProtocolGuid,
- TPL_CALLBACK,
- HiiStringProtocolInstalled,
- NULL,
- &mRedfishPlatformConfigPrivate-
HiiStringNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent == NULL)
{
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiStringProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if regular expression protocol is installed.
- //
- mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (
- &gEfiRegularExpressionProtocolGuid,
- TPL_CALLBACK,
- RegexProtocolInstalled,
- NULL,
- &mRedfishPlatformConfigPrivate-
RegexNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiRegularExpressionProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- return EFI_SUCCESS;
-}
+/** @file

+

+ The implementation of EDKII Redfidh Platform Config Protocol.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#include "RedfishPlatformConfigDxe.h"

+#include "RedfishPlatformConfigImpl.h"

+

+REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =
NULL;

+

+

+/**

+ Zero extend integer/boolean to UINT64 for comparing.

+

+ @param Value HII Value to be converted.

+

+**/

+UINT64

+ExtendHiiValueToU64 (

+ IN HII_STATEMENT_VALUE *Value

+ )

+{

+ UINT64 Temp;

+

+ Temp = 0;

+ switch (Value->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Temp = Value->Value.u8;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Temp = Value->Value.u16;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Temp = Value->Value.u32;

+ break;

+

+ case EFI_IFR_TYPE_BOOLEAN:

+ Temp = Value->Value.b;

+ break;

+

+ case EFI_IFR_TYPE_TIME:

+ case EFI_IFR_TYPE_DATE:

+ default:

+ break;

+ }

+

+ return Temp;

+}

+

+/**

+ Set value of a data element in an Array by its Index in ordered list buffer.

+

+ @param Array The data array.

+ @param Type Type of the data in this array.

+ @param Index Zero based index for data in this array.

+ @param Value The value to be set.

+

+**/

+VOID

+OrderedListSetArrayData (

+ IN VOID *Array,

+ IN UINT8 Type,

+ IN UINTN Index,

+ IN UINT64 Value

+ )

+{

+

+ ASSERT (Array != NULL);

+

+ switch (Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ *(((UINT8 *) Array) + Index) = (UINT8) Value;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ *(((UINT16 *) Array) + Index) = (UINT16) Value;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ *(((UINT32 *) Array) + Index) = (UINT32) Value;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ *(((UINT64 *) Array) + Index) = (UINT64) Value;

+ break;

+

+ default:

+ break;

+ }

+}

+

+/**

+ Return data element in an Array by its Index in ordered list array buffer.

+

+ @param Array The data array.

+ @param Type Type of the data in this array.

+ @param Index Zero based index for data in this array.

+

+ @retval Value The data to be returned

+

+**/

+UINT64

+OrderedListGetArrayData (

+ IN VOID *Array,

+ IN UINT8 Type,

+ IN UINTN Index

+ )

+{

+ UINT64 Data;

+

+ ASSERT (Array != NULL);

+

+ Data = 0;

+ switch (Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Data = (UINT64) *(((UINT8 *) Array) + Index);

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Data = (UINT64) *(((UINT16 *) Array) + Index);

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Data = (UINT64) *(((UINT32 *) Array) + Index);

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Data = (UINT64) *(((UINT64 *) Array) + Index);

+ break;

+

+ default:

+ break;

+ }

+

+ return Data;

+}

+

+/**

+ Find string ID of option if its value equals to given value.

+

+ @param[in] HiiStatement Statement to search.

+ @param[in] Value Target value.

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STRING_ID

+OrderedListOptionValueToStringId (

+ IN HII_STATEMENT *HiiStatement,

+ IN UINT64 Value

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ BOOLEAN Found;

+ UINT64 CurrentValue;

+

+ if (HiiStatement == NULL) {

+ return 0;

+ }

+

+ if (HiiStatement->Operand != EFI_IFR_ORDERED_LIST_OP) {

+ return 0;

+ }

+

+ if (IsListEmpty (&HiiStatement->OptionListHead)) {

+ return 0;

+ }

+

+ Found = FALSE;

+ Link = GetFirstNode (&HiiStatement->OptionListHead);

+ while (!IsNull (&HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ CurrentValue = ExtendHiiValueToU64 (&Option->Value);

+ if (Value == CurrentValue) {

+ return Option->Text;

+ }

+

+ Link = GetNextNode (&HiiStatement->OptionListHead, Link);

+ }

+

+ return 0;

+}

+

+/**

+ Compare two value in HII statement format.

+

+ @param[in] Value1 Firt value to compare.

+ @param[in] Value2 Second value to be compared.

+

+ @retval INTN 0 is retuned when two values are equal.

+ 1 is returned when first value is greater than second value.

+ -1 is returned when second value is greater than first value.

+

+**/

+INTN

+CompareHiiStatementValue (

+ IN HII_STATEMENT_VALUE *Value1,

+ IN HII_STATEMENT_VALUE *Value2

+ )

+{

+ INTN Result;

+ UINT64 Data1;

+ UINT64 Data2;

+

+ if (Value1 == NULL || Value2 == NULL) {

+ return -1;

+ }

+

+ switch (Value1->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Data1 = Value1->Value.u8;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Data1 = Value1->Value.u16;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Data1 = Value1->Value.u32;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Data1 = Value1->Value.u64;

+ break;

+ case EFI_IFR_TYPE_BOOLEAN:

+ Data1 = (Value1->Value.b ? 1 : 0);

+ break;

+ default:

+ return -1;

+ }

+

+ switch (Value2->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Data2 = Value2->Value.u8;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Data2 = Value2->Value.u16;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Data2 = Value2->Value.u32;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Data2 = Value2->Value.u64;

+ break;

+ case EFI_IFR_TYPE_BOOLEAN:

+ Data2 = (Value2->Value.b ? 1 : 0);

+ break;

+ default:

+ return -1;

+ }

+

+ Result = (Data1 == Data2 ? 0 : (Data1 > Data2 ? 1 : -1));

+

+ return Result;

+}

+

+/**

+ Convert HII value to the string in HII one-of opcode.

+

+ @param[in] Statement Statement private instance

+

+ @retval EFI_STRING_ID The string ID in HII database.

+ 0 is returned when something goes wrong.

+

+**/

+EFI_STRING_ID

+HiiValueToOneOfOptionStringId (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {

+ return 0;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return 0;

+ }

+

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ if (CompareHiiStatementValue (&Statement->HiiStatement->Value,
&Option->Value) == 0) {

+ return Option->Text;

+ }

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ return 0;

+}

+

+/**

+ Convert HII string to the value in HII one-of opcode.

+

+ @param[in] Statement Statement private instance

+ @param[in] Schema Schema string

+ @param[in] HiiString Input string

+ @param[out] Value Value returned

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+HiiStringToOneOfOptionValue (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,

+ IN CHAR8 *Schema,

+ IN EFI_STRING HiiString,

+ OUT HII_STATEMENT_VALUE *Value

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ EFI_STRING TmpString;

+ BOOLEAN Found;

+

+ if (Statement == NULL || IS_EMPTY_STRING (HiiString) || Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {

+ return EFI_UNSUPPORTED;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return EFI_NOT_FOUND;

+ }

+

+ Found = FALSE;

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ TmpString = HiiGetRedfishString (Statement->ParentForm-
ParentFormset->HiiHandle, Schema, Option->Text);
+ if (TmpString != NULL) {

+ if (StrCmp (TmpString, HiiString) == 0) {

+ CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));

+ Found = TRUE;

+ }

+ FreePool (TmpString);

+ }

+

+ if (Found) {

+ return EFI_SUCCESS;

+ }

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ return EFI_NOT_FOUND;

+}

+

+/**

+ Convert HII value to numeric value in Redfish format.

+

+ @param[in] Value Value to be converted.

+ @param[out] RedfishValue Value in Redfish format.

+

+ @retval EFI_SUCCESS Redfish value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+HiiValueToRedfishNumeric (

+ IN HII_STATEMENT_VALUE *Value,

+ OUT EDKII_REDFISH_VALUE *RedfishValue

+ )

+{

+ if (Value == NULL || RedfishValue == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ switch (Value->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u8;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u16;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u32;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u64;

+ break;

+ case EFI_IFR_TYPE_BOOLEAN:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_BOOLEAN;

+ RedfishValue->Value.Boolean = Value->Value.b;

+ break;

+ default:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_UNKNOWN;

+ break;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Convert numeric value in Redfish format to HII value.

+

+ @param[in] RedfishValue Value in Redfish format to be converted.

+ @param[out] Value HII value returned.

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishNumericToHiiValue (

+ IN EDKII_REDFISH_VALUE *RedfishValue,

+ OUT HII_STATEMENT_VALUE *Value

+ )

+{

+ if (Value == NULL || RedfishValue == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ switch (RedfishValue->Type) {

+ case REDFISH_VALUE_TYPE_INTEGER:

+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;

+ Value->Value.u64 = (UINT64)RedfishValue->Value.Integer;

+ break;

+ case REDFISH_VALUE_TYPE_BOOLEAN:

+ Value->Type = EFI_IFR_TYPE_BOOLEAN;

+ Value->Value.b = RedfishValue->Value.Boolean;

+ break;

+ default:

+ Value->Type = EFI_IFR_TYPE_UNDEFINED;

+ break;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Dump the value in ordered list buffer.

+

+ @param[in] OrderedListStatement Ordered list statement.

+

+**/

+VOID

+DumpOrderedListValue (

+ IN HII_STATEMENT *OrderedListStatement

+ )

+{

+ UINT8 *Value8;

+ UINT16 *Value16;

+ UINT32 *Value32;

+ UINT64 *Value64;

+ UINTN Count;

+ UINTN Index;

+

+ if (OrderedListStatement == NULL || OrderedListStatement->Operand !=
EFI_IFR_ORDERED_LIST_OP) {

+ return;

+ }

+

+ DEBUG ((DEBUG_ERROR, "Value.Type= 0x%x\n", OrderedListStatement-
Value.Type));
+ DEBUG ((DEBUG_ERROR, "Value.BufferValueType= 0x%x\n",
OrderedListStatement->Value.BufferValueType));

+ DEBUG ((DEBUG_ERROR, "Value.BufferLen= 0x%x\n",
OrderedListStatement->Value.BufferLen));

+ DEBUG ((DEBUG_ERROR, "Value.Buffer= 0x%x\n", OrderedListStatement-
Value.Buffer));
+ DEBUG ((DEBUG_ERROR, "Value.MaxContainers= 0x%x\n",
OrderedListStatement->ExtraData.OrderListData.MaxContainers));

+ DEBUG ((DEBUG_ERROR, "StorageWidth= 0x%x\n",
OrderedListStatement->StorageWidth));

+

+ if (OrderedListStatement->Value.Buffer == NULL) {

+ return;

+ }

+

+ Value8 = NULL;

+ Value16 = NULL;

+ Value32 = NULL;

+ Value64 = NULL;

+ Count = 0;

+

+ switch (OrderedListStatement->Value.BufferValueType) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Value8 = (UINT8 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT8);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value8[Index]));

+ }

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Value16 = (UINT16 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT16);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value16[Index]));

+ }

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Value32 = (UINT32 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT32);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value32[Index]));

+ }

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Value64 = (UINT64 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT64);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value64[Index]));

+ }

+ break;

+ default:

+ Value8 = (UINT8 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT8);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value8[Index]));

+ }

+ break;

+ }

+

+ DEBUG ((DEBUG_ERROR, "\n"));

+}

+

+/**

+ Convert HII value to the string in HII ordered list opcode. It's caller's

+ responsibility to free returned buffer using FreePool().

+

+ @param[in] Statement Statement private instance

+ @param[out] ReturnSize The size of returned array

+

+ @retval EFI_STRING_ID The string ID array for options in ordered list.

+

+**/

+EFI_STRING_ID *

+HiiValueToOrderedListOptionStringId (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,

+ OUT UINTN *ReturnSize

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ UINTN OptionCount;

+ EFI_STRING_ID *ReturnedArray;

+ UINTN Index;

+ UINT64 Value;

+

+ if (Statement == NULL || ReturnSize == NULL) {

+ return NULL;

+ }

+

+ *ReturnSize = 0;

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ORDERED_LIST_OP) {

+ return NULL;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return NULL;

+ }

+

+ DEBUG_CODE (

+ DumpOrderedListValue (Statement->HiiStatement);

+ );

+

+ OptionCount = 0;

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ ++OptionCount;

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ *ReturnSize = OptionCount;

+ ReturnedArray = AllocatePool (sizeof (EFI_STRING_ID) * OptionCount);

+ if (ReturnedArray == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));

+ *ReturnSize = 0;

+ return NULL;

+ }

+

+ for (Index = 0; Index < OptionCount; Index++) {

+ Value = OrderedListGetArrayData (Statement->HiiStatement-
Value.Buffer, Statement->HiiStatement->Value.BufferValueType, Index);
+ ReturnedArray[Index] = OrderedListOptionValueToStringId (Statement-
HiiStatement, Value);
+ }

+

+ return ReturnedArray;

+}

+

+/**

+ Convert HII string to the value in HII ordered list opcode.

+

+ @param[in] Statement Statement private instance

+ @param[in] Schema Schema string

+ @param[in] HiiString Input string

+ @param[out] Value Value returned

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+HiiStringToOrderedListOptionValue (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,

+ IN CHAR8 *Schema,

+ IN EFI_STRING HiiString,

+ OUT UINT64 *Value

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ EFI_STRING TmpString;

+ BOOLEAN Found;

+

+ if (Statement == NULL || IS_EMPTY_STRING (HiiString) || Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *Value = 0;

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ORDERED_LIST_OP) {

+ return EFI_UNSUPPORTED;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return EFI_NOT_FOUND;

+ }

+

+ Found = FALSE;

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ TmpString = HiiGetRedfishString (Statement->ParentForm-
ParentFormset->HiiHandle, Schema, Option->Text);
+ if (TmpString != NULL) {

+ if (StrCmp (TmpString, HiiString) == 0) {

+ *Value = ExtendHiiValueToU64 (&Option->Value);

+ Found = TRUE;

+ }

+ FreePool (TmpString);

+ }

+

+ if (Found) {

+ return EFI_SUCCESS;

+ }

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ return EFI_NOT_FOUND;

+}

+

+/**

+ Convert input ascii string to unicode string. It's caller's

+ responsibility to free returned buffer using FreePool().

+

+ @param[in] AsciiString Ascii string to be converted.

+

+ @retval CHAR16 * Unicode string on return.

+

+**/

+EFI_STRING

+StrToUnicodeStr (

+ IN CHAR8 *AsciiString

+ )

+{

+ UINTN StringLen;

+ EFI_STRING Buffer;

+ EFI_STATUS Status;

+

+ if (AsciiString == NULL || AsciiString[0] == '\0') {

+ return NULL;

+ }

+

+ StringLen = AsciiStrLen (AsciiString) + 1;

+ Buffer = AllocatePool (StringLen * sizeof (CHAR16));

+ if (Buffer == NULL) {

+ return NULL;

+ }

+

+ Status = AsciiStrToUnicodeStrS (AsciiString, Buffer, StringLen);

+ if (EFI_ERROR (Status)) {

+ FreePool (Buffer);

+ return NULL;

+ }

+

+ return Buffer;

+}

+

+/**

+ Return the full Redfish schema string from the given Schema and Version.

+

+ Returned schema string is: Schema + '.' + Version

+

+ @param[in] Schema Schema string

+ @param[in] Version Schema version string

+

+ @retval CHAR8 * Schema string. NULL when errors occur.

+

+**/

+CHAR8 *

+GetFullSchemaString (

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version

+ )

+{

+ UINTN Size;

+ CHAR8 *FullName;

+

+ if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) {

+ return NULL;

+ }

+

+ Size = AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize
(Schema) + AsciiStrSize (Version);

+

+ FullName = AllocatePool (Size);

+ if (FullName == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__));

+ return NULL;

+ }

+

+ AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX,
Schema, Version);

+

+ return FullName;

+}

+

+/**

+ Common implementation to get statement private instance.

+

+ @param[in] RedfishPlatformConfigPrivate Private instance.

+ @param[in] Schema Redfish schema string.

+ @param[in] ConfigureLang Configure language that refers to this
statement.

+ @param[out] Statement Statement instance

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishPlatformConfigGetStatementCommon (

+ IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang,

+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;

+

+ if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || Statement == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *Statement = NULL;

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);

+ if (TargetStatement == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));

+ return EFI_NOT_FOUND;

+ }

+

+ //

+ // Find current HII question value.

+ //

+ Status = GetQuestionValue (

+ TargetStatement->ParentForm->ParentFormset->HiiFormSet,

+ TargetStatement->ParentForm->HiiForm,

+ TargetStatement->HiiStatement,

+ GetSetValueWithHiiDriver

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+

+ if (TargetStatement->HiiStatement->Value.Type ==
EFI_IFR_TYPE_UNDEFINED) {

+ return EFI_DEVICE_ERROR;

+ }

+

+ //

+ // Return Value.

+ //

+ *Statement = TargetStatement;

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Get Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[out] Value The returned value.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolGetValue (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ OUT EDKII_REDFISH_VALUE *Value

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;

+ EFI_STRING_ID StringId;

+ EFI_STRING_ID *StringIdArray;

+ CHAR8 *FullSchema;

+ EFI_STRING HiiString;

+ UINTN Count;

+ UINTN Index;

+

+ if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang) || Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+ Value->Type = REDFISH_VALUE_TYPE_UNKNOWN;

+ Value->ArrayCount = 0;

+ Count = 0;

+ FullSchema = NULL;

+ HiiString = NULL;

+ StringIdArray = NULL;

+

+ FullSchema = GetFullSchemaString (Schema, Version);

+ if (FullSchema == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Status = RedfishPlatformConfigGetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang,
&TargetStatement);

+ if (EFI_ERROR (Status)) {

+ goto RELEASE_RESOURCE;

+ }

+

+ switch (TargetStatement->HiiStatement->Operand) {

+ case EFI_IFR_ONE_OF_OP:

+ StringId = HiiValueToOneOfOptionStringId (TargetStatement);

+ if (StringId == 0) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Value.Buffer = HiiGetRedfishAsciiString (TargetStatement-
ParentForm->ParentFormset->HiiHandle, FullSchema, StringId);
+ if (Value->Value.Buffer == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Type = REDFISH_VALUE_TYPE_STRING;

+ break;

+ case EFI_IFR_STRING_OP:

+ if (TargetStatement->HiiStatement->Value.Type !=
EFI_IFR_TYPE_STRING) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Type = REDFISH_VALUE_TYPE_STRING;

+ Value->Value.Buffer = AllocatePool (StrLen ((CHAR16
*)TargetStatement->HiiStatement->Value.Buffer) + 1);

+ UnicodeStrToAsciiStrS ((CHAR16 *)TargetStatement->HiiStatement-
Value.Buffer, Value->Value.Buffer, StrLen ((CHAR16 *)TargetStatement-
HiiStatement->Value.Buffer) + 1);
+ break;

+ case EFI_IFR_CHECKBOX_OP:

+ case EFI_IFR_NUMERIC_OP:

+ Status = HiiValueToRedfishNumeric (&TargetStatement->HiiStatement-
Value, Value);
+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish
value: %r\n", __FUNCTION__, Status));

+ goto RELEASE_RESOURCE;

+ }

+ break;

+ case EFI_IFR_ACTION_OP:

+ if (TargetStatement->HiiStatement->Value.Type !=
EFI_IFR_TYPE_ACTION) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ //

+ // Action has no value. Just return unknown type.

+ //

+ Value->Type = REDFISH_VALUE_TYPE_UNKNOWN;

+ break;

+ case EFI_IFR_ORDERED_LIST_OP:

+ StringIdArray = HiiValueToOrderedListOptionStringId (TargetStatement,
&Count);

+ if (StringIdArray == NULL) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Value.StringArray = AllocatePool (sizeof (CHAR8 *) * Count);

+ if (Value->Value.StringArray == NULL) {

+ ASSERT (FALSE);

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+

+ for (Index = 0; Index < Count; Index++) {

+ ASSERT (StringIdArray[Index] != 0);

+ Value->Value.StringArray[Index] = HiiGetRedfishAsciiString
(TargetStatement->ParentForm->ParentFormset->HiiHandle, FullSchema,
StringIdArray[Index]);

+ }

+

+ Value->ArrayCount = Count;

+ Value->Type = REDFISH_VALUE_TYPE_STRING_ARRAY;

+ break;

+ default:

+ DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please
contact with author if we need to support this type.\n", __FUNCTION__,
TargetStatement->HiiStatement->Operand));

+ ASSERT (FALSE);

+ Status = EFI_UNSUPPORTED;

+ goto RELEASE_RESOURCE;

+ }

+

+RELEASE_RESOURCE:

+

+ if (FullSchema != NULL) {

+ FreePool (FullSchema);

+ }

+

+ if (HiiString != NULL) {

+ FreePool (HiiString);

+ }

+

+ if (StringIdArray != NULL) {

+ FreePool (StringIdArray);

+ }

+

+ return Status;

+}

+

+/**

+ Function to save question value into HII database.

+

+ @param[in] HiiFormset HII form-set instance

+ @param[in] HiiForm HII form instance

+ @param[in] HiiStatement HII statement that keeps new value.

+ @param[in] Value New value to applyu.

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishPlatformConfigSaveQuestionValue (

+ IN HII_FORMSET *HiiFormset,

+ IN HII_FORM *HiiForm,

+ IN HII_STATEMENT *HiiStatement,

+ IN HII_STATEMENT_VALUE *Value

+ )

+{

+ EFI_STATUS Status;

+

+ if (HiiFormset == NULL || HiiForm == NULL || HiiStatement == NULL ||
Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ Status = SetQuestionValue (

+ HiiFormset,

+ HiiForm,

+ HiiStatement,

+ Value

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ Status = SubmitForm (HiiFormset, HiiForm);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Common implementation to set statement private instance.

+

+ @param[in] RedfishPlatformConfigPrivate Private instance.

+ @param[in] Schema Redfish schema string.

+ @param[in] ConfigureLang Configure language that refers to this
statement.

+ @param[in] Statement Statement instance

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishPlatformConfigSetStatementCommon (

+ IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang,

+ IN HII_STATEMENT_VALUE *StatementValue

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;

+ EFI_STRING TempBuffer;

+ UINT8 *StringArray;

+ UINTN Index;

+ UINT64 Value;

+ CHAR8 **CharArray;

+

+ if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || StatementValue == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ TempBuffer = NULL;

+ StringArray = NULL;

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);

+ if (TargetStatement == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));

+ return EFI_NOT_FOUND;

+ }

+

+ if (StatementValue->Type != TargetStatement->HiiStatement-
Value.Type) {
+ //

+ // We treat one-of type as string in Redfish. But one-of statement is not

+ // in string format from HII point of view. Do a patch here.

+ //

+ if (TargetStatement->HiiStatement->Operand == EFI_IFR_ONE_OF_OP
&& StatementValue->Type == EFI_IFR_TYPE_STRING) {

+

+ TempBuffer = StrToUnicodeStr ((CHAR8 *)StatementValue->Buffer);

+ if (TempBuffer == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+ FreePool (StatementValue->Buffer);

+ StatementValue->Buffer = NULL;

+ StatementValue->BufferLen = 0;

+

+ Status = HiiStringToOneOfOptionValue (TargetStatement, Schema,
TempBuffer, StatementValue);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the given
%s\n", __FUNCTION__, TempBuffer));

+ FreePool (TempBuffer);

+ return EFI_NOT_FOUND;

+ }

+

+ FreePool (TempBuffer);

+ } else if (TargetStatement->HiiStatement->Operand ==
EFI_IFR_ORDERED_LIST_OP && StatementValue->Type ==
EFI_IFR_TYPE_STRING) {

+ //

+ // We treat ordered list type as string in Redfish. But ordered list
statement is not

+ // in string format from HII point of view. Do a patch here.

+ //

+ StringArray = AllocateZeroPool (TargetStatement->HiiStatement-
StorageWidth);
+ if (StringArray == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Arrage new option order from input string array

+ //

+ CharArray = (CHAR8 **)StatementValue->Buffer;

+ for (Index = 0; Index < StatementValue->BufferLen; Index++) {

+ TempBuffer = StrToUnicodeStr (CharArray[Index]);

+ if (TempBuffer == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Status = HiiStringToOrderedListOptionValue (TargetStatement, Schema,
TempBuffer, &Value);

+ if (EFI_ERROR (Status)) {

+ ASSERT (FALSE);

+ continue;

+ }

+ FreePool (TempBuffer);

+ OrderedListSetArrayData (StringArray, TargetStatement->HiiStatement-
Value.BufferValueType, Index, Value);
+ }

+

+ StatementValue->Type = EFI_IFR_TYPE_BUFFER;

+ StatementValue->Buffer = StringArray;

+ StatementValue->BufferLen = TargetStatement->HiiStatement-
StorageWidth;
+ StatementValue->BufferValueType = TargetStatement->HiiStatement-
Value.BufferValueType;
+ } else if (TargetStatement->HiiStatement->Operand ==
EFI_IFR_NUMERIC_OP && StatementValue->Type ==
EFI_IFR_TYPE_NUM_SIZE_64) {

+ //

+ // Redfish only has numeric value type and it does not care about the
value size.

+ // Do a patch here so we have proper value size applied.

+ //

+ StatementValue->Type = TargetStatement->HiiStatement->Value.Type;

+ } else {

+ DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type:
0x%x but target value type: 0x%x\n", __FUNCTION__, StatementValue-
Type, TargetStatement->HiiStatement->Value.Type));
+ ASSERT (FALSE);

+ }

+ }

+

+ Status = RedfishPlatformConfigSaveQuestionValue (

+ TargetStatement->ParentForm->ParentFormset->HiiFormSet,

+ TargetStatement->ParentForm->HiiForm,

+ TargetStatement->HiiStatement,

+ StatementValue

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Set Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[in] Value The value to set.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolSetValue (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ IN EDKII_REDFISH_VALUE Value

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ CHAR8 *FullSchema;

+ HII_STATEMENT_VALUE NewValue;

+

+ if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang)) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (Value.Type == REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=
REDFISH_VALUE_TYPE_MAX) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+ FullSchema = NULL;

+

+ FullSchema = GetFullSchemaString (Schema, Version);

+ if (FullSchema == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE));

+

+ switch (Value.Type) {

+ case REDFISH_VALUE_TYPE_INTEGER:

+ case REDFISH_VALUE_TYPE_BOOLEAN:

+ Status = RedfishNumericToHiiValue (&Value, &NewValue);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii
value: %r\n", __FUNCTION__, Status));

+ goto RELEASE_RESOURCE;

+ }

+ break;

+ case REDFISH_VALUE_TYPE_STRING:

+ NewValue.Type = EFI_IFR_TYPE_STRING;

+ NewValue.BufferLen = (UINT16)AsciiStrSize (Value.Value.Buffer);

+ NewValue.Buffer = AllocateCopyPool (NewValue.BufferLen,
Value.Value.Buffer);

+ if (NewValue.Buffer == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+ break;

+ case REDFISH_VALUE_TYPE_STRING_ARRAY:

+ NewValue.Type = EFI_IFR_TYPE_STRING;

+ NewValue.BufferLen = (UINT16)Value.ArrayCount;

+ NewValue.Buffer = (UINT8 *)Value.Value.StringArray;

+ break;

+ default:

+ ASSERT (FALSE);

+ break;

+ }

+

+ Status = RedfishPlatformConfigSetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, &NewValue);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n",
__FUNCTION__, Status));

+ }

+

+RELEASE_RESOURCE:

+

+ if (FullSchema != NULL) {

+ FreePool (FullSchema);

+ }

+

+ return Status;

+}

+

+/**

+ Get the list of Configure Language from platform configuration by the
given Schema and RegexPattern.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] RegexPattern The target Configure Language pattern.
This is used for regular expression matching.

+ @param[out] ConfigureLangList The list of Configure Language.

+ @param[out] Count The number of Configure Language in
ConfigureLangList.

+

+ @retval EFI_SUCCESS ConfigureLangList is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolGetConfigureLang (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING RegexPattern,

+ OUT EFI_STRING **ConfigureLangList,

+ OUT UINTN *Count

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
*StatementRef;

+ LIST_ENTRY *NextLink;

+ EFI_STRING TmpString;

+ EFI_STRING *TmpConfigureLangList;

+ UINTN Index;

+ CHAR8 *FullSchema;

+

+ if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || Count == NULL || ConfigureLangList == NULL ||
IS_EMPTY_STRING (RegexPattern)) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *Count = 0;

+ *ConfigureLangList = NULL;

+ FullSchema = NULL;

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ FullSchema = GetFullSchemaString (Schema, Version);

+ if (FullSchema == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Status = GetStatementPrivateByConfigureLangRegex (

+ RedfishPlatformConfigPrivate->RegularExpressionProtocol,

+ &RedfishPlatformConfigPrivate->FormsetList,

+ FullSchema,

+ RegexPattern,

+ &StatementList

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a,
GetStatementPrivateByConfigureLangRegex failure: %r\n", __FUNCTION__,
Status));

+ goto RELEASE_RESOURCE;

+ }

+

+ if (!IsListEmpty (&StatementList.StatementList)) {

+

+ TmpConfigureLangList = AllocateZeroPool (sizeof (CHAR16 *) *
StatementList.Count);

+ if (TmpConfigureLangList == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+

+ Index = 0;

+ NextLink = GetFirstNode (&StatementList.StatementList);

+ while (!IsNull (&StatementList.StatementList, NextLink)) {

+ StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);

+ NextLink = GetNextNode (&StatementList.StatementList, NextLink);

+

+ ASSERT (StatementRef->Statement->Description != 0);

+ if (StatementRef->Statement->Description != 0) {

+ TmpString = HiiGetRedfishString (StatementRef->Statement-
ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef-
Statement->Description);
+ ASSERT (TmpString != NULL);

+ if (TmpString != NULL) {

+ TmpConfigureLangList[Index] = AllocateCopyPool (StrSize (TmpString),
TmpString);

+ ASSERT (TmpConfigureLangList[Index] != NULL);

+ FreePool (TmpString);

+ ++Index;

+ }

+ }

+ }

+ }

+

+ *Count = StatementList.Count;

+ *ConfigureLangList = TmpConfigureLangList;

+

+RELEASE_RESOURCE:

+

+ if (FullSchema != NULL) {

+ FreePool (FullSchema);

+ }

+

+ ReleaseStatementList (&StatementList);

+

+ return Status;

+}

+

+/**

+ Get the list of supported Redfish schema from paltform configuration on
give HII handle.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] HiiHandle The target handle to search. If handle is NULL,

+ this function return all schema from HII database.

+ @param[out] SupportedSchema The supported schema list which is
separated by ';'.

+ The SupportedSchema is allocated by the callee. It's
caller's

+ responsibility to free this buffer using FreePool().

+

+ @retval EFI_SUCCESS Schema is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolGetSupportedSchema (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN EFI_HII_HANDLE HiiHandle, OPTIONAL

+ OUT CHAR8 **SupportedSchema

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ EFI_STATUS Status;

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ UINTN Index;

+ UINTN StringSize;

+ CHAR8 *StringBuffer;

+ UINTN StringIndex;

+

+ if (This == NULL || SupportedSchema == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *SupportedSchema = NULL;

+

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) {

+ return EFI_NOT_FOUND;

+ }

+

+ //

+ // Calculate for string buffer size.

+ //

+ StringSize = 0;

+ HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
+ while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ if (HiiFormsetPrivate->SupportedSchema.Count > 0) {

+ for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {

+ StringSize += AsciiStrSize (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
+ }

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ if (StringSize == 0) {

+ return EFI_NOT_FOUND;

+ }

+

+ StringBuffer = AllocatePool (StringSize);

+ if (StringBuffer == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ StringIndex = 0;

+ HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
+ while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ if (HiiFormsetPrivate->SupportedSchema.Count > 0) {

+ for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {

+ AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringIndex),
HiiFormsetPrivate->SupportedSchema.SchemaList[Index]);

+ StringIndex += AsciiStrLen (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
+ StringBuffer[StringIndex] = ';';

+ ++StringIndex;

+ }

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ StringBuffer[--StringIndex] = '\0';

+

+ *SupportedSchema = StringBuffer;

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Functions which are registered to receive notification of

+ database events have this prototype. The actual event is encoded

+ in NotifyType. The following table describes how PackageType,

+ PackageGuid, Handle, and Package are used for each of the

+ notification types.

+

+ @param[in] PackageType Package type of the notification.

+ @param[in] PackageGuid If PackageType is

+ EFI_HII_PACKAGE_TYPE_GUID, then this is

+ the pointer to the GUID from the Guid

+ field of EFI_HII_PACKAGE_GUID_HEADER.

+ Otherwise, it must be NULL.

+ @param[in] Package Points to the package referred to by the

+ notification Handle The handle of the package

+ list which contains the specified package.

+ @param[in] Handle The HII handle.

+ @param[in] NotifyType The type of change concerning the

+ database. See

+ EFI_HII_DATABASE_NOTIFY_TYPE.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigFormUpdateNotify (

+ IN UINT8 PackageType,

+ IN CONST EFI_GUID *PackageGuid,

+ IN CONST EFI_HII_PACKAGE_HEADER *Package,

+ IN EFI_HII_HANDLE Handle,

+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType

+ )

+{

+ EFI_STATUS Status;

+

+ if (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK) {

+ //

+ // HII formset on this handle is updated by driver during run-time. The
formset needs to be reloaded.

+ //

+ Status = NotifyFormsetUpdate (Handle,
&mRedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));

+ return Status;

+ }

+ } else if (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) {

+ //

+ // HII resource is removed. The formset is no longer exist.

+ //

+ Status = NotifyFormsetDeleted (Handle,
&mRedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));

+ return Status;

+ }

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ This is a EFI_HII_STRING_PROTOCOL notification event handler.

+

+ Install HII package notification.

+

+ @param[in] Event Event whose notification function is being invoked.

+ @param[in] Context Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+HiiStringProtocolInstalled (

+ IN EFI_EVENT Event,

+ IN VOID *Context

+ )

+{

+ EFI_STATUS Status;

+

+ //

+ // Locate HII database protocol.

+ //

+ Status = gBS->LocateProtocol (

+ &gEfiHiiStringProtocolGuid,

+ NULL,

+ (VOID **)&mRedfishPlatformConfigPrivate->HiiString

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure:
%r\n", __FUNCTION__, Status));

+ return;

+ }

+

+ gBS->CloseEvent (Event);

+ mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent = NULL;

+}

+

+/**

+ This is a EFI_HII_DATABASE_PROTOCOL notification event handler.

+

+ Install HII package notification.

+

+ @param[in] Event Event whose notification function is being invoked.

+ @param[in] Context Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+HiiDatabaseProtocolInstalled (

+ IN EFI_EVENT Event,

+ IN VOID *Context

+ )

+{

+ EFI_STATUS Status;

+

+ //

+ // Locate HII database protocol.

+ //

+ Status = gBS->LocateProtocol (

+ &gEfiHiiDatabaseProtocolGuid,

+ NULL,

+ (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL
failure: %r\n", __FUNCTION__, Status));

+ return;

+ }

+

+ //

+ // Register package notification when new form package is installed.

+ //

+ Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
+ mRedfishPlatformConfigPrivate->HiiDatabase,

+ EFI_HII_PACKAGE_FORMS,

+ NULL,

+ RedfishPlatformConfigFormUpdateNotify,

+ EFI_HII_DATABASE_NOTIFY_NEW_PACK,

+ &mRedfishPlatformConfigPrivate->NotifyHandle

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));

+ }

+

+ //

+ // Register package notification when new form package is updated.

+ //

+ Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
+ mRedfishPlatformConfigPrivate->HiiDatabase,

+ EFI_HII_PACKAGE_FORMS,

+ NULL,

+ RedfishPlatformConfigFormUpdateNotify,

+ EFI_HII_DATABASE_NOTIFY_ADD_PACK,

+ &mRedfishPlatformConfigPrivate->NotifyHandle

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));

+ }

+

+ gBS->CloseEvent (Event);

+ mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent = NULL;

+

+}

+

+/**

+ This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler.

+

+ @param[in] Event Event whose notification function is being invoked.

+ @param[in] Context Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+RegexProtocolInstalled (

+ IN EFI_EVENT Event,

+ IN VOID *Context

+ )

+{

+ EFI_STATUS Status;

+

+ //

+ // Locate regular expression protocol.

+ //

+ Status = gBS->LocateProtocol (

+ &gEfiRegularExpressionProtocolGuid,

+ NULL,

+ (VOID **)&mRedfishPlatformConfigPrivate-
RegularExpressionProtocol
+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, locate
EFI_REGULAR_EXPRESSION_PROTOCOL failure: %r\n", __FUNCTION__,
Status));

+ return;

+ }

+

+ gBS->CloseEvent (Event);

+ mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent = NULL;

+

+}

+

+/**

+ Unloads an image.

+

+ @param ImageHandle Handle that identifies the image to be
unloaded.

+

+ @retval EFI_SUCCESS The image has been unloaded.

+ @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image
handle.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigDxeUnload (

+ IN EFI_HANDLE ImageHandle

+ )

+{

+ EFI_STATUS Status;

+

+ if (mRedfishPlatformConfigPrivate != NULL) {

+ Status = gBS->UninstallProtocolInterface (

+ mRedfishPlatformConfigPrivate->ImageHandle,

+ &gEdkIIRedfishPlatformConfigProtocolGuid,

+ (VOID*)&mRedfishPlatformConfigPrivate->Protocol

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, can not uninstall
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Close events

+ //

+ if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent != NULL) {

+ gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiDbNotify.ProtocolEvent);
+ }

+ if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent !=
NULL) {

+ gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiStringNotify.ProtocolEvent);
+ }

+ if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent != NULL)
{

+ gBS->CloseEvent (mRedfishPlatformConfigPrivate-
RegexNotify.ProtocolEvent);
+ }

+

+ //

+ // Unregister package notification.

+ //

+ if (mRedfishPlatformConfigPrivate->NotifyHandle != NULL) {

+ mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotify
(

+ mRedfishPlatformConfigPrivate->HiiDatabase,

+ mRedfishPlatformConfigPrivate->NotifyHandle

+ );

+ }

+

+ ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList);

+ FreePool (mRedfishPlatformConfigPrivate);

+ mRedfishPlatformConfigPrivate = NULL;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ This is the declaration of an EFI image entry point. This entry point is

+ the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including

+ both device drivers and bus drivers.

+

+ @param ImageHandle The firmware allocated handle for the UEFI
image.

+ @param SystemTable A pointer to the EFI System Table.

+

+ @retval EFI_SUCCESS The operation completed successfully.

+ @retval Others An unexpected error occurred.

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigDxeEntryPoint (

+ IN EFI_HANDLE ImageHandle,

+ IN EFI_SYSTEM_TABLE *SystemTable

+ )

+{

+ EFI_STATUS Status;

+

+ mRedfishPlatformConfigPrivate = (REDFISH_PLATFORM_CONFIG_PRIVATE
*)AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE));

+ if (mRedfishPlatformConfigPrivate == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for
REDFISH_PLATFORM_CONFIG_PRIVATE\n", __FUNCTION__));

+ ASSERT (FALSE);

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Protocol initialization

+ //

+ mRedfishPlatformConfigPrivate->ImageHandle = ImageHandle;

+ mRedfishPlatformConfigPrivate->Protocol.GetValue =
RedfishPlatformConfigProtocolGetValue;

+ mRedfishPlatformConfigPrivate->Protocol.SetValue =
RedfishPlatformConfigProtocolSetValue;

+ mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =
RedfishPlatformConfigProtocolGetConfigureLang;

+ mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =
RedfishPlatformConfigProtocolGetSupportedSchema;

+

+ InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList);

+ InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList);

+

+ Status = gBS->InstallProtocolInterface (

+ &ImageHandle,

+ &gEdkIIRedfishPlatformConfigProtocolGuid,

+ EFI_NATIVE_INTERFACE,

+ (VOID*)&mRedfishPlatformConfigPrivate->Protocol

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, can not install
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Install protocol notification if HII database protocol is installed.

+ //

+ mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (

+ &gEfiHiiDatabaseProtocolGuid,

+ TPL_CALLBACK,

+ HiiDatabaseProtocolInstalled,

+ NULL,

+ &mRedfishPlatformConfigPrivate-
HiiDbNotify.Registration
+ );

+ if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiDatabaseProtocolGuid\n", __FUNCTION__));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Install protocol notification if HII string protocol is installed.

+ //

+ mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (

+ &gEfiHiiStringProtocolGuid,

+ TPL_CALLBACK,

+ HiiStringProtocolInstalled,

+ NULL,

+ &mRedfishPlatformConfigPrivate-
HiiStringNotify.Registration
+ );

+ if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent == NULL)
{

+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiStringProtocolGuid\n", __FUNCTION__));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Install protocol notification if regular expression protocol is installed.

+ //

+ mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (

+ &gEfiRegularExpressionProtocolGuid,

+ TPL_CALLBACK,

+ RegexProtocolInstalled,

+ NULL,

+ &mRedfishPlatformConfigPrivate-
RegexNotify.Registration
+ );

+ if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiRegularExpressionProtocolGuid\n", __FUNCTION__));

+ ASSERT (FALSE);

+ }

+

+ return EFI_SUCCESS;

+}

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
index 99a613d229..d3f7af55ad 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
@@ -1,64 +1,64 @@
-/** @file
- This file defines the EDKII Redfish Platform Config Protocol interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_
-
-#include <Uefi.h>
-
-//
-// Libraries
-//
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/PrintLib.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-
-//
-// Produced Protocols
-//
-#include <Protocol/EdkIIRedfishPlatformConfig.h>
-#include <Protocol/HiiDatabase.h>
-#include <Protocol/HiiString.h>
-#include <Protocol/RegularExpressionProtocol.h>
-
-//
-// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY.
-//
-typedef struct {
- EFI_EVENT ProtocolEvent; // Protocol notification event.
- VOID *Registration; // Protocol notification registration.
-} REDFISH_PLATFORM_CONFIG_NOTIFY;
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
-//
-typedef struct {
- EFI_HANDLE ImageHandle; // Driver image handle.
- EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol;
- REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify;
- EFI_HII_DATABASE_PROTOCOL *HiiDatabase; // The HII
database protocol.
- REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify;
- EFI_HII_STRING_PROTOCOL *HiiString; // HII String
Protocol.
- REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify;
- EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol;
// Regular Expression Protocol.
- EFI_HANDLE NotifyHandle; // The notify handle.
- LIST_ENTRY FormsetList; // The list to keep cached
HII formset.
- LIST_ENTRY PendingList; // The list to keep updated
HII handle.
-} REDFISH_PLATFORM_CONFIG_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_PRIVATE, Protocol)
-#define REGULAR_EXPRESSION_INCLUDE_ALL L".*"
-#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-"
-
-#endif
+/** @file

+ This file defines the EDKII Redfish Platform Config Protocol interface.

+

+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_

+#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_

+

+#include <Uefi.h>

+

+//

+// Libraries

+//

+#include <Library/BaseLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/DebugLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/PrintLib.h>

+#include <Library/UefiLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiDriverEntryPoint.h>

+

+//

+// Produced Protocols

+//

+#include <Protocol/EdkIIRedfishPlatformConfig.h>

+#include <Protocol/HiiDatabase.h>

+#include <Protocol/HiiString.h>

+#include <Protocol/RegularExpressionProtocol.h>

+

+//

+// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY.

+//

+typedef struct {

+ EFI_EVENT ProtocolEvent; // Protocol notification event.

+ VOID *Registration; // Protocol notification registration.

+} REDFISH_PLATFORM_CONFIG_NOTIFY;

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.

+//

+typedef struct {

+ EFI_HANDLE ImageHandle; // Driver image handle.

+ EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol;

+ REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify;

+ EFI_HII_DATABASE_PROTOCOL *HiiDatabase; // The HII
database protocol.

+ REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify;

+ EFI_HII_STRING_PROTOCOL *HiiString; // HII String
Protocol.

+ REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify;

+ EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol;
// Regular Expression Protocol.

+ EFI_HANDLE NotifyHandle; // The notify handle.

+ LIST_ENTRY FormsetList; // The list to keep cached
HII formset.

+ LIST_ENTRY PendingList; // The list to keep updated
HII handle.

+} REDFISH_PLATFORM_CONFIG_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_PRIVATE, Protocol)

+#define REGULAR_EXPRESSION_INCLUDE_ALL L".*"

+#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-"

+

+#endif

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
index 16739bef7a..81b22e03c3 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
@@ -1,53 +1,53 @@
-## @file
-# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interfaces.
-#
-# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = RedfishPlatformConfigDxe
- FILE_GUID = BEAEFFE1-0633-41B5-913C-9389339C2927
- MODULE_TYPE = DXE_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = RedfishPlatformConfigDxeEntryPoint
- UNLOAD_IMAGE = RedfishPlatformConfigDxeUnload
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
- RedfishPkg/RedfishPkg.dec
-
-[Sources]
- RedfishPlatformConfigDxe.h
- RedfishPlatformConfigDxe.c
- RedfishPlatformConfigImpl.h
- RedfishPlatformConfigImpl.c
-
-[LibraryClasses]
- BaseLib
- BaseMemoryLib
- DebugLib
- DevicePathLib
- HiiLib
- HiiUtilityLib
- MemoryAllocationLib
- PrintLib
- UefiLib
- UefiBootServicesTableLib
- UefiRuntimeServicesTableLib
- UefiDriverEntryPoint
-
-[Protocols]
- gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED
- gEfiHiiDatabaseProtocolGuid ## CONSUMED
- gEfiHiiStringProtocolGuid ## CONSUMED
- gEfiRegularExpressionProtocolGuid ## CONSUMED
-
-[Guids]
- gEfiRegexSyntaxTypePerlGuid ## CONSUMED
-
-[Depex]
+## @file

+# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interfaces.

+#

+# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>

+# SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+##

+

+[Defines]

+ INF_VERSION = 0x00010005

+ BASE_NAME = RedfishPlatformConfigDxe

+ FILE_GUID = BEAEFFE1-0633-41B5-913C-9389339C2927

+ MODULE_TYPE = DXE_DRIVER

+ VERSION_STRING = 1.0

+ ENTRY_POINT = RedfishPlatformConfigDxeEntryPoint

+ UNLOAD_IMAGE = RedfishPlatformConfigDxeUnload

+

+[Packages]

+ MdePkg/MdePkg.dec

+ MdeModulePkg/MdeModulePkg.dec

+ RedfishPkg/RedfishPkg.dec

+

+[Sources]

+ RedfishPlatformConfigDxe.h

+ RedfishPlatformConfigDxe.c

+ RedfishPlatformConfigImpl.h

+ RedfishPlatformConfigImpl.c

+

+[LibraryClasses]

+ BaseLib

+ BaseMemoryLib

+ DebugLib

+ DevicePathLib

+ HiiLib

+ HiiUtilityLib

+ MemoryAllocationLib

+ PrintLib

+ UefiLib

+ UefiBootServicesTableLib

+ UefiRuntimeServicesTableLib

+ UefiDriverEntryPoint

+

+[Protocols]

+ gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED

+ gEfiHiiDatabaseProtocolGuid ## CONSUMED

+ gEfiHiiStringProtocolGuid ## CONSUMED

+ gEfiRegularExpressionProtocolGuid ## CONSUMED

+

+[Guids]

+ gEfiRegexSyntaxTypePerlGuid ## CONSUMED

+

+[Depex]

TRUE
\ No newline at end of file
diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
index d9eab6c883..917f946656 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
@@ -1,1240 +1,1288 @@
-/** @file
-
- The implementation of EDKII Redfidh Platform Config Protocol.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-#include "RedfishPlatformConfigDxe.h"
-#include "RedfishPlatformConfigImpl.h"
-
-extern REDFISH_PLATFORM_CONFIG_PRIVATE
*mRedfishPlatformConfigPrivate;
-
-/**
- Debug dump HII string
-
- @param[in] HiiHandle HII handle instance
- @param[in] StringId HII string to dump
-
- @retval EFI_SUCCESS Dump HII string successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpHiiString (
- IN EFI_HII_HANDLE HiiHandle,
- IN EFI_STRING_ID StringId
- )
-{
- EFI_STRING String;
-
- if (HiiHandle == NULL || StringId == 0) {
- DEBUG ((DEBUG_INFO, "???"));
- return EFI_INVALID_PARAMETER;
- }
-
- String = HiiGetString (HiiHandle, StringId, NULL);
- if (String == NULL) {
- return EFI_NOT_FOUND;
- }
-
- DEBUG ((DEBUG_INFO, "%s", String));
- FreePool (String);
-
- return EFI_SUCCESS;
-}
-
-/**
- Debug dump HII form-set data
-
- @param[in] FormsetPrivate HII form-set private instance.
-
- @retval EFI_SUCCESS Dump form-set successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpFormset (
- IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- UINTN Index;
-
- if (FormsetPrivate == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Index = 0;
- HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);
- while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
- HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);
-
- DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPrivate-
Id));
- DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title);
- DEBUG ((DEBUG_INFO, "\n"));
-
- HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
-
- DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate-
QuestionId));
- DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate-
Description);
- DEBUG ((DEBUG_INFO, "\n"));
-
- HiiStatementLink = HiiNextStatementLink;
- }
-
- HiiFormLink = HiiNextFormLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Debug dump HII form-set list
-
- @param[in] FormsetList Form-set list instance
-
- @retval EFI_SUCCESS Dump list successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpFormsetList (
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- UINTN Index;
-
- if (FormsetList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (FormsetList)) {
- DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__));
- return EFI_SUCCESS;
- }
-
- Index = 0;
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n",
++Index, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid,
HiiFormsetPrivate->DevicePathStr));
- DumpFormset (HiiFormsetPrivate);
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Retrieves a string from a string package in a English language. The
- returned string is allocated using AllocatePool(). The caller is responsible
- for freeing the allocated buffer using FreePool().
-
- If HiiHandle is NULL, then ASSERT().
- If StringId is 0, then ASSET.
-
- @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.
- @param[in] HiiHandle A handle that was previously registered in the
HII Database.
- @param[in] StringId The identifier of the string to retrieved from the
string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the string
package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetRedfishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN CHAR8 *Language,
- IN EFI_STRING_ID StringId
- )
-{
- EFI_STATUS Status;
- UINTN StringSize;
- CHAR16 TempString;
- EFI_STRING String;
-
- if (mRedfishPlatformConfigPrivate->HiiString == NULL || HiiHandle == NULL
|| StringId == 0 || IS_EMPTY_STRING (Language)) {
- ASSERT (FALSE);
- return NULL;
- }
-
- //
- // Retrieve the size of the string in the string package for the BestLanguage
- //
- StringSize = 0;
- Status = mRedfishPlatformConfigPrivate->HiiString->GetString (
- mRedfishPlatformConfigPrivate->HiiString,
- Language,
- HiiHandle,
- StringId,
- &TempString,
- &StringSize,
- NULL
- );
- //
- // If GetString() returns EFI_SUCCESS for a zero size,
- // then there are no supported languages registered for HiiHandle. If
GetString()
- // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is
not present
- // in the HII Database
- //
- if (Status != EFI_BUFFER_TOO_SMALL) {
- return NULL;
- }
-
- //
- // Allocate a buffer for the return string
- //
- String = AllocateZeroPool (StringSize);
- if (String == NULL) {
- return NULL;
- }
-
- //
- // Retrieve the string from the string package
- //
- Status = mRedfishPlatformConfigPrivate->HiiString->GetString (
- mRedfishPlatformConfigPrivate->HiiString,
- Language,
- HiiHandle,
- StringId,
- String,
- &StringSize,
- NULL
- );
- if (EFI_ERROR (Status)) {
- //
- // Free the buffer and return NULL if the supported languages can not be
retrieved.
- //
- FreePool (String);
- String = NULL;
- }
-
- //
- // Return the Null-terminated Unicode string
- //
- return String;
-}
-
-/**
- Get string from HII database in English language.
-
- @param[in] HiiHandle A handle that was previously registered in the
HII Database.
- @param[in] StringId The identifier of the string to retrieved from the
string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the string
package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetEnglishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN EFI_STRING_ID StringId
- )
-{
- return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE,
StringId);
-}
-
-/**
- Check and see if this is supported schema or not.
-
- @param[in] SupportedSchema The list of supported schema.
- @param[in] Schema Schema string to be checked.
-
- @retval BOOLEAN TRUE if this is supported schema. FALSE
otherwise.
-
-**/
-BOOLEAN
-CheckSupportedSchema (
- IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema,
- IN CHAR8 *Schema
- )
-{
- UINTN Index;
-
- if (SupportedSchema == NULL || IS_EMPTY_STRING (Schema)) {
- return FALSE;
- }
-
- if (SupportedSchema->Count == 0) {
- return FALSE;
- }
-
- for (Index = 0; Index < SupportedSchema->Count; Index++) {
- if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) == 0) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Get the list of supported schema from the given HII handle.
-
- @param[in] HiiHandle HII handle instance.
- @param[out] SupportedSchema Supported schema on this HII handle.
-
- @retval EFI_SUCCESS Schema list is returned.
- @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema
is NULL.
- @retval EFI_NOT_FOUND No supported schema found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetSupportedSchema (
- IN EFI_HII_HANDLE HiiHandle,
- OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema
- )
-{
- CHAR8 *SupportedLanguages;
- UINTN Index;
- UINTN LangIndex;
- UINTN Count;
- UINTN StrSize;
- UINTN ListIndex;
-
- if (HiiHandle == NULL || SupportedSchema == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- SupportedSchema->Count = 0;
-
- SupportedLanguages = HiiGetSupportedLanguages (HiiHandle);
- if (SupportedLanguages == NULL) {
- return EFI_NOT_FOUND;
- }
-
- Index = 0;
- LangIndex = 0;
- Count = 0;
- while (TRUE) {
- if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {
- if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {
- ++Count;
- }
- LangIndex = Index + 1;
- }
-
- if (SupportedLanguages[Index] == '\0') {
- break;
- }
-
- ++Index;
- }
-
- if (Count == 0) {
- return EFI_NOT_FOUND;
- }
-
- SupportedSchema->Count = Count;
- SupportedSchema->SchemaList = AllocatePool (sizeof (CHAR8 *) * Count);
- if (SupportedSchema->SchemaList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Index = 0;
- LangIndex = 0;
- ListIndex = 0;
- while (TRUE) {
-
- if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {
- if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {
- StrSize = Index - LangIndex;
- SupportedSchema->SchemaList[ListIndex] = AllocateCopyPool ((StrSize
+ 1), &SupportedLanguages[LangIndex]);
- SupportedSchema->SchemaList[ListIndex][StrSize] = '\0';
- ++ListIndex;
- }
-
- LangIndex = Index + 1;
- }
-
- if (SupportedLanguages[Index] == '\0') {
- break;
- }
-
- ++Index;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Search and find statement private instance by given regular expression
patthern
- which describes the Configure Language.
-
- @param[in] RegularExpressionProtocol Regular express protocol.
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] Pattern Regular expression pattern.
- @param[out] StatementList Statement list that match above
pattern.
-
- @retval EFI_SUCCESS Statement list is returned.
- @retval EFI_INVALID_PARAMETER Input parameter is NULL.
- @retval EFI_NOT_READY Regular express protocol is NULL.
- @retval EFI_NOT_FOUND No statement is found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetStatementPrivateByConfigureLangRegex (
- IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING Pattern,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- EFI_STRING TmpString;
- UINTN CaptureCount;
- BOOLEAN IsMatch;
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
-
- if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (Pattern) || StatementList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (RegularExpressionProtocol == NULL) {
- return EFI_NOT_READY;
- }
-
- StatementList->Count = 0;
- InitializeListHead (&StatementList->StatementList);
-
- if (IsListEmpty (FormsetList)) {
- return EFI_NOT_FOUND;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- //
- // Performance check.
- // If there is no desired Redfish schema found, skip this formset.
- //
- if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);
- while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
-
- HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
-
- if (HiiStatementPrivate->Description != 0) {
- TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);
- if (TmpString != NULL) {
- Status = RegularExpressionProtocol->MatchString (
- RegularExpressionProtocol,
- TmpString,
- Pattern,
- &gEfiRegexSyntaxTypePerlGuid,
- &IsMatch,
- NULL,
- &CaptureCount
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n",
__FUNCTION__, Pattern, Status));
- ASSERT (FALSE);
- return Status;
- }
-
- //
- // Found
- //
- if (IsMatch) {
- StatementRef = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF));
- if (StatementRef == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- StatementRef->Statement = HiiStatementPrivate;
- InsertTailList (&StatementList->StatementList, &StatementRef->Link);
- ++StatementList->Count;
- }
-
- FreePool (TmpString);
- }
- }
-
- HiiStatementLink = HiiNextStatementLink;
- }
-
- HiiFormLink = HiiNextFormLink;
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Get statement private instance by the given configure language.
-
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] ConfigureLang Configure language.
-
- @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to
statement private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *
-GetStatementPrivateByConfigureLang (
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- EFI_STRING TmpString;
-
- if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (ConfigureLang)) {
- return NULL;
- }
-
- if (IsListEmpty (FormsetList)) {
- return NULL;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- //
- // Performance check.
- // If there is no desired Redfish schema found, skip this formset.
- //
- if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);
- while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
-
- HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
-
- DEBUG_CODE (
- STATIC UINTN Index = 0;
- DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%x
formset: %g\n", __FUNCTION__, ++Index, ConfigureLang,
HiiStatementPrivate->QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate-
Guid));
- );
-
- if (HiiStatementPrivate->Description != 0) {
- TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);
- if (TmpString != NULL) {
- if (StrCmp (TmpString, ConfigureLang) == 0) {
- FreePool (TmpString);
- return HiiStatementPrivate;
- }
-
- FreePool (TmpString);
- }
- }
-
- HiiStatementLink = HiiNextStatementLink;
- }
-
- HiiFormLink = HiiNextFormLink;
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return NULL;
-}
-
-/**
- Get form-set private instance by the given HII handle.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] FormsetList Form-set list to search.
-
- @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
form-set private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *
-GetFormsetPrivateByHiiHandle (
- IN EFI_HII_HANDLE HiiHandle,
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
-
- if (HiiHandle == NULL || FormsetList == NULL) {
- return NULL;
- }
-
- if (IsListEmpty (FormsetList)) {
- return NULL;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- if (HiiFormsetPrivate->HiiHandle == HiiHandle) {
- return HiiFormsetPrivate;
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return NULL;
-}
-
-/**
- Release formset and all the forms and statements that belong to this
formset.
-
- @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormset (
- IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- UINTN Index;
-
- if (FormsetPrivate == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);
- while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
- HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);
-
- HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
-
- //
- // HiiStatementPrivate->HiiStatement will be released in
DestroyFormSet().
- //
-
- if (HiiStatementPrivate->DesStringCache != NULL) {
- FreePool (HiiStatementPrivate->DesStringCache);
- HiiStatementPrivate->DesStringCache = NULL;
- }
-
- RemoveEntryList (&HiiStatementPrivate->Link);
- FreePool (HiiStatementPrivate);
- HiiStatementLink = HiiNextStatementLink;
- }
-
- //
- // HiiStatementPrivate->HiiForm will be released in DestroyFormSet().
- //
-
- RemoveEntryList (&HiiFormPrivate->Link);
- FreePool (HiiFormPrivate);
- HiiFormLink = HiiNextFormLink;
- }
-
- if (FormsetPrivate->HiiFormSet != NULL) {
- DestroyFormSet (FormsetPrivate->HiiFormSet);
- FormsetPrivate->HiiFormSet = NULL;
- }
-
- FreePool (FormsetPrivate->DevicePathStr);
-
- //
- // Release schema list
- //
- if (FormsetPrivate->SupportedSchema.SchemaList != NULL) {
- for (Index = 0; Index < FormsetPrivate->SupportedSchema.Count;
Index++) {
- FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]);
- }
-
- FreePool (FormsetPrivate->SupportedSchema.SchemaList);
- FormsetPrivate->SupportedSchema.SchemaList = NULL;
- FormsetPrivate->SupportedSchema.Count = 0;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Create new form-set instance.
-
- @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
newly created form-set private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *
-NewFormsetPrivate (
- VOID
- )
-{
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate;
-
- NewFormsetPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE));
- if (NewFormsetPrivate == NULL) {
- return NULL;
- }
-
- //
- // Initial newly created formset private data.
- //
- InitializeListHead (&NewFormsetPrivate->HiiFormList);
-
- return NewFormsetPrivate;
-}
-
-/**
- Load the HII formset from the given HII handle.
-
- @param[in] HiiHandle Target HII handle to load.
- @param[out] FormsetPrivate The formset private data.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormset (
- IN EFI_HII_HANDLE HiiHandle,
- OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- EFI_STATUS Status;
- HII_FORMSET *HiiFormSet;
- HII_FORM *HiiForm;
- LIST_ENTRY *HiiFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- HII_STATEMENT *HiiStatement;
- LIST_ENTRY *HiiStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- EFI_GUID ZeroGuid;
-
- if (HiiHandle == NULL || FormsetPrivate == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
-
- HiiFormSet = AllocateZeroPool (sizeof (HII_FORMSET));
- if (HiiFormSet == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Find HII formset by the given HII handle.
- //
- ZeroMem (&ZeroGuid, sizeof (ZeroGuid));
- Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);
- if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {
- Status = EFI_NOT_FOUND;
- goto ErrorExit;
- }
-
- //
- // Initialize formset
- //
- InitializeFormSet (HiiFormSet);
-
- //
- // Initialize formset private data.
- //
- FormsetPrivate->HiiFormSet = HiiFormSet;
- FormsetPrivate->HiiHandle = HiiHandle;
- CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid);
- FormsetPrivate->DevicePathStr = ConvertDevicePathToText (HiiFormSet-
DevicePath, FALSE, FALSE);
- Status = GetSupportedSchema (FormsetPrivate->HiiHandle,
&FormsetPrivate->SupportedSchema);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found:
%r\n", __FUNCTION__, FormsetPrivate->HiiHandle, Status));
- }
-
- HiiFormLink = GetFirstNode (&HiiFormSet->FormListHead);
- while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) {
- HiiForm = HII_FORM_FROM_LINK (HiiFormLink);
-
- HiiFormPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_PRIVATE));
- if (HiiFormPrivate == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
-
- //
- // Initialize form private data.
- //
- HiiFormPrivate->HiiForm = HiiForm;
- HiiFormPrivate->Id = HiiForm->FormId;
- HiiFormPrivate->Title = HiiForm->FormTitle;
- HiiFormPrivate->ParentFormset = FormsetPrivate;
- InitializeListHead (&HiiFormPrivate->StatementList);
-
- HiiStatementLink = GetFirstNode (&HiiForm->StatementListHead);
- while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) {
- HiiStatement = HII_STATEMENT_FROM_LINK (HiiStatementLink);
-
- HiiStatementPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE));
- if (HiiStatementPrivate == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
- //
- // Initialize statement private data.
- //
- HiiStatementPrivate->HiiStatement = HiiStatement;
- HiiStatementPrivate->QuestionId = HiiStatement->QuestionId;
- HiiStatementPrivate->Description = HiiStatement->Prompt;
- HiiStatementPrivate->ParentForm = HiiFormPrivate;
-
- //
- // Attach to statement list.
- //
- InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate-
Link);
- HiiStatementLink = GetNextNode (&HiiForm->StatementListHead,
HiiStatementLink);
- }
- //
- // Attach to form list.
- //
- InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link);
- HiiFormLink = GetNextNode (&HiiFormSet->FormListHead, HiiFormLink);
- }
-
- return EFI_SUCCESS;
-
-ErrorExit:
-
- //
- // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate yet.
- //
- if (HiiFormSet != NULL && FormsetPrivate->HiiFormSet != HiiFormSet) {
- DestroyFormSet (HiiFormSet);
- }
-
- //
- // Release resource when error happens.
- //
- ReleaseFormset (FormsetPrivate);
-
- return Status;
-}
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormsetList (
- IN EFI_HII_HANDLE *HiiHandle,
- OUT LIST_ENTRY *FormsetList
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;
-
- if (HiiHandle == NULL || FormsetList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- FormsetPrivate = GetFormsetPrivateByHiiHandle (HiiHandle, FormsetList);
- if (FormsetPrivate != NULL) {
- return EFI_ALREADY_STARTED;
- }
-
- FormsetPrivate = NewFormsetPrivate ();
- if (FormsetPrivate == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Load formset on the given HII handle.
- //
- Status = LoadFormset (HiiHandle, FormsetPrivate);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n",
__FUNCTION__, Status));
- FreePool (FormsetPrivate);
- return Status;
- }
-
- //
- // Attach to cache list.
- //
- InsertTailList (FormsetList, &FormsetPrivate->Link);
-
- DEBUG_CODE (
- DumpFormsetList (FormsetList);
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormsetList (
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
-
- if (FormsetList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (FormsetList)) {
- return EFI_SUCCESS;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- //
- // Detach from list.
- //
- RemoveEntryList (&HiiFormsetPrivate->Link);
- ReleaseFormset (HiiFormsetPrivate);
- FreePool (HiiFormsetPrivate);
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Get all pending list.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep pending data.
-
- @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to
pending list data.
-
-**/
-REDFISH_PLATFORM_CONFIG_PENDING_LIST *
-GetPendingList (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- LIST_ENTRY *PendingListLink;
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;
-
- if (HiiHandle == NULL || PendingList == NULL) {
- return NULL;
- }
-
- if (IsListEmpty (PendingList)) {
- return NULL;
- }
-
- PendingListLink = GetFirstNode (PendingList);
- while (!IsNull (PendingList, PendingListLink)) {
- Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);
-
- if (Target->HiiHandle == HiiHandle) {
- return Target;
- }
-
- PendingListLink = GetNextNode (PendingList, PendingListLink);
- }
-
- return NULL;
-}
-
-/**
- When HII database is updated. Keep updated HII handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetUpdate (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;
-
- if (HiiHandle == NULL || PendingList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check and see if this HII handle is processed already.
- //
- TargetPendingList = GetPendingList (HiiHandle, PendingList);
- if (TargetPendingList != NULL) {
- TargetPendingList->IsDeleted = FALSE;
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n",
__FUNCTION__, HiiHandle));
- );
- return EFI_SUCCESS;
- }
-
- TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));
- if (TargetPendingList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TargetPendingList->HiiHandle = HiiHandle;
- TargetPendingList->IsDeleted = FALSE;
-
- InsertTailList (PendingList, &TargetPendingList->Link);
-
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n",
__FUNCTION__, HiiHandle));
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetDeleted (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;
-
- if (HiiHandle == NULL || PendingList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check and see if this HII handle is processed already.
- //
- TargetPendingList = GetPendingList (HiiHandle, PendingList);
- if (TargetPendingList != NULL) {
- TargetPendingList->IsDeleted = TRUE;
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n",
__FUNCTION__, HiiHandle));
- );
- return EFI_SUCCESS;
- }
-
- TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));
- if (TargetPendingList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TargetPendingList->HiiHandle = HiiHandle;
- TargetPendingList->IsDeleted = TRUE;
-
- InsertTailList (PendingList, &TargetPendingList->Link);
-
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n",
__FUNCTION__, HiiHandle));
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- There are HII database update and we need to process them accordingly so
that we
- won't use stale data. This function will parse updated HII handle again in
order
- to get updated data-set.
-
- @param[in] FormsetList List to keep HII form-set.
- @param[in] PendingList List to keep HII handle that is updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.
-
-**/
-EFI_STATUS
-ProcessPendingList (
- IN LIST_ENTRY *FormsetList,
- IN LIST_ENTRY *PendingList
- )
-{
- LIST_ENTRY *PendingListLink;
- LIST_ENTRY *PendingListNextLink;
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;
- EFI_STATUS Status;
-
-
- if (FormsetList == NULL || PendingList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (PendingList)) {
- return EFI_SUCCESS;
- }
-
- PendingListLink = GetFirstNode (PendingList);
- while (!IsNull (PendingList, PendingListLink)) {
- PendingListNextLink = GetNextNode (PendingList, PendingListLink);
- Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);
-
- if (Target->IsDeleted) {
- //
- // The HII resource on this HII handle is removed. Release the formset.
- //
- FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);
- if (FormsetPrivate != NULL) {
- DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver
release HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid));
- RemoveEntryList (&FormsetPrivate->Link);
- ReleaseFormset (FormsetPrivate);
- FreePool (FormsetPrivate);
- } else {
- DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was removed
already\n", __FUNCTION__, Target->HiiHandle));
- }
- } else {
- //
- // The HII resource on this HII handle is updated/removed.
- //
- FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);
- if (FormsetPrivate != NULL) {
- //
- // HII formset already exist, release it and query again.
- //
- DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current
formset\n", __FUNCTION__, &FormsetPrivate->Guid));
- RemoveEntryList (&FormsetPrivate->Link);
- ReleaseFormset (FormsetPrivate);
- FreePool (FormsetPrivate);
- }
-
- Status = LoadFormsetList (Target->HiiHandle, FormsetList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x failed:
%r\n", __FUNCTION__, Target->HiiHandle, Status));
- }
- }
-
- //
- // Detach it from list first.
- //
- RemoveEntryList (&Target->Link);
- FreePool (Target);
-
- PendingListLink = PendingListNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Release all resource in statement list.
-
- @param[in] StatementList Statement list to be released.
-
- @retval EFI_SUCCESS All resource are released.
- @retval EFI_INVALID_PARAMETER StatementList is NULL.
-
-**/
-EFI_STATUS
-ReleaseStatementList (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- )
-{
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
- LIST_ENTRY *NextLink;
-
- if (StatementList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (&StatementList->StatementList)) {
- return EFI_SUCCESS;
- }
-
- NextLink = GetFirstNode (&StatementList->StatementList);
- while (!IsNull (&StatementList->StatementList, NextLink)) {
- StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);
- NextLink = GetNextNode (&StatementList->StatementList, NextLink);
-
- RemoveEntryList (&StatementRef->Link);
- FreePool (StatementRef);
- }
-
- return EFI_SUCCESS;
-}
+/** @file

+

+ The implementation of EDKII Redfidh Platform Config Protocol.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+#include "RedfishPlatformConfigDxe.h"

+#include "RedfishPlatformConfigImpl.h"

+

+extern REDFISH_PLATFORM_CONFIG_PRIVATE
*mRedfishPlatformConfigPrivate;

+

+/**

+ Debug dump HII string

+

+ @param[in] HiiHandle HII handle instance

+ @param[in] StringId HII string to dump

+

+ @retval EFI_SUCCESS Dump HII string successfully

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+DumpHiiString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN EFI_STRING_ID StringId

+ )

+{

+ EFI_STRING String;

+

+ if (HiiHandle == NULL || StringId == 0) {

+ DEBUG ((DEBUG_INFO, "???"));

+ return EFI_INVALID_PARAMETER;

+ }

+

+ String = HiiGetString (HiiHandle, StringId, NULL);

+ if (String == NULL) {

+ return EFI_NOT_FOUND;

+ }

+

+ DEBUG ((DEBUG_INFO, "%s", String));

+ FreePool (String);

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Debug dump HII form-set data

+

+ @param[in] FormsetPrivate HII form-set private instance.

+

+ @retval EFI_SUCCESS Dump form-set successfully

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+DumpFormset (

+ IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate

+ )

+{

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ UINTN Index;

+

+ if (FormsetPrivate == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ Index = 0;

+ HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);

+ while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+ HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);

+

+ DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPrivate-
Id));
+ DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title);

+ DEBUG ((DEBUG_INFO, "\n"));

+

+ HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);

+

+ DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate-
QuestionId));
+ DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate-
Description);
+ DEBUG ((DEBUG_INFO, "\n"));

+

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Debug dump HII form-set list

+

+ @param[in] FormsetList Form-set list instance

+

+ @retval EFI_SUCCESS Dump list successfully

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+DumpFormsetList (

+ IN LIST_ENTRY *FormsetList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ UINTN Index;

+

+ if (FormsetList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__));

+ return EFI_SUCCESS;

+ }

+

+ Index = 0;

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n",
++Index, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid,
HiiFormsetPrivate->DevicePathStr));

+ DumpFormset (HiiFormsetPrivate);

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+EFI_STRING

+HiiGetRedfishString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ )

+{

+ EFI_STATUS Status;

+ UINTN StringSize;

+ CHAR16 TempString;

+ EFI_STRING String;

+

+ if (mRedfishPlatformConfigPrivate->HiiString == NULL || HiiHandle ==
NULL || StringId == 0 || IS_EMPTY_STRING (Language)) {

+ ASSERT (FALSE);

+ return NULL;

+ }

+

+ //

+ // Retrieve the size of the string in the string package for the BestLanguage

+ //

+ StringSize = 0;

+ Status = mRedfishPlatformConfigPrivate->HiiString->GetString (

+ mRedfishPlatformConfigPrivate->HiiString,

+ Language,

+ HiiHandle,

+ StringId,

+ &TempString,

+ &StringSize,

+ NULL

+ );

+ //

+ // If GetString() returns EFI_SUCCESS for a zero size,

+ // then there are no supported languages registered for HiiHandle. If
GetString()

+ // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is
not present

+ // in the HII Database

+ //

+ if (Status != EFI_BUFFER_TOO_SMALL) {

+ return NULL;

+ }

+

+ //

+ // Allocate a buffer for the return string

+ //

+ String = AllocateZeroPool (StringSize);

+ if (String == NULL) {

+ return NULL;

+ }

+

+ //

+ // Retrieve the string from the string package

+ //

+ Status = mRedfishPlatformConfigPrivate->HiiString->GetString (

+ mRedfishPlatformConfigPrivate->HiiString,

+ Language,

+ HiiHandle,

+ StringId,

+ String,

+ &StringSize,

+ NULL

+ );

+ if (EFI_ERROR (Status)) {

+ //

+ // Free the buffer and return NULL if the supported languages can not be
retrieved.

+ //

+ FreePool (String);

+ String = NULL;

+ }

+

+ //

+ // Return the Null-terminated Unicode string

+ //

+ return String;

+}

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+CHAR8 *

+HiiGetRedfishAsciiString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ )

+{

+ EFI_STRING HiiString;

+ UINTN StringSize;

+ CHAR8 *AsciiString;

+

+ HiiString = HiiGetRedfishString (HiiHandle, Language, StringId);

+ if (HiiString == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n",
__FUNCTION__, StringId, Language));

+ return NULL;

+ }

+

+ StringSize = (StrLen (HiiString) + 1) * sizeof (CHAR8);

+ AsciiString = AllocatePool (StringSize);

+ if (AsciiString == NULL) {

+ return NULL;

+ }

+

+ UnicodeStrToAsciiStrS (HiiString, AsciiString, StringSize);

+

+ FreePool (HiiString);

+ return AsciiString;

+}

+

+/**

+ Get string from HII database in English language.

+

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+EFI_STRING

+HiiGetEnglishString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN EFI_STRING_ID StringId

+ )

+{

+ return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE,
StringId);

+}

+

+/**

+ Check and see if this is supported schema or not.

+

+ @param[in] SupportedSchema The list of supported schema.

+ @param[in] Schema Schema string to be checked.

+

+ @retval BOOLEAN TRUE if this is supported schema. FALSE
otherwise.

+

+**/

+BOOLEAN

+CheckSupportedSchema (

+ IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema,

+ IN CHAR8 *Schema

+ )

+{

+ UINTN Index;

+

+ if (SupportedSchema == NULL || IS_EMPTY_STRING (Schema)) {

+ return FALSE;

+ }

+

+ if (SupportedSchema->Count == 0) {

+ return FALSE;

+ }

+

+ for (Index = 0; Index < SupportedSchema->Count; Index++) {

+ if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) == 0) {

+ return TRUE;

+ }

+ }

+

+ return FALSE;

+}

+

+/**

+ Get the list of supported schema from the given HII handle.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[out] SupportedSchema Supported schema on this HII handle.

+

+ @retval EFI_SUCCESS Schema list is returned.

+ @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema
is NULL.

+ @retval EFI_NOT_FOUND No supported schema found.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+GetSupportedSchema (

+ IN EFI_HII_HANDLE HiiHandle,

+ OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema

+ )

+{

+ CHAR8 *SupportedLanguages;

+ UINTN Index;

+ UINTN LangIndex;

+ UINTN Count;

+ UINTN StrSize;

+ UINTN ListIndex;

+

+ if (HiiHandle == NULL || SupportedSchema == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ SupportedSchema->Count = 0;

+

+ SupportedLanguages = HiiGetSupportedLanguages (HiiHandle);

+ if (SupportedLanguages == NULL) {

+ return EFI_NOT_FOUND;

+ }

+

+ Index = 0;

+ LangIndex = 0;

+ Count = 0;

+ while (TRUE) {

+ if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {

+ if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {

+ ++Count;

+ }

+ LangIndex = Index + 1;

+ }

+

+ if (SupportedLanguages[Index] == '\0') {

+ break;

+ }

+

+ ++Index;

+ }

+

+ if (Count == 0) {

+ return EFI_NOT_FOUND;

+ }

+

+ SupportedSchema->Count = Count;

+ SupportedSchema->SchemaList = AllocatePool (sizeof (CHAR8 *) * Count);

+ if (SupportedSchema->SchemaList == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Index = 0;

+ LangIndex = 0;

+ ListIndex = 0;

+ while (TRUE) {

+

+ if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {

+ if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {

+ StrSize = Index - LangIndex;

+ SupportedSchema->SchemaList[ListIndex] = AllocateCopyPool ((StrSize
+ 1), &SupportedLanguages[LangIndex]);

+ SupportedSchema->SchemaList[ListIndex][StrSize] = '\0';

+ ++ListIndex;

+ }

+

+ LangIndex = Index + 1;

+ }

+

+ if (SupportedLanguages[Index] == '\0') {

+ break;

+ }

+

+ ++Index;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Search and find statement private instance by given regular expression
patthern

+ which describes the Configure Language.

+

+ @param[in] RegularExpressionProtocol Regular express protocol.

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] Pattern Regular expression pattern.

+ @param[out] StatementList Statement list that match above
pattern.

+

+ @retval EFI_SUCCESS Statement list is returned.

+ @retval EFI_INVALID_PARAMETER Input parameter is NULL.

+ @retval EFI_NOT_READY Regular express protocol is NULL.

+ @retval EFI_NOT_FOUND No statement is found.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+GetStatementPrivateByConfigureLangRegex (

+ IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING Pattern,

+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ EFI_STRING TmpString;

+ UINTN CaptureCount;

+ BOOLEAN IsMatch;

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;

+

+ if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (Pattern) || StatementList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (RegularExpressionProtocol == NULL) {

+ return EFI_NOT_READY;

+ }

+

+ StatementList->Count = 0;

+ InitializeListHead (&StatementList->StatementList);

+

+ if (IsListEmpty (FormsetList)) {

+ return EFI_NOT_FOUND;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ //

+ // Performance check.

+ // If there is no desired Redfish schema found, skip this formset.

+ //

+ if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);

+ while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+

+ HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate-
StatementList, HiiStatementLink);
+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+

+ if (HiiStatementPrivate->Description != 0) {

+ TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);

+ if (TmpString != NULL) {

+ Status = RegularExpressionProtocol->MatchString (

+ RegularExpressionProtocol,

+ TmpString,

+ Pattern,

+ &gEfiRegexSyntaxTypePerlGuid,

+ &IsMatch,

+ NULL,

+ &CaptureCount

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n",
__FUNCTION__, Pattern, Status));

+ ASSERT (FALSE);

+ return Status;

+ }

+

+ //

+ // Found

+ //

+ if (IsMatch) {

+ StatementRef = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF));

+ if (StatementRef == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ StatementRef->Statement = HiiStatementPrivate;

+ InsertTailList (&StatementList->StatementList, &StatementRef-
Link);
+ ++StatementList->Count;

+ }

+

+ FreePool (TmpString);

+ }

+ }

+

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Get statement private instance by the given configure language.

+

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] ConfigureLang Configure language.

+

+ @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer
to statement private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *

+GetStatementPrivateByConfigureLang (

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ EFI_STRING TmpString;

+

+ if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (ConfigureLang)) {

+ return NULL;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ return NULL;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ //

+ // Performance check.

+ // If there is no desired Redfish schema found, skip this formset.

+ //

+ if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);

+ while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+

+ HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate-
StatementList, HiiStatementLink);
+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+

+ DEBUG_CODE (

+ STATIC UINTN Index = 0;

+ DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%x
formset: %g\n", __FUNCTION__, ++Index, ConfigureLang,
HiiStatementPrivate->QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate-
Guid));
+ );

+

+ if (HiiStatementPrivate->Description != 0) {

+ TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);

+ if (TmpString != NULL) {

+ if (StrCmp (TmpString, ConfigureLang) == 0) {

+ FreePool (TmpString);

+ return HiiStatementPrivate;

+ }

+

+ FreePool (TmpString);

+ }

+ }

+

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return NULL;

+}

+

+/**

+ Get form-set private instance by the given HII handle.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] FormsetList Form-set list to search.

+

+ @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
form-set private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *

+GetFormsetPrivateByHiiHandle (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN LIST_ENTRY *FormsetList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+

+ if (HiiHandle == NULL || FormsetList == NULL) {

+ return NULL;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ return NULL;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ if (HiiFormsetPrivate->HiiHandle == HiiHandle) {

+ return HiiFormsetPrivate;

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return NULL;

+}

+

+/**

+ Release formset and all the forms and statements that belong to this
formset.

+

+ @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+ReleaseFormset (

+ IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate

+ )

+{

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ UINTN Index;

+

+ if (FormsetPrivate == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);

+ while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+ HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);

+

+ HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);

+

+ //

+ // HiiStatementPrivate->HiiStatement will be released in
DestroyFormSet().

+ //

+

+ if (HiiStatementPrivate->DesStringCache != NULL) {

+ FreePool (HiiStatementPrivate->DesStringCache);

+ HiiStatementPrivate->DesStringCache = NULL;

+ }

+

+ RemoveEntryList (&HiiStatementPrivate->Link);

+ FreePool (HiiStatementPrivate);

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ //

+ // HiiStatementPrivate->HiiForm will be released in DestroyFormSet().

+ //

+

+ RemoveEntryList (&HiiFormPrivate->Link);

+ FreePool (HiiFormPrivate);

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ if (FormsetPrivate->HiiFormSet != NULL) {

+ DestroyFormSet (FormsetPrivate->HiiFormSet);

+ FormsetPrivate->HiiFormSet = NULL;

+ }

+

+ if (FormsetPrivate->DevicePathStr != NULL) {

+ FreePool(FormsetPrivate->DevicePathStr);

+ }

+

+ //

+ // Release schema list

+ //

+ if (FormsetPrivate->SupportedSchema.SchemaList != NULL) {

+ for (Index = 0; Index < FormsetPrivate->SupportedSchema.Count;
Index++) {

+ FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]);

+ }

+

+ FreePool (FormsetPrivate->SupportedSchema.SchemaList);

+ FormsetPrivate->SupportedSchema.SchemaList = NULL;

+ FormsetPrivate->SupportedSchema.Count = 0;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Create new form-set instance.

+

+ @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
newly created form-set private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *

+NewFormsetPrivate (

+ VOID

+ )

+{

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate;

+

+ NewFormsetPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE));

+ if (NewFormsetPrivate == NULL) {

+ return NULL;

+ }

+

+ //

+ // Initial newly created formset private data.

+ //

+ InitializeListHead (&NewFormsetPrivate->HiiFormList);

+

+ return NewFormsetPrivate;

+}

+

+/**

+ Load the HII formset from the given HII handle.

+

+ @param[in] HiiHandle Target HII handle to load.

+ @param[out] FormsetPrivate The formset private data.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+LoadFormset (

+ IN EFI_HII_HANDLE HiiHandle,

+ OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
*FormsetPrivate

+ )

+{

+ EFI_STATUS Status;

+ HII_FORMSET *HiiFormSet;

+ HII_FORM *HiiForm;

+ LIST_ENTRY *HiiFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ HII_STATEMENT *HiiStatement;

+ LIST_ENTRY *HiiStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ EFI_GUID ZeroGuid;

+

+ if (HiiHandle == NULL || FormsetPrivate == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+

+ HiiFormSet = AllocateZeroPool (sizeof (HII_FORMSET));

+ if (HiiFormSet == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Find HII formset by the given HII handle.

+ //

+ ZeroMem (&ZeroGuid, sizeof (ZeroGuid));

+ Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);

+ if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {

+ Status = EFI_NOT_FOUND;

+ goto ErrorExit;

+ }

+

+ //

+ // Initialize formset

+ //

+ InitializeFormSet (HiiFormSet);

+

+ //

+ // Initialize formset private data.

+ //

+ FormsetPrivate->HiiFormSet = HiiFormSet;

+ FormsetPrivate->HiiHandle = HiiHandle;

+ CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid);

+ FormsetPrivate->DevicePathStr = ConvertDevicePathToText (HiiFormSet-
DevicePath, FALSE, FALSE);
+ Status = GetSupportedSchema (FormsetPrivate->HiiHandle,
&FormsetPrivate->SupportedSchema);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found:
%r\n", __FUNCTION__, FormsetPrivate->HiiHandle, Status));

+ }

+

+ HiiFormLink = GetFirstNode (&HiiFormSet->FormListHead);

+ while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) {

+ HiiForm = HII_FORM_FROM_LINK (HiiFormLink);

+

+ HiiFormPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_PRIVATE));

+ if (HiiFormPrivate == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto ErrorExit;

+ }

+

+ //

+ // Initialize form private data.

+ //

+ HiiFormPrivate->HiiForm = HiiForm;

+ HiiFormPrivate->Id = HiiForm->FormId;

+ HiiFormPrivate->Title = HiiForm->FormTitle;

+ HiiFormPrivate->ParentFormset = FormsetPrivate;

+ InitializeListHead (&HiiFormPrivate->StatementList);

+

+ HiiStatementLink = GetFirstNode (&HiiForm->StatementListHead);

+ while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) {

+ HiiStatement = HII_STATEMENT_FROM_LINK (HiiStatementLink);

+

+ HiiStatementPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE));

+ if (HiiStatementPrivate == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto ErrorExit;

+ }

+ //

+ // Initialize statement private data.

+ //

+ HiiStatementPrivate->HiiStatement = HiiStatement;

+ HiiStatementPrivate->QuestionId = HiiStatement->QuestionId;

+ HiiStatementPrivate->Description = HiiStatement->Prompt;

+ HiiStatementPrivate->ParentForm = HiiFormPrivate;

+

+ //

+ // Attach to statement list.

+ //

+ InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate-
Link);
+ HiiStatementLink = GetNextNode (&HiiForm->StatementListHead,
HiiStatementLink);

+ }

+ //

+ // Attach to form list.

+ //

+ InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link);

+ HiiFormLink = GetNextNode (&HiiFormSet->FormListHead, HiiFormLink);

+ }

+

+ return EFI_SUCCESS;

+

+ErrorExit:

+

+ //

+ // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate yet.

+ //

+ if (HiiFormSet != NULL && FormsetPrivate->HiiFormSet != HiiFormSet) {

+ DestroyFormSet (HiiFormSet);

+ }

+

+ //

+ // Release resource when error happens.

+ //

+ ReleaseFormset (FormsetPrivate);

+

+ return Status;

+}

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+LoadFormsetList (

+ IN EFI_HII_HANDLE *HiiHandle,

+ OUT LIST_ENTRY *FormsetList

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;

+

+ if (HiiHandle == NULL || FormsetList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ FormsetPrivate = GetFormsetPrivateByHiiHandle (HiiHandle, FormsetList);

+ if (FormsetPrivate != NULL) {

+ return EFI_ALREADY_STARTED;

+ }

+

+ FormsetPrivate = NewFormsetPrivate ();

+ if (FormsetPrivate == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Load formset on the given HII handle.

+ //

+ Status = LoadFormset (HiiHandle, FormsetPrivate);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n",
__FUNCTION__, Status));

+ FreePool (FormsetPrivate);

+ return Status;

+ }

+

+ //

+ // Attach to cache list.

+ //

+ InsertTailList (FormsetList, &FormsetPrivate->Link);

+

+ DEBUG_CODE (

+ DumpFormsetList (FormsetList);

+ );

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+ReleaseFormsetList (

+ IN LIST_ENTRY *FormsetList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+

+ if (FormsetList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ return EFI_SUCCESS;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ //

+ // Detach from list.

+ //

+ RemoveEntryList (&HiiFormsetPrivate->Link);

+ ReleaseFormset (HiiFormsetPrivate);

+ FreePool (HiiFormsetPrivate);

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Get all pending list.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep pending data.

+

+ @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to
pending list data.

+

+**/

+REDFISH_PLATFORM_CONFIG_PENDING_LIST *

+GetPendingList (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ LIST_ENTRY *PendingListLink;

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;

+

+ if (HiiHandle == NULL || PendingList == NULL) {

+ return NULL;

+ }

+

+ if (IsListEmpty (PendingList)) {

+ return NULL;

+ }

+

+ PendingListLink = GetFirstNode (PendingList);

+ while (!IsNull (PendingList, PendingListLink)) {

+ Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);

+

+ if (Target->HiiHandle == HiiHandle) {

+ return Target;

+ }

+

+ PendingListLink = GetNextNode (PendingList, PendingListLink);

+ }

+

+ return NULL;

+}

+

+/**

+ When HII database is updated. Keep updated HII handle into pending list
so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetUpdate (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;

+

+ if (HiiHandle == NULL || PendingList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ //

+ // Check and see if this HII handle is processed already.

+ //

+ TargetPendingList = GetPendingList (HiiHandle, PendingList);

+ if (TargetPendingList != NULL) {

+ TargetPendingList->IsDeleted = FALSE;

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n",
__FUNCTION__, HiiHandle));

+ );

+ return EFI_SUCCESS;

+ }

+

+ TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));

+ if (TargetPendingList == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ TargetPendingList->HiiHandle = HiiHandle;

+ TargetPendingList->IsDeleted = FALSE;

+

+ InsertTailList (PendingList, &TargetPendingList->Link);

+

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n",
__FUNCTION__, HiiHandle));

+ );

+

+ return EFI_SUCCESS;

+}

+

+/**

+ When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetDeleted (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;

+

+ if (HiiHandle == NULL || PendingList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ //

+ // Check and see if this HII handle is processed already.

+ //

+ TargetPendingList = GetPendingList (HiiHandle, PendingList);

+ if (TargetPendingList != NULL) {

+ TargetPendingList->IsDeleted = TRUE;

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n",
__FUNCTION__, HiiHandle));

+ );

+ return EFI_SUCCESS;

+ }

+

+ TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));

+ if (TargetPendingList == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ TargetPendingList->HiiHandle = HiiHandle;

+ TargetPendingList->IsDeleted = TRUE;

+

+ InsertTailList (PendingList, &TargetPendingList->Link);

+

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n",
__FUNCTION__, HiiHandle));

+ );

+

+ return EFI_SUCCESS;

+}

+

+/**

+ There are HII database update and we need to process them accordingly
so that we

+ won't use stale data. This function will parse updated HII handle again in
order

+ to get updated data-set.

+

+ @param[in] FormsetList List to keep HII form-set.

+ @param[in] PendingList List to keep HII handle that is updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.

+

+**/

+EFI_STATUS

+ProcessPendingList (

+ IN LIST_ENTRY *FormsetList,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ LIST_ENTRY *PendingListLink;

+ LIST_ENTRY *PendingListNextLink;

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;

+ EFI_STATUS Status;

+

+

+ if (FormsetList == NULL || PendingList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (PendingList)) {

+ return EFI_SUCCESS;

+ }

+

+ PendingListLink = GetFirstNode (PendingList);

+ while (!IsNull (PendingList, PendingListLink)) {

+ PendingListNextLink = GetNextNode (PendingList, PendingListLink);

+ Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);

+

+ if (Target->IsDeleted) {

+ //

+ // The HII resource on this HII handle is removed. Release the formset.

+ //

+ FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);

+ if (FormsetPrivate != NULL) {

+ DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver
release HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid));

+ RemoveEntryList (&FormsetPrivate->Link);

+ ReleaseFormset (FormsetPrivate);

+ FreePool (FormsetPrivate);

+ } else {

+ DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was
removed already\n", __FUNCTION__, Target->HiiHandle));

+ }

+ } else {

+ //

+ // The HII resource on this HII handle is updated/removed.

+ //

+ FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);

+ if (FormsetPrivate != NULL) {

+ //

+ // HII formset already exist, release it and query again.

+ //

+ DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current
formset\n", __FUNCTION__, &FormsetPrivate->Guid));

+ RemoveEntryList (&FormsetPrivate->Link);

+ ReleaseFormset (FormsetPrivate);

+ FreePool (FormsetPrivate);

+ }

+

+ Status = LoadFormsetList (Target->HiiHandle, FormsetList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x
failed: %r\n", __FUNCTION__, Target->HiiHandle, Status));

+ }

+ }

+

+ //

+ // Detach it from list first.

+ //

+ RemoveEntryList (&Target->Link);

+ FreePool (Target);

+

+ PendingListLink = PendingListNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Release all resource in statement list.

+

+ @param[in] StatementList Statement list to be released.

+

+ @retval EFI_SUCCESS All resource are released.

+ @retval EFI_INVALID_PARAMETER StatementList is NULL.

+

+**/

+EFI_STATUS

+ReleaseStatementList (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ )

+{

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;

+ LIST_ENTRY *NextLink;

+

+ if (StatementList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (&StatementList->StatementList)) {

+ return EFI_SUCCESS;

+ }

+

+ NextLink = GetFirstNode (&StatementList->StatementList);

+ while (!IsNull (&StatementList->StatementList, NextLink)) {

+ StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);

+ NextLink = GetNextNode (&StatementList->StatementList, NextLink);

+

+ RemoveEntryList (&StatementRef->Link);

+ FreePool (StatementRef);

+ }

+

+ return EFI_SUCCESS;

+}

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
index e0ba0fb2d3..be2f63df8d 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
@@ -1,274 +1,297 @@
-/** @file
- This file defines the EDKII Redfish Platform Config Protocol interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_
-
-#include <Uefi.h>
-
-//
-// Libraries
-//
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/HiiUtilityLib.h>
-#include <Library/HiiLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-
-#define REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET 0x00
-#define IS_EMPTY_STRING(a) (a == NULL || a[0] == L'\0')
-#define ENGLISH_LANGUAGE_CODE "en-US"
-#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
-//
-typedef struct {
- LIST_ENTRY Link;
- EFI_HII_HANDLE HiiHandle;
- BOOLEAN IsDeleted;
-} REDFISH_PLATFORM_CONFIG_PENDING_LIST;
-
-#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_PENDING_LIST, Link)
-
-typedef struct {
- UINTN Count; // Number of schema in list
- CHAR8 **SchemaList; // Schema list
-} REDFISH_PLATFORM_CONFIG_SCHEMA;
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- HII_FORMSET *HiiFormSet; // Pointer to HII formset data.
- EFI_GUID Guid; // Formset GUID.
- EFI_HII_HANDLE HiiHandle; // Hii Handle of this formset.
- LIST_ENTRY HiiFormList; // Form list that keep form data under
this formset.
- CHAR16 *DevicePathStr; // Device path of this formset.
- REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema
that is supported in this formset.
-} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- UINT16 Id; // Form ID.
- EFI_STRING_ID Title; // String token of form title.
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset;
- HII_FORM *HiiForm; // Pointer to HII form data.
- LIST_ENTRY StatementList; // Statement list that keep
statement under this form.
-} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a,
REDFISH_PLATFORM_CONFIG_FORM_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;
- HII_STATEMENT *HiiStatement; // Pointer to HII statement
data.
- EFI_QUESTION_ID QuestionId; // Question ID of this
statement.
- EFI_STRING_ID Description; // String token of this question.
- EFI_STRING DesStringCache; // The string cache for search
function.
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
-//
-typedef struct {
- LIST_ENTRY Link;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement;
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF;
-
-#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
-//
-typedef struct {
- LIST_ENTRY StatementList; // List of
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
- UINTN Count;
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST;
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormsetList (
- IN LIST_ENTRY *FormsetList
- );
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormsetList (
- IN EFI_HII_HANDLE *HiiHandle,
- OUT LIST_ENTRY *FormsetList
- );
-
-/**
- When HII database is updated. Keep updated HII handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetUpdate (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetDeleted (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- Get statement private instance by the given configure language.
-
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] ConfigureLang Configure language.
-
- @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to
statement private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *
-GetStatementPrivateByConfigureLang (
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang
- );
-
-/**
- Search and find statement private instance by given regular expression
patthern
- which describes the Configure Language.
-
- @param[in] RegularExpressionProtocol Regular express protocol.
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] Pattern Regular expression pattern.
- @param[out] StatementList Statement list that match above
pattern.
-
- @retval EFI_SUCCESS Statement list is returned.
- @retval EFI_INVALID_PARAMETER Input parameter is NULL.
- @retval EFI_NOT_READY Regular express protocol is NULL.
- @retval EFI_NOT_FOUND No statement is found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetStatementPrivateByConfigureLangRegex (
- IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING Pattern,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- );
-
-/**
- There are HII database update and we need to process them accordingly so
that we
- won't use stale data. This function will parse updated HII handle again in
order
- to get updated data-set.
-
- @param[in] FormsetList List to keep HII form-set.
- @param[in] PendingList List to keep HII handle that is updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.
-
-**/
-EFI_STATUS
-ProcessPendingList (
- IN LIST_ENTRY *FormsetList,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- Retrieves a string from a string package in a English language. The
- returned string is allocated using AllocatePool(). The caller is responsible
- for freeing the allocated buffer using FreePool().
-
- If HiiHandle is NULL, then ASSERT().
- If StringId is 0, then ASSET.
-
- @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.
- @param[in] HiiHandle A handle that was previously registered in the
HII Database.
- @param[in] StringId The identifier of the string to retrieved from the
string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the string
package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetRedfishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN CHAR8 *Language,
- IN EFI_STRING_ID StringId
- );
-
-/**
- Release all resource in statement list.
-
- @param[in] StatementList Statement list to be released.
-
- @retval EFI_SUCCESS All resource are released.
- @retval EFI_INVALID_PARAMETER StatementList is NULL.
-
-**/
-EFI_STATUS
-ReleaseStatementList (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- );
-
-#endif
+/** @file

+ This file defines the EDKII Redfish Platform Config Protocol interface.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_

+#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_

+

+#include <Uefi.h>

+

+//

+// Libraries

+//

+#include <Library/BaseLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/DebugLib.h>

+#include <Library/DevicePathLib.h>

+#include <Library/HiiUtilityLib.h>

+#include <Library/HiiLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiLib.h>

+

+#define IS_EMPTY_STRING(a) (a == NULL || a[0] == L'\0')

+#define ENGLISH_LANGUAGE_CODE "en-US"

+#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.

+//

+typedef struct {

+ LIST_ENTRY Link;

+ EFI_HII_HANDLE HiiHandle;

+ BOOLEAN IsDeleted;

+} REDFISH_PLATFORM_CONFIG_PENDING_LIST;

+

+#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_PENDING_LIST, Link)

+

+typedef struct {

+ UINTN Count; // Number of schema in list

+ CHAR8 **SchemaList; // Schema list

+} REDFISH_PLATFORM_CONFIG_SCHEMA;

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE

+//

+typedef struct {

+ LIST_ENTRY Link;

+ HII_FORMSET *HiiFormSet; // Pointer to HII formset data.

+ EFI_GUID Guid; // Formset GUID.

+ EFI_HII_HANDLE HiiHandle; // Hii Handle of this formset.

+ LIST_ENTRY HiiFormList; // Form list that keep form data under
this formset.

+ CHAR16 *DevicePathStr; // Device path of this formset.

+ REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema
that is supported in this formset.

+} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE

+//

+typedef struct {

+ LIST_ENTRY Link;

+ UINT16 Id; // Form ID.

+ EFI_STRING_ID Title; // String token of form title.

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset;

+ HII_FORM *HiiForm; // Pointer to HII form data.

+ LIST_ENTRY StatementList; // Statement list that keep
statement under this form.

+} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a,
REDFISH_PLATFORM_CONFIG_FORM_PRIVATE, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE

+//

+typedef struct {

+ LIST_ENTRY Link;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;

+ HII_STATEMENT *HiiStatement; // Pointer to HII statement
data.

+ EFI_QUESTION_ID QuestionId; // Question ID of this
statement.

+ EFI_STRING_ID Description; // String token of this question.

+ EFI_STRING DesStringCache; // The string cache for search
function.

+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF

+//

+typedef struct {

+ LIST_ENTRY Link;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement;

+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF;

+

+#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST

+//

+typedef struct {

+ LIST_ENTRY StatementList; // List of
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF

+ UINTN Count;

+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST;

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+ReleaseFormsetList (

+ IN LIST_ENTRY *FormsetList

+ );

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+LoadFormsetList (

+ IN EFI_HII_HANDLE *HiiHandle,

+ OUT LIST_ENTRY *FormsetList

+ );

+

+/**

+ When HII database is updated. Keep updated HII handle into pending list
so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetUpdate (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ );

+

+/**

+ When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetDeleted (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ );

+

+/**

+ Get statement private instance by the given configure language.

+

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] ConfigureLang Configure language.

+

+ @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer
to statement private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *

+GetStatementPrivateByConfigureLang (

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang

+ );

+

+/**

+ Search and find statement private instance by given regular expression
patthern

+ which describes the Configure Language.

+

+ @param[in] RegularExpressionProtocol Regular express protocol.

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] Pattern Regular expression pattern.

+ @param[out] StatementList Statement list that match above
pattern.

+

+ @retval EFI_SUCCESS Statement list is returned.

+ @retval EFI_INVALID_PARAMETER Input parameter is NULL.

+ @retval EFI_NOT_READY Regular express protocol is NULL.

+ @retval EFI_NOT_FOUND No statement is found.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+GetStatementPrivateByConfigureLangRegex (

+ IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING Pattern,

+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ );

+

+/**

+ There are HII database update and we need to process them accordingly
so that we

+ won't use stale data. This function will parse updated HII handle again in
order

+ to get updated data-set.

+

+ @param[in] FormsetList List to keep HII form-set.

+ @param[in] PendingList List to keep HII handle that is updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.

+

+**/

+EFI_STATUS

+ProcessPendingList (

+ IN LIST_ENTRY *FormsetList,

+ IN LIST_ENTRY *PendingList

+ );

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+EFI_STRING

+HiiGetRedfishString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ );

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+CHAR8 *

+HiiGetRedfishAsciiString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ );

+

+/**

+ Release all resource in statement list.

+

+ @param[in] StatementList Statement list to be released.

+

+ @retval EFI_SUCCESS All resource are released.

+ @retval EFI_INVALID_PARAMETER StatementList is NULL.

+

+**/

+EFI_STATUS

+ReleaseStatementList (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ );

+

+#endif

--
2.32.0.windows.2


Nickle Wang
 

Hi Abner,

Thanks for your review. I think I missed some parameter while using "git send-email" command. I will send out version 2 patch with issue fixed.

Thanks,
Nickle

-----Original Message-----
From: Chang, Abner <Abner.Chang@...>
Sent: Sunday, July 24, 2022 9:06 PM
To: Wang, Nickle (Server BIOS) <nickle.wang@...>; devel@edk2.groups.io
Cc: Yang, Atom <Atom.Yang@...>; Nick Ramirez <nramirez@...>
Subject: RE: [edk2][PATCH] edk2/RedfishPkg: Update Redfish Platform Config Protocol

[AMD Official Use Only - General]

Hi Nickle,
I found there are many redundant blank lines in the patch. Could you please check it?

Thanks
Abner

-----Original Message-----
From: Nickle Wang <nickle.wang@...>
Sent: Tuesday, July 12, 2022 8:20 PM
To: devel@edk2.groups.io
Cc: Chang, Abner <Abner.Chang@...>; Yang, Atom
<Atom.Yang@...>; Nick Ramirez <nramirez@...>
Subject: [edk2][PATCH] edk2/RedfishPkg: Update Redfish Platform Config
Protocol

[CAUTION: External Email]

Update EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL and add array type
of
value support to EDKII_REDFISH_VALUE in order to support ordered list
op-code in HII. Modify corresponding function to support new type of
data structure.

Signed-off-by: Nickle Wang <nickle.wang@...>
Cc: Abner Chang <abner.chang@...>
Cc: Yang Atom <Atom.Yang@...>
Cc: Nick Ramirez <nramirez@...>
---
.../Protocol/EdkIIRedfishPlatformConfig.h | 301 +-
.../RedfishPlatformConfigDxe.c | 3087 ++++++++++-------
.../RedfishPlatformConfigDxe.h | 128 +-
.../RedfishPlatformConfigDxe.inf | 104 +-
.../RedfishPlatformConfigImpl.c | 2528 +++++++-------
.../RedfishPlatformConfigImpl.h | 571 +--
6 files changed, 3638 insertions(+), 3081 deletions(-)

diff --git a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
index 895b010227..bbbab90b03 100644
--- a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
+++ b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h
@@ -1,147 +1,154 @@
-/** @file
- This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_H_
-
-typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL;
-
-/**
- Definition of EDKII_REDFISH_TYPE_VALUE
- **/
-typedef union {
- INT64 Integer;
- BOOLEAN Boolean;
- CHAR8 *Buffer;
-} EDKII_REDFISH_TYPE_VALUE;
-
-/**
- Definition of EDKII_REDFISH_VALUE_TYPES
- **/
-typedef enum {
- REDFISH_VALUE_TYPE_UNKNOWN = 0,
- REDFISH_VALUE_TYPE_INTEGER,
- REDFISH_VALUE_TYPE_BOOLEAN,
- REDFISH_VALUE_TYPE_STRING,
- REDFISH_VALUE_TYPE_MAX
-} EDKII_REDFISH_VALUE_TYPES;
-
-/**
- Definition of EDKII_REDFISH_VALUE
- **/
-typedef struct {
- EDKII_REDFISH_VALUE_TYPES Type;
- EDKII_REDFISH_TYPE_VALUE Value;
-} EDKII_REDFISH_VALUE;
-
-/**
- Get Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[out] Value The returned value.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- OUT EDKII_REDFISH_VALUE *Value
- );
-
-/**
- Set Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[in] Value The value to set.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- IN EDKII_REDFISH_VALUE Value
- );
-
-/**
- Get the list of Configure Language from platform configuration by the given
Schema and Pattern.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] Pattern The target Configure Language pattern.
- @param[out] ConfigureLangList The list of Configure Language.
- @param[out] Count The number of Configure Language in
ConfigureLangList.
-
- @retval EFI_SUCCESS ConfigureLangList is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING Pattern,
- OUT EFI_STRING **ConfigureLangList,
- OUT UINTN *Count
- );
-
-
-/**
- Get the list of supported Redfish schema from platform configuration on
the give HII handle.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] HiiHandle The target handle to search. If handle is NULL,
- this function returns all schema from HII database.
- @param[out] SupportedSchema The supported schema list which is
separated by ';'.
- For example: "x-uefi-redfish-Memory.v1_7_1;x-uefi-
redfish-Boot.v1_0_1"
- The SupportedSchema is allocated by the callee. It's caller's
- responsibility to free this buffer using FreePool().
-
- @retval EFI_SUCCESS Schema is returned successfully.
- @retval Others Some error happened.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA)
(
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN EFI_HII_HANDLE HiiHandle, OPTIONAL
- OUT CHAR8 **SupportedSchema
- );
-
-struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL {
- EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue;
- EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue;
- EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG
GetConfigureLang;
- EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA
GetSupportedSchema;
-};
-
-extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid;
-
-#endif
+/** @file

+ This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interface.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_

+#define EDKII_REDFISH_PLATFORM_CONFIG_H_

+

+typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL;

+

+/**

+ Definition of EDKII_REDFISH_TYPE_VALUE

+ **/

+typedef union {

+ INT64 Integer;

+ BOOLEAN Boolean;

+ CHAR8 *Buffer;

+ CHAR8 **StringArray;

+ INT64 *IntegerArray;

+ BOOLEAN *BooleanArray;

+} EDKII_REDFISH_TYPE_VALUE;

+

+/**

+ Definition of EDKII_REDFISH_VALUE_TYPES

+ **/

+typedef enum {

+ REDFISH_VALUE_TYPE_UNKNOWN = 0,

+ REDFISH_VALUE_TYPE_INTEGER,

+ REDFISH_VALUE_TYPE_BOOLEAN,

+ REDFISH_VALUE_TYPE_STRING,

+ REDFISH_VALUE_TYPE_STRING_ARRAY,

+ REDFISH_VALUE_TYPE_INTEGER_ARRAY,

+ REDFISH_VALUE_TYPE_BOOLEAN_ARRAY,

+ REDFISH_VALUE_TYPE_MAX

+} EDKII_REDFISH_VALUE_TYPES;

+

+/**

+ Definition of EDKII_REDFISH_VALUE

+ **/

+typedef struct {

+ EDKII_REDFISH_VALUE_TYPES Type;

+ EDKII_REDFISH_TYPE_VALUE Value;

+ UINTN ArrayCount;

+} EDKII_REDFISH_VALUE;

+

+/**

+ Get Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[out] Value The returned value.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ OUT EDKII_REDFISH_VALUE *Value

+ );

+

+/**

+ Set Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[in] Value The value to set.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ IN EDKII_REDFISH_VALUE Value

+ );

+

+/**

+ Get the list of Configure Language from platform configuration by the
given Schema and RegexPattern.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] RegexPattern The target Configure Language pattern.
This is used for regular expression matching.

+ @param[out] ConfigureLangList The list of Configure Language.

+ @param[out] Count The number of Configure Language in
ConfigureLangList.

+

+ @retval EFI_SUCCESS ConfigureLangList is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING RegexPattern,

+ OUT EFI_STRING **ConfigureLangList,

+ OUT UINTN *Count

+ );

+

+

+/**

+ Get the list of supported Redfish schema from platform configuration on
the give HII handle.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] HiiHandle The target handle to search. If handle is NULL,

+ this function returns all schema from HII database.

+ @param[out] SupportedSchema The supported schema list which is
separated by ';'.

+ For example: "x-uefi-redfish-Memory.v1_7_1;x-uefi-
redfish-Boot.v1_0_1"

+ The SupportedSchema is allocated by the callee. It's
caller's

+ responsibility to free this buffer using FreePool().

+

+ @retval EFI_SUCCESS Schema is returned successfully.

+ @retval Others Some error happened.

+

+**/

+typedef

+EFI_STATUS

+(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA)
(

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN EFI_HII_HANDLE HiiHandle, OPTIONAL

+ OUT CHAR8 **SupportedSchema

+ );

+

+struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL {

+ EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue;

+ EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue;

+ EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG
GetConfigureLang;

+ EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA
GetSupportedSchema;

+};

+

+extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid;

+

+#endif

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
index 67818cccd2..971035f27d 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c
@@ -1,1304 +1,1783 @@
-/** @file
-
- The implementation of EDKII Redfidh Platform Config Protocol.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "RedfishPlatformConfigDxe.h"
-#include "RedfishPlatformConfigImpl.h"
-
-REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =
NULL;
-
-/**
- Compare two value in HII statement format.
-
- @param[in] Value1 Firt value to compare.
- @param[in] Value2 Second value to be compared.
-
- @retval UINTN 0 is retuned when two values are equal.
- 1 is returned when first value is greater than second value.
- -1 is returned when second value is greater than first value.
-
-**/
-UINTN
-CompareHiiStatementValue (
- IN HII_STATEMENT_VALUE *Value1,
- IN HII_STATEMENT_VALUE *Value2
- )
-{
- INTN Result;
- UINT64 Data1;
- UINT64 Data2;
-
- if (Value1 == NULL || Value2 == NULL) {
- return 0xFF;
- }
-
- switch (Value1->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- Data1 = Value1->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- Data1 = Value1->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- Data1 = Value1->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- Data1 = Value1->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- Data1 = (Value1->Value.b ? 1 : 0);
- break;
- default:
- return 0xFF;
- }
-
- switch (Value2->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- Data2 = Value2->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- Data2 = Value2->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- Data2 = Value2->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- Data2 = Value2->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- Data2 = (Value2->Value.b ? 1 : 0);
- break;
- default:
- return 0xFF;
- }
-
- Result = (Data1 == Data2 ? 0 : (Data1 > Data2 ? 1 : -1));
-
- return Result;
-}
-
-/**
- Convert HII value to the string in HII one-of opcode.
-
- @param[in] Statement Statement private instance
-
- @retval EFI_STRING_ID The string ID in HII database.
- 0 is returned when something goes wrong.
-
-**/
-EFI_STRING_ID
-HiiValueToOneOfOptionStringId (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement
- )
-{
- LIST_ENTRY *Link;
- HII_QUESTION_OPTION *Option;
-
- if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {
- return 0;
- }
-
- if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {
- return 0;
- }
-
- Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);
- while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {
- Option = HII_QUESTION_OPTION_FROM_LINK (Link);
-
- if (CompareHiiStatementValue (&Statement->HiiStatement->Value,
&Option->Value) == 0) {
- return Option->Text;
- }
-
- Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);
- }
-
- return 0;
-}
-
-/**
- Convert HII string to the value in HII one-of opcode.
-
- @param[in] Statement Statement private instance
- @param[in] Schema Schema string
- @param[in] HiiString Input string
- @param[out] Value Value returned
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-HiiStringToOneOfOptionValue (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,
- IN CHAR8 *Schema,
- IN EFI_STRING HiiString,
- OUT HII_STATEMENT_VALUE *Value
- )
-{
- LIST_ENTRY *Link;
- HII_QUESTION_OPTION *Option;
- EFI_STRING TmpString;
- BOOLEAN Found;
-
- if (Statement == NULL || IS_EMPTY_STRING (HiiString) || Value == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {
- return EFI_UNSUPPORTED;
- }
-
- if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {
- return EFI_NOT_FOUND;
- }
-
- Found = FALSE;
- Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);
- while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {
- Option = HII_QUESTION_OPTION_FROM_LINK (Link);
-
- TmpString = HiiGetRedfishString (Statement->ParentForm-
ParentFormset->HiiHandle, Schema, Option->Text);
- if (TmpString != NULL) {
- if (StrCmp (TmpString, HiiString) == 0) {
- CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));
- Found = TRUE;
- }
- FreePool (TmpString);
- }
-
- if (Found) {
- return EFI_SUCCESS;
- }
-
- Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);
- }
-
- return EFI_NOT_FOUND;
-}
-
-/**
- Convert HII value to numeric value in Redfish format.
-
- @param[in] Value Value to be converted.
- @param[out] RedfishValue Value in Redfish format.
-
- @retval EFI_SUCCESS Redfish value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-HiiValueToRedfishNumeric (
- IN HII_STATEMENT_VALUE *Value,
- OUT EDKII_REDFISH_VALUE *RedfishValue
- )
-{
- if (Value == NULL || RedfishValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- switch (Value->Type) {
- case EFI_IFR_TYPE_NUM_SIZE_8:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u8;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_16:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u16;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_32:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u32;
- break;
- case EFI_IFR_TYPE_NUM_SIZE_64:
- RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;
- RedfishValue->Value.Integer = (INT64)Value->Value.u64;
- break;
- case EFI_IFR_TYPE_BOOLEAN:
- RedfishValue->Type = REDFISH_VALUE_TYPE_BOOLEAN;
- RedfishValue->Value.Boolean = Value->Value.b;
- break;
- default:
- RedfishValue->Type = REDFISH_VALUE_TYPE_UNKNOWN;
- break;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert numeric value in Redfish format to HII value.
-
- @param[in] RedfishValue Value in Redfish format to be converted.
- @param[out] Value HII value returned.
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishNumericToHiiValue (
- IN EDKII_REDFISH_VALUE *RedfishValue,
- OUT HII_STATEMENT_VALUE *Value
- )
-{
- if (Value == NULL || RedfishValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- switch (RedfishValue->Type) {
- case REDFISH_VALUE_TYPE_INTEGER:
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
- Value->Value.u64 = (UINT64)RedfishValue->Value.Integer;
- break;
- case REDFISH_VALUE_TYPE_BOOLEAN:
- Value->Type = EFI_IFR_TYPE_BOOLEAN;
- Value->Value.b = RedfishValue->Value.Boolean;
- break;
- default:
- Value->Type = EFI_IFR_TYPE_UNDEFINED;
- break;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Return the full Redfish schema string from the given Schema and Version.
-
- Returned schema string is: Schema + '.' + Version
-
- @param[in] Schema Schema string
- @param[in] Version Schema version string
-
- @retval CHAR8 * Schema string. NULL when errors occur.
-
-**/
-CHAR8 *
-GetFullSchemaString (
- IN CHAR8 *Schema,
- IN CHAR8 *Version
- )
-{
- UINTN Size;
- CHAR8 *FullName;
-
- if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) {
- return NULL;
- }
-
- Size = AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize (Schema)
+ AsciiStrSize (Version);
-
- FullName = AllocatePool (Size);
- if (FullName == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__));
- return NULL;
- }
-
- AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX,
Schema, Version);
-
- return FullName;
-}
-
-/**
- Common implementation to get statement private instance.
-
- @param[in] RedfishPlatformConfigPrivate Private instance.
- @param[in] Schema Redfish schema string.
- @param[in] ConfigureLang Configure language that refers to this
statement.
- @param[out] Statement Statement instance
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigGetStatementCommon (
- IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
-
- if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || Statement == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Statement = NULL;
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);
- if (TargetStatement == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));
- return EFI_NOT_FOUND;
- }
-
- //
- // Find current HII question value.
- //
- Status = GetQuestionValue (
- TargetStatement->ParentForm->ParentFormset->HiiFormSet,
- TargetStatement->ParentForm->HiiForm,
- TargetStatement->HiiStatement,
- GetSetValueWithHiiDriver
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
-
- if (TargetStatement->HiiStatement->Value.Type ==
EFI_IFR_TYPE_UNDEFINED) {
- return EFI_DEVICE_ERROR;
- }
-
- //
- // Return Value.
- //
- *Statement = TargetStatement;
-
- return EFI_SUCCESS;
-}
-
-/**
- Get Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[out] Value The returned value.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetValue (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- OUT EDKII_REDFISH_VALUE *Value
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
- EFI_STRING_ID StringId;
- CHAR8 *FullSchema;
- EFI_STRING HiiString;
- UINTN Size;
-
- if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang) || Value == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
- Value->Type = REDFISH_VALUE_TYPE_UNKNOWN;
- FullSchema = NULL;
- HiiString = NULL;
-
- FullSchema = GetFullSchemaString (Schema, Version);
- if (FullSchema == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = RedfishPlatformConfigGetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang,
&TargetStatement);
- if (EFI_ERROR (Status)) {
- goto RELEASE_RESOURCE;
- }
-
- switch (TargetStatement->HiiStatement->Operand) {
- case EFI_IFR_ONE_OF_OP:
- StringId = HiiValueToOneOfOptionStringId (TargetStatement);
- if (StringId == 0) {
- ASSERT (FALSE);
- Status = EFI_DEVICE_ERROR;
- goto RELEASE_RESOURCE;
- }
-
- HiiString = HiiGetRedfishString (TargetStatement->ParentForm-
ParentFormset->HiiHandle, FullSchema, StringId);
- if (HiiString == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n",
__FUNCTION__, StringId, FullSchema));
- Status = EFI_NOT_FOUND;
- goto RELEASE_RESOURCE;
- }
-
- Size = StrLen (HiiString) + 1;
- Value->Value.Buffer = AllocatePool (Size);
- if (Value->Value.Buffer == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
-
- UnicodeStrToAsciiStrS (HiiString, Value->Value.Buffer, Size);
- Value->Type = REDFISH_VALUE_TYPE_STRING;
-
- break;
- case EFI_IFR_STRING_OP:
- if (TargetStatement->HiiStatement->Value.Type !=
EFI_IFR_TYPE_STRING) {
- ASSERT (FALSE);
- Status = EFI_DEVICE_ERROR;
- goto RELEASE_RESOURCE;
- }
-
- Value->Type = REDFISH_VALUE_TYPE_STRING;
- Value->Value.Buffer = AllocateCopyPool (StrSize ((CHAR16
*)TargetStatement->HiiStatement->Value.Buffer), TargetStatement-
HiiStatement->Value.Buffer);
- if (Value->Value.Buffer == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
- break;
- case EFI_IFR_CHECKBOX_OP:
- case EFI_IFR_NUMERIC_OP:
- Status = HiiValueToRedfishNumeric (&TargetStatement->HiiStatement-
Value, Value);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish
value: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
- break;
- default:
- DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please
contact with author if we need to support this type.\n", __FUNCTION__,
TargetStatement->HiiStatement->Operand));
- ASSERT (FALSE);
- Status = EFI_UNSUPPORTED;
- goto RELEASE_RESOURCE;
- }
-
-RELEASE_RESOURCE:
-
- if (FullSchema != NULL) {
- FreePool (FullSchema);
- }
-
- if (HiiString != NULL) {
- FreePool (HiiString);
- }
-
- return Status;
-}
-
-/**
- Function to save question value into HII database.
-
- @param[in] HiiFormset HII form-set instance
- @param[in] HiiForm HII form instance
- @param[in] HiiStatement HII statement that keeps new value.
- @param[in] Value New value to applyu.
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigSaveQuestionValue (
- IN HII_FORMSET *HiiFormset,
- IN HII_FORM *HiiForm,
- IN HII_STATEMENT *HiiStatement,
- IN HII_STATEMENT_VALUE *Value
- )
-{
- EFI_STATUS Status;
-
- if (HiiFormset == NULL || HiiForm == NULL || HiiStatement == NULL ||
Value == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = SetQuestionValue (
- HiiFormset,
- HiiForm,
- HiiStatement,
- Value
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- Status = SubmitForm (HiiFormset, HiiForm);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Common implementation to set statement private instance.
-
- @param[in] RedfishPlatformConfigPrivate Private instance.
- @param[in] Schema Redfish schema string.
- @param[in] ConfigureLang Configure language that refers to this
statement.
- @param[in] Statement Statement instance
-
- @retval EFI_SUCCESS HII value is returned successfully.
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-RedfishPlatformConfigSetStatementCommon (
- IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang,
- IN HII_STATEMENT_VALUE *StatementValue
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;
- EFI_STRING TempBuffer;
-
- if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || StatementValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- TempBuffer = NULL;
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);
- if (TargetStatement == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));
- return EFI_NOT_FOUND;
- }
-
- if (StatementValue->Type != TargetStatement->HiiStatement->Value.Type)
{
- //
- // We treat one-of type as string in Redfish. But one-of statement is not
- // in string format from HII point of view. Do a patch here.
- //
- if (TargetStatement->HiiStatement->Operand == EFI_IFR_ONE_OF_OP
&& StatementValue->Type == EFI_IFR_TYPE_STRING) {
- TempBuffer = AllocatePool (StatementValue->BufferLen * sizeof
(CHAR16));
- if (TempBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- AsciiStrToUnicodeStrS (StatementValue->Buffer, TempBuffer,
StatementValue->BufferLen);
- FreePool (StatementValue->Buffer);
- StatementValue->Buffer = NULL;
- StatementValue->BufferLen = 0;
-
- Status = HiiStringToOneOfOptionValue (TargetStatement, Schema,
TempBuffer, StatementValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the given
%s\n", __FUNCTION__, TempBuffer));
- FreePool (TempBuffer);
- return EFI_NOT_FOUND;
- }
-
- FreePool (TempBuffer);
- } else if (TargetStatement->HiiStatement->Operand ==
EFI_IFR_NUMERIC_OP && StatementValue->Type ==
EFI_IFR_TYPE_NUM_SIZE_64) {
- //
- // Redfish only has numeric value type and it does not care about the
value size.
- // Do a patch here so we have proper value size applied.
- //
- StatementValue->Type = TargetStatement->HiiStatement->Value.Type;
- } else {
- DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type:
0x%x but target value type: 0x%x\n", __FUNCTION__, StatementValue-
Type, TargetStatement->HiiStatement->Value.Type));
- ASSERT (FALSE);
- }
- }
-
- Status = RedfishPlatformConfigSaveQuestionValue (
- TargetStatement->ParentForm->ParentFormset->HiiFormSet,
- TargetStatement->ParentForm->HiiForm,
- TargetStatement->HiiStatement,
- StatementValue
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Set Redfish value with the given Schema and Configure Language.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] ConfigureLang The target value which match this configure
Language.
- @param[in] Value The value to set.
-
- @retval EFI_SUCCESS Value is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolSetValue (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING ConfigureLang,
- IN EDKII_REDFISH_VALUE Value
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- CHAR8 *FullSchema;
- HII_STATEMENT_VALUE NewValue;
-
- if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Value.Type == REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=
REDFISH_VALUE_TYPE_MAX) {
- return EFI_INVALID_PARAMETER;
- }
-
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
- FullSchema = NULL;
-
- FullSchema = GetFullSchemaString (Schema, Version);
- if (FullSchema == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE));
-
- switch (Value.Type) {
- case REDFISH_VALUE_TYPE_INTEGER:
- case REDFISH_VALUE_TYPE_BOOLEAN:
- Status = RedfishNumericToHiiValue (&Value, &NewValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii
value: %r\n", __FUNCTION__, Status));
- goto RELEASE_RESOURCE;
- }
- break;
- case REDFISH_VALUE_TYPE_STRING:
- NewValue.Type = EFI_IFR_TYPE_STRING;
- NewValue.BufferLen = (UINT16)AsciiStrSize (Value.Value.Buffer);
- NewValue.Buffer = AllocateCopyPool (NewValue.BufferLen,
Value.Value.Buffer);
- if (NewValue.Buffer == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
- break;
- default:
- ASSERT (FALSE);
- break;
- }
-
- Status = RedfishPlatformConfigSetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, &NewValue);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n",
__FUNCTION__, Status));
- }
-
-RELEASE_RESOURCE:
-
- if (FullSchema != NULL) {
- FreePool (FullSchema);
- }
-
- return Status;
-}
-
-/**
- Get the list of Configure Language from platform configuration by the given
Schema and Pattern.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] Schema The Redfish schema to query.
- @param[in] Version The Redfish version to query.
- @param[in] Pattern The target Configure Language pattern.
- @param[out] ConfigureLangList The list of Configure Language.
- @param[out] Count The number of Configure Language in
ConfigureLangList.
-
- @retval EFI_SUCCESS ConfigureLangList is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetConfigureLang (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN CHAR8 *Schema,
- IN CHAR8 *Version,
- IN EFI_STRING Pattern,
- OUT EFI_STRING **ConfigureLangList,
- OUT UINTN *Count
- )
-{
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
- LIST_ENTRY *NextLink;
- EFI_STRING TmpString;
- EFI_STRING *TmpConfigureLangList;
- UINTN Index;
- CHAR8 *FullSchema;
-
- if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || Count == NULL || ConfigureLangList == NULL ||
IS_EMPTY_STRING (Pattern)) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Count = 0;
- *ConfigureLangList = NULL;
- FullSchema = NULL;
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- FullSchema = GetFullSchemaString (Schema, Version);
- if (FullSchema == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = GetStatementPrivateByConfigureLangRegex (
- RedfishPlatformConfigPrivate->RegularExpressionProtocol,
- &RedfishPlatformConfigPrivate->FormsetList,
- FullSchema,
- Pattern,
- &StatementList
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a,
GetStatementPrivateByConfigureLangRegex failure: %r\n", __FUNCTION__,
Status));
- goto RELEASE_RESOURCE;
- }
-
- if (!IsListEmpty (&StatementList.StatementList)) {
-
- TmpConfigureLangList = AllocateZeroPool (sizeof (CHAR16 *) *
StatementList.Count);
- if (TmpConfigureLangList == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto RELEASE_RESOURCE;
- }
-
- Index = 0;
- NextLink = GetFirstNode (&StatementList.StatementList);
- while (!IsNull (&StatementList.StatementList, NextLink)) {
- StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);
- NextLink = GetNextNode (&StatementList.StatementList, NextLink);
-
- ASSERT (StatementRef->Statement->Description != 0);
- if (StatementRef->Statement->Description != 0) {
- TmpString = HiiGetRedfishString (StatementRef->Statement-
ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef-
Statement->Description);
- ASSERT (TmpString != NULL);
- if (TmpString != NULL) {
- TmpConfigureLangList[Index] = AllocateCopyPool (StrSize (TmpString),
TmpString);
- ASSERT (TmpConfigureLangList[Index] != NULL);
- FreePool (TmpString);
- ++Index;
- }
- }
- }
- }
-
- *Count = StatementList.Count;
- *ConfigureLangList = TmpConfigureLangList;
-
-RELEASE_RESOURCE:
-
- if (FullSchema != NULL) {
- FreePool (FullSchema);
- }
-
- ReleaseStatementList (&StatementList);
-
- return Status;
-}
-
-
-/**
- Get the list of supported Redfish schema from paltform configuration on
give HII handle.
-
- @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.
- @param[in] HiiHandle The target handle to search. If handle is NULL,
- this function return all schema from HII database.
- @param[out] SupportedSchema The supported schema list which is
separated by ';'.
- The SupportedSchema is allocated by the callee. It's caller's
- responsibility to free this buffer using FreePool().
-
- @retval EFI_SUCCESS Schema is returned successfully.
- @retval Others Some error happened.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigProtocolGetSupportedSchema (
- IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,
- IN EFI_HII_HANDLE HiiHandle, OPTIONAL
- OUT CHAR8 **SupportedSchema
- )
-{
- REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;
- EFI_STATUS Status;
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- UINTN Index;
- UINTN StringSize;
- CHAR8 *StringBuffer;
- UINTN StringIndex;
-
- if (This == NULL || SupportedSchema == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *SupportedSchema = NULL;
-
- RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);
-
- Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));
- return Status;
- }
-
- if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Calculate for string buffer size.
- //
- StringSize = 0;
- HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
- while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- if (HiiFormsetPrivate->SupportedSchema.Count > 0) {
- for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {
- StringSize += AsciiStrSize (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
- }
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- if (StringSize == 0) {
- return EFI_NOT_FOUND;
- }
-
- StringBuffer = AllocatePool (StringSize);
- if (StringBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- StringIndex = 0;
- HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
- while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- if (HiiFormsetPrivate->SupportedSchema.Count > 0) {
- for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {
- AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringIndex),
HiiFormsetPrivate->SupportedSchema.SchemaList[Index]);
- StringIndex += AsciiStrLen (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
- StringBuffer[StringIndex] = ';';
- ++StringIndex;
- }
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- StringBuffer[--StringIndex] = '\0';
-
- *SupportedSchema = StringBuffer;
-
- return EFI_SUCCESS;
-}
-
-/**
- Functions which are registered to receive notification of
- database events have this prototype. The actual event is encoded
- in NotifyType. The following table describes how PackageType,
- PackageGuid, Handle, and Package are used for each of the
- notification types.
-
- @param[in] PackageType Package type of the notification.
- @param[in] PackageGuid If PackageType is
- EFI_HII_PACKAGE_TYPE_GUID, then this is
- the pointer to the GUID from the Guid
- field of EFI_HII_PACKAGE_GUID_HEADER.
- Otherwise, it must be NULL.
- @param[in] Package Points to the package referred to by the
- notification Handle The handle of the package
- list which contains the specified package.
- @param[in] Handle The HII handle.
- @param[in] NotifyType The type of change concerning the
- database. See
- EFI_HII_DATABASE_NOTIFY_TYPE.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigFormUpdateNotify (
- IN UINT8 PackageType,
- IN CONST EFI_GUID *PackageGuid,
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle,
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
- )
-{
- EFI_STATUS Status;
-
- if (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK) {
- //
- // HII formset on this handle is updated by driver during run-time. The
formset needs to be reloaded.
- //
- Status = NotifyFormsetUpdate (Handle, &mRedfishPlatformConfigPrivate-
PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));
- return Status;
- }
- } else if (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) {
- //
- // HII resource is removed. The formset is no longer exist.
- //
- Status = NotifyFormsetDeleted (Handle,
&mRedfishPlatformConfigPrivate->PendingList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));
- return Status;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- This is a EFI_HII_STRING_PROTOCOL notification event handler.
-
- Install HII package notification.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-HiiStringProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate HII database protocol.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiStringProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->HiiString
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure:
%r\n", __FUNCTION__, Status));
- return;
- }
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent = NULL;
-}
-
-/**
- This is a EFI_HII_DATABASE_PROTOCOL notification event handler.
-
- Install HII package notification.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-HiiDatabaseProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate HII database protocol.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiDatabaseProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL
failure: %r\n", __FUNCTION__, Status));
- return;
- }
-
- //
- // Register package notification when new form package is installed.
- //
- Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
- mRedfishPlatformConfigPrivate->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpdateNotify,
- EFI_HII_DATABASE_NOTIFY_NEW_PACK,
- &mRedfishPlatformConfigPrivate->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));
- }
-
- //
- // Register package notification when new form package is updated.
- //
- Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
- mRedfishPlatformConfigPrivate->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpdateNotify,
- EFI_HII_DATABASE_NOTIFY_ADD_PACK,
- &mRedfishPlatformConfigPrivate->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));
- }
-
-#if REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET
- //
- // Register package notification when new form package is removed.
- //
- Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
- mRedfishPlatformConfigPrivate->HiiDatabase,
- EFI_HII_PACKAGE_FORMS,
- NULL,
- RedfishPlatformConfigFormUpdateNotify,
- EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,
- &mRedfishPlatformConfigPrivate->NotifyHandle
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));
- }
-#endif
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent = NULL;
-
-}
-
-/**
- This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler.
-
- @param[in] Event Event whose notification function is being invoked.
- @param[in] Context Pointer to the notification function's context.
-
-**/
-VOID
-EFIAPI
-RegexProtocolInstalled (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
-
- //
- // Locate regular expression protocol.
- //
- Status = gBS->LocateProtocol (
- &gEfiRegularExpressionProtocolGuid,
- NULL,
- (VOID **)&mRedfishPlatformConfigPrivate-
RegularExpressionProtocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, locate
EFI_REGULAR_EXPRESSION_PROTOCOL failure: %r\n", __FUNCTION__,
Status));
- return;
- }
-
- gBS->CloseEvent (Event);
- mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent = NULL;
-
-}
-
-/**
- Unloads an image.
-
- @param ImageHandle Handle that identifies the image to be
unloaded.
-
- @retval EFI_SUCCESS The image has been unloaded.
- @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
-
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigDxeUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- EFI_STATUS Status;
-
- if (mRedfishPlatformConfigPrivate != NULL) {
- Status = gBS->UninstallProtocolInterface (
- mRedfishPlatformConfigPrivate->ImageHandle,
- &gEdkIIRedfishPlatformConfigProtocolGuid,
- (VOID*)&mRedfishPlatformConfigPrivate->Protocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, can not uninstall
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));
- ASSERT (FALSE);
- }
-
- //
- // Close events
- //
- if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent != NULL) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiDbNotify.ProtocolEvent);
- }
- if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent != NULL)
{
- gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiStringNotify.ProtocolEvent);
- }
- if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent != NULL) {
- gBS->CloseEvent (mRedfishPlatformConfigPrivate-
RegexNotify.ProtocolEvent);
- }
-
- //
- // Unregister package notification.
- //
- if (mRedfishPlatformConfigPrivate->NotifyHandle != NULL) {
- mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotify
(
- mRedfishPlatformConfigPrivate->HiiDatabase,
- mRedfishPlatformConfigPrivate->NotifyHandle
- );
- }
-
- ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList);
- FreePool (mRedfishPlatformConfigPrivate);
- mRedfishPlatformConfigPrivate = NULL;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- This is the declaration of an EFI image entry point. This entry point is
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
- both device drivers and bus drivers.
-
- @param ImageHandle The firmware allocated handle for the UEFI
image.
- @param SystemTable A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval Others An unexpected error occurred.
-**/
-EFI_STATUS
-EFIAPI
-RedfishPlatformConfigDxeEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
-
- mRedfishPlatformConfigPrivate = (REDFISH_PLATFORM_CONFIG_PRIVATE
*)AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE));
- if (mRedfishPlatformConfigPrivate == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for
REDFISH_PLATFORM_CONFIG_PRIVATE\n", __FUNCTION__));
- ASSERT (FALSE);
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Protocol initialization
- //
- mRedfishPlatformConfigPrivate->ImageHandle = ImageHandle;
- mRedfishPlatformConfigPrivate->Protocol.GetValue =
RedfishPlatformConfigProtocolGetValue;
- mRedfishPlatformConfigPrivate->Protocol.SetValue =
RedfishPlatformConfigProtocolSetValue;
- mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =
RedfishPlatformConfigProtocolGetConfigureLang;
- mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =
RedfishPlatformConfigProtocolGetSupportedSchema;
-
- InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList);
- InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList);
-
- Status = gBS->InstallProtocolInterface (
- &ImageHandle,
- &gEdkIIRedfishPlatformConfigProtocolGuid,
- EFI_NATIVE_INTERFACE,
- (VOID*)&mRedfishPlatformConfigPrivate->Protocol
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, can not install
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if HII database protocol is installed.
- //
- mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (
- &gEfiHiiDatabaseProtocolGuid,
- TPL_CALLBACK,
- HiiDatabaseProtocolInstalled,
- NULL,
- &mRedfishPlatformConfigPrivate-
HiiDbNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiDatabaseProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if HII string protocol is installed.
- //
- mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (
- &gEfiHiiStringProtocolGuid,
- TPL_CALLBACK,
- HiiStringProtocolInstalled,
- NULL,
- &mRedfishPlatformConfigPrivate-
HiiStringNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent == NULL)
{
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiStringProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- //
- // Install protocol notification if regular expression protocol is installed.
- //
- mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (
- &gEfiRegularExpressionProtocolGuid,
- TPL_CALLBACK,
- RegexProtocolInstalled,
- NULL,
- &mRedfishPlatformConfigPrivate-
RegexNotify.Registration
- );
- if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiRegularExpressionProtocolGuid\n", __FUNCTION__));
- ASSERT (FALSE);
- }
-
- return EFI_SUCCESS;
-}
+/** @file

+

+ The implementation of EDKII Redfidh Platform Config Protocol.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#include "RedfishPlatformConfigDxe.h"

+#include "RedfishPlatformConfigImpl.h"

+

+REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =
NULL;

+

+

+/**

+ Zero extend integer/boolean to UINT64 for comparing.

+

+ @param Value HII Value to be converted.

+

+**/

+UINT64

+ExtendHiiValueToU64 (

+ IN HII_STATEMENT_VALUE *Value

+ )

+{

+ UINT64 Temp;

+

+ Temp = 0;

+ switch (Value->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Temp = Value->Value.u8;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Temp = Value->Value.u16;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Temp = Value->Value.u32;

+ break;

+

+ case EFI_IFR_TYPE_BOOLEAN:

+ Temp = Value->Value.b;

+ break;

+

+ case EFI_IFR_TYPE_TIME:

+ case EFI_IFR_TYPE_DATE:

+ default:

+ break;

+ }

+

+ return Temp;

+}

+

+/**

+ Set value of a data element in an Array by its Index in ordered list buffer.

+

+ @param Array The data array.

+ @param Type Type of the data in this array.

+ @param Index Zero based index for data in this array.

+ @param Value The value to be set.

+

+**/

+VOID

+OrderedListSetArrayData (

+ IN VOID *Array,

+ IN UINT8 Type,

+ IN UINTN Index,

+ IN UINT64 Value

+ )

+{

+

+ ASSERT (Array != NULL);

+

+ switch (Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ *(((UINT8 *) Array) + Index) = (UINT8) Value;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ *(((UINT16 *) Array) + Index) = (UINT16) Value;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ *(((UINT32 *) Array) + Index) = (UINT32) Value;

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ *(((UINT64 *) Array) + Index) = (UINT64) Value;

+ break;

+

+ default:

+ break;

+ }

+}

+

+/**

+ Return data element in an Array by its Index in ordered list array buffer.

+

+ @param Array The data array.

+ @param Type Type of the data in this array.

+ @param Index Zero based index for data in this array.

+

+ @retval Value The data to be returned

+

+**/

+UINT64

+OrderedListGetArrayData (

+ IN VOID *Array,

+ IN UINT8 Type,

+ IN UINTN Index

+ )

+{

+ UINT64 Data;

+

+ ASSERT (Array != NULL);

+

+ Data = 0;

+ switch (Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Data = (UINT64) *(((UINT8 *) Array) + Index);

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Data = (UINT64) *(((UINT16 *) Array) + Index);

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Data = (UINT64) *(((UINT32 *) Array) + Index);

+ break;

+

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Data = (UINT64) *(((UINT64 *) Array) + Index);

+ break;

+

+ default:

+ break;

+ }

+

+ return Data;

+}

+

+/**

+ Find string ID of option if its value equals to given value.

+

+ @param[in] HiiStatement Statement to search.

+ @param[in] Value Target value.

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STRING_ID

+OrderedListOptionValueToStringId (

+ IN HII_STATEMENT *HiiStatement,

+ IN UINT64 Value

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ BOOLEAN Found;

+ UINT64 CurrentValue;

+

+ if (HiiStatement == NULL) {

+ return 0;

+ }

+

+ if (HiiStatement->Operand != EFI_IFR_ORDERED_LIST_OP) {

+ return 0;

+ }

+

+ if (IsListEmpty (&HiiStatement->OptionListHead)) {

+ return 0;

+ }

+

+ Found = FALSE;

+ Link = GetFirstNode (&HiiStatement->OptionListHead);

+ while (!IsNull (&HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ CurrentValue = ExtendHiiValueToU64 (&Option->Value);

+ if (Value == CurrentValue) {

+ return Option->Text;

+ }

+

+ Link = GetNextNode (&HiiStatement->OptionListHead, Link);

+ }

+

+ return 0;

+}

+

+/**

+ Compare two value in HII statement format.

+

+ @param[in] Value1 Firt value to compare.

+ @param[in] Value2 Second value to be compared.

+

+ @retval INTN 0 is retuned when two values are equal.

+ 1 is returned when first value is greater than second value.

+ -1 is returned when second value is greater than first value.

+

+**/

+INTN

+CompareHiiStatementValue (

+ IN HII_STATEMENT_VALUE *Value1,

+ IN HII_STATEMENT_VALUE *Value2

+ )

+{

+ INTN Result;

+ UINT64 Data1;

+ UINT64 Data2;

+

+ if (Value1 == NULL || Value2 == NULL) {

+ return -1;

+ }

+

+ switch (Value1->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Data1 = Value1->Value.u8;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Data1 = Value1->Value.u16;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Data1 = Value1->Value.u32;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Data1 = Value1->Value.u64;

+ break;

+ case EFI_IFR_TYPE_BOOLEAN:

+ Data1 = (Value1->Value.b ? 1 : 0);

+ break;

+ default:

+ return -1;

+ }

+

+ switch (Value2->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Data2 = Value2->Value.u8;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Data2 = Value2->Value.u16;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Data2 = Value2->Value.u32;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Data2 = Value2->Value.u64;

+ break;

+ case EFI_IFR_TYPE_BOOLEAN:

+ Data2 = (Value2->Value.b ? 1 : 0);

+ break;

+ default:

+ return -1;

+ }

+

+ Result = (Data1 == Data2 ? 0 : (Data1 > Data2 ? 1 : -1));

+

+ return Result;

+}

+

+/**

+ Convert HII value to the string in HII one-of opcode.

+

+ @param[in] Statement Statement private instance

+

+ @retval EFI_STRING_ID The string ID in HII database.

+ 0 is returned when something goes wrong.

+

+**/

+EFI_STRING_ID

+HiiValueToOneOfOptionStringId (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {

+ return 0;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return 0;

+ }

+

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ if (CompareHiiStatementValue (&Statement->HiiStatement->Value,
&Option->Value) == 0) {

+ return Option->Text;

+ }

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ return 0;

+}

+

+/**

+ Convert HII string to the value in HII one-of opcode.

+

+ @param[in] Statement Statement private instance

+ @param[in] Schema Schema string

+ @param[in] HiiString Input string

+ @param[out] Value Value returned

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+HiiStringToOneOfOptionValue (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,

+ IN CHAR8 *Schema,

+ IN EFI_STRING HiiString,

+ OUT HII_STATEMENT_VALUE *Value

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ EFI_STRING TmpString;

+ BOOLEAN Found;

+

+ if (Statement == NULL || IS_EMPTY_STRING (HiiString) || Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ONE_OF_OP) {

+ return EFI_UNSUPPORTED;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return EFI_NOT_FOUND;

+ }

+

+ Found = FALSE;

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ TmpString = HiiGetRedfishString (Statement->ParentForm-
ParentFormset->HiiHandle, Schema, Option->Text);
+ if (TmpString != NULL) {

+ if (StrCmp (TmpString, HiiString) == 0) {

+ CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));

+ Found = TRUE;

+ }

+ FreePool (TmpString);

+ }

+

+ if (Found) {

+ return EFI_SUCCESS;

+ }

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ return EFI_NOT_FOUND;

+}

+

+/**

+ Convert HII value to numeric value in Redfish format.

+

+ @param[in] Value Value to be converted.

+ @param[out] RedfishValue Value in Redfish format.

+

+ @retval EFI_SUCCESS Redfish value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+HiiValueToRedfishNumeric (

+ IN HII_STATEMENT_VALUE *Value,

+ OUT EDKII_REDFISH_VALUE *RedfishValue

+ )

+{

+ if (Value == NULL || RedfishValue == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ switch (Value->Type) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u8;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u16;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u32;

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_INTEGER;

+ RedfishValue->Value.Integer = (INT64)Value->Value.u64;

+ break;

+ case EFI_IFR_TYPE_BOOLEAN:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_BOOLEAN;

+ RedfishValue->Value.Boolean = Value->Value.b;

+ break;

+ default:

+ RedfishValue->Type = REDFISH_VALUE_TYPE_UNKNOWN;

+ break;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Convert numeric value in Redfish format to HII value.

+

+ @param[in] RedfishValue Value in Redfish format to be converted.

+ @param[out] Value HII value returned.

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishNumericToHiiValue (

+ IN EDKII_REDFISH_VALUE *RedfishValue,

+ OUT HII_STATEMENT_VALUE *Value

+ )

+{

+ if (Value == NULL || RedfishValue == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ switch (RedfishValue->Type) {

+ case REDFISH_VALUE_TYPE_INTEGER:

+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;

+ Value->Value.u64 = (UINT64)RedfishValue->Value.Integer;

+ break;

+ case REDFISH_VALUE_TYPE_BOOLEAN:

+ Value->Type = EFI_IFR_TYPE_BOOLEAN;

+ Value->Value.b = RedfishValue->Value.Boolean;

+ break;

+ default:

+ Value->Type = EFI_IFR_TYPE_UNDEFINED;

+ break;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Dump the value in ordered list buffer.

+

+ @param[in] OrderedListStatement Ordered list statement.

+

+**/

+VOID

+DumpOrderedListValue (

+ IN HII_STATEMENT *OrderedListStatement

+ )

+{

+ UINT8 *Value8;

+ UINT16 *Value16;

+ UINT32 *Value32;

+ UINT64 *Value64;

+ UINTN Count;

+ UINTN Index;

+

+ if (OrderedListStatement == NULL || OrderedListStatement->Operand !=
EFI_IFR_ORDERED_LIST_OP) {

+ return;

+ }

+

+ DEBUG ((DEBUG_ERROR, "Value.Type= 0x%x\n", OrderedListStatement-
Value.Type));
+ DEBUG ((DEBUG_ERROR, "Value.BufferValueType= 0x%x\n",
OrderedListStatement->Value.BufferValueType));

+ DEBUG ((DEBUG_ERROR, "Value.BufferLen= 0x%x\n",
OrderedListStatement->Value.BufferLen));

+ DEBUG ((DEBUG_ERROR, "Value.Buffer= 0x%x\n", OrderedListStatement-
Value.Buffer));
+ DEBUG ((DEBUG_ERROR, "Value.MaxContainers= 0x%x\n",
OrderedListStatement->ExtraData.OrderListData.MaxContainers));

+ DEBUG ((DEBUG_ERROR, "StorageWidth= 0x%x\n",
OrderedListStatement->StorageWidth));

+

+ if (OrderedListStatement->Value.Buffer == NULL) {

+ return;

+ }

+

+ Value8 = NULL;

+ Value16 = NULL;

+ Value32 = NULL;

+ Value64 = NULL;

+ Count = 0;

+

+ switch (OrderedListStatement->Value.BufferValueType) {

+ case EFI_IFR_TYPE_NUM_SIZE_8:

+ Value8 = (UINT8 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT8);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value8[Index]));

+ }

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_16:

+ Value16 = (UINT16 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT16);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value16[Index]));

+ }

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_32:

+ Value32 = (UINT32 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT32);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value32[Index]));

+ }

+ break;

+ case EFI_IFR_TYPE_NUM_SIZE_64:

+ Value64 = (UINT64 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT64);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value64[Index]));

+ }

+ break;

+ default:

+ Value8 = (UINT8 *)OrderedListStatement->Value.Buffer;

+ Count = OrderedListStatement->StorageWidth / sizeof (UINT8);

+ for (Index = 0; Index < Count; Index++) {

+ DEBUG ((DEBUG_ERROR, "%d ", Value8[Index]));

+ }

+ break;

+ }

+

+ DEBUG ((DEBUG_ERROR, "\n"));

+}

+

+/**

+ Convert HII value to the string in HII ordered list opcode. It's caller's

+ responsibility to free returned buffer using FreePool().

+

+ @param[in] Statement Statement private instance

+ @param[out] ReturnSize The size of returned array

+

+ @retval EFI_STRING_ID The string ID array for options in ordered list.

+

+**/

+EFI_STRING_ID *

+HiiValueToOrderedListOptionStringId (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,

+ OUT UINTN *ReturnSize

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ UINTN OptionCount;

+ EFI_STRING_ID *ReturnedArray;

+ UINTN Index;

+ UINT64 Value;

+

+ if (Statement == NULL || ReturnSize == NULL) {

+ return NULL;

+ }

+

+ *ReturnSize = 0;

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ORDERED_LIST_OP) {

+ return NULL;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return NULL;

+ }

+

+ DEBUG_CODE (

+ DumpOrderedListValue (Statement->HiiStatement);

+ );

+

+ OptionCount = 0;

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ ++OptionCount;

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ *ReturnSize = OptionCount;

+ ReturnedArray = AllocatePool (sizeof (EFI_STRING_ID) * OptionCount);

+ if (ReturnedArray == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));

+ *ReturnSize = 0;

+ return NULL;

+ }

+

+ for (Index = 0; Index < OptionCount; Index++) {

+ Value = OrderedListGetArrayData (Statement->HiiStatement-
Value.Buffer, Statement->HiiStatement->Value.BufferValueType, Index);
+ ReturnedArray[Index] = OrderedListOptionValueToStringId (Statement-
HiiStatement, Value);
+ }

+

+ return ReturnedArray;

+}

+

+/**

+ Convert HII string to the value in HII ordered list opcode.

+

+ @param[in] Statement Statement private instance

+ @param[in] Schema Schema string

+ @param[in] HiiString Input string

+ @param[out] Value Value returned

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+HiiStringToOrderedListOptionValue (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement,

+ IN CHAR8 *Schema,

+ IN EFI_STRING HiiString,

+ OUT UINT64 *Value

+ )

+{

+ LIST_ENTRY *Link;

+ HII_QUESTION_OPTION *Option;

+ EFI_STRING TmpString;

+ BOOLEAN Found;

+

+ if (Statement == NULL || IS_EMPTY_STRING (HiiString) || Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *Value = 0;

+

+ if (Statement->HiiStatement->Operand != EFI_IFR_ORDERED_LIST_OP) {

+ return EFI_UNSUPPORTED;

+ }

+

+ if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) {

+ return EFI_NOT_FOUND;

+ }

+

+ Found = FALSE;

+ Link = GetFirstNode (&Statement->HiiStatement->OptionListHead);

+ while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) {

+ Option = HII_QUESTION_OPTION_FROM_LINK (Link);

+

+ TmpString = HiiGetRedfishString (Statement->ParentForm-
ParentFormset->HiiHandle, Schema, Option->Text);
+ if (TmpString != NULL) {

+ if (StrCmp (TmpString, HiiString) == 0) {

+ *Value = ExtendHiiValueToU64 (&Option->Value);

+ Found = TRUE;

+ }

+ FreePool (TmpString);

+ }

+

+ if (Found) {

+ return EFI_SUCCESS;

+ }

+

+ Link = GetNextNode (&Statement->HiiStatement->OptionListHead, Link);

+ }

+

+ return EFI_NOT_FOUND;

+}

+

+/**

+ Convert input ascii string to unicode string. It's caller's

+ responsibility to free returned buffer using FreePool().

+

+ @param[in] AsciiString Ascii string to be converted.

+

+ @retval CHAR16 * Unicode string on return.

+

+**/

+EFI_STRING

+StrToUnicodeStr (

+ IN CHAR8 *AsciiString

+ )

+{

+ UINTN StringLen;

+ EFI_STRING Buffer;

+ EFI_STATUS Status;

+

+ if (AsciiString == NULL || AsciiString[0] == '\0') {

+ return NULL;

+ }

+

+ StringLen = AsciiStrLen (AsciiString) + 1;

+ Buffer = AllocatePool (StringLen * sizeof (CHAR16));

+ if (Buffer == NULL) {

+ return NULL;

+ }

+

+ Status = AsciiStrToUnicodeStrS (AsciiString, Buffer, StringLen);

+ if (EFI_ERROR (Status)) {

+ FreePool (Buffer);

+ return NULL;

+ }

+

+ return Buffer;

+}

+

+/**

+ Return the full Redfish schema string from the given Schema and Version.

+

+ Returned schema string is: Schema + '.' + Version

+

+ @param[in] Schema Schema string

+ @param[in] Version Schema version string

+

+ @retval CHAR8 * Schema string. NULL when errors occur.

+

+**/

+CHAR8 *

+GetFullSchemaString (

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version

+ )

+{

+ UINTN Size;

+ CHAR8 *FullName;

+

+ if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) {

+ return NULL;

+ }

+

+ Size = AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize
(Schema) + AsciiStrSize (Version);

+

+ FullName = AllocatePool (Size);

+ if (FullName == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__));

+ return NULL;

+ }

+

+ AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX,
Schema, Version);

+

+ return FullName;

+}

+

+/**

+ Common implementation to get statement private instance.

+

+ @param[in] RedfishPlatformConfigPrivate Private instance.

+ @param[in] Schema Redfish schema string.

+ @param[in] ConfigureLang Configure language that refers to this
statement.

+ @param[out] Statement Statement instance

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishPlatformConfigGetStatementCommon (

+ IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang,

+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;

+

+ if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || Statement == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *Statement = NULL;

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);

+ if (TargetStatement == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));

+ return EFI_NOT_FOUND;

+ }

+

+ //

+ // Find current HII question value.

+ //

+ Status = GetQuestionValue (

+ TargetStatement->ParentForm->ParentFormset->HiiFormSet,

+ TargetStatement->ParentForm->HiiForm,

+ TargetStatement->HiiStatement,

+ GetSetValueWithHiiDriver

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+

+ if (TargetStatement->HiiStatement->Value.Type ==
EFI_IFR_TYPE_UNDEFINED) {

+ return EFI_DEVICE_ERROR;

+ }

+

+ //

+ // Return Value.

+ //

+ *Statement = TargetStatement;

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Get Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[out] Value The returned value.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolGetValue (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ OUT EDKII_REDFISH_VALUE *Value

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;

+ EFI_STRING_ID StringId;

+ EFI_STRING_ID *StringIdArray;

+ CHAR8 *FullSchema;

+ EFI_STRING HiiString;

+ UINTN Count;

+ UINTN Index;

+

+ if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang) || Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+ Value->Type = REDFISH_VALUE_TYPE_UNKNOWN;

+ Value->ArrayCount = 0;

+ Count = 0;

+ FullSchema = NULL;

+ HiiString = NULL;

+ StringIdArray = NULL;

+

+ FullSchema = GetFullSchemaString (Schema, Version);

+ if (FullSchema == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Status = RedfishPlatformConfigGetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang,
&TargetStatement);

+ if (EFI_ERROR (Status)) {

+ goto RELEASE_RESOURCE;

+ }

+

+ switch (TargetStatement->HiiStatement->Operand) {

+ case EFI_IFR_ONE_OF_OP:

+ StringId = HiiValueToOneOfOptionStringId (TargetStatement);

+ if (StringId == 0) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Value.Buffer = HiiGetRedfishAsciiString (TargetStatement-
ParentForm->ParentFormset->HiiHandle, FullSchema, StringId);
+ if (Value->Value.Buffer == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Type = REDFISH_VALUE_TYPE_STRING;

+ break;

+ case EFI_IFR_STRING_OP:

+ if (TargetStatement->HiiStatement->Value.Type !=
EFI_IFR_TYPE_STRING) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Type = REDFISH_VALUE_TYPE_STRING;

+ Value->Value.Buffer = AllocatePool (StrLen ((CHAR16
*)TargetStatement->HiiStatement->Value.Buffer) + 1);

+ UnicodeStrToAsciiStrS ((CHAR16 *)TargetStatement->HiiStatement-
Value.Buffer, Value->Value.Buffer, StrLen ((CHAR16 *)TargetStatement-
HiiStatement->Value.Buffer) + 1);
+ break;

+ case EFI_IFR_CHECKBOX_OP:

+ case EFI_IFR_NUMERIC_OP:

+ Status = HiiValueToRedfishNumeric (&TargetStatement->HiiStatement-
Value, Value);
+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish
value: %r\n", __FUNCTION__, Status));

+ goto RELEASE_RESOURCE;

+ }

+ break;

+ case EFI_IFR_ACTION_OP:

+ if (TargetStatement->HiiStatement->Value.Type !=
EFI_IFR_TYPE_ACTION) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ //

+ // Action has no value. Just return unknown type.

+ //

+ Value->Type = REDFISH_VALUE_TYPE_UNKNOWN;

+ break;

+ case EFI_IFR_ORDERED_LIST_OP:

+ StringIdArray = HiiValueToOrderedListOptionStringId (TargetStatement,
&Count);

+ if (StringIdArray == NULL) {

+ ASSERT (FALSE);

+ Status = EFI_DEVICE_ERROR;

+ goto RELEASE_RESOURCE;

+ }

+

+ Value->Value.StringArray = AllocatePool (sizeof (CHAR8 *) * Count);

+ if (Value->Value.StringArray == NULL) {

+ ASSERT (FALSE);

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+

+ for (Index = 0; Index < Count; Index++) {

+ ASSERT (StringIdArray[Index] != 0);

+ Value->Value.StringArray[Index] = HiiGetRedfishAsciiString
(TargetStatement->ParentForm->ParentFormset->HiiHandle, FullSchema,
StringIdArray[Index]);

+ }

+

+ Value->ArrayCount = Count;

+ Value->Type = REDFISH_VALUE_TYPE_STRING_ARRAY;

+ break;

+ default:

+ DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please
contact with author if we need to support this type.\n", __FUNCTION__,
TargetStatement->HiiStatement->Operand));

+ ASSERT (FALSE);

+ Status = EFI_UNSUPPORTED;

+ goto RELEASE_RESOURCE;

+ }

+

+RELEASE_RESOURCE:

+

+ if (FullSchema != NULL) {

+ FreePool (FullSchema);

+ }

+

+ if (HiiString != NULL) {

+ FreePool (HiiString);

+ }

+

+ if (StringIdArray != NULL) {

+ FreePool (StringIdArray);

+ }

+

+ return Status;

+}

+

+/**

+ Function to save question value into HII database.

+

+ @param[in] HiiFormset HII form-set instance

+ @param[in] HiiForm HII form instance

+ @param[in] HiiStatement HII statement that keeps new value.

+ @param[in] Value New value to applyu.

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishPlatformConfigSaveQuestionValue (

+ IN HII_FORMSET *HiiFormset,

+ IN HII_FORM *HiiForm,

+ IN HII_STATEMENT *HiiStatement,

+ IN HII_STATEMENT_VALUE *Value

+ )

+{

+ EFI_STATUS Status;

+

+ if (HiiFormset == NULL || HiiForm == NULL || HiiStatement == NULL ||
Value == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ Status = SetQuestionValue (

+ HiiFormset,

+ HiiForm,

+ HiiStatement,

+ Value

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ Status = SubmitForm (HiiFormset, HiiForm);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Common implementation to set statement private instance.

+

+ @param[in] RedfishPlatformConfigPrivate Private instance.

+ @param[in] Schema Redfish schema string.

+ @param[in] ConfigureLang Configure language that refers to this
statement.

+ @param[in] Statement Statement instance

+

+ @retval EFI_SUCCESS HII value is returned successfully.

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+RedfishPlatformConfigSetStatementCommon (

+ IN REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang,

+ IN HII_STATEMENT_VALUE *StatementValue

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement;

+ EFI_STRING TempBuffer;

+ UINT8 *StringArray;

+ UINTN Index;

+ UINT64 Value;

+ CHAR8 **CharArray;

+

+ if (RedfishPlatformConfigPrivate == NULL || IS_EMPTY_STRING (Schema)
|| IS_EMPTY_STRING (ConfigureLang) || StatementValue == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ TempBuffer = NULL;

+ StringArray = NULL;

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ TargetStatement = GetStatementPrivateByConfigureLang
(&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang);

+ if (TargetStatement == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the
given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema));

+ return EFI_NOT_FOUND;

+ }

+

+ if (StatementValue->Type != TargetStatement->HiiStatement-
Value.Type) {
+ //

+ // We treat one-of type as string in Redfish. But one-of statement is not

+ // in string format from HII point of view. Do a patch here.

+ //

+ if (TargetStatement->HiiStatement->Operand == EFI_IFR_ONE_OF_OP
&& StatementValue->Type == EFI_IFR_TYPE_STRING) {

+

+ TempBuffer = StrToUnicodeStr ((CHAR8 *)StatementValue->Buffer);

+ if (TempBuffer == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+ FreePool (StatementValue->Buffer);

+ StatementValue->Buffer = NULL;

+ StatementValue->BufferLen = 0;

+

+ Status = HiiStringToOneOfOptionValue (TargetStatement, Schema,
TempBuffer, StatementValue);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the given
%s\n", __FUNCTION__, TempBuffer));

+ FreePool (TempBuffer);

+ return EFI_NOT_FOUND;

+ }

+

+ FreePool (TempBuffer);

+ } else if (TargetStatement->HiiStatement->Operand ==
EFI_IFR_ORDERED_LIST_OP && StatementValue->Type ==
EFI_IFR_TYPE_STRING) {

+ //

+ // We treat ordered list type as string in Redfish. But ordered list
statement is not

+ // in string format from HII point of view. Do a patch here.

+ //

+ StringArray = AllocateZeroPool (TargetStatement->HiiStatement-
StorageWidth);
+ if (StringArray == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Arrage new option order from input string array

+ //

+ CharArray = (CHAR8 **)StatementValue->Buffer;

+ for (Index = 0; Index < StatementValue->BufferLen; Index++) {

+ TempBuffer = StrToUnicodeStr (CharArray[Index]);

+ if (TempBuffer == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Status = HiiStringToOrderedListOptionValue (TargetStatement, Schema,
TempBuffer, &Value);

+ if (EFI_ERROR (Status)) {

+ ASSERT (FALSE);

+ continue;

+ }

+ FreePool (TempBuffer);

+ OrderedListSetArrayData (StringArray, TargetStatement->HiiStatement-
Value.BufferValueType, Index, Value);
+ }

+

+ StatementValue->Type = EFI_IFR_TYPE_BUFFER;

+ StatementValue->Buffer = StringArray;

+ StatementValue->BufferLen = TargetStatement->HiiStatement-
StorageWidth;
+ StatementValue->BufferValueType = TargetStatement->HiiStatement-
Value.BufferValueType;
+ } else if (TargetStatement->HiiStatement->Operand ==
EFI_IFR_NUMERIC_OP && StatementValue->Type ==
EFI_IFR_TYPE_NUM_SIZE_64) {

+ //

+ // Redfish only has numeric value type and it does not care about the
value size.

+ // Do a patch here so we have proper value size applied.

+ //

+ StatementValue->Type = TargetStatement->HiiStatement->Value.Type;

+ } else {

+ DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type:
0x%x but target value type: 0x%x\n", __FUNCTION__, StatementValue-
Type, TargetStatement->HiiStatement->Value.Type));
+ ASSERT (FALSE);

+ }

+ }

+

+ Status = RedfishPlatformConfigSaveQuestionValue (

+ TargetStatement->ParentForm->ParentFormset->HiiFormSet,

+ TargetStatement->ParentForm->HiiForm,

+ TargetStatement->HiiStatement,

+ StatementValue

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Set Redfish value with the given Schema and Configure Language.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] ConfigureLang The target value which match this configure
Language.

+ @param[in] Value The value to set.

+

+ @retval EFI_SUCCESS Value is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolSetValue (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING ConfigureLang,

+ IN EDKII_REDFISH_VALUE Value

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ CHAR8 *FullSchema;

+ HII_STATEMENT_VALUE NewValue;

+

+ if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || IS_EMPTY_STRING (ConfigureLang)) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (Value.Type == REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=
REDFISH_VALUE_TYPE_MAX) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+ FullSchema = NULL;

+

+ FullSchema = GetFullSchemaString (Schema, Version);

+ if (FullSchema == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE));

+

+ switch (Value.Type) {

+ case REDFISH_VALUE_TYPE_INTEGER:

+ case REDFISH_VALUE_TYPE_BOOLEAN:

+ Status = RedfishNumericToHiiValue (&Value, &NewValue);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii
value: %r\n", __FUNCTION__, Status));

+ goto RELEASE_RESOURCE;

+ }

+ break;

+ case REDFISH_VALUE_TYPE_STRING:

+ NewValue.Type = EFI_IFR_TYPE_STRING;

+ NewValue.BufferLen = (UINT16)AsciiStrSize (Value.Value.Buffer);

+ NewValue.Buffer = AllocateCopyPool (NewValue.BufferLen,
Value.Value.Buffer);

+ if (NewValue.Buffer == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+ break;

+ case REDFISH_VALUE_TYPE_STRING_ARRAY:

+ NewValue.Type = EFI_IFR_TYPE_STRING;

+ NewValue.BufferLen = (UINT16)Value.ArrayCount;

+ NewValue.Buffer = (UINT8 *)Value.Value.StringArray;

+ break;

+ default:

+ ASSERT (FALSE);

+ break;

+ }

+

+ Status = RedfishPlatformConfigSetStatementCommon
(RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, &NewValue);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n",
__FUNCTION__, Status));

+ }

+

+RELEASE_RESOURCE:

+

+ if (FullSchema != NULL) {

+ FreePool (FullSchema);

+ }

+

+ return Status;

+}

+

+/**

+ Get the list of Configure Language from platform configuration by the
given Schema and RegexPattern.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] Schema The Redfish schema to query.

+ @param[in] Version The Redfish version to query.

+ @param[in] RegexPattern The target Configure Language pattern.
This is used for regular expression matching.

+ @param[out] ConfigureLangList The list of Configure Language.

+ @param[out] Count The number of Configure Language in
ConfigureLangList.

+

+ @retval EFI_SUCCESS ConfigureLangList is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolGetConfigureLang (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN CHAR8 *Schema,

+ IN CHAR8 *Version,

+ IN EFI_STRING RegexPattern,

+ OUT EFI_STRING **ConfigureLangList,

+ OUT UINTN *Count

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
*StatementRef;

+ LIST_ENTRY *NextLink;

+ EFI_STRING TmpString;

+ EFI_STRING *TmpConfigureLangList;

+ UINTN Index;

+ CHAR8 *FullSchema;

+

+ if (This == NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING
(Version) || Count == NULL || ConfigureLangList == NULL ||
IS_EMPTY_STRING (RegexPattern)) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *Count = 0;

+ *ConfigureLangList = NULL;

+ FullSchema = NULL;

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ FullSchema = GetFullSchemaString (Schema, Version);

+ if (FullSchema == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Status = GetStatementPrivateByConfigureLangRegex (

+ RedfishPlatformConfigPrivate->RegularExpressionProtocol,

+ &RedfishPlatformConfigPrivate->FormsetList,

+ FullSchema,

+ RegexPattern,

+ &StatementList

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a,
GetStatementPrivateByConfigureLangRegex failure: %r\n", __FUNCTION__,
Status));

+ goto RELEASE_RESOURCE;

+ }

+

+ if (!IsListEmpty (&StatementList.StatementList)) {

+

+ TmpConfigureLangList = AllocateZeroPool (sizeof (CHAR16 *) *
StatementList.Count);

+ if (TmpConfigureLangList == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto RELEASE_RESOURCE;

+ }

+

+ Index = 0;

+ NextLink = GetFirstNode (&StatementList.StatementList);

+ while (!IsNull (&StatementList.StatementList, NextLink)) {

+ StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);

+ NextLink = GetNextNode (&StatementList.StatementList, NextLink);

+

+ ASSERT (StatementRef->Statement->Description != 0);

+ if (StatementRef->Statement->Description != 0) {

+ TmpString = HiiGetRedfishString (StatementRef->Statement-
ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef-
Statement->Description);
+ ASSERT (TmpString != NULL);

+ if (TmpString != NULL) {

+ TmpConfigureLangList[Index] = AllocateCopyPool (StrSize (TmpString),
TmpString);

+ ASSERT (TmpConfigureLangList[Index] != NULL);

+ FreePool (TmpString);

+ ++Index;

+ }

+ }

+ }

+ }

+

+ *Count = StatementList.Count;

+ *ConfigureLangList = TmpConfigureLangList;

+

+RELEASE_RESOURCE:

+

+ if (FullSchema != NULL) {

+ FreePool (FullSchema);

+ }

+

+ ReleaseStatementList (&StatementList);

+

+ return Status;

+}

+

+/**

+ Get the list of supported Redfish schema from paltform configuration on
give HII handle.

+

+ @param[in] This Pointer to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance.

+ @param[in] HiiHandle The target handle to search. If handle is NULL,

+ this function return all schema from HII database.

+ @param[out] SupportedSchema The supported schema list which is
separated by ';'.

+ The SupportedSchema is allocated by the callee. It's
caller's

+ responsibility to free this buffer using FreePool().

+

+ @retval EFI_SUCCESS Schema is returned successfully.

+ @retval Others Some error happened.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigProtocolGetSupportedSchema (

+ IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This,

+ IN EFI_HII_HANDLE HiiHandle, OPTIONAL

+ OUT CHAR8 **SupportedSchema

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PRIVATE
*RedfishPlatformConfigPrivate;

+ EFI_STATUS Status;

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ UINTN Index;

+ UINTN StringSize;

+ CHAR8 *StringBuffer;

+ UINTN StringIndex;

+

+ if (This == NULL || SupportedSchema == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ *SupportedSchema = NULL;

+

+ RedfishPlatformConfigPrivate =
REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This);

+

+ Status = ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetList,
&RedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n",
__FUNCTION__, Status));

+ return Status;

+ }

+

+ if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) {

+ return EFI_NOT_FOUND;

+ }

+

+ //

+ // Calculate for string buffer size.

+ //

+ StringSize = 0;

+ HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
+ while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ if (HiiFormsetPrivate->SupportedSchema.Count > 0) {

+ for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {

+ StringSize += AsciiStrSize (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
+ }

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ if (StringSize == 0) {

+ return EFI_NOT_FOUND;

+ }

+

+ StringBuffer = AllocatePool (StringSize);

+ if (StringBuffer == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ StringIndex = 0;

+ HiiFormsetLink = GetFirstNode (&RedfishPlatformConfigPrivate-
FormsetList);
+ while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList,
HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (&RedfishPlatformConfigPrivate-
FormsetList, HiiFormsetLink);
+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ if (HiiHandle != NULL && HiiHandle != HiiFormsetPrivate->HiiHandle) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ if (HiiFormsetPrivate->SupportedSchema.Count > 0) {

+ for (Index = 0; Index < HiiFormsetPrivate->SupportedSchema.Count;
Index++) {

+ AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringIndex),
HiiFormsetPrivate->SupportedSchema.SchemaList[Index]);

+ StringIndex += AsciiStrLen (HiiFormsetPrivate-
SupportedSchema.SchemaList[Index]);
+ StringBuffer[StringIndex] = ';';

+ ++StringIndex;

+ }

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ StringBuffer[--StringIndex] = '\0';

+

+ *SupportedSchema = StringBuffer;

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Functions which are registered to receive notification of

+ database events have this prototype. The actual event is encoded

+ in NotifyType. The following table describes how PackageType,

+ PackageGuid, Handle, and Package are used for each of the

+ notification types.

+

+ @param[in] PackageType Package type of the notification.

+ @param[in] PackageGuid If PackageType is

+ EFI_HII_PACKAGE_TYPE_GUID, then this is

+ the pointer to the GUID from the Guid

+ field of EFI_HII_PACKAGE_GUID_HEADER.

+ Otherwise, it must be NULL.

+ @param[in] Package Points to the package referred to by the

+ notification Handle The handle of the package

+ list which contains the specified package.

+ @param[in] Handle The HII handle.

+ @param[in] NotifyType The type of change concerning the

+ database. See

+ EFI_HII_DATABASE_NOTIFY_TYPE.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigFormUpdateNotify (

+ IN UINT8 PackageType,

+ IN CONST EFI_GUID *PackageGuid,

+ IN CONST EFI_HII_PACKAGE_HEADER *Package,

+ IN EFI_HII_HANDLE Handle,

+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType

+ )

+{

+ EFI_STATUS Status;

+

+ if (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK) {

+ //

+ // HII formset on this handle is updated by driver during run-time. The
formset needs to be reloaded.

+ //

+ Status = NotifyFormsetUpdate (Handle,
&mRedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));

+ return Status;

+ }

+ } else if (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) {

+ //

+ // HII resource is removed. The formset is no longer exist.

+ //

+ Status = NotifyFormsetDeleted (Handle,
&mRedfishPlatformConfigPrivate->PendingList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII
handle: 0x%x\n", __FUNCTION__, Handle));

+ return Status;

+ }

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ This is a EFI_HII_STRING_PROTOCOL notification event handler.

+

+ Install HII package notification.

+

+ @param[in] Event Event whose notification function is being invoked.

+ @param[in] Context Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+HiiStringProtocolInstalled (

+ IN EFI_EVENT Event,

+ IN VOID *Context

+ )

+{

+ EFI_STATUS Status;

+

+ //

+ // Locate HII database protocol.

+ //

+ Status = gBS->LocateProtocol (

+ &gEfiHiiStringProtocolGuid,

+ NULL,

+ (VOID **)&mRedfishPlatformConfigPrivate->HiiString

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure:
%r\n", __FUNCTION__, Status));

+ return;

+ }

+

+ gBS->CloseEvent (Event);

+ mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent = NULL;

+}

+

+/**

+ This is a EFI_HII_DATABASE_PROTOCOL notification event handler.

+

+ Install HII package notification.

+

+ @param[in] Event Event whose notification function is being invoked.

+ @param[in] Context Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+HiiDatabaseProtocolInstalled (

+ IN EFI_EVENT Event,

+ IN VOID *Context

+ )

+{

+ EFI_STATUS Status;

+

+ //

+ // Locate HII database protocol.

+ //

+ Status = gBS->LocateProtocol (

+ &gEfiHiiDatabaseProtocolGuid,

+ NULL,

+ (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL
failure: %r\n", __FUNCTION__, Status));

+ return;

+ }

+

+ //

+ // Register package notification when new form package is installed.

+ //

+ Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
+ mRedfishPlatformConfigPrivate->HiiDatabase,

+ EFI_HII_PACKAGE_FORMS,

+ NULL,

+ RedfishPlatformConfigFormUpdateNotify,

+ EFI_HII_DATABASE_NOTIFY_NEW_PACK,

+ &mRedfishPlatformConfigPrivate->NotifyHandle

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));

+ }

+

+ //

+ // Register package notification when new form package is updated.

+ //

+ Status = mRedfishPlatformConfigPrivate->HiiDatabase-
RegisterPackageNotify (
+ mRedfishPlatformConfigPrivate->HiiDatabase,

+ EFI_HII_PACKAGE_FORMS,

+ NULL,

+ RedfishPlatformConfigFormUpdateNotify,

+ EFI_HII_DATABASE_NOTIFY_ADD_PACK,

+ &mRedfishPlatformConfigPrivate->NotifyHandle

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for
EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__,
Status));

+ }

+

+ gBS->CloseEvent (Event);

+ mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent = NULL;

+

+}

+

+/**

+ This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler.

+

+ @param[in] Event Event whose notification function is being invoked.

+ @param[in] Context Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+RegexProtocolInstalled (

+ IN EFI_EVENT Event,

+ IN VOID *Context

+ )

+{

+ EFI_STATUS Status;

+

+ //

+ // Locate regular expression protocol.

+ //

+ Status = gBS->LocateProtocol (

+ &gEfiRegularExpressionProtocolGuid,

+ NULL,

+ (VOID **)&mRedfishPlatformConfigPrivate-
RegularExpressionProtocol
+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, locate
EFI_REGULAR_EXPRESSION_PROTOCOL failure: %r\n", __FUNCTION__,
Status));

+ return;

+ }

+

+ gBS->CloseEvent (Event);

+ mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent = NULL;

+

+}

+

+/**

+ Unloads an image.

+

+ @param ImageHandle Handle that identifies the image to be
unloaded.

+

+ @retval EFI_SUCCESS The image has been unloaded.

+ @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image
handle.

+

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigDxeUnload (

+ IN EFI_HANDLE ImageHandle

+ )

+{

+ EFI_STATUS Status;

+

+ if (mRedfishPlatformConfigPrivate != NULL) {

+ Status = gBS->UninstallProtocolInterface (

+ mRedfishPlatformConfigPrivate->ImageHandle,

+ &gEdkIIRedfishPlatformConfigProtocolGuid,

+ (VOID*)&mRedfishPlatformConfigPrivate->Protocol

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, can not uninstall
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Close events

+ //

+ if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent != NULL) {

+ gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiDbNotify.ProtocolEvent);
+ }

+ if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent !=
NULL) {

+ gBS->CloseEvent (mRedfishPlatformConfigPrivate-
HiiStringNotify.ProtocolEvent);
+ }

+ if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent != NULL)
{

+ gBS->CloseEvent (mRedfishPlatformConfigPrivate-
RegexNotify.ProtocolEvent);
+ }

+

+ //

+ // Unregister package notification.

+ //

+ if (mRedfishPlatformConfigPrivate->NotifyHandle != NULL) {

+ mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotify
(

+ mRedfishPlatformConfigPrivate->HiiDatabase,

+ mRedfishPlatformConfigPrivate->NotifyHandle

+ );

+ }

+

+ ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList);

+ FreePool (mRedfishPlatformConfigPrivate);

+ mRedfishPlatformConfigPrivate = NULL;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ This is the declaration of an EFI image entry point. This entry point is

+ the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including

+ both device drivers and bus drivers.

+

+ @param ImageHandle The firmware allocated handle for the UEFI
image.

+ @param SystemTable A pointer to the EFI System Table.

+

+ @retval EFI_SUCCESS The operation completed successfully.

+ @retval Others An unexpected error occurred.

+**/

+EFI_STATUS

+EFIAPI

+RedfishPlatformConfigDxeEntryPoint (

+ IN EFI_HANDLE ImageHandle,

+ IN EFI_SYSTEM_TABLE *SystemTable

+ )

+{

+ EFI_STATUS Status;

+

+ mRedfishPlatformConfigPrivate = (REDFISH_PLATFORM_CONFIG_PRIVATE
*)AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE));

+ if (mRedfishPlatformConfigPrivate == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for
REDFISH_PLATFORM_CONFIG_PRIVATE\n", __FUNCTION__));

+ ASSERT (FALSE);

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Protocol initialization

+ //

+ mRedfishPlatformConfigPrivate->ImageHandle = ImageHandle;

+ mRedfishPlatformConfigPrivate->Protocol.GetValue =
RedfishPlatformConfigProtocolGetValue;

+ mRedfishPlatformConfigPrivate->Protocol.SetValue =
RedfishPlatformConfigProtocolSetValue;

+ mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =
RedfishPlatformConfigProtocolGetConfigureLang;

+ mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =
RedfishPlatformConfigProtocolGetSupportedSchema;

+

+ InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList);

+ InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList);

+

+ Status = gBS->InstallProtocolInterface (

+ &ImageHandle,

+ &gEdkIIRedfishPlatformConfigProtocolGuid,

+ EFI_NATIVE_INTERFACE,

+ (VOID*)&mRedfishPlatformConfigPrivate->Protocol

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, can not install
gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Install protocol notification if HII database protocol is installed.

+ //

+ mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (

+ &gEfiHiiDatabaseProtocolGuid,

+ TPL_CALLBACK,

+ HiiDatabaseProtocolInstalled,

+ NULL,

+ &mRedfishPlatformConfigPrivate-
HiiDbNotify.Registration
+ );

+ if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiDatabaseProtocolGuid\n", __FUNCTION__));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Install protocol notification if HII string protocol is installed.

+ //

+ mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (

+ &gEfiHiiStringProtocolGuid,

+ TPL_CALLBACK,

+ HiiStringProtocolInstalled,

+ NULL,

+ &mRedfishPlatformConfigPrivate-
HiiStringNotify.Registration
+ );

+ if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent == NULL)
{

+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiHiiStringProtocolGuid\n", __FUNCTION__));

+ ASSERT (FALSE);

+ }

+

+ //

+ // Install protocol notification if regular expression protocol is installed.

+ //

+ mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =
EfiCreateProtocolNotifyEvent (

+ &gEfiRegularExpressionProtocolGuid,

+ TPL_CALLBACK,

+ RegexProtocolInstalled,

+ NULL,

+ &mRedfishPlatformConfigPrivate-
RegexNotify.Registration
+ );

+ if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for
gEfiRegularExpressionProtocolGuid\n", __FUNCTION__));

+ ASSERT (FALSE);

+ }

+

+ return EFI_SUCCESS;

+}

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
index 99a613d229..d3f7af55ad 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h
@@ -1,64 +1,64 @@
-/** @file
- This file defines the EDKII Redfish Platform Config Protocol interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_
-
-#include <Uefi.h>
-
-//
-// Libraries
-//
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/PrintLib.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-
-//
-// Produced Protocols
-//
-#include <Protocol/EdkIIRedfishPlatformConfig.h>
-#include <Protocol/HiiDatabase.h>
-#include <Protocol/HiiString.h>
-#include <Protocol/RegularExpressionProtocol.h>
-
-//
-// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY.
-//
-typedef struct {
- EFI_EVENT ProtocolEvent; // Protocol notification event.
- VOID *Registration; // Protocol notification registration.
-} REDFISH_PLATFORM_CONFIG_NOTIFY;
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
-//
-typedef struct {
- EFI_HANDLE ImageHandle; // Driver image handle.
- EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol;
- REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify;
- EFI_HII_DATABASE_PROTOCOL *HiiDatabase; // The HII
database protocol.
- REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify;
- EFI_HII_STRING_PROTOCOL *HiiString; // HII String
Protocol.
- REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify;
- EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol;
// Regular Expression Protocol.
- EFI_HANDLE NotifyHandle; // The notify handle.
- LIST_ENTRY FormsetList; // The list to keep cached
HII formset.
- LIST_ENTRY PendingList; // The list to keep updated
HII handle.
-} REDFISH_PLATFORM_CONFIG_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_PRIVATE, Protocol)
-#define REGULAR_EXPRESSION_INCLUDE_ALL L".*"
-#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-"
-
-#endif
+/** @file

+ This file defines the EDKII Redfish Platform Config Protocol interface.

+

+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_

+#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_

+

+#include <Uefi.h>

+

+//

+// Libraries

+//

+#include <Library/BaseLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/DebugLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/PrintLib.h>

+#include <Library/UefiLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiDriverEntryPoint.h>

+

+//

+// Produced Protocols

+//

+#include <Protocol/EdkIIRedfishPlatformConfig.h>

+#include <Protocol/HiiDatabase.h>

+#include <Protocol/HiiString.h>

+#include <Protocol/RegularExpressionProtocol.h>

+

+//

+// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY.

+//

+typedef struct {

+ EFI_EVENT ProtocolEvent; // Protocol notification event.

+ VOID *Registration; // Protocol notification registration.

+} REDFISH_PLATFORM_CONFIG_NOTIFY;

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.

+//

+typedef struct {

+ EFI_HANDLE ImageHandle; // Driver image handle.

+ EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol;

+ REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify;

+ EFI_HII_DATABASE_PROTOCOL *HiiDatabase; // The HII
database protocol.

+ REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify;

+ EFI_HII_STRING_PROTOCOL *HiiString; // HII String
Protocol.

+ REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify;

+ EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol;
// Regular Expression Protocol.

+ EFI_HANDLE NotifyHandle; // The notify handle.

+ LIST_ENTRY FormsetList; // The list to keep cached
HII formset.

+ LIST_ENTRY PendingList; // The list to keep updated
HII handle.

+} REDFISH_PLATFORM_CONFIG_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_PRIVATE, Protocol)

+#define REGULAR_EXPRESSION_INCLUDE_ALL L".*"

+#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-"

+

+#endif

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
index 16739bef7a..81b22e03c3 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf
@@ -1,53 +1,53 @@
-## @file
-# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interfaces.
-#
-# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = RedfishPlatformConfigDxe
- FILE_GUID = BEAEFFE1-0633-41B5-913C-9389339C2927
- MODULE_TYPE = DXE_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = RedfishPlatformConfigDxeEntryPoint
- UNLOAD_IMAGE = RedfishPlatformConfigDxeUnload
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
- RedfishPkg/RedfishPkg.dec
-
-[Sources]
- RedfishPlatformConfigDxe.h
- RedfishPlatformConfigDxe.c
- RedfishPlatformConfigImpl.h
- RedfishPlatformConfigImpl.c
-
-[LibraryClasses]
- BaseLib
- BaseMemoryLib
- DebugLib
- DevicePathLib
- HiiLib
- HiiUtilityLib
- MemoryAllocationLib
- PrintLib
- UefiLib
- UefiBootServicesTableLib
- UefiRuntimeServicesTableLib
- UefiDriverEntryPoint
-
-[Protocols]
- gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED
- gEfiHiiDatabaseProtocolGuid ## CONSUMED
- gEfiHiiStringProtocolGuid ## CONSUMED
- gEfiRegularExpressionProtocolGuid ## CONSUMED
-
-[Guids]
- gEfiRegexSyntaxTypePerlGuid ## CONSUMED
-
-[Depex]
+## @file

+# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL
interfaces.

+#

+# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>

+# SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+##

+

+[Defines]

+ INF_VERSION = 0x00010005

+ BASE_NAME = RedfishPlatformConfigDxe

+ FILE_GUID = BEAEFFE1-0633-41B5-913C-9389339C2927

+ MODULE_TYPE = DXE_DRIVER

+ VERSION_STRING = 1.0

+ ENTRY_POINT = RedfishPlatformConfigDxeEntryPoint

+ UNLOAD_IMAGE = RedfishPlatformConfigDxeUnload

+

+[Packages]

+ MdePkg/MdePkg.dec

+ MdeModulePkg/MdeModulePkg.dec

+ RedfishPkg/RedfishPkg.dec

+

+[Sources]

+ RedfishPlatformConfigDxe.h

+ RedfishPlatformConfigDxe.c

+ RedfishPlatformConfigImpl.h

+ RedfishPlatformConfigImpl.c

+

+[LibraryClasses]

+ BaseLib

+ BaseMemoryLib

+ DebugLib

+ DevicePathLib

+ HiiLib

+ HiiUtilityLib

+ MemoryAllocationLib

+ PrintLib

+ UefiLib

+ UefiBootServicesTableLib

+ UefiRuntimeServicesTableLib

+ UefiDriverEntryPoint

+

+[Protocols]

+ gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED

+ gEfiHiiDatabaseProtocolGuid ## CONSUMED

+ gEfiHiiStringProtocolGuid ## CONSUMED

+ gEfiRegularExpressionProtocolGuid ## CONSUMED

+

+[Guids]

+ gEfiRegexSyntaxTypePerlGuid ## CONSUMED

+

+[Depex]

TRUE
\ No newline at end of file
diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
index d9eab6c883..917f946656 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c
@@ -1,1240 +1,1288 @@
-/** @file
-
- The implementation of EDKII Redfidh Platform Config Protocol.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-#include "RedfishPlatformConfigDxe.h"
-#include "RedfishPlatformConfigImpl.h"
-
-extern REDFISH_PLATFORM_CONFIG_PRIVATE
*mRedfishPlatformConfigPrivate;
-
-/**
- Debug dump HII string
-
- @param[in] HiiHandle HII handle instance
- @param[in] StringId HII string to dump
-
- @retval EFI_SUCCESS Dump HII string successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpHiiString (
- IN EFI_HII_HANDLE HiiHandle,
- IN EFI_STRING_ID StringId
- )
-{
- EFI_STRING String;
-
- if (HiiHandle == NULL || StringId == 0) {
- DEBUG ((DEBUG_INFO, "???"));
- return EFI_INVALID_PARAMETER;
- }
-
- String = HiiGetString (HiiHandle, StringId, NULL);
- if (String == NULL) {
- return EFI_NOT_FOUND;
- }
-
- DEBUG ((DEBUG_INFO, "%s", String));
- FreePool (String);
-
- return EFI_SUCCESS;
-}
-
-/**
- Debug dump HII form-set data
-
- @param[in] FormsetPrivate HII form-set private instance.
-
- @retval EFI_SUCCESS Dump form-set successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpFormset (
- IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- UINTN Index;
-
- if (FormsetPrivate == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Index = 0;
- HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);
- while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
- HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);
-
- DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPrivate-
Id));
- DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title);
- DEBUG ((DEBUG_INFO, "\n"));
-
- HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
-
- DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate-
QuestionId));
- DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate-
Description);
- DEBUG ((DEBUG_INFO, "\n"));
-
- HiiStatementLink = HiiNextStatementLink;
- }
-
- HiiFormLink = HiiNextFormLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Debug dump HII form-set list
-
- @param[in] FormsetList Form-set list instance
-
- @retval EFI_SUCCESS Dump list successfully
- @retval Others Errors occur
-
-**/
-EFI_STATUS
-DumpFormsetList (
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- UINTN Index;
-
- if (FormsetList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (FormsetList)) {
- DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__));
- return EFI_SUCCESS;
- }
-
- Index = 0;
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n",
++Index, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid,
HiiFormsetPrivate->DevicePathStr));
- DumpFormset (HiiFormsetPrivate);
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Retrieves a string from a string package in a English language. The
- returned string is allocated using AllocatePool(). The caller is responsible
- for freeing the allocated buffer using FreePool().
-
- If HiiHandle is NULL, then ASSERT().
- If StringId is 0, then ASSET.
-
- @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.
- @param[in] HiiHandle A handle that was previously registered in the
HII Database.
- @param[in] StringId The identifier of the string to retrieved from the
string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the string
package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetRedfishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN CHAR8 *Language,
- IN EFI_STRING_ID StringId
- )
-{
- EFI_STATUS Status;
- UINTN StringSize;
- CHAR16 TempString;
- EFI_STRING String;
-
- if (mRedfishPlatformConfigPrivate->HiiString == NULL || HiiHandle == NULL
|| StringId == 0 || IS_EMPTY_STRING (Language)) {
- ASSERT (FALSE);
- return NULL;
- }
-
- //
- // Retrieve the size of the string in the string package for the BestLanguage
- //
- StringSize = 0;
- Status = mRedfishPlatformConfigPrivate->HiiString->GetString (
- mRedfishPlatformConfigPrivate->HiiString,
- Language,
- HiiHandle,
- StringId,
- &TempString,
- &StringSize,
- NULL
- );
- //
- // If GetString() returns EFI_SUCCESS for a zero size,
- // then there are no supported languages registered for HiiHandle. If
GetString()
- // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is
not present
- // in the HII Database
- //
- if (Status != EFI_BUFFER_TOO_SMALL) {
- return NULL;
- }
-
- //
- // Allocate a buffer for the return string
- //
- String = AllocateZeroPool (StringSize);
- if (String == NULL) {
- return NULL;
- }
-
- //
- // Retrieve the string from the string package
- //
- Status = mRedfishPlatformConfigPrivate->HiiString->GetString (
- mRedfishPlatformConfigPrivate->HiiString,
- Language,
- HiiHandle,
- StringId,
- String,
- &StringSize,
- NULL
- );
- if (EFI_ERROR (Status)) {
- //
- // Free the buffer and return NULL if the supported languages can not be
retrieved.
- //
- FreePool (String);
- String = NULL;
- }
-
- //
- // Return the Null-terminated Unicode string
- //
- return String;
-}
-
-/**
- Get string from HII database in English language.
-
- @param[in] HiiHandle A handle that was previously registered in the
HII Database.
- @param[in] StringId The identifier of the string to retrieved from the
string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the string
package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetEnglishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN EFI_STRING_ID StringId
- )
-{
- return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE,
StringId);
-}
-
-/**
- Check and see if this is supported schema or not.
-
- @param[in] SupportedSchema The list of supported schema.
- @param[in] Schema Schema string to be checked.
-
- @retval BOOLEAN TRUE if this is supported schema. FALSE
otherwise.
-
-**/
-BOOLEAN
-CheckSupportedSchema (
- IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema,
- IN CHAR8 *Schema
- )
-{
- UINTN Index;
-
- if (SupportedSchema == NULL || IS_EMPTY_STRING (Schema)) {
- return FALSE;
- }
-
- if (SupportedSchema->Count == 0) {
- return FALSE;
- }
-
- for (Index = 0; Index < SupportedSchema->Count; Index++) {
- if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) == 0) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Get the list of supported schema from the given HII handle.
-
- @param[in] HiiHandle HII handle instance.
- @param[out] SupportedSchema Supported schema on this HII handle.
-
- @retval EFI_SUCCESS Schema list is returned.
- @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema
is NULL.
- @retval EFI_NOT_FOUND No supported schema found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetSupportedSchema (
- IN EFI_HII_HANDLE HiiHandle,
- OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema
- )
-{
- CHAR8 *SupportedLanguages;
- UINTN Index;
- UINTN LangIndex;
- UINTN Count;
- UINTN StrSize;
- UINTN ListIndex;
-
- if (HiiHandle == NULL || SupportedSchema == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- SupportedSchema->Count = 0;
-
- SupportedLanguages = HiiGetSupportedLanguages (HiiHandle);
- if (SupportedLanguages == NULL) {
- return EFI_NOT_FOUND;
- }
-
- Index = 0;
- LangIndex = 0;
- Count = 0;
- while (TRUE) {
- if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {
- if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {
- ++Count;
- }
- LangIndex = Index + 1;
- }
-
- if (SupportedLanguages[Index] == '\0') {
- break;
- }
-
- ++Index;
- }
-
- if (Count == 0) {
- return EFI_NOT_FOUND;
- }
-
- SupportedSchema->Count = Count;
- SupportedSchema->SchemaList = AllocatePool (sizeof (CHAR8 *) * Count);
- if (SupportedSchema->SchemaList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Index = 0;
- LangIndex = 0;
- ListIndex = 0;
- while (TRUE) {
-
- if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {
- if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {
- StrSize = Index - LangIndex;
- SupportedSchema->SchemaList[ListIndex] = AllocateCopyPool ((StrSize
+ 1), &SupportedLanguages[LangIndex]);
- SupportedSchema->SchemaList[ListIndex][StrSize] = '\0';
- ++ListIndex;
- }
-
- LangIndex = Index + 1;
- }
-
- if (SupportedLanguages[Index] == '\0') {
- break;
- }
-
- ++Index;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Search and find statement private instance by given regular expression
patthern
- which describes the Configure Language.
-
- @param[in] RegularExpressionProtocol Regular express protocol.
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] Pattern Regular expression pattern.
- @param[out] StatementList Statement list that match above
pattern.
-
- @retval EFI_SUCCESS Statement list is returned.
- @retval EFI_INVALID_PARAMETER Input parameter is NULL.
- @retval EFI_NOT_READY Regular express protocol is NULL.
- @retval EFI_NOT_FOUND No statement is found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetStatementPrivateByConfigureLangRegex (
- IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING Pattern,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- EFI_STRING TmpString;
- UINTN CaptureCount;
- BOOLEAN IsMatch;
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
-
- if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (Pattern) || StatementList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (RegularExpressionProtocol == NULL) {
- return EFI_NOT_READY;
- }
-
- StatementList->Count = 0;
- InitializeListHead (&StatementList->StatementList);
-
- if (IsListEmpty (FormsetList)) {
- return EFI_NOT_FOUND;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- //
- // Performance check.
- // If there is no desired Redfish schema found, skip this formset.
- //
- if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);
- while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
-
- HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
-
- if (HiiStatementPrivate->Description != 0) {
- TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);
- if (TmpString != NULL) {
- Status = RegularExpressionProtocol->MatchString (
- RegularExpressionProtocol,
- TmpString,
- Pattern,
- &gEfiRegexSyntaxTypePerlGuid,
- &IsMatch,
- NULL,
- &CaptureCount
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n",
__FUNCTION__, Pattern, Status));
- ASSERT (FALSE);
- return Status;
- }
-
- //
- // Found
- //
- if (IsMatch) {
- StatementRef = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF));
- if (StatementRef == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- StatementRef->Statement = HiiStatementPrivate;
- InsertTailList (&StatementList->StatementList, &StatementRef->Link);
- ++StatementList->Count;
- }
-
- FreePool (TmpString);
- }
- }
-
- HiiStatementLink = HiiNextStatementLink;
- }
-
- HiiFormLink = HiiNextFormLink;
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Get statement private instance by the given configure language.
-
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] ConfigureLang Configure language.
-
- @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to
statement private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *
-GetStatementPrivateByConfigureLang (
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- EFI_STRING TmpString;
-
- if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (ConfigureLang)) {
- return NULL;
- }
-
- if (IsListEmpty (FormsetList)) {
- return NULL;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- //
- // Performance check.
- // If there is no desired Redfish schema found, skip this formset.
- //
- if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {
- HiiFormsetLink = HiiFormsetNextLink;
- continue;
- }
-
- HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);
- while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
-
- HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
-
- DEBUG_CODE (
- STATIC UINTN Index = 0;
- DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%x
formset: %g\n", __FUNCTION__, ++Index, ConfigureLang,
HiiStatementPrivate->QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate-
Guid));
- );
-
- if (HiiStatementPrivate->Description != 0) {
- TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);
- if (TmpString != NULL) {
- if (StrCmp (TmpString, ConfigureLang) == 0) {
- FreePool (TmpString);
- return HiiStatementPrivate;
- }
-
- FreePool (TmpString);
- }
- }
-
- HiiStatementLink = HiiNextStatementLink;
- }
-
- HiiFormLink = HiiNextFormLink;
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return NULL;
-}
-
-/**
- Get form-set private instance by the given HII handle.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] FormsetList Form-set list to search.
-
- @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
form-set private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *
-GetFormsetPrivateByHiiHandle (
- IN EFI_HII_HANDLE HiiHandle,
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
-
- if (HiiHandle == NULL || FormsetList == NULL) {
- return NULL;
- }
-
- if (IsListEmpty (FormsetList)) {
- return NULL;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- if (HiiFormsetPrivate->HiiHandle == HiiHandle) {
- return HiiFormsetPrivate;
- }
-
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return NULL;
-}
-
-/**
- Release formset and all the forms and statements that belong to this
formset.
-
- @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormset (
- IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- LIST_ENTRY *HiiFormLink;
- LIST_ENTRY *HiiNextFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- LIST_ENTRY *HiiStatementLink;
- LIST_ENTRY *HiiNextStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- UINTN Index;
-
- if (FormsetPrivate == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);
- while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {
- HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);
- HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);
-
- HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);
- while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {
- HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
- HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);
-
- //
- // HiiStatementPrivate->HiiStatement will be released in
DestroyFormSet().
- //
-
- if (HiiStatementPrivate->DesStringCache != NULL) {
- FreePool (HiiStatementPrivate->DesStringCache);
- HiiStatementPrivate->DesStringCache = NULL;
- }
-
- RemoveEntryList (&HiiStatementPrivate->Link);
- FreePool (HiiStatementPrivate);
- HiiStatementLink = HiiNextStatementLink;
- }
-
- //
- // HiiStatementPrivate->HiiForm will be released in DestroyFormSet().
- //
-
- RemoveEntryList (&HiiFormPrivate->Link);
- FreePool (HiiFormPrivate);
- HiiFormLink = HiiNextFormLink;
- }
-
- if (FormsetPrivate->HiiFormSet != NULL) {
- DestroyFormSet (FormsetPrivate->HiiFormSet);
- FormsetPrivate->HiiFormSet = NULL;
- }
-
- FreePool (FormsetPrivate->DevicePathStr);
-
- //
- // Release schema list
- //
- if (FormsetPrivate->SupportedSchema.SchemaList != NULL) {
- for (Index = 0; Index < FormsetPrivate->SupportedSchema.Count;
Index++) {
- FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]);
- }
-
- FreePool (FormsetPrivate->SupportedSchema.SchemaList);
- FormsetPrivate->SupportedSchema.SchemaList = NULL;
- FormsetPrivate->SupportedSchema.Count = 0;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Create new form-set instance.
-
- @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
newly created form-set private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *
-NewFormsetPrivate (
- VOID
- )
-{
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate;
-
- NewFormsetPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE));
- if (NewFormsetPrivate == NULL) {
- return NULL;
- }
-
- //
- // Initial newly created formset private data.
- //
- InitializeListHead (&NewFormsetPrivate->HiiFormList);
-
- return NewFormsetPrivate;
-}
-
-/**
- Load the HII formset from the given HII handle.
-
- @param[in] HiiHandle Target HII handle to load.
- @param[out] FormsetPrivate The formset private data.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormset (
- IN EFI_HII_HANDLE HiiHandle,
- OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
- )
-{
- EFI_STATUS Status;
- HII_FORMSET *HiiFormSet;
- HII_FORM *HiiForm;
- LIST_ENTRY *HiiFormLink;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;
- HII_STATEMENT *HiiStatement;
- LIST_ENTRY *HiiStatementLink;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;
- EFI_GUID ZeroGuid;
-
- if (HiiHandle == NULL || FormsetPrivate == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
-
- HiiFormSet = AllocateZeroPool (sizeof (HII_FORMSET));
- if (HiiFormSet == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Find HII formset by the given HII handle.
- //
- ZeroMem (&ZeroGuid, sizeof (ZeroGuid));
- Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);
- if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {
- Status = EFI_NOT_FOUND;
- goto ErrorExit;
- }
-
- //
- // Initialize formset
- //
- InitializeFormSet (HiiFormSet);
-
- //
- // Initialize formset private data.
- //
- FormsetPrivate->HiiFormSet = HiiFormSet;
- FormsetPrivate->HiiHandle = HiiHandle;
- CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid);
- FormsetPrivate->DevicePathStr = ConvertDevicePathToText (HiiFormSet-
DevicePath, FALSE, FALSE);
- Status = GetSupportedSchema (FormsetPrivate->HiiHandle,
&FormsetPrivate->SupportedSchema);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found:
%r\n", __FUNCTION__, FormsetPrivate->HiiHandle, Status));
- }
-
- HiiFormLink = GetFirstNode (&HiiFormSet->FormListHead);
- while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) {
- HiiForm = HII_FORM_FROM_LINK (HiiFormLink);
-
- HiiFormPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_PRIVATE));
- if (HiiFormPrivate == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
-
- //
- // Initialize form private data.
- //
- HiiFormPrivate->HiiForm = HiiForm;
- HiiFormPrivate->Id = HiiForm->FormId;
- HiiFormPrivate->Title = HiiForm->FormTitle;
- HiiFormPrivate->ParentFormset = FormsetPrivate;
- InitializeListHead (&HiiFormPrivate->StatementList);
-
- HiiStatementLink = GetFirstNode (&HiiForm->StatementListHead);
- while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) {
- HiiStatement = HII_STATEMENT_FROM_LINK (HiiStatementLink);
-
- HiiStatementPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE));
- if (HiiStatementPrivate == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
- //
- // Initialize statement private data.
- //
- HiiStatementPrivate->HiiStatement = HiiStatement;
- HiiStatementPrivate->QuestionId = HiiStatement->QuestionId;
- HiiStatementPrivate->Description = HiiStatement->Prompt;
- HiiStatementPrivate->ParentForm = HiiFormPrivate;
-
- //
- // Attach to statement list.
- //
- InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate-
Link);
- HiiStatementLink = GetNextNode (&HiiForm->StatementListHead,
HiiStatementLink);
- }
- //
- // Attach to form list.
- //
- InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link);
- HiiFormLink = GetNextNode (&HiiFormSet->FormListHead, HiiFormLink);
- }
-
- return EFI_SUCCESS;
-
-ErrorExit:
-
- //
- // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate yet.
- //
- if (HiiFormSet != NULL && FormsetPrivate->HiiFormSet != HiiFormSet) {
- DestroyFormSet (HiiFormSet);
- }
-
- //
- // Release resource when error happens.
- //
- ReleaseFormset (FormsetPrivate);
-
- return Status;
-}
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormsetList (
- IN EFI_HII_HANDLE *HiiHandle,
- OUT LIST_ENTRY *FormsetList
- )
-{
- EFI_STATUS Status;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;
-
- if (HiiHandle == NULL || FormsetList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- FormsetPrivate = GetFormsetPrivateByHiiHandle (HiiHandle, FormsetList);
- if (FormsetPrivate != NULL) {
- return EFI_ALREADY_STARTED;
- }
-
- FormsetPrivate = NewFormsetPrivate ();
- if (FormsetPrivate == NULL) {
- DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Load formset on the given HII handle.
- //
- Status = LoadFormset (HiiHandle, FormsetPrivate);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n",
__FUNCTION__, Status));
- FreePool (FormsetPrivate);
- return Status;
- }
-
- //
- // Attach to cache list.
- //
- InsertTailList (FormsetList, &FormsetPrivate->Link);
-
- DEBUG_CODE (
- DumpFormsetList (FormsetList);
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormsetList (
- IN LIST_ENTRY *FormsetList
- )
-{
- LIST_ENTRY *HiiFormsetLink;
- LIST_ENTRY *HiiFormsetNextLink;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;
-
- if (FormsetList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (FormsetList)) {
- return EFI_SUCCESS;
- }
-
- HiiFormsetLink = GetFirstNode (FormsetList);
- while (!IsNull (FormsetList, HiiFormsetLink)) {
- HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);
- HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);
-
- //
- // Detach from list.
- //
- RemoveEntryList (&HiiFormsetPrivate->Link);
- ReleaseFormset (HiiFormsetPrivate);
- FreePool (HiiFormsetPrivate);
- HiiFormsetLink = HiiFormsetNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Get all pending list.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep pending data.
-
- @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to
pending list data.
-
-**/
-REDFISH_PLATFORM_CONFIG_PENDING_LIST *
-GetPendingList (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- LIST_ENTRY *PendingListLink;
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;
-
- if (HiiHandle == NULL || PendingList == NULL) {
- return NULL;
- }
-
- if (IsListEmpty (PendingList)) {
- return NULL;
- }
-
- PendingListLink = GetFirstNode (PendingList);
- while (!IsNull (PendingList, PendingListLink)) {
- Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);
-
- if (Target->HiiHandle == HiiHandle) {
- return Target;
- }
-
- PendingListLink = GetNextNode (PendingList, PendingListLink);
- }
-
- return NULL;
-}
-
-/**
- When HII database is updated. Keep updated HII handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetUpdate (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;
-
- if (HiiHandle == NULL || PendingList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check and see if this HII handle is processed already.
- //
- TargetPendingList = GetPendingList (HiiHandle, PendingList);
- if (TargetPendingList != NULL) {
- TargetPendingList->IsDeleted = FALSE;
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n",
__FUNCTION__, HiiHandle));
- );
- return EFI_SUCCESS;
- }
-
- TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));
- if (TargetPendingList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TargetPendingList->HiiHandle = HiiHandle;
- TargetPendingList->IsDeleted = FALSE;
-
- InsertTailList (PendingList, &TargetPendingList->Link);
-
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n",
__FUNCTION__, HiiHandle));
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetDeleted (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- )
-{
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;
-
- if (HiiHandle == NULL || PendingList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check and see if this HII handle is processed already.
- //
- TargetPendingList = GetPendingList (HiiHandle, PendingList);
- if (TargetPendingList != NULL) {
- TargetPendingList->IsDeleted = TRUE;
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n",
__FUNCTION__, HiiHandle));
- );
- return EFI_SUCCESS;
- }
-
- TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));
- if (TargetPendingList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TargetPendingList->HiiHandle = HiiHandle;
- TargetPendingList->IsDeleted = TRUE;
-
- InsertTailList (PendingList, &TargetPendingList->Link);
-
- DEBUG_CODE (
- DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n",
__FUNCTION__, HiiHandle));
- );
-
- return EFI_SUCCESS;
-}
-
-/**
- There are HII database update and we need to process them accordingly so
that we
- won't use stale data. This function will parse updated HII handle again in
order
- to get updated data-set.
-
- @param[in] FormsetList List to keep HII form-set.
- @param[in] PendingList List to keep HII handle that is updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.
-
-**/
-EFI_STATUS
-ProcessPendingList (
- IN LIST_ENTRY *FormsetList,
- IN LIST_ENTRY *PendingList
- )
-{
- LIST_ENTRY *PendingListLink;
- LIST_ENTRY *PendingListNextLink;
- REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;
- EFI_STATUS Status;
-
-
- if (FormsetList == NULL || PendingList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (PendingList)) {
- return EFI_SUCCESS;
- }
-
- PendingListLink = GetFirstNode (PendingList);
- while (!IsNull (PendingList, PendingListLink)) {
- PendingListNextLink = GetNextNode (PendingList, PendingListLink);
- Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);
-
- if (Target->IsDeleted) {
- //
- // The HII resource on this HII handle is removed. Release the formset.
- //
- FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);
- if (FormsetPrivate != NULL) {
- DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver
release HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid));
- RemoveEntryList (&FormsetPrivate->Link);
- ReleaseFormset (FormsetPrivate);
- FreePool (FormsetPrivate);
- } else {
- DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was removed
already\n", __FUNCTION__, Target->HiiHandle));
- }
- } else {
- //
- // The HII resource on this HII handle is updated/removed.
- //
- FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);
- if (FormsetPrivate != NULL) {
- //
- // HII formset already exist, release it and query again.
- //
- DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current
formset\n", __FUNCTION__, &FormsetPrivate->Guid));
- RemoveEntryList (&FormsetPrivate->Link);
- ReleaseFormset (FormsetPrivate);
- FreePool (FormsetPrivate);
- }
-
- Status = LoadFormsetList (Target->HiiHandle, FormsetList);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x failed:
%r\n", __FUNCTION__, Target->HiiHandle, Status));
- }
- }
-
- //
- // Detach it from list first.
- //
- RemoveEntryList (&Target->Link);
- FreePool (Target);
-
- PendingListLink = PendingListNextLink;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Release all resource in statement list.
-
- @param[in] StatementList Statement list to be released.
-
- @retval EFI_SUCCESS All resource are released.
- @retval EFI_INVALID_PARAMETER StatementList is NULL.
-
-**/
-EFI_STATUS
-ReleaseStatementList (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- )
-{
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
- LIST_ENTRY *NextLink;
-
- if (StatementList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsListEmpty (&StatementList->StatementList)) {
- return EFI_SUCCESS;
- }
-
- NextLink = GetFirstNode (&StatementList->StatementList);
- while (!IsNull (&StatementList->StatementList, NextLink)) {
- StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);
- NextLink = GetNextNode (&StatementList->StatementList, NextLink);
-
- RemoveEntryList (&StatementRef->Link);
- FreePool (StatementRef);
- }
-
- return EFI_SUCCESS;
-}
+/** @file

+

+ The implementation of EDKII Redfidh Platform Config Protocol.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+#include "RedfishPlatformConfigDxe.h"

+#include "RedfishPlatformConfigImpl.h"

+

+extern REDFISH_PLATFORM_CONFIG_PRIVATE
*mRedfishPlatformConfigPrivate;

+

+/**

+ Debug dump HII string

+

+ @param[in] HiiHandle HII handle instance

+ @param[in] StringId HII string to dump

+

+ @retval EFI_SUCCESS Dump HII string successfully

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+DumpHiiString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN EFI_STRING_ID StringId

+ )

+{

+ EFI_STRING String;

+

+ if (HiiHandle == NULL || StringId == 0) {

+ DEBUG ((DEBUG_INFO, "???"));

+ return EFI_INVALID_PARAMETER;

+ }

+

+ String = HiiGetString (HiiHandle, StringId, NULL);

+ if (String == NULL) {

+ return EFI_NOT_FOUND;

+ }

+

+ DEBUG ((DEBUG_INFO, "%s", String));

+ FreePool (String);

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Debug dump HII form-set data

+

+ @param[in] FormsetPrivate HII form-set private instance.

+

+ @retval EFI_SUCCESS Dump form-set successfully

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+DumpFormset (

+ IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate

+ )

+{

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ UINTN Index;

+

+ if (FormsetPrivate == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ Index = 0;

+ HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);

+ while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+ HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);

+

+ DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPrivate-
Id));
+ DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title);

+ DEBUG ((DEBUG_INFO, "\n"));

+

+ HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);

+

+ DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate-
QuestionId));
+ DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate-
Description);
+ DEBUG ((DEBUG_INFO, "\n"));

+

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Debug dump HII form-set list

+

+ @param[in] FormsetList Form-set list instance

+

+ @retval EFI_SUCCESS Dump list successfully

+ @retval Others Errors occur

+

+**/

+EFI_STATUS

+DumpFormsetList (

+ IN LIST_ENTRY *FormsetList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ UINTN Index;

+

+ if (FormsetList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__));

+ return EFI_SUCCESS;

+ }

+

+ Index = 0;

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n",
++Index, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid,
HiiFormsetPrivate->DevicePathStr));

+ DumpFormset (HiiFormsetPrivate);

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+EFI_STRING

+HiiGetRedfishString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ )

+{

+ EFI_STATUS Status;

+ UINTN StringSize;

+ CHAR16 TempString;

+ EFI_STRING String;

+

+ if (mRedfishPlatformConfigPrivate->HiiString == NULL || HiiHandle ==
NULL || StringId == 0 || IS_EMPTY_STRING (Language)) {

+ ASSERT (FALSE);

+ return NULL;

+ }

+

+ //

+ // Retrieve the size of the string in the string package for the BestLanguage

+ //

+ StringSize = 0;

+ Status = mRedfishPlatformConfigPrivate->HiiString->GetString (

+ mRedfishPlatformConfigPrivate->HiiString,

+ Language,

+ HiiHandle,

+ StringId,

+ &TempString,

+ &StringSize,

+ NULL

+ );

+ //

+ // If GetString() returns EFI_SUCCESS for a zero size,

+ // then there are no supported languages registered for HiiHandle. If
GetString()

+ // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is
not present

+ // in the HII Database

+ //

+ if (Status != EFI_BUFFER_TOO_SMALL) {

+ return NULL;

+ }

+

+ //

+ // Allocate a buffer for the return string

+ //

+ String = AllocateZeroPool (StringSize);

+ if (String == NULL) {

+ return NULL;

+ }

+

+ //

+ // Retrieve the string from the string package

+ //

+ Status = mRedfishPlatformConfigPrivate->HiiString->GetString (

+ mRedfishPlatformConfigPrivate->HiiString,

+ Language,

+ HiiHandle,

+ StringId,

+ String,

+ &StringSize,

+ NULL

+ );

+ if (EFI_ERROR (Status)) {

+ //

+ // Free the buffer and return NULL if the supported languages can not be
retrieved.

+ //

+ FreePool (String);

+ String = NULL;

+ }

+

+ //

+ // Return the Null-terminated Unicode string

+ //

+ return String;

+}

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+CHAR8 *

+HiiGetRedfishAsciiString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ )

+{

+ EFI_STRING HiiString;

+ UINTN StringSize;

+ CHAR8 *AsciiString;

+

+ HiiString = HiiGetRedfishString (HiiHandle, Language, StringId);

+ if (HiiString == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n",
__FUNCTION__, StringId, Language));

+ return NULL;

+ }

+

+ StringSize = (StrLen (HiiString) + 1) * sizeof (CHAR8);

+ AsciiString = AllocatePool (StringSize);

+ if (AsciiString == NULL) {

+ return NULL;

+ }

+

+ UnicodeStrToAsciiStrS (HiiString, AsciiString, StringSize);

+

+ FreePool (HiiString);

+ return AsciiString;

+}

+

+/**

+ Get string from HII database in English language.

+

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+EFI_STRING

+HiiGetEnglishString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN EFI_STRING_ID StringId

+ )

+{

+ return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE,
StringId);

+}

+

+/**

+ Check and see if this is supported schema or not.

+

+ @param[in] SupportedSchema The list of supported schema.

+ @param[in] Schema Schema string to be checked.

+

+ @retval BOOLEAN TRUE if this is supported schema. FALSE
otherwise.

+

+**/

+BOOLEAN

+CheckSupportedSchema (

+ IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema,

+ IN CHAR8 *Schema

+ )

+{

+ UINTN Index;

+

+ if (SupportedSchema == NULL || IS_EMPTY_STRING (Schema)) {

+ return FALSE;

+ }

+

+ if (SupportedSchema->Count == 0) {

+ return FALSE;

+ }

+

+ for (Index = 0; Index < SupportedSchema->Count; Index++) {

+ if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) == 0) {

+ return TRUE;

+ }

+ }

+

+ return FALSE;

+}

+

+/**

+ Get the list of supported schema from the given HII handle.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[out] SupportedSchema Supported schema on this HII handle.

+

+ @retval EFI_SUCCESS Schema list is returned.

+ @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema
is NULL.

+ @retval EFI_NOT_FOUND No supported schema found.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+GetSupportedSchema (

+ IN EFI_HII_HANDLE HiiHandle,

+ OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema

+ )

+{

+ CHAR8 *SupportedLanguages;

+ UINTN Index;

+ UINTN LangIndex;

+ UINTN Count;

+ UINTN StrSize;

+ UINTN ListIndex;

+

+ if (HiiHandle == NULL || SupportedSchema == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ SupportedSchema->Count = 0;

+

+ SupportedLanguages = HiiGetSupportedLanguages (HiiHandle);

+ if (SupportedLanguages == NULL) {

+ return EFI_NOT_FOUND;

+ }

+

+ Index = 0;

+ LangIndex = 0;

+ Count = 0;

+ while (TRUE) {

+ if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {

+ if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {

+ ++Count;

+ }

+ LangIndex = Index + 1;

+ }

+

+ if (SupportedLanguages[Index] == '\0') {

+ break;

+ }

+

+ ++Index;

+ }

+

+ if (Count == 0) {

+ return EFI_NOT_FOUND;

+ }

+

+ SupportedSchema->Count = Count;

+ SupportedSchema->SchemaList = AllocatePool (sizeof (CHAR8 *) * Count);

+ if (SupportedSchema->SchemaList == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ Index = 0;

+ LangIndex = 0;

+ ListIndex = 0;

+ while (TRUE) {

+

+ if (SupportedLanguages[Index] == ';' || SupportedLanguages[Index] ==
'\0') {

+ if (AsciiStrnCmp (&SupportedLanguages[LangIndex],
X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) == 0) {

+ StrSize = Index - LangIndex;

+ SupportedSchema->SchemaList[ListIndex] = AllocateCopyPool ((StrSize
+ 1), &SupportedLanguages[LangIndex]);

+ SupportedSchema->SchemaList[ListIndex][StrSize] = '\0';

+ ++ListIndex;

+ }

+

+ LangIndex = Index + 1;

+ }

+

+ if (SupportedLanguages[Index] == '\0') {

+ break;

+ }

+

+ ++Index;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Search and find statement private instance by given regular expression
patthern

+ which describes the Configure Language.

+

+ @param[in] RegularExpressionProtocol Regular express protocol.

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] Pattern Regular expression pattern.

+ @param[out] StatementList Statement list that match above
pattern.

+

+ @retval EFI_SUCCESS Statement list is returned.

+ @retval EFI_INVALID_PARAMETER Input parameter is NULL.

+ @retval EFI_NOT_READY Regular express protocol is NULL.

+ @retval EFI_NOT_FOUND No statement is found.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+GetStatementPrivateByConfigureLangRegex (

+ IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING Pattern,

+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ EFI_STRING TmpString;

+ UINTN CaptureCount;

+ BOOLEAN IsMatch;

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;

+

+ if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (Pattern) || StatementList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (RegularExpressionProtocol == NULL) {

+ return EFI_NOT_READY;

+ }

+

+ StatementList->Count = 0;

+ InitializeListHead (&StatementList->StatementList);

+

+ if (IsListEmpty (FormsetList)) {

+ return EFI_NOT_FOUND;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ //

+ // Performance check.

+ // If there is no desired Redfish schema found, skip this formset.

+ //

+ if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);

+ while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+

+ HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate-
StatementList, HiiStatementLink);
+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+

+ if (HiiStatementPrivate->Description != 0) {

+ TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);

+ if (TmpString != NULL) {

+ Status = RegularExpressionProtocol->MatchString (

+ RegularExpressionProtocol,

+ TmpString,

+ Pattern,

+ &gEfiRegexSyntaxTypePerlGuid,

+ &IsMatch,

+ NULL,

+ &CaptureCount

+ );

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n",
__FUNCTION__, Pattern, Status));

+ ASSERT (FALSE);

+ return Status;

+ }

+

+ //

+ // Found

+ //

+ if (IsMatch) {

+ StatementRef = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF));

+ if (StatementRef == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ StatementRef->Statement = HiiStatementPrivate;

+ InsertTailList (&StatementList->StatementList, &StatementRef-
Link);
+ ++StatementList->Count;

+ }

+

+ FreePool (TmpString);

+ }

+ }

+

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Get statement private instance by the given configure language.

+

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] ConfigureLang Configure language.

+

+ @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer
to statement private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *

+GetStatementPrivateByConfigureLang (

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ EFI_STRING TmpString;

+

+ if (FormsetList == NULL || IS_EMPTY_STRING (Schema) ||
IS_EMPTY_STRING (ConfigureLang)) {

+ return NULL;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ return NULL;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ //

+ // Performance check.

+ // If there is no desired Redfish schema found, skip this formset.

+ //

+ if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema,
Schema)) {

+ HiiFormsetLink = HiiFormsetNextLink;

+ continue;

+ }

+

+ HiiFormLink = GetFirstNode (&HiiFormsetPrivate->HiiFormList);

+ while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiNextFormLink = GetNextNode (&HiiFormsetPrivate->HiiFormList,
HiiFormLink);

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+

+ HiiStatementLink =GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate-
StatementList, HiiStatementLink);
+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+

+ DEBUG_CODE (

+ STATIC UINTN Index = 0;

+ DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%x
formset: %g\n", __FUNCTION__, ++Index, ConfigureLang,
HiiStatementPrivate->QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate-
Guid));
+ );

+

+ if (HiiStatementPrivate->Description != 0) {

+ TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle,
Schema, HiiStatementPrivate->Description);

+ if (TmpString != NULL) {

+ if (StrCmp (TmpString, ConfigureLang) == 0) {

+ FreePool (TmpString);

+ return HiiStatementPrivate;

+ }

+

+ FreePool (TmpString);

+ }

+ }

+

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return NULL;

+}

+

+/**

+ Get form-set private instance by the given HII handle.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] FormsetList Form-set list to search.

+

+ @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
form-set private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *

+GetFormsetPrivateByHiiHandle (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN LIST_ENTRY *FormsetList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+

+ if (HiiHandle == NULL || FormsetList == NULL) {

+ return NULL;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ return NULL;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ if (HiiFormsetPrivate->HiiHandle == HiiHandle) {

+ return HiiFormsetPrivate;

+ }

+

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return NULL;

+}

+

+/**

+ Release formset and all the forms and statements that belong to this
formset.

+

+ @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+ReleaseFormset (

+ IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate

+ )

+{

+ LIST_ENTRY *HiiFormLink;

+ LIST_ENTRY *HiiNextFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ LIST_ENTRY *HiiStatementLink;

+ LIST_ENTRY *HiiNextStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ UINTN Index;

+

+ if (FormsetPrivate == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ HiiFormLink = GetFirstNode (&FormsetPrivate->HiiFormList);

+ while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) {

+ HiiFormPrivate = REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK
(HiiFormLink);

+ HiiNextFormLink = GetNextNode (&FormsetPrivate->HiiFormList,
HiiFormLink);

+

+ HiiStatementLink = GetFirstNode (&HiiFormPrivate->StatementList);

+ while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) {

+ HiiStatementPrivate =
REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);

+ HiiNextStatementLink = GetNextNode (&HiiFormPrivate->StatementList,
HiiStatementLink);

+

+ //

+ // HiiStatementPrivate->HiiStatement will be released in
DestroyFormSet().

+ //

+

+ if (HiiStatementPrivate->DesStringCache != NULL) {

+ FreePool (HiiStatementPrivate->DesStringCache);

+ HiiStatementPrivate->DesStringCache = NULL;

+ }

+

+ RemoveEntryList (&HiiStatementPrivate->Link);

+ FreePool (HiiStatementPrivate);

+ HiiStatementLink = HiiNextStatementLink;

+ }

+

+ //

+ // HiiStatementPrivate->HiiForm will be released in DestroyFormSet().

+ //

+

+ RemoveEntryList (&HiiFormPrivate->Link);

+ FreePool (HiiFormPrivate);

+ HiiFormLink = HiiNextFormLink;

+ }

+

+ if (FormsetPrivate->HiiFormSet != NULL) {

+ DestroyFormSet (FormsetPrivate->HiiFormSet);

+ FormsetPrivate->HiiFormSet = NULL;

+ }

+

+ if (FormsetPrivate->DevicePathStr != NULL) {

+ FreePool(FormsetPrivate->DevicePathStr);

+ }

+

+ //

+ // Release schema list

+ //

+ if (FormsetPrivate->SupportedSchema.SchemaList != NULL) {

+ for (Index = 0; Index < FormsetPrivate->SupportedSchema.Count;
Index++) {

+ FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]);

+ }

+

+ FreePool (FormsetPrivate->SupportedSchema.SchemaList);

+ FormsetPrivate->SupportedSchema.SchemaList = NULL;

+ FormsetPrivate->SupportedSchema.Count = 0;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Create new form-set instance.

+

+ @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to
newly created form-set private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *

+NewFormsetPrivate (

+ VOID

+ )

+{

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate;

+

+ NewFormsetPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE));

+ if (NewFormsetPrivate == NULL) {

+ return NULL;

+ }

+

+ //

+ // Initial newly created formset private data.

+ //

+ InitializeListHead (&NewFormsetPrivate->HiiFormList);

+

+ return NewFormsetPrivate;

+}

+

+/**

+ Load the HII formset from the given HII handle.

+

+ @param[in] HiiHandle Target HII handle to load.

+ @param[out] FormsetPrivate The formset private data.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+LoadFormset (

+ IN EFI_HII_HANDLE HiiHandle,

+ OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
*FormsetPrivate

+ )

+{

+ EFI_STATUS Status;

+ HII_FORMSET *HiiFormSet;

+ HII_FORM *HiiForm;

+ LIST_ENTRY *HiiFormLink;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate;

+ HII_STATEMENT *HiiStatement;

+ LIST_ENTRY *HiiStatementLink;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
*HiiStatementPrivate;

+ EFI_GUID ZeroGuid;

+

+ if (HiiHandle == NULL || FormsetPrivate == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+

+ HiiFormSet = AllocateZeroPool (sizeof (HII_FORMSET));

+ if (HiiFormSet == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Find HII formset by the given HII handle.

+ //

+ ZeroMem (&ZeroGuid, sizeof (ZeroGuid));

+ Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);

+ if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {

+ Status = EFI_NOT_FOUND;

+ goto ErrorExit;

+ }

+

+ //

+ // Initialize formset

+ //

+ InitializeFormSet (HiiFormSet);

+

+ //

+ // Initialize formset private data.

+ //

+ FormsetPrivate->HiiFormSet = HiiFormSet;

+ FormsetPrivate->HiiHandle = HiiHandle;

+ CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid);

+ FormsetPrivate->DevicePathStr = ConvertDevicePathToText (HiiFormSet-
DevicePath, FALSE, FALSE);
+ Status = GetSupportedSchema (FormsetPrivate->HiiHandle,
&FormsetPrivate->SupportedSchema);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found:
%r\n", __FUNCTION__, FormsetPrivate->HiiHandle, Status));

+ }

+

+ HiiFormLink = GetFirstNode (&HiiFormSet->FormListHead);

+ while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) {

+ HiiForm = HII_FORM_FROM_LINK (HiiFormLink);

+

+ HiiFormPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_FORM_PRIVATE));

+ if (HiiFormPrivate == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto ErrorExit;

+ }

+

+ //

+ // Initialize form private data.

+ //

+ HiiFormPrivate->HiiForm = HiiForm;

+ HiiFormPrivate->Id = HiiForm->FormId;

+ HiiFormPrivate->Title = HiiForm->FormTitle;

+ HiiFormPrivate->ParentFormset = FormsetPrivate;

+ InitializeListHead (&HiiFormPrivate->StatementList);

+

+ HiiStatementLink = GetFirstNode (&HiiForm->StatementListHead);

+ while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) {

+ HiiStatement = HII_STATEMENT_FROM_LINK (HiiStatementLink);

+

+ HiiStatementPrivate = AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE));

+ if (HiiStatementPrivate == NULL) {

+ Status = EFI_OUT_OF_RESOURCES;

+ goto ErrorExit;

+ }

+ //

+ // Initialize statement private data.

+ //

+ HiiStatementPrivate->HiiStatement = HiiStatement;

+ HiiStatementPrivate->QuestionId = HiiStatement->QuestionId;

+ HiiStatementPrivate->Description = HiiStatement->Prompt;

+ HiiStatementPrivate->ParentForm = HiiFormPrivate;

+

+ //

+ // Attach to statement list.

+ //

+ InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate-
Link);
+ HiiStatementLink = GetNextNode (&HiiForm->StatementListHead,
HiiStatementLink);

+ }

+ //

+ // Attach to form list.

+ //

+ InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link);

+ HiiFormLink = GetNextNode (&HiiFormSet->FormListHead, HiiFormLink);

+ }

+

+ return EFI_SUCCESS;

+

+ErrorExit:

+

+ //

+ // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate yet.

+ //

+ if (HiiFormSet != NULL && FormsetPrivate->HiiFormSet != HiiFormSet) {

+ DestroyFormSet (HiiFormSet);

+ }

+

+ //

+ // Release resource when error happens.

+ //

+ ReleaseFormset (FormsetPrivate);

+

+ return Status;

+}

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+LoadFormsetList (

+ IN EFI_HII_HANDLE *HiiHandle,

+ OUT LIST_ENTRY *FormsetList

+ )

+{

+ EFI_STATUS Status;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;

+

+ if (HiiHandle == NULL || FormsetList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ FormsetPrivate = GetFormsetPrivateByHiiHandle (HiiHandle, FormsetList);

+ if (FormsetPrivate != NULL) {

+ return EFI_ALREADY_STARTED;

+ }

+

+ FormsetPrivate = NewFormsetPrivate ();

+ if (FormsetPrivate == NULL) {

+ DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__));

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ //

+ // Load formset on the given HII handle.

+ //

+ Status = LoadFormset (HiiHandle, FormsetPrivate);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n",
__FUNCTION__, Status));

+ FreePool (FormsetPrivate);

+ return Status;

+ }

+

+ //

+ // Attach to cache list.

+ //

+ InsertTailList (FormsetList, &FormsetPrivate->Link);

+

+ DEBUG_CODE (

+ DumpFormsetList (FormsetList);

+ );

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+ReleaseFormsetList (

+ IN LIST_ENTRY *FormsetList

+ )

+{

+ LIST_ENTRY *HiiFormsetLink;

+ LIST_ENTRY *HiiFormsetNextLink;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate;

+

+ if (FormsetList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (FormsetList)) {

+ return EFI_SUCCESS;

+ }

+

+ HiiFormsetLink = GetFirstNode (FormsetList);

+ while (!IsNull (FormsetList, HiiFormsetLink)) {

+ HiiFormsetNextLink = GetNextNode (FormsetList, HiiFormsetLink);

+ HiiFormsetPrivate =
REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink);

+

+ //

+ // Detach from list.

+ //

+ RemoveEntryList (&HiiFormsetPrivate->Link);

+ ReleaseFormset (HiiFormsetPrivate);

+ FreePool (HiiFormsetPrivate);

+ HiiFormsetLink = HiiFormsetNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Get all pending list.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep pending data.

+

+ @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to
pending list data.

+

+**/

+REDFISH_PLATFORM_CONFIG_PENDING_LIST *

+GetPendingList (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ LIST_ENTRY *PendingListLink;

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;

+

+ if (HiiHandle == NULL || PendingList == NULL) {

+ return NULL;

+ }

+

+ if (IsListEmpty (PendingList)) {

+ return NULL;

+ }

+

+ PendingListLink = GetFirstNode (PendingList);

+ while (!IsNull (PendingList, PendingListLink)) {

+ Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);

+

+ if (Target->HiiHandle == HiiHandle) {

+ return Target;

+ }

+

+ PendingListLink = GetNextNode (PendingList, PendingListLink);

+ }

+

+ return NULL;

+}

+

+/**

+ When HII database is updated. Keep updated HII handle into pending list
so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetUpdate (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;

+

+ if (HiiHandle == NULL || PendingList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ //

+ // Check and see if this HII handle is processed already.

+ //

+ TargetPendingList = GetPendingList (HiiHandle, PendingList);

+ if (TargetPendingList != NULL) {

+ TargetPendingList->IsDeleted = FALSE;

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n",
__FUNCTION__, HiiHandle));

+ );

+ return EFI_SUCCESS;

+ }

+

+ TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));

+ if (TargetPendingList == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ TargetPendingList->HiiHandle = HiiHandle;

+ TargetPendingList->IsDeleted = FALSE;

+

+ InsertTailList (PendingList, &TargetPendingList->Link);

+

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n",
__FUNCTION__, HiiHandle));

+ );

+

+ return EFI_SUCCESS;

+}

+

+/**

+ When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetDeleted (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList;

+

+ if (HiiHandle == NULL || PendingList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ //

+ // Check and see if this HII handle is processed already.

+ //

+ TargetPendingList = GetPendingList (HiiHandle, PendingList);

+ if (TargetPendingList != NULL) {

+ TargetPendingList->IsDeleted = TRUE;

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n",
__FUNCTION__, HiiHandle));

+ );

+ return EFI_SUCCESS;

+ }

+

+ TargetPendingList= AllocateZeroPool (sizeof
(REDFISH_PLATFORM_CONFIG_PENDING_LIST));

+ if (TargetPendingList == NULL) {

+ return EFI_OUT_OF_RESOURCES;

+ }

+

+ TargetPendingList->HiiHandle = HiiHandle;

+ TargetPendingList->IsDeleted = TRUE;

+

+ InsertTailList (PendingList, &TargetPendingList->Link);

+

+ DEBUG_CODE (

+ DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n",
__FUNCTION__, HiiHandle));

+ );

+

+ return EFI_SUCCESS;

+}

+

+/**

+ There are HII database update and we need to process them accordingly
so that we

+ won't use stale data. This function will parse updated HII handle again in
order

+ to get updated data-set.

+

+ @param[in] FormsetList List to keep HII form-set.

+ @param[in] PendingList List to keep HII handle that is updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.

+

+**/

+EFI_STATUS

+ProcessPendingList (

+ IN LIST_ENTRY *FormsetList,

+ IN LIST_ENTRY *PendingList

+ )

+{

+ LIST_ENTRY *PendingListLink;

+ LIST_ENTRY *PendingListNextLink;

+ REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target;

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate;

+ EFI_STATUS Status;

+

+

+ if (FormsetList == NULL || PendingList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (PendingList)) {

+ return EFI_SUCCESS;

+ }

+

+ PendingListLink = GetFirstNode (PendingList);

+ while (!IsNull (PendingList, PendingListLink)) {

+ PendingListNextLink = GetNextNode (PendingList, PendingListLink);

+ Target = REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK
(PendingListLink);

+

+ if (Target->IsDeleted) {

+ //

+ // The HII resource on this HII handle is removed. Release the formset.

+ //

+ FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);

+ if (FormsetPrivate != NULL) {

+ DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver
release HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid));

+ RemoveEntryList (&FormsetPrivate->Link);

+ ReleaseFormset (FormsetPrivate);

+ FreePool (FormsetPrivate);

+ } else {

+ DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was
removed already\n", __FUNCTION__, Target->HiiHandle));

+ }

+ } else {

+ //

+ // The HII resource on this HII handle is updated/removed.

+ //

+ FormsetPrivate = GetFormsetPrivateByHiiHandle (Target->HiiHandle,
FormsetList);

+ if (FormsetPrivate != NULL) {

+ //

+ // HII formset already exist, release it and query again.

+ //

+ DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current
formset\n", __FUNCTION__, &FormsetPrivate->Guid));

+ RemoveEntryList (&FormsetPrivate->Link);

+ ReleaseFormset (FormsetPrivate);

+ FreePool (FormsetPrivate);

+ }

+

+ Status = LoadFormsetList (Target->HiiHandle, FormsetList);

+ if (EFI_ERROR (Status)) {

+ DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x
failed: %r\n", __FUNCTION__, Target->HiiHandle, Status));

+ }

+ }

+

+ //

+ // Detach it from list first.

+ //

+ RemoveEntryList (&Target->Link);

+ FreePool (Target);

+

+ PendingListLink = PendingListNextLink;

+ }

+

+ return EFI_SUCCESS;

+}

+

+/**

+ Release all resource in statement list.

+

+ @param[in] StatementList Statement list to be released.

+

+ @retval EFI_SUCCESS All resource are released.

+ @retval EFI_INVALID_PARAMETER StatementList is NULL.

+

+**/

+EFI_STATUS

+ReleaseStatementList (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ )

+{

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;

+ LIST_ENTRY *NextLink;

+

+ if (StatementList == NULL) {

+ return EFI_INVALID_PARAMETER;

+ }

+

+ if (IsListEmpty (&StatementList->StatementList)) {

+ return EFI_SUCCESS;

+ }

+

+ NextLink = GetFirstNode (&StatementList->StatementList);

+ while (!IsNull (&StatementList->StatementList, NextLink)) {

+ StatementRef =
REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink);

+ NextLink = GetNextNode (&StatementList->StatementList, NextLink);

+

+ RemoveEntryList (&StatementRef->Link);

+ FreePool (StatementRef);

+ }

+

+ return EFI_SUCCESS;

+}

diff --git
a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
index e0ba0fb2d3..be2f63df8d 100644
--- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
+++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h
@@ -1,274 +1,297 @@
-/** @file
- This file defines the EDKII Redfish Platform Config Protocol interface.
-
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_
-#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_
-
-#include <Uefi.h>
-
-//
-// Libraries
-//
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/HiiUtilityLib.h>
-#include <Library/HiiLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-
-#define REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET 0x00
-#define IS_EMPTY_STRING(a) (a == NULL || a[0] == L'\0')
-#define ENGLISH_LANGUAGE_CODE "en-US"
-#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
-//
-typedef struct {
- LIST_ENTRY Link;
- EFI_HII_HANDLE HiiHandle;
- BOOLEAN IsDeleted;
-} REDFISH_PLATFORM_CONFIG_PENDING_LIST;
-
-#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_PENDING_LIST, Link)
-
-typedef struct {
- UINTN Count; // Number of schema in list
- CHAR8 **SchemaList; // Schema list
-} REDFISH_PLATFORM_CONFIG_SCHEMA;
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- HII_FORMSET *HiiFormSet; // Pointer to HII formset data.
- EFI_GUID Guid; // Formset GUID.
- EFI_HII_HANDLE HiiHandle; // Hii Handle of this formset.
- LIST_ENTRY HiiFormList; // Form list that keep form data under
this formset.
- CHAR16 *DevicePathStr; // Device path of this formset.
- REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema
that is supported in this formset.
-} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- UINT16 Id; // Form ID.
- EFI_STRING_ID Title; // String token of form title.
- REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset;
- HII_FORM *HiiForm; // Pointer to HII form data.
- LIST_ENTRY StatementList; // Statement list that keep
statement under this form.
-} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a,
REDFISH_PLATFORM_CONFIG_FORM_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
-//
-typedef struct {
- LIST_ENTRY Link;
- REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;
- HII_STATEMENT *HiiStatement; // Pointer to HII statement
data.
- EFI_QUESTION_ID QuestionId; // Question ID of this
statement.
- EFI_STRING_ID Description; // String token of this question.
- EFI_STRING DesStringCache; // The string cache for search
function.
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;
-
-#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
-//
-typedef struct {
- LIST_ENTRY Link;
- REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement;
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF;
-
-#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link)
-
-//
-// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
-//
-typedef struct {
- LIST_ENTRY StatementList; // List of
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF
- UINTN Count;
-} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST;
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-ReleaseFormsetList (
- IN LIST_ENTRY *FormsetList
- );
-
-/**
- Release formset list and all the forms that belong to this formset.
-
- @param[in] FormsetList Pointer to formst list that needs to be
- released.
-
- @retval EFI_STATUS
-
-**/
-EFI_STATUS
-LoadFormsetList (
- IN EFI_HII_HANDLE *HiiHandle,
- OUT LIST_ENTRY *FormsetList
- );
-
-/**
- When HII database is updated. Keep updated HII handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetUpdate (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so
- we can process them later.
-
- @param[in] HiiHandle HII handle instance.
- @param[in] PendingList Pending list to keep HII handle which is recently
updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-NotifyFormsetDeleted (
- IN EFI_HII_HANDLE *HiiHandle,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- Get statement private instance by the given configure language.
-
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] ConfigureLang Configure language.
-
- @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to
statement private instance.
-
-**/
-REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *
-GetStatementPrivateByConfigureLang (
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING ConfigureLang
- );
-
-/**
- Search and find statement private instance by given regular expression
patthern
- which describes the Configure Language.
-
- @param[in] RegularExpressionProtocol Regular express protocol.
- @param[in] FormsetList Form-set list to search.
- @param[in] Schema Schema to be matched.
- @param[in] Pattern Regular expression pattern.
- @param[out] StatementList Statement list that match above
pattern.
-
- @retval EFI_SUCCESS Statement list is returned.
- @retval EFI_INVALID_PARAMETER Input parameter is NULL.
- @retval EFI_NOT_READY Regular express protocol is NULL.
- @retval EFI_NOT_FOUND No statement is found.
- @retval EFI_OUT_OF_RESOURCES System is out of memory.
-
-**/
-EFI_STATUS
-GetStatementPrivateByConfigureLangRegex (
- IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,
- IN LIST_ENTRY *FormsetList,
- IN CHAR8 *Schema,
- IN EFI_STRING Pattern,
- OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- );
-
-/**
- There are HII database update and we need to process them accordingly so
that we
- won't use stale data. This function will parse updated HII handle again in
order
- to get updated data-set.
-
- @param[in] FormsetList List to keep HII form-set.
- @param[in] PendingList List to keep HII handle that is updated.
-
- @retval EFI_SUCCESS HII handle is saved in pending list.
- @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.
-
-**/
-EFI_STATUS
-ProcessPendingList (
- IN LIST_ENTRY *FormsetList,
- IN LIST_ENTRY *PendingList
- );
-
-/**
- Retrieves a string from a string package in a English language. The
- returned string is allocated using AllocatePool(). The caller is responsible
- for freeing the allocated buffer using FreePool().
-
- If HiiHandle is NULL, then ASSERT().
- If StringId is 0, then ASSET.
-
- @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.
- @param[in] HiiHandle A handle that was previously registered in the
HII Database.
- @param[in] StringId The identifier of the string to retrieved from the
string
- package associated with HiiHandle.
-
- @retval NULL The string specified by StringId is not present in the string
package.
- @retval Other The string was returned.
-
-**/
-EFI_STRING
-HiiGetRedfishString (
- IN EFI_HII_HANDLE HiiHandle,
- IN CHAR8 *Language,
- IN EFI_STRING_ID StringId
- );
-
-/**
- Release all resource in statement list.
-
- @param[in] StatementList Statement list to be released.
-
- @retval EFI_SUCCESS All resource are released.
- @retval EFI_INVALID_PARAMETER StatementList is NULL.
-
-**/
-EFI_STATUS
-ReleaseStatementList (
- IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList
- );
-
-#endif
+/** @file

+ This file defines the EDKII Redfish Platform Config Protocol interface.

+

+ (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>

+

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_

+#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_

+

+#include <Uefi.h>

+

+//

+// Libraries

+//

+#include <Library/BaseLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/DebugLib.h>

+#include <Library/DevicePathLib.h>

+#include <Library/HiiUtilityLib.h>

+#include <Library/HiiLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiLib.h>

+

+#define IS_EMPTY_STRING(a) (a == NULL || a[0] == L'\0')

+#define ENGLISH_LANGUAGE_CODE "en-US"

+#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.

+//

+typedef struct {

+ LIST_ENTRY Link;

+ EFI_HII_HANDLE HiiHandle;

+ BOOLEAN IsDeleted;

+} REDFISH_PLATFORM_CONFIG_PENDING_LIST;

+

+#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_PENDING_LIST, Link)

+

+typedef struct {

+ UINTN Count; // Number of schema in list

+ CHAR8 **SchemaList; // Schema list

+} REDFISH_PLATFORM_CONFIG_SCHEMA;

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE

+//

+typedef struct {

+ LIST_ENTRY Link;

+ HII_FORMSET *HiiFormSet; // Pointer to HII formset data.

+ EFI_GUID Guid; // Formset GUID.

+ EFI_HII_HANDLE HiiHandle; // Hii Handle of this formset.

+ LIST_ENTRY HiiFormList; // Form list that keep form data under
this formset.

+ CHAR16 *DevicePathStr; // Device path of this formset.

+ REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema
that is supported in this formset.

+} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR
(a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE

+//

+typedef struct {

+ LIST_ENTRY Link;

+ UINT16 Id; // Form ID.

+ EFI_STRING_ID Title; // String token of form title.

+ REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset;

+ HII_FORM *HiiForm; // Pointer to HII form data.

+ LIST_ENTRY StatementList; // Statement list that keep
statement under this form.

+} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a,
REDFISH_PLATFORM_CONFIG_FORM_PRIVATE, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE

+//

+typedef struct {

+ LIST_ENTRY Link;

+ REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;

+ HII_STATEMENT *HiiStatement; // Pointer to HII statement
data.

+ EFI_QUESTION_ID QuestionId; // Question ID of this
statement.

+ EFI_STRING_ID Description; // String token of this question.

+ EFI_STRING DesStringCache; // The string cache for search
function.

+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;

+

+#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF

+//

+typedef struct {

+ LIST_ENTRY Link;

+ REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement;

+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF;

+

+#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a)
BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link)

+

+//

+// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST

+//

+typedef struct {

+ LIST_ENTRY StatementList; // List of
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF

+ UINTN Count;

+} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST;

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+ReleaseFormsetList (

+ IN LIST_ENTRY *FormsetList

+ );

+

+/**

+ Release formset list and all the forms that belong to this formset.

+

+ @param[in] FormsetList Pointer to formst list that needs to be

+ released.

+

+ @retval EFI_STATUS

+

+**/

+EFI_STATUS

+LoadFormsetList (

+ IN EFI_HII_HANDLE *HiiHandle,

+ OUT LIST_ENTRY *FormsetList

+ );

+

+/**

+ When HII database is updated. Keep updated HII handle into pending list
so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetUpdate (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ );

+

+/**

+ When HII database is updated and form-set is deleted. Keep deleted HII
handle into pending list so

+ we can process them later.

+

+ @param[in] HiiHandle HII handle instance.

+ @param[in] PendingList Pending list to keep HII handle which is recently
updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is
NULL.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+NotifyFormsetDeleted (

+ IN EFI_HII_HANDLE *HiiHandle,

+ IN LIST_ENTRY *PendingList

+ );

+

+/**

+ Get statement private instance by the given configure language.

+

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] ConfigureLang Configure language.

+

+ @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer
to statement private instance.

+

+**/

+REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *

+GetStatementPrivateByConfigureLang (

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING ConfigureLang

+ );

+

+/**

+ Search and find statement private instance by given regular expression
patthern

+ which describes the Configure Language.

+

+ @param[in] RegularExpressionProtocol Regular express protocol.

+ @param[in] FormsetList Form-set list to search.

+ @param[in] Schema Schema to be matched.

+ @param[in] Pattern Regular expression pattern.

+ @param[out] StatementList Statement list that match above
pattern.

+

+ @retval EFI_SUCCESS Statement list is returned.

+ @retval EFI_INVALID_PARAMETER Input parameter is NULL.

+ @retval EFI_NOT_READY Regular express protocol is NULL.

+ @retval EFI_NOT_FOUND No statement is found.

+ @retval EFI_OUT_OF_RESOURCES System is out of memory.

+

+**/

+EFI_STATUS

+GetStatementPrivateByConfigureLangRegex (

+ IN EFI_REGULAR_EXPRESSION_PROTOCOL
*RegularExpressionProtocol,

+ IN LIST_ENTRY *FormsetList,

+ IN CHAR8 *Schema,

+ IN EFI_STRING Pattern,

+ OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ );

+

+/**

+ There are HII database update and we need to process them accordingly
so that we

+ won't use stale data. This function will parse updated HII handle again in
order

+ to get updated data-set.

+

+ @param[in] FormsetList List to keep HII form-set.

+ @param[in] PendingList List to keep HII handle that is updated.

+

+ @retval EFI_SUCCESS HII handle is saved in pending list.

+ @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is
NULL.

+

+**/

+EFI_STATUS

+ProcessPendingList (

+ IN LIST_ENTRY *FormsetList,

+ IN LIST_ENTRY *PendingList

+ );

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+EFI_STRING

+HiiGetRedfishString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ );

+

+/**

+ Retrieves a string from a string package in a English language. The

+ returned string is allocated using AllocatePool(). The caller is responsible

+ for freeing the allocated buffer using FreePool().

+

+ If HiiHandle is NULL, then ASSERT().

+ If StringId is 0, then ASSET.

+

+ @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance.

+ @param[in] HiiHandle A handle that was previously registered in the
HII Database.

+ @param[in] StringId The identifier of the string to retrieved from the
string

+ package associated with HiiHandle.

+

+ @retval NULL The string specified by StringId is not present in the string
package.

+ @retval Other The string was returned.

+

+**/

+CHAR8 *

+HiiGetRedfishAsciiString (

+ IN EFI_HII_HANDLE HiiHandle,

+ IN CHAR8 *Language,

+ IN EFI_STRING_ID StringId

+ );

+

+/**

+ Release all resource in statement list.

+

+ @param[in] StatementList Statement list to be released.

+

+ @retval EFI_SUCCESS All resource are released.

+ @retval EFI_INVALID_PARAMETER StatementList is NULL.

+

+**/

+EFI_STATUS

+ReleaseStatementList (

+ IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST
*StatementList

+ );

+

+#endif

--
2.32.0.windows.2