1/* $OpenBSD: ipmivar.h,v 1.34 2021/01/23 12:10:08 kettenis 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/rwlock.h>
34#include <sys/sensors.h>
35#include <sys/task.h>
36
37#include <dev/ipmi.h>
38
39#define IPMI_IF_KCS		1
40#define IPMI_IF_SMIC		2
41#define IPMI_IF_BT		3
42#define IPMI_IF_SSIF		4
43
44#define IPMI_IF_KCS_NREGS	2
45#define IPMI_IF_SMIC_NREGS	3
46#define IPMI_IF_BT_NREGS	3
47
48struct ipmi_thread;
49struct ipmi_softc;
50struct ipmi_cmd;
51
52struct ipmi_iowait {
53	int			offset;
54	u_int8_t		mask;
55	u_int8_t		value;
56	volatile u_int8_t	*v;
57	const char		*lbl;
58};
59
60struct ipmi_attach_args {
61	char		*iaa_name;
62	bus_space_tag_t	iaa_iot;
63	bus_space_tag_t	iaa_memt;
64
65	int		iaa_if_type;
66	int		iaa_if_rev;
67	int		iaa_if_iotype;
68	bus_addr_t	iaa_if_iobase;
69	int		iaa_if_iosize;
70	int		iaa_if_iospacing;
71	int		iaa_if_irq;
72	int		iaa_if_irqlvl;
73};
74
75struct ipmi_if {
76	const char	*name;
77	int		nregs;
78	void		(*buildmsg)(struct ipmi_cmd *);
79	int		(*sendmsg)(struct ipmi_cmd *);
80	int		(*recvmsg)(struct ipmi_cmd *);
81	int		(*reset)(struct ipmi_softc *);
82	int		(*probe)(struct ipmi_softc *);
83	int		datasnd;
84	int		datarcv;
85};
86
87struct ipmi_cmd {
88	struct ipmi_softc	*c_sc;
89
90	int			c_rssa;
91	int			c_rslun;
92	int			c_netfn;
93	int			c_cmd;
94
95	int			c_txlen;
96	int			c_maxrxlen;
97	int			c_rxlen;
98
99	void			*c_data;
100	u_int			c_ccode;
101};
102
103struct ipmi_softc {
104	struct device		sc_dev;
105
106	struct ipmi_if		*sc_if;			/* Interface layer */
107	int			sc_if_iosize;		/* Size of I/O porrs */
108	int			sc_if_iospacing;	/* Spacing of I/O ports */
109	int			sc_if_rev;		/* IPMI Revision */
110
111	void			*sc_ih;			/* Interrupt/IO handles */
112	bus_space_tag_t		sc_iot;
113	bus_space_handle_t	sc_ioh;
114
115	int			sc_btseq;
116	u_int8_t		sc_buf[IPMI_MAX_RX + 16];
117	struct taskq		*sc_cmd_taskq;
118
119	struct ipmi_ioctl {
120		struct rwlock		lock;
121		struct ipmi_req		req;
122		struct ipmi_cmd		cmd;
123		uint8_t			buf[IPMI_MAX_RX];
124	} sc_ioctl;
125
126	int			sc_wdog_period;
127	struct task		sc_wdog_tickle_task;
128
129	struct ipmi_thread	*sc_thread;
130
131	struct ipmi_sensor	*current_sensor;
132	struct ksensordev	sc_sensordev;
133};
134
135struct ipmi_thread {
136	struct ipmi_softc   *sc;
137	volatile int	    running;
138};
139
140#define IPMI_WDOG_DONTSTOP	0x40
141
142#define IPMI_WDOG_MASK		0x03
143#define IPMI_WDOG_DISABLED	0x00
144#define IPMI_WDOG_REBOOT	0x01
145#define IPMI_WDOG_PWROFF	0x02
146#define IPMI_WDOG_PWRCYCLE	0x03
147
148#define IPMI_WDOG_PRE_DISABLED	0x00
149#define IPMI_WDOG_PRE_SMI	0x01
150#define IPMI_WDOG_PRE_NMI	0x02
151#define IPMI_WDOG_PRE_INTERRUPT	0x03
152
153#define	IPMI_SET_WDOG_TIMER	0
154#define	IPMI_SET_WDOG_ACTION	1
155#define	IPMI_SET_WDOG_PRETIMO	2
156#define	IPMI_SET_WDOG_FLAGS	3
157#define	IPMI_SET_WDOG_TIMOL	4
158#define	IPMI_SET_WDOG_TIMOM	5
159#define	IPMI_SET_WDOG_MAX	6
160
161#define	IPMI_GET_WDOG_TIMER	IPMI_SET_WDOG_TIMER
162#define	IPMI_GET_WDOG_ACTION	IPMI_SET_WDOG_ACTION
163#define	IPMI_GET_WDOG_PRETIMO	IPMI_SET_WDOG_PRETIMO
164#define	IPMI_GET_WDOG_FLAGS	IPMI_SET_WDOG_FLAGS
165#define	IPMI_GET_WDOG_TIMOL	IPMI_SET_WDOG_TIMOL
166#define	IPMI_GET_WDOG_TIMOM	IPMI_SET_WDOG_TIMOM
167#define	IPMI_GET_WDOG_PRECDL	6
168#define	IPMI_GET_WDOG_PRECDM	7
169#define	IPMI_GET_WDOG_MAX	8
170
171int	ipmi_probe(void *);
172void	ipmi_attach_common(struct ipmi_softc *, struct ipmi_attach_args *);
173int	ipmi_activate(struct device *, int);
174
175int	ipmi_sendcmd(struct ipmi_cmd *);
176int	ipmi_recvcmd(struct ipmi_cmd *);
177
178#define IPMI_MSG_NFLN			0
179#define IPMI_MSG_CMD			1
180#define IPMI_MSG_CCODE			2
181#define IPMI_MSG_DATASND		2
182#define IPMI_MSG_DATARCV		3
183
184#define APP_NETFN			0x06
185#define APP_GET_DEVICE_ID		0x01
186#define APP_RESET_WATCHDOG		0x22
187#define APP_SET_WATCHDOG_TIMER		0x24
188#define APP_GET_WATCHDOG_TIMER		0x25
189#define APP_GET_SYSTEM_INTERFACE_CAPS	0x57
190
191#define TRANSPORT_NETFN			0xC
192#define BRIDGE_NETFN			0x2
193
194#define STORAGE_NETFN			0x0A
195#define STORAGE_GET_FRU_INV_AREA	0x10
196#define STORAGE_READ_FRU_DATA		0x11
197#define STORAGE_RESERVE_SDR		0x22
198#define STORAGE_GET_SDR			0x23
199#define STORAGE_ADD_SDR			0x24
200#define STORAGE_ADD_PARTIAL_SDR		0x25
201#define STORAGE_DELETE_SDR		0x26
202#define STORAGE_RESERVE_SEL		0x42
203#define STORAGE_GET_SEL			0x43
204#define STORAGE_ADD_SEL			0x44
205#define STORAGE_ADD_PARTIAL_SEL		0x45
206#define STORAGE_DELETE_SEL		0x46
207
208#define SE_NETFN			0x04
209#define SE_GET_SDR_INFO			0x20
210#define SE_GET_SDR			0x21
211#define SE_RESERVE_SDR			0x22
212#define SE_GET_SENSOR_FACTOR		0x23
213#define SE_SET_SENSOR_HYSTERESIS	0x24
214#define SE_GET_SENSOR_HYSTERESIS	0x25
215#define SE_SET_SENSOR_THRESHOLD		0x26
216#define SE_GET_SENSOR_THRESHOLD		0x27
217#define SE_SET_SENSOR_EVENT_ENABLE	0x28
218#define SE_GET_SENSOR_EVENT_ENABLE	0x29
219#define SE_REARM_SENSOR_EVENTS		0x2A
220#define SE_GET_SENSOR_EVENT_STATUS	0x2B
221#define SE_GET_SENSOR_READING		0x2D
222#define SE_SET_SENSOR_TYPE		0x2E
223#define SE_GET_SENSOR_TYPE		0x2F
224
225struct sdrhdr {
226	u_int16_t	record_id;		/* SDR Record ID */
227	u_int8_t	sdr_version;		/* SDR Version */
228	u_int8_t	record_type;		/* SDR Record Type */
229	u_int8_t	record_length;		/* SDR Record Length */
230} __packed;
231
232/* SDR: Record Type 1 */
233struct sdrtype1 {
234	struct sdrhdr	sdrhdr;
235
236	u_int8_t	owner_id;
237	u_int8_t	owner_lun;
238	u_int8_t	sensor_num;
239
240	u_int8_t	entity_id;
241	u_int8_t	entity_instance;
242	u_int8_t	sensor_init;
243	u_int8_t	sensor_caps;
244	u_int8_t	sensor_type;
245	u_int8_t	event_code;
246	u_int16_t	trigger_mask;
247	u_int16_t	reading_mask;
248	u_int16_t	settable_mask;
249	u_int8_t	units1;
250	u_int8_t	units2;
251	u_int8_t	units3;
252	u_int8_t	linear;
253	u_int8_t	m;
254	u_int8_t	m_tolerance;
255	u_int8_t	b;
256	u_int8_t	b_accuracy;
257	u_int8_t	accuracyexp;
258	u_int8_t	rbexp;
259	u_int8_t	analogchars;
260	u_int8_t	nominalreading;
261	u_int8_t	normalmax;
262	u_int8_t	normalmin;
263	u_int8_t	sensormax;
264	u_int8_t	sensormin;
265	u_int8_t	uppernr;
266	u_int8_t	upperc;
267	u_int8_t	uppernc;
268	u_int8_t	lowernr;
269	u_int8_t	lowerc;
270	u_int8_t	lowernc;
271	u_int8_t	physt;
272	u_int8_t	nhyst;
273	u_int8_t	resvd[2];
274	u_int8_t	oem;
275	u_int8_t	typelen;
276	u_int8_t	name[1];
277} __packed;
278
279/* SDR: Record Type 2 */
280struct sdrtype2 {
281	struct sdrhdr	sdrhdr;
282
283	u_int8_t	owner_id;
284	u_int8_t	owner_lun;
285	u_int8_t	sensor_num;
286
287	u_int8_t	entity_id;
288	u_int8_t	entity_instance;
289	u_int8_t	sensor_init;
290	u_int8_t	sensor_caps;
291	u_int8_t	sensor_type;
292	u_int8_t	event_code;
293	u_int16_t	trigger_mask;
294	u_int16_t	reading_mask;
295	u_int16_t	set_mask;
296	u_int8_t	units1;
297	u_int8_t	units2;
298	u_int8_t	units3;
299	u_int8_t	share1;
300	u_int8_t	share2;
301	u_int8_t	physt;
302	u_int8_t	nhyst;
303	u_int8_t	resvd[3];
304	u_int8_t	oem;
305	u_int8_t	typelen;
306	u_int8_t	name[1];
307} __packed;
308
309#endif				/* _IPMIVAR_H_ */
310