RedfishPkg/RedfishPlatformConfigDxe: Config language searching optimization
Build up the x-uefi-redfish string database for the Redfish confg language searching, instead of using HII String protocol. This can improve the time consumption lot on searching strings. Signed-off-by: Abner Chang <abner.chang@amd.com> Co-authored-by: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> Reviewed-by: Nickle Wang <nicklew@nvidia.com> Reviewed-by: Igor Kulchytskyy <igork@ami.com>
This commit is contained in:
parent
b387114113
commit
29114fc574
|
@ -2,7 +2,8 @@
|
||||||
The implementation of EDKII Redfish Platform Config Protocol.
|
The implementation of EDKII Redfish Platform Config Protocol.
|
||||||
|
|
||||||
(C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
|
(C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
|
||||||
Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
|
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
@ -928,6 +929,10 @@ HiiStringToOneOfOptionValue (
|
||||||
Option = HII_QUESTION_OPTION_FROM_LINK (Link);
|
Option = HII_QUESTION_OPTION_FROM_LINK (Link);
|
||||||
|
|
||||||
TmpString = HiiGetRedfishString (Statement->ParentForm->ParentFormset->HiiHandle, Schema, Option->Text);
|
TmpString = HiiGetRedfishString (Statement->ParentForm->ParentFormset->HiiHandle, Schema, Option->Text);
|
||||||
|
if (TmpString == NULL) {
|
||||||
|
TmpString = HiiGetRedfishString (Statement->ParentForm->ParentFormset->HiiHandle, ENGLISH_LANGUAGE_CODE, Option->Text);
|
||||||
|
}
|
||||||
|
|
||||||
if (TmpString != NULL) {
|
if (TmpString != NULL) {
|
||||||
if (StrCmp (TmpString, HiiString) == 0) {
|
if (StrCmp (TmpString, HiiString) == 0) {
|
||||||
CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));
|
CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE));
|
||||||
|
@ -1227,6 +1232,10 @@ HiiStringToOrderedListOptionValue (
|
||||||
Option = HII_QUESTION_OPTION_FROM_LINK (Link);
|
Option = HII_QUESTION_OPTION_FROM_LINK (Link);
|
||||||
|
|
||||||
TmpString = HiiGetRedfishString (Statement->ParentForm->ParentFormset->HiiHandle, Schema, Option->Text);
|
TmpString = HiiGetRedfishString (Statement->ParentForm->ParentFormset->HiiHandle, Schema, Option->Text);
|
||||||
|
if (TmpString == NULL) {
|
||||||
|
TmpString = HiiGetRedfishString (Statement->ParentForm->ParentFormset->HiiHandle, ENGLISH_LANGUAGE_CODE, Option->Text);
|
||||||
|
}
|
||||||
|
|
||||||
if (TmpString != NULL) {
|
if (TmpString != NULL) {
|
||||||
if (StrCmp (TmpString, HiiString) == 0) {
|
if (StrCmp (TmpString, HiiString) == 0) {
|
||||||
*Value = ExtendHiiValueToU64 (&Option->Value);
|
*Value = ExtendHiiValueToU64 (&Option->Value);
|
||||||
|
@ -1491,7 +1500,7 @@ StrToAsciiStr (
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
StringLen = StrLen (UnicodeString) + 1;
|
StringLen = HiiStrLen (UnicodeString) + 1;
|
||||||
Buffer = AllocatePool (StringLen * sizeof (CHAR8));
|
Buffer = AllocatePool (StringLen * sizeof (CHAR8));
|
||||||
if (Buffer == NULL) {
|
if (Buffer == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2000,7 +2009,6 @@ RedfishPlatformConfigProtocolGetConfigureLang (
|
||||||
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;
|
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList;
|
||||||
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
|
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef;
|
||||||
LIST_ENTRY *NextLink;
|
LIST_ENTRY *NextLink;
|
||||||
EFI_STRING TmpString;
|
|
||||||
EFI_STRING *TmpConfigureLangList;
|
EFI_STRING *TmpConfigureLangList;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
CHAR8 *FullSchema;
|
CHAR8 *FullSchema;
|
||||||
|
@ -2054,12 +2062,9 @@ RedfishPlatformConfigProtocolGetConfigureLang (
|
||||||
|
|
||||||
ASSERT (StatementRef->Statement->Description != 0);
|
ASSERT (StatementRef->Statement->Description != 0);
|
||||||
if (StatementRef->Statement->Description != 0) {
|
if (StatementRef->Statement->Description != 0) {
|
||||||
TmpString = HiiGetRedfishString (StatementRef->Statement->ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef->Statement->Description);
|
ASSERT (StatementRef->Statement->XuefiRedfishStr != NULL);
|
||||||
ASSERT (TmpString != NULL);
|
TmpConfigureLangList[Index] = AllocateCopyPool (HiiStrSize (StatementRef->Statement->XuefiRedfishStr), (VOID *)StatementRef->Statement->XuefiRedfishStr);
|
||||||
if (TmpString != NULL) {
|
++Index;
|
||||||
TmpConfigureLangList[Index] = TmpString;
|
|
||||||
++Index;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
(C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
|
(C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
|
||||||
Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
|
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
@ -143,6 +144,88 @@ DumpFormsetList (
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the HII string length. We don't check word alignment
|
||||||
|
of the input string as same as the checking in StrLen
|
||||||
|
function, because the HII string in the database is compact
|
||||||
|
at the byte alignment.
|
||||||
|
|
||||||
|
@param[in] String Input UCS format string.
|
||||||
|
|
||||||
|
@retval Length of the string.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
HiiStrLen (
|
||||||
|
IN CONST CHAR16 *String
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Length;
|
||||||
|
|
||||||
|
ASSERT (String != NULL);
|
||||||
|
|
||||||
|
for (Length = 0; *String != L'\0'; String++, Length++) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the HII string size. We don't check word alignment
|
||||||
|
of the input string as same as the checking in StrLen
|
||||||
|
function, because the HII string in the database is compact
|
||||||
|
at the byte alignment.
|
||||||
|
|
||||||
|
@param[in] String Input UCS format string.
|
||||||
|
|
||||||
|
@retval Size of the string.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
HiiStrSize (
|
||||||
|
IN CONST CHAR16 *String
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return (HiiStrLen (String) + 1) * sizeof (*String);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compare two HII strings. We don't check word alignment
|
||||||
|
of the input string as same as the checking in StrLen
|
||||||
|
function, because the HII string in the database is compact
|
||||||
|
at the byte alignment.
|
||||||
|
|
||||||
|
@param[in] FirstString Input UCS format of string to search.
|
||||||
|
@param[in] SecondString Input UCS format of string to look for in
|
||||||
|
FirstString;
|
||||||
|
|
||||||
|
@retval 0 The strings are identical.
|
||||||
|
!0 The strings are not identical.
|
||||||
|
|
||||||
|
**/
|
||||||
|
INTN
|
||||||
|
EFIAPI
|
||||||
|
HiiStrCmp (
|
||||||
|
IN CONST CHAR16 *FirstString,
|
||||||
|
IN CONST CHAR16 *SecondString
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// ASSERT both strings are less long than PcdMaximumUnicodeStringLength
|
||||||
|
//
|
||||||
|
ASSERT (HiiStrSize (FirstString) != 0);
|
||||||
|
ASSERT (HiiStrSize (SecondString) != 0);
|
||||||
|
|
||||||
|
while ((*FirstString != L'\0') && (*FirstString == *SecondString)) {
|
||||||
|
FirstString++;
|
||||||
|
SecondString++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *FirstString - *SecondString;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Delete a string from HII Package List by given HiiHandle.
|
Delete a string from HII Package List by given HiiHandle.
|
||||||
|
|
||||||
|
@ -301,28 +384,6 @@ HiiGetRedfishAsciiString (
|
||||||
return AsciiString;
|
return AsciiString;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Get string from HII database in English language. The returned string is allocated
|
|
||||||
using AllocatePool(). The caller is responsible for freeing the allocated buffer using
|
|
||||||
FreePool().
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get ASCII string from HII database in English language. The returned string is allocated
|
Get ASCII string from HII database in English language. The returned string is allocated
|
||||||
using AllocatePool(). The caller is responsible for freeing the allocated buffer using
|
using AllocatePool(). The caller is responsible for freeing the allocated buffer using
|
||||||
|
@ -562,7 +623,7 @@ GetStatementPrivateByConfigureLangRegex (
|
||||||
HiiStatementPrivate = REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
|
HiiStatementPrivate = REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink);
|
||||||
|
|
||||||
if ((HiiStatementPrivate->Description != 0) && !HiiStatementPrivate->Suppressed) {
|
if ((HiiStatementPrivate->Description != 0) && !HiiStatementPrivate->Suppressed) {
|
||||||
TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle, Schema, HiiStatementPrivate->Description);
|
TmpString = HiiStatementPrivate->XuefiRedfishStr;
|
||||||
if (TmpString != NULL) {
|
if (TmpString != NULL) {
|
||||||
Status = RegularExpressionProtocol->MatchString (
|
Status = RegularExpressionProtocol->MatchString (
|
||||||
RegularExpressionProtocol,
|
RegularExpressionProtocol,
|
||||||
|
@ -592,8 +653,9 @@ GetStatementPrivateByConfigureLangRegex (
|
||||||
InsertTailList (&StatementList->StatementList, &StatementRef->Link);
|
InsertTailList (&StatementList->StatementList, &StatementRef->Link);
|
||||||
++StatementList->Count;
|
++StatementList->Count;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
FreePool (TmpString);
|
DEBUG ((DEBUG_ERROR, "%a: HiiStatementPrivate->XuefiRedfishStr is NULL, x-uefi-string has something wrong.\n", __func__));
|
||||||
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -676,14 +738,11 @@ GetStatementPrivateByConfigureLang (
|
||||||
);
|
);
|
||||||
|
|
||||||
if (HiiStatementPrivate->Description != 0) {
|
if (HiiStatementPrivate->Description != 0) {
|
||||||
TmpString = HiiGetRedfishString (HiiFormsetPrivate->HiiHandle, Schema, HiiStatementPrivate->Description);
|
TmpString = HiiStatementPrivate->XuefiRedfishStr;
|
||||||
if (TmpString != NULL) {
|
if (TmpString != NULL) {
|
||||||
if (StrCmp (TmpString, ConfigureLang) == 0) {
|
if (HiiStrCmp (TmpString, ConfigureLang) == 0) {
|
||||||
FreePool (TmpString);
|
|
||||||
return HiiStatementPrivate;
|
return HiiStatementPrivate;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (TmpString);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -741,10 +800,74 @@ GetFormsetPrivateByHiiHandle (
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Release x-uefi-string related information.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
|
||||||
|
@retval EFI_STATUS
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
ReleaseXuefiStringDatabase (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
|
||||||
|
)
|
||||||
|
{
|
||||||
|
REDFISH_X_UEFI_STRING_DATABASE *ThisDatabase;
|
||||||
|
REDFISH_X_UEFI_STRING_DATABASE *PreDatabase;
|
||||||
|
REDFISH_X_UEFI_STRINGS_ARRAY *ThisStringArray;
|
||||||
|
REDFISH_X_UEFI_STRINGS_ARRAY *PreStringArray;
|
||||||
|
BOOLEAN EndDatabase;
|
||||||
|
BOOLEAN EndArray;
|
||||||
|
|
||||||
|
if (FormsetPrivate->HiiPackageListHeader != NULL) {
|
||||||
|
FreePool (FormsetPrivate->HiiPackageListHeader);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk through x-uefi-redfish string database.
|
||||||
|
if (!IsListEmpty (&FormsetPrivate->XuefiRedfishStringDatabase)) {
|
||||||
|
EndDatabase = FALSE;
|
||||||
|
ThisDatabase = (REDFISH_X_UEFI_STRING_DATABASE *)GetFirstNode (&FormsetPrivate->XuefiRedfishStringDatabase);
|
||||||
|
while (!EndDatabase) {
|
||||||
|
// Walk through string arrays.
|
||||||
|
if (!IsListEmpty (&ThisDatabase->XuefiRedfishStringArrays)) {
|
||||||
|
EndArray = FALSE;
|
||||||
|
ThisStringArray = (REDFISH_X_UEFI_STRINGS_ARRAY *)GetFirstNode (&ThisDatabase->XuefiRedfishStringArrays);
|
||||||
|
while (!EndArray) {
|
||||||
|
// Remove this array
|
||||||
|
FreePool (ThisStringArray->ArrayEntryAddress);
|
||||||
|
EndArray = IsNodeAtEnd (&ThisDatabase->XuefiRedfishStringArrays, &ThisStringArray->NextArray);
|
||||||
|
PreStringArray = ThisStringArray;
|
||||||
|
if (!EndArray) {
|
||||||
|
ThisStringArray = (REDFISH_X_UEFI_STRINGS_ARRAY *)GetNextNode (&ThisDatabase->XuefiRedfishStringArrays, &ThisStringArray->NextArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveEntryList (&PreStringArray->NextArray);
|
||||||
|
FreePool (PreStringArray);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove this database
|
||||||
|
//
|
||||||
|
EndDatabase = IsNodeAtEnd (&FormsetPrivate->XuefiRedfishStringDatabase, &ThisDatabase->NextXuefiRedfishLanguage);
|
||||||
|
PreDatabase = ThisDatabase;
|
||||||
|
if (!EndDatabase) {
|
||||||
|
ThisDatabase = (REDFISH_X_UEFI_STRING_DATABASE *)GetNextNode (&FormsetPrivate->XuefiRedfishStringDatabase, &ThisDatabase->NextXuefiRedfishLanguage);
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveEntryList (&PreDatabase->NextXuefiRedfishLanguage);
|
||||||
|
FreePool (PreDatabase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Release formset and all the forms and statements that belong to this formset.
|
Release formset and all the forms and statements that belong to this formset.
|
||||||
|
|
||||||
@param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
|
||||||
@retval EFI_STATUS
|
@retval EFI_STATUS
|
||||||
|
|
||||||
|
@ -779,12 +902,6 @@ ReleaseFormset (
|
||||||
//
|
//
|
||||||
// HiiStatementPrivate->HiiStatement will be released in DestroyFormSet().
|
// HiiStatementPrivate->HiiStatement will be released in DestroyFormSet().
|
||||||
//
|
//
|
||||||
|
|
||||||
if (HiiStatementPrivate->DesStringCache != NULL) {
|
|
||||||
FreePool (HiiStatementPrivate->DesStringCache);
|
|
||||||
HiiStatementPrivate->DesStringCache = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
RemoveEntryList (&HiiStatementPrivate->Link);
|
RemoveEntryList (&HiiStatementPrivate->Link);
|
||||||
FreePool (HiiStatementPrivate);
|
FreePool (HiiStatementPrivate);
|
||||||
HiiStatementLink = HiiNextStatementLink;
|
HiiStatementLink = HiiNextStatementLink;
|
||||||
|
@ -821,6 +938,8 @@ ReleaseFormset (
|
||||||
FormsetPrivate->SupportedSchema.Count = 0;
|
FormsetPrivate->SupportedSchema.Count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReleaseXuefiStringDatabase (FormsetPrivate);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,17 +965,606 @@ NewFormsetPrivate (
|
||||||
// Initial newly created formset private data.
|
// Initial newly created formset private data.
|
||||||
//
|
//
|
||||||
InitializeListHead (&NewFormsetPrivate->HiiFormList);
|
InitializeListHead (&NewFormsetPrivate->HiiFormList);
|
||||||
|
InitializeListHead (&NewFormsetPrivate->XuefiRedfishStringDatabase);
|
||||||
|
|
||||||
return NewFormsetPrivate;
|
return NewFormsetPrivate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create new x-uefi-redfish string array.
|
||||||
|
|
||||||
|
@param[in] XuefiRedfishStringDatabase The x-uefi-redfish string database.
|
||||||
|
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory for creating a new array.
|
||||||
|
EFI_SUCCESS New array is created successfully.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
NewRedfishXuefiStringArray (
|
||||||
|
IN REDFISH_X_UEFI_STRING_DATABASE *XuefiRedfishStringDatabase
|
||||||
|
)
|
||||||
|
{
|
||||||
|
REDFISH_X_UEFI_STRINGS_ARRAY *ArrayAddress;
|
||||||
|
|
||||||
|
// Initial first REDFISH_X_UEFI_STRINGS_ARRAY memory.
|
||||||
|
ArrayAddress = (REDFISH_X_UEFI_STRINGS_ARRAY *)AllocateZeroPool (sizeof (REDFISH_X_UEFI_STRINGS_ARRAY));
|
||||||
|
if (ArrayAddress == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Failed to allocate REDFISH_X_UEFI_STRINGS_ARRAY.\n", __func__));
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitializeListHead (&ArrayAddress->NextArray);
|
||||||
|
|
||||||
|
// Allocate memory buffer for REDFISH_X_UEFI_STRINGS_ARRAY_ELEMENT elements.
|
||||||
|
ArrayAddress->ArrayEntryAddress = \
|
||||||
|
(REDFISH_X_UEFI_STRINGS_ARRAY_ELEMENT *)AllocateZeroPool (sizeof (REDFISH_X_UEFI_STRINGS_ARRAY_ELEMENT) * X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER);
|
||||||
|
if (ArrayAddress->ArrayEntryAddress == NULL) {
|
||||||
|
FreePool (ArrayAddress);
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Failed to allocate array for REDFISH_X_UEFI_STRINGS_ARRAY_ELEMENTs.\n", __func__));
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
XuefiRedfishStringDatabase->StringsArrayBlocks++;
|
||||||
|
InsertTailList (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays, &ArrayAddress->NextArray);
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the pointer of x-uefi-redfish database or create a new database.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
@param[in] HiiStringPackageHeader HII string package header.
|
||||||
|
|
||||||
|
@retval Pointer to REDFISH_X_UEFI_STRING_DATABASE.
|
||||||
|
If NULL, it fails to obtain x-uefi-redfish database.
|
||||||
|
|
||||||
|
**/
|
||||||
|
REDFISH_X_UEFI_STRING_DATABASE *
|
||||||
|
GetExitOrCreateXuefiStringDatabase (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate,
|
||||||
|
IN EFI_HII_STRING_PACKAGE_HDR *HiiStringPackageHeader
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
BOOLEAN CreateNewOne;
|
||||||
|
REDFISH_X_UEFI_STRING_DATABASE *XuefiRedfishStringDatabase;
|
||||||
|
|
||||||
|
DEBUG ((DEBUG_INFO, "%a: Entry\n", __func__));
|
||||||
|
|
||||||
|
CreateNewOne = TRUE;
|
||||||
|
XuefiRedfishStringDatabase = NULL;
|
||||||
|
if (!IsListEmpty (&FormsetPrivate->XuefiRedfishStringDatabase)) {
|
||||||
|
XuefiRedfishStringDatabase = (REDFISH_X_UEFI_STRING_DATABASE *)GetFirstNode (&FormsetPrivate->XuefiRedfishStringDatabase);
|
||||||
|
|
||||||
|
while (TRUE) {
|
||||||
|
if (AsciiStriCmp (XuefiRedfishStringDatabase->XuefiRedfishLanguage, HiiStringPackageHeader->Language) == 0) {
|
||||||
|
CreateNewOne = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsNodeAtEnd (&FormsetPrivate->XuefiRedfishStringDatabase, &XuefiRedfishStringDatabase->NextXuefiRedfishLanguage)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
XuefiRedfishStringDatabase = \
|
||||||
|
(REDFISH_X_UEFI_STRING_DATABASE *)GetNextNode (&FormsetPrivate->XuefiRedfishStringDatabase, &XuefiRedfishStringDatabase->NextXuefiRedfishLanguage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CreateNewOne) {
|
||||||
|
DEBUG ((REDFISH_PLATFORM_CONFIG_DEBUG, " Creating x-uefi-redfish (%a) string database...\n", HiiStringPackageHeader->Language));
|
||||||
|
XuefiRedfishStringDatabase = (REDFISH_X_UEFI_STRING_DATABASE *)AllocateZeroPool (sizeof (REDFISH_X_UEFI_STRING_DATABASE));
|
||||||
|
if (XuefiRedfishStringDatabase == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, " Failed to allocate REDFISH_X_UEFI_STRING_DATABASE.\n"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitializeListHead (&XuefiRedfishStringDatabase->NextXuefiRedfishLanguage);
|
||||||
|
InitializeListHead (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays);
|
||||||
|
XuefiRedfishStringDatabase->StringsArrayBlocks = 0;
|
||||||
|
XuefiRedfishStringDatabase->XuefiRedfishLanguage = HiiStringPackageHeader->Language;
|
||||||
|
|
||||||
|
Status = NewRedfishXuefiStringArray (XuefiRedfishStringDatabase);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
FreePool (XuefiRedfishStringDatabase);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG ((
|
||||||
|
REDFISH_PLATFORM_CONFIG_DEBUG,
|
||||||
|
" x-uefi-redfish (%a):\n String array is added to XuefiRedfishStringDatabase, total %d arrays now.\n",
|
||||||
|
XuefiRedfishStringDatabase->XuefiRedfishLanguage,
|
||||||
|
XuefiRedfishStringDatabase->StringsArrayBlocks
|
||||||
|
));
|
||||||
|
|
||||||
|
// Link string database to FormsetPrivate.
|
||||||
|
InsertTailList (&FormsetPrivate->XuefiRedfishStringDatabase, &XuefiRedfishStringDatabase->NextXuefiRedfishLanguage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return XuefiRedfishStringDatabase;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check and allocate a new x-uefi-redfish array if it is insufficient for the
|
||||||
|
newly added x-uefi-redfish string.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
@param[in] XuefiRedfishStringDatabase Pointer to the x-uefi-redfish database.
|
||||||
|
@param[in] StringId String ID added to database.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The size of x-uefi-string array is adjusted or
|
||||||
|
is not required to be adjusted.
|
||||||
|
Otherwise, refer to the error code returned from NewRedfishXuefiStringArray().
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
RedfishXuefiStringAdjustArrays (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate,
|
||||||
|
IN REDFISH_X_UEFI_STRING_DATABASE *XuefiRedfishStringDatabase,
|
||||||
|
IN EFI_STRING_ID StringId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
while (((StringId + X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER) / X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER) > (UINT16)XuefiRedfishStringDatabase->StringsArrayBlocks) {
|
||||||
|
Status = NewRedfishXuefiStringArray (XuefiRedfishStringDatabase);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Failed to adjust x-uefi-string array", __func__));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Insert a x-uefi-redfish string to database.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
@param[in] HiiStringPackageHeader Pointer to HII string package.
|
||||||
|
@param[in] StringId The HII string ID
|
||||||
|
@param[in] StringTextPtr Pointer to HII string text.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The HII string is added to database.
|
||||||
|
EFI_LOAD_ERROR Something wrong when insert an HII string
|
||||||
|
to database.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
RedfishXuefiStringInsertDatabase (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate,
|
||||||
|
IN EFI_HII_STRING_PACKAGE_HDR *HiiStringPackageHeader,
|
||||||
|
IN EFI_STRING_ID StringId,
|
||||||
|
IN CHAR16 *StringTextPtr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN StringIdOffset;
|
||||||
|
REDFISH_X_UEFI_STRING_DATABASE *XuefiRedfishStringDatabase;
|
||||||
|
REDFISH_X_UEFI_STRINGS_ARRAY *ThisArray;
|
||||||
|
|
||||||
|
XuefiRedfishStringDatabase = GetExitOrCreateXuefiStringDatabase (FormsetPrivate, HiiStringPackageHeader);
|
||||||
|
if (XuefiRedfishStringDatabase == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Failed to get REDFISH_X_UEFI_STRING_DATABASE of x-uefi-redfish language %a.\n", __func__, HiiStringPackageHeader->Language));
|
||||||
|
ReleaseXuefiStringDatabase (FormsetPrivate);
|
||||||
|
return EFI_LOAD_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = RedfishXuefiStringAdjustArrays (FormsetPrivate, XuefiRedfishStringDatabase, StringId);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Failed to adjust x-uefi-redfish string array.\n", __func__));
|
||||||
|
ReleaseXuefiStringDatabase (FormsetPrivate);
|
||||||
|
return EFI_LOAD_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert string to x-uefi-redfish string array.
|
||||||
|
StringIdOffset = (UINTN)StringId;
|
||||||
|
ThisArray = (REDFISH_X_UEFI_STRINGS_ARRAY *)GetFirstNode (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays);
|
||||||
|
while (StringIdOffset >= X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER) {
|
||||||
|
ThisArray = (REDFISH_X_UEFI_STRINGS_ARRAY *)GetNextNode (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays, &ThisArray->NextArray);
|
||||||
|
StringIdOffset -= X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert string
|
||||||
|
(ThisArray->ArrayEntryAddress + StringIdOffset)->StringId = StringId;
|
||||||
|
(ThisArray->ArrayEntryAddress + StringIdOffset)->UcsString = StringTextPtr;
|
||||||
|
|
||||||
|
DEBUG ((
|
||||||
|
REDFISH_PLATFORM_CONFIG_DEBUG,
|
||||||
|
" Insert string ID: (%d) to database\n x-uefi-string: \"%s\"\n Language: %a.\n",
|
||||||
|
StringId,
|
||||||
|
StringTextPtr,
|
||||||
|
HiiStringPackageHeader->Language
|
||||||
|
));
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get x-uefi-redfish string and language by string ID.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
@param[in] HiiStringPackageHeader HII string package header.
|
||||||
|
|
||||||
|
@retval TRUE x-uefi-redfish string and ID map is inserted to database.
|
||||||
|
FALSE Something is wrong when insert x-uefi-redfish string and ID map.
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
CreateXuefiLanguageStringIdMap (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate,
|
||||||
|
IN EFI_HII_STRING_PACKAGE_HDR *HiiStringPackageHeader
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT8 *BlockHdr;
|
||||||
|
EFI_STRING_ID CurrentStringId;
|
||||||
|
UINTN BlockSize;
|
||||||
|
UINTN Index;
|
||||||
|
UINT8 *StringTextPtr;
|
||||||
|
UINTN Offset;
|
||||||
|
UINT16 StringCount;
|
||||||
|
UINT16 SkipCount;
|
||||||
|
UINT8 Length8;
|
||||||
|
EFI_HII_SIBT_EXT2_BLOCK Ext2;
|
||||||
|
UINT32 Length32;
|
||||||
|
UINT8 *StringBlockInfo;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse the string blocks to get the string text and font.
|
||||||
|
//
|
||||||
|
StringBlockInfo = (UINT8 *)((UINTN)HiiStringPackageHeader + HiiStringPackageHeader->StringInfoOffset);
|
||||||
|
BlockHdr = StringBlockInfo;
|
||||||
|
BlockSize = 0;
|
||||||
|
Offset = 0;
|
||||||
|
CurrentStringId = 1;
|
||||||
|
while (*BlockHdr != EFI_HII_SIBT_END) {
|
||||||
|
switch (*BlockHdr) {
|
||||||
|
case EFI_HII_SIBT_STRING_SCSU:
|
||||||
|
Offset = sizeof (EFI_HII_STRING_BLOCK);
|
||||||
|
StringTextPtr = BlockHdr + Offset;
|
||||||
|
BlockSize += Offset + AsciiStrSize ((CHAR8 *)StringTextPtr);
|
||||||
|
CurrentStringId++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRING_SCSU_FONT:
|
||||||
|
Offset = sizeof (EFI_HII_SIBT_STRING_SCSU_FONT_BLOCK) - sizeof (UINT8);
|
||||||
|
StringTextPtr = BlockHdr + Offset;
|
||||||
|
BlockSize += Offset + AsciiStrSize ((CHAR8 *)StringTextPtr);
|
||||||
|
CurrentStringId++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRINGS_SCSU:
|
||||||
|
CopyMem (&StringCount, BlockHdr + sizeof (EFI_HII_STRING_BLOCK), sizeof (UINT16));
|
||||||
|
StringTextPtr = (UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_SIBT_STRINGS_SCSU_BLOCK) - sizeof (UINT8));
|
||||||
|
BlockSize += StringTextPtr - BlockHdr;
|
||||||
|
|
||||||
|
for (Index = 0; Index < StringCount; Index++) {
|
||||||
|
BlockSize += AsciiStrSize ((CHAR8 *)StringTextPtr);
|
||||||
|
StringTextPtr = StringTextPtr + AsciiStrSize ((CHAR8 *)StringTextPtr);
|
||||||
|
CurrentStringId++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRINGS_SCSU_FONT:
|
||||||
|
CopyMem (
|
||||||
|
&StringCount,
|
||||||
|
(UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_STRING_BLOCK) + sizeof (UINT8)),
|
||||||
|
sizeof (UINT16)
|
||||||
|
);
|
||||||
|
StringTextPtr = (UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_SIBT_STRINGS_SCSU_FONT_BLOCK) - sizeof (UINT8));
|
||||||
|
BlockSize += StringTextPtr - BlockHdr;
|
||||||
|
|
||||||
|
for (Index = 0; Index < StringCount; Index++) {
|
||||||
|
BlockSize += AsciiStrSize ((CHAR8 *)StringTextPtr);
|
||||||
|
StringTextPtr = StringTextPtr + AsciiStrSize ((CHAR8 *)StringTextPtr);
|
||||||
|
CurrentStringId++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRING_UCS2:
|
||||||
|
Offset = sizeof (EFI_HII_STRING_BLOCK);
|
||||||
|
StringTextPtr = BlockHdr + Offset;
|
||||||
|
|
||||||
|
// x-uefi-redfish string is always encoded as UCS and started with '/'.
|
||||||
|
if (*StringTextPtr == (UINT16)'/') {
|
||||||
|
Status = RedfishXuefiStringInsertDatabase (
|
||||||
|
FormsetPrivate,
|
||||||
|
HiiStringPackageHeader,
|
||||||
|
CurrentStringId,
|
||||||
|
(CHAR16 *)StringTextPtr
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Failed to insert x-uefi-redfish string %s.\n", __func__, StringTextPtr));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockSize += (Offset + HiiStrSize ((CHAR16 *)StringTextPtr));
|
||||||
|
CurrentStringId++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRING_UCS2_FONT:
|
||||||
|
Offset = sizeof (EFI_HII_SIBT_STRING_UCS2_FONT_BLOCK) - sizeof (CHAR16);
|
||||||
|
StringTextPtr = BlockHdr + Offset;
|
||||||
|
BlockSize += (Offset + HiiStrSize ((CHAR16 *)StringTextPtr));
|
||||||
|
CurrentStringId++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRINGS_UCS2:
|
||||||
|
Offset = sizeof (EFI_HII_SIBT_STRINGS_UCS2_BLOCK) - sizeof (CHAR16);
|
||||||
|
StringTextPtr = BlockHdr + Offset;
|
||||||
|
BlockSize += Offset;
|
||||||
|
CopyMem (&StringCount, BlockHdr + sizeof (EFI_HII_STRING_BLOCK), sizeof (UINT16));
|
||||||
|
for (Index = 0; Index < StringCount; Index++) {
|
||||||
|
BlockSize += HiiStrSize ((CHAR16 *)StringTextPtr);
|
||||||
|
StringTextPtr = StringTextPtr + HiiStrSize ((CHAR16 *)StringTextPtr);
|
||||||
|
CurrentStringId++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_STRINGS_UCS2_FONT:
|
||||||
|
Offset = sizeof (EFI_HII_SIBT_STRINGS_UCS2_FONT_BLOCK) - sizeof (CHAR16);
|
||||||
|
StringTextPtr = BlockHdr + Offset;
|
||||||
|
BlockSize += Offset;
|
||||||
|
CopyMem (
|
||||||
|
&StringCount,
|
||||||
|
(UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_STRING_BLOCK) + sizeof (UINT8)),
|
||||||
|
sizeof (UINT16)
|
||||||
|
);
|
||||||
|
for (Index = 0; Index < StringCount; Index++) {
|
||||||
|
BlockSize += HiiStrSize ((CHAR16 *)StringTextPtr);
|
||||||
|
StringTextPtr = StringTextPtr + HiiStrSize ((CHAR16 *)StringTextPtr);
|
||||||
|
CurrentStringId++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_DUPLICATE:
|
||||||
|
BlockSize += sizeof (EFI_HII_SIBT_DUPLICATE_BLOCK);
|
||||||
|
CurrentStringId++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_SKIP1:
|
||||||
|
SkipCount = (UINT16)(*(UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_STRING_BLOCK)));
|
||||||
|
CurrentStringId = (UINT16)(CurrentStringId + SkipCount);
|
||||||
|
BlockSize += sizeof (EFI_HII_SIBT_SKIP1_BLOCK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_SKIP2:
|
||||||
|
CopyMem (&SkipCount, BlockHdr + sizeof (EFI_HII_STRING_BLOCK), sizeof (UINT16));
|
||||||
|
CurrentStringId = (UINT16)(CurrentStringId + SkipCount);
|
||||||
|
BlockSize += sizeof (EFI_HII_SIBT_SKIP2_BLOCK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_EXT1:
|
||||||
|
CopyMem (
|
||||||
|
&Length8,
|
||||||
|
(UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_STRING_BLOCK) + sizeof (UINT8)),
|
||||||
|
sizeof (UINT8)
|
||||||
|
);
|
||||||
|
BlockSize += Length8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_EXT2:
|
||||||
|
CopyMem (&Ext2, BlockHdr, sizeof (EFI_HII_SIBT_EXT2_BLOCK));
|
||||||
|
BlockSize += Ext2.Length;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_HII_SIBT_EXT4:
|
||||||
|
CopyMem (
|
||||||
|
&Length32,
|
||||||
|
(UINT8 *)((UINTN)BlockHdr + sizeof (EFI_HII_STRING_BLOCK) + sizeof (UINT8)),
|
||||||
|
sizeof (UINT32)
|
||||||
|
);
|
||||||
|
|
||||||
|
BlockSize += Length32;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockHdr = (UINT8 *)(StringBlockInfo + BlockSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get x-uefi-redfish string and language by string ID.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
@param[in] StringId The HII string ID.
|
||||||
|
@param[out] String Optionally return USC string.
|
||||||
|
@param[out] Language Optionally return x-uefi-redfish language.
|
||||||
|
@param[out] XuefiStringDatabase Optionally return x-uefi-redfish database.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS String information is returned.
|
||||||
|
EFI_INVALID_PARAMETER One of the given parameters to this function is
|
||||||
|
invalid.
|
||||||
|
EFI_NOT_FOUND String is not found.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
GetXuefiStringAndLangByStringId (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate,
|
||||||
|
IN EFI_STRING_ID StringId,
|
||||||
|
OUT CHAR16 **String OPTIONAL,
|
||||||
|
OUT CHAR8 **Language OPTIONAL,
|
||||||
|
OUT REDFISH_X_UEFI_STRING_DATABASE **XuefiStringDatabase OPTIONAL
|
||||||
|
)
|
||||||
|
{
|
||||||
|
REDFISH_X_UEFI_STRING_DATABASE *XuefiRedfishStringDatabase;
|
||||||
|
REDFISH_X_UEFI_STRINGS_ARRAY *StringArray;
|
||||||
|
UINT16 StringIndex;
|
||||||
|
|
||||||
|
if ((String == NULL) && (Language == NULL) && (XuefiStringDatabase == NULL)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Invalid parameters for this function.\n", __func__));
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsListEmpty (&FormsetPrivate->XuefiRedfishStringDatabase)) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
XuefiRedfishStringDatabase = (REDFISH_X_UEFI_STRING_DATABASE *)GetFirstNode (&FormsetPrivate->XuefiRedfishStringDatabase);
|
||||||
|
while (TRUE) {
|
||||||
|
if (Language != NULL) {
|
||||||
|
*Language = XuefiRedfishStringDatabase->XuefiRedfishLanguage;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringArray = (REDFISH_X_UEFI_STRINGS_ARRAY *)GetFirstNode (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays);
|
||||||
|
|
||||||
|
// Loop to the correct string array.
|
||||||
|
StringIndex = StringId;
|
||||||
|
while (StringIndex >= X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER) {
|
||||||
|
if (IsNodeAtEnd (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays, &StringArray->NextArray)) {
|
||||||
|
goto ErrorEixt;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringArray = (REDFISH_X_UEFI_STRINGS_ARRAY *)GetNextNode (&XuefiRedfishStringDatabase->XuefiRedfishStringArrays, &StringArray->NextArray);
|
||||||
|
StringIndex -= X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: The string ID in the formset is a unique number.
|
||||||
|
// If the string in the array is NULL, then the matched string ID
|
||||||
|
// should be in another x-uefi-redfish database.
|
||||||
|
//
|
||||||
|
if ((StringArray->ArrayEntryAddress + StringIndex)->UcsString != NULL) {
|
||||||
|
//
|
||||||
|
// String ID is belong to this x-uef-redfish language database.
|
||||||
|
//
|
||||||
|
if (String != NULL) {
|
||||||
|
*String = (StringArray->ArrayEntryAddress + StringIndex)->UcsString;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (XuefiStringDatabase != NULL) {
|
||||||
|
*XuefiStringDatabase = XuefiRedfishStringDatabase;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsNodeAtEnd (&FormsetPrivate->XuefiRedfishStringDatabase, &XuefiRedfishStringDatabase->NextXuefiRedfishLanguage)) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
XuefiRedfishStringDatabase = (REDFISH_X_UEFI_STRING_DATABASE *)GetNextNode (
|
||||||
|
&FormsetPrivate->XuefiRedfishStringDatabase,
|
||||||
|
&XuefiRedfishStringDatabase->NextXuefiRedfishLanguage
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorEixt:;
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: String ID (%d) is not in any x-uef-redfish string databases.\n", __func__, StringId));
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Build a x-uefi-redfish database for the newly added x-uefi-redfish language.
|
||||||
|
|
||||||
|
@param[in] FormsetPrivate Pointer to HII form-set private instance.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
BuildXUefiRedfishStringDatabase (
|
||||||
|
IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN BufferSize;
|
||||||
|
EFI_HII_PACKAGE_HEADER *PackageHeader;
|
||||||
|
UINTN EndingPackageAddress;
|
||||||
|
EFI_HII_STRING_PACKAGE_HDR *HiiStringPackageHeader;
|
||||||
|
UINTN SupportedSchemaLangCount;
|
||||||
|
CHAR8 **SupportedSchemaLang;
|
||||||
|
BOOLEAN StringIdMapIsBuilt;
|
||||||
|
|
||||||
|
DEBUG ((DEBUG_INFO, "%a: Building x-uefi-redfish string database, HII Formset GUID - %g.\n", __func__, FormsetPrivate->Guid));
|
||||||
|
|
||||||
|
BufferSize = 0;
|
||||||
|
Status = mRedfishPlatformConfigPrivate->HiiDatabase->ExportPackageLists (
|
||||||
|
mRedfishPlatformConfigPrivate->HiiDatabase,
|
||||||
|
FormsetPrivate->HiiHandle,
|
||||||
|
&BufferSize,
|
||||||
|
FormsetPrivate->HiiPackageListHeader
|
||||||
|
);
|
||||||
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, " Failed to export package list.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FormsetPrivate->HiiPackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)AllocateZeroPool (BufferSize);
|
||||||
|
if (FormsetPrivate->HiiPackageListHeader == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, " Failed to allocate memory for the exported package list.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = mRedfishPlatformConfigPrivate->HiiDatabase->ExportPackageLists (
|
||||||
|
mRedfishPlatformConfigPrivate->HiiDatabase,
|
||||||
|
FormsetPrivate->HiiHandle,
|
||||||
|
&BufferSize,
|
||||||
|
FormsetPrivate->HiiPackageListHeader
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Finding the string package.
|
||||||
|
//
|
||||||
|
EndingPackageAddress = (UINTN)FormsetPrivate->HiiPackageListHeader + FormsetPrivate->HiiPackageListHeader->PackageLength;
|
||||||
|
PackageHeader = (EFI_HII_PACKAGE_HEADER *)(FormsetPrivate->HiiPackageListHeader + 1);
|
||||||
|
SupportedSchemaLang = FormsetPrivate->SupportedSchema.SchemaList;
|
||||||
|
while ((UINTN)PackageHeader < EndingPackageAddress) {
|
||||||
|
switch (PackageHeader->Type) {
|
||||||
|
case EFI_HII_PACKAGE_STRINGS:
|
||||||
|
StringIdMapIsBuilt = FALSE;
|
||||||
|
HiiStringPackageHeader = (EFI_HII_STRING_PACKAGE_HDR *)PackageHeader;
|
||||||
|
|
||||||
|
// Check if this is the string package for x-uefi-redfish
|
||||||
|
for (SupportedSchemaLangCount = 0;
|
||||||
|
SupportedSchemaLangCount < FormsetPrivate->SupportedSchema.Count;
|
||||||
|
SupportedSchemaLangCount++
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (AsciiStrnCmp (
|
||||||
|
*(SupportedSchemaLang + SupportedSchemaLangCount),
|
||||||
|
HiiStringPackageHeader->Language,
|
||||||
|
AsciiStrLen (HiiStringPackageHeader->Language)
|
||||||
|
) == 0)
|
||||||
|
{
|
||||||
|
StringIdMapIsBuilt = CreateXuefiLanguageStringIdMap (FormsetPrivate, HiiStringPackageHeader);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringIdMapIsBuilt == FALSE) {
|
||||||
|
if (AsciiStrStr (HiiStringPackageHeader->Language, X_UEFI_SCHEMA_PREFIX) == NULL) {
|
||||||
|
DEBUG ((REDFISH_PLATFORM_CONFIG_DEBUG, " No need to build x-uefi-redfish string ID map for HII language %a\n", HiiStringPackageHeader->Language));
|
||||||
|
} else {
|
||||||
|
DEBUG ((DEBUG_ERROR, " Failed to build x-uefi-redfish string ID map of HII language %a\n", HiiStringPackageHeader->Language));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
PackageHeader = (EFI_HII_PACKAGE_HEADER *)((UINTN)PackageHeader + PackageHeader->Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Load the HII formset from the given HII handle.
|
Load the HII formset from the given HII handle.
|
||||||
|
|
||||||
@param[in] HiiHandle Target HII handle to load.
|
@param[in] HiiHandle Target HII handle to load.
|
||||||
@param[out] FormsetPrivate The formset private data.
|
@param[out] FormsetPrivate The formset private data.
|
||||||
|
|
||||||
@retval EFI_STATUS
|
@retval EFI_STATUS The formset is loaded successfully.
|
||||||
|
@retval EFI_UNSUPPORTED This formset doesn't have any x-uefi-redfish configuration.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
|
@ -875,6 +1583,7 @@ LoadFormset (
|
||||||
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
|
REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *HiiStatementPrivate;
|
||||||
EFI_GUID ZeroGuid;
|
EFI_GUID ZeroGuid;
|
||||||
EXPRESS_RESULT ExpressionResult;
|
EXPRESS_RESULT ExpressionResult;
|
||||||
|
CHAR16 *String;
|
||||||
|
|
||||||
if ((HiiHandle == NULL) || (FormsetPrivate == NULL)) {
|
if ((HiiHandle == NULL) || (FormsetPrivate == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -882,6 +1591,7 @@ LoadFormset (
|
||||||
|
|
||||||
HiiFormSet = AllocateZeroPool (sizeof (HII_FORMSET));
|
HiiFormSet = AllocateZeroPool (sizeof (HII_FORMSET));
|
||||||
if (HiiFormSet == NULL) {
|
if (HiiFormSet == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: No memory resource for HII_FORMSET - %g\n", __func__, FormsetPrivate->Guid));
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -891,6 +1601,7 @@ LoadFormset (
|
||||||
ZeroMem (&ZeroGuid, sizeof (ZeroGuid));
|
ZeroMem (&ZeroGuid, sizeof (ZeroGuid));
|
||||||
Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);
|
Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet);
|
||||||
if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {
|
if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: Formset not found by HII handle - %g\n", __func__, FormsetPrivate->Guid));
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
|
@ -909,7 +1620,11 @@ LoadFormset (
|
||||||
FormsetPrivate->DevicePathStr = ConvertDevicePathToText (HiiFormSet->DevicePath, FALSE, FALSE);
|
FormsetPrivate->DevicePathStr = ConvertDevicePathToText (HiiFormSet->DevicePath, FALSE, FALSE);
|
||||||
Status = GetSupportedSchema (FormsetPrivate->HiiHandle, &FormsetPrivate->SupportedSchema);
|
Status = GetSupportedSchema (FormsetPrivate->HiiHandle, &FormsetPrivate->SupportedSchema);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((REDFISH_PLATFORM_CONFIG_DEBUG, "%a: No schema from HII handle: 0x%x found: %r\n", __func__, FormsetPrivate->HiiHandle, Status));
|
DEBUG ((REDFISH_PLATFORM_CONFIG_DEBUG, "%a: No x-uefi-redfish configuration found on the formset - %g\n", __func__, FormsetPrivate->Guid));
|
||||||
|
return EFI_UNSUPPORTED; // Can't build AttributeRegistry Meni path with returning EFI_UNSUPPORTED.
|
||||||
|
} else {
|
||||||
|
// Building x-uefi-redfish string database
|
||||||
|
BuildXUefiRedfishStringDatabase (FormsetPrivate);
|
||||||
}
|
}
|
||||||
|
|
||||||
HiiFormLink = GetFirstNode (&HiiFormSet->FormListHead);
|
HiiFormLink = GetFirstNode (&HiiFormSet->FormListHead);
|
||||||
|
@ -919,6 +1634,7 @@ LoadFormset (
|
||||||
HiiFormPrivate = AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_FORM_PRIVATE));
|
HiiFormPrivate = AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_FORM_PRIVATE));
|
||||||
if (HiiFormPrivate == NULL) {
|
if (HiiFormPrivate == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: No memory resource for REDFISH_PLATFORM_CONFIG_FORM_PRIVATE.\n", __func__));
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -944,6 +1660,7 @@ LoadFormset (
|
||||||
|
|
||||||
HiiStatementPrivate = AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE));
|
HiiStatementPrivate = AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE));
|
||||||
if (HiiStatementPrivate == NULL) {
|
if (HiiStatementPrivate == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: No memory resource for REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE.\n", __func__));
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
|
@ -981,10 +1698,18 @@ LoadFormset (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
// Get x-uefi-redfish string using String ID.
|
||||||
// Attach to statement list.
|
Status = GetXuefiStringAndLangByStringId (FormsetPrivate, HiiStatementPrivate->Description, &String, NULL, NULL);
|
||||||
//
|
if (!EFI_ERROR (Status)) {
|
||||||
InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate->Link);
|
HiiStatementPrivate->XuefiRedfishStr = String;
|
||||||
|
//
|
||||||
|
// Attach to statement list.
|
||||||
|
//
|
||||||
|
InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPrivate->Link);
|
||||||
|
} else {
|
||||||
|
FreePool (HiiStatementPrivate);
|
||||||
|
}
|
||||||
|
|
||||||
HiiStatementLink = GetNextNode (&HiiForm->StatementListHead, HiiStatementLink);
|
HiiStatementLink = GetNextNode (&HiiForm->StatementListHead, HiiStatementLink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1052,7 +1777,7 @@ LoadFormsetList (
|
||||||
//
|
//
|
||||||
Status = LoadFormset (HiiHandle, FormsetPrivate);
|
Status = LoadFormset (HiiHandle, FormsetPrivate);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "%a: failed to load formset: %r\n", __func__, Status));
|
DEBUG ((DEBUG_ERROR, "%a: Formset is not loaded for edk2 redfish: %r\n", __func__, Status));
|
||||||
FreePool (FormsetPrivate);
|
FreePool (FormsetPrivate);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -1325,7 +2050,11 @@ ProcessPendingList (
|
||||||
|
|
||||||
Status = LoadFormsetList (Target->HiiHandle, FormsetList);
|
Status = LoadFormsetList (Target->HiiHandle, FormsetList);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "%a: load formset from HII handle: 0x%x failed: %r\n", __func__, Target->HiiHandle, Status));
|
if (Status == EFI_UNSUPPORTED) {
|
||||||
|
DEBUG ((DEBUG_ERROR, " The formset has no x-uefi-redfish configurations.\n"));
|
||||||
|
} else {
|
||||||
|
DEBUG ((DEBUG_ERROR, " load formset from HII handle: 0x%x failed: %r\n", Target->HiiHandle, Status));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
This file defines the EDKII Redfish Platform Config Protocol private structure.
|
This file defines the EDKII Redfish Platform Config Protocol private structure.
|
||||||
|
|
||||||
(C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
|
(C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
|
||||||
Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
|
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
@ -30,6 +31,10 @@
|
||||||
#define ENGLISH_LANGUAGE_CODE "en-US"
|
#define ENGLISH_LANGUAGE_CODE "en-US"
|
||||||
#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"
|
#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish-"
|
||||||
|
|
||||||
|
#define MAX_X_UEFI_REDFISH_STRING_SIZE (128 * 2)// 128 character in UCS.
|
||||||
|
|
||||||
|
typedef struct _REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
|
// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE.
|
||||||
//
|
//
|
||||||
|
@ -46,17 +51,49 @@ typedef struct {
|
||||||
CHAR8 **SchemaList; // Schema list
|
CHAR8 **SchemaList; // Schema list
|
||||||
} REDFISH_PLATFORM_CONFIG_SCHEMA;
|
} REDFISH_PLATFORM_CONFIG_SCHEMA;
|
||||||
|
|
||||||
|
// Defines the number of elements in array
|
||||||
|
#define X_UEFI_REDFISH_STRING_ARRAY_ENTRY_NUMBER 1024
|
||||||
|
|
||||||
|
//
|
||||||
|
// Definition of x-uefi-redfish string element.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
EFI_STRING_ID StringId;
|
||||||
|
CHAR16 *UcsString;
|
||||||
|
} REDFISH_X_UEFI_STRINGS_ARRAY_ELEMENT;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Discrete string array buffer, each has X_UEFI_REDFISH_STRING_ARRAY_NUMBER element.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
LIST_ENTRY NextArray;
|
||||||
|
REDFISH_X_UEFI_STRINGS_ARRAY_ELEMENT *ArrayEntryAddress;
|
||||||
|
} REDFISH_X_UEFI_STRINGS_ARRAY;
|
||||||
|
|
||||||
|
//
|
||||||
|
// x-uefi-redfish string database, x-uefi-redfish language based.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
LIST_ENTRY NextXuefiRedfishLanguage; // Link to the next suppoted x-uefi-Redfish language.
|
||||||
|
CHAR8 *XuefiRedfishLanguage; // x-uefi-redfish language.
|
||||||
|
UINTN StringsArrayBlocks; // Number of the array blocks that accommodate X_UEFI_REDFISH_STRING_ARRAY_NUMBER
|
||||||
|
// elements in each.
|
||||||
|
LIST_ENTRY XuefiRedfishStringArrays; // Link entry of x-uefi-redfish string array.
|
||||||
|
} REDFISH_X_UEFI_STRING_DATABASE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
|
// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
HII_FORMSET *HiiFormSet; // Pointer to HII formset data.
|
HII_FORMSET *HiiFormSet; // Pointer to HII formset data.
|
||||||
EFI_GUID Guid; // Formset GUID.
|
EFI_GUID Guid; // Formset GUID.
|
||||||
EFI_HII_HANDLE HiiHandle; // Hii Handle of this formset.
|
EFI_HII_HANDLE HiiHandle; // Hii Handle of this formset.
|
||||||
LIST_ENTRY HiiFormList; // Form list that keep form data under this formset.
|
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageListHeader; // Hii Package list header.
|
||||||
CHAR16 *DevicePathStr; // Device path of this formset.
|
LIST_ENTRY HiiFormList; // Form list that keep form data under this formset.
|
||||||
REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema that is supported in this formset.
|
CHAR16 *DevicePathStr; // Device path of this formset.
|
||||||
|
REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema that is supported in this formset.
|
||||||
|
LIST_ENTRY XuefiRedfishStringDatabase; // x-uefi-redfish string/Id data base;
|
||||||
} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;
|
} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE;
|
||||||
|
|
||||||
#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR (a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)
|
#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR (a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link)
|
||||||
|
@ -90,19 +127,19 @@ typedef struct {
|
||||||
//
|
//
|
||||||
// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
|
// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE
|
||||||
//
|
//
|
||||||
typedef struct {
|
struct _REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;
|
REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm;
|
||||||
HII_STATEMENT *HiiStatement; // Pointer to HII statement data.
|
HII_STATEMENT *HiiStatement; // Pointer to HII statement data.
|
||||||
EFI_QUESTION_ID QuestionId; // Question ID of this statement.
|
EFI_QUESTION_ID QuestionId; // Question ID of this statement.
|
||||||
EFI_STRING_ID Description; // String token of this question.
|
EFI_STRING_ID Description; // String token of this question.
|
||||||
EFI_STRING_ID Help; // String token of help message.
|
CHAR16 *XuefiRedfishStr; // x-uefi-redfish string of this question.
|
||||||
EFI_STRING DesStringCache; // The string cache for search function.
|
EFI_STRING_ID Help; // String token of help message.
|
||||||
UINT8 Flags; // The statement flag.
|
UINT8 Flags; // The statement flag.
|
||||||
REDFISH_PLATFORM_CONFIG_STATEMENT_DATA StatementData; // The max/min for statement value.
|
REDFISH_PLATFORM_CONFIG_STATEMENT_DATA StatementData; // The max/min for statement value.
|
||||||
BOOLEAN Suppressed; // Statement is suppressed.
|
BOOLEAN Suppressed; // Statement is suppressed.
|
||||||
BOOLEAN GrayedOut; // Statement is GrayedOut.
|
BOOLEAN GrayedOut; // Statement is GrayedOut.
|
||||||
} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE;
|
};
|
||||||
|
|
||||||
#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a) BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)
|
#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a) BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link)
|
||||||
|
|
||||||
|
@ -347,4 +384,38 @@ ReleaseStatementList (
|
||||||
IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList
|
IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST *StatementList
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the HII string length. We don't check word alignment
|
||||||
|
of the input string as the same as the checking in StrLen
|
||||||
|
function. Because the HII string in the database is compact
|
||||||
|
at the byte alignment.
|
||||||
|
|
||||||
|
@param[in] String Input UCS format string.
|
||||||
|
|
||||||
|
@retval Length of
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
HiiStrLen (
|
||||||
|
IN CONST CHAR16 *String
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the HII string size. We don't check word alignment
|
||||||
|
of the input string as the same as the checking in StrLen
|
||||||
|
function. Because the HII string in the database is compact
|
||||||
|
at the byte alignment.
|
||||||
|
|
||||||
|
@param[in] String Input UCS format string.
|
||||||
|
|
||||||
|
@retval Size of the string.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
HiiStrSize (
|
||||||
|
IN CONST CHAR16 *String
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue