xref: /openbsd/sys/dev/ipmivar.h (revision b39c5158)
1 /* $OpenBSD: ipmivar.h,v 1.18 2007/03/22 16:55:31 deraadt Exp $ */
2 
3 /*
4  * Copyright (c) 2005 Jordan Hargrave
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
20  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  */
29 
30 #ifndef _IPMIVAR_H_
31 #define _IPMIVAR_H_
32 
33 #include <sys/timeout.h>
34 #include <sys/rwlock.h>
35 #include <sys/sensors.h>
36 
37 #define IPMI_IF_KCS		1
38 #define IPMI_IF_SMIC		2
39 #define IPMI_IF_BT		3
40 
41 #define IPMI_IF_KCS_NREGS	2
42 #define IPMI_IF_SMIC_NREGS	3
43 #define IPMI_IF_BT_NREGS	3
44 
45 struct ipmi_thread;
46 struct ipmi_softc;
47 
48 struct ipmi_bmc_args{
49 	int			offset;
50 	u_int8_t		mask;
51 	u_int8_t		value;
52 	volatile u_int8_t	*v;
53 };
54 
55 struct ipmi_attach_args {
56 	char		*iaa_name;
57 	bus_space_tag_t	iaa_iot;
58 	bus_space_tag_t	iaa_memt;
59 
60 	int		iaa_if_type;
61 	int		iaa_if_rev;
62 	int		iaa_if_iotype;
63 	int		iaa_if_iobase;
64 	int		iaa_if_iospacing;
65 	int		iaa_if_irq;
66 	int		iaa_if_irqlvl;
67 };
68 
69 struct ipmi_if {
70 	const char	*name;
71 	int		nregs;
72 	void		*(*buildmsg)(struct ipmi_softc *, int, int, int,
73 			    const void *, int *);
74 	int		(*sendmsg)(struct ipmi_softc *, int, const u_int8_t *);
75 	int		(*recvmsg)(struct ipmi_softc *, int, int *, u_int8_t *);
76 	int		(*reset)(struct ipmi_softc *);
77 	int		(*probe)(struct ipmi_softc *);
78 };
79 
80 struct ipmi_softc {
81 	struct device		sc_dev;
82 
83 	struct ipmi_if		*sc_if;			/* Interface layer */
84 	int			sc_if_iospacing;	/* Spacing of I/O ports */
85 	int			sc_if_rev;		/* IPMI Revision */
86 
87 	void			*sc_ih;			/* Interrupt/IO handles */
88 	bus_space_tag_t		sc_iot;
89 	bus_space_handle_t	sc_ioh;
90 
91 	int			sc_btseq;
92 
93 	int			sc_wdog_period;
94 
95 	struct ipmi_thread	*sc_thread;
96 
97 	struct timeout		sc_timeout;
98 	int			sc_max_retries;
99 	int			sc_retries;
100 	int			sc_wakeup;
101 
102 	struct rwlock		sc_lock;
103 
104 	struct ipmi_bmc_args	*sc_iowait_args;
105 
106 	struct ipmi_sensor	*current_sensor;
107 	struct ksensordev	sc_sensordev;
108 };
109 
110 struct ipmi_thread {
111 	struct ipmi_softc   *sc;
112 	volatile int	    running;
113 };
114 
115 #define IPMI_WDOG_MASK		0x03
116 #define IPMI_WDOG_DISABLED	0x00
117 #define IPMI_WDOG_REBOOT	0x01
118 #define IPMI_WDOG_PWROFF	0x02
119 #define IPMI_WDOG_PWRCYCLE	0x03
120 
121 #define IPMI_WDOG_PRE_DISABLED	0x00
122 #define IPMI_WDOG_PRE_SMI	0x01
123 #define IPMI_WDOG_PRE_NMI	0x02
124 #define IPMI_WDOG_PRE_INTERRUPT	0x03
125 
126 struct ipmi_watchdog {
127 	u_int8_t		wdog_timer;
128 	u_int8_t		wdog_action;
129 	u_int8_t		wdog_pretimeout;
130 	u_int8_t		wdog_flags;
131 	u_int16_t		wdog_timeout;
132 } __packed;
133 
134 void	ipmi_create_thread(void *);
135 void	ipmi_poll_thread(void *);
136 
137 int	kcs_probe(struct ipmi_softc *);
138 int	kcs_reset(struct ipmi_softc *);
139 int	kcs_sendmsg(struct ipmi_softc *, int, const u_int8_t *);
140 int	kcs_recvmsg(struct ipmi_softc *, int, int *len, u_int8_t *);
141 
142 int	bt_probe(struct ipmi_softc *);
143 int	bt_reset(struct ipmi_softc *);
144 int	bt_sendmsg(struct ipmi_softc *, int, const u_int8_t *);
145 int	bt_recvmsg(struct ipmi_softc *, int, int *, u_int8_t *);
146 
147 int	smic_probe(struct ipmi_softc *);
148 int	smic_reset(struct ipmi_softc *);
149 int	smic_sendmsg(struct ipmi_softc *, int, const u_int8_t *);
150 int	smic_recvmsg(struct ipmi_softc *, int, int *, u_int8_t *);
151 
152 struct dmd_ipmi {
153 	u_int8_t	dmd_sig[4];		/* Signature 'IPMI' */
154 	u_int8_t	dmd_i2c_address;	/* Address of BMC */
155 	u_int8_t	dmd_nvram_address;	/* Address of NVRAM */
156 	u_int8_t	dmd_if_type;		/* IPMI Interface Type */
157 	u_int8_t	dmd_if_rev;		/* IPMI Interface Revision */
158 } __packed;
159 
160 
161 #define APP_NETFN			0x06
162 #define APP_GET_DEVICE_ID		0x01
163 #define APP_RESET_WATCHDOG		0x22
164 #define APP_SET_WATCHDOG_TIMER		0x24
165 #define APP_GET_WATCHDOG_TIMER		0x25
166 
167 #define TRANSPORT_NETFN			0xC
168 #define BRIDGE_NETFN			0x2
169 
170 #define STORAGE_NETFN			0x0A
171 #define STORAGE_GET_FRU_INV_AREA	0x10
172 #define STORAGE_READ_FRU_DATA		0x11
173 #define STORAGE_RESERVE_SDR		0x22
174 #define STORAGE_GET_SDR			0x23
175 #define STORAGE_ADD_SDR			0x24
176 #define STORAGE_ADD_PARTIAL_SDR		0x25
177 #define STORAGE_DELETE_SDR		0x26
178 #define STORAGE_RESERVE_SEL		0x42
179 #define STORAGE_GET_SEL			0x43
180 #define STORAGE_ADD_SEL			0x44
181 #define STORAGE_ADD_PARTIAL_SEL		0x45
182 #define STORAGE_DELETE_SEL		0x46
183 
184 #define SE_NETFN			0x04
185 #define SE_GET_SDR_INFO			0x20
186 #define SE_GET_SDR			0x21
187 #define SE_RESERVE_SDR			0x22
188 #define SE_GET_SENSOR_FACTOR		0x23
189 #define SE_SET_SENSOR_HYSTERESIS	0x24
190 #define SE_GET_SENSOR_HYSTERESIS	0x25
191 #define SE_SET_SENSOR_THRESHOLD		0x26
192 #define SE_GET_SENSOR_THRESHOLD		0x27
193 #define SE_SET_SENSOR_EVENT_ENABLE	0x28
194 #define SE_GET_SENSOR_EVENT_ENABLE	0x29
195 #define SE_REARM_SENSOR_EVENTS		0x2A
196 #define SE_GET_SENSOR_EVENT_STATUS	0x2B
197 #define SE_GET_SENSOR_READING		0x2D
198 #define SE_SET_SENSOR_TYPE		0x2E
199 #define SE_GET_SENSOR_TYPE		0x2F
200 
201 struct sdrhdr {
202 	u_int16_t	record_id;		/* SDR Record ID */
203 	u_int8_t	sdr_version;		/* SDR Version */
204 	u_int8_t	record_type;		/* SDR Record Type */
205 	u_int8_t	record_length;		/* SDR Record Length */
206 } __packed;
207 
208 /* SDR: Record Type 1 */
209 struct sdrtype1 {
210 	struct sdrhdr	sdrhdr;
211 
212 	u_int8_t	owner_id;
213 	u_int8_t	owner_lun;
214 	u_int8_t	sensor_num;
215 
216 	u_int8_t	entity_id;
217 	u_int8_t	entity_instance;
218 	u_int8_t	sensor_init;
219 	u_int8_t	sensor_caps;
220 	u_int8_t	sensor_type;
221 	u_int8_t	event_code;
222 	u_int16_t	trigger_mask;
223 	u_int16_t	reading_mask;
224 	u_int16_t	settable_mask;
225 	u_int8_t	units1;
226 	u_int8_t	units2;
227 	u_int8_t	units3;
228 	u_int8_t	linear;
229 	u_int8_t	m;
230 	u_int8_t	m_tolerance;
231 	u_int8_t	b;
232 	u_int8_t	b_accuracy;
233 	u_int8_t	accuracyexp;
234 	u_int8_t	rbexp;
235 	u_int8_t	analogchars;
236 	u_int8_t	nominalreading;
237 	u_int8_t	normalmax;
238 	u_int8_t	normalmin;
239 	u_int8_t	sensormax;
240 	u_int8_t	sensormin;
241 	u_int8_t	uppernr;
242 	u_int8_t	upperc;
243 	u_int8_t	uppernc;
244 	u_int8_t	lowernr;
245 	u_int8_t	lowerc;
246 	u_int8_t	lowernc;
247 	u_int8_t	physt;
248 	u_int8_t	nhyst;
249 	u_int8_t	resvd[2];
250 	u_int8_t	oem;
251 	u_int8_t	typelen;
252 	u_int8_t	name[1];
253 } __packed;
254 
255 /* SDR: Record Type 2 */
256 struct sdrtype2 {
257 	struct sdrhdr	sdrhdr;
258 
259 	u_int8_t	owner_id;
260 	u_int8_t	owner_lun;
261 	u_int8_t	sensor_num;
262 
263 	u_int8_t	entity_id;
264 	u_int8_t	entity_instance;
265 	u_int8_t	sensor_init;
266 	u_int8_t	sensor_caps;
267 	u_int8_t	sensor_type;
268 	u_int8_t	event_code;
269 	u_int16_t	trigger_mask;
270 	u_int16_t	reading_mask;
271 	u_int16_t	set_mask;
272 	u_int8_t	units1;
273 	u_int8_t	units2;
274 	u_int8_t	units3;
275 	u_int8_t	share1;
276 	u_int8_t	share2;
277 	u_int8_t	physt;
278 	u_int8_t	nhyst;
279 	u_int8_t	resvd[3];
280 	u_int8_t	oem;
281 	u_int8_t	typelen;
282 	u_int8_t	name[1];
283 } __packed;
284 
285 int ipmi_probe(void *);
286 
287 #endif				/* _IPMIVAR_H_ */
288