Annotation of sys/dev/ipmivar.h, Revision 1.1.1.1
1.1 nbrk 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_ */
CVSweb