xref: /netbsd-src/sys/dev/ipmivar.h (revision 7ee0f58577084a0b21568c26cef28075a1cb2c37)
1 /* $NetBSD: ipmivar.h,v 1.6 2024/12/04 15:25:45 riastradh 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 #ifndef _IPMIVAR_H_
30 #define _IPMIVAR_H_
31 
32 #include <sys/types.h>
33 
34 #include <sys/bus.h>
35 #include <sys/condvar.h>
36 #include <sys/ipmi.h>
37 #include <sys/mutex.h>
38 
39 #include <dev/sysmon/sysmonvar.h>
40 
41 #define IPMI_IF_KCS		1
42 #define IPMI_IF_SMIC		2
43 #define IPMI_IF_BT		3
44 #define IPMI_IF_SSIF		4
45 
46 #define IPMI_IF_KCS_NREGS	2
47 #define IPMI_IF_SMIC_NREGS	3
48 #define IPMI_IF_BT_NREGS	3
49 #define IPMI_IF_SSIF_NREGS	2
50 
51 struct ipmi_thread;
52 struct ipmi_softc;
53 
54 struct ipmi_attach_args {
55 	bus_space_tag_t	iaa_iot;
56 	bus_space_tag_t	iaa_memt;
57 
58 	int		iaa_if_type;
59 	int		iaa_if_rev;
60 	int		iaa_if_iotype;
61 	bus_addr_t	iaa_if_iobase;
62 	int		iaa_if_iospacing;
63 	int		iaa_if_irq;
64 	int		iaa_if_irqlvl;
65 };
66 
67 struct ipmi_if {
68 	const char	*name;
69 	int		nregs;
70 	void		*(*buildmsg)(struct ipmi_softc *, int, int, int,
71 			    const void *, int *);
72 	int		(*sendmsg)(struct ipmi_softc *, int, const uint8_t *);
73 	int		(*recvmsg)(struct ipmi_softc *, int, int *, uint8_t *);
74 	int		(*reset)(struct ipmi_softc *);
75 	int		(*probe)(struct ipmi_softc *);
76 };
77 
78 struct ipmi_softc {
79 	device_t		sc_dev;
80 
81 	struct ipmi_if		*sc_if;		/* Interface layer */
82 	int			sc_if_iospacing; /* Spacing of I/O ports */
83 	int			sc_if_rev;	/* IPMI Revision */
84 	struct ipmi_attach_args	sc_ia;
85 
86 	void			*sc_ih;		/* Interrupt/IO handles */
87 	bus_space_tag_t		sc_iot;
88 	bus_space_handle_t	sc_ioh;
89 
90 	int			sc_btseq;
91 
92 	struct lwp		*sc_kthread;
93 
94 	int			sc_max_retries;
95 
96 	kmutex_t		sc_poll_mtx;
97 	kcondvar_t		sc_poll_cv;
98 	kcondvar_t		sc_mode_cv;
99 
100 	kmutex_t		sc_cmd_mtx;
101 
102 	struct ipmi_bmc_args	*sc_iowait_args;
103 
104 	struct ipmi_sensor	*current_sensor;
105 	bool			sc_thread_running;
106 	bool			sc_thread_ready;
107 	bool			sc_tickle_due;
108 	struct sysmon_wdog	sc_wdog;
109 	struct sysmon_envsys	*sc_envsys;
110 	envsys_data_t		*sc_sensor;
111 	int 		sc_nsensors; /* total number of sensors */
112 
113 	char		sc_buf[IPMI_MAX_RX + 3];
114 	bool		sc_buf_rsvd;
115 
116 	/* request busy */
117 	int		sc_mode;
118 #define IPMI_MODE_IDLE		0
119 #define IPMI_MODE_COMMAND	1
120 #define IPMI_MODE_ENVSYS	2
121 	bool		sc_sent;
122 
123 	/* dummy */
124 	int		sc_address;
125 	int		sc_lun;
126 
127 	/* saved from last SEND_COMMAND */
128 	int		sc_msgid;
129 	int		sc_netfn;
130 	int		sc_cmd;
131 };
132 
133 struct ipmi_device_id {
134 	uint8_t		deviceid;
135 	uint8_t		revision;
136 	uint8_t		fwrev1;
137 	uint8_t		fwrev2;
138 	uint8_t		version;
139 	uint8_t		additional;
140 	uint8_t		manufacturer[3];
141 	uint8_t		product[2];
142 	uint8_t		vendor[4];
143 } __packed;
144 
145 struct ipmi_thread {
146 	struct ipmi_softc   *sc;
147 	volatile int	    running;
148 };
149 
150 #define IPMI_WDOG_USE_NOLOG		__BIT(7)
151 #define IPMI_WDOG_USE_NOSTOP		__BIT(6)
152 #define IPMI_WDOG_USE_RSVD1		__BITS(5, 3)
153 #define IPMI_WDOG_USE_USE_MASK		__BITS(2, 0)
154 #define IPMI_WDOG_USE_USE_RSVD		__SHIFTIN(0, IPMI_WDOG_USE_USE_MASK);
155 #define IPMI_WDOG_USE_USE_FRB2		__SHIFTIN(1, IPMI_WDOG_USE_USE_MASK);
156 #define IPMI_WDOG_USE_USE_POST		__SHIFTIN(2, IPMI_WDOG_USE_USE_MASK);
157 #define IPMI_WDOG_USE_USE_OSLOAD	__SHIFTIN(3, IPMI_WDOG_USE_USE_MASK);
158 #define IPMI_WDOG_USE_USE_OS		__SHIFTIN(4, IPMI_WDOG_USE_USE_MASK);
159 #define IPMI_WDOG_USE_USE_OEM		__SHIFTIN(5, IPMI_WDOG_USE_USE_MASK);
160 
161 #define IPMI_WDOG_ACT_PRE_RSVD1		__BIT(7)
162 #define IPMI_WDOG_ACT_PRE_MASK		__BITS(6, 4)
163 #define IPMI_WDOG_ACT_PRE_DISABLED	__SHIFTIN(0, IPMI_WDOG_ACT_MASK)
164 #define IPMI_WDOG_ACT_PRE_SMI		__SHIFTIN(1, IPMI_WDOG_ACT_MASK)
165 #define IPMI_WDOG_ACT_PRE_NMI		__SHIFTIN(2, IPMI_WDOG_ACT_MASK)
166 #define IPMI_WDOG_ACT_PRE_INTERRUPT	__SHIFTIN(3, IPMI_WDOG_ACT_MASK)
167 #define IPMI_WDOG_ACT_PRE_RSVD0		__BIT(3)
168 #define IPMI_WDOG_ACT_MASK		__BITS(2, 0)
169 #define IPMI_WDOG_ACT_DISABLED		__SHIFTIN(0, IPMI_WDOG_ACT_MASK)
170 #define IPMI_WDOG_ACT_RESET		__SHIFTIN(1, IPMI_WDOG_ACT_MASK)
171 #define IPMI_WDOG_ACT_PWROFF		__SHIFTIN(2, IPMI_WDOG_ACT_MASK)
172 #define IPMI_WDOG_ACT_PWRCYCLE		__SHIFTIN(3, IPMI_WDOG_ACT_MASK)
173 
174 #define IPMI_WDOG_FLAGS_RSVD1		__BITS(7, 6)
175 #define IPMI_WDOG_FLAGS_OEM		__BIT(5)
176 #define IPMI_WDOG_FLAGS_OS		__BIT(4)
177 #define IPMI_WDOG_FLAGS_OSLOAD		__BIT(3)
178 #define IPMI_WDOG_FLAGS_POST		__BIT(2)
179 #define IPMI_WDOG_FLAGS_FRB2		__BIT(1)
180 #define IPMI_WDOG_FLAGS_RSVD0		__BIT(0)
181 
182 struct ipmi_set_watchdog {
183 	uint8_t		wdog_use;
184 	uint8_t		wdog_action;
185 	uint8_t		wdog_pretimeout;
186 	uint8_t		wdog_flags;
187 	uint16_t		wdog_timeout;
188 } __packed;
189 
190 struct ipmi_get_watchdog {
191 	uint8_t		wdog_use;
192 	uint8_t		wdog_action;
193 	uint8_t		wdog_pretimeout;
194 	uint8_t		wdog_flags;
195 	uint16_t		wdog_timeout;
196 	uint16_t		wdog_countdown;
197 } __packed;
198 
199 struct dmd_ipmi {
200 	uint8_t	dmd_sig[4];		/* Signature 'IPMI' */
201 	uint8_t	dmd_i2c_address;	/* Address of BMC */
202 	uint8_t	dmd_nvram_address;	/* Address of NVRAM */
203 	uint8_t	dmd_if_type;		/* IPMI Interface Type */
204 	uint8_t	dmd_if_rev;		/* IPMI Interface Revision */
205 } __packed;
206 
207 #define APP_NETFN			0x06
208 #define APP_GET_DEVICE_ID		0x01
209 #define APP_RESET_WATCHDOG		0x22
210 #define APP_SET_WATCHDOG_TIMER		0x24
211 #define APP_GET_WATCHDOG_TIMER		0x25
212 
213 #define TRANSPORT_NETFN			0xC
214 #define BRIDGE_NETFN			0x2
215 
216 #define STORAGE_NETFN			0x0A
217 #define STORAGE_GET_FRU_INV_AREA	0x10
218 #define STORAGE_READ_FRU_DATA		0x11
219 #define STORAGE_RESERVE_SDR		0x22
220 #define STORAGE_GET_SDR			0x23
221 #define STORAGE_ADD_SDR			0x24
222 #define STORAGE_ADD_PARTIAL_SDR		0x25
223 #define STORAGE_DELETE_SDR		0x26
224 #define STORAGE_RESERVE_SEL		0x42
225 #define STORAGE_GET_SEL			0x43
226 #define STORAGE_ADD_SEL			0x44
227 #define STORAGE_ADD_PARTIAL_SEL		0x45
228 #define STORAGE_DELETE_SEL		0x46
229 
230 #define SE_NETFN			0x04
231 #define SE_GET_SDR_INFO			0x20
232 #define SE_GET_SDR			0x21
233 #define SE_RESERVE_SDR			0x22
234 #define SE_GET_SENSOR_FACTOR		0x23
235 #define SE_SET_SENSOR_HYSTERESIS	0x24
236 #define SE_GET_SENSOR_HYSTERESIS	0x25
237 #define SE_SET_SENSOR_THRESHOLD		0x26
238 #define SE_GET_SENSOR_THRESHOLD		0x27
239 #define SE_SET_SENSOR_EVENT_ENABLE	0x28
240 #define SE_GET_SENSOR_EVENT_ENABLE	0x29
241 #define SE_REARM_SENSOR_EVENTS		0x2A
242 #define SE_GET_SENSOR_EVENT_STATUS	0x2B
243 #define SE_GET_SENSOR_READING		0x2D
244 #define SE_SET_SENSOR_TYPE		0x2E
245 #define SE_GET_SENSOR_TYPE		0x2F
246 
247 struct sdrhdr {
248 	uint16_t	record_id;		/* SDR Record ID */
249 	uint8_t	sdr_version;		/* SDR Version */
250 	uint8_t	record_type;		/* SDR Record Type */
251 	uint8_t	record_length;		/* SDR Record Length */
252 } __packed;
253 
254 /* SDR: Record Type 1 */
255 struct sdrtype1 {
256 	struct sdrhdr	sdrhdr;
257 
258 	uint8_t	owner_id;
259 	uint8_t	owner_lun;
260 	uint8_t	sensor_num;
261 
262 	uint8_t	entity_id;
263 	uint8_t	entity_instance;
264 	uint8_t	sensor_init;
265 	uint8_t	sensor_caps;
266 	uint8_t	sensor_type;
267 	uint8_t	event_code;
268 	uint16_t	trigger_mask;
269 	uint16_t	reading_mask;
270 	uint16_t	settable_mask;
271 	uint8_t	units1;
272 	uint8_t	units2;
273 	uint8_t	units3;
274 	uint8_t	linear;
275 	uint8_t	m;
276 	uint8_t	m_tolerance;
277 	uint8_t	b;
278 	uint8_t	b_accuracy;
279 	uint8_t	accuracyexp;
280 	uint8_t	rbexp;
281 	uint8_t	analogchars;
282 	uint8_t	nominalreading;
283 	uint8_t	normalmax;
284 	uint8_t	normalmin;
285 	uint8_t	sensormax;
286 	uint8_t	sensormin;
287 	uint8_t	uppernr;
288 	uint8_t	upperc;
289 	uint8_t	uppernc;
290 	uint8_t	lowernr;
291 	uint8_t	lowerc;
292 	uint8_t	lowernc;
293 	uint8_t	physt;
294 	uint8_t	nhyst;
295 	uint8_t	resvd[2];
296 	uint8_t	oem;
297 	uint8_t	typelen;
298 	uint8_t	name[1];
299 } __packed;
300 
301 /* SDR: Record Type 2 */
302 struct sdrtype2 {
303 	struct sdrhdr	sdrhdr;
304 
305 	uint8_t	owner_id;
306 	uint8_t	owner_lun;
307 	uint8_t	sensor_num;
308 
309 	uint8_t	entity_id;
310 	uint8_t	entity_instance;
311 	uint8_t	sensor_init;
312 	uint8_t	sensor_caps;
313 	uint8_t	sensor_type;
314 	uint8_t	event_code;
315 	uint16_t	trigger_mask;
316 	uint16_t	reading_mask;
317 	uint16_t	set_mask;
318 	uint8_t	units1;
319 	uint8_t	units2;
320 	uint8_t	units3;
321 	uint8_t	share1;
322 	uint8_t	share2;
323 	uint8_t	physt;
324 	uint8_t	nhyst;
325 	uint8_t	resvd[3];
326 	uint8_t	oem;
327 	uint8_t	typelen;
328 	uint8_t	name[1];
329 } __packed;
330 
331 #endif				/* _IPMIVAR_H_ */
332