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_ */ 288