2 This file contains functions related to Config Access Protocols installed by
3 by HII Thunk Modules which is used to thunk UEFI Config Access Callback to
4 Framework HII Callback.
6 Copyright (c) 2008, Intel Corporation
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
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.
17 #include "HiiDatabase.h"
19 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE ConfigAccessProtocolInstanceTempate
= {
20 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE
,
25 }, //ConfigAccessProtocol
26 NULL
, //FrameworkFormCallbackProtocol
27 {NULL
, NULL
} //ConfigAccessStorageListHead
30 EFI_HII_PACKAGE_HEADER
*
32 IN CONST EFI_HII_PACKAGES
*Packages
35 TIANO_AUTOGEN_PACKAGES_HEADER
**TianoAutogenPackageHdrArray
;
36 EFI_HII_PACKAGE_HEADER
*IfrPackage
;
39 ASSERT (Packages
!= NULL
);
43 TianoAutogenPackageHdrArray
= (TIANO_AUTOGEN_PACKAGES_HEADER
**) (((UINT8
*) &Packages
->GuidId
) + sizeof (Packages
->GuidId
));
44 for (Index
= 0; Index
< Packages
->NumberOfPackages
; Index
++) {
46 // BugBug: The current UEFI HII build tool generate a binary in the format defined in:
47 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in
48 // this binary is with same package type. So the returned IfrPackNum and StringPackNum
49 // may not be the exact number of valid package number in the binary generated
52 switch (TianoAutogenPackageHdrArray
[Index
]->PackageHeader
.Type
) {
53 case EFI_HII_PACKAGE_FORM
:
54 return &TianoAutogenPackageHdrArray
[Index
]->PackageHeader
;
57 case EFI_HII_PACKAGE_STRINGS
:
58 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
62 // The following fonts are invalid for a module that using Framework to UEFI thunk layer.
64 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
65 case EFI_HII_PACKAGE_FONTS
:
66 case EFI_HII_PACKAGE_IMAGES
:
73 return (EFI_HII_PACKAGE_HEADER
*) NULL
;
78 IN CONST EFI_HII_PACKAGE_HEADER
*FormSetPackage
,
79 OUT LIST_ENTRY
*BufferStorageListHead
86 EFI_IFR_VARSTORE
*VarStoreOpCode
;
87 HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
;
89 OpCodeOffset
= sizeof (EFI_HII_PACKAGE_HEADER
);
90 while (OpCodeOffset
< FormSetPackage
->Length
) {
91 OpCodeData
= (UINT8
*) FormSetPackage
+ OpCodeOffset
;
93 OpCodeLength
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
94 OpCodeOffset
+= OpCodeLength
;
95 Operand
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
;
97 if (Operand
== EFI_IFR_VARSTORE_OP
) {
98 VarStoreOpCode
= (EFI_IFR_VARSTORE
*)OpCodeData
;
99 BufferStorageKey
= AllocateZeroPool (sizeof (*BufferStorageKey
));
100 if (BufferStorageKey
== NULL
) {
101 return EFI_OUT_OF_RESOURCES
;
103 CopyMem (&BufferStorageKey
->Guid
, &VarStoreOpCode
->Guid
, sizeof (EFI_GUID
));
105 BufferStorageKey
->Name
= AllocateZeroPool (AsciiStrSize (VarStoreOpCode
->Name
) * 2);
106 AsciiStrToUnicodeStr (VarStoreOpCode
->Name
, BufferStorageKey
->Name
);
108 BufferStorageKey
->VarStoreId
= VarStoreOpCode
->VarStoreId
;
110 BufferStorageKey
->Size
= VarStoreOpCode
->Size
;
111 BufferStorageKey
->Signature
= HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE
;
113 InsertTailList (BufferStorageListHead
, &BufferStorageKey
->List
);
121 InstallDefaultUefiConfigAccessProtocol (
122 IN CONST EFI_HII_PACKAGES
*Packages
,
123 IN OUT HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*MapEntry
126 EFI_HII_PACKAGE_HEADER
*FormSetPackage
;
128 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE
*ConfigAccessInstance
;
130 Status
= HiiLibCreateHiiDriverHandle (&MapEntry
->UefiHiiDriverHandle
);
131 ConfigAccessInstance
= AllocateCopyPool (
132 sizeof (HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE
),
133 &ConfigAccessProtocolInstanceTempate
135 InitializeListHead (&ConfigAccessInstance
->ConfigAccessBufferStorageListHead
);
138 // We assume there is only one formset package in each Forms Package
140 FormSetPackage
= GetIfrFormSet (Packages
);
141 Status
= GetBufferStorage (FormSetPackage
, &ConfigAccessInstance
->ConfigAccessBufferStorageListHead
);
142 if (EFI_ERROR (Status
)) {
143 FreePool (ConfigAccessInstance
);
148 Status
= gBS
->InstallMultipleProtocolInterfaces (
149 &MapEntry
->UefiHiiDriverHandle
,
150 &gEfiHiiConfigAccessProtocolGuid
,
151 &ConfigAccessInstance
->ConfigAccessProtocol
,
154 ASSERT_EFI_ERROR (Status
);
155 if (EFI_ERROR (Status
)) {
156 FreePool (ConfigAccessInstance
);
164 RouteConfigToFrameworkFormCallBack (
165 IN HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
,
166 IN EFI_FORM_CALLBACK_PROTOCOL
*FrameworkFormCallBack
,
172 BOOLEAN ResetRequired
;
174 Status
= FrameworkFormCallBack
->NvWrite (
175 FrameworkFormCallBack
,
176 BufferStorageKey
->Name
,
177 &BufferStorageKey
->Guid
,
178 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
187 ExtractConfigFromFrameworkFormCallBack (
188 IN HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
,
189 IN EFI_FORM_CALLBACK_PROTOCOL
*FrameworkFormCallBack
,
199 Status
= FrameworkFormCallBack
->NvRead (
200 FrameworkFormCallBack
,
201 BufferStorageKey
->Name
,
202 &BufferStorageKey
->Guid
,
207 if (Status
== EFI_BUFFER_TOO_SMALL
) {
208 if (BufferStorageKey
->Size
!= *DataSize
) {
210 return EFI_INVALID_PARAMETER
;
213 *Data
= AllocateZeroPool (*DataSize
);
215 return EFI_OUT_OF_RESOURCES
;
218 FrameworkFormCallBack
->NvRead (
219 FrameworkFormCallBack
,
220 BufferStorageKey
->Name
,
221 &BufferStorageKey
->Guid
,
232 RouteConfigToUefiVariable (
233 IN HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
,
238 return gRT
->SetVariable (
239 BufferStorageKey
->Name
,
240 &BufferStorageKey
->Guid
,
241 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
248 ExtractConfigFromUefiVariable (
249 IN HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
,
258 Status
= gRT
->GetVariable (
259 BufferStorageKey
->Name
,
260 &BufferStorageKey
->Guid
,
265 if (Status
== EFI_BUFFER_TOO_SMALL
) {
267 if (BufferStorageKey
->Size
!= *DataSize
) {
269 return EFI_INVALID_PARAMETER
;
272 *Data
= AllocateZeroPool (*DataSize
);
274 return EFI_OUT_OF_RESOURCES
;
277 Status
= gRT
->GetVariable (
278 BufferStorageKey
->Name
,
279 &BufferStorageKey
->Guid
,
293 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
294 IN CONST EFI_STRING Request
,
295 OUT EFI_STRING
*Progress
,
296 OUT EFI_STRING
*Results
300 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE
*ConfigaAccessInstance
;
301 LIST_ENTRY
*ListEntry
;
302 HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
;
307 ConfigaAccessInstance
= HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This
);
309 ListEntry
= GetFirstNode (&ConfigaAccessInstance
->ConfigAccessBufferStorageListHead
);
310 if (ListEntry
== NULL
) {
312 return EFI_INVALID_PARAMETER
;
315 BufferStorageKey
= HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry
);
317 if (ConfigaAccessInstance
->FrameworkFormCallbackProtocol
== NULL
||
318 ConfigaAccessInstance
->FrameworkFormCallbackProtocol
->NvRead
== NULL
) {
319 Status
= ExtractConfigFromUefiVariable (
325 Status
= ExtractConfigFromFrameworkFormCallBack (
327 ConfigaAccessInstance
->FrameworkFormCallbackProtocol
,
333 if (!EFI_ERROR (Status
)) {
334 Status
= mHiiConfigRoutingProtocol
->BlockToConfig (
335 mHiiConfigRoutingProtocol
,
352 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
353 IN CONST EFI_STRING Configuration
,
354 OUT EFI_STRING
*Progress
358 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE
*ConfigaAccessInstance
;
359 LIST_ENTRY
*ListEntry
;
360 HII_TRHUNK_BUFFER_STORAGE_KEY
*BufferStorageKey
;
363 UINTN LastModifiedByteIndex
;
366 ConfigaAccessInstance
= HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This
);
368 ListEntry
= GetFirstNode (&ConfigaAccessInstance
->ConfigAccessBufferStorageListHead
);
369 if (ListEntry
== NULL
) {
371 return EFI_INVALID_PARAMETER
;
374 BufferStorageKey
= HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry
);
376 Data
= AllocateZeroPool (BufferStorageKey
->Size
);
378 return EFI_OUT_OF_RESOURCES
;
380 Status
= mHiiConfigRoutingProtocol
->ConfigToBlock (
381 mHiiConfigRoutingProtocol
,
384 &LastModifiedByteIndex
,
388 if (EFI_ERROR (Status
)) {
392 DataSize
= BufferStorageKey
->Size
;
393 if (ConfigaAccessInstance
->FrameworkFormCallbackProtocol
== NULL
||
394 ConfigaAccessInstance
->FrameworkFormCallbackProtocol
->NvRead
== NULL
) {
395 Status
= RouteConfigToUefiVariable (
401 Status
= RouteConfigToFrameworkFormCallBack (
403 ConfigaAccessInstance
->FrameworkFormCallbackProtocol
,
417 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
418 IN EFI_BROWSER_ACTION Action
,
419 IN EFI_QUESTION_ID QuestionId
,
421 IN EFI_IFR_TYPE_VALUE
*Value
,
422 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
426 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE
*ConfigaAccessInstance
;
427 EFI_FORM_CALLBACK_PROTOCOL
*FrameworkFormCallbackProtocol
;
428 EFI_HII_CALLBACK_PACKET
*Packet
;
429 FRAMEWORK_EFI_IFR_DATA_ARRAY Data
;
430 FRAMEWORK_EFI_IFR_DATA_ENTRY
*DataEntry
;
431 EFI_FORM_CALLBACK Callback
;
433 ASSERT (This
!= NULL
);
434 ASSERT (Value
!= NULL
);
435 ASSERT (ActionRequest
!= NULL
);
437 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_NONE
;
439 ConfigaAccessInstance
= HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This
);
441 FrameworkFormCallbackProtocol
= ConfigaAccessInstance
->FrameworkFormCallbackProtocol
;
442 if (FrameworkFormCallbackProtocol
== NULL
) {
443 return EFI_UNSUPPORTED
;
445 Callback
= FrameworkFormCallbackProtocol
->Callback
;
448 FrameworkFormCallbackProtocol
,
455 // Callback require browser to perform action
457 if (Packet
!= NULL
) {
458 if (Packet
->DataArray
.EntryCount
== 1 && Packet
->DataArray
.NvRamMap
== NULL
) {
459 DataEntry
= (FRAMEWORK_EFI_IFR_DATA_ENTRY
*) ((UINT8
*) Packet
+ sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY
));
460 switch (DataEntry
->Flags
) {
462 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
465 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_SUBMIT
;
468 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_RESET
;
471 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_NONE
;