root/dev/ipmivar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */