468 lines
15 KiB
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;
|
|
}
|
|
|
|
|