xref: /f-stack/freebsd/sys/ipmi.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 2006 IronPort Systems Inc. <[email protected]>
5a9643ea8Slogwang  * All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
8a9643ea8Slogwang  * modification, are permitted provided that the following conditions
9a9643ea8Slogwang  * are met:
10a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
11a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
12a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
13a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
14a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
15a9643ea8Slogwang  *
16a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26a9643ea8Slogwang  * SUCH DAMAGE.
27a9643ea8Slogwang  *
28a9643ea8Slogwang  * $FreeBSD$
29a9643ea8Slogwang  */
30a9643ea8Slogwang 
31a9643ea8Slogwang #ifndef __SYS_IPMI_H__
32a9643ea8Slogwang #define	__SYS_IPMI_H__
33a9643ea8Slogwang 
34a9643ea8Slogwang #define IPMI_MAX_ADDR_SIZE		0x20
35a9643ea8Slogwang #define IPMI_MAX_RX			1024
36a9643ea8Slogwang #define IPMI_BMC_SLAVE_ADDR		0x20 /* Linux Default slave address */
37a9643ea8Slogwang #define IPMI_BMC_CHANNEL		0x0f /* Linux BMC channel */
38a9643ea8Slogwang 
39a9643ea8Slogwang #define IPMI_BMC_SMS_LUN		0x02
40a9643ea8Slogwang 
41a9643ea8Slogwang #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE	0x0c
42a9643ea8Slogwang #define IPMI_IPMB_ADDR_TYPE		0x01
43a9643ea8Slogwang #define IPMI_IPMB_BROADCAST_ADDR_TYPE	0x41
44a9643ea8Slogwang 
45a9643ea8Slogwang #define IPMI_IOC_MAGIC			'i'
46a9643ea8Slogwang #define IPMICTL_RECEIVE_MSG_TRUNC	_IOWR(IPMI_IOC_MAGIC, 11, struct ipmi_recv)
47a9643ea8Slogwang #define IPMICTL_RECEIVE_MSG		_IOWR(IPMI_IOC_MAGIC, 12, struct ipmi_recv)
48a9643ea8Slogwang #define IPMICTL_SEND_COMMAND		_IOW(IPMI_IOC_MAGIC, 13, struct ipmi_req)
49a9643ea8Slogwang #define IPMICTL_REGISTER_FOR_CMD	_IOW(IPMI_IOC_MAGIC, 14, struct ipmi_cmdspec)
50a9643ea8Slogwang #define IPMICTL_UNREGISTER_FOR_CMD	_IOW(IPMI_IOC_MAGIC, 15, struct ipmi_cmdspec)
51a9643ea8Slogwang #define IPMICTL_SET_GETS_EVENTS_CMD	_IOW(IPMI_IOC_MAGIC, 16, int)
52a9643ea8Slogwang #define IPMICTL_SET_MY_ADDRESS_CMD	_IOW(IPMI_IOC_MAGIC, 17, unsigned int)
53a9643ea8Slogwang #define IPMICTL_GET_MY_ADDRESS_CMD	_IOR(IPMI_IOC_MAGIC, 18, unsigned int)
54a9643ea8Slogwang #define IPMICTL_SET_MY_LUN_CMD		_IOW(IPMI_IOC_MAGIC, 19, unsigned int)
55a9643ea8Slogwang #define IPMICTL_GET_MY_LUN_CMD		_IOR(IPMI_IOC_MAGIC, 20, unsigned int)
56a9643ea8Slogwang 
57a9643ea8Slogwang #define IPMI_RESPONSE_RECV_TYPE         1
58a9643ea8Slogwang #define IPMI_ASYNC_EVENT_RECV_TYPE      2
59a9643ea8Slogwang #define IPMI_CMD_RECV_TYPE              3
60a9643ea8Slogwang 
61*22ce4affSfengbojiang #define	IPMI_CHASSIS_REQUEST		0x00
62*22ce4affSfengbojiang # define IPMI_CHASSIS_CONTROL		0x02
63*22ce4affSfengbojiang #  define IPMI_CC_POWER_DOWN		0x0
64*22ce4affSfengbojiang #  define IPMI_CC_POWER_UP		0x1
65*22ce4affSfengbojiang #  define IPMI_CC_POWER_CYCLE		0x2
66*22ce4affSfengbojiang #  define IPMI_CC_HARD_RESET		0x3
67*22ce4affSfengbojiang #  define IPMI_CC_PULSE_DI		0x4
68*22ce4affSfengbojiang #  define IPMI_CC_SOFT_OVERTEMP		0x5
69*22ce4affSfengbojiang 
70a9643ea8Slogwang #define IPMI_APP_REQUEST		0x06
71a9643ea8Slogwang #define IPMI_GET_DEVICE_ID		0x01
72*22ce4affSfengbojiang # define IPMI_ADS_CHASSIS		0x80
73*22ce4affSfengbojiang # define IPMI_ADS_BRIDGE		0x40
74*22ce4affSfengbojiang # define IPMI_ADS_EVENT_GEN		0x20
75*22ce4affSfengbojiang # define IPMI_ADS_EVENT_RCV		0x10
76*22ce4affSfengbojiang # define IPMI_ADS_FRU_INV		0x08
77*22ce4affSfengbojiang # define IPMI_ADS_SEL			0x04
78*22ce4affSfengbojiang # define IPMI_ADS_SDR			0x02
79*22ce4affSfengbojiang # define IPMI_ADS_SENSOR		0x01
80a9643ea8Slogwang #define IPMI_CLEAR_FLAGS		0x30
81a9643ea8Slogwang #define IPMI_GET_MSG_FLAGS		0x31
82a9643ea8Slogwang # define IPMI_MSG_AVAILABLE		0x01
83a9643ea8Slogwang # define IPMI_MSG_BUFFER_FULL		0x02
84a9643ea8Slogwang # define IPMI_WDT_PRE_TIMEOUT		0x08
85a9643ea8Slogwang #define IPMI_GET_MSG			0x33
86a9643ea8Slogwang #define IPMI_SEND_MSG			0x34
87a9643ea8Slogwang #define IPMI_GET_CHANNEL_INFO		0x42
88a9643ea8Slogwang #define IPMI_RESET_WDOG			0x22
89a9643ea8Slogwang #define IPMI_SET_WDOG			0x24
90a9643ea8Slogwang #define IPMI_GET_WDOG			0x25
91a9643ea8Slogwang 
92a9643ea8Slogwang #define IPMI_SET_WD_TIMER_SMS_OS	0x04
93a9643ea8Slogwang #define IPMI_SET_WD_TIMER_DONT_STOP	0x40
94*22ce4affSfengbojiang #define IPMI_SET_WD_ACTION_NONE		0x00
95a9643ea8Slogwang #define IPMI_SET_WD_ACTION_RESET	0x01
96*22ce4affSfengbojiang #define IPMI_SET_WD_ACTION_POWER_DOWN	0x02
97*22ce4affSfengbojiang #define IPMI_SET_WD_ACTION_POWER_CYCLE	0x03
98*22ce4affSfengbojiang #define IPMI_SET_WD_PREACTION_NONE	(0x00 << 4)
99*22ce4affSfengbojiang #define IPMI_SET_WD_PREACTION_SMI	(0x01 << 4)
100*22ce4affSfengbojiang #define IPMI_SET_WD_PREACTION_NMI	(0x02 << 4)
101*22ce4affSfengbojiang #define IPMI_SET_WD_PREACTION_MI	(0x03 << 4)
102a9643ea8Slogwang 
103a9643ea8Slogwang struct ipmi_msg {
104a9643ea8Slogwang 	unsigned char	netfn;
105a9643ea8Slogwang         unsigned char	cmd;
106a9643ea8Slogwang         unsigned short	data_len;
107a9643ea8Slogwang         unsigned char	*data;
108a9643ea8Slogwang };
109a9643ea8Slogwang 
110a9643ea8Slogwang struct ipmi_req {
111a9643ea8Slogwang 	unsigned char	*addr;
112a9643ea8Slogwang 	unsigned int	addr_len;
113a9643ea8Slogwang 	long		msgid;
114a9643ea8Slogwang 	struct ipmi_msg	msg;
115a9643ea8Slogwang };
116a9643ea8Slogwang 
117a9643ea8Slogwang struct ipmi_recv {
118a9643ea8Slogwang 	int		recv_type;
119a9643ea8Slogwang 	unsigned char	*addr;
120a9643ea8Slogwang 	unsigned int	addr_len;
121a9643ea8Slogwang 	long		msgid;
122a9643ea8Slogwang 	struct ipmi_msg	msg;
123a9643ea8Slogwang };
124a9643ea8Slogwang 
125a9643ea8Slogwang struct ipmi_cmdspec {
126a9643ea8Slogwang 	unsigned char	netfn;
127a9643ea8Slogwang 	unsigned char	cmd;
128a9643ea8Slogwang };
129a9643ea8Slogwang 
130a9643ea8Slogwang struct ipmi_addr {
131a9643ea8Slogwang 	int		addr_type;
132a9643ea8Slogwang 	short		channel;
133a9643ea8Slogwang 	unsigned char	data[IPMI_MAX_ADDR_SIZE];
134a9643ea8Slogwang };
135a9643ea8Slogwang 
136a9643ea8Slogwang struct ipmi_system_interface_addr {
137a9643ea8Slogwang 	int		addr_type;
138a9643ea8Slogwang 	short		channel;
139a9643ea8Slogwang 	unsigned char	lun;
140a9643ea8Slogwang };
141a9643ea8Slogwang 
142a9643ea8Slogwang struct ipmi_ipmb_addr {
143a9643ea8Slogwang 	int		addr_type;
144a9643ea8Slogwang 	short		channel;
145a9643ea8Slogwang 	unsigned char	slave_addr;
146a9643ea8Slogwang 	unsigned char	lun;
147a9643ea8Slogwang };
148a9643ea8Slogwang 
149a9643ea8Slogwang #if defined(__amd64__)
150a9643ea8Slogwang /* Compatibility with 32-bit binaries. */
151a9643ea8Slogwang 
152a9643ea8Slogwang #define IPMICTL_RECEIVE_MSG_TRUNC_32	_IOWR(IPMI_IOC_MAGIC, 11, struct ipmi_recv32)
153a9643ea8Slogwang #define IPMICTL_RECEIVE_MSG_32		_IOWR(IPMI_IOC_MAGIC, 12, struct ipmi_recv32)
154a9643ea8Slogwang #define IPMICTL_SEND_COMMAND_32		_IOW(IPMI_IOC_MAGIC, 13, struct ipmi_req32)
155a9643ea8Slogwang 
156a9643ea8Slogwang struct ipmi_msg32 {
157a9643ea8Slogwang 	unsigned char	netfn;
158a9643ea8Slogwang         unsigned char	cmd;
159a9643ea8Slogwang         unsigned short	data_len;
160a9643ea8Slogwang 	uint32_t	data;
161a9643ea8Slogwang };
162a9643ea8Slogwang 
163a9643ea8Slogwang struct ipmi_req32 {
164a9643ea8Slogwang 	uint32_t	addr;
165a9643ea8Slogwang 	unsigned int	addr_len;
166a9643ea8Slogwang 	int32_t		msgid;
167a9643ea8Slogwang 	struct ipmi_msg32 msg;
168a9643ea8Slogwang };
169a9643ea8Slogwang 
170a9643ea8Slogwang struct ipmi_recv32 {
171a9643ea8Slogwang 	int		recv_type;
172a9643ea8Slogwang 	uint32_t	addr;
173a9643ea8Slogwang 	unsigned int	addr_len;
174a9643ea8Slogwang 	int32_t		msgid;
175a9643ea8Slogwang 	struct ipmi_msg32 msg;
176a9643ea8Slogwang };
177a9643ea8Slogwang 
178a9643ea8Slogwang #endif
179a9643ea8Slogwang 
180a9643ea8Slogwang #endif	/* !__SYS_IPMI_H__ */
181