Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 1 | ===================== |
| 2 | The Linux IPMI Driver |
| 3 | ===================== |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 5 | :Author: Corey Minyard <minyard@mvista.com> / <minyard@acm.org> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | |
| 7 | The Intelligent Platform Management Interface, or IPMI, is a |
| 8 | standard for controlling intelligent devices that monitor a system. |
| 9 | It provides for dynamic discovery of sensors in the system and the |
| 10 | ability to monitor the sensors and be informed when the sensor's |
| 11 | values change or go outside certain boundaries. It also has a |
Matt LaPlante | dc474c8 | 2006-06-30 01:56:06 -0700 | [diff] [blame] | 12 | standardized database for field-replaceable units (FRUs) and a watchdog |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | timer. |
| 14 | |
| 15 | To use this, you need an interface to an IPMI controller in your |
| 16 | system (called a Baseboard Management Controller, or BMC) and |
| 17 | management software that can use the IPMI system. |
| 18 | |
| 19 | This document describes how to use the IPMI driver for Linux. If you |
| 20 | are not familiar with IPMI itself, see the web site at |
| 21 | http://www.intel.com/design/servers/ipmi/index.htm. IPMI is a big |
| 22 | subject and I can't cover it all here! |
| 23 | |
| 24 | Configuration |
| 25 | ------------- |
| 26 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 27 | The Linux IPMI driver is modular, which means you have to pick several |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 | things to have it work right depending on your hardware. Most of |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 29 | these are available in the 'Character Devices' menu then the IPMI |
| 30 | menu. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 31 | |
| 32 | No matter what, you must pick 'IPMI top-level message handler' to use |
| 33 | IPMI. What you do beyond that depends on your needs and hardware. |
| 34 | |
| 35 | The message handler does not provide any user-level interfaces. |
| 36 | Kernel code (like the watchdog) can still use it. If you need access |
| 37 | from userland, you need to select 'Device interface for IPMI' if you |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 38 | want access through a device driver. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 39 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 40 | The driver interface depends on your hardware. If your system |
| 41 | properly provides the SMBIOS info for IPMI, the driver will detect it |
| 42 | and just work. If you have a board with a standard interface (These |
| 43 | will generally be either "KCS", "SMIC", or "BT", consult your hardware |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 44 | manual), choose the 'IPMI SI handler' option. A driver also exists |
| 45 | for direct I2C access to the IPMI management controller. Some boards |
| 46 | support this, but it is unknown if it will work on every board. For |
| 47 | this, choose 'IPMI SMBus handler', but be ready to try to do some |
| 48 | figuring to see if it will work on your system if the SMBIOS/APCI |
| 49 | information is wrong or not present. It is fairly safe to have both |
| 50 | these enabled and let the drivers auto-detect what is present. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 51 | |
| 52 | You should generally enable ACPI on your system, as systems with IPMI |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 53 | can have ACPI tables describing them. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 54 | |
| 55 | If you have a standard interface and the board manufacturer has done |
| 56 | their job correctly, the IPMI controller should be automatically |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 57 | detected (via ACPI or SMBIOS tables) and should just work. Sadly, |
| 58 | many boards do not have this information. The driver attempts |
| 59 | standard defaults, but they may not work. If you fall into this |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 60 | situation, you need to read the section below named 'The SI Driver' or |
| 61 | "The SMBus Driver" on how to hand-configure your system. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 62 | |
| 63 | IPMI defines a standard watchdog timer. You can enable this with the |
| 64 | 'IPMI Watchdog Timer' config option. If you compile the driver into |
| 65 | the kernel, then via a kernel command-line option you can have the |
Matt LaPlante | dc474c8 | 2006-06-30 01:56:06 -0700 | [diff] [blame] | 66 | watchdog timer start as soon as it initializes. It also have a lot |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 | of other options, see the 'Watchdog' section below for more details. |
| 68 | Note that you can also have the watchdog continue to run if it is |
| 69 | closed (by default it is disabled on close). Go into the 'Watchdog |
| 70 | Cards' menu, enable 'Watchdog Timer Support', and enable the option |
| 71 | 'Disable watchdog shutdown on close'. |
| 72 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 73 | IPMI systems can often be powered off using IPMI commands. Select |
| 74 | 'IPMI Poweroff' to do this. The driver will auto-detect if the system |
| 75 | can be powered off by IPMI. It is safe to enable this even if your |
| 76 | system doesn't support this option. This works on ATCA systems, the |
| 77 | Radisys CPI1 card, and any IPMI system that supports standard chassis |
| 78 | management commands. |
| 79 | |
| 80 | If you want the driver to put an event into the event log on a panic, |
| 81 | enable the 'Generate a panic event to all BMCs on a panic' option. If |
| 82 | you want the whole panic string put into the event log using OEM |
| 83 | events, enable the 'Generate OEM events containing the panic string' |
Corey Minyard | 1c9f98d | 2017-08-18 17:32:03 -0500 | [diff] [blame] | 84 | option. You can also enable these dynamically by setting the module |
| 85 | parameter named "panic_op" in the ipmi_msghandler module to "event" |
| 86 | or "string". Setting that parameter to "none" disables this function. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 87 | |
| 88 | Basic Design |
| 89 | ------------ |
| 90 | |
| 91 | The Linux IPMI driver is designed to be very modular and flexible, you |
| 92 | only need to take the pieces you need and you can use it in many |
| 93 | different ways. Because of that, it's broken into many chunks of |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 94 | code. These chunks (by module name) are: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 95 | |
| 96 | ipmi_msghandler - This is the central piece of software for the IPMI |
| 97 | system. It handles all messages, message timing, and responses. The |
| 98 | IPMI users tie into this, and the IPMI physical interfaces (called |
| 99 | System Management Interfaces, or SMIs) also tie in here. This |
| 100 | provides the kernelland interface for IPMI, but does not provide an |
| 101 | interface for use by application processes. |
| 102 | |
| 103 | ipmi_devintf - This provides a userland IOCTL interface for the IPMI |
| 104 | driver, each open file for this device ties in to the message handler |
| 105 | as an IPMI user. |
| 106 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 107 | ipmi_si - A driver for various system interfaces. This supports KCS, |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 108 | SMIC, and BT interfaces. Unless you have an SMBus interface or your |
| 109 | own custom interface, you probably need to use this. |
| 110 | |
| 111 | ipmi_ssif - A driver for accessing BMCs on the SMBus. It uses the |
| 112 | I2C kernel driver's SMBus interfaces to send and receive IPMI messages |
| 113 | over the SMBus. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 114 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 115 | ipmi_powernv - A driver for access BMCs on POWERNV systems. |
| 116 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 117 | ipmi_watchdog - IPMI requires systems to have a very capable watchdog |
| 118 | timer. This driver implements the standard Linux watchdog timer |
| 119 | interface on top of the IPMI message handler. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 120 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 121 | ipmi_poweroff - Some systems support the ability to be turned off via |
| 122 | IPMI commands. |
| 123 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 124 | bt-bmc - This is not part of the main driver, but instead a driver for |
| 125 | accessing a BMC-side interface of a BT interface. It is used on BMCs |
| 126 | running Linux to provide an interface to the host. |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 127 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 128 | These are all individually selectable via configuration options. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 129 | |
| 130 | Much documentation for the interface is in the include files. The |
| 131 | IPMI include files are: |
| 132 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 133 | linux/ipmi.h - Contains the user interface and IOCTL interface for IPMI. |
| 134 | |
| 135 | linux/ipmi_smi.h - Contains the interface for system management interfaces |
| 136 | (things that interface to IPMI controllers) to use. |
| 137 | |
| 138 | linux/ipmi_msgdefs.h - General definitions for base IPMI messaging. |
| 139 | |
| 140 | |
| 141 | Addressing |
| 142 | ---------- |
| 143 | |
| 144 | The IPMI addressing works much like IP addresses, you have an overlay |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 145 | to handle the different address types. The overlay is:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 146 | |
| 147 | struct ipmi_addr |
| 148 | { |
| 149 | int addr_type; |
| 150 | short channel; |
| 151 | char data[IPMI_MAX_ADDR_SIZE]; |
| 152 | }; |
| 153 | |
| 154 | The addr_type determines what the address really is. The driver |
| 155 | currently understands two different types of addresses. |
| 156 | |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 157 | "System Interface" addresses are defined as:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 158 | |
| 159 | struct ipmi_system_interface_addr |
| 160 | { |
| 161 | int addr_type; |
| 162 | short channel; |
| 163 | }; |
| 164 | |
| 165 | and the type is IPMI_SYSTEM_INTERFACE_ADDR_TYPE. This is used for talking |
| 166 | straight to the BMC on the current card. The channel must be |
| 167 | IPMI_BMC_CHANNEL. |
| 168 | |
| 169 | Messages that are destined to go out on the IPMB bus use the |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 170 | IPMI_IPMB_ADDR_TYPE address type. The format is:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 171 | |
| 172 | struct ipmi_ipmb_addr |
| 173 | { |
| 174 | int addr_type; |
| 175 | short channel; |
| 176 | unsigned char slave_addr; |
| 177 | unsigned char lun; |
| 178 | }; |
| 179 | |
| 180 | The "channel" here is generally zero, but some devices support more |
| 181 | than one channel, it corresponds to the channel as defined in the IPMI |
| 182 | spec. |
| 183 | |
| 184 | |
| 185 | Messages |
| 186 | -------- |
| 187 | |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 188 | Messages are defined as:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 189 | |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 190 | struct ipmi_msg |
| 191 | { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 192 | unsigned char netfn; |
| 193 | unsigned char lun; |
| 194 | unsigned char cmd; |
| 195 | unsigned char *data; |
| 196 | int data_len; |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 197 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 198 | |
| 199 | The driver takes care of adding/stripping the header information. The |
| 200 | data portion is just the data to be send (do NOT put addressing info |
| 201 | here) or the response. Note that the completion code of a response is |
| 202 | the first item in "data", it is not stripped out because that is how |
| 203 | all the messages are defined in the spec (and thus makes counting the |
| 204 | offsets a little easier :-). |
| 205 | |
| 206 | When using the IOCTL interface from userland, you must provide a block |
| 207 | of data for "data", fill it, and set data_len to the length of the |
| 208 | block of data, even when receiving messages. Otherwise the driver |
| 209 | will have no place to put the message. |
| 210 | |
| 211 | Messages coming up from the message handler in kernelland will come in |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 212 | as:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 213 | |
| 214 | struct ipmi_recv_msg |
| 215 | { |
| 216 | struct list_head link; |
| 217 | |
| 218 | /* The type of message as defined in the "Receive Types" |
| 219 | defines above. */ |
| 220 | int recv_type; |
| 221 | |
| 222 | ipmi_user_t *user; |
| 223 | struct ipmi_addr addr; |
| 224 | long msgid; |
| 225 | struct ipmi_msg msg; |
| 226 | |
| 227 | /* Call this when done with the message. It will presumably free |
| 228 | the message and do any other necessary cleanup. */ |
| 229 | void (*done)(struct ipmi_recv_msg *msg); |
| 230 | |
| 231 | /* Place-holder for the data, don't make any assumptions about |
| 232 | the size or existence of this, since it may change. */ |
| 233 | unsigned char msg_data[IPMI_MAX_MSG_LENGTH]; |
| 234 | }; |
| 235 | |
| 236 | You should look at the receive type and handle the message |
| 237 | appropriately. |
| 238 | |
| 239 | |
| 240 | The Upper Layer Interface (Message Handler) |
| 241 | ------------------------------------------- |
| 242 | |
| 243 | The upper layer of the interface provides the users with a consistent |
| 244 | view of the IPMI interfaces. It allows multiple SMI interfaces to be |
| 245 | addressed (because some boards actually have multiple BMCs on them) |
| 246 | and the user should not have to care what type of SMI is below them. |
| 247 | |
| 248 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 249 | Watching For Interfaces |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 250 | ^^^^^^^^^^^^^^^^^^^^^^^ |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 251 | |
| 252 | When your code comes up, the IPMI driver may or may not have detected |
| 253 | if IPMI devices exist. So you might have to defer your setup until |
| 254 | the device is detected, or you might be able to do it immediately. |
| 255 | To handle this, and to allow for discovery, you register an SMI |
| 256 | watcher with ipmi_smi_watcher_register() to iterate over interfaces |
| 257 | and tell you when they come and go. |
| 258 | |
| 259 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 260 | Creating the User |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 261 | ^^^^^^^^^^^^^^^^^ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 262 | |
Rami Rosen | 08f6cd0 | 2016-12-18 21:11:54 +0200 | [diff] [blame] | 263 | To use the message handler, you must first create a user using |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 264 | ipmi_create_user. The interface number specifies which SMI you want |
| 265 | to connect to, and you must supply callback functions to be called |
| 266 | when data comes in. The callback function can run at interrupt level, |
| 267 | so be careful using the callbacks. This also allows to you pass in a |
| 268 | piece of data, the handler_data, that will be passed back to you on |
| 269 | all calls. |
| 270 | |
| 271 | Once you are done, call ipmi_destroy_user() to get rid of the user. |
| 272 | |
| 273 | From userland, opening the device automatically creates a user, and |
| 274 | closing the device automatically destroys the user. |
| 275 | |
| 276 | |
| 277 | Messaging |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 278 | ^^^^^^^^^ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 279 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 280 | To send a message from kernel-land, the ipmi_request_settime() call does |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 281 | pretty much all message handling. Most of the parameter are |
| 282 | self-explanatory. However, it takes a "msgid" parameter. This is NOT |
| 283 | the sequence number of messages. It is simply a long value that is |
| 284 | passed back when the response for the message is returned. You may |
| 285 | use it for anything you like. |
| 286 | |
| 287 | Responses come back in the function pointed to by the ipmi_recv_hndl |
| 288 | field of the "handler" that you passed in to ipmi_create_user(). |
| 289 | Remember again, these may be running at interrupt level. Remember to |
| 290 | look at the receive type, too. |
| 291 | |
| 292 | From userland, you fill out an ipmi_req_t structure and use the |
| 293 | IPMICTL_SEND_COMMAND ioctl. For incoming stuff, you can use select() |
| 294 | or poll() to wait for messages to come in. However, you cannot use |
| 295 | read() to get them, you must call the IPMICTL_RECEIVE_MSG with the |
| 296 | ipmi_recv_t structure to actually get the message. Remember that you |
| 297 | must supply a pointer to a block of data in the msg.data field, and |
| 298 | you must fill in the msg.data_len field with the size of the data. |
| 299 | This gives the receiver a place to actually put the message. |
| 300 | |
| 301 | If the message cannot fit into the data you provide, you will get an |
| 302 | EMSGSIZE error and the driver will leave the data in the receive |
| 303 | queue. If you want to get it and have it truncate the message, us |
| 304 | the IPMICTL_RECEIVE_MSG_TRUNC ioctl. |
| 305 | |
| 306 | When you send a command (which is defined by the lowest-order bit of |
| 307 | the netfn per the IPMI spec) on the IPMB bus, the driver will |
| 308 | automatically assign the sequence number to the command and save the |
| 309 | command. If the response is not receive in the IPMI-specified 5 |
| 310 | seconds, it will generate a response automatically saying the command |
| 311 | timed out. If an unsolicited response comes in (if it was after 5 |
| 312 | seconds, for instance), that response will be ignored. |
| 313 | |
| 314 | In kernelland, after you receive a message and are done with it, you |
| 315 | MUST call ipmi_free_recv_msg() on it, or you will leak messages. Note |
| 316 | that you should NEVER mess with the "done" field of a message, that is |
| 317 | required to properly clean up the message. |
| 318 | |
| 319 | Note that when sending, there is an ipmi_request_supply_msgs() call |
| 320 | that lets you supply the smi and receive message. This is useful for |
| 321 | pieces of code that need to work even if the system is out of buffers |
| 322 | (the watchdog timer uses this, for instance). You supply your own |
| 323 | buffer and own free routines. This is not recommended for normal use, |
| 324 | though, since it is tricky to manage your own buffers. |
| 325 | |
| 326 | |
| 327 | Events and Incoming Commands |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 328 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 329 | |
| 330 | The driver takes care of polling for IPMI events and receiving |
| 331 | commands (commands are messages that are not responses, they are |
| 332 | commands that other things on the IPMB bus have sent you). To receive |
| 333 | these, you must register for them, they will not automatically be sent |
| 334 | to you. |
| 335 | |
| 336 | To receive events, you must call ipmi_set_gets_events() and set the |
| 337 | "val" to non-zero. Any events that have been received by the driver |
| 338 | since startup will immediately be delivered to the first user that |
| 339 | registers for events. After that, if multiple users are registered |
| 340 | for events, they will all receive all events that come in. |
| 341 | |
| 342 | For receiving commands, you have to individually register commands you |
| 343 | want to receive. Call ipmi_register_for_cmd() and supply the netfn |
Corey Minyard | c69c3127 | 2006-09-30 23:27:56 -0700 | [diff] [blame] | 344 | and command name for each command you want to receive. You also |
| 345 | specify a bitmask of the channels you want to receive the command from |
| 346 | (or use IPMI_CHAN_ALL for all channels if you don't care). Only one |
| 347 | user may be registered for each netfn/cmd/channel, but different users |
| 348 | may register for different commands, or the same command if the |
| 349 | channel bitmasks do not overlap. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 350 | |
| 351 | From userland, equivalent IOCTLs are provided to do these functions. |
| 352 | |
| 353 | |
| 354 | The Lower Layer (SMI) Interface |
| 355 | ------------------------------- |
| 356 | |
| 357 | As mentioned before, multiple SMI interfaces may be registered to the |
| 358 | message handler, each of these is assigned an interface number when |
| 359 | they register with the message handler. They are generally assigned |
| 360 | in the order they register, although if an SMI unregisters and then |
| 361 | another one registers, all bets are off. |
| 362 | |
| 363 | The ipmi_smi.h defines the interface for management interfaces, see |
| 364 | that for more details. |
| 365 | |
| 366 | |
| 367 | The SI Driver |
| 368 | ------------- |
| 369 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 370 | The SI driver allows KCS, BT, and SMIC interfaces to be configured |
| 371 | in the system. It discovers interfaces through a host of different |
| 372 | methods, depending on the system. |
| 373 | |
| 374 | You can specify up to four interfaces on the module load line and |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 375 | control some module parameters:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 376 | |
| 377 | modprobe ipmi_si.o type=<type1>,<type2>.... |
| 378 | ports=<port1>,<port2>... addrs=<addr1>,<addr2>... |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 379 | irqs=<irq1>,<irq2>... |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 380 | regspacings=<sp1>,<sp2>,... regsizes=<size1>,<size2>,... |
| 381 | regshifts=<shift1>,<shift2>,... |
| 382 | slave_addrs=<addr1>,<addr2>,... |
Corey Minyard | a51f4a8 | 2006-10-03 01:13:59 -0700 | [diff] [blame] | 383 | force_kipmid=<enable1>,<enable2>,... |
Martin Wilck | ae74e82 | 2010-03-10 15:23:06 -0800 | [diff] [blame] | 384 | kipmid_max_busy_us=<ustime1>,<ustime2>,... |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 385 | unload_when_empty=[0|1] |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 386 | trydmi=[0|1] tryacpi=[0|1] |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 387 | tryplatform=[0|1] trypci=[0|1] |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 388 | |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 389 | Each of these except try... items is a list, the first item for the |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 390 | first interface, second item for the second interface, etc. |
| 391 | |
| 392 | The si_type may be either "kcs", "smic", or "bt". If you leave it blank, it |
| 393 | defaults to "kcs". |
| 394 | |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 395 | If you specify addrs as non-zero for an interface, the driver will |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 396 | use the memory address given as the address of the device. This |
| 397 | overrides si_ports. |
| 398 | |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 399 | If you specify ports as non-zero for an interface, the driver will |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 400 | use the I/O port given as the device address. |
| 401 | |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 402 | If you specify irqs as non-zero for an interface, the driver will |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 403 | attempt to use the given interrupt for the device. |
| 404 | |
Corey Minyard | f2afae4 | 2013-02-27 17:05:13 -0800 | [diff] [blame] | 405 | The other try... items disable discovery by their corresponding |
| 406 | names. These are all enabled by default, set them to zero to disable |
| 407 | them. The tryplatform disables openfirmware. |
| 408 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 409 | The next three parameters have to do with register layout. The |
| 410 | registers used by the interfaces may not appear at successive |
| 411 | locations and they may not be in 8-bit registers. These parameters |
| 412 | allow the layout of the data in the registers to be more precisely |
| 413 | specified. |
| 414 | |
| 415 | The regspacings parameter give the number of bytes between successive |
| 416 | register start addresses. For instance, if the regspacing is set to 4 |
| 417 | and the start address is 0xca2, then the address for the second |
| 418 | register would be 0xca6. This defaults to 1. |
| 419 | |
| 420 | The regsizes parameter gives the size of a register, in bytes. The |
| 421 | data used by IPMI is 8-bits wide, but it may be inside a larger |
| 422 | register. This parameter allows the read and write type to specified. |
| 423 | It may be 1, 2, 4, or 8. The default is 1. |
| 424 | |
| 425 | Since the register size may be larger than 32 bits, the IPMI data may not |
| 426 | be in the lower 8 bits. The regshifts parameter give the amount to shift |
| 427 | the data to get to the actual IPMI data. |
| 428 | |
| 429 | The slave_addrs specifies the IPMI address of the local BMC. This is |
| 430 | usually 0x20 and the driver defaults to that, but in case it's not, it |
| 431 | can be specified when the driver starts up. |
| 432 | |
Corey Minyard | a51f4a8 | 2006-10-03 01:13:59 -0700 | [diff] [blame] | 433 | The force_ipmid parameter forcefully enables (if set to 1) or disables |
| 434 | (if set to 0) the kernel IPMI daemon. Normally this is auto-detected |
| 435 | by the driver, but systems with broken interrupts might need an enable, |
| 436 | or users that don't want the daemon (don't need the performance, don't |
| 437 | want the CPU hit) can disable it. |
| 438 | |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 439 | If unload_when_empty is set to 1, the driver will be unloaded if it |
| 440 | doesn't find any interfaces or all the interfaces fail to work. The |
| 441 | default is one. Setting to 0 is useful with the hotmod, but is |
| 442 | obviously only useful for modules. |
| 443 | |
Corey Minyard | a51f4a8 | 2006-10-03 01:13:59 -0700 | [diff] [blame] | 444 | When compiled into the kernel, the parameters can be specified on the |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 445 | kernel command line as:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 446 | |
| 447 | ipmi_si.type=<type1>,<type2>... |
| 448 | ipmi_si.ports=<port1>,<port2>... ipmi_si.addrs=<addr1>,<addr2>... |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 449 | ipmi_si.irqs=<irq1>,<irq2>... |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 450 | ipmi_si.regspacings=<sp1>,<sp2>,... |
| 451 | ipmi_si.regsizes=<size1>,<size2>,... |
| 452 | ipmi_si.regshifts=<shift1>,<shift2>,... |
| 453 | ipmi_si.slave_addrs=<addr1>,<addr2>,... |
Corey Minyard | a51f4a8 | 2006-10-03 01:13:59 -0700 | [diff] [blame] | 454 | ipmi_si.force_kipmid=<enable1>,<enable2>,... |
Martin Wilck | ae74e82 | 2010-03-10 15:23:06 -0800 | [diff] [blame] | 455 | ipmi_si.kipmid_max_busy_us=<ustime1>,<ustime2>,... |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 456 | |
| 457 | It works the same as the module parameters of the same names. |
| 458 | |
Corey Minyard | 650dd0c | 2007-10-18 03:07:09 -0700 | [diff] [blame] | 459 | If your IPMI interface does not support interrupts and is a KCS or |
| 460 | SMIC interface, the IPMI driver will start a kernel thread for the |
| 461 | interface to help speed things up. This is a low-priority kernel |
| 462 | thread that constantly polls the IPMI driver while an IPMI operation |
| 463 | is in progress. The force_kipmid module parameter will all the user to |
| 464 | force this thread on or off. If you force it off and don't have |
| 465 | interrupts, the driver will run VERY slowly. Don't blame me, |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 466 | these interfaces suck. |
| 467 | |
Martin Wilck | ae74e82 | 2010-03-10 15:23:06 -0800 | [diff] [blame] | 468 | Unfortunately, this thread can use a lot of CPU depending on the |
| 469 | interface's performance. This can waste a lot of CPU and cause |
| 470 | various issues with detecting idle CPU and using extra power. To |
| 471 | avoid this, the kipmid_max_busy_us sets the maximum amount of time, in |
| 472 | microseconds, that kipmid will spin before sleeping for a tick. This |
| 473 | value sets a balance between performance and CPU waste and needs to be |
| 474 | tuned to your needs. Maybe, someday, auto-tuning will be added, but |
| 475 | that's not a simple thing and even the auto-tuning would need to be |
| 476 | tuned to the user's desired performance. |
| 477 | |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 478 | The driver supports a hot add and remove of interfaces. This way, |
| 479 | interfaces can be added or removed after the kernel is up and running. |
Corey Minyard | 650dd0c | 2007-10-18 03:07:09 -0700 | [diff] [blame] | 480 | This is done using /sys/modules/ipmi_si/parameters/hotmod, which is a |
| 481 | write-only parameter. You write a string to this interface. The string |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 482 | has the format:: |
| 483 | |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 484 | <op1>[:op2[:op3...]] |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 485 | |
| 486 | The "op"s are:: |
| 487 | |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 488 | add|remove,kcs|bt|smic,mem|i/o,<address>[,<opt1>[,<opt2>[,...]]] |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 489 | |
| 490 | You can specify more than one interface on the line. The "opt"s are:: |
| 491 | |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 492 | rsp=<regspacing> |
| 493 | rsi=<regsize> |
| 494 | rsh=<regshift> |
| 495 | irq=<irq> |
| 496 | ipmb=<ipmb slave addr> |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 497 | |
Corey Minyard | b361e27 | 2006-12-06 20:41:07 -0800 | [diff] [blame] | 498 | and these have the same meanings as discussed above. Note that you |
| 499 | can also use this on the kernel command line for a more compact format |
| 500 | for specifying an interface. Note that when removing an interface, |
| 501 | only the first three parameters (si type, address type, and address) |
| 502 | are used for the comparison. Any options are ignored for removing. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 503 | |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 504 | The SMBus Driver (SSIF) |
| 505 | ----------------------- |
| 506 | |
| 507 | The SMBus driver allows up to 4 SMBus devices to be configured in the |
| 508 | system. By default, the driver will only register with something it |
| 509 | finds in DMI or ACPI tables. You can change this |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 510 | at module load time (for a module) with:: |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 511 | |
| 512 | modprobe ipmi_ssif.o |
| 513 | addr=<i2caddr1>[,<i2caddr2>[,...]] |
| 514 | adapter=<adapter1>[,<adapter2>[...]] |
| 515 | dbg=<flags1>,<flags2>... |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 516 | slave_addrs=<addr1>,<addr2>,... |
| 517 | tryacpi=[0|1] trydmi=[0|1] |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 518 | [dbg_probe=1] |
| 519 | |
| 520 | The addresses are normal I2C addresses. The adapter is the string |
| 521 | name of the adapter, as shown in /sys/class/i2c-adapter/i2c-<n>/name. |
Corey Minyard | b0e9aaa | 2015-03-31 12:48:53 -0500 | [diff] [blame] | 522 | It is *NOT* i2c-<n> itself. Also, the comparison is done ignoring |
| 523 | spaces, so if the name is "This is an I2C chip" you can say |
| 524 | adapter_name=ThisisanI2cchip. This is because it's hard to pass in |
| 525 | spaces in kernel parameters. |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 526 | |
| 527 | The debug flags are bit flags for each BMC found, they are: |
| 528 | IPMI messages: 1, driver state: 2, timing: 4, I2C probe: 8 |
| 529 | |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 530 | The tryxxx parameters can be used to disable detecting interfaces |
| 531 | from various sources. |
| 532 | |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 533 | Setting dbg_probe to 1 will enable debugging of the probing and |
| 534 | detection process for BMCs on the SMBusses. |
| 535 | |
| 536 | The slave_addrs specifies the IPMI address of the local BMC. This is |
| 537 | usually 0x20 and the driver defaults to that, but in case it's not, it |
| 538 | can be specified when the driver starts up. |
| 539 | |
| 540 | Discovering the IPMI compliant BMC on the SMBus can cause devices on |
| 541 | the I2C bus to fail. The SMBus driver writes a "Get Device ID" IPMI |
| 542 | message as a block write to the I2C bus and waits for a response. |
| 543 | This action can be detrimental to some I2C devices. It is highly |
| 544 | recommended that the known I2C address be given to the SMBus driver in |
| 545 | the smb_addr parameter unless you have DMI or ACPI data to tell the |
| 546 | driver what to use. |
| 547 | |
| 548 | When compiled into the kernel, the addresses can be specified on the |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 549 | kernel command line as:: |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 550 | |
| 551 | ipmb_ssif.addr=<i2caddr1>[,<i2caddr2>[...]] |
| 552 | ipmi_ssif.adapter=<adapter1>[,<adapter2>[...]] |
| 553 | ipmi_ssif.dbg=<flags1>[,<flags2>[...]] |
| 554 | ipmi_ssif.dbg_probe=1 |
Corey Minyard | c11daf6 | 2016-10-25 20:31:53 -0500 | [diff] [blame] | 555 | ipmi_ssif.slave_addrs=<addr1>[,<addr2>[...]] |
| 556 | ipmi_ssif.tryacpi=[0|1] ipmi_ssif.trydmi=[0|1] |
Corey Minyard | 2593070 | 2012-03-19 16:00:55 -0500 | [diff] [blame] | 557 | |
| 558 | These are the same options as on the module command line. |
| 559 | |
| 560 | The I2C driver does not support non-blocking access or polling, so |
| 561 | this driver cannod to IPMI panic events, extend the watchdog at panic |
| 562 | time, or other panic-related IPMI functions without special kernel |
| 563 | patches and driver modifications. You can get those at the openipmi |
| 564 | web page. |
| 565 | |
| 566 | The driver supports a hot add and remove of interfaces through the I2C |
| 567 | sysfs interface. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 568 | |
| 569 | Other Pieces |
| 570 | ------------ |
| 571 | |
Zhao Yakui | 37bf501 | 2010-12-08 10:10:17 +0800 | [diff] [blame] | 572 | Get the detailed info related with the IPMI device |
| 573 | -------------------------------------------------- |
| 574 | |
| 575 | Some users need more detailed information about a device, like where |
| 576 | the address came from or the raw base device for the IPMI interface. |
| 577 | You can use the IPMI smi_watcher to catch the IPMI interfaces as they |
| 578 | come or go, and to grab the information, you can use the function |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 579 | ipmi_get_smi_info(), which returns the following structure:: |
Zhao Yakui | 37bf501 | 2010-12-08 10:10:17 +0800 | [diff] [blame] | 580 | |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 581 | struct ipmi_smi_info { |
Zhao Yakui | 37bf501 | 2010-12-08 10:10:17 +0800 | [diff] [blame] | 582 | enum ipmi_addr_src addr_src; |
| 583 | struct device *dev; |
| 584 | union { |
| 585 | struct { |
| 586 | void *acpi_handle; |
| 587 | } acpi_info; |
| 588 | } addr_info; |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 589 | }; |
Zhao Yakui | 37bf501 | 2010-12-08 10:10:17 +0800 | [diff] [blame] | 590 | |
| 591 | Currently special info for only for SI_ACPI address sources is |
| 592 | returned. Others may be added as necessary. |
| 593 | |
| 594 | Note that the dev pointer is included in the above structure, and |
| 595 | assuming ipmi_smi_get_info returns success, you must call put_device |
| 596 | on the dev pointer. |
| 597 | |
| 598 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 599 | Watchdog |
| 600 | -------- |
| 601 | |
| 602 | A watchdog timer is provided that implements the Linux-standard |
| 603 | watchdog timer interface. It has three module parameters that can be |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 604 | used to control it:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 605 | |
| 606 | modprobe ipmi_watchdog timeout=<t> pretimeout=<t> action=<action type> |
| 607 | preaction=<preaction type> preop=<preop type> start_now=x |
Jean-Yves Faye | c7f42c6 | 2015-09-29 11:39:19 +0200 | [diff] [blame] | 608 | nowayout=x ifnum_to_use=n panic_wdt_timeout=<t> |
Corey Minyard | b2c0394 | 2006-12-06 20:41:00 -0800 | [diff] [blame] | 609 | |
| 610 | ifnum_to_use specifies which interface the watchdog timer should use. |
| 611 | The default is -1, which means to pick the first one registered. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 612 | |
| 613 | The timeout is the number of seconds to the action, and the pretimeout |
| 614 | is the amount of seconds before the reset that the pre-timeout panic will |
| 615 | occur (if pretimeout is zero, then pretimeout will not be enabled). Note |
| 616 | that the pretimeout is the time before the final timeout. So if the |
| 617 | timeout is 50 seconds and the pretimeout is 10 seconds, then the pretimeout |
Jean-Yves Faye | c7f42c6 | 2015-09-29 11:39:19 +0200 | [diff] [blame] | 618 | will occur in 40 second (10 seconds before the timeout). The panic_wdt_timeout |
| 619 | is the value of timeout which is set on kernel panic, in order to let actions |
| 620 | such as kdump to occur during panic. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 621 | |
| 622 | The action may be "reset", "power_cycle", or "power_off", and |
| 623 | specifies what to do when the timer times out, and defaults to |
| 624 | "reset". |
| 625 | |
| 626 | The preaction may be "pre_smi" for an indication through the SMI |
| 627 | interface, "pre_int" for an indication through the SMI with an |
| 628 | interrupts, and "pre_nmi" for a NMI on a preaction. This is how |
| 629 | the driver is informed of the pretimeout. |
| 630 | |
| 631 | The preop may be set to "preop_none" for no operation on a pretimeout, |
| 632 | "preop_panic" to set the preoperation to panic, or "preop_give_data" |
| 633 | to provide data to read from the watchdog device when the pretimeout |
| 634 | occurs. A "pre_nmi" setting CANNOT be used with "preop_give_data" |
| 635 | because you can't do data operations from an NMI. |
| 636 | |
| 637 | When preop is set to "preop_give_data", one byte comes ready to read |
| 638 | on the device when the pretimeout occurs. Select and fasync work on |
| 639 | the device, as well. |
| 640 | |
| 641 | If start_now is set to 1, the watchdog timer will start running as |
| 642 | soon as the driver is loaded. |
| 643 | |
| 644 | If nowayout is set to 1, the watchdog timer will not stop when the |
| 645 | watchdog device is closed. The default value of nowayout is true |
| 646 | if the CONFIG_WATCHDOG_NOWAYOUT option is enabled, or false if not. |
| 647 | |
| 648 | When compiled into the kernel, the kernel command line is available |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 649 | for configuring the watchdog:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 650 | |
| 651 | ipmi_watchdog.timeout=<t> ipmi_watchdog.pretimeout=<t> |
| 652 | ipmi_watchdog.action=<action type> |
| 653 | ipmi_watchdog.preaction=<preaction type> |
| 654 | ipmi_watchdog.preop=<preop type> |
| 655 | ipmi_watchdog.start_now=x |
| 656 | ipmi_watchdog.nowayout=x |
Jean-Yves Faye | c7f42c6 | 2015-09-29 11:39:19 +0200 | [diff] [blame] | 657 | ipmi_watchdog.panic_wdt_timeout=<t> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 658 | |
| 659 | The options are the same as the module parameter options. |
| 660 | |
| 661 | The watchdog will panic and start a 120 second reset timeout if it |
| 662 | gets a pre-action. During a panic or a reboot, the watchdog will |
| 663 | start a 120 timer if it is running to make sure the reboot occurs. |
| 664 | |
Corey Minyard | 612b5a8 | 2007-10-18 03:07:10 -0700 | [diff] [blame] | 665 | Note that if you use the NMI preaction for the watchdog, you MUST NOT |
| 666 | use the nmi watchdog. There is no reasonable way to tell if an NMI |
| 667 | comes from the IPMI controller, so it must assume that if it gets an |
| 668 | otherwise unhandled NMI, it must be from IPMI and it will panic |
| 669 | immediately. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 670 | |
| 671 | Once you open the watchdog timer, you must write a 'V' character to the |
| 672 | device to close it, or the timer will not stop. This is a new semantic |
| 673 | for the driver, but makes it consistent with the rest of the watchdog |
| 674 | drivers in Linux. |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 675 | |
| 676 | |
| 677 | Panic Timeouts |
| 678 | -------------- |
| 679 | |
| 680 | The OpenIPMI driver supports the ability to put semi-custom and custom |
| 681 | events in the system event log if a panic occurs. if you enable the |
| 682 | 'Generate a panic event to all BMCs on a panic' option, you will get |
| 683 | one event on a panic in a standard IPMI event format. If you enable |
| 684 | the 'Generate OEM events containing the panic string' option, you will |
| 685 | also get a bunch of OEM events holding the panic string. |
| 686 | |
| 687 | |
| 688 | The field settings of the events are: |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 689 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 690 | * Generator ID: 0x21 (kernel) |
| 691 | * EvM Rev: 0x03 (this event is formatting in IPMI 1.0 format) |
| 692 | * Sensor Type: 0x20 (OS critical stop sensor) |
| 693 | * Sensor #: The first byte of the panic string (0 if no panic string) |
| 694 | * Event Dir | Event Type: 0x6f (Assertion, sensor-specific event info) |
| 695 | * Event Data 1: 0xa1 (Runtime stop in OEM bytes 2 and 3) |
| 696 | * Event data 2: second byte of panic string |
| 697 | * Event data 3: third byte of panic string |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 698 | |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 699 | See the IPMI spec for the details of the event layout. This event is |
| 700 | always sent to the local management controller. It will handle routing |
| 701 | the message to the right place |
| 702 | |
| 703 | Other OEM events have the following format: |
Mauro Carvalho Chehab | f5981a5 | 2017-05-14 15:18:08 -0300 | [diff] [blame] | 704 | |
| 705 | * Record ID (bytes 0-1): Set by the SEL. |
| 706 | * Record type (byte 2): 0xf0 (OEM non-timestamped) |
| 707 | * byte 3: The slave address of the card saving the panic |
| 708 | * byte 4: A sequence number (starting at zero) |
| 709 | The rest of the bytes (11 bytes) are the panic string. If the panic string |
| 710 | is longer than 11 bytes, multiple messages will be sent with increasing |
| 711 | sequence numbers. |
Corey Minyard | 845e78a | 2005-06-23 22:01:39 -0700 | [diff] [blame] | 712 | |
| 713 | Because you cannot send OEM events using the standard interface, this |
| 714 | function will attempt to find an SEL and add the events there. It |
| 715 | will first query the capabilities of the local management controller. |
| 716 | If it has an SEL, then they will be stored in the SEL of the local |
| 717 | management controller. If not, and the local management controller is |
| 718 | an event generator, the event receiver from the local management |
| 719 | controller will be queried and the events sent to the SEL on that |
| 720 | device. Otherwise, the events go nowhere since there is nowhere to |
| 721 | send them. |
Corey Minyard | 3b62594 | 2005-06-23 22:01:42 -0700 | [diff] [blame] | 722 | |
| 723 | |
| 724 | Poweroff |
| 725 | -------- |
| 726 | |
| 727 | If the poweroff capability is selected, the IPMI driver will install |
| 728 | a shutdown function into the standard poweroff function pointer. This |
| 729 | is in the ipmi_poweroff module. When the system requests a powerdown, |
| 730 | it will send the proper IPMI commands to do this. This is supported on |
| 731 | several platforms. |
| 732 | |
Corey Minyard | 8c702e1 | 2005-09-06 15:18:46 -0700 | [diff] [blame] | 733 | There is a module parameter named "poweroff_powercycle" that may |
| 734 | either be zero (do a power down) or non-zero (do a power cycle, power |
| 735 | the system off, then power it on in a few seconds). Setting |
| 736 | ipmi_poweroff.poweroff_control=x will do the same thing on the kernel |
| 737 | command line. The parameter is also available via the proc filesystem |
| 738 | in /proc/sys/dev/ipmi/poweroff_powercycle. Note that if the system |
| 739 | does not support power cycling, it will always do the power off. |
Corey Minyard | 3b62594 | 2005-06-23 22:01:42 -0700 | [diff] [blame] | 740 | |
Corey Minyard | b2c0394 | 2006-12-06 20:41:00 -0800 | [diff] [blame] | 741 | The "ifnum_to_use" parameter specifies which interface the poweroff |
| 742 | code should use. The default is -1, which means to pick the first one |
| 743 | registered. |
| 744 | |
Corey Minyard | 3b62594 | 2005-06-23 22:01:42 -0700 | [diff] [blame] | 745 | Note that if you have ACPI enabled, the system will prefer using ACPI to |
| 746 | power off. |