The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ipmi/ipmivars.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2006 IronPort Systems Inc. <ambrisko@ironport.com>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  * $FreeBSD: releng/7.3/sys/dev/ipmi/ipmivars.h 182985 2008-09-12 21:44:31Z jhb $
   27  */
   28 
   29 #ifndef __IPMIVARS_H__
   30 #define __IPMIVARS_H__
   31 
   32 struct ipmi_get_info {
   33         int             iface_type;
   34         uint64_t        address;
   35         int             offset;
   36         int             io_mode;
   37         int             irq;
   38 };
   39 
   40 struct ipmi_device;
   41 
   42 struct ipmi_request {
   43         TAILQ_ENTRY(ipmi_request) ir_link;
   44         struct ipmi_device *ir_owner;   /* Driver uses NULL. */
   45         u_char          *ir_request;    /* Request is data to send to BMC. */
   46         size_t          ir_requestlen;
   47         u_char          *ir_reply;      /* Reply is data read from BMC. */
   48         size_t          ir_replybuflen; /* Length of ir_reply[] buffer. */
   49         int             ir_replylen;    /* Length of reply from BMC. */
   50         int             ir_error;
   51         long            ir_msgid;
   52         uint8_t         ir_addr;
   53         uint8_t         ir_command;
   54         uint8_t         ir_compcode;
   55 };
   56 
   57 #define MAX_RES                         3
   58 #define KCS_DATA                        0
   59 #define KCS_CTL_STS                     1
   60 #define SMIC_DATA                       0
   61 #define SMIC_CTL_STS                    1
   62 #define SMIC_FLAGS                      2
   63 
   64 struct ipmi_softc;
   65 
   66 /* Per file descriptor data. */
   67 struct ipmi_device {
   68         TAILQ_ENTRY(ipmi_device) ipmi_link;
   69         TAILQ_HEAD(,ipmi_request) ipmi_completed_requests;
   70         struct selinfo          ipmi_select;
   71         struct ipmi_softc       *ipmi_softc;
   72         int                     ipmi_closing;
   73         int                     ipmi_requests;
   74         u_char                  ipmi_address;   /* IPMB address. */
   75         u_char                  ipmi_lun;
   76 };
   77 
   78 struct ipmi_kcs {
   79 };
   80 
   81 struct ipmi_smic {
   82 };
   83 
   84 struct ipmi_ssif {
   85         device_t smbus;
   86         int     smbus_address;
   87 };
   88 
   89 struct ipmi_softc {
   90         device_t                ipmi_dev;
   91         union {
   92                 struct ipmi_kcs kcs;
   93                 struct ipmi_smic smic;
   94                 struct ipmi_ssif ssif;
   95         } _iface;
   96         int                     ipmi_io_rid;
   97         int                     ipmi_io_type;
   98         struct resource         *ipmi_io_res[MAX_RES];
   99         int                     ipmi_io_spacing;
  100         int                     ipmi_irq_rid;
  101         struct resource         *ipmi_irq_res;
  102         void                    *ipmi_irq;
  103         int                     ipmi_detaching;
  104         int                     ipmi_opened;
  105         struct cdev             *ipmi_cdev;
  106         TAILQ_HEAD(,ipmi_request) ipmi_pending_requests;
  107         eventhandler_tag        ipmi_watchdog_tag;
  108         struct intr_config_hook ipmi_ich;
  109         struct mtx              ipmi_lock;
  110         struct cv               ipmi_request_added;
  111         struct proc             *ipmi_kthread;
  112         driver_intr_t           *ipmi_intr;
  113         int                     (*ipmi_startup)(struct ipmi_softc *);
  114         int                     (*ipmi_enqueue_request)(struct ipmi_softc *, struct ipmi_request *);
  115 };
  116 
  117 #define ipmi_ssif_smbus_address         _iface.ssif.smbus_address
  118 #define ipmi_ssif_smbus                 _iface.ssif.smbus
  119 
  120 struct ipmi_ipmb {
  121         u_char foo;
  122 };
  123 
  124 #define KCS_MODE                0x01
  125 #define SMIC_MODE               0x02
  126 #define BT_MODE                 0x03
  127 #define SSIF_MODE               0x04
  128 
  129 /* KCS status flags */
  130 #define KCS_STATUS_OBF                  0x01 /* Data Out ready from BMC */
  131 #define KCS_STATUS_IBF                  0x02 /* Data In from System */
  132 #define KCS_STATUS_SMS_ATN              0x04 /* Ready in RX queue */
  133 #define KCS_STATUS_C_D                  0x08 /* Command/Data register write*/
  134 #define KCS_STATUS_OEM1                 0x10
  135 #define KCS_STATUS_OEM2                 0x20
  136 #define KCS_STATUS_S0                   0x40
  137 #define KCS_STATUS_S1                   0x80
  138  #define KCS_STATUS_STATE(x)            ((x)>>6)
  139  #define KCS_STATUS_STATE_IDLE          0x0
  140  #define KCS_STATUS_STATE_READ          0x1
  141  #define KCS_STATUS_STATE_WRITE         0x2
  142  #define KCS_STATUS_STATE_ERROR         0x3
  143 #define KCS_IFACE_STATUS_OK             0x00
  144 #define KCS_IFACE_STATUS_ABORT          0x01
  145 #define KCS_IFACE_STATUS_ILLEGAL        0x02
  146 #define KCS_IFACE_STATUS_LENGTH_ERR     0x06
  147 #define KCS_IFACE_STATUS_UNKNOWN_ERR    0xff
  148 
  149 /* KCS control codes */
  150 #define KCS_CONTROL_GET_STATUS_ABORT    0x60
  151 #define KCS_CONTROL_WRITE_START         0x61
  152 #define KCS_CONTROL_WRITE_END           0x62
  153 #define KCS_DATA_IN_READ                0x68
  154 
  155 /* SMIC status flags */
  156 #define SMIC_STATUS_BUSY                0x01 /* System set and BMC clears it */
  157 #define SMIC_STATUS_SMS_ATN             0x04 /* BMC has a message */
  158 #define SMIC_STATUS_EVT_ATN             0x08 /* Event has been RX */
  159 #define SMIC_STATUS_SMI                 0x10 /* asserted SMI */
  160 #define SMIC_STATUS_TX_RDY              0x40 /* Ready to accept WRITE */
  161 #define SMIC_STATUS_RX_RDY              0x80 /* Ready to read */
  162 #define SMIC_STATUS_RESERVED            0x22
  163 
  164 /* SMIC control codes */
  165 #define SMIC_CC_SMS_GET_STATUS          0x40
  166 #define SMIC_CC_SMS_WR_START            0x41
  167 #define SMIC_CC_SMS_WR_NEXT             0x42
  168 #define SMIC_CC_SMS_WR_END              0x43
  169 #define SMIC_CC_SMS_RD_START            0x44
  170 #define SMIC_CC_SMS_RD_NEXT             0x45
  171 #define SMIC_CC_SMS_RD_END              0x46
  172 
  173 /* SMIC status codes */
  174 #define SMIC_SC_SMS_RDY                 0xc0
  175 #define SMIC_SC_SMS_WR_START            0xc1
  176 #define SMIC_SC_SMS_WR_NEXT             0xc2
  177 #define SMIC_SC_SMS_WR_END              0xc3
  178 #define SMIC_SC_SMS_RD_START            0xc4
  179 #define SMIC_SC_SMS_RD_NEXT             0xc5
  180 #define SMIC_SC_SMS_RD_END              0xc6
  181 
  182 #define IPMI_ADDR(netfn, lun)           ((netfn) << 2 | (lun))
  183 #define IPMI_REPLY_ADDR(addr)           ((addr) + 0x4)
  184 
  185 #define IPMI_LOCK(sc)                   mtx_lock(&(sc)->ipmi_lock)
  186 #define IPMI_UNLOCK(sc)                 mtx_unlock(&(sc)->ipmi_lock)
  187 #define IPMI_LOCK_ASSERT(sc)            mtx_assert(&(sc)->ipmi_lock, MA_OWNED)
  188 
  189 #define ipmi_alloc_driver_request(addr, cmd, reqlen, replylen)          \
  190         ipmi_alloc_request(NULL, 0, (addr), (cmd), (reqlen), (replylen))
  191 
  192 #if __FreeBSD_version < 601105
  193 #define bus_read_1(r, o) \
  194         bus_space_read_1(rman_get_bustag(r), rman_get_bushandle(r), (o))
  195 #define bus_write_1(r, o, v) \
  196         bus_space_write_1(rman_get_bustag(r), rman_get_bushandle(r), (o), (v))
  197 #endif
  198 
  199 /* I/O to a single I/O resource. */
  200 #define INB_SINGLE(sc, x)                                               \
  201         bus_read_1((sc)->ipmi_io_res[0], (sc)->ipmi_io_spacing * (x))
  202 #define OUTB_SINGLE(sc, x, value)                                       \
  203         bus_write_1((sc)->ipmi_io_res[0], (sc)->ipmi_io_spacing * (x), value)
  204 
  205 /* I/O with each register in its in I/O resource. */
  206 #define INB_MULTIPLE(sc, x)                     \
  207         bus_read_1((sc)->ipmi_io_res[(x)], 0)
  208 #define OUTB_MULTIPLE(sc, x, value)                                     \
  209         bus_write_1((sc)->ipmi_io_res[(x)], 0, value)
  210 
  211 /*
  212  * Determine I/O method based on whether or not we have more than one I/O
  213  * resource.
  214  */
  215 #define INB(sc, x)                                                      \
  216         ((sc)->ipmi_io_res[1] != NULL ? INB_MULTIPLE(sc, x) : INB_SINGLE(sc, x))
  217 #define OUTB(sc, x, value)                                              \
  218         ((sc)->ipmi_io_res[1] != NULL ? OUTB_MULTIPLE(sc, x, value) :   \
  219             OUTB_SINGLE(sc, x, value))
  220 
  221 #define MAX_TIMEOUT 3 * hz
  222 
  223 int     ipmi_attach(device_t);
  224 int     ipmi_detach(device_t);
  225 void    ipmi_release_resources(device_t);
  226 
  227 /* Manage requests. */
  228 struct ipmi_request *ipmi_alloc_request(struct ipmi_device *, long, uint8_t,
  229             uint8_t, size_t, size_t);
  230 void    ipmi_complete_request(struct ipmi_softc *, struct ipmi_request *);
  231 struct ipmi_request *ipmi_dequeue_request(struct ipmi_softc *);
  232 void    ipmi_free_request(struct ipmi_request *);
  233 int     ipmi_polled_enqueue_request(struct ipmi_softc *, struct ipmi_request *);
  234 int     ipmi_submit_driver_request(struct ipmi_softc *, struct ipmi_request *,
  235             int);
  236 
  237 /* Identify BMC interface via SMBIOS. */
  238 int     ipmi_smbios_identify(struct ipmi_get_info *);
  239 
  240 /* Match BMC PCI device listed in SMBIOS. */
  241 const char *ipmi_pci_match(uint16_t, uint16_t);
  242 
  243 /* Interface attach routines. */
  244 int     ipmi_kcs_attach(struct ipmi_softc *);
  245 int     ipmi_kcs_probe_align(struct ipmi_softc *);
  246 int     ipmi_smic_attach(struct ipmi_softc *);
  247 int     ipmi_ssif_attach(struct ipmi_softc *, device_t, int);
  248 
  249 #ifdef IPMB
  250 int     ipmi_handle_attn(struct ipmi_softc *);
  251 #endif
  252 
  253 extern devclass_t ipmi_devclass;
  254 extern int ipmi_attached;
  255 
  256 #endif  /* !__IPMIVARS_H__ */

Cache object: a6718c52b4d798b305a46ce60d27ab7c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.