jcs's openbsd hax
openbsd
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_ */