1 /* 2 * Copyright (c) 2004 Sun Microsystems, Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * Redistribution of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * Redistribution in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * Neither the name of Sun Microsystems, Inc. or the names of 16 * contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * This software is provided "AS IS," without a warranty of any kind. 20 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, 21 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A 22 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. 23 * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE 24 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING 25 * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL 26 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, 27 * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR 28 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF 29 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 30 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 31 */ 32 33 #ifndef _BMC_INTF_H 34 #define _BMC_INTF_H 35 36 #pragma ident "@(#)bmc_intf.h 1.2 05/03/07 SMI" 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 #define BMC_SUCCESS 0x0 43 #define BMC_FAILURE 0x1 44 45 #define BMC_NETFN_CHASSIS 0x0 46 #define BMC_NETFN_BRIDGE 0x2 47 #define BMC_NETFN_SE 0x4 48 #define BMC_NETFN_APP 0x6 49 #define BMC_NETFN_FIRMWARE 0x8 50 #define BMC_NETFN_STORAGE 0xa 51 #define BMC_NETFN_TRANSPORT 0xc 52 53 #define SEND_MAX_PAYLOAD_SIZE 34 /* MAX payload */ 54 #define RECV_MAX_PAYLOAD_SIZE 33 /* MAX payload */ 55 #define BMC_MIN_RESPONSE_SIZE 3 56 #define BMC_MIN_REQUEST_SIZE 2 57 #define BMC_MAX_RESPONSE_SIZE (BMC_MIN_RESPONSE_SIZE + RECV_MAX_PAYLOAD_SIZE) 58 #define BMC_MAX_REQUEST_SIZE (BMC_MIN_REQUEST_SIZE + BMC_MAX_RESPONSE_SIZE) 59 60 #define BUF_SIZE 256 61 #define MAX_BUF_SIZE 256 62 63 /* 64 * Useful macros 65 */ 66 #define FORM_NETFNLUN(net, lun) ((((net) << 2) | ((lun) & 0x3))) 67 #define GET_NETFN(netfn) (((netfn) >> 2) & 0x3f) 68 #define GET_LUN(netfn) (netfn & 0x3) 69 #define RESP_NETFN(nflun) ((nflun) | 1) 70 #define ISREQUEST(nl) (((nl) & 1) == 0) /* test for request */ 71 #define ISRESPONSE(nl) (((nl) & 1) == 1) /* test for response */ 72 73 74 /* for checking BMC specific stuff */ 75 #define BMC_GET_DEVICE_ID 0x1 /* GET DEVICE ID COMMAND */ 76 #define BMC_IPMI_15_VER 0x51 /* IPMI 1.5 definion */ 77 78 /* BMC Completion Code and OEM Completion Code */ 79 #define BMC_IPMI_UNSPECIFIC_ERROR 0xFF /* Unspecific Error */ 80 #define BMC_IPMI_INVALID_COMMAND 0xC1 /* Invalid Command */ 81 #define BMC_IPMI_COMMAND_TIMEOUT 0xC3 /* Command Timeout */ 82 #define BMC_IPMI_DATA_LENGTH_EXCEED 0xC8 /* DataLength exceeded limit */ 83 #define BMC_IPMI_OEM_FAILURE_SENDBMC 0x7E /* Cannot send BMC req */ 84 85 86 #define IOCTL_IPMI_KCS_ACTION 0x01 87 #define IOCTL_IPMI_INTERFACE_METHOD 0x02 88 89 /* Interface methods returned from IOCTL_IPMI_INTERFACE_METHOD ioctl: */ 90 91 #define BMC_IOCTL_METHOD 0 /* Not returned from ioctl, */ 92 /* but can be used by */ 93 /* applications that want to */ 94 /* compare against an */ 95 /* alternative method. */ 96 #define BMC_PUTMSG_METHOD 1 97 98 /* 99 * bmc_req_t is the data structure to send 100 * request packet from applications to the driver 101 * module. 102 * 103 * the request pkt is mainly for KCS-interface-BMC 104 * messages. Since the system interface is session-less 105 * connections, the packet won't have any session 106 * information. 107 * 108 * the data payload will be 2 bytes less than max 109 * BMC supported packet size. 110 * the address of the responder is always BMC and so 111 * rsSa field is not required. 112 */ 113 typedef struct bmc_req { 114 uint8_t fn; /* netFn for command */ 115 uint8_t lun; /* logical unit on responder */ 116 uint8_t cmd; /* command */ 117 uint8_t datalength; /* length of following data */ 118 uint8_t data[SEND_MAX_PAYLOAD_SIZE]; /* request data */ 119 } bmc_req_t; 120 121 /* 122 * bmc_rsp_t is the data structure to send 123 * respond packet from applications to the driver 124 * module. 125 * 126 * the respond pkt is mainly for KCS-interface-BMC 127 * messages. Since the system interface is session-less 128 * connections, the packet won't have any session 129 * information. 130 * 131 * the data payload will be 2 bytes less than max 132 * BMC supported packet size. 133 */ 134 typedef struct bmc_rsp { 135 uint8_t fn; /* netFn for command */ 136 uint8_t lun; /* logical unit on responder */ 137 uint8_t cmd; /* command */ 138 uint8_t ccode; /* completion code */ 139 uint8_t datalength; /* Length */ 140 uint8_t data[RECV_MAX_PAYLOAD_SIZE]; /* response */ 141 } bmc_rsp_t; 142 143 /* 144 * the data structure for synchronous operation via ioctl (DEPRECATED) 145 */ 146 typedef struct bmc_reqrsp { 147 bmc_req_t req; /* request half */ 148 bmc_rsp_t rsp; /* response half */ 149 } bmc_reqrsp_t; 150 151 152 /* 153 * The new way of communicating with the bmc driver is to use putmsg() to 154 * send a message of a particular type. Replies from the driver also have this 155 * form, and will require the user to process the type field before examining 156 * the rest of the reply. 157 * 158 * The only change that must be observed when using the request and response 159 * structures defined above is as follows: 160 * when sending messages to the bmc driver, the data portion is now variable 161 * (the caller must allocate enough space to store the all structure members, 162 * plus enough space to cover the amount of data in the request), e.g.: 163 * 164 * bmc_msg_t *msg = malloc(offsetof(bmc_msg_t, msg) + sizeof(bmc_req_t) + 10); 165 * 166 * The amount allocated for the message is (# of bytes before the msg field) + 167 * the size of a bmc_req_t (which includes SEND_MAX_PAYLOAD_SIZE 168 * bytes in the data field), plus an additional 10 bytes for the data 169 * field (so the data field would occupy (SEND_MAX_PAYLOAD_SIZE + 10) 170 * bytes). The datalength member must reflect the amount of data in the 171 * request's data field (as was required when using the ioctl interface). 172 */ 173 typedef struct bmc_msg { 174 uint8_t m_type; /* Message type (see below) */ 175 uint32_t m_id; /* Message ID */ 176 uint8_t reserved[32]; 177 uint8_t msg[1]; /* Variable length message data */ 178 } bmc_msg_t; 179 180 181 /* 182 * An error response passed back from the bmc driver will have its m_id 183 * field set to BMC_UNKNOWN_MSG_ID if a message is sent to it that is not 184 * at least as large as a bmc_msg_t. 185 */ 186 #define BMC_UNKNOWN_MSG_ID ~((uint32_t)0) 187 188 189 /* 190 * Possible values for the m_type field in bmc_msg_t: 191 */ 192 #define BMC_MSG_REQUEST 1 /* BMC request (as above, sent to the */ 193 /* driver by the user), bmc_msg.msg */ 194 /* begins with the bmc_req_t */ 195 /* structure. */ 196 #define BMC_MSG_RESPONSE 2 /* BMC response (sent by the driver) */ 197 /* bmc_msg.msg begins with the */ 198 /* bmc_rsp_t structure. */ 199 #define BMC_MSG_ERROR 3 /* Error while processing a user msg */ 200 /* msg[0] is the error code */ 201 /* (interpret as an errno value) */ 202 203 #ifdef __cplusplus 204 } 205 #endif 206 207 #endif /* _BMC_INTF_H */ 208