4  * Linux device interface for the IPMI message handler.
 
   6  * Author: MontaVista Software, Inc.
 
   7  *         Corey Minyard <minyard@mvista.com>
 
  10  * Copyright 2002 MontaVista Software Inc.
 
  12  *  This program is free software; you can redistribute it and/or modify it
 
  13  *  under the terms of the GNU General Public License as published by the
 
  14  *  Free Software Foundation; either version 2 of the License, or (at your
 
  15  *  option) any later version.
 
  18  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 
  19  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 
  20  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
  21  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 
  22  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 
  23  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 
  24  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 
  25  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 
  26  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 
  27  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
  29  *  You should have received a copy of the GNU General Public License along
 
  30  *  with this program; if not, write to the Free Software Foundation, Inc.,
 
  31  *  675 Mass Ave, Cambridge, MA 02139, USA.
 
  34 #include <linux/config.h>
 
  35 #include <linux/module.h>
 
  36 #include <linux/moduleparam.h>
 
  37 #include <linux/errno.h>
 
  38 #include <asm/system.h>
 
  39 #include <linux/sched.h>
 
  40 #include <linux/poll.h>
 
  41 #include <linux/spinlock.h>
 
  42 #include <linux/slab.h>
 
  43 #include <linux/devfs_fs_kernel.h>
 
  44 #include <linux/ipmi.h>
 
  45 #include <asm/semaphore.h>
 
  46 #include <linux/init.h>
 
  47 #include <linux/device.h>
 
  48 #include <linux/compat.h>
 
  50 #define IPMI_DEVINTF_VERSION "v33"
 
  52 struct ipmi_file_private
 
  55         spinlock_t           recv_msg_lock;
 
  56         struct list_head     recv_msgs;
 
  58         struct fasync_struct *fasync_queue;
 
  59         wait_queue_head_t    wait;
 
  60         struct semaphore     recv_sem;
 
  62         unsigned int         default_retry_time_ms;
 
  65 static void file_receive_handler(struct ipmi_recv_msg *msg,
 
  68         struct ipmi_file_private *priv = handler_data;
 
  72         spin_lock_irqsave(&(priv->recv_msg_lock), flags);
 
  74         was_empty = list_empty(&(priv->recv_msgs));
 
  75         list_add_tail(&(msg->link), &(priv->recv_msgs));
 
  78                 wake_up_interruptible(&priv->wait);
 
  79                 kill_fasync(&priv->fasync_queue, SIGIO, POLL_IN);
 
  82         spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
  85 static unsigned int ipmi_poll(struct file *file, poll_table *wait)
 
  87         struct ipmi_file_private *priv = file->private_data;
 
  88         unsigned int             mask = 0;
 
  91         poll_wait(file, &priv->wait, wait);
 
  93         spin_lock_irqsave(&priv->recv_msg_lock, flags);
 
  95         if (! list_empty(&(priv->recv_msgs)))
 
  96                 mask |= (POLLIN | POLLRDNORM);
 
  98         spin_unlock_irqrestore(&priv->recv_msg_lock, flags);
 
 103 static int ipmi_fasync(int fd, struct file *file, int on)
 
 105         struct ipmi_file_private *priv = file->private_data;
 
 108         result = fasync_helper(fd, file, on, &priv->fasync_queue);
 
 113 static struct ipmi_user_hndl ipmi_hndlrs =
 
 115         .ipmi_recv_hndl = file_receive_handler,
 
 118 static int ipmi_open(struct inode *inode, struct file *file)
 
 120         int                      if_num = iminor(inode);
 
 122         struct ipmi_file_private *priv;
 
 125         priv = kmalloc(sizeof(*priv), GFP_KERNEL);
 
 131         rv = ipmi_create_user(if_num,
 
 140         file->private_data = priv;
 
 142         spin_lock_init(&(priv->recv_msg_lock));
 
 143         INIT_LIST_HEAD(&(priv->recv_msgs));
 
 144         init_waitqueue_head(&priv->wait);
 
 145         priv->fasync_queue = NULL;
 
 146         sema_init(&(priv->recv_sem), 1);
 
 148         /* Use the low-level defaults. */
 
 149         priv->default_retries = -1;
 
 150         priv->default_retry_time_ms = 0;
 
 155 static int ipmi_release(struct inode *inode, struct file *file)
 
 157         struct ipmi_file_private *priv = file->private_data;
 
 160         rv = ipmi_destroy_user(priv->user);
 
 164         ipmi_fasync (-1, file, 0);
 
 166         /* FIXME - free the messages in the list. */
 
 172 static int handle_send_req(ipmi_user_t     user,
 
 173                            struct ipmi_req *req,
 
 175                            unsigned int    retry_time_ms)
 
 178         struct ipmi_addr addr;
 
 179         struct kernel_ipmi_msg msg;
 
 181         if (req->addr_len > sizeof(struct ipmi_addr))
 
 184         if (copy_from_user(&addr, req->addr, req->addr_len))
 
 187         msg.netfn = req->msg.netfn;
 
 188         msg.cmd = req->msg.cmd;
 
 189         msg.data_len = req->msg.data_len;
 
 190         msg.data = kmalloc(IPMI_MAX_MSG_LENGTH, GFP_KERNEL);
 
 194         /* From here out we cannot return, we must jump to "out" for
 
 195            error exits to free msgdata. */
 
 197         rv = ipmi_validate_addr(&addr, req->addr_len);
 
 201         if (req->msg.data != NULL) {
 
 202                 if (req->msg.data_len > IPMI_MAX_MSG_LENGTH) {
 
 207                 if (copy_from_user(msg.data,
 
 218         rv = ipmi_request_settime(user,
 
 231 static int ipmi_ioctl(struct inode  *inode,
 
 237         struct ipmi_file_private *priv = file->private_data;
 
 238         void __user *arg = (void __user *)data;
 
 242         case IPMICTL_SEND_COMMAND:
 
 246                 if (copy_from_user(&req, arg, sizeof(req))) {
 
 251                 rv = handle_send_req(priv->user,
 
 253                                      priv->default_retries,
 
 254                                      priv->default_retry_time_ms);
 
 258         case IPMICTL_SEND_COMMAND_SETTIME:
 
 260                 struct ipmi_req_settime req;
 
 262                 if (copy_from_user(&req, arg, sizeof(req))) {
 
 267                 rv = handle_send_req(priv->user,
 
 274         case IPMICTL_RECEIVE_MSG:
 
 275         case IPMICTL_RECEIVE_MSG_TRUNC:
 
 277                 struct ipmi_recv      rsp;
 
 279                 struct list_head *entry;
 
 280                 struct ipmi_recv_msg  *msg;
 
 285                 if (copy_from_user(&rsp, arg, sizeof(rsp))) {
 
 290                 /* We claim a semaphore because we don't want two
 
 291                    users getting something from the queue at a time.
 
 292                    Since we have to release the spinlock before we can
 
 293                    copy the data to the user, it's possible another
 
 294                    user will grab something from the queue, too.  Then
 
 295                    the messages might get out of order if something
 
 296                    fails and the message gets put back onto the
 
 297                    queue.  This semaphore prevents that problem. */
 
 298                 down(&(priv->recv_sem));
 
 300                 /* Grab the message off the list. */
 
 301                 spin_lock_irqsave(&(priv->recv_msg_lock), flags);
 
 302                 if (list_empty(&(priv->recv_msgs))) {
 
 303                         spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
 307                 entry = priv->recv_msgs.next;
 
 308                 msg = list_entry(entry, struct ipmi_recv_msg, link);
 
 310                 spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
 312                 addr_len = ipmi_addr_length(msg->addr.addr_type);
 
 313                 if (rsp.addr_len < addr_len)
 
 316                         goto recv_putback_on_err;
 
 319                 if (copy_to_user(rsp.addr, &(msg->addr), addr_len)) {
 
 321                         goto recv_putback_on_err;
 
 323                 rsp.addr_len = addr_len;
 
 325                 rsp.recv_type = msg->recv_type;
 
 326                 rsp.msgid = msg->msgid;
 
 327                 rsp.msg.netfn = msg->msg.netfn;
 
 328                 rsp.msg.cmd = msg->msg.cmd;
 
 330                 if (msg->msg.data_len > 0) {
 
 331                         if (rsp.msg.data_len < msg->msg.data_len) {
 
 333                                 if (cmd == IPMICTL_RECEIVE_MSG_TRUNC) {
 
 334                                         msg->msg.data_len = rsp.msg.data_len;
 
 336                                         goto recv_putback_on_err;
 
 340                         if (copy_to_user(rsp.msg.data,
 
 345                                 goto recv_putback_on_err;
 
 347                         rsp.msg.data_len = msg->msg.data_len;
 
 349                         rsp.msg.data_len = 0;
 
 352                 if (copy_to_user(arg, &rsp, sizeof(rsp))) {
 
 354                         goto recv_putback_on_err;
 
 357                 up(&(priv->recv_sem));
 
 358                 ipmi_free_recv_msg(msg);
 
 362                 /* If we got an error, put the message back onto
 
 363                    the head of the queue. */
 
 364                 spin_lock_irqsave(&(priv->recv_msg_lock), flags);
 
 365                 list_add(entry, &(priv->recv_msgs));
 
 366                 spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
 367                 up(&(priv->recv_sem));
 
 371                 up(&(priv->recv_sem));
 
 375         case IPMICTL_REGISTER_FOR_CMD:
 
 377                 struct ipmi_cmdspec val;
 
 379                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 384                 rv = ipmi_register_for_cmd(priv->user, val.netfn, val.cmd);
 
 388         case IPMICTL_UNREGISTER_FOR_CMD:
 
 390                 struct ipmi_cmdspec   val;
 
 392                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 397                 rv = ipmi_unregister_for_cmd(priv->user, val.netfn, val.cmd);
 
 401         case IPMICTL_SET_GETS_EVENTS_CMD:
 
 405                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 410                 rv = ipmi_set_gets_events(priv->user, val);
 
 414         case IPMICTL_SET_MY_ADDRESS_CMD:
 
 418                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 423                 ipmi_set_my_address(priv->user, val);
 
 428         case IPMICTL_GET_MY_ADDRESS_CMD:
 
 432                 val = ipmi_get_my_address(priv->user);
 
 434                 if (copy_to_user(arg, &val, sizeof(val))) {
 
 442         case IPMICTL_SET_MY_LUN_CMD:
 
 446                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 451                 ipmi_set_my_LUN(priv->user, val);
 
 456         case IPMICTL_GET_MY_LUN_CMD:
 
 460                 val = ipmi_get_my_LUN(priv->user);
 
 462                 if (copy_to_user(arg, &val, sizeof(val))) {
 
 469         case IPMICTL_SET_TIMING_PARMS_CMD:
 
 471                 struct ipmi_timing_parms parms;
 
 473                 if (copy_from_user(&parms, arg, sizeof(parms))) {
 
 478                 priv->default_retries = parms.retries;
 
 479                 priv->default_retry_time_ms = parms.retry_time_ms;
 
 484         case IPMICTL_GET_TIMING_PARMS_CMD:
 
 486                 struct ipmi_timing_parms parms;
 
 488                 parms.retries = priv->default_retries;
 
 489                 parms.retry_time_ms = priv->default_retry_time_ms;
 
 491                 if (copy_to_user(arg, &parms, sizeof(parms))) {
 
 507  * The following code contains code for supporting 32-bit compatible
 
 508  * ioctls on 64-bit kernels.  This allows running 32-bit apps on the
 
 511 #define COMPAT_IPMICTL_SEND_COMMAND     \
 
 512         _IOR(IPMI_IOC_MAGIC, 13, struct compat_ipmi_req)
 
 513 #define COMPAT_IPMICTL_SEND_COMMAND_SETTIME     \
 
 514         _IOR(IPMI_IOC_MAGIC, 21, struct compat_ipmi_req_settime)
 
 515 #define COMPAT_IPMICTL_RECEIVE_MSG      \
 
 516         _IOWR(IPMI_IOC_MAGIC, 12, struct compat_ipmi_recv)
 
 517 #define COMPAT_IPMICTL_RECEIVE_MSG_TRUNC        \
 
 518         _IOWR(IPMI_IOC_MAGIC, 11, struct compat_ipmi_recv)
 
 520 struct compat_ipmi_msg {
 
 527 struct compat_ipmi_req {
 
 529         compat_uint_t           addr_len;
 
 531         struct compat_ipmi_msg  msg;
 
 534 struct compat_ipmi_recv {
 
 535         compat_int_t            recv_type;
 
 537         compat_uint_t           addr_len;
 
 539         struct compat_ipmi_msg  msg;
 
 542 struct compat_ipmi_req_settime {
 
 543         struct compat_ipmi_req  req;
 
 544         compat_int_t            retries;
 
 545         compat_uint_t           retry_time_ms;
 
 549  * Define some helper functions for copying IPMI data
 
 551 static long get_compat_ipmi_msg(struct ipmi_msg *p64,
 
 552                                 struct compat_ipmi_msg __user *p32)
 
 556         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 557                         __get_user(p64->netfn, &p32->netfn) ||
 
 558                         __get_user(p64->cmd, &p32->cmd) ||
 
 559                         __get_user(p64->data_len, &p32->data_len) ||
 
 560                         __get_user(tmp, &p32->data))
 
 562         p64->data = compat_ptr(tmp);
 
 566 static long put_compat_ipmi_msg(struct ipmi_msg *p64,
 
 567                                 struct compat_ipmi_msg __user *p32)
 
 569         if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) ||
 
 570                         __put_user(p64->netfn, &p32->netfn) ||
 
 571                         __put_user(p64->cmd, &p32->cmd) ||
 
 572                         __put_user(p64->data_len, &p32->data_len))
 
 577 static long get_compat_ipmi_req(struct ipmi_req *p64,
 
 578                                 struct compat_ipmi_req __user *p32)
 
 583         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 584                         __get_user(tmp, &p32->addr) ||
 
 585                         __get_user(p64->addr_len, &p32->addr_len) ||
 
 586                         __get_user(p64->msgid, &p32->msgid) ||
 
 587                         get_compat_ipmi_msg(&p64->msg, &p32->msg))
 
 589         p64->addr = compat_ptr(tmp);
 
 593 static long get_compat_ipmi_req_settime(struct ipmi_req_settime *p64,
 
 594                 struct compat_ipmi_req_settime __user *p32)
 
 596         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 597                         get_compat_ipmi_req(&p64->req, &p32->req) ||
 
 598                         __get_user(p64->retries, &p32->retries) ||
 
 599                         __get_user(p64->retry_time_ms, &p32->retry_time_ms))
 
 604 static long get_compat_ipmi_recv(struct ipmi_recv *p64,
 
 605                                  struct compat_ipmi_recv __user *p32)
 
 609         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 610                         __get_user(p64->recv_type, &p32->recv_type) ||
 
 611                         __get_user(tmp, &p32->addr) ||
 
 612                         __get_user(p64->addr_len, &p32->addr_len) ||
 
 613                         __get_user(p64->msgid, &p32->msgid) ||
 
 614                         get_compat_ipmi_msg(&p64->msg, &p32->msg))
 
 616         p64->addr = compat_ptr(tmp);
 
 620 static long put_compat_ipmi_recv(struct ipmi_recv *p64,
 
 621                                  struct compat_ipmi_recv __user *p32)
 
 623         if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) ||
 
 624                         __put_user(p64->recv_type, &p32->recv_type) ||
 
 625                         __put_user(p64->addr_len, &p32->addr_len) ||
 
 626                         __put_user(p64->msgid, &p32->msgid) ||
 
 627                         put_compat_ipmi_msg(&p64->msg, &p32->msg))
 
 633  * Handle compatibility ioctls
 
 635 static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd,
 
 639         struct ipmi_file_private *priv = filep->private_data;
 
 642         case COMPAT_IPMICTL_SEND_COMMAND:
 
 646                 if (get_compat_ipmi_req(&rp, compat_ptr(arg)))
 
 649                 return handle_send_req(priv->user, &rp,
 
 650                                 priv->default_retries,
 
 651                                 priv->default_retry_time_ms);
 
 653         case COMPAT_IPMICTL_SEND_COMMAND_SETTIME:
 
 655                 struct ipmi_req_settime sp;
 
 657                 if (get_compat_ipmi_req_settime(&sp, compat_ptr(arg)))
 
 660                 return handle_send_req(priv->user, &sp.req,
 
 661                                 sp.retries, sp.retry_time_ms);
 
 663         case COMPAT_IPMICTL_RECEIVE_MSG:
 
 664         case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC:
 
 666                 struct ipmi_recv   *precv64, recv64;
 
 668                 if (get_compat_ipmi_recv(&recv64, compat_ptr(arg)))
 
 671                 precv64 = compat_alloc_user_space(sizeof(recv64));
 
 672                 if (copy_to_user(precv64, &recv64, sizeof(recv64)))
 
 675                 rc = ipmi_ioctl(filep->f_dentry->d_inode, filep,
 
 676                                 ((cmd == COMPAT_IPMICTL_RECEIVE_MSG)
 
 677                                  ? IPMICTL_RECEIVE_MSG
 
 678                                  : IPMICTL_RECEIVE_MSG_TRUNC),
 
 683                 if (copy_from_user(&recv64, precv64, sizeof(recv64)))
 
 686                 if (put_compat_ipmi_recv(&recv64, compat_ptr(arg)))
 
 692                 return ipmi_ioctl(filep->f_dentry->d_inode, filep, cmd, arg);
 
 697 static struct file_operations ipmi_fops = {
 
 698         .owner          = THIS_MODULE,
 
 701         .compat_ioctl   = compat_ipmi_ioctl,
 
 704         .release        = ipmi_release,
 
 705         .fasync         = ipmi_fasync,
 
 709 #define DEVICE_NAME     "ipmidev"
 
 711 static int ipmi_major = 0;
 
 712 module_param(ipmi_major, int, 0);
 
 713 MODULE_PARM_DESC(ipmi_major, "Sets the major number of the IPMI device.  By"
 
 714                  " default, or if you set it to zero, it will choose the next"
 
 715                  " available device.  Setting it to -1 will disable the"
 
 716                  " interface.  Other values will set the major device number"
 
 719 static struct class *ipmi_class;
 
 721 static void ipmi_new_smi(int if_num)
 
 723         dev_t dev = MKDEV(ipmi_major, if_num);
 
 725         devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
 
 726                       "ipmidev/%d", if_num);
 
 728         class_device_create(ipmi_class, dev, NULL, "ipmi%d", if_num);
 
 731 static void ipmi_smi_gone(int if_num)
 
 733         class_device_destroy(ipmi_class, MKDEV(ipmi_major, if_num));
 
 734         devfs_remove("ipmidev/%d", if_num);
 
 737 static struct ipmi_smi_watcher smi_watcher =
 
 739         .owner    = THIS_MODULE,
 
 740         .new_smi  = ipmi_new_smi,
 
 741         .smi_gone = ipmi_smi_gone,
 
 744 static __init int init_ipmi_devintf(void)
 
 751         printk(KERN_INFO "ipmi device interface version "
 
 752                IPMI_DEVINTF_VERSION "\n");
 
 754         ipmi_class = class_create(THIS_MODULE, "ipmi");
 
 755         if (IS_ERR(ipmi_class)) {
 
 756                 printk(KERN_ERR "ipmi: can't register device class\n");
 
 757                 return PTR_ERR(ipmi_class);
 
 760         rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops);
 
 762                 class_destroy(ipmi_class);
 
 763                 printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
 
 767         if (ipmi_major == 0) {
 
 771         devfs_mk_dir(DEVICE_NAME);
 
 773         rv = ipmi_smi_watcher_register(&smi_watcher);
 
 775                 unregister_chrdev(ipmi_major, DEVICE_NAME);
 
 776                 class_destroy(ipmi_class);
 
 777                 printk(KERN_WARNING "ipmi: can't register smi watcher\n");
 
 783 module_init(init_ipmi_devintf);
 
 785 static __exit void cleanup_ipmi(void)
 
 787         class_destroy(ipmi_class);
 
 788         ipmi_smi_watcher_unregister(&smi_watcher);
 
 789         devfs_remove(DEVICE_NAME);
 
 790         unregister_chrdev(ipmi_major, DEVICE_NAME);
 
 792 module_exit(cleanup_ipmi);
 
 794 MODULE_LICENSE("GPL");