/** @file
IPMI Serial Over Lan Driver.
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SOL_CMD_RETRY_COUNT 10
/*++
Routine Description:
This routine gets the SOL payload status or settings for a specific channel.
Arguments:
Channel - LAN channel naumber.
ParamSel - Configuration parameter selection.
Data - Information returned from BMC.
Returns:
EFI_SUCCESS - SOL configuration parameters are successfully read from BMC.
Others - SOL configuration parameters could not be read from BMC.
--*/
EFI_STATUS
GetSOLStatus (
IN UINT8 Channel,
IN UINT8 ParamSel,
IN OUT UINT8 *Data
)
{
EFI_STATUS Status = EFI_SUCCESS;
IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST GetConfigurationParametersRequest;
IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE GetConfigurationParametersResponse;
UINT32 DataSize;
UINT8 RetryCount;
for (RetryCount = 0; RetryCount < SOL_CMD_RETRY_COUNT; RetryCount++) {
ZeroMem (&GetConfigurationParametersRequest, sizeof(GetConfigurationParametersRequest));
GetConfigurationParametersRequest.ChannelNumber.Bits.ChannelNumber = Channel;
GetConfigurationParametersRequest.ParameterSelector = ParamSel;
ZeroMem (&GetConfigurationParametersResponse, sizeof(GetConfigurationParametersResponse));
DataSize = sizeof(GetConfigurationParametersResponse);
Status = IpmiGetSolConfigurationParameters (
&GetConfigurationParametersRequest,
&GetConfigurationParametersResponse,
&DataSize
);
if (Status == EFI_SUCCESS){
break;
} else {
gBS->Stall(100000);
}
}
if (Status == EFI_SUCCESS) {
*Data = GetConfigurationParametersResponse.ParameterData[0];
}
return Status;
}
/*++
Routine Description:
This routine sets the SOL payload configuration parameters for a specific channel.
Arguments:
Channel - LAN channel naumber.
ParamSel - Configuration parameter selection.
Data - Configuration parameter values.
Returns:
EFI_SUCCESS - SOL configuration parameters are sent to BMC.
Others - SOL configuration parameters could not be sent to BMC.
--*/
EFI_STATUS
SetSOLParams (
IN UINT8 Channel,
IN UINT8 ParamSel,
IN UINT8 Data
)
{
EFI_STATUS Status = EFI_SUCCESS;
IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST SetConfigurationParametersRequest;
UINT8 CompletionCode;
UINT8 RetryCount;
for (RetryCount = 0; RetryCount < SOL_CMD_RETRY_COUNT; RetryCount++) {
ZeroMem (&SetConfigurationParametersRequest, sizeof(SetConfigurationParametersRequest));
SetConfigurationParametersRequest.ChannelNumber.Bits.ChannelNumber = Channel;
SetConfigurationParametersRequest.ParameterSelector = ParamSel;
SetConfigurationParametersRequest.ParameterData[0] = Data;
CompletionCode = 0;
Status = IpmiSetSolConfigurationParameters (
&SetConfigurationParametersRequest,
sizeof(SetConfigurationParametersRequest),
&CompletionCode
);
if (Status == EFI_SUCCESS) {
break;
} else {
gBS->Stall(100000);
}
}
return Status;
}
EFI_STATUS
EFIAPI
SolStatusEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/*++
Routine Description:
This is the standard EFI driver point. This function initializes
the private data required for creating SOL Status Driver.
Arguments:
ImageHandle - Handle for the image of this driver
SystemTable - Pointer to the EFI System Table
Returns:
EFI_SUCCESS - Protocol successfully installed
EFI_UNSUPPORTED - Protocol can't be installed.
--*/
{
EFI_STATUS Status = EFI_SUCCESS;
UINT8 Channel;
BOOLEAN SolEnabled = FALSE;
for (Channel = 1; Channel <= PcdGet8 (PcdMaxSOLChannels); Channel++) {
Status = GetSOLStatus (Channel, IPMI_SOL_CONFIGURATION_PARAMETER_SOL_ENABLE, &SolEnabled);
if (Status == EFI_SUCCESS) {
DEBUG ((DEBUG_ERROR, "SOL enabling status for channel %x is %x\n", Channel, SolEnabled));
} else {
DEBUG ((DEBUG_ERROR, "Failed to get channel %x SOL status from BMC!, status is %x\n", Channel, Status));
}
}
return Status;
}