1 /** @file 2 Implementation of Ipmi Library in DXE Phase for SMS. 3 4 Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php. 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include <PiDxe.h> 16 #include <Protocol/IpmiProtocol.h> 17 #include <Library/UefiBootServicesTableLib.h> 18 #include <Library/DebugLib.h> 19 20 IPMI_PROTOCOL *mIpmiProtocol = NULL; 21 22 /** 23 This service enables submitting commands via Ipmi. 24 25 @param[in] NetFunction Net function of the command. 26 @param[in] Command IPMI Command. 27 @param[in] RequestData Command Request Data. 28 @param[in] RequestDataSize Size of Command Request Data. 29 @param[out] ResponseData Command Response Data. The completion code is the first byte of response data. 30 @param[in, out] ResponseDataSize Size of Command Response Data. 31 32 @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was successfully received. 33 @retval EFI_NOT_FOUND The command was not successfully sent to the device or a response was not successfully received from the device. 34 @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command access. 35 @retval EFI_DEVICE_ERROR Ipmi Device hardware error. 36 @retval EFI_TIMEOUT The command time out. 37 @retval EFI_UNSUPPORTED The command was not successfully sent to the device. 38 @retval EFI_OUT_OF_RESOURCES The resource allcation is out of resource or data size error. 39 **/ 40 EFI_STATUS 41 EFIAPI 42 IpmiSubmitCommand ( 43 IN UINT8 NetFunction, 44 IN UINT8 Command, 45 IN UINT8 *RequestData, 46 IN UINT32 RequestDataSize, 47 OUT UINT8 *ResponseData, 48 IN OUT UINT32 *ResponseDataSize 49 ) 50 { 51 EFI_STATUS Status; 52 53 if (mIpmiProtocol == NULL) { 54 Status = gBS->LocateProtocol ( 55 &gIpmiProtocolGuid, 56 NULL, 57 (VOID **) &mIpmiProtocol 58 ); 59 if (EFI_ERROR (Status)) { 60 // 61 // Dxe Ipmi Protocol is not installed. So, IPMI device is not present. 62 // 63 DEBUG ((EFI_D_ERROR, "IpmiSubmitCommand in Dxe Phase under SMS Status - %r\n", Status)); 64 return EFI_NOT_FOUND; 65 } 66 } 67 68 Status = mIpmiProtocol->IpmiSubmitCommand ( 69 mIpmiProtocol, 70 NetFunction, 71 Command, 72 RequestData, 73 RequestDataSize, 74 ResponseData, 75 ResponseDataSize 76 ); 77 if (EFI_ERROR (Status)) { 78 return Status; 79 } 80 return EFI_SUCCESS; 81 } 82