/** @file Definitions of RedfishPlatformConfigLib. Copyright (c) 2019, Intel Corporation. All rights reserved.
(C) Copyright 2021 Hewlett Packard Enterprise Development LP
Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef HII_UTILITY_LIB_ #define HII_UTILITY_LIB_ #include #include // // IFR relative definition // #define EFI_HII_EXPRESSION_INCONSISTENT_IF 0 #define EFI_HII_EXPRESSION_NO_SUBMIT_IF 1 #define EFI_HII_EXPRESSION_GRAY_OUT_IF 2 #define EFI_HII_EXPRESSION_SUPPRESS_IF 3 #define EFI_HII_EXPRESSION_DISABLE_IF 4 #define EFI_HII_EXPRESSION_VALUE 5 #define EFI_HII_EXPRESSION_RULE 6 #define EFI_HII_EXPRESSION_READ 7 #define EFI_HII_EXPRESSION_WRITE 8 #define EFI_HII_EXPRESSION_WARNING_IF 9 #define EFI_HII_VARSTORE_BUFFER 0 #define EFI_HII_VARSTORE_NAME_VALUE 1 #define EFI_HII_VARSTORE_EFI_VARIABLE 2 // EFI Varstore type follow UEFI spec before 2.3.1. #define EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER 3 // EFI varstore type follow UEFI spec 2.3.1 and later. /// /// HII_NAME_VALUE_NODE for name/value storage /// typedef struct { UINTN Signature; LIST_ENTRY Link; CHAR16 *Name; CHAR16 *Value; } HII_NAME_VALUE_NODE; #define HII_NAME_VALUE_NODE_SIGNATURE SIGNATURE_32 ('N', 'V', 'S', 'T') #define HII_NAME_VALUE_NODE_FROM_LINK(a) CR (a, HII_NAME_VALUE_NODE, Link, HII_NAME_VALUE_NODE_SIGNATURE) /// /// Storage info /// typedef union { EFI_STRING_ID VarName; UINT16 VarOffset; } HII_VAR_STORE_INFO; /// /// FormSet storage /// typedef struct { UINTN Signature; LIST_ENTRY Link; UINT8 Type; ///< Storage type EFI_HII_HANDLE HiiHandle; ///< HiiHandle for this varstore. /// /// For all type of storages. /// UINT16 VarStoreId; ///< VarStore ID. EFI_GUID Guid; ///< VarStore Guid. /// /// For EFI_IFR_VARSTORE, EFI_IFR_VARSTORE_EFI /// CHAR16 *Name; ///< VarStore name UINT16 Size; ///< VarStore size. UINT8 *Buffer; ///< Buffer storage. UINT8 *EditBuffer; ///< Edit copy for Buffer Storage /// /// For EFI_IFR_VARSTORE_EFI: EFI Variable. /// UINT32 Attributes; /// /// For EFI_IFR_VARSTORE_NAME_VALUE. /// LIST_ENTRY NameValueList; ///< List of NAME_VALUE_NODE CHAR16 *ConfigHdr; ///< CHAR16 *ConfigRequest; ///< = + UINTN ElementCount; ///< Number of in the UINTN SpareStrLen; ///< Spare length of ConfigRequest string buffer } HII_FORMSET_STORAGE; #define HII_STORAGE_SIGNATURE SIGNATURE_32 ('B', 'S', 'T', 'G') #define HII_STORAGE_FROM_LINK(a) CR (a, HII_FORMSET_STORAGE, Link, HII_STORAGE_SIGNATURE) /// /// Definition of EXPRESS_RESULT /// typedef enum { ExpressFalse = 0, ExpressGrayOut, ExpressSuppress, ExpressDisable } EXPRESS_RESULT; /// /// Definition of EXPRESS_LEVEL /// typedef enum { ExpressNone = 0, ExpressForm, ExpressStatement, ExpressOption } EXPRESS_LEVEL; /// /// Definition of HII_EXPRESSION_OPCODE_EXTRA /// typedef union { EFI_HII_VALUE Value; ///< EFI_IFR_UINT64, EFI_IFR_UINT32, EFI_IFR_UINT16, EFI_IFR_UINT8, EFI_IFR_STRING_REF1 UINT8 Format; ///< For EFI_IFR_TO_STRING, EFI_IFR_FIND UINT8 Flags; ///< For EFI_IFR_SPAN UINT8 RuleId; ///< For EFI_IFR_RULE_REF EFI_GUID Guid; ///< For EFI_IFR_SECURITY, EFI_IFR_MATCH2 struct { EFI_QUESTION_ID QuestionId; EFI_HII_VALUE Value; } EqIdValData; struct { EFI_QUESTION_ID QuestionId1; EFI_QUESTION_ID QuestionId2; } EqIdIdData; struct { EFI_QUESTION_ID QuestionId; ///< For EFI_IFR_EQ_ID_VAL_LIST UINT16 ListLength; UINT16 *ValueList; } EqIdListData; struct { EFI_QUESTION_ID QuestionId; } QuestionRef1Data; struct { EFI_STRING_ID DevicePath; ///< For EFI_IFR_QUESTION_REF3_3 EFI_GUID Guid; } QuestionRef3Data; struct { HII_FORMSET_STORAGE *VarStorage; HII_VAR_STORE_INFO VarStoreInfo; UINT8 ValueType; UINT8 ValueWidth; CHAR16 *ValueName; } GetSetData; } HII_EXPRESSION_OPCODE_EXTRA; typedef union _HII_DEPENDENCY_EXPRESSION HII_DEPENDENCY_EXPRESSION; /// /// Definition of HII_EXPRESSION_CONSTANT /// /// Operand: /// /// EFI_IFR_TRUE /// EFI_IFR_FALSE /// EFI_IFR_ONE /// EFI_IFR_ONES /// EFI_IFR_ZERO /// EFI_IFR_UNDEFINED /// EFI_IFR_VERSION /// EFI_IFR_UINT8 /// EFI_IFR_UINT16 /// EFI_IFR_UINT32 /// EFI_IFR_UINT64 /// typedef struct { UINT8 Operand; EFI_HII_VALUE Value; } HII_EXPRESSION_CONSTANT; /// /// Definition of HII_DEPENDENCY_DUP /// typedef struct { UINT8 Operand; } HII_DEPENDENCY_DUP; /// /// Definition of HII_DEPENDENCY_EQ_ID_VAL /// typedef struct { UINT8 Operand; EFI_QUESTION_ID QuestionId; EFI_HII_VALUE Value; } HII_DEPENDENCY_EQ_ID_VAL; /// /// Definition of HII_DEPENDENCY_EQ_ID_VAL /// typedef struct { UINT8 Operand; EFI_QUESTION_ID QuestionId1; EFI_QUESTION_ID QuestionId2; } HII_DEPENDENCY_EQ_ID_ID; /// /// Definition of HII_DEPENDENCY_EQ_ID_VAL_LIST /// typedef struct { UINT8 Operand; EFI_QUESTION_ID QuestionId; UINT16 ListLength; UINT16 *ValueList; } HII_DEPENDENCY_EQ_ID_VAL_LIST; /// /// Definition of HII_DEPENDENCY_QUESTION_REF1 /// typedef struct { UINT8 Operand; EFI_QUESTION_ID QuestionId; } HII_DEPENDENCY_QUESTION_REF1; /// /// Definition of HII_DEPENDENCY_RULE_REF /// typedef struct { UINT8 Operand; UINT8 RuleId; } HII_DEPENDENCY_RULE_REF; /// /// Definition of HII_DEPENDENCY_STRING_REF1 /// typedef struct { UINT8 Operand; EFI_HII_VALUE Value; } HII_DEPENDENCY_STRING_REF1; /// /// Definition of HII_DEPENDENCY_THIS /// typedef struct { UINT8 Operand; EFI_QUESTION_ID QuestionId; } HII_DEPENDENCY_THIS; /// /// Definition of HII_DEPENDENCY_SECURITY /// typedef struct { UINT8 Operand; EFI_GUID Permissions; } HII_DEPENDENCY_SECURITY; /// /// Definition of HII_DEPENDENCY_GET /// typedef struct { UINT8 Operand; HII_FORMSET_STORAGE *VarStorage; HII_VAR_STORE_INFO VarStoreInfo; UINT8 ValueType; UINT8 ValueWidth; CHAR16 *ValueName; } HII_DEPENDENCY_GET; /// /// Definition of HII_DEPENDENCY_LENGTH /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_LENGTH; /// /// Definition of HII_DEPENDENCY_BITWISE_NOT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_BITWISE_NOT; /// /// Definition of HII_DEPENDENCY_STRING_REF2 /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_STRING_REF2; /// /// Definition of HII_DEPENDENCY_QUESTION_REF2 /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_QUESTION_REF2; /// /// Definition of HII_DEPENDENCY_QUESTION_REF3 /// typedef struct { UINT8 Operand; EFI_STRING_ID DevicePath; EFI_GUID Guid; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_QUESTION_REF3; /// /// Definition of HII_DEPENDENCY_TO_BOOLEAN /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_TO_BOOLEAN; /// /// Definition of HII_DEPENDENCY_TO_STRING /// typedef struct { UINT8 Operand; UINT8 Format; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_TO_STRING; /// /// Definition of HII_DEPENDENCY_TO_UINT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_TO_UINT; /// /// Definition of HII_DEPENDENCY_TO_UPPER /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_TO_UPPER; /// /// Definition of HII_DEPENDENCY_TO_LOWER /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_TO_LOWER; /// /// Definition of HII_DEPENDENCY_SET /// typedef struct { UINT8 Operand; HII_FORMSET_STORAGE *VarStorage; HII_VAR_STORE_INFO VarStoreInfo; UINT8 ValueType; UINT8 ValueWidth; CHAR16 *ValueName; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_SET; /// /// Definition of HII_DEPENDENCY_NOT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression; } HII_DEPENDENCY_NOT; /// /// Definition of HII_DEPENDENCY_CATENATE /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *LeftStringExp; HII_DEPENDENCY_EXPRESSION *RightStringExp; } HII_DEPENDENCY_CATENATE; /// /// Definition of HII_DEPENDENCY_MATCH /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *StringExp; HII_DEPENDENCY_EXPRESSION *PatternExp; } HII_DEPENDENCY_MATCH; /// /// Definition of HII_DEPENDENCY_MATCH2 /// typedef struct { UINT8 Operand; EFI_GUID SyntaxType; HII_DEPENDENCY_EXPRESSION *StringExp; HII_DEPENDENCY_EXPRESSION *PatternExp; } HII_DEPENDENCY_MATCH2; /// /// Definition of HII_DEPENDENCY_MULT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_MULT; /// /// Definition of HII_DEPENDENCY_DIV /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; ///< right value HII_DEPENDENCY_EXPRESSION *LeftHandExp; ///< left value } HII_DEPENDENCY_DIV; /// /// Definition of HII_DEPENDENCY_MOD /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; ///< right value HII_DEPENDENCY_EXPRESSION *LeftHandExp; ///< left value } HII_DEPENDENCY_MOD; /// /// Definition of HII_DEPENDENCY_ADD /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; ///< right value HII_DEPENDENCY_EXPRESSION *LeftHandExp; ///< left value } HII_DEPENDENCY_ADD; /// /// Definition of HII_DEPENDENCY_SUBTRACT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; ///< right value HII_DEPENDENCY_EXPRESSION *LeftHandExp; ///< left value } HII_DEPENDENCY_SUBTRACT; /// /// Definition of HII_DEPENDENCY_SHIFT_LEFT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_SHIFT_LEFT; /// /// Definition of HII_DEPENDENCY_SHIFT_RIGHT /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_SHIFT_RIGHT; /// /// Definition of HII_DEPENDENCY_GREATER_THAN /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_GREATER_THAN; /// /// Definition of HII_DEPENDENCY_GREATER_EQUAL /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_GREATER_EQUAL; /// /// Definition of HII_DEPENDENCY_LESS_THAN /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_LESS_THAN; /// /// Definition of HII_DEPENDENCY_LESS_EQUAL /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *RightHandExp; HII_DEPENDENCY_EXPRESSION *LeftHandExp; } HII_DEPENDENCY_LESS_EQUAL; /// /// Definition of HII_DEPENDENCY_EQUAL /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression1; HII_DEPENDENCY_EXPRESSION *SubExpression2; } HII_DEPENDENCY_EQUAL; /// /// Definition of HII_DEPENDENCY_NOT_EQUAL /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression1; HII_DEPENDENCY_EXPRESSION *SubExpression2; } HII_DEPENDENCY_NOT_EQUAL; /// /// Definition of HII_DEPENDENCY_BITWISE_AND /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression1; HII_DEPENDENCY_EXPRESSION *SubExpression2; } HII_DEPENDENCY_BITWISE_AND; /// /// Definition of HII_DEPENDENCY_BITWISE_OR /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression1; HII_DEPENDENCY_EXPRESSION *SubExpression2; } HII_DEPENDENCY_BITWISE_OR; /// /// Definition of HII_DEPENDENCY_AND /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression1; HII_DEPENDENCY_EXPRESSION *SubExpression2; } HII_DEPENDENCY_AND; /// /// Definition of HII_DEPENDENCY_OR /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExpression1; HII_DEPENDENCY_EXPRESSION *SubExpression2; } HII_DEPENDENCY_OR; /// /// Definition of HII_DEPENDENCY_CONDITIONAL /// /// Ternary expression /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *CondTrueValExp; ///< right value HII_DEPENDENCY_EXPRESSION *CondFalseValExp; ///< middle value HII_DEPENDENCY_EXPRESSION *ConditionExp; ///< left value } HII_DEPENDENCY_CONDITIONAL; /// /// Definition of HII_DEPENDENCY_FIND /// typedef struct { UINT8 Operand; UINT8 Format; HII_DEPENDENCY_EXPRESSION *IndexExp; ///< right value HII_DEPENDENCY_EXPRESSION *StringToCompWithExp; ///< middle value HII_DEPENDENCY_EXPRESSION *StringToSearchExp; ///< left value } HII_DEPENDENCY_FIND; /// /// Definition of HII_DEPENDENCY_MID /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *LengthExp; ///< right value HII_DEPENDENCY_EXPRESSION *IndexExp; ///< middle value HII_DEPENDENCY_EXPRESSION *StringOrBufferExp; ///< left value } HII_DEPENDENCY_MID; /// /// Definition of HII_DEPENDENCY_TOKEN /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *IndexExp; ///< right value HII_DEPENDENCY_EXPRESSION *DelimiterExp; ///< middle value HII_DEPENDENCY_EXPRESSION *StringToSearchExp; ///< left value } HII_DEPENDENCY_TOKEN; /// /// Definition of HII_DEPENDENCY_SPAN /// typedef struct { UINT8 Operand; UINT8 Flags; HII_DEPENDENCY_EXPRESSION *IndexExp; ///< right value HII_DEPENDENCY_EXPRESSION *CharsetExp; ///< middle value HII_DEPENDENCY_EXPRESSION *StringToSearchExp; ///< left value } HII_DEPENDENCY_SPAN; /// /// Map expression /// typedef struct { HII_DEPENDENCY_EXPRESSION *MatchExp; HII_DEPENDENCY_EXPRESSION *ReturnExp; } HII_DEPENDENCY_EXPRESSION_PAIR; /// /// Definition of HII_DEPENDENCY_MAP /// typedef struct { UINT8 Operand; HII_DEPENDENCY_EXPRESSION *SubExp; HII_DEPENDENCY_EXPRESSION_PAIR *ExpPair; UINT8 ExpPairNo; } HII_DEPENDENCY_MAP; /// /// Definition of HII_DEPENDENCY_EXPRESSION /// union _HII_DEPENDENCY_EXPRESSION { /// /// Constant /// HII_EXPRESSION_CONSTANT ConstantExp; /// /// build-in expression /// HII_DEPENDENCY_DUP DupExp; HII_DEPENDENCY_EQ_ID_VAL EqIdValExp; HII_DEPENDENCY_EQ_ID_ID EqIdIdExp; HII_DEPENDENCY_EQ_ID_VAL_LIST EqIdListExp; HII_DEPENDENCY_QUESTION_REF1 QuestionRef1Exp; HII_DEPENDENCY_RULE_REF RuleRefExp; HII_DEPENDENCY_STRING_REF1 StringRef1Exp; HII_DEPENDENCY_THIS ThisExp; HII_DEPENDENCY_SECURITY SecurityExp; HII_DEPENDENCY_GET GetExp; /// /// unary expression /// HII_DEPENDENCY_LENGTH LengthExp; HII_DEPENDENCY_BITWISE_NOT BitWiseNotExp; HII_DEPENDENCY_STRING_REF2 StringRef2Exp; HII_DEPENDENCY_QUESTION_REF2 QuestionRef2Exp; HII_DEPENDENCY_QUESTION_REF3 QuestionRef3Exp; HII_DEPENDENCY_TO_BOOLEAN ToBooleanExp; HII_DEPENDENCY_TO_STRING ToStringExp; HII_DEPENDENCY_TO_UINT ToUintExp; HII_DEPENDENCY_TO_UPPER ToUpperExp; HII_DEPENDENCY_TO_LOWER ToLowerExp; HII_DEPENDENCY_SET SetExp; HII_DEPENDENCY_NOT NotExp; /// /// Binary expression /// HII_DEPENDENCY_CATENATE CatenateExp; HII_DEPENDENCY_MATCH MatchExp; HII_DEPENDENCY_MATCH2 Match2Exp; HII_DEPENDENCY_MULT MultExp; HII_DEPENDENCY_DIV DivExp; HII_DEPENDENCY_MOD ModExp; HII_DEPENDENCY_ADD AddExp; HII_DEPENDENCY_SUBTRACT SubtractExp; HII_DEPENDENCY_SHIFT_LEFT ShiftLeftExp; HII_DEPENDENCY_SHIFT_RIGHT ShiftRightExp; HII_DEPENDENCY_GREATER_THAN GreaterThanExp; HII_DEPENDENCY_GREATER_EQUAL GreaterEqualExp; HII_DEPENDENCY_LESS_THAN LessThanExp; HII_DEPENDENCY_LESS_EQUAL LessEqualExp; HII_DEPENDENCY_EQUAL EqualExp; HII_DEPENDENCY_NOT_EQUAL NotEqualExp; HII_DEPENDENCY_BITWISE_AND BitwiseAndExp; HII_DEPENDENCY_BITWISE_OR BitwiseOrExp; HII_DEPENDENCY_AND AndExp; HII_DEPENDENCY_OR OrExp; /// /// ternary expression /// HII_DEPENDENCY_CONDITIONAL ConditionalExp; HII_DEPENDENCY_FIND FindExp; HII_DEPENDENCY_MID MidExp; HII_DEPENDENCY_TOKEN TokenExp; HII_DEPENDENCY_SPAN SpanExp; HII_DEPENDENCY_MAP MapExp; }; /// /// Definition of HII_EXPRESSION_OPCODE /// typedef struct { UINTN Signature; LIST_ENTRY Link; UINT8 Operand; HII_EXPRESSION_OPCODE_EXTRA ExtraData; LIST_ENTRY MapExpressionList; ///< nested expressions inside of Map opcode. } HII_EXPRESSION_OPCODE; #define HII_EXPRESSION_OPCODE_SIGNATURE SIGNATURE_32 ('E', 'X', 'O', 'P') #define HII_EXPRESSION_OPCODE_FROM_LINK(a) CR (a, HII_EXPRESSION_OPCODE, Link, HII_EXPRESSION_OPCODE_SIGNATURE) /// /// Definition of HII_WARNING_IF_DATA /// typedef struct { EFI_STRING_ID WarningIfError; UINT8 TimeOut; } HII_WARNING_IF_DATA; /// /// Definition of HII_EXTRA_DATA /// typedef union { UINT8 RuleId; ///< For EFI_IFR_RULE only EFI_STRING_ID Error; ///< For EFI_IFR_NO_SUBMIT_IF, EFI_IFR_INCONSISTENT_IF only HII_WARNING_IF_DATA WarningIfData; } HII_EXTRA_DATA; /// /// Definition of HII_EXPRESSION /// typedef struct { UINTN Signature; LIST_ENTRY Link; UINT8 Type; ///< Type for this expression EFI_IFR_OP_HEADER *OpCode; ///< Save the opcode buffer. LIST_ENTRY OpCodeListHead; ///< OpCodes consist of this expression (HII_EXPRESSION_OPCODE) HII_DEPENDENCY_EXPRESSION *RootDependencyExp; ///< Expression OpCodes tree layout to describe dependency of this expression. HII_EXTRA_DATA ExtraData; EFI_HII_VALUE Result; ///< Expression evaluation result } HII_EXPRESSION; #define HII_EXPRESSION_SIGNATURE SIGNATURE_32 ('F', 'E', 'X', 'P') #define HII_EXPRESSION_FROM_LINK(a) CR (a, HII_EXPRESSION, Link, HII_EXPRESSION_SIGNATURE) /// /// Definition of HII_EXPRESSION_LIST /// typedef struct { UINTN Signature; UINTN Count; HII_EXPRESSION *Expression[1]; ///< Array[Count] of expressions } HII_EXPRESSION_LIST; #define HII_EXPRESSION_LIST_SIGNATURE SIGNATURE_32 ('F', 'E', 'X', 'R') /// /// Definition of HII_STATEMENT_VALUE /// typedef struct { /// /// HII Data Type /// UINT8 Type; EFI_IFR_TYPE_VALUE Value; /// /// Buffer Data and Length if Type is EFI_IFR_TYPE_BUFFER or EFI_IFR_TYPE_STRING /// UINT8 *Buffer; UINT16 BufferLen; UINT8 BufferValueType; ///< Data type for buffer internal data, currently only for orderedlist } HII_STATEMENT_VALUE; /// /// Default value /// typedef struct { UINTN Signature; LIST_ENTRY Link; UINT16 DefaultId; HII_STATEMENT_VALUE Value; ///< Default value HII_EXPRESSION *ValueExpression; ///< Not-NULL indicates default value is provided by EFI_IFR_VALUE } HII_QUESTION_DEFAULT; #define HII_QUESTION_DEFAULT_SIGNATURE SIGNATURE_32 ('Q', 'D', 'F', 'T') #define HII_QUESTION_DEFAULT_FROM_LINK(a) CR (a, HII_QUESTION_DEFAULT, Link, HII_QUESTION_DEFAULT_SIGNATURE) #define HII_QUESTION_OPTION_SIGNATURE SIGNATURE_32 ('Q', 'O', 'P', 'T') /// /// Option value /// typedef struct { UINTN Signature; LIST_ENTRY Link; EFI_IFR_ONE_OF_OPTION *OpCode; ///< OneOfOption Data EFI_STRING_ID Text; UINT8 Flags; HII_STATEMENT_VALUE Value; EFI_IMAGE_ID ImageId; HII_EXPRESSION_LIST *SuppressExpression; ///< Non-NULL indicates nested inside of SuppressIf } HII_QUESTION_OPTION; #define HII_QUESTION_OPTION_FROM_LINK(a) CR (a, HII_QUESTION_OPTION, Link, HII_QUESTION_OPTION_SIGNATURE) /// /// class of default /// typedef struct { UINTN Signature; LIST_ENTRY Link; UINT16 DefaultId; EFI_STRING_ID DefaultName; } HII_FORMSET_DEFAULTSTORE; #define HII_FORMSET_DEFAULTSTORE_SIGNATURE SIGNATURE_32 ('F', 'D', 'F', 'S') #define HII_FORMSET_DEFAULTSTORE_FROM_LINK(a) CR (a, HII_FORMSET_DEFAULTSTORE, Link, HII_FORMSET_DEFAULTSTORE_SIGNATURE) /// /// Definition of HII_STATEMENT_EXTRA /// typedef union { UINT8 Flags; EFI_STRING_ID TextTwo; EFI_DEFAULT_ID DefaultId; EFI_STRING_ID QuestionConfig; EFI_GUID Guid; struct { UINT8 Flags; UINT64 Minimum; ///< for EFI_IFR_ONE_OF/EFI_IFR_NUMERIC, it's Min/Max value UINT64 Maximum; ///< for EFI_IFR_STRING/EFI_IFR_PASSWORD, it's Min/Max length UINT64 Step; EFI_GUID Guid; } NumData; struct { UINT8 Flags; UINT8 MaxContainers; ///< for EFI_IFR_ORDERED_LIST } OrderListData; struct { UINT8 Flags; UINT8 MinSize; UINT8 MaxSize; } StrData; struct { UINT16 MinSize; UINT16 MaxSize; } PwdData; } HII_STATEMENT_EXTRA; /// /// Statement (Question) /// typedef struct _HII_STATEMENT HII_STATEMENT; struct _HII_STATEMENT { UINTN Signature; LIST_ENTRY Link; UINT8 Operand; ///< The operand (first byte) of this Statement or Question EFI_IFR_OP_HEADER *OpCode; /// /// Statement Header /// EFI_STRING_ID Prompt; EFI_STRING_ID Help; /// /// Question Header /// EFI_QUESTION_ID QuestionId; ///< Question id, the value of zero is reserved EFI_VARSTORE_ID VarStoreId; ///< VarStore id, a value of zero indicates no variable storage HII_VAR_STORE_INFO VarStoreInfo; ///< VarStoreInfoIf VarStoreId refers to Buffer Storage (EFI_IFR_VARSTORE or EFI_IFR_VARSTORE_EFI), then VarStoreInfo contains a 16-bit Buffer Storage offset (VarOffset). ///< If VarStoreId refers to Name/Value Storage (EFI_IFR_VARSTORE_NAME_VALUE), then VarStoreInfo contains the String ID of the name (VarName) for this name/value pair. UINT8 QuestionFlags; ///< The flag of this Question.(Readonly, reset required, callback attribute....) BOOLEAN QuestionReferToBitField; ///< Whether the question is stored in a bit field. UINT16 StorageWidth; ///< The storage width of this Question. UINT16 BitStorageWidth; ///< The Storage width of this Question in bit level. UINT16 BitVarOffset; ///< The storage offset of this Question in bit level. CHAR16 *VariableName; ///< Name/Value or EFI Variable name CHAR16 *BlockName; ///< Buffer storage block name: "OFFSET=...WIDTH=..." HII_FORMSET_STORAGE *Storage; ///< Point to the storage that store this question. HII_STATEMENT_EXTRA ExtraData; BOOLEAN Locked; ///< Whether this statement is locked. HII_STATEMENT_VALUE Value; /// /// Get from IFR parsing /// HII_STATEMENT *ParentStatement; ///< Parent Statement of current statement. HII_EXPRESSION_LIST *ExpressionList; ///< nesting inside of GrayedOutIf/DisableIf/SuppressIf HII_EXPRESSION *ValueExpression; ///< nested EFI_IFR_VALUE, provide Question value and indicate Question is ReadOnly EFI_IMAGE_ID ImageId; ///< nested EFI_IFR_IMAGE UINT8 RefreshInterval; ///< nested EFI_IFR_REFRESH, refresh interval(in seconds) for Question value, 0 means no refresh LIST_ENTRY DefaultListHead; ///< nested EFI_IFR_DEFAULT list (HII_QUESTION_DEFAULT), provide default values LIST_ENTRY OptionListHead; ///< nested EFI_IFR_ONE_OF_OPTION list (HII_QUESTION_OPTION) LIST_ENTRY InconsistentListHead; ///< nested inconsistent expression list (HII_EXPRESSION) LIST_ENTRY NoSubmitListHead; ///< nested nosubmit expression list (HII_EXPRESSION) LIST_ENTRY WarningListHead; ///< nested warning expression list (HII_EXPRESSION) HII_EXPRESSION *ReadExpression; ///< nested EFI_IFR_READ, provide this question value by read expression. HII_EXPRESSION *WriteExpression; ///< nested EFI_IFR_WRITE, evaluate write expression after this question value is set. }; #define HII_STATEMENT_SIGNATURE SIGNATURE_32 ('H', 'S', 'T', 'A') #define HII_STATEMENT_FROM_LINK(a) CR (a, HII_STATEMENT, Link, HII_STATEMENT_SIGNATURE) /// /// Form /// #define STANDARD_MAP_FORM_TYPE 0x01 typedef struct { UINTN Signature; LIST_ENTRY Link; UINT16 FormId; ///< FormId of normal form or formmap form. EFI_STRING_ID FormTitle; ///< FormTile of normal form, or FormMapMethod title of formmap form. UINT16 FormType; ///< Specific form type for the different form. EFI_IMAGE_ID ImageId; ///< The image id. BOOLEAN ModalForm; ///< Whether this is a modal form. BOOLEAN Locked; ///< Whether this form is locked. EFI_GUID RefreshGuid; ///< Form refresh event guid. LIST_ENTRY StatementListHead; ///< List of Statements and Questions (HII_STATEMENT) LIST_ENTRY ConfigRequestHead; ///< List of configrequest for all storage. LIST_ENTRY RuleListHead; ///< nested EFI_IFR_RULE list, pre-defined expressions attached to the form. HII_EXPRESSION_LIST *SuppressExpression; ///< nesting inside of SuppressIf } HII_FORM; #define HII_FORM_SIGNATURE SIGNATURE_32 ('F', 'F', 'R', 'M') #define HII_FORM_FROM_LINK(a) CR (a, HII_FORM, Link, HII_FORM_SIGNATURE) /// /// FormSet /// typedef struct { UINTN Signature; LIST_ENTRY Link; EFI_HII_HANDLE HiiHandle; ///< Unique id for formset, HII Handle of this FormSet package. EFI_HANDLE DriverHandle; ///< EFI_HANDLE which was registered with the package list in NewPackageList(). EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess; ///< ConfigAccess Protocol associated with this HiiPackageList EFI_DEVICE_PATH_PROTOCOL *DevicePath; UINTN IfrBinaryLength; ///< Ifr binary data length of this formset. UINT8 *IfrBinaryData; ///< Point to the Ifr binary data. EFI_GUID Guid; ///< Formset Guid. EFI_STRING_ID FormSetTitle; ///< String Id of Formset title. EFI_STRING_ID Help; ///< String Id of Formset title. UINT8 NumberOfClassGuid; ///< Class Guid name EFI_GUID ClassGuid[3]; ///< Up to three ClassGuid EFI_IMAGE_ID ImageId; ///< The image id. LIST_ENTRY StatementListOSF; ///< Statement list out side of the form. LIST_ENTRY StorageListHead; ///< Storage list (HII_FORMSET_STORAGE) LIST_ENTRY DefaultStoreListHead; ///< DefaultStore list (HII_FORMSET_DEFAULTSTORE) LIST_ENTRY FormListHead; ///< Form list (HII_FORM_BROWSER_FORM) } HII_FORMSET; #define HII_FORMSET_SIGNATURE SIGNATURE_32 ('H', 'I', 'F', 'S') #define HII_FORMSET_FROM_LINK(a) CR (a, HII_FORMSET, Link, HII_FORMSET_SIGNATURE) /// /// Get/set question value from/to. /// typedef enum { GetSetValueWithBuffer = 0, ///< Get/Set question value from/to buffer in the storage. GetSetValueWithHiiDriver, ///< Get/Set question value from/to hii driver. GetSetValueWithBoth, ///< Compare the editbuffer with buffer for this question, not use the question value. GetSetValueWithMax ///< Invalid value. } GET_SET_QUESTION_VALUE_WITH; /** Initialize the internal data structure of a FormSet. @param[in] Handle PackageList Handle @param[in,out] FormSetGuid On input, GUID or class GUID of a formset. If not specified (NULL or zero GUID), take the first FormSet with class GUID EFI_HII_PLATFORM_SETUP_FORMSET_GUID found in package list. On output, GUID of the formset found(if not NULL). @param[out] FormSet FormSet data structure. @retval EFI_SUCCESS The function completed successfully. @retval EFI_NOT_FOUND The specified FormSet could not be found. **/ EFI_STATUS CreateFormSetFromHiiHandle ( IN EFI_HII_HANDLE Handle, IN OUT EFI_GUID *FormSetGuid, OUT HII_FORMSET *FormSet ); /** Initialize a Formset and get current setting for Questions. @param[in,out] FormSet FormSet data structure. **/ VOID InitializeFormSet ( IN OUT HII_FORMSET *FormSet ); /** Free resources allocated for a FormSet. @param[in,out] FormSet Pointer of the FormSet **/ VOID DestroyFormSet ( IN OUT HII_FORMSET *FormSet ); /** Save Question Value to the memory, but not to storage. @param[in] FormSet FormSet data structure. @param[in] Form Form data structure. @param[in,out] Question Pointer to the Question. @param[in] QuestionValue New Question Value to be set. @retval EFI_SUCCESS The question value has been set successfully. @retval EFI_INVALID_PARAMETER One or more parameters are invalid. **/ EFI_STATUS SetQuestionValue ( IN HII_FORMSET *FormSet, IN HII_FORM *Form, IN OUT HII_STATEMENT *Question, IN HII_STATEMENT_VALUE *QuestionValue ); /** Get Question's current Value from storage. @param[in] FormSet FormSet data structure. @param[in] Form Form data structure. @param[in,out] Question Question to be initialized. @return the current Question Value in storage if success. @return NULL if Question is not found or any error occurs. **/ HII_STATEMENT_VALUE * RetrieveQuestion ( IN HII_FORMSET *FormSet, IN HII_FORM *Form, IN OUT HII_STATEMENT *Question ); /** Get Question's current Value. @param[in] FormSet FormSet data structure. @param[in] Form Form data structure. @param[out] Question Question to be initialized. @param[in] GetValueFrom Where to get value, may from editbuffer, buffer or hii driver. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Formset, Form or Question is NULL. **/ EFI_STATUS GetQuestionValue ( IN HII_FORMSET *FormSet, IN HII_FORM *Form, IN OUT HII_STATEMENT *Question, IN GET_SET_QUESTION_VALUE_WITH GetValueFrom ); /** Submit data for a form. @param[in] FormSet FormSet which contains the Form. @param[in] Form Form to submit. @retval EFI_SUCCESS The function completed successfully. @retval Others Other errors occur. **/ EFI_STATUS SubmitForm ( IN HII_FORMSET *FormSet, IN HII_FORM *Form ); /** Evaluate the result of a HII expression. If Expression is NULL, then ASSERT. @param[in] FormSet FormSet associated with this expression. @param[in] Form Form associated with this expression. @param[in,out] Expression Expression to be evaluated. @retval EFI_SUCCESS The expression evaluated successfully @retval EFI_NOT_FOUND The Question which referenced by a QuestionId could not be found. @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack. @retval EFI_ACCESS_DENIED The pop operation underflowed the stack @retval EFI_INVALID_PARAMETER Syntax error with the Expression **/ EFI_STATUS EvaluateHiiExpression ( IN HII_FORMSET *FormSet, IN HII_FORM *Form, IN OUT HII_EXPRESSION *Expression ); /** Retrieve dependencies within an expression. These dependencies can express how this expression will be evaluated. @param[in] Expression Expression to retrieve dependencies. @retval EFI_SUCCESS The dependencies were successfully retrieved. @retval EFI_OUT_OF_RESOURCES There is not enough system memory. **/ EFI_STATUS GetHiiExpressionDependency ( IN HII_EXPRESSION *Expression ); /** Get default value of question. @param[in] FormSet The form set. @param[in] Form The form. @param[in] Question The question. @param[in] DefaultId The Class of the default. @param[out] DefaultValue The default value of given question. @retval EFI_SUCCESS Question is reset to default value. **/ EFI_STATUS GetQuestionDefault ( IN HII_FORMSET *FormSet, IN HII_FORM *Form, IN HII_STATEMENT *Question, IN UINT16 DefaultId, OUT HII_STATEMENT_VALUE *DefaultValue ); /** Return the result of the expression list. Check the expression list and return the highest priority express result. Priority: DisableIf > SuppressIf > GrayOutIf > FALSE @param[in] ExpList The input expression list. @param[in] Evaluate Whether need to evaluate the expression first. @param[in] FormSet FormSet associated with this expression. @param[in] Form Form associated with this expression. @retval EXPRESS_RESULT Return the higher priority express result. DisableIf > SuppressIf > GrayOutIf > FALSE **/ EXPRESS_RESULT EvaluateExpressionList ( IN HII_EXPRESSION_LIST *ExpList, IN BOOLEAN Evaluate, IN HII_FORMSET *FormSet OPTIONAL, IN HII_FORM *Form OPTIONAL ); #endif // HII_UTILITY_LIB_