alder_lake_bios/Oem/L05/FeatureCommon/InsydeL05ModulePkg/WmiSetupUnderOsSmm/WmiGetBiosSelectionsA7.c

148 lines
4.6 KiB
C

/** @file
;******************************************************************************
;* Copyright (c) 2018, 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 "WmiSetupUnderOsSmm.h"
/**
WMI Method for Get BIOS selections -
1. Switch config type to get BIOS selections form mWmiSelectStrListMap by L05WmiItem.
2. Special type to get BIOS selections form special way.
Mapping to WMI class : Lenovo_GetBiosSelections
Mapping to ASL method : WMA7
@param None
@retval EFI_SUCCESS This function execute successfully.
@retval Others An unexpected error occurred.
**/
EFI_STATUS
EFIAPI
WmiGetBiosSelectionsA7 (
VOID
)
{
EFI_STATUS Status;
UINTN Index;
CHAR8 SelectStr[L05_WMI_BUFFER_MAX_SIZE];
UINT16 SelectStrLen;
UINTN SelectStrListIndex;
UINTN BufferOffset;
//
// Initialization
//
Status = EFI_SUCCESS;
//
// Analyze WMI input buffer
//
Status = AnalyzeWmiInputBuffer (SelectStr, &SelectStrLen, &mL05GlobalNVSArea->L05WmiItem, &SelectStrListIndex);
//
// Clean WMI buffer & Length
//
ZeroMem (mL05GlobalNVSArea->L05WmiBuffer, L05_WMI_BUFFER_MAX_SIZE);
mL05GlobalNVSArea->L05WmiBufferLen = 0;
if (EFI_ERROR (Status)) {
return Status;
}
//
// Init buffer offset
//
BufferOffset = 0;
//
// Put selection to WMI buffer
//
if (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigDataType < SwitchConfigTypeMax) {
//
// Switch config type to get BIOS selections form mWmiSelectStrListMap by L05WmiItem
//
for (Index = 0; Index < mWmiSelectStrListMap[SelectStrListIndex].SelectStrCount; Index++) {
AsciiStrCpyS (&mL05GlobalNVSArea->L05WmiBuffer[BufferOffset], (L05_WMI_BUFFER_MAX_SIZE - BufferOffset) * sizeof(UINT8), mWmiSelectStrListMap[SelectStrListIndex].SelectStrList[Index]);
BufferOffset += AsciiStrLen (mWmiSelectStrListMap[SelectStrListIndex].SelectStrList[Index]);
//
// End of items not need add ','
//
if (Index < (mWmiSelectStrListMap[SelectStrListIndex].SelectStrCount - (UINTN) 1)) {
mL05GlobalNVSArea->L05WmiBuffer[BufferOffset] = ',';
BufferOffset++;
}
}
} else {
//
// Special type to get BIOS selections form special way
//
Status = EFI_INVALID_PARAMETER;
switch (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigDataType) {
case ClearUserPasswordType:
case ClearIntelPttKeyType:
case ClearAmdPspKeyType:
case ResetToSetupModeType:
case RestoreFactoryKeysType:
AsciiStrCpyS (&mL05GlobalNVSArea->L05WmiBuffer[BufferOffset], (L05_WMI_BUFFER_MAX_SIZE - BufferOffset) * sizeof(UINT8), WMI_SETUP_UNDER_OS_ENTER_STR);
BufferOffset += AsciiStrLen (WMI_SETUP_UNDER_OS_ENTER_STR);
Status = EFI_SUCCESS;
break;
case EfiBootOrderType:
if (mBootOrderStr == NULL) {
mBootOrderStr = GetBootOrderStr (mL05WmiSetupItem.L05EfiBootOrder, mL05WmiSetupItem.L05EfiBootOrderCount, mL05WmiSetupItem.L05WmiEfiBootDescription, ',');
}
if (mBootOrderStr != NULL) {
AsciiStrCpyS (&mL05GlobalNVSArea->L05WmiBuffer[BufferOffset], (L05_WMI_BUFFER_MAX_SIZE - BufferOffset) * sizeof(UINT8), mBootOrderStr);
BufferOffset += AsciiStrLen (mBootOrderStr);
FreePool (mBootOrderStr);
mBootOrderStr = NULL;
Status = EFI_SUCCESS;
}
break;
case LegacyBootOrderType:
if (mBootOrderStr == NULL) {
mBootOrderStr = GetBootOrderStr (mL05WmiSetupItem.L05LegacyBootOrder, mL05WmiSetupItem.L05LegacyBootOrderCount, mL05WmiSetupItem.L05WmiLegacyBootDescription, ',');
}
if (mBootOrderStr != NULL) {
AsciiStrCpyS (&mL05GlobalNVSArea->L05WmiBuffer[BufferOffset], (L05_WMI_BUFFER_MAX_SIZE - BufferOffset) * sizeof(UINT8), mBootOrderStr);
BufferOffset += AsciiStrLen (mBootOrderStr);
FreePool (mBootOrderStr);
mBootOrderStr = NULL;
Status = EFI_SUCCESS;
}
break;
default:
return EFI_UNSUPPORTED;
}
}
//
// Set WMI buffer length
//
mL05GlobalNVSArea->L05WmiBufferLen = (UINT16) BufferOffset;
return Status;
}