1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * ipmi.h 3*53ee8cc1Swenshuai.xi * 4*53ee8cc1Swenshuai.xi * MontaVista IPMI interface 5*53ee8cc1Swenshuai.xi * 6*53ee8cc1Swenshuai.xi * Author: MontaVista Software, Inc. 7*53ee8cc1Swenshuai.xi * Corey Minyard <minyard@mvista.com> 8*53ee8cc1Swenshuai.xi * source@mvista.com 9*53ee8cc1Swenshuai.xi * 10*53ee8cc1Swenshuai.xi * Copyright 2002 MontaVista Software Inc. 11*53ee8cc1Swenshuai.xi * 12*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or modify it 13*53ee8cc1Swenshuai.xi * under the terms of the GNU General Public License as published by the 14*53ee8cc1Swenshuai.xi * Free Software Foundation; either version 2 of the License, or (at your 15*53ee8cc1Swenshuai.xi * option) any later version. 16*53ee8cc1Swenshuai.xi * 17*53ee8cc1Swenshuai.xi * 18*53ee8cc1Swenshuai.xi * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 19*53ee8cc1Swenshuai.xi * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 20*53ee8cc1Swenshuai.xi * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21*53ee8cc1Swenshuai.xi * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22*53ee8cc1Swenshuai.xi * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 23*53ee8cc1Swenshuai.xi * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 24*53ee8cc1Swenshuai.xi * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25*53ee8cc1Swenshuai.xi * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 26*53ee8cc1Swenshuai.xi * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 27*53ee8cc1Swenshuai.xi * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*53ee8cc1Swenshuai.xi * 29*53ee8cc1Swenshuai.xi * You should have received a copy of the GNU General Public License along 30*53ee8cc1Swenshuai.xi * with this program; if not, write to the Free Software Foundation, Inc., 31*53ee8cc1Swenshuai.xi * 675 Mass Ave, Cambridge, MA 02139, USA. 32*53ee8cc1Swenshuai.xi */ 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi #ifndef __LINUX_IPMI_H 35*53ee8cc1Swenshuai.xi #define __LINUX_IPMI_H 36*53ee8cc1Swenshuai.xi 37*53ee8cc1Swenshuai.xi #include <linux/ipmi_msgdefs.h> 38*53ee8cc1Swenshuai.xi 39*53ee8cc1Swenshuai.xi /* 40*53ee8cc1Swenshuai.xi * This file describes an interface to an IPMI driver. You have to 41*53ee8cc1Swenshuai.xi * have a fairly good understanding of IPMI to use this, so go read 42*53ee8cc1Swenshuai.xi * the specs first before actually trying to do anything. 43*53ee8cc1Swenshuai.xi * 44*53ee8cc1Swenshuai.xi * With that said, this driver provides a multi-user interface to the 45*53ee8cc1Swenshuai.xi * IPMI driver, and it allows multiple IPMI physical interfaces below 46*53ee8cc1Swenshuai.xi * the driver. The physical interfaces bind as a lower layer on the 47*53ee8cc1Swenshuai.xi * driver. They appear as interfaces to the application using this 48*53ee8cc1Swenshuai.xi * interface. 49*53ee8cc1Swenshuai.xi * 50*53ee8cc1Swenshuai.xi * Multi-user means that multiple applications may use the driver, 51*53ee8cc1Swenshuai.xi * send commands, receive responses, etc. The driver keeps track of 52*53ee8cc1Swenshuai.xi * commands the user sends and tracks the responses. The responses 53*53ee8cc1Swenshuai.xi * will go back to the application that send the command. If the 54*53ee8cc1Swenshuai.xi * response doesn't come back in time, the driver will return a 55*53ee8cc1Swenshuai.xi * timeout error response to the application. Asynchronous events 56*53ee8cc1Swenshuai.xi * from the BMC event queue will go to all users bound to the driver. 57*53ee8cc1Swenshuai.xi * The incoming event queue in the BMC will automatically be flushed 58*53ee8cc1Swenshuai.xi * if it becomes full and it is queried once a second to see if 59*53ee8cc1Swenshuai.xi * anything is in it. Incoming commands to the driver will get 60*53ee8cc1Swenshuai.xi * delivered as commands. 61*53ee8cc1Swenshuai.xi * 62*53ee8cc1Swenshuai.xi * This driver provides two main interfaces: one for in-kernel 63*53ee8cc1Swenshuai.xi * applications and another for userland applications. The 64*53ee8cc1Swenshuai.xi * capabilities are basically the same for both interface, although 65*53ee8cc1Swenshuai.xi * the interfaces are somewhat different. The stuff in the 66*53ee8cc1Swenshuai.xi * #ifdef __KERNEL__ below is the in-kernel interface. The userland 67*53ee8cc1Swenshuai.xi * interface is defined later in the file. */ 68*53ee8cc1Swenshuai.xi 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi 71*53ee8cc1Swenshuai.xi /* 72*53ee8cc1Swenshuai.xi * This is an overlay for all the address types, so it's easy to 73*53ee8cc1Swenshuai.xi * determine the actual address type. This is kind of like addresses 74*53ee8cc1Swenshuai.xi * work for sockets. 75*53ee8cc1Swenshuai.xi */ 76*53ee8cc1Swenshuai.xi #define IPMI_MAX_ADDR_SIZE 32 77*53ee8cc1Swenshuai.xi struct ipmi_addr { 78*53ee8cc1Swenshuai.xi /* Try to take these from the "Channel Medium Type" table 79*53ee8cc1Swenshuai.xi in section 6.5 of the IPMI 1.5 manual. */ 80*53ee8cc1Swenshuai.xi int addr_type; 81*53ee8cc1Swenshuai.xi short channel; 82*53ee8cc1Swenshuai.xi char data[IPMI_MAX_ADDR_SIZE]; 83*53ee8cc1Swenshuai.xi }; 84*53ee8cc1Swenshuai.xi 85*53ee8cc1Swenshuai.xi /* 86*53ee8cc1Swenshuai.xi * When the address is not used, the type will be set to this value. 87*53ee8cc1Swenshuai.xi * The channel is the BMC's channel number for the channel (usually 88*53ee8cc1Swenshuai.xi * 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. 89*53ee8cc1Swenshuai.xi */ 90*53ee8cc1Swenshuai.xi #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c 91*53ee8cc1Swenshuai.xi struct ipmi_system_interface_addr { 92*53ee8cc1Swenshuai.xi int addr_type; 93*53ee8cc1Swenshuai.xi short channel; 94*53ee8cc1Swenshuai.xi unsigned char lun; 95*53ee8cc1Swenshuai.xi }; 96*53ee8cc1Swenshuai.xi 97*53ee8cc1Swenshuai.xi /* An IPMB Address. */ 98*53ee8cc1Swenshuai.xi #define IPMI_IPMB_ADDR_TYPE 0x01 99*53ee8cc1Swenshuai.xi /* Used for broadcast get device id as described in section 17.9 of the 100*53ee8cc1Swenshuai.xi IPMI 1.5 manual. */ 101*53ee8cc1Swenshuai.xi #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 102*53ee8cc1Swenshuai.xi struct ipmi_ipmb_addr { 103*53ee8cc1Swenshuai.xi int addr_type; 104*53ee8cc1Swenshuai.xi short channel; 105*53ee8cc1Swenshuai.xi unsigned char slave_addr; 106*53ee8cc1Swenshuai.xi unsigned char lun; 107*53ee8cc1Swenshuai.xi }; 108*53ee8cc1Swenshuai.xi 109*53ee8cc1Swenshuai.xi /* 110*53ee8cc1Swenshuai.xi * A LAN Address. This is an address to/from a LAN interface bridged 111*53ee8cc1Swenshuai.xi * by the BMC, not an address actually out on the LAN. 112*53ee8cc1Swenshuai.xi * 113*53ee8cc1Swenshuai.xi * A concious decision was made here to deviate slightly from the IPMI 114*53ee8cc1Swenshuai.xi * spec. We do not use rqSWID and rsSWID like it shows in the 115*53ee8cc1Swenshuai.xi * message. Instead, we use remote_SWID and local_SWID. This means 116*53ee8cc1Swenshuai.xi * that any message (a request or response) from another device will 117*53ee8cc1Swenshuai.xi * always have exactly the same address. If you didn't do this, 118*53ee8cc1Swenshuai.xi * requests and responses from the same device would have different 119*53ee8cc1Swenshuai.xi * addresses, and that's not too cool. 120*53ee8cc1Swenshuai.xi * 121*53ee8cc1Swenshuai.xi * In this address, the remote_SWID is always the SWID the remote 122*53ee8cc1Swenshuai.xi * message came from, or the SWID we are sending the message to. 123*53ee8cc1Swenshuai.xi * local_SWID is always our SWID. Note that having our SWID in the 124*53ee8cc1Swenshuai.xi * message is a little weird, but this is required. 125*53ee8cc1Swenshuai.xi */ 126*53ee8cc1Swenshuai.xi #define IPMI_LAN_ADDR_TYPE 0x04 127*53ee8cc1Swenshuai.xi struct ipmi_lan_addr { 128*53ee8cc1Swenshuai.xi int addr_type; 129*53ee8cc1Swenshuai.xi short channel; 130*53ee8cc1Swenshuai.xi unsigned char privilege; 131*53ee8cc1Swenshuai.xi unsigned char session_handle; 132*53ee8cc1Swenshuai.xi unsigned char remote_SWID; 133*53ee8cc1Swenshuai.xi unsigned char local_SWID; 134*53ee8cc1Swenshuai.xi unsigned char lun; 135*53ee8cc1Swenshuai.xi }; 136*53ee8cc1Swenshuai.xi 137*53ee8cc1Swenshuai.xi 138*53ee8cc1Swenshuai.xi /* 139*53ee8cc1Swenshuai.xi * Channel for talking directly with the BMC. When using this 140*53ee8cc1Swenshuai.xi * channel, This is for the system interface address type only. FIXME 141*53ee8cc1Swenshuai.xi * - is this right, or should we use -1? 142*53ee8cc1Swenshuai.xi */ 143*53ee8cc1Swenshuai.xi #define IPMI_BMC_CHANNEL 0xf 144*53ee8cc1Swenshuai.xi #define IPMI_NUM_CHANNELS 0x10 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi /* 147*53ee8cc1Swenshuai.xi * Used to signify an "all channel" bitmask. This is more than the 148*53ee8cc1Swenshuai.xi * actual number of channels because this is used in userland and 149*53ee8cc1Swenshuai.xi * will cover us if the number of channels is extended. 150*53ee8cc1Swenshuai.xi */ 151*53ee8cc1Swenshuai.xi #define IPMI_CHAN_ALL (~0) 152*53ee8cc1Swenshuai.xi 153*53ee8cc1Swenshuai.xi 154*53ee8cc1Swenshuai.xi /* 155*53ee8cc1Swenshuai.xi * A raw IPMI message without any addressing. This covers both 156*53ee8cc1Swenshuai.xi * commands and responses. The completion code is always the first 157*53ee8cc1Swenshuai.xi * byte of data in the response (as the spec shows the messages laid 158*53ee8cc1Swenshuai.xi * out). 159*53ee8cc1Swenshuai.xi */ 160*53ee8cc1Swenshuai.xi struct ipmi_msg { 161*53ee8cc1Swenshuai.xi unsigned char netfn; 162*53ee8cc1Swenshuai.xi unsigned char cmd; 163*53ee8cc1Swenshuai.xi unsigned short data_len; 164*53ee8cc1Swenshuai.xi unsigned char *data; 165*53ee8cc1Swenshuai.xi }; 166*53ee8cc1Swenshuai.xi 167*53ee8cc1Swenshuai.xi struct kernel_ipmi_msg { 168*53ee8cc1Swenshuai.xi unsigned char netfn; 169*53ee8cc1Swenshuai.xi unsigned char cmd; 170*53ee8cc1Swenshuai.xi unsigned short data_len; 171*53ee8cc1Swenshuai.xi unsigned char *data; 172*53ee8cc1Swenshuai.xi }; 173*53ee8cc1Swenshuai.xi 174*53ee8cc1Swenshuai.xi /* 175*53ee8cc1Swenshuai.xi * Various defines that are useful for IPMI applications. 176*53ee8cc1Swenshuai.xi */ 177*53ee8cc1Swenshuai.xi #define IPMI_INVALID_CMD_COMPLETION_CODE 0xC1 178*53ee8cc1Swenshuai.xi #define IPMI_TIMEOUT_COMPLETION_CODE 0xC3 179*53ee8cc1Swenshuai.xi #define IPMI_UNKNOWN_ERR_COMPLETION_CODE 0xff 180*53ee8cc1Swenshuai.xi 181*53ee8cc1Swenshuai.xi 182*53ee8cc1Swenshuai.xi /* 183*53ee8cc1Swenshuai.xi * Receive types for messages coming from the receive interface. This 184*53ee8cc1Swenshuai.xi * is used for the receive in-kernel interface and in the receive 185*53ee8cc1Swenshuai.xi * IOCTL. 186*53ee8cc1Swenshuai.xi * 187*53ee8cc1Swenshuai.xi * The "IPMI_RESPONSE_RESPNOSE_TYPE" is a little strange sounding, but 188*53ee8cc1Swenshuai.xi * it allows you to get the message results when you send a response 189*53ee8cc1Swenshuai.xi * message. 190*53ee8cc1Swenshuai.xi */ 191*53ee8cc1Swenshuai.xi #define IPMI_RESPONSE_RECV_TYPE 1 /* A response to a command */ 192*53ee8cc1Swenshuai.xi #define IPMI_ASYNC_EVENT_RECV_TYPE 2 /* Something from the event queue */ 193*53ee8cc1Swenshuai.xi #define IPMI_CMD_RECV_TYPE 3 /* A command from somewhere else */ 194*53ee8cc1Swenshuai.xi #define IPMI_RESPONSE_RESPONSE_TYPE 4 /* The response for 195*53ee8cc1Swenshuai.xi a sent response, giving any 196*53ee8cc1Swenshuai.xi error status for sending the 197*53ee8cc1Swenshuai.xi response. When you send a 198*53ee8cc1Swenshuai.xi response message, this will 199*53ee8cc1Swenshuai.xi be returned. */ 200*53ee8cc1Swenshuai.xi /* Note that async events and received commands do not have a completion 201*53ee8cc1Swenshuai.xi code as the first byte of the incoming data, unlike a response. */ 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi 204*53ee8cc1Swenshuai.xi /* 205*53ee8cc1Swenshuai.xi * Modes for ipmi_set_maint_mode() and the userland IOCTL. The AUTO 206*53ee8cc1Swenshuai.xi * setting is the default and means it will be set on certain 207*53ee8cc1Swenshuai.xi * commands. Hard setting it on and off will override automatic 208*53ee8cc1Swenshuai.xi * operation. 209*53ee8cc1Swenshuai.xi */ 210*53ee8cc1Swenshuai.xi #define IPMI_MAINTENANCE_MODE_AUTO 0 211*53ee8cc1Swenshuai.xi #define IPMI_MAINTENANCE_MODE_OFF 1 212*53ee8cc1Swenshuai.xi #define IPMI_MAINTENANCE_MODE_ON 2 213*53ee8cc1Swenshuai.xi 214*53ee8cc1Swenshuai.xi 215*53ee8cc1Swenshuai.xi 216*53ee8cc1Swenshuai.xi /* 217*53ee8cc1Swenshuai.xi * The userland interface 218*53ee8cc1Swenshuai.xi */ 219*53ee8cc1Swenshuai.xi 220*53ee8cc1Swenshuai.xi /* 221*53ee8cc1Swenshuai.xi * The userland interface for the IPMI driver is a standard character 222*53ee8cc1Swenshuai.xi * device, with each instance of an interface registered as a minor 223*53ee8cc1Swenshuai.xi * number under the major character device. 224*53ee8cc1Swenshuai.xi * 225*53ee8cc1Swenshuai.xi * The read and write calls do not work, to get messages in and out 226*53ee8cc1Swenshuai.xi * requires ioctl calls because of the complexity of the data. select 227*53ee8cc1Swenshuai.xi * and poll do work, so you can wait for input using the file 228*53ee8cc1Swenshuai.xi * descriptor, you just can use read to get it. 229*53ee8cc1Swenshuai.xi * 230*53ee8cc1Swenshuai.xi * In general, you send a command down to the interface and receive 231*53ee8cc1Swenshuai.xi * responses back. You can use the msgid value to correlate commands 232*53ee8cc1Swenshuai.xi * and responses, the driver will take care of figuring out which 233*53ee8cc1Swenshuai.xi * incoming messages are for which command and find the proper msgid 234*53ee8cc1Swenshuai.xi * value to report. You will only receive reponses for commands you 235*53ee8cc1Swenshuai.xi * send. Asynchronous events, however, go to all open users, so you 236*53ee8cc1Swenshuai.xi * must be ready to handle these (or ignore them if you don't care). 237*53ee8cc1Swenshuai.xi * 238*53ee8cc1Swenshuai.xi * The address type depends upon the channel type. When talking 239*53ee8cc1Swenshuai.xi * directly to the BMC (IPMC_BMC_CHANNEL), the address is ignored 240*53ee8cc1Swenshuai.xi * (IPMI_UNUSED_ADDR_TYPE). When talking to an IPMB channel, you must 241*53ee8cc1Swenshuai.xi * supply a valid IPMB address with the addr_type set properly. 242*53ee8cc1Swenshuai.xi * 243*53ee8cc1Swenshuai.xi * When talking to normal channels, the driver takes care of the 244*53ee8cc1Swenshuai.xi * details of formatting and sending messages on that channel. You do 245*53ee8cc1Swenshuai.xi * not, for instance, have to format a send command, you just send 246*53ee8cc1Swenshuai.xi * whatever command you want to the channel, the driver will create 247*53ee8cc1Swenshuai.xi * the send command, automatically issue receive command and get even 248*53ee8cc1Swenshuai.xi * commands, and pass those up to the proper user. 249*53ee8cc1Swenshuai.xi */ 250*53ee8cc1Swenshuai.xi 251*53ee8cc1Swenshuai.xi 252*53ee8cc1Swenshuai.xi /* The magic IOCTL value for this interface. */ 253*53ee8cc1Swenshuai.xi #define IPMI_IOC_MAGIC 'i' 254*53ee8cc1Swenshuai.xi 255*53ee8cc1Swenshuai.xi 256*53ee8cc1Swenshuai.xi /* Messages sent to the interface are this format. */ 257*53ee8cc1Swenshuai.xi struct ipmi_req { 258*53ee8cc1Swenshuai.xi unsigned char *addr; /* Address to send the message to. */ 259*53ee8cc1Swenshuai.xi unsigned int addr_len; 260*53ee8cc1Swenshuai.xi 261*53ee8cc1Swenshuai.xi long msgid; /* The sequence number for the message. This 262*53ee8cc1Swenshuai.xi exact value will be reported back in the 263*53ee8cc1Swenshuai.xi response to this request if it is a command. 264*53ee8cc1Swenshuai.xi If it is a response, this will be used as 265*53ee8cc1Swenshuai.xi the sequence value for the response. */ 266*53ee8cc1Swenshuai.xi 267*53ee8cc1Swenshuai.xi struct ipmi_msg msg; 268*53ee8cc1Swenshuai.xi }; 269*53ee8cc1Swenshuai.xi /* 270*53ee8cc1Swenshuai.xi * Send a message to the interfaces. error values are: 271*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 272*53ee8cc1Swenshuai.xi * - EINVAL - The address supplied was not valid, or the command 273*53ee8cc1Swenshuai.xi * was not allowed. 274*53ee8cc1Swenshuai.xi * - EMSGSIZE - The message to was too large. 275*53ee8cc1Swenshuai.xi * - ENOMEM - Buffers could not be allocated for the command. 276*53ee8cc1Swenshuai.xi */ 277*53ee8cc1Swenshuai.xi #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, \ 278*53ee8cc1Swenshuai.xi struct ipmi_req) 279*53ee8cc1Swenshuai.xi 280*53ee8cc1Swenshuai.xi /* Messages sent to the interface with timing parameters are this 281*53ee8cc1Swenshuai.xi format. */ 282*53ee8cc1Swenshuai.xi struct ipmi_req_settime { 283*53ee8cc1Swenshuai.xi struct ipmi_req req; 284*53ee8cc1Swenshuai.xi 285*53ee8cc1Swenshuai.xi /* See ipmi_request_settime() above for details on these 286*53ee8cc1Swenshuai.xi values. */ 287*53ee8cc1Swenshuai.xi int retries; 288*53ee8cc1Swenshuai.xi unsigned int retry_time_ms; 289*53ee8cc1Swenshuai.xi }; 290*53ee8cc1Swenshuai.xi /* 291*53ee8cc1Swenshuai.xi * Send a message to the interfaces with timing parameters. error values 292*53ee8cc1Swenshuai.xi * are: 293*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 294*53ee8cc1Swenshuai.xi * - EINVAL - The address supplied was not valid, or the command 295*53ee8cc1Swenshuai.xi * was not allowed. 296*53ee8cc1Swenshuai.xi * - EMSGSIZE - The message to was too large. 297*53ee8cc1Swenshuai.xi * - ENOMEM - Buffers could not be allocated for the command. 298*53ee8cc1Swenshuai.xi */ 299*53ee8cc1Swenshuai.xi #define IPMICTL_SEND_COMMAND_SETTIME _IOR(IPMI_IOC_MAGIC, 21, \ 300*53ee8cc1Swenshuai.xi struct ipmi_req_settime) 301*53ee8cc1Swenshuai.xi 302*53ee8cc1Swenshuai.xi /* Messages received from the interface are this format. */ 303*53ee8cc1Swenshuai.xi struct ipmi_recv { 304*53ee8cc1Swenshuai.xi int recv_type; /* Is this a command, response or an 305*53ee8cc1Swenshuai.xi asyncronous event. */ 306*53ee8cc1Swenshuai.xi 307*53ee8cc1Swenshuai.xi unsigned char *addr; /* Address the message was from is put 308*53ee8cc1Swenshuai.xi here. The caller must supply the 309*53ee8cc1Swenshuai.xi memory. */ 310*53ee8cc1Swenshuai.xi unsigned int addr_len; /* The size of the address buffer. 311*53ee8cc1Swenshuai.xi The caller supplies the full buffer 312*53ee8cc1Swenshuai.xi length, this value is updated to 313*53ee8cc1Swenshuai.xi the actual message length when the 314*53ee8cc1Swenshuai.xi message is received. */ 315*53ee8cc1Swenshuai.xi 316*53ee8cc1Swenshuai.xi long msgid; /* The sequence number specified in the request 317*53ee8cc1Swenshuai.xi if this is a response. If this is a command, 318*53ee8cc1Swenshuai.xi this will be the sequence number from the 319*53ee8cc1Swenshuai.xi command. */ 320*53ee8cc1Swenshuai.xi 321*53ee8cc1Swenshuai.xi struct ipmi_msg msg; /* The data field must point to a buffer. 322*53ee8cc1Swenshuai.xi The data_size field must be set to the 323*53ee8cc1Swenshuai.xi size of the message buffer. The 324*53ee8cc1Swenshuai.xi caller supplies the full buffer 325*53ee8cc1Swenshuai.xi length, this value is updated to the 326*53ee8cc1Swenshuai.xi actual message length when the message 327*53ee8cc1Swenshuai.xi is received. */ 328*53ee8cc1Swenshuai.xi }; 329*53ee8cc1Swenshuai.xi 330*53ee8cc1Swenshuai.xi /* 331*53ee8cc1Swenshuai.xi * Receive a message. error values: 332*53ee8cc1Swenshuai.xi * - EAGAIN - no messages in the queue. 333*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 334*53ee8cc1Swenshuai.xi * - EINVAL - The address supplied was not valid. 335*53ee8cc1Swenshuai.xi * - EMSGSIZE - The message to was too large to fit into the message buffer, 336*53ee8cc1Swenshuai.xi * the message will be left in the buffer. */ 337*53ee8cc1Swenshuai.xi #define IPMICTL_RECEIVE_MSG _IOWR(IPMI_IOC_MAGIC, 12, \ 338*53ee8cc1Swenshuai.xi struct ipmi_recv) 339*53ee8cc1Swenshuai.xi 340*53ee8cc1Swenshuai.xi /* 341*53ee8cc1Swenshuai.xi * Like RECEIVE_MSG, but if the message won't fit in the buffer, it 342*53ee8cc1Swenshuai.xi * will truncate the contents instead of leaving the data in the 343*53ee8cc1Swenshuai.xi * buffer. 344*53ee8cc1Swenshuai.xi */ 345*53ee8cc1Swenshuai.xi #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, \ 346*53ee8cc1Swenshuai.xi struct ipmi_recv) 347*53ee8cc1Swenshuai.xi 348*53ee8cc1Swenshuai.xi /* Register to get commands from other entities on this interface. */ 349*53ee8cc1Swenshuai.xi struct ipmi_cmdspec { 350*53ee8cc1Swenshuai.xi unsigned char netfn; 351*53ee8cc1Swenshuai.xi unsigned char cmd; 352*53ee8cc1Swenshuai.xi }; 353*53ee8cc1Swenshuai.xi 354*53ee8cc1Swenshuai.xi /* 355*53ee8cc1Swenshuai.xi * Register to receive a specific command. error values: 356*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 357*53ee8cc1Swenshuai.xi * - EBUSY - The netfn/cmd supplied was already in use. 358*53ee8cc1Swenshuai.xi * - ENOMEM - could not allocate memory for the entry. 359*53ee8cc1Swenshuai.xi */ 360*53ee8cc1Swenshuai.xi #define IPMICTL_REGISTER_FOR_CMD _IOR(IPMI_IOC_MAGIC, 14, \ 361*53ee8cc1Swenshuai.xi struct ipmi_cmdspec) 362*53ee8cc1Swenshuai.xi /* 363*53ee8cc1Swenshuai.xi * Unregister a regsitered command. error values: 364*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 365*53ee8cc1Swenshuai.xi * - ENOENT - The netfn/cmd was not found registered for this user. 366*53ee8cc1Swenshuai.xi */ 367*53ee8cc1Swenshuai.xi #define IPMICTL_UNREGISTER_FOR_CMD _IOR(IPMI_IOC_MAGIC, 15, \ 368*53ee8cc1Swenshuai.xi struct ipmi_cmdspec) 369*53ee8cc1Swenshuai.xi 370*53ee8cc1Swenshuai.xi /* 371*53ee8cc1Swenshuai.xi * Register to get commands from other entities on specific channels. 372*53ee8cc1Swenshuai.xi * This way, you can only listen on specific channels, or have messages 373*53ee8cc1Swenshuai.xi * from some channels go to one place and other channels to someplace 374*53ee8cc1Swenshuai.xi * else. The chans field is a bitmask, (1 << channel) for each channel. 375*53ee8cc1Swenshuai.xi * It may be IPMI_CHAN_ALL for all channels. 376*53ee8cc1Swenshuai.xi */ 377*53ee8cc1Swenshuai.xi struct ipmi_cmdspec_chans { 378*53ee8cc1Swenshuai.xi unsigned int netfn; 379*53ee8cc1Swenshuai.xi unsigned int cmd; 380*53ee8cc1Swenshuai.xi unsigned int chans; 381*53ee8cc1Swenshuai.xi }; 382*53ee8cc1Swenshuai.xi 383*53ee8cc1Swenshuai.xi /* 384*53ee8cc1Swenshuai.xi * Register to receive a specific command on specific channels. error values: 385*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 386*53ee8cc1Swenshuai.xi * - EBUSY - One of the netfn/cmd/chans supplied was already in use. 387*53ee8cc1Swenshuai.xi * - ENOMEM - could not allocate memory for the entry. 388*53ee8cc1Swenshuai.xi */ 389*53ee8cc1Swenshuai.xi #define IPMICTL_REGISTER_FOR_CMD_CHANS _IOR(IPMI_IOC_MAGIC, 28, \ 390*53ee8cc1Swenshuai.xi struct ipmi_cmdspec_chans) 391*53ee8cc1Swenshuai.xi /* 392*53ee8cc1Swenshuai.xi * Unregister some netfn/cmd/chans. error values: 393*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 394*53ee8cc1Swenshuai.xi * - ENOENT - None of the netfn/cmd/chans were found registered for this user. 395*53ee8cc1Swenshuai.xi */ 396*53ee8cc1Swenshuai.xi #define IPMICTL_UNREGISTER_FOR_CMD_CHANS _IOR(IPMI_IOC_MAGIC, 29, \ 397*53ee8cc1Swenshuai.xi struct ipmi_cmdspec_chans) 398*53ee8cc1Swenshuai.xi 399*53ee8cc1Swenshuai.xi /* 400*53ee8cc1Swenshuai.xi * Set whether this interface receives events. Note that the first 401*53ee8cc1Swenshuai.xi * user registered for events will get all pending events for the 402*53ee8cc1Swenshuai.xi * interface. error values: 403*53ee8cc1Swenshuai.xi * - EFAULT - an address supplied was invalid. 404*53ee8cc1Swenshuai.xi */ 405*53ee8cc1Swenshuai.xi #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) 406*53ee8cc1Swenshuai.xi 407*53ee8cc1Swenshuai.xi /* 408*53ee8cc1Swenshuai.xi * Set and get the slave address and LUN that we will use for our 409*53ee8cc1Swenshuai.xi * source messages. Note that this affects the interface, not just 410*53ee8cc1Swenshuai.xi * this user, so it will affect all users of this interface. This is 411*53ee8cc1Swenshuai.xi * so some initialization code can come in and do the OEM-specific 412*53ee8cc1Swenshuai.xi * things it takes to determine your address (if not the BMC) and set 413*53ee8cc1Swenshuai.xi * it for everyone else. You should probably leave the LUN alone. 414*53ee8cc1Swenshuai.xi */ 415*53ee8cc1Swenshuai.xi struct ipmi_channel_lun_address_set { 416*53ee8cc1Swenshuai.xi unsigned short channel; 417*53ee8cc1Swenshuai.xi unsigned char value; 418*53ee8cc1Swenshuai.xi }; 419*53ee8cc1Swenshuai.xi #define IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD \ 420*53ee8cc1Swenshuai.xi _IOR(IPMI_IOC_MAGIC, 24, struct ipmi_channel_lun_address_set) 421*53ee8cc1Swenshuai.xi #define IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD \ 422*53ee8cc1Swenshuai.xi _IOR(IPMI_IOC_MAGIC, 25, struct ipmi_channel_lun_address_set) 423*53ee8cc1Swenshuai.xi #define IPMICTL_SET_MY_CHANNEL_LUN_CMD \ 424*53ee8cc1Swenshuai.xi _IOR(IPMI_IOC_MAGIC, 26, struct ipmi_channel_lun_address_set) 425*53ee8cc1Swenshuai.xi #define IPMICTL_GET_MY_CHANNEL_LUN_CMD \ 426*53ee8cc1Swenshuai.xi _IOR(IPMI_IOC_MAGIC, 27, struct ipmi_channel_lun_address_set) 427*53ee8cc1Swenshuai.xi /* Legacy interfaces, these only set IPMB 0. */ 428*53ee8cc1Swenshuai.xi #define IPMICTL_SET_MY_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 17, unsigned int) 429*53ee8cc1Swenshuai.xi #define IPMICTL_GET_MY_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 18, unsigned int) 430*53ee8cc1Swenshuai.xi #define IPMICTL_SET_MY_LUN_CMD _IOR(IPMI_IOC_MAGIC, 19, unsigned int) 431*53ee8cc1Swenshuai.xi #define IPMICTL_GET_MY_LUN_CMD _IOR(IPMI_IOC_MAGIC, 20, unsigned int) 432*53ee8cc1Swenshuai.xi 433*53ee8cc1Swenshuai.xi /* 434*53ee8cc1Swenshuai.xi * Get/set the default timing values for an interface. You shouldn't 435*53ee8cc1Swenshuai.xi * generally mess with these. 436*53ee8cc1Swenshuai.xi */ 437*53ee8cc1Swenshuai.xi struct ipmi_timing_parms { 438*53ee8cc1Swenshuai.xi int retries; 439*53ee8cc1Swenshuai.xi unsigned int retry_time_ms; 440*53ee8cc1Swenshuai.xi }; 441*53ee8cc1Swenshuai.xi #define IPMICTL_SET_TIMING_PARMS_CMD _IOR(IPMI_IOC_MAGIC, 22, \ 442*53ee8cc1Swenshuai.xi struct ipmi_timing_parms) 443*53ee8cc1Swenshuai.xi #define IPMICTL_GET_TIMING_PARMS_CMD _IOR(IPMI_IOC_MAGIC, 23, \ 444*53ee8cc1Swenshuai.xi struct ipmi_timing_parms) 445*53ee8cc1Swenshuai.xi 446*53ee8cc1Swenshuai.xi /* 447*53ee8cc1Swenshuai.xi * Set the maintenance mode. See ipmi_set_maintenance_mode() above 448*53ee8cc1Swenshuai.xi * for a description of what this does. 449*53ee8cc1Swenshuai.xi */ 450*53ee8cc1Swenshuai.xi #define IPMICTL_GET_MAINTENANCE_MODE_CMD _IOR(IPMI_IOC_MAGIC, 30, int) 451*53ee8cc1Swenshuai.xi #define IPMICTL_SET_MAINTENANCE_MODE_CMD _IOW(IPMI_IOC_MAGIC, 31, int) 452*53ee8cc1Swenshuai.xi 453*53ee8cc1Swenshuai.xi #endif /* __LINUX_IPMI_H */ 454