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