blob: a03ea8ff4ad6a51a42a32fe7c3fff2ca2884786f [file]
/** @file
Manageability IPMI Helper Library
Copyright (C) 2023-2026 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Uefi.h>
#include <Library/DebugLib.h>
#include <Library/ManageabilityTransportIpmiLib.h>
#include <IndustryStandard/Ipmi.h>
//
// BaseManageabilityTransportHelper is used by PEI, DXE and SMM.
// Make sure the global variables added here should be unchangeable.
//
MANAGEABILITY_IPMI_COMPLETTION_CODE_MAPPING IpmiCompletionCodeMapping[] = {
{ IPMI_COMP_CODE_NORMAL, L"IPMI Completion Code - Normal", MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERRORS },
{ IPMI_COMP_CODE_NODE_BUSY, L"IPMI Completion Code - Busy", MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_READ },
{ IPMI_COMP_CODE_INVALID_COMMAND, L"IPMI Completion Code - Invalid command", MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_INVALID_COMMAND }
};
UINT8 IpmiCompletionCodeMappingEntries = sizeof (IpmiCompletionCodeMapping) / sizeof (MANAGEABILITY_IPMI_COMPLETTION_CODE_MAPPING);
///
/// IPMI Helper Functions.
///
/**
This function returns a human readable string of IPMI KCS Completion Code
and returns the corresponding additional status of transport interface.
@param [in] CompletionCode The Completion Code returned from KCS.
@param [out] CompletionCodeStr Human readable string of IPMI Completion Code.
@param [out] AdditionalStatus Return the additional status.
@retval EFI_SUCCESS The information of Completion Code is returned.
@retval EFI_NOT_FOUND No information of Completion Code is returned.
@retval EFI_INVALID_PARAMETER The given parameter is incorrect.
**/
EFI_STATUS
IpmiHelperCheckCompletionCode (
IN UINT8 CompletionCode,
OUT CHAR16 **CompletionCodeStr,
OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *AdditionalStatus
)
{
UINT8 Index;
MANAGEABILITY_IPMI_COMPLETTION_CODE_MAPPING *ThisCcMapping;
if ((CompletionCodeStr == NULL) || (AdditionalStatus == NULL)) {
return EFI_INVALID_PARAMETER;
}
*AdditionalStatus = 0;
ThisCcMapping = IpmiCompletionCodeMapping;
for (Index = 0; Index < IpmiCompletionCodeMappingEntries; Index++) {
if (ThisCcMapping->CompletionCode == CompletionCode) {
*CompletionCodeStr = ThisCcMapping->CompletionCodeString;
*AdditionalStatus = ThisCcMapping->AdditionalStatus;
return EFI_SUCCESS;
}
ThisCcMapping++;
}
return EFI_NOT_FOUND;
}