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