alder_lake_bios/Insyde/InsydeModulePkg/Universal/Dash/DashDxe/PldmBios.c

468 lines
15 KiB
C

/** @file
Platform Level Data Model for BIOS Control and Configuration Implementation
;******************************************************************************
;* Copyright (c) 2012 - 2020, 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 "PldmBios.h"
/**
Set Date Time command of PLDM for BIOS Control & Configuration Specification.
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmBiosSetDateTime(
IN EFI_PLDM_PROTOCOL *This
)
{
PLDM_DATE_TIME DateTime;
EFI_TIME Time;
gRT->GetTime (&Time, NULL);
DateTime.Day = DecimalToBcd8(Time.Day);
DateTime.Second = DecimalToBcd8 (Time.Second);
DateTime.Minute = DecimalToBcd8 (Time.Minute);
DateTime.Hour = DecimalToBcd8 (Time.Hour);
DateTime.Month = DecimalToBcd8 (Time.Month);
DateTime.Year = 0x100 * DecimalToBcd8 ((UINT8)(Time.Year/100)) + DecimalToBcd8 ((UINT8)(Time.Year % 100));
return ProcessSimplePldmMessage( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_SET_DATE_TIME,
&DateTime,
sizeof (DateTime),
NULL,
0
);
}
/**
Get BIOS Table stored in Management Controller
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] TableType 00: BIOS String Table, 01: BIOS Attribute Table, 02: BIOS Attribute Value Table
@param [out] Table The BIOS Table buffer to be received
@param [out] TableSize Number of bytes of Table
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmGetBiosTable (
IN EFI_PLDM_PROTOCOL *This,
IN UINT8 TableType,
OUT VOID *Table,
OUT UINTN *TableSize
)
{
PLDM_BIOS_TABLE_TRANSFER_HEADER TransferHeader;
TransferHeader.TableType = TableType;
return ProcessPldmMessageWithSplitResponses ( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_GET_BIOS_TABLE,
&TransferHeader,
sizeof (TransferHeader),
Table,
TableSize
);
}
/**
Set BIOS Table to the Management Controller
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] TableType 00: BIOS String Table, 01: BIOS Attribute Table, 02: BIOS Attribute Value Table
@param [in] Table The BIOS Table buffer to be transferred to mangement controller
@param [in] TableSize Number of bytes of Table
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmSetBiosTable (
IN EFI_PLDM_PROTOCOL *This,
IN UINT8 TableType,
IN VOID *Table,
IN UINTN TableSize
)
{
PLDM_BIOS_TABLE_TRANSFER_HEADER TransferHeader;
TransferHeader.TableType = TableType;
return ProcessPldmMessageWithSplitRequests (This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_SET_BIOS_TABLE,
&TransferHeader,
sizeof (TransferHeader),
Table,
TableSize
);
}
/**
Get BIOS Table Tags stored in the Management Controller
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] NumberOfTables Number of tables
@param [in] TableTypes Byte array to stored the table types
@param [out] TableTags DWORD array of the retrieved BIOS Table Tags
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmGetBiosTableTags (
IN EFI_PLDM_PROTOCOL *This,
IN UINT8 NumberOfTables,
IN UINT8 *TableTypes,
OUT UINT32 *TableTags
)
{
UINT8 *RequestBuf;
EFI_STATUS Status;
UINTN ResponseMsgSize;
RequestBuf = AllocatePool (NumberOfTables + 1);
if (RequestBuf == NULL) {
return EFI_OUT_OF_RESOURCES;
}
RequestBuf[0] = NumberOfTables;
gBS->CopyMem (RequestBuf + 1, TableTypes, NumberOfTables);
ResponseMsgSize = (UINTN)NumberOfTables * sizeof (UINT32);
Status = ProcessSimplePldmMessage( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_GET_BIOS_TAGS,
RequestBuf,
(UINTN)NumberOfTables + 1,
TableTags,
&ResponseMsgSize
);
FreePool (RequestBuf);
return Status;
}
/**
Set BIOS Table Tags to the Management Controller
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] NumberOfTables Number of tables
@param [in] TableTypes Byte array to stored the table types
@param [in] TableTags DWORD array of the BIOS Table Tags to be transferred to the management controller
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmSetBiosTableTags (
IN EFI_PLDM_PROTOCOL *This,
IN UINT8 NumberOfTables,
IN UINT8 *TableTypes,
IN UINT32 *TableTags
)
{
UINT8 *RequestBuf;
UINTN RequestMsgSize;
EFI_STATUS Status;
UINTN Index;
RequestMsgSize = (UINTN)NumberOfTables * (sizeof(UINT8) + sizeof (UINT32)) + 1;
RequestBuf = AllocatePool (RequestMsgSize);
if (RequestBuf == NULL) {
return EFI_OUT_OF_RESOURCES;
}
RequestBuf[0] = NumberOfTables;
for (Index = 0; Index < NumberOfTables; Index++) {
RequestBuf[5*Index + 1] = TableTypes[Index];
*(UINT32 *)(&RequestBuf[5*Index + 2]) = TableTags[Index];
}
Status = ProcessSimplePldmMessage( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_SET_BIOS_TAGS,
RequestBuf,
RequestMsgSize,
NULL,
0
);
FreePool (RequestBuf);
return Status;
}
/**
Get BIOS Attribute Current Value By Attribute Handle
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] AttrHandle The Attribute Handle
@param [out] AttrData Attribute Data received from the management controller
@param [out] AttrDataSize Number of bytes for AttrData
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmGetBiosAttrCurrentValueByHandle (
IN EFI_PLDM_PROTOCOL *This,
IN UINT16 AttrHandle,
OUT VOID *AttrData,
OUT UINTN *AttrDataSize
)
{
PLDM_BIOS_ATTR_TRANSFER_HEADER TransferHeader;
TransferHeader.AttrHandle = AttrHandle;
return ProcessPldmMessageWithSplitResponses ( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_GET_BIOS_ATTR_CURRENT_VALUE_BY_HANDLE,
&TransferHeader,
sizeof (TransferHeader),
AttrData,
AttrDataSize
);
}
/**
Get BIOS Attribute Current Value By Attribute Handle
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] AttrData Attribute Data to be transferred to the management controller
@param [in] AttrDataSize Number of bytes for AttrData
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmSetBiosAttrCurrentValue (
IN EFI_PLDM_PROTOCOL *This,
IN VOID *AttrData,
IN UINTN AttrDataSize
)
{
PLDM_TRANSFER_HEADER TransferHeader;
return ProcessPldmMessageWithSplitRequests (This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_SET_BIOS_ATTR_CURRENT_VALUE,
&TransferHeader,
sizeof (TransferHeader),
AttrData,
AttrDataSize
);
}
/**
Get BIOS Attribute Current Value By Attribute Type
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] AttrType The Attribute Type
@param [out] AttrData Attribute Data received from the management controller
@param [out] AttrDataSize Number of bytes for AttrData
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmGetBiosAttrCurrentValueByType (
IN EFI_PLDM_PROTOCOL *This,
IN UINT8 AttrType,
OUT VOID *AttrData,
OUT UINTN *AttrDataSize
)
{
PLDM_BIOS_ATTR_TYPE_TRANSFER_HEADER TransferHeader;
TransferHeader.AttrType = AttrType;
return ProcessPldmMessageWithSplitResponses ( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_GET_BIOS_ATTR_CURRENT_VALUE_BY_TYPE,
&TransferHeader,
sizeof (TransferHeader),
AttrData,
AttrDataSize
);
}
/**
Get BIOS Attribute Pending Value By Attribute Handle
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] AttrHandle The Attribute Handle
@param [out] AttrData Attribute Data received from the management controller
@param [out] AttrDataSize Number of bytes for AttrData
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmGetBiosAttrPendingValueByHandle (
IN EFI_PLDM_PROTOCOL *This,
IN UINT16 AttrHandle,
OUT VOID *AttrData,
OUT UINTN *AttrDataSize
)
{
PLDM_BIOS_ATTR_TRANSFER_HEADER TransferHeader;
TransferHeader.AttrHandle = AttrHandle;
return ProcessPldmMessageWithSplitResponses ( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_GET_BIOS_ATTR_PENDING_VALUE_BY_HANDLE,
&TransferHeader,
sizeof (TransferHeader),
AttrData,
AttrDataSize
);
}
/**
Get BIOS Attribute Pending Value By Attribute Type
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] AttrType The Attribute Type
@param [out] AttrData Attribute Data received from the management controller
@param [out] AttrDataSize Number of bytes for AttrData
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmGetBiosAttrPendingValueByType (
IN EFI_PLDM_PROTOCOL *This,
IN UINT8 AttrType,
OUT VOID *AttrData,
OUT UINTN *AttrDataSize
)
{
PLDM_BIOS_ATTR_TYPE_TRANSFER_HEADER TransferHeader;
TransferHeader.AttrType = AttrType;
return ProcessPldmMessageWithSplitResponses ( This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_GET_BIOS_ATTR_PENDING_VALUE_BY_TYPE,
&TransferHeader,
sizeof (TransferHeader),
AttrData,
AttrDataSize
);
}
/**
Accept BIOS Attribute Pending Values
@param [in] This Pointer to EFI_PLDM_PROTOCOL
@param [in] NumOfHandles Number of BIOS Attribute Handles with Pending Values to be accepted
@param [in] AttrHandles Array of Attribute Handles
@retval EFI_SUCCESS Successful
@return Other values Unsuccessful
**/
EFI_STATUS
EFIAPI
PldmAcceptBiosAttrPendingValues (
IN EFI_PLDM_PROTOCOL *This,
IN UINT16 NumOfHandles,
IN UINT16 *AttrHandles
)
{
PLDM_TRANSFER_HEADER TransferHeader;
UINT16 *HandleData;
EFI_STATUS Status;
UINTN AllocateSize;
AllocateSize = 2 * (NumOfHandles + 1);
if ((AllocateSize % 4) != 0) {
AllocateSize += 4 - (AllocateSize % 4);
}
HandleData = AllocatePool (AllocateSize);
if (HandleData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
HandleData[0] = NumOfHandles;
gBS->CopyMem (&(HandleData[1]), AttrHandles, 2 * NumOfHandles);
if ((NumOfHandles % 2) == 0) {
HandleData[NumOfHandles + 1] = 0; // Pad Bytes
}
Status = ProcessPldmMessageWithSplitRequests (This,
PLDM_TYPE_BIOS_CONTROL_AND_CONFIGURATION,
PLDM_ACCEPT_BIOS_ATTR_PENDING_VALUES,
&TransferHeader,
sizeof (TransferHeader),
HandleData,
AllocateSize
);
FreePool (HandleData);
return Status;
}