xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/linux/ipmi.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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