1 /** @file 2 This file defines the encoding for the VFR (Visual Form Representation) language. 3 Framework IFR is primarily consumed by the EFI presentation engine, and produced by EFI 4 internal application and drivers as well as all add-in card option-ROM drivers 5 6 Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR> 7 This program and the accompanying materials are licensed and made available under 8 the terms and conditions of the BSD License that accompanies this distribution. 9 The full text of the license may be found at 10 http://opensource.org/licenses/bsd-license.php. 11 12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 15 @par Revision Reference: 16 These definitions are from the Framework Specification HII 0.92. 17 18 **/ 19 20 #ifndef __FRAMEWORK_INTERNAL_FORMREPRESENTATION_H__ 21 #define __FRAMEWORK_INTERNAL_FORMREPRESENTATION_H__ 22 23 typedef UINT16 STRING_REF; 24 25 // 26 // IFR Op codes 27 // 28 #define FRAMEWORK_EFI_IFR_FORM_OP 0x01 29 #define FRAMEWORK_EFI_IFR_SUBTITLE_OP 0x02 30 #define FRAMEWORK_EFI_IFR_TEXT_OP 0x03 31 #define EFI_IFR_GRAPHIC_OP 0x04 32 #define FRAMEWORK_EFI_IFR_ONE_OF_OP 0x05 33 #define FRAMEWORK_EFI_IFR_CHECKBOX_OP 0x06 34 #define FRAMEWORK_EFI_IFR_NUMERIC_OP 0x07 35 #define FRAMEWORK_EFI_IFR_PASSWORD_OP 0x08 36 #define FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP 0x09 ///< ONEOF OPTION field. 37 #define FRAMEWORK_EFI_IFR_SUPPRESS_IF_OP 0x0A 38 #define EFI_IFR_END_FORM_OP 0x0B 39 #define EFI_IFR_HIDDEN_OP 0x0C 40 #define EFI_IFR_END_FORM_SET_OP 0x0D 41 #define FRAMEWORK_EFI_IFR_FORM_SET_OP 0x0E 42 #define FRAMEWORK_EFI_IFR_REF_OP 0x0F 43 #define EFI_IFR_END_ONE_OF_OP 0x10 44 #define FRAMEWORK_EFI_IFR_END_OP EFI_IFR_END_ONE_OF_OP 45 #define FRAMEWORK_EFI_IFR_INCONSISTENT_IF_OP 0x11 46 #define FRAMEWORK_EFI_IFR_EQ_ID_VAL_OP 0x12 47 #define FRAMEWORK_EFI_IFR_EQ_ID_ID_OP 0x13 48 #define FRAMEWORK_EFI_IFR_EQ_ID_LIST_OP 0x14 49 #define FRAMEWORK_EFI_IFR_AND_OP 0x15 50 #define FRAMEWORK_EFI_IFR_OR_OP 0x16 51 #define FRAMEWORK_EFI_IFR_NOT_OP 0x17 52 #define EFI_IFR_END_IF_OP 0x18 ///< For endif of inconsistentif, suppressif, grayoutif. 53 #define EFI_IFR_GRAYOUT_IF_OP 0x19 54 #define FRAMEWORK_EFI_IFR_DATE_OP 0x1A 55 #define FRAMEWORK_EFI_IFR_TIME_OP 0x1B 56 #define FRAMEWORK_EFI_IFR_STRING_OP 0x1C 57 #define EFI_IFR_LABEL_OP 0x1D 58 #define EFI_IFR_SAVE_DEFAULTS_OP 0x1E 59 #define EFI_IFR_RESTORE_DEFAULTS_OP 0x1F 60 #define EFI_IFR_BANNER_OP 0x20 61 #define EFI_IFR_INVENTORY_OP 0x21 62 #define EFI_IFR_EQ_VAR_VAL_OP 0x22 63 #define FRAMEWORK_EFI_IFR_ORDERED_LIST_OP 0x23 64 #define FRAMEWORK_EFI_IFR_VARSTORE_OP 0x24 65 #define EFI_IFR_VARSTORE_SELECT_OP 0x25 66 #define EFI_IFR_VARSTORE_SELECT_PAIR_OP 0x26 67 #define EFI_IFR_LAST_OPCODE EFI_IFR_VARSTORE_SELECT_PAIR_OP 68 #define EFI_IFR_OEM_OP 0xFE 69 #define EFI_IFR_NV_ACCESS_COMMAND 0xFF 70 71 // 72 // Define values for the flags fields in some VFR opcodes. These are 73 // bitmasks. 74 // 75 #define EFI_IFR_FLAG_DEFAULT 0x01 76 #define EFI_IFR_FLAG_MANUFACTURING 0x02 77 #define EFI_IFR_FLAG_INTERACTIVE 0x04 78 #define EFI_IFR_FLAG_NV_ACCESS 0x08 79 #define EFI_IFR_FLAG_RESET_REQUIRED 0x10 80 #define EFI_IFR_FLAG_LATE_CHECK 0x20 81 82 #define EFI_NON_DEVICE_CLASS 0x00 ///< Useful when you do not want something in the Device Manager. 83 #define EFI_DISK_DEVICE_CLASS 0x01 84 #define EFI_VIDEO_DEVICE_CLASS 0x02 85 #define EFI_NETWORK_DEVICE_CLASS 0x04 86 #define EFI_INPUT_DEVICE_CLASS 0x08 87 #define EFI_ON_BOARD_DEVICE_CLASS 0x10 88 #define EFI_OTHER_DEVICE_CLASS 0x20 89 90 #define EFI_SETUP_APPLICATION_SUBCLASS 0x00 91 #define EFI_GENERAL_APPLICATION_SUBCLASS 0x01 92 #define EFI_FRONT_PAGE_SUBCLASS 0x02 93 #define EFI_SINGLE_USE_SUBCLASS 0x03 ///< Used to display a single entity ,and then exit. 94 95 /// 96 /// Used to flag dynamically created op-codes. This is meaningful to the IFR Library set 97 /// and the browser because we need to distinguish between compiled NV map data and created data. 98 /// We do not allow new entries to be created in the NV map dynamically, but we do need 99 /// to display this information correctly. To dynamically create op-codes and assume that their 100 /// data will be saved, ensure that the NV starting location they refer to is pre-defined in the 101 /// NV map. 102 /// 103 #define EFI_IFR_FLAG_CREATED 128 104 105 106 #pragma pack(1) 107 // 108 // IFR Structure definitions 109 // 110 typedef struct { 111 UINT8 OpCode; 112 UINT8 Length; 113 } FRAMEWORK_EFI_IFR_OP_HEADER; 114 115 typedef struct { 116 FRAMEWORK_EFI_IFR_OP_HEADER Header; 117 EFI_GUID Guid; 118 STRING_REF FormSetTitle; 119 STRING_REF Help; 120 EFI_PHYSICAL_ADDRESS CallbackHandle; 121 UINT16 Class; 122 UINT16 SubClass; 123 UINT16 NvDataSize; ///< Set once; the size of the NV data as defined in the script. 124 } FRAMEWORK_EFI_IFR_FORM_SET; 125 126 typedef struct { 127 FRAMEWORK_EFI_IFR_OP_HEADER Header; 128 UINT16 FormId; 129 STRING_REF FormTitle; 130 } FRAMEWORK_EFI_IFR_FORM; 131 132 typedef struct { 133 FRAMEWORK_EFI_IFR_OP_HEADER Header; 134 UINT16 LabelId; 135 } EFI_IFR_LABEL; 136 137 typedef struct { 138 FRAMEWORK_EFI_IFR_OP_HEADER Header; 139 STRING_REF SubTitle; 140 } FRAMEWORK_EFI_IFR_SUBTITLE; 141 142 typedef struct { 143 FRAMEWORK_EFI_IFR_OP_HEADER Header; 144 STRING_REF Help; 145 STRING_REF Text; 146 STRING_REF TextTwo; 147 UINT8 Flags; ///< This is included solely for purposes of interactive/dynamic support. 148 UINT16 Key; ///< The value to be passed to the caller to identify this particular op-code. 149 } FRAMEWORK_EFI_IFR_TEXT; 150 151 // 152 // goto 153 // 154 typedef struct { 155 FRAMEWORK_EFI_IFR_OP_HEADER Header; 156 UINT16 FormId; 157 STRING_REF Prompt; 158 STRING_REF Help; ///< The string Token for the context-help. 159 UINT8 Flags; ///< This is included solely for purposes of interactive/dynamic support. 160 UINT16 Key; ///< The value to be passed to the caller to identify this particular op-code. 161 } FRAMEWORK_EFI_IFR_REF; 162 163 typedef struct { 164 FRAMEWORK_EFI_IFR_OP_HEADER Header; 165 } EFI_IFR_END_FORM; 166 167 typedef struct { 168 FRAMEWORK_EFI_IFR_OP_HEADER Header; 169 } EFI_IFR_END_FORM_SET; 170 171 // 172 // Also notice that the IFR_ONE_OF and IFR_CHECK_BOX are identical in structure...... 173 // code assumes this to be true, if this ever changes we need to revisit the InitializeTagStructures code 174 // 175 typedef struct { 176 FRAMEWORK_EFI_IFR_OP_HEADER Header; 177 UINT16 QuestionId; ///< The ID designating what the question is about... 178 UINT8 Width; ///< The Size of the Data being saved. 179 STRING_REF Prompt; ///< The String Token for the Prompt. 180 STRING_REF Help; ///< The string Token for the context-help. 181 } FRAMEWORK_EFI_IFR_ONE_OF; 182 183 typedef struct { 184 FRAMEWORK_EFI_IFR_OP_HEADER Header; 185 UINT16 QuestionId; ///< The offset in NV for storage of the data. 186 UINT8 MaxEntries; ///< The maximum number of options in the ordered list (=size of NVStore). 187 STRING_REF Prompt; ///< The string token for the prompt. 188 STRING_REF Help; ///< The string token for the context-help. 189 } FRAMEWORK_EFI_IFR_ORDERED_LIST; 190 191 typedef struct { 192 FRAMEWORK_EFI_IFR_OP_HEADER Header; 193 UINT16 QuestionId; ///< The ID designating what the question is about... 194 UINT8 Width; ///< The Size of the Data being saved. 195 STRING_REF Prompt; ///< The String Token for the Prompt. 196 STRING_REF Help; ///< The string Token for the context-help. 197 UINT8 Flags; ///< If non-zero, it means that it is the default option. 198 UINT16 Key; ///< Value to be passed to caller to identify this particular op-code. 199 } FRAMEWORK_EFI_IFR_CHECKBOX, EFI_IFR_CHECK_BOX; 200 201 typedef struct { 202 FRAMEWORK_EFI_IFR_OP_HEADER Header; 203 STRING_REF Option; ///< The string token describing the option. 204 UINT16 Value; ///< The value associated with this option that is stored in the NVRAM. 205 UINT8 Flags; ///< If non-zero, it means that it is the default option. 206 UINT16 Key; ///< Value to be passed to caller to identify this particular op-code. 207 } FRAMEWORK_EFI_IFR_ONE_OF_OPTION; 208 209 typedef struct { 210 FRAMEWORK_EFI_IFR_OP_HEADER Header; 211 UINT16 QuestionId; ///< The ID designating what the question is about... 212 UINT8 Width; ///< The Size of the Data being saved. 213 STRING_REF Prompt; ///< The String Token for the Prompt. 214 STRING_REF Help; ///< The string Token for the context-help. 215 UINT8 Flags; ///< This is included solely for purposes of interactive/dynamic support. 216 UINT16 Key; ///< The value to be passed to caller to identify this particular op-code. 217 UINT16 Minimum; 218 UINT16 Maximum; 219 UINT16 Step; ///< Zero means manual input. Otherwise, arrow selection is called for. 220 UINT16 Default; 221 } FRAMEWORK_EFI_IFR_NUMERIC; 222 223 // 224 // There is an interesting twist with regards to Time and Date. This is one of the few items which can accept input 225 // from a user, and may or may not need to use storage in the NVRAM space. The decided method for determining 226 // if NVRAM space will be used (only for a TimeOp or DateOp) is: If .QuestionId == 0 && .Width == 0 (normally an 227 // impossibility) then use system resources to store the data away and not NV resources. In other words, the setup 228 // engine will call gRT->SetTime, and gRT->SetDate for the saving of data, and the values displayed will be from the 229 // gRT->GetXXXX series of calls. 230 // 231 typedef struct { 232 FRAMEWORK_EFI_IFR_NUMERIC Hour; 233 FRAMEWORK_EFI_IFR_NUMERIC Minute; 234 FRAMEWORK_EFI_IFR_NUMERIC Second; 235 } FRAMEWORK_EFI_IFR_TIME; 236 237 typedef struct { 238 FRAMEWORK_EFI_IFR_NUMERIC Year; 239 FRAMEWORK_EFI_IFR_NUMERIC Month; 240 FRAMEWORK_EFI_IFR_NUMERIC Day; 241 } FRAMEWORK_EFI_IFR_DATE; 242 243 typedef struct { 244 FRAMEWORK_EFI_IFR_OP_HEADER Header; 245 UINT16 QuestionId;///< The ID designating what the question is about... 246 UINT8 Width; ///< The Size of the Data being saved. 247 STRING_REF Prompt; ///< The String Token for the Prompt. 248 STRING_REF Help; ///< The string Token for the context-help. 249 UINT8 Flags; ///< This is included solely for purposes of interactive/dynamic support. 250 UINT16 Key; ///< The value to be passed to caller to identify this particular op-code. 251 UINT8 MinSize; ///< Minimum allowable sized password. 252 UINT8 MaxSize; ///< Maximum allowable sized password. 253 UINT16 Encoding; 254 } FRAMEWORK_EFI_IFR_PASSWORD; 255 256 typedef struct { 257 FRAMEWORK_EFI_IFR_OP_HEADER Header; 258 UINT16 QuestionId; ///< The ID designating what the question is about... 259 UINT8 Width; ///< The Size of the Data being saved. 260 STRING_REF Prompt; ///< The String Token for the Prompt. 261 STRING_REF Help; ///< The string Token for the context-help. 262 UINT8 Flags; ///< This is included solely for purposes of interactive/dynamic support. 263 UINT16 Key; ///< The value to be passed to caller to identify this particular op-code. 264 UINT8 MinSize; ///< Minimum allowable sized password. 265 UINT8 MaxSize; ///< Maximum allowable sized password. 266 } FRAMEWORK_EFI_IFR_STRING; 267 268 typedef struct { 269 FRAMEWORK_EFI_IFR_OP_HEADER Header; 270 } EFI_IFR_END_ONE_OF; 271 272 typedef struct { 273 FRAMEWORK_EFI_IFR_OP_HEADER Header; 274 UINT16 Value; 275 UINT16 Key; 276 } EFI_IFR_HIDDEN; 277 278 /// 279 /// Inconsistent with specification here: 280 /// The following defintion may not comply with Framework Specification HII 0.92. To 281 /// keep the inconsistant is for implementation needed. 282 ///@{ 283 typedef struct { 284 FRAMEWORK_EFI_IFR_OP_HEADER Header; 285 UINT8 Flags; 286 } EFI_IFR_SUPPRESS; 287 288 typedef struct { 289 FRAMEWORK_EFI_IFR_OP_HEADER Header; 290 UINT8 Flags; 291 } EFI_IFR_GRAY_OUT; 292 293 typedef struct { 294 FRAMEWORK_EFI_IFR_OP_HEADER Header; 295 STRING_REF Popup; 296 UINT8 Flags; 297 } EFI_IFR_INCONSISTENT; 298 299 typedef struct { 300 FRAMEWORK_EFI_IFR_OP_HEADER Header; 301 UINT16 QuestionId; ///< The offset into variable storage. 302 UINT8 Width; ///< The size of variable storage. 303 UINT16 Value; ///< The value to compare against. 304 } FRAMEWORK_EFI_IFR_EQ_ID_VAL; 305 306 typedef struct { 307 FRAMEWORK_EFI_IFR_OP_HEADER Header; 308 UINT16 QuestionId; ///< The offset into variable storage. 309 UINT8 Width; ///< The size of variable storage. 310 UINT16 ListLength; 311 UINT16 ValueList[1]; 312 } FRAMEWORK_EFI_IFR_EQ_ID_LIST; 313 314 typedef struct { 315 FRAMEWORK_EFI_IFR_OP_HEADER Header; 316 UINT16 QuestionId1; ///< The offset into variable storage for first value to compare. 317 UINT8 Width; ///< The size of variable storage (must be same for both). 318 UINT16 QuestionId2; ///< The offset into variable storage for second value to compare. 319 } FRAMEWORK_EFI_IFR_EQ_ID_ID; 320 321 typedef struct { 322 FRAMEWORK_EFI_IFR_OP_HEADER Header; 323 UINT16 VariableId; ///< The offset into variable storage. 324 UINT16 Value; ///< The value to compare against. 325 } EFI_IFR_EQ_VAR_VAL; 326 ///@} 327 328 typedef struct { 329 FRAMEWORK_EFI_IFR_OP_HEADER Header; 330 } FRAMEWORK_EFI_IFR_AND; 331 332 typedef struct { 333 FRAMEWORK_EFI_IFR_OP_HEADER Header; 334 } FRAMEWORK_EFI_IFR_OR; 335 336 typedef struct { 337 FRAMEWORK_EFI_IFR_OP_HEADER Header; 338 } FRAMEWORK_EFI_IFR_NOT; 339 340 typedef struct { 341 FRAMEWORK_EFI_IFR_OP_HEADER Header; 342 } EFI_IFR_END_EXPR, EFI_IFR_END_IF; 343 344 typedef struct { 345 FRAMEWORK_EFI_IFR_OP_HEADER Header; 346 UINT16 FormId; 347 STRING_REF Prompt; 348 STRING_REF Help; 349 UINT8 Flags; 350 UINT16 Key; 351 } EFI_IFR_SAVE_DEFAULTS; 352 353 typedef struct { 354 FRAMEWORK_EFI_IFR_OP_HEADER Header; 355 STRING_REF Help; 356 STRING_REF Text; 357 STRING_REF TextTwo; ///< Optional text. 358 } EFI_IFR_INVENTORY; 359 360 typedef struct { 361 FRAMEWORK_EFI_IFR_OP_HEADER Header; 362 EFI_GUID Guid; ///< GUID for the variable. 363 UINT16 VarId; ///< The variable store ID, as referenced elsewhere in the form. 364 UINT16 Size; ///< The size of the variable storage. 365 } FRAMEWORK_EFI_IFR_VARSTORE; 366 367 typedef struct { 368 FRAMEWORK_EFI_IFR_OP_HEADER Header; 369 UINT16 VarId; ///< The variable store ID, as referenced elsewhere in the form. 370 } EFI_IFR_VARSTORE_SELECT; 371 372 /// 373 /// Used for the ideqid VFR statement where two variable stores may be referenced in the 374 /// same VFR statement. 375 /// A browser should treat this as an FRAMEWORK_EFI_IFR_VARSTORE_SELECT statement and assume that all following 376 /// IFR opcodes use the VarId as defined here. 377 /// 378 typedef struct { 379 FRAMEWORK_EFI_IFR_OP_HEADER Header; 380 UINT16 VarId; ///< The variable store ID, as referenced elsewhere in the form. 381 UINT16 SecondaryVarId; ///< The variable store ID, as referenced elsewhere in the form. 382 } EFI_IFR_VARSTORE_SELECT_PAIR; 383 384 /// 385 /// Save defaults and restore defaults have same structure. 386 /// 387 #define EFI_IFR_RESTORE_DEFAULTS EFI_IFR_SAVE_DEFAULTS 388 389 typedef struct { 390 FRAMEWORK_EFI_IFR_OP_HEADER Header; 391 STRING_REF Title; ///< The string token for the banner title. 392 UINT16 LineNumber; ///< 1-based line number. 393 UINT8 Alignment; ///< Left, center, or right-aligned. 394 } EFI_IFR_BANNER; 395 396 #define EFI_IFR_BANNER_ALIGN_LEFT 0 397 #define EFI_IFR_BANNER_ALIGN_CENTER 1 398 #define EFI_IFR_BANNER_ALIGN_RIGHT 2 399 #define EFI_IFR_BANNER_TIMEOUT 0xFF 400 401 #pragma pack() 402 403 #endif 404