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