1 // SPDX-License-Identifier: GPL-2.0+
5 * Linux device interface for the IPMI message handler.
7 * Author: MontaVista Software, Inc.
8 * Corey Minyard <minyard@mvista.com>
11 * Copyright 2002 MontaVista Software Inc.
14 #include <linux/module.h>
15 #include <linux/moduleparam.h>
16 #include <linux/errno.h>
17 #include <linux/poll.h>
18 #include <linux/sched.h>
19 #include <linux/spinlock.h>
20 #include <linux/slab.h>
21 #include <linux/ipmi.h>
22 #include <linux/mutex.h>
23 #include <linux/init.h>
24 #include <linux/device.h>
25 #include <linux/compat.h>
27 struct ipmi_file_private
29 struct ipmi_user
*user
;
30 spinlock_t recv_msg_lock
;
31 struct list_head recv_msgs
;
32 struct fasync_struct
*fasync_queue
;
33 wait_queue_head_t wait
;
34 struct mutex recv_mutex
;
36 unsigned int default_retry_time_ms
;
39 static void file_receive_handler(struct ipmi_recv_msg
*msg
,
42 struct ipmi_file_private
*priv
= handler_data
;
46 spin_lock_irqsave(&priv
->recv_msg_lock
, flags
);
47 was_empty
= list_empty(&priv
->recv_msgs
);
48 list_add_tail(&msg
->link
, &priv
->recv_msgs
);
49 spin_unlock_irqrestore(&priv
->recv_msg_lock
, flags
);
52 wake_up_interruptible(&priv
->wait
);
53 kill_fasync(&priv
->fasync_queue
, SIGIO
, POLL_IN
);
57 static __poll_t
ipmi_poll(struct file
*file
, poll_table
*wait
)
59 struct ipmi_file_private
*priv
= file
->private_data
;
63 poll_wait(file
, &priv
->wait
, wait
);
65 spin_lock_irqsave(&priv
->recv_msg_lock
, flags
);
67 if (!list_empty(&priv
->recv_msgs
))
68 mask
|= (EPOLLIN
| EPOLLRDNORM
);
70 spin_unlock_irqrestore(&priv
->recv_msg_lock
, flags
);
75 static int ipmi_fasync(int fd
, struct file
*file
, int on
)
77 struct ipmi_file_private
*priv
= file
->private_data
;
79 return fasync_helper(fd
, file
, on
, &priv
->fasync_queue
);
82 static const struct ipmi_user_hndl ipmi_hndlrs
=
84 .ipmi_recv_hndl
= file_receive_handler
,
87 static int ipmi_open(struct inode
*inode
, struct file
*file
)
89 int if_num
= iminor(inode
);
91 struct ipmi_file_private
*priv
;
93 priv
= kmalloc(sizeof(*priv
), GFP_KERNEL
);
97 rv
= ipmi_create_user(if_num
,
106 file
->private_data
= priv
;
108 spin_lock_init(&priv
->recv_msg_lock
);
109 INIT_LIST_HEAD(&priv
->recv_msgs
);
110 init_waitqueue_head(&priv
->wait
);
111 priv
->fasync_queue
= NULL
;
112 mutex_init(&priv
->recv_mutex
);
114 /* Use the low-level defaults. */
115 priv
->default_retries
= -1;
116 priv
->default_retry_time_ms
= 0;
122 static int ipmi_release(struct inode
*inode
, struct file
*file
)
124 struct ipmi_file_private
*priv
= file
->private_data
;
126 struct ipmi_recv_msg
*msg
, *next
;
128 rv
= ipmi_destroy_user(priv
->user
);
132 list_for_each_entry_safe(msg
, next
, &priv
->recv_msgs
, link
)
133 ipmi_free_recv_msg(msg
);
140 static int handle_send_req(struct ipmi_user
*user
,
141 struct ipmi_req
*req
,
143 unsigned int retry_time_ms
)
146 struct ipmi_addr addr
;
147 struct kernel_ipmi_msg msg
;
149 if (req
->addr_len
> sizeof(struct ipmi_addr
))
152 if (copy_from_user(&addr
, req
->addr
, req
->addr_len
))
155 msg
.netfn
= req
->msg
.netfn
;
156 msg
.cmd
= req
->msg
.cmd
;
157 msg
.data_len
= req
->msg
.data_len
;
158 msg
.data
= kmalloc(IPMI_MAX_MSG_LENGTH
, GFP_KERNEL
);
162 /* From here out we cannot return, we must jump to "out" for
163 error exits to free msgdata. */
165 rv
= ipmi_validate_addr(&addr
, req
->addr_len
);
169 if (req
->msg
.data
!= NULL
) {
170 if (req
->msg
.data_len
> IPMI_MAX_MSG_LENGTH
) {
175 if (copy_from_user(msg
.data
,
177 req
->msg
.data_len
)) {
185 rv
= ipmi_request_settime(user
,
198 static int handle_recv(struct ipmi_file_private
*priv
,
199 bool trunc
, struct ipmi_recv
*rsp
,
200 int (*copyout
)(struct ipmi_recv
*, void __user
*),
204 struct list_head
*entry
;
205 struct ipmi_recv_msg
*msg
;
209 /* We claim a mutex because we don't want two
210 users getting something from the queue at a time.
211 Since we have to release the spinlock before we can
212 copy the data to the user, it's possible another
213 user will grab something from the queue, too. Then
214 the messages might get out of order if something
215 fails and the message gets put back onto the
216 queue. This mutex prevents that problem. */
217 mutex_lock(&priv
->recv_mutex
);
219 /* Grab the message off the list. */
220 spin_lock_irqsave(&priv
->recv_msg_lock
, flags
);
221 if (list_empty(&(priv
->recv_msgs
))) {
222 spin_unlock_irqrestore(&priv
->recv_msg_lock
, flags
);
226 entry
= priv
->recv_msgs
.next
;
227 msg
= list_entry(entry
, struct ipmi_recv_msg
, link
);
229 spin_unlock_irqrestore(&priv
->recv_msg_lock
, flags
);
231 addr_len
= ipmi_addr_length(msg
->addr
.addr_type
);
232 if (rsp
->addr_len
< addr_len
) {
234 goto recv_putback_on_err
;
237 if (copy_to_user(rsp
->addr
, &msg
->addr
, addr_len
)) {
239 goto recv_putback_on_err
;
241 rsp
->addr_len
= addr_len
;
243 rsp
->recv_type
= msg
->recv_type
;
244 rsp
->msgid
= msg
->msgid
;
245 rsp
->msg
.netfn
= msg
->msg
.netfn
;
246 rsp
->msg
.cmd
= msg
->msg
.cmd
;
248 if (msg
->msg
.data_len
> 0) {
249 if (rsp
->msg
.data_len
< msg
->msg
.data_len
) {
252 msg
->msg
.data_len
= rsp
->msg
.data_len
;
254 goto recv_putback_on_err
;
257 if (copy_to_user(rsp
->msg
.data
,
259 msg
->msg
.data_len
)) {
261 goto recv_putback_on_err
;
263 rsp
->msg
.data_len
= msg
->msg
.data_len
;
265 rsp
->msg
.data_len
= 0;
268 rv
= copyout(rsp
, to
);
270 goto recv_putback_on_err
;
272 mutex_unlock(&priv
->recv_mutex
);
273 ipmi_free_recv_msg(msg
);
277 /* If we got an error, put the message back onto
278 the head of the queue. */
279 spin_lock_irqsave(&priv
->recv_msg_lock
, flags
);
280 list_add(entry
, &priv
->recv_msgs
);
281 spin_unlock_irqrestore(&priv
->recv_msg_lock
, flags
);
283 mutex_unlock(&priv
->recv_mutex
);
287 static int copyout_recv(struct ipmi_recv
*rsp
, void __user
*to
)
289 return copy_to_user(to
, rsp
, sizeof(struct ipmi_recv
)) ? -EFAULT
: 0;
292 static long ipmi_ioctl(struct file
*file
,
297 struct ipmi_file_private
*priv
= file
->private_data
;
298 void __user
*arg
= (void __user
*)data
;
302 case IPMICTL_SEND_COMMAND
:
306 unsigned int retry_time_ms
;
308 if (copy_from_user(&req
, arg
, sizeof(req
))) {
313 mutex_lock(&priv
->recv_mutex
);
314 retries
= priv
->default_retries
;
315 retry_time_ms
= priv
->default_retry_time_ms
;
316 mutex_unlock(&priv
->recv_mutex
);
318 rv
= handle_send_req(priv
->user
, &req
, retries
, retry_time_ms
);
322 case IPMICTL_SEND_COMMAND_SETTIME
:
324 struct ipmi_req_settime req
;
326 if (copy_from_user(&req
, arg
, sizeof(req
))) {
331 rv
= handle_send_req(priv
->user
,
338 case IPMICTL_RECEIVE_MSG
:
339 case IPMICTL_RECEIVE_MSG_TRUNC
:
341 struct ipmi_recv rsp
;
343 if (copy_from_user(&rsp
, arg
, sizeof(rsp
)))
346 rv
= handle_recv(priv
, cmd
== IPMICTL_RECEIVE_MSG_TRUNC
,
347 &rsp
, copyout_recv
, arg
);
351 case IPMICTL_REGISTER_FOR_CMD
:
353 struct ipmi_cmdspec val
;
355 if (copy_from_user(&val
, arg
, sizeof(val
))) {
360 rv
= ipmi_register_for_cmd(priv
->user
, val
.netfn
, val
.cmd
,
365 case IPMICTL_UNREGISTER_FOR_CMD
:
367 struct ipmi_cmdspec val
;
369 if (copy_from_user(&val
, arg
, sizeof(val
))) {
374 rv
= ipmi_unregister_for_cmd(priv
->user
, val
.netfn
, val
.cmd
,
379 case IPMICTL_REGISTER_FOR_CMD_CHANS
:
381 struct ipmi_cmdspec_chans val
;
383 if (copy_from_user(&val
, arg
, sizeof(val
))) {
388 rv
= ipmi_register_for_cmd(priv
->user
, val
.netfn
, val
.cmd
,
393 case IPMICTL_UNREGISTER_FOR_CMD_CHANS
:
395 struct ipmi_cmdspec_chans val
;
397 if (copy_from_user(&val
, arg
, sizeof(val
))) {
402 rv
= ipmi_unregister_for_cmd(priv
->user
, val
.netfn
, val
.cmd
,
407 case IPMICTL_SET_GETS_EVENTS_CMD
:
411 if (copy_from_user(&val
, arg
, sizeof(val
))) {
416 rv
= ipmi_set_gets_events(priv
->user
, val
);
420 /* The next four are legacy, not per-channel. */
421 case IPMICTL_SET_MY_ADDRESS_CMD
:
425 if (copy_from_user(&val
, arg
, sizeof(val
))) {
430 rv
= ipmi_set_my_address(priv
->user
, 0, val
);
434 case IPMICTL_GET_MY_ADDRESS_CMD
:
439 rv
= ipmi_get_my_address(priv
->user
, 0, &rval
);
445 if (copy_to_user(arg
, &val
, sizeof(val
))) {
452 case IPMICTL_SET_MY_LUN_CMD
:
456 if (copy_from_user(&val
, arg
, sizeof(val
))) {
461 rv
= ipmi_set_my_LUN(priv
->user
, 0, val
);
465 case IPMICTL_GET_MY_LUN_CMD
:
470 rv
= ipmi_get_my_LUN(priv
->user
, 0, &rval
);
476 if (copy_to_user(arg
, &val
, sizeof(val
))) {
483 case IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD
:
485 struct ipmi_channel_lun_address_set val
;
487 if (copy_from_user(&val
, arg
, sizeof(val
))) {
492 return ipmi_set_my_address(priv
->user
, val
.channel
, val
.value
);
496 case IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD
:
498 struct ipmi_channel_lun_address_set val
;
500 if (copy_from_user(&val
, arg
, sizeof(val
))) {
505 rv
= ipmi_get_my_address(priv
->user
, val
.channel
, &val
.value
);
509 if (copy_to_user(arg
, &val
, sizeof(val
))) {
516 case IPMICTL_SET_MY_CHANNEL_LUN_CMD
:
518 struct ipmi_channel_lun_address_set val
;
520 if (copy_from_user(&val
, arg
, sizeof(val
))) {
525 rv
= ipmi_set_my_LUN(priv
->user
, val
.channel
, val
.value
);
529 case IPMICTL_GET_MY_CHANNEL_LUN_CMD
:
531 struct ipmi_channel_lun_address_set val
;
533 if (copy_from_user(&val
, arg
, sizeof(val
))) {
538 rv
= ipmi_get_my_LUN(priv
->user
, val
.channel
, &val
.value
);
542 if (copy_to_user(arg
, &val
, sizeof(val
))) {
549 case IPMICTL_SET_TIMING_PARMS_CMD
:
551 struct ipmi_timing_parms parms
;
553 if (copy_from_user(&parms
, arg
, sizeof(parms
))) {
558 mutex_lock(&priv
->recv_mutex
);
559 priv
->default_retries
= parms
.retries
;
560 priv
->default_retry_time_ms
= parms
.retry_time_ms
;
561 mutex_unlock(&priv
->recv_mutex
);
566 case IPMICTL_GET_TIMING_PARMS_CMD
:
568 struct ipmi_timing_parms parms
;
570 mutex_lock(&priv
->recv_mutex
);
571 parms
.retries
= priv
->default_retries
;
572 parms
.retry_time_ms
= priv
->default_retry_time_ms
;
573 mutex_unlock(&priv
->recv_mutex
);
575 if (copy_to_user(arg
, &parms
, sizeof(parms
))) {
584 case IPMICTL_GET_MAINTENANCE_MODE_CMD
:
588 mode
= ipmi_get_maintenance_mode(priv
->user
);
589 if (copy_to_user(arg
, &mode
, sizeof(mode
))) {
597 case IPMICTL_SET_MAINTENANCE_MODE_CMD
:
601 if (copy_from_user(&mode
, arg
, sizeof(mode
))) {
605 rv
= ipmi_set_maintenance_mode(priv
->user
, mode
);
619 * The following code contains code for supporting 32-bit compatible
620 * ioctls on 64-bit kernels. This allows running 32-bit apps on the
623 #define COMPAT_IPMICTL_SEND_COMMAND \
624 _IOR(IPMI_IOC_MAGIC, 13, struct compat_ipmi_req)
625 #define COMPAT_IPMICTL_SEND_COMMAND_SETTIME \
626 _IOR(IPMI_IOC_MAGIC, 21, struct compat_ipmi_req_settime)
627 #define COMPAT_IPMICTL_RECEIVE_MSG \
628 _IOWR(IPMI_IOC_MAGIC, 12, struct compat_ipmi_recv)
629 #define COMPAT_IPMICTL_RECEIVE_MSG_TRUNC \
630 _IOWR(IPMI_IOC_MAGIC, 11, struct compat_ipmi_recv)
632 struct compat_ipmi_msg
{
639 struct compat_ipmi_req
{
641 compat_uint_t addr_len
;
643 struct compat_ipmi_msg msg
;
646 struct compat_ipmi_recv
{
647 compat_int_t recv_type
;
649 compat_uint_t addr_len
;
651 struct compat_ipmi_msg msg
;
654 struct compat_ipmi_req_settime
{
655 struct compat_ipmi_req req
;
656 compat_int_t retries
;
657 compat_uint_t retry_time_ms
;
661 * Define some helper functions for copying IPMI data
663 static void get_compat_ipmi_msg(struct ipmi_msg
*p64
,
664 struct compat_ipmi_msg
*p32
)
666 p64
->netfn
= p32
->netfn
;
668 p64
->data_len
= p32
->data_len
;
669 p64
->data
= compat_ptr(p32
->data
);
672 static void get_compat_ipmi_req(struct ipmi_req
*p64
,
673 struct compat_ipmi_req
*p32
)
675 p64
->addr
= compat_ptr(p32
->addr
);
676 p64
->addr_len
= p32
->addr_len
;
677 p64
->msgid
= p32
->msgid
;
678 get_compat_ipmi_msg(&p64
->msg
, &p32
->msg
);
681 static void get_compat_ipmi_req_settime(struct ipmi_req_settime
*p64
,
682 struct compat_ipmi_req_settime
*p32
)
684 get_compat_ipmi_req(&p64
->req
, &p32
->req
);
685 p64
->retries
= p32
->retries
;
686 p64
->retry_time_ms
= p32
->retry_time_ms
;
689 static void get_compat_ipmi_recv(struct ipmi_recv
*p64
,
690 struct compat_ipmi_recv
*p32
)
692 memset(p64
, 0, sizeof(struct ipmi_recv
));
693 p64
->recv_type
= p32
->recv_type
;
694 p64
->addr
= compat_ptr(p32
->addr
);
695 p64
->addr_len
= p32
->addr_len
;
696 p64
->msgid
= p32
->msgid
;
697 get_compat_ipmi_msg(&p64
->msg
, &p32
->msg
);
700 static int copyout_recv32(struct ipmi_recv
*p64
, void __user
*to
)
702 struct compat_ipmi_recv v32
;
703 memset(&v32
, 0, sizeof(struct compat_ipmi_recv
));
704 v32
.recv_type
= p64
->recv_type
;
705 v32
.addr
= ptr_to_compat(p64
->addr
);
706 v32
.addr_len
= p64
->addr_len
;
707 v32
.msgid
= p64
->msgid
;
708 v32
.msg
.netfn
= p64
->msg
.netfn
;
709 v32
.msg
.cmd
= p64
->msg
.cmd
;
710 v32
.msg
.data_len
= p64
->msg
.data_len
;
711 v32
.msg
.data
= ptr_to_compat(p64
->msg
.data
);
712 return copy_to_user(to
, &v32
, sizeof(v32
)) ? -EFAULT
: 0;
716 * Handle compatibility ioctls
718 static long compat_ipmi_ioctl(struct file
*filep
, unsigned int cmd
,
721 struct ipmi_file_private
*priv
= filep
->private_data
;
724 case COMPAT_IPMICTL_SEND_COMMAND
:
727 struct compat_ipmi_req r32
;
729 unsigned int retry_time_ms
;
731 if (copy_from_user(&r32
, compat_ptr(arg
), sizeof(r32
)))
734 get_compat_ipmi_req(&rp
, &r32
);
736 mutex_lock(&priv
->recv_mutex
);
737 retries
= priv
->default_retries
;
738 retry_time_ms
= priv
->default_retry_time_ms
;
739 mutex_unlock(&priv
->recv_mutex
);
741 return handle_send_req(priv
->user
, &rp
,
742 retries
, retry_time_ms
);
744 case COMPAT_IPMICTL_SEND_COMMAND_SETTIME
:
746 struct ipmi_req_settime sp
;
747 struct compat_ipmi_req_settime sp32
;
749 if (copy_from_user(&sp32
, compat_ptr(arg
), sizeof(sp32
)))
752 get_compat_ipmi_req_settime(&sp
, &sp32
);
754 return handle_send_req(priv
->user
, &sp
.req
,
755 sp
.retries
, sp
.retry_time_ms
);
757 case COMPAT_IPMICTL_RECEIVE_MSG
:
758 case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC
:
760 struct ipmi_recv recv64
;
761 struct compat_ipmi_recv recv32
;
763 if (copy_from_user(&recv32
, compat_ptr(arg
), sizeof(recv32
)))
766 get_compat_ipmi_recv(&recv64
, &recv32
);
768 return handle_recv(priv
,
769 cmd
== COMPAT_IPMICTL_RECEIVE_MSG_TRUNC
,
770 &recv64
, copyout_recv32
, compat_ptr(arg
));
773 return ipmi_ioctl(filep
, cmd
, arg
);
778 static const struct file_operations ipmi_fops
= {
779 .owner
= THIS_MODULE
,
780 .unlocked_ioctl
= ipmi_ioctl
,
782 .compat_ioctl
= compat_ipmi_ioctl
,
785 .release
= ipmi_release
,
786 .fasync
= ipmi_fasync
,
788 .llseek
= noop_llseek
,
791 #define DEVICE_NAME "ipmidev"
793 static int ipmi_major
;
794 module_param(ipmi_major
, int, 0);
795 MODULE_PARM_DESC(ipmi_major
, "Sets the major number of the IPMI device. By"
796 " default, or if you set it to zero, it will choose the next"
797 " available device. Setting it to -1 will disable the"
798 " interface. Other values will set the major device number"
801 /* Keep track of the devices that are registered. */
802 struct ipmi_reg_list
{
804 struct list_head link
;
806 static LIST_HEAD(reg_list
);
807 static DEFINE_MUTEX(reg_list_mutex
);
809 static struct class *ipmi_class
;
811 static void ipmi_new_smi(int if_num
, struct device
*device
)
813 dev_t dev
= MKDEV(ipmi_major
, if_num
);
814 struct ipmi_reg_list
*entry
;
816 entry
= kmalloc(sizeof(*entry
), GFP_KERNEL
);
818 pr_err("ipmi_devintf: Unable to create the ipmi class device link\n");
823 mutex_lock(®_list_mutex
);
824 device_create(ipmi_class
, device
, dev
, NULL
, "ipmi%d", if_num
);
825 list_add(&entry
->link
, ®_list
);
826 mutex_unlock(®_list_mutex
);
829 static void ipmi_smi_gone(int if_num
)
831 dev_t dev
= MKDEV(ipmi_major
, if_num
);
832 struct ipmi_reg_list
*entry
;
834 mutex_lock(®_list_mutex
);
835 list_for_each_entry(entry
, ®_list
, link
) {
836 if (entry
->dev
== dev
) {
837 list_del(&entry
->link
);
842 device_destroy(ipmi_class
, dev
);
843 mutex_unlock(®_list_mutex
);
846 static struct ipmi_smi_watcher smi_watcher
=
848 .owner
= THIS_MODULE
,
849 .new_smi
= ipmi_new_smi
,
850 .smi_gone
= ipmi_smi_gone
,
853 static int __init
init_ipmi_devintf(void)
860 pr_info("ipmi device interface\n");
862 ipmi_class
= class_create(THIS_MODULE
, "ipmi");
863 if (IS_ERR(ipmi_class
)) {
864 pr_err("ipmi: can't register device class\n");
865 return PTR_ERR(ipmi_class
);
868 rv
= register_chrdev(ipmi_major
, DEVICE_NAME
, &ipmi_fops
);
870 class_destroy(ipmi_class
);
871 pr_err("ipmi: can't get major %d\n", ipmi_major
);
875 if (ipmi_major
== 0) {
879 rv
= ipmi_smi_watcher_register(&smi_watcher
);
881 unregister_chrdev(ipmi_major
, DEVICE_NAME
);
882 class_destroy(ipmi_class
);
883 pr_warn("ipmi: can't register smi watcher\n");
889 module_init(init_ipmi_devintf
);
891 static void __exit
cleanup_ipmi(void)
893 struct ipmi_reg_list
*entry
, *entry2
;
894 mutex_lock(®_list_mutex
);
895 list_for_each_entry_safe(entry
, entry2
, ®_list
, link
) {
896 list_del(&entry
->link
);
897 device_destroy(ipmi_class
, entry
->dev
);
900 mutex_unlock(®_list_mutex
);
901 class_destroy(ipmi_class
);
902 ipmi_smi_watcher_unregister(&smi_watcher
);
903 unregister_chrdev(ipmi_major
, DEVICE_NAME
);
905 module_exit(cleanup_ipmi
);
907 MODULE_LICENSE("GPL");
908 MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
909 MODULE_DESCRIPTION("Linux device interface for the IPMI message handler.");