1 /** @file
2 *
3 *  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
4 *  Copyright (c) 2016, Linaro Limited. All rights reserved.
5 *
6 *  This program and the accompanying materials
7 *  are licensed and made available under the terms and conditions of the BSD License
8 *  which accompanies this distribution.  The full text of the license may be found at
9 *  http://opensource.org/licenses/bsd-license.php
10 *
11 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 *
14 **/
15 
16 #ifndef _IPMI_INTERFACE_PROTOCOL_H_
17 #define _IPMI_INTERFACE_PROTOCOL_H_
18 
19 #define IPMI_INTERFACE_PROTOCOL_GUID \
20   {0xa37e200e, 0xda90, 0x473b, {0x8b, 0xb5, 0x1d, 0x7b, 0x11, 0xba, 0x32, 0x33}}
21 
22 typedef struct _IPMI_INTERFACE_PROTOCOL IPMI_INTERFACE_PROTOCOL;
23 
24 //
25 // Structure to store IPMI Network Function, LUN and command
26 //
27 typedef struct {
28   UINT8 Lun   : 2;
29   UINT8 NetFn : 6;
30   UINT8 Cmd;
31 } IPMI_CMD_HEADER;
32 
33 //
34 // System Interface Type
35 //
36 typedef enum {
37   IPMI_SYSTEM_INTERFACE_UNKNOWN,
38   IPMI_SYSTEM_INTERFACE_KCS,
39   IPMI_SYSTEM_INTERFACE_SMIC,
40   IPMI_SYSTEM_INTERFACE_BT,
41   IPMI_SYSTEM_INTERFACE_SSIF,
42   IPMI_SYSTEM_INTERFACE_MAX_TYPE
43 } IPMI_SYSTEM_INTERFACE_TYPE;
44 
45 //
46 // System Interface Address Type
47 //
48 typedef enum {
49   IPMI_MEMORY,
50   IPMI_IO,
51   IPMI_MAX_INTERFACE_ADDRESS_TYPE
52 } IPMI_INTERFACE_ADDRESS_TYPE;
53 
54 typedef
55 EFI_STATUS
56 (EFIAPI *IPMI_INTERFACE_PROTOCOL_EXECUTE_IPMI_CMD) (
57   IN  IPMI_INTERFACE_PROTOCOL       *This,
58   IN  IPMI_CMD_HEADER               Request,
59   IN  VOID                          *SendData OPTIONAL,
60   IN  UINT8                         SendLength,
61   OUT VOID                          *RecvData,
62   OUT UINT8                         *RecvLength,
63   OUT UINT16                        *StatusCodes OPTIONAL
64 );
65 typedef
66 IPMI_SYSTEM_INTERFACE_TYPE
67 (EFIAPI *IPMI_INTERFACE_PROTOCOL_GET_IPMI_INTERFACE_TYPE) (
68   IN  IPMI_INTERFACE_PROTOCOL   *This
69 );
70 typedef
71 UINT16
72 (EFIAPI *IPMI_INTERFACE_PROTOCOL_GET_IPMI_BASE_ADDRESS) (
73   IN  IPMI_INTERFACE_PROTOCOL   *This
74 );
75 typedef
76 IPMI_INTERFACE_ADDRESS_TYPE
77 (EFIAPI *IPMI_INTERFACE_PROTOCOL_GET_IPMI_BASE_ADDRESS_TYPE) (
78   IN  IPMI_INTERFACE_PROTOCOL   *This
79 );
80 typedef
81 UINT8
82 (EFIAPI *IPMI_INTERFACE_PROTOCOL_GET_IPMI_VERSION) (
83   IN  IPMI_INTERFACE_PROTOCOL   *This
84 );
85 
86 //
87 // Structure of IPMI_INTERFACE_PROTOCOL
88 //
89 struct _IPMI_INTERFACE_PROTOCOL{
90   IPMI_INTERFACE_PROTOCOL_EXECUTE_IPMI_CMD             ExecuteIpmiCmd;
91   IPMI_INTERFACE_PROTOCOL_GET_IPMI_INTERFACE_TYPE      GetIpmiInterfaceType;
92   IPMI_INTERFACE_PROTOCOL_GET_IPMI_BASE_ADDRESS        GetIpmiBaseAddress;
93   IPMI_INTERFACE_PROTOCOL_GET_IPMI_BASE_ADDRESS_TYPE   GetIpmiBaseAddressType;
94   IPMI_INTERFACE_PROTOCOL_GET_IPMI_VERSION             GetIpmiVersion;
95 } ;
96 
97 extern EFI_GUID gIpmiInterfaceProtocolGuid;
98 
99 #endif
100