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