alder_lake_bios/Insyde/InsydeCrPkg/ConfigUtility/CrConfigUtilDxe/CrDeviceMenu.c

456 lines
13 KiB
C

/** @file
;******************************************************************************
;* Copyright (c) 2016, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include "CrConfigUtil.h"
#include "CrDeviceMenu.h"
#include "CrConfig.h"
EFI_STRING_ID SpaceStringId = 0;
EFI_STRING_ID WarningStringId = 0;
extern CR_CONFIG_MANAGER_PRIVATE_DATA *mPrivateData;
extern CHAR16 *mVariableName;
EFI_STATUS
GetDevNodeByQuestionId (
IN EFI_QUESTION_ID QuestionId,
IN OUT CR_DEV_NODE **DevNode
)
{
LIST_ENTRY *Link;
CR_DEV_NODE *CrDevNode;
if (QuestionId == 0 || DevNode == NULL) {
return EFI_INVALID_PARAMETER;
}
if (IsListEmpty (&mPrivateData->CrDevListHead)) {
return EFI_NOT_FOUND;
}
Link = GetFirstNode (&mPrivateData->CrDevListHead);
while (!IsNull (&mPrivateData->CrDevListHead, Link)) {
CrDevNode = CR_DEV_NODE_FROM_LINK (Link);
Link = GetNextNode (&mPrivateData->CrDevListHead, Link);
if (CrDevNode->QuestionId == QuestionId) {
*DevNode = CrDevNode;
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
CHAR16*
GetStatusStr (
IN CR_DEVICE_SETTING *Device
)
{
CR_CONFIGURATION CrConfig;
BOOLEAN IsGet;
UINT8 TermType;
UINT8 BaudRate;
UINT8 Parity;
UINT8 DataBit;
UINT8 StopBit;
UINT8 PortStatus;
CHAR16 *Str;
CHAR16 *PortStatusTable [2] = {L"Disable", L"Enable"};
CHAR16 *TermTypeTable[5] = {L"VT-100",L"VT-100+",L"VT-UTF8",L"PC-ANSI",L"LOG-TERM"};
CHAR16 *ParityTable [3] = {L"N",L"E",L"O"};
UINT32 CRBaudRateTable [] = {
1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
};
if (Device == NULL) {
return CatSPrint (NULL, L" ");
}
IsGet = HiiGetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig);
if (!IsGet) {
CopyMem (&CrConfig, &mPrivateData->Configuration, sizeof (CR_CONFIGURATION));
}
PortStatus = Device->Attribute.PortEnable;
if (Device->Attribute.UseGlobalSetting) {
TermType = CrConfig.GlobalTerminalType;
BaudRate = CrConfig.GlobalBaudRate;
DataBit = CrConfig.GlobalDataBits;
StopBit = (CrConfig.GlobalStopBits == 1)? 1 : 2;
Parity = CrConfig.GlobalParity;
}
else {
TermType = Device->Attribute.TerminalType;
BaudRate = Device->Attribute.BaudRate;
DataBit = Device->Attribute.DataBits;
StopBit = (Device->Attribute.StopBits == 1)? 1 : 2;
Parity = Device->Attribute.Parity;
}
Str = CatSPrint (
NULL,
L" %s %s,%d,%s%d%d",
PortStatusTable[PortStatus],
TermTypeTable[TermType],
CRBaudRateTable[BaudRate],
ParityTable[Parity - 1],
DataBit,
StopBit
);
return Str;
};
EFI_STATUS
SetDevVariables (
VOID
)
{
LIST_ENTRY *Link;
CR_DEV_NODE *CrDevNode;
if (IsListEmpty (&mPrivateData->CrDevListHead)) {
return EFI_NOT_FOUND;
}
Link = GetFirstNode (&mPrivateData->CrDevListHead);
while (!IsNull (&mPrivateData->CrDevListHead, Link)) {
CrDevNode = CR_DEV_NODE_FROM_LINK (Link);
Link = GetNextNode (&mPrivateData->CrDevListHead, Link);
UpdateOrDeleteCrDevVarWithDevInfo (CrDevNode->Index, &CrDevNode->Dev);
}
return EFI_SUCCESS;
}
EFI_STATUS
DestroyDevices (
VOID
)
{
LIST_ENTRY *Link;
CR_DEV_NODE *CrDevNode;
while (!IsListEmpty (&mPrivateData->CrDevListHead)) {
Link = GetFirstNode (&mPrivateData->CrDevListHead);
CrDevNode = CR_DEV_NODE_FROM_LINK (Link);
RemoveEntryList (&CrDevNode->Link);
FreePool (CrDevNode);
}
InitializeListHead (&mPrivateData->CrDevListHead);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
CreateDevices (
VOID
)
{
UINT8 Index;
CR_DEVICE_SETTING *CrDevSetting;
CR_DEV_NODE *CrDevNode;
CHAR16 *Str;
EFI_STATUS Status;
DestroyDevices ();
CrDevSetting = NULL;
//
// Create Cr Device List Form Variables
//
for (Index = 0; Index < MAX_CR_DEVICE_VARIABLE; Index ++) {
Status = GetCrDevInfoFromVariable (Index, &CrDevSetting);
if (EFI_ERROR(Status) || CrDevSetting == NULL) {
continue;
}
CrDevNode = AllocateZeroPool (sizeof (CR_DEV_NODE) + StrSize (CrDevSetting->DevName));
if (CrDevNode == NULL) {
ASSERT (FALSE);
break;
}
//
// Update Cr Device Setting
//
CopyMem (&CrDevNode->Dev, CrDevSetting, sizeof (CR_DEVICE_SETTING) + StrSize (CrDevSetting->DevName));
//
// Update Cr Device Node
//
CrDevNode->Index = Index;
//[-start-190612-IB07401110-modify]//
CrDevNode->FormId = CR_DEVICE_FORM_ID + Index;
//[-end-190612-IB07401110-modify]//
CrDevNode->QuestionId = (EFI_QUESTION_ID)(CR_DEVICE_QUESTION_ID_BASE + Index);
Str = CrDevNode->Dev.DevName;
CrDevNode->PromptStrId = HiiSetString (mPrivateData->HiiHandle, 0, Str, NULL);
Str = GetStatusStr (&CrDevNode->Dev);
CrDevNode->StatusStrId = HiiSetString (mPrivateData->HiiHandle, 0, Str, NULL);
FreePool (Str);
InsertTailList (&mPrivateData->CrDevListHead, &CrDevNode->Link);
FreePool (CrDevSetting);
}
if (CrDevSetting != NULL) {
FreePool (CrDevSetting);
}
return EFI_SUCCESS;
}
EFI_STATUS
UpdateDevices (
IN BOOLEAN LoadDefault
)
{
UINT8 Index;
CR_DEVICE_SETTING *CrDevSetting;
CR_DEV_NODE *CrDevNode;
LIST_ENTRY *Link;
EFI_STATUS Status;
CrDevSetting = NULL;
//
// Init Cr Device Variables
//
PcdDevicesToVariables (LoadDefault);
if (IsListEmpty (&mPrivateData->CrDevListHead)) {
//
// Create New Cr Device List
//
return CreateDevices ();
}
//
// Update Cr Device List Form Variables
//
for (Index = 0; Index < MAX_CR_DEVICE_VARIABLE; Index ++) {
Status = GetCrDevInfoFromVariable (Index, &CrDevSetting);
if (EFI_ERROR(Status) || CrDevSetting == NULL) {
continue;
}
Link = GetFirstNode (&mPrivateData->CrDevListHead);
while (!IsNull (&mPrivateData->CrDevListHead, Link)) {
CrDevNode = CR_DEV_NODE_FROM_LINK (Link);
Link = GetNextNode (&mPrivateData->CrDevListHead, Link);
if (CrDevNode->Index == Index) {
//
// If finding index, update cr device setting
//
CopyMem (&CrDevNode->Dev, CrDevSetting, sizeof (CR_DEVICE_SETTING) + StrSize (CrDevSetting->DevName));
}
}
FreePool (CrDevSetting);
}
if (CrDevSetting != NULL) {
FreePool (CrDevSetting);
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
UpdateDevMenu (
IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle
)
{
EFI_STATUS Status;
LIST_ENTRY *Link;
CR_DEV_NODE *CrDevNode;
CR_DEVICE_SETTING *Device;
UINT32 Count;
CHAR16 *Str;
//[-start-190616-IB07401112-add]//
UINTN BufferSize;
//[-end-190616-IB07401112-add]//
if (HiiHandle == 0 || StartOpCodeHandle == NULL) {
return EFI_INVALID_PARAMETER;
}
Status = UpdateDevices (FALSE);
if (EFI_ERROR (Status)) {
return Status;
}
//[-start-190616-IB07401112-add]//
BufferSize = sizeof (CR_CONFIGURATION);
Status = gRT->GetVariable (
mVariableName,
&gH2OCrConfigurationGuid,
NULL,
&BufferSize,
&mPrivateData->Configuration
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
//[-end-190616-IB07401112-add]//
if (SpaceStringId == 0) {
Str = CatSPrint (NULL, L" ");
SpaceStringId = HiiSetString (HiiHandle, 0, Str, NULL);
FreePool (Str);
}
Count = 0;
Link = GetFirstNode (&mPrivateData->CrDevListHead);
while (!IsNull (&mPrivateData->CrDevListHead, Link)) {
CrDevNode = CR_DEV_NODE_FROM_LINK (Link);
Link = GetNextNode (&mPrivateData->CrDevListHead, Link);
Device = &CrDevNode->Dev;
if (!Device->Exist) {
continue;
}
//
// Add one Serial device item.
//
HiiCreateGotoOpCode (
StartOpCodeHandle,
CrDevNode->FormId,
CrDevNode->PromptStrId,
SpaceStringId,
EFI_IFR_FLAG_CALLBACK,
CrDevNode->QuestionId
);
HiiCreateSubTitleOpCode (
StartOpCodeHandle,
CrDevNode->StatusStrId,
SpaceStringId,
0,
0
);
//[-start-190616-IB07401112-add]//
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].PortEnable = Device->Attribute.PortEnable;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].UseGlobalSetting = Device->Attribute.UseGlobalSetting;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].TerminalType = Device->Attribute.TerminalType;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].BaudRate = Device->Attribute.BaudRate;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].Parity = Device->Attribute.Parity;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].DataBits = Device->Attribute.DataBits;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].StopBits = Device->Attribute.StopBits;
mPrivateData->Configuration.CrPortConfig[CrDevNode->Index].FlowControl = Device->Attribute.FlowControl;
//[-end-190616-IB07401112-add]//
Count ++;
}
if (Count == 0) {
//
// Show the message of no CR device support.
//
HiiCreateSubTitleOpCode (
StartOpCodeHandle,
SpaceStringId,
SpaceStringId,
0,
0
);
if (WarningStringId == 0) {
Str = CatSPrint (NULL, L"Warning!! No serial device to support Console Redirection.");
WarningStringId = HiiSetString (HiiHandle, 0, Str, NULL);
FreePool (Str);
}
HiiCreateSubTitleOpCode (
StartOpCodeHandle,
WarningStringId,
WarningStringId,
0,
0
);
}
//[-start-190616-IB07401112-add]//
//
// Update CrDevice variables to CrConfig variable
//
Status = CommonSetVariable (
mVariableName,
&gH2OCrConfigurationGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
sizeof (CR_CONFIGURATION),
&mPrivateData->Configuration
);
if (EFI_ERROR (Status)) {
return Status;
}
//[-end-190616-IB07401112-add]//
return EFI_SUCCESS;
}
EFI_STATUS
CrUpdateMenu (
IN EFI_HII_HANDLE HiiHandle
)
{
EFI_STATUS Status;
VOID *StartOpCodeHandle;
VOID *EndOpCodeHandle;
EFI_IFR_GUID_LABEL *StartLabel;
EFI_IFR_GUID_LABEL *EndLabel;
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
StartLabel->Number = CR_DEVICE_LABEL_START;
EndOpCodeHandle = HiiAllocateOpCodeHandle ();
EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
EndLabel->Number = CR_DEVICE_LABEL_END;
UpdateDevMenu (HiiHandle, StartOpCodeHandle);
Status = HiiUpdateForm (
HiiHandle,
NULL,
CONSOLE_REDIRECTION_ROOT_FORM_ID,
StartOpCodeHandle,
EndOpCodeHandle
);
HiiFreeOpCodeHandle (StartOpCodeHandle);
HiiFreeOpCodeHandle (EndOpCodeHandle);
return Status;
}