/** @file IPMI stack initialization in PEI. Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #define BMC_TIMEOUT_PEI 50 // [s] How long shall BIOS wait for BMC #define BMC_KCS_TIMEOUT 5 // [s] Single KSC request timeout EFI_STATUS GetDeviceId ( OUT BOOLEAN *UpdateMode ) /*++ Routine Description: Execute the Get Device ID command to determine whether or not the BMC is in Force Update Mode. If it is, then report it to the error manager. Arguments: Returns: Status --*/ { EFI_STATUS Status; IPMI_GET_DEVICE_ID_RESPONSE BmcInfo; UINT32 Retries; // // Set up a loop to retry for up to 30 seconds. Calculate retries not timeout // so that in case KCS is not enabled and IpmiSendCommand() returns // immediately we will not wait all the 30 seconds. // Retries = BMC_TIMEOUT_PEI/ BMC_KCS_TIMEOUT + 1; // // Get the device ID information for the BMC. // do { Status = IpmiGetDeviceId (&BmcInfo); if (!EFI_ERROR(Status)) { break; } DEBUG ((DEBUG_ERROR, "[IPMI] BMC does not respond (status: %r), %d retries left\n", Status, Retries)); if (Retries-- == 0) { return Status; } } while (TRUE); DEBUG(( DEBUG_INFO, "[IPMI] BMC Device ID: 0x%02X, firmware version: %d.%02X\n", BmcInfo.DeviceId, BmcInfo.FirmwareRev1.Bits.MajorFirmwareRev, BmcInfo.MinorFirmwareRev )); *UpdateMode = (BOOLEAN)BmcInfo.FirmwareRev1.Bits.UpdateMode; return Status; } /** The entry point of the Ipmi PEIM. @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @retval EFI_SUCCESS Indicates that Ipmi initialization completed successfully. @retval Others Indicates that Ipmi initialization could not complete successfully. **/ EFI_STATUS EFIAPI PeimIpmiInterfaceInit ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { BOOLEAN UpdateMode; EFI_STATUS Status; DEBUG ((DEBUG_INFO, "IPMI Peim:Get BMC Device Id\n")); // // Get the Device ID and check if the system is in Force Update mode. // Status = GetDeviceId (&UpdateMode); return Status; }