2 * acpi_ipmi.c - ACPI IPMI opregion
4 * Copyright (C) 2010, 2013 Intel Corporation
5 * Author: Zhao Yakui <yakui.zhao@intel.com>
6 * Lv Zheng <lv.zheng@intel.com>
8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or (at
13 * your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
27 #include <linux/module.h>
28 #include <linux/acpi.h>
29 #include <linux/ipmi.h>
30 #include <linux/spinlock.h>
32 MODULE_AUTHOR("Zhao Yakui");
33 MODULE_DESCRIPTION("ACPI IPMI Opregion driver");
34 MODULE_LICENSE("GPL");
36 #define ACPI_IPMI_OK 0
37 #define ACPI_IPMI_TIMEOUT 0x10
38 #define ACPI_IPMI_UNKNOWN 0x07
39 /* the IPMI timeout is 5s */
40 #define IPMI_TIMEOUT (5000)
41 #define ACPI_IPMI_MAX_MSG_LENGTH 64
43 struct acpi_ipmi_device
{
44 /* the device list attached to driver_data.ipmi_devices */
45 struct list_head head
;
47 /* the IPMI request message list */
48 struct list_head tx_msg_list
;
50 spinlock_t tx_msg_lock
;
53 ipmi_user_t user_interface
;
54 int ipmi_ifnum
; /* IPMI interface number */
60 struct ipmi_driver_data
{
61 struct list_head ipmi_devices
;
62 struct ipmi_smi_watcher bmc_events
;
63 struct ipmi_user_hndl ipmi_hndlrs
;
64 struct mutex ipmi_lock
;
67 * NOTE: IPMI System Interface Selection
68 * There is no system interface specified by the IPMI operation
69 * region access. We try to select one system interface with ACPI
70 * handle set. IPMI messages passed from the ACPI codes are sent
71 * to this selected global IPMI system interface.
73 struct acpi_ipmi_device
*selected_smi
;
76 struct acpi_ipmi_msg
{
77 struct list_head head
;
80 * General speaking the addr type should be SI_ADDR_TYPE. And
81 * the addr channel should be BMC.
82 * In fact it can also be IPMB type. But we will have to
83 * parse it from the Netfn command buffer. It is so complex
86 struct ipmi_addr addr
;
89 /* it is used to track whether the IPMI message is finished */
90 struct completion tx_complete
;
92 struct kernel_ipmi_msg tx_message
;
95 /* tx/rx data . And copy it from/to ACPI object buffer */
96 u8 data
[ACPI_IPMI_MAX_MSG_LENGTH
];
99 struct acpi_ipmi_device
*device
;
103 /* IPMI request/response buffer per ACPI 4.0, sec 5.5.2.4.3.2 */
104 struct acpi_ipmi_buffer
{
107 u8 data
[ACPI_IPMI_MAX_MSG_LENGTH
];
110 static void ipmi_register_bmc(int iface
, struct device
*dev
);
111 static void ipmi_bmc_gone(int iface
);
112 static void ipmi_msg_handler(struct ipmi_recv_msg
*msg
, void *user_msg_data
);
114 static struct ipmi_driver_data driver_data
= {
115 .ipmi_devices
= LIST_HEAD_INIT(driver_data
.ipmi_devices
),
117 .owner
= THIS_MODULE
,
118 .new_smi
= ipmi_register_bmc
,
119 .smi_gone
= ipmi_bmc_gone
,
122 .ipmi_recv_hndl
= ipmi_msg_handler
,
124 .ipmi_lock
= __MUTEX_INITIALIZER(driver_data
.ipmi_lock
)
127 static struct acpi_ipmi_device
*
128 ipmi_dev_alloc(int iface
, struct device
*dev
, acpi_handle handle
)
130 struct acpi_ipmi_device
*ipmi_device
;
134 ipmi_device
= kzalloc(sizeof(*ipmi_device
), GFP_KERNEL
);
138 kref_init(&ipmi_device
->kref
);
139 INIT_LIST_HEAD(&ipmi_device
->head
);
140 INIT_LIST_HEAD(&ipmi_device
->tx_msg_list
);
141 spin_lock_init(&ipmi_device
->tx_msg_lock
);
142 ipmi_device
->handle
= handle
;
143 ipmi_device
->dev
= get_device(dev
);
144 ipmi_device
->ipmi_ifnum
= iface
;
146 err
= ipmi_create_user(iface
, &driver_data
.ipmi_hndlrs
,
153 ipmi_device
->user_interface
= user
;
158 static void ipmi_dev_release(struct acpi_ipmi_device
*ipmi_device
)
160 ipmi_destroy_user(ipmi_device
->user_interface
);
161 put_device(ipmi_device
->dev
);
165 static void ipmi_dev_release_kref(struct kref
*kref
)
167 struct acpi_ipmi_device
*ipmi
=
168 container_of(kref
, struct acpi_ipmi_device
, kref
);
170 ipmi_dev_release(ipmi
);
173 static void __ipmi_dev_kill(struct acpi_ipmi_device
*ipmi_device
)
175 list_del(&ipmi_device
->head
);
176 if (driver_data
.selected_smi
== ipmi_device
)
177 driver_data
.selected_smi
= NULL
;
180 * Always setting dead flag after deleting from the list or
181 * list_for_each_entry() codes must get changed.
183 ipmi_device
->dead
= true;
186 static struct acpi_ipmi_device
*acpi_ipmi_dev_get(void)
188 struct acpi_ipmi_device
*ipmi_device
= NULL
;
190 mutex_lock(&driver_data
.ipmi_lock
);
191 if (driver_data
.selected_smi
) {
192 ipmi_device
= driver_data
.selected_smi
;
193 kref_get(&ipmi_device
->kref
);
195 mutex_unlock(&driver_data
.ipmi_lock
);
200 static void acpi_ipmi_dev_put(struct acpi_ipmi_device
*ipmi_device
)
202 kref_put(&ipmi_device
->kref
, ipmi_dev_release_kref
);
205 static struct acpi_ipmi_msg
*ipmi_msg_alloc(void)
207 struct acpi_ipmi_device
*ipmi
;
208 struct acpi_ipmi_msg
*ipmi_msg
;
210 ipmi
= acpi_ipmi_dev_get();
214 ipmi_msg
= kzalloc(sizeof(struct acpi_ipmi_msg
), GFP_KERNEL
);
216 acpi_ipmi_dev_put(ipmi
);
220 kref_init(&ipmi_msg
->kref
);
221 init_completion(&ipmi_msg
->tx_complete
);
222 INIT_LIST_HEAD(&ipmi_msg
->head
);
223 ipmi_msg
->device
= ipmi
;
224 ipmi_msg
->msg_done
= ACPI_IPMI_UNKNOWN
;
229 static void ipmi_msg_release(struct acpi_ipmi_msg
*tx_msg
)
231 acpi_ipmi_dev_put(tx_msg
->device
);
235 static void ipmi_msg_release_kref(struct kref
*kref
)
237 struct acpi_ipmi_msg
*tx_msg
=
238 container_of(kref
, struct acpi_ipmi_msg
, kref
);
240 ipmi_msg_release(tx_msg
);
243 static struct acpi_ipmi_msg
*acpi_ipmi_msg_get(struct acpi_ipmi_msg
*tx_msg
)
245 kref_get(&tx_msg
->kref
);
250 static void acpi_ipmi_msg_put(struct acpi_ipmi_msg
*tx_msg
)
252 kref_put(&tx_msg
->kref
, ipmi_msg_release_kref
);
255 #define IPMI_OP_RGN_NETFN(offset) ((offset >> 8) & 0xff)
256 #define IPMI_OP_RGN_CMD(offset) (offset & 0xff)
257 static int acpi_format_ipmi_request(struct acpi_ipmi_msg
*tx_msg
,
258 acpi_physical_address address
,
261 struct kernel_ipmi_msg
*msg
;
262 struct acpi_ipmi_buffer
*buffer
;
263 struct acpi_ipmi_device
*device
;
266 msg
= &tx_msg
->tx_message
;
269 * IPMI network function and command are encoded in the address
270 * within the IPMI OpRegion; see ACPI 4.0, sec 5.5.2.4.3.
272 msg
->netfn
= IPMI_OP_RGN_NETFN(address
);
273 msg
->cmd
= IPMI_OP_RGN_CMD(address
);
274 msg
->data
= tx_msg
->data
;
277 * value is the parameter passed by the IPMI opregion space handler.
278 * It points to the IPMI request message buffer
280 buffer
= (struct acpi_ipmi_buffer
*)value
;
282 /* copy the tx message data */
283 if (buffer
->length
> ACPI_IPMI_MAX_MSG_LENGTH
) {
284 dev_WARN_ONCE(tx_msg
->device
->dev
, true,
285 "Unexpected request (msg len %d).\n",
289 msg
->data_len
= buffer
->length
;
290 memcpy(tx_msg
->data
, buffer
->data
, msg
->data_len
);
293 * now the default type is SYSTEM_INTERFACE and channel type is BMC.
294 * If the netfn is APP_REQUEST and the cmd is SEND_MESSAGE,
295 * the addr type should be changed to IPMB. Then we will have to parse
296 * the IPMI request message buffer to get the IPMB address.
297 * If so, please fix me.
299 tx_msg
->addr
.addr_type
= IPMI_SYSTEM_INTERFACE_ADDR_TYPE
;
300 tx_msg
->addr
.channel
= IPMI_BMC_CHANNEL
;
301 tx_msg
->addr
.data
[0] = 0;
304 device
= tx_msg
->device
;
306 spin_lock_irqsave(&device
->tx_msg_lock
, flags
);
307 device
->curr_msgid
++;
308 tx_msg
->tx_msgid
= device
->curr_msgid
;
309 spin_unlock_irqrestore(&device
->tx_msg_lock
, flags
);
314 static void acpi_format_ipmi_response(struct acpi_ipmi_msg
*msg
,
317 struct acpi_ipmi_buffer
*buffer
;
320 * value is also used as output parameter. It represents the response
321 * IPMI message returned by IPMI command.
323 buffer
= (struct acpi_ipmi_buffer
*)value
;
326 * If the flag of msg_done is not set, it means that the IPMI command is
327 * not executed correctly.
329 buffer
->status
= msg
->msg_done
;
330 if (msg
->msg_done
!= ACPI_IPMI_OK
)
334 * If the IPMI response message is obtained correctly, the status code
335 * will be ACPI_IPMI_OK
337 buffer
->length
= msg
->rx_len
;
338 memcpy(buffer
->data
, msg
->data
, msg
->rx_len
);
341 static void ipmi_flush_tx_msg(struct acpi_ipmi_device
*ipmi
)
343 struct acpi_ipmi_msg
*tx_msg
;
347 * NOTE: On-going ipmi_recv_msg
348 * ipmi_msg_handler() may still be invoked by ipmi_si after
349 * flushing. But it is safe to do a fast flushing on module_exit()
350 * without waiting for all ipmi_recv_msg(s) to complete from
351 * ipmi_msg_handler() as it is ensured by ipmi_si that all
352 * ipmi_recv_msg(s) are freed after invoking ipmi_destroy_user().
354 spin_lock_irqsave(&ipmi
->tx_msg_lock
, flags
);
355 while (!list_empty(&ipmi
->tx_msg_list
)) {
356 tx_msg
= list_first_entry(&ipmi
->tx_msg_list
,
357 struct acpi_ipmi_msg
,
359 list_del(&tx_msg
->head
);
360 spin_unlock_irqrestore(&ipmi
->tx_msg_lock
, flags
);
362 /* wake up the sleep thread on the Tx msg */
363 complete(&tx_msg
->tx_complete
);
364 acpi_ipmi_msg_put(tx_msg
);
365 spin_lock_irqsave(&ipmi
->tx_msg_lock
, flags
);
367 spin_unlock_irqrestore(&ipmi
->tx_msg_lock
, flags
);
370 static void ipmi_cancel_tx_msg(struct acpi_ipmi_device
*ipmi
,
371 struct acpi_ipmi_msg
*msg
)
373 struct acpi_ipmi_msg
*tx_msg
, *temp
;
374 bool msg_found
= false;
377 spin_lock_irqsave(&ipmi
->tx_msg_lock
, flags
);
378 list_for_each_entry_safe(tx_msg
, temp
, &ipmi
->tx_msg_list
, head
) {
381 list_del(&tx_msg
->head
);
385 spin_unlock_irqrestore(&ipmi
->tx_msg_lock
, flags
);
388 acpi_ipmi_msg_put(tx_msg
);
391 static void ipmi_msg_handler(struct ipmi_recv_msg
*msg
, void *user_msg_data
)
393 struct acpi_ipmi_device
*ipmi_device
= user_msg_data
;
394 bool msg_found
= false;
395 struct acpi_ipmi_msg
*tx_msg
, *temp
;
396 struct device
*dev
= ipmi_device
->dev
;
399 if (msg
->user
!= ipmi_device
->user_interface
) {
401 "Unexpected response is returned. returned user %p, expected user %p\n",
402 msg
->user
, ipmi_device
->user_interface
);
406 spin_lock_irqsave(&ipmi_device
->tx_msg_lock
, flags
);
407 list_for_each_entry_safe(tx_msg
, temp
, &ipmi_device
->tx_msg_list
, head
) {
408 if (msg
->msgid
== tx_msg
->tx_msgid
) {
410 list_del(&tx_msg
->head
);
414 spin_unlock_irqrestore(&ipmi_device
->tx_msg_lock
, flags
);
418 "Unexpected response (msg id %ld) is returned.\n",
423 /* copy the response data to Rx_data buffer */
424 if (msg
->msg
.data_len
> ACPI_IPMI_MAX_MSG_LENGTH
) {
425 dev_WARN_ONCE(dev
, true,
426 "Unexpected response (msg len %d).\n",
431 /* response msg is an error msg */
432 msg
->recv_type
= IPMI_RESPONSE_RECV_TYPE
;
433 if (msg
->recv_type
== IPMI_RESPONSE_RECV_TYPE
&&
434 msg
->msg
.data_len
== 1) {
435 if (msg
->msg
.data
[0] == IPMI_TIMEOUT_COMPLETION_CODE
) {
436 dev_WARN_ONCE(dev
, true,
437 "Unexpected response (timeout).\n");
438 tx_msg
->msg_done
= ACPI_IPMI_TIMEOUT
;
443 tx_msg
->rx_len
= msg
->msg
.data_len
;
444 memcpy(tx_msg
->data
, msg
->msg
.data
, tx_msg
->rx_len
);
445 tx_msg
->msg_done
= ACPI_IPMI_OK
;
448 complete(&tx_msg
->tx_complete
);
449 acpi_ipmi_msg_put(tx_msg
);
451 ipmi_free_recv_msg(msg
);
454 static void ipmi_register_bmc(int iface
, struct device
*dev
)
456 struct acpi_ipmi_device
*ipmi_device
, *temp
;
458 struct ipmi_smi_info smi_data
;
461 err
= ipmi_get_smi_info(iface
, &smi_data
);
465 if (smi_data
.addr_src
!= SI_ACPI
)
467 handle
= smi_data
.addr_info
.acpi_info
.acpi_handle
;
471 ipmi_device
= ipmi_dev_alloc(iface
, smi_data
.dev
, handle
);
473 dev_warn(smi_data
.dev
, "Can't create IPMI user interface\n");
477 mutex_lock(&driver_data
.ipmi_lock
);
478 list_for_each_entry(temp
, &driver_data
.ipmi_devices
, head
) {
480 * if the corresponding ACPI handle is already added
481 * to the device list, don't add it again.
483 if (temp
->handle
== handle
)
486 if (!driver_data
.selected_smi
)
487 driver_data
.selected_smi
= ipmi_device
;
488 list_add_tail(&ipmi_device
->head
, &driver_data
.ipmi_devices
);
489 mutex_unlock(&driver_data
.ipmi_lock
);
491 put_device(smi_data
.dev
);
495 mutex_unlock(&driver_data
.ipmi_lock
);
496 ipmi_dev_release(ipmi_device
);
498 put_device(smi_data
.dev
);
502 static void ipmi_bmc_gone(int iface
)
504 struct acpi_ipmi_device
*ipmi_device
, *temp
;
505 bool dev_found
= false;
507 mutex_lock(&driver_data
.ipmi_lock
);
508 list_for_each_entry_safe(ipmi_device
, temp
,
509 &driver_data
.ipmi_devices
, head
) {
510 if (ipmi_device
->ipmi_ifnum
!= iface
) {
512 __ipmi_dev_kill(ipmi_device
);
516 if (!driver_data
.selected_smi
)
517 driver_data
.selected_smi
= list_first_entry_or_null(
518 &driver_data
.ipmi_devices
,
519 struct acpi_ipmi_device
, head
);
520 mutex_unlock(&driver_data
.ipmi_lock
);
523 ipmi_flush_tx_msg(ipmi_device
);
524 acpi_ipmi_dev_put(ipmi_device
);
529 * This is the IPMI opregion space handler.
530 * @function: indicates the read/write. In fact as the IPMI message is driven
531 * by command, only write is meaningful.
532 * @address: This contains the netfn/command of IPMI request message.
534 * @value : it is an in/out parameter. It points to the IPMI message buffer.
535 * Before the IPMI message is sent, it represents the actual request
536 * IPMI message. After the IPMI message is finished, it represents
537 * the response IPMI message returned by IPMI command.
538 * @handler_context: IPMI device context.
541 acpi_ipmi_space_handler(u32 function
, acpi_physical_address address
,
542 u32 bits
, acpi_integer
*value
,
543 void *handler_context
, void *region_context
)
545 struct acpi_ipmi_msg
*tx_msg
;
546 struct acpi_ipmi_device
*ipmi_device
;
552 * IPMI opregion message.
553 * IPMI message is firstly written to the BMC and system software
554 * can get the respsonse. So it is unmeaningful for the read access
557 if ((function
& ACPI_IO_MASK
) == ACPI_READ
)
560 tx_msg
= ipmi_msg_alloc();
563 ipmi_device
= tx_msg
->device
;
565 if (acpi_format_ipmi_request(tx_msg
, address
, value
) != 0) {
566 ipmi_msg_release(tx_msg
);
570 acpi_ipmi_msg_get(tx_msg
);
571 mutex_lock(&driver_data
.ipmi_lock
);
572 /* Do not add a tx_msg that can not be flushed. */
573 if (ipmi_device
->dead
) {
574 mutex_unlock(&driver_data
.ipmi_lock
);
575 ipmi_msg_release(tx_msg
);
578 spin_lock_irqsave(&ipmi_device
->tx_msg_lock
, flags
);
579 list_add_tail(&tx_msg
->head
, &ipmi_device
->tx_msg_list
);
580 spin_unlock_irqrestore(&ipmi_device
->tx_msg_lock
, flags
);
581 mutex_unlock(&driver_data
.ipmi_lock
);
583 err
= ipmi_request_settime(ipmi_device
->user_interface
,
587 NULL
, 0, 0, IPMI_TIMEOUT
);
592 wait_for_completion(&tx_msg
->tx_complete
);
594 acpi_format_ipmi_response(tx_msg
, value
);
598 ipmi_cancel_tx_msg(ipmi_device
, tx_msg
);
599 acpi_ipmi_msg_put(tx_msg
);
603 static int __init
acpi_ipmi_init(void)
611 status
= acpi_install_address_space_handler(ACPI_ROOT_OBJECT
,
613 &acpi_ipmi_space_handler
,
615 if (ACPI_FAILURE(status
)) {
616 pr_warn("Can't register IPMI opregion space handle\n");
619 result
= ipmi_smi_watcher_register(&driver_data
.bmc_events
);
621 pr_err("Can't register IPMI system interface watcher\n");
626 static void __exit
acpi_ipmi_exit(void)
628 struct acpi_ipmi_device
*ipmi_device
;
633 ipmi_smi_watcher_unregister(&driver_data
.bmc_events
);
636 * When one smi_watcher is unregistered, it is only deleted
637 * from the smi_watcher list. But the smi_gone callback function
638 * is not called. So explicitly uninstall the ACPI IPMI oregion
639 * handler and free it.
641 mutex_lock(&driver_data
.ipmi_lock
);
642 while (!list_empty(&driver_data
.ipmi_devices
)) {
643 ipmi_device
= list_first_entry(&driver_data
.ipmi_devices
,
644 struct acpi_ipmi_device
,
646 __ipmi_dev_kill(ipmi_device
);
647 mutex_unlock(&driver_data
.ipmi_lock
);
649 ipmi_flush_tx_msg(ipmi_device
);
650 acpi_ipmi_dev_put(ipmi_device
);
652 mutex_lock(&driver_data
.ipmi_lock
);
654 mutex_unlock(&driver_data
.ipmi_lock
);
655 acpi_remove_address_space_handler(ACPI_ROOT_OBJECT
,
657 &acpi_ipmi_space_handler
);
660 module_init(acpi_ipmi_init
);
661 module_exit(acpi_ipmi_exit
);