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

207 lines
6.0 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"
/**
Get config value by mL05GlobalNVSArea->L05WmiItem -
1. Switch config type to get config value form mWmiBiosConfigEnumMap by L05WmiItem.
2. Special type to get config value form special way.
@param None
@retval EFI_SUCCESS Get config value successfully.
@retval EFI_UNSUPPORTED Can't get config value.
**/
EFI_STATUS
GetConfigValue (
VOID
)
{
EFI_STATUS Status;
UINT8 TempSetupValue;
UINTN Index;
//
// Initialization
//
Status = EFI_UNSUPPORTED;
//
// Check L05WmiItem value is valid
//
if (mL05GlobalNVSArea->L05WmiItem >= mWmiBiosConfigEnumMapListCount) {
return EFI_OUT_OF_RESOURCES;
}
if (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigDataType < SwitchConfigTypeMax) {
//
// Switch config type to get config value form mWmiBiosConfigEnumMap by L05WmiSetupItem
//
TempSetupValue = *mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].L05WmiSetupItem;
for (Index = 0; Index < mWmiSelectStrListMapListCount; Index++) {
if (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigDataType == mWmiSelectStrListMap[Index].ConfigDataType) {
break;
}
}
if (TempSetupValue >= mWmiSelectStrListMap[Index].SelectStrCount) {
mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue = WMI_SETUP_UNDER_OS_NULL_STR;
return EFI_UNSUPPORTED;
}
mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue = mWmiSelectStrListMap[Index].SelectStrList[TempSetupValue];
Status = EFI_SUCCESS;
} else {
//
// Special type to get config value form special way
//
switch (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigDataType) {
case ClearUserPasswordType:
case ClearIntelPttKeyType:
case ClearAmdPspKeyType:
case ResetToSetupModeType:
case RestoreFactoryKeysType:
mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue = WMI_SETUP_UNDER_OS_NULL_STR;
Status = EFI_SUCCESS;
break;
case EfiBootOrderType:
if (mBootOrderStr == NULL) {
mBootOrderStr = GetBootOrderStr (mL05WmiSetupItem.L05EfiBootOrder, mL05WmiSetupItem.L05EfiBootOrderCount, mL05WmiSetupItem.L05WmiEfiBootDescription, ':');
}
if (mBootOrderStr != NULL) {
mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue = mBootOrderStr;
Status = EFI_SUCCESS;
}
break;
case LegacyBootOrderType:
if (mBootOrderStr == NULL) {
mBootOrderStr = GetBootOrderStr (mL05WmiSetupItem.L05LegacyBootOrder, mL05WmiSetupItem.L05LegacyBootOrderCount, mL05WmiSetupItem.L05WmiLegacyBootDescription, ':');
}
if (mBootOrderStr != NULL) {
mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue = mBootOrderStr;
Status = EFI_SUCCESS;
}
break;
default:
Status = EFI_UNSUPPORTED;
}
}
return Status;
}
/**
WMI Method for Query BIOS setting -
Mapping to WMI class : Lenovo_BiosSetting
Mapping to ASL method : WQA0
@param None
@retval EFI_SUCCESS This function execute successfully.
@retval Others An unexpected error occurred.
**/
EFI_STATUS
EFIAPI
WmiBiosSettingA0 (
VOID
)
{
EFI_STATUS Status;
UINTN BufferOffset;
UINT16 StrSize;
//
// Initialization
//
Status = EFI_SUCCESS;
BufferOffset = 0;
StrSize = 0;
//
// Clean WMI buffer
//
ZeroMem (mL05GlobalNVSArea->L05WmiBuffer, L05_WMI_BUFFER_MAX_SIZE);
//
// Check L05WmiItem value is valid
//
if (mL05GlobalNVSArea->L05WmiItem >= mWmiBiosConfigEnumMapListCount) {
return EFI_OUT_OF_RESOURCES;
}
//
// Check L05 WMI Setup Item is Valid
//
if (*mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].L05WmiSetupItemValid == FALSE) {
mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue = WMI_SETUP_UNDER_OS_NULL_STR;
AsciiStrCpyS (mL05GlobalNVSArea->L05WmiBuffer, L05_WMI_BUFFER_MAX_SIZE, WMI_BIOS_SETTING_A0_RETURN_NULL_STR);
mL05GlobalNVSArea->L05WmiBufferLen = (UINT16) AsciiStrLen (mL05GlobalNVSArea->L05WmiBuffer);
return EFI_UNSUPPORTED;
}
//
// Put BIOS config item name to WMI buffer
//
BufferOffset = 0;
AsciiStrCpyS (&mL05GlobalNVSArea->L05WmiBuffer[BufferOffset], L05_WMI_BUFFER_MAX_SIZE - (BufferOffset * sizeof (UINT8)), mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].BiosConfigItemName);
BufferOffset += AsciiStrLen (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].BiosConfigItemName);
mL05GlobalNVSArea->L05WmiBuffer[BufferOffset] = ',';
BufferOffset++;
//
// Get Config Value
//
Status = GetConfigValue ();
if (EFI_ERROR (Status)) {
return Status;
}
//
// Put config value to WMI buffer
//
AsciiStrCpyS (&mL05GlobalNVSArea->L05WmiBuffer[BufferOffset], L05_WMI_BUFFER_MAX_SIZE - (BufferOffset * sizeof (UINT8)), mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue);
BufferOffset += AsciiStrLen (mWmiBiosConfigEnumMap[mL05GlobalNVSArea->L05WmiItem].ConfigValue);
//
// Set WMI buffer length
//
mL05GlobalNVSArea->L05WmiBufferLen = (UINT16) BufferOffset;
//
// Free resources
//
if (mBootOrderStr != NULL) {
FreePool (mBootOrderStr);
mBootOrderStr = NULL;
}
return Status;
}