OSDN Git Service

a1ec450549885111522f5ac8e5addbbd4d235e5b
[uclinux-h8/linux.git] / drivers / misc / mei / main.c
1 /*
2  *
3  * Intel Management Engine Interface (Intel MEI) Linux driver
4  * Copyright (c) 2003-2012, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  */
16 #include <linux/module.h>
17 #include <linux/moduleparam.h>
18 #include <linux/kernel.h>
19 #include <linux/device.h>
20 #include <linux/slab.h>
21 #include <linux/fs.h>
22 #include <linux/errno.h>
23 #include <linux/types.h>
24 #include <linux/fcntl.h>
25 #include <linux/aio.h>
26 #include <linux/poll.h>
27 #include <linux/init.h>
28 #include <linux/ioctl.h>
29 #include <linux/cdev.h>
30 #include <linux/sched.h>
31 #include <linux/uuid.h>
32 #include <linux/compat.h>
33 #include <linux/jiffies.h>
34 #include <linux/interrupt.h>
35
36 #include <linux/mei.h>
37
38 #include "mei_dev.h"
39 #include "client.h"
40
41 /**
42  * mei_open - the open function
43  *
44  * @inode: pointer to inode structure
45  * @file: pointer to file structure
46  *
47  * Return: 0 on success, <0 on error
48  */
49 static int mei_open(struct inode *inode, struct file *file)
50 {
51         struct mei_device *dev;
52         struct mei_cl *cl;
53
54         int err;
55
56         dev = container_of(inode->i_cdev, struct mei_device, cdev);
57         if (!dev)
58                 return -ENODEV;
59
60         mutex_lock(&dev->device_lock);
61
62         if (dev->dev_state != MEI_DEV_ENABLED) {
63                 dev_dbg(dev->dev, "dev_state != MEI_ENABLED  dev_state = %s\n",
64                     mei_dev_state_str(dev->dev_state));
65                 err = -ENODEV;
66                 goto err_unlock;
67         }
68
69         cl = mei_cl_alloc_linked(dev, MEI_HOST_CLIENT_ID_ANY);
70         if (IS_ERR(cl)) {
71                 err = PTR_ERR(cl);
72                 goto err_unlock;
73         }
74
75         file->private_data = cl;
76
77         mutex_unlock(&dev->device_lock);
78
79         return nonseekable_open(inode, file);
80
81 err_unlock:
82         mutex_unlock(&dev->device_lock);
83         return err;
84 }
85
86 /**
87  * mei_release - the release function
88  *
89  * @inode: pointer to inode structure
90  * @file: pointer to file structure
91  *
92  * Return: 0 on success, <0 on error
93  */
94 static int mei_release(struct inode *inode, struct file *file)
95 {
96         struct mei_cl *cl = file->private_data;
97         struct mei_device *dev;
98         int rets = 0;
99
100         if (WARN_ON(!cl || !cl->dev))
101                 return -ENODEV;
102
103         dev = cl->dev;
104
105         mutex_lock(&dev->device_lock);
106         if (cl == &dev->iamthif_cl) {
107                 rets = mei_amthif_release(dev, file);
108                 goto out;
109         }
110         if (cl->state == MEI_FILE_CONNECTED) {
111                 cl->state = MEI_FILE_DISCONNECTING;
112                 cl_dbg(dev, cl, "disconnecting\n");
113                 rets = mei_cl_disconnect(cl);
114         }
115         mei_cl_flush_queues(cl, file);
116         cl_dbg(dev, cl, "removing\n");
117
118         mei_cl_unlink(cl);
119
120         file->private_data = NULL;
121
122         kfree(cl);
123 out:
124         mutex_unlock(&dev->device_lock);
125         return rets;
126 }
127
128
129 /**
130  * mei_read - the read function.
131  *
132  * @file: pointer to file structure
133  * @ubuf: pointer to user buffer
134  * @length: buffer length
135  * @offset: data offset in buffer
136  *
137  * Return: >=0 data length on success , <0 on error
138  */
139 static ssize_t mei_read(struct file *file, char __user *ubuf,
140                         size_t length, loff_t *offset)
141 {
142         struct mei_cl *cl = file->private_data;
143         struct mei_device *dev;
144         struct mei_cl_cb *cb = NULL;
145         int rets;
146         int err;
147
148
149         if (WARN_ON(!cl || !cl->dev))
150                 return -ENODEV;
151
152         dev = cl->dev;
153
154
155         mutex_lock(&dev->device_lock);
156         if (dev->dev_state != MEI_DEV_ENABLED) {
157                 rets = -ENODEV;
158                 goto out;
159         }
160
161         if (length == 0) {
162                 rets = 0;
163                 goto out;
164         }
165
166         if (cl == &dev->iamthif_cl) {
167                 rets = mei_amthif_read(dev, file, ubuf, length, offset);
168                 goto out;
169         }
170
171         cb = mei_cl_read_cb(cl, file);
172         if (cb) {
173                 /* read what left */
174                 if (cb->buf_idx > *offset)
175                         goto copy_buffer;
176                 /* offset is beyond buf_idx we have no more data return 0 */
177                 if (cb->buf_idx > 0 && cb->buf_idx <= *offset) {
178                         rets = 0;
179                         goto free;
180                 }
181                 /* Offset needs to be cleaned for contiguous reads*/
182                 if (cb->buf_idx == 0 && *offset > 0)
183                         *offset = 0;
184         } else if (*offset > 0) {
185                 *offset = 0;
186         }
187
188         err = mei_cl_read_start(cl, length, file);
189         if (err && err != -EBUSY) {
190                 dev_dbg(dev->dev,
191                         "mei start read failure with status = %d\n", err);
192                 rets = err;
193                 goto out;
194         }
195
196         if (list_empty(&cl->rd_completed) && !waitqueue_active(&cl->rx_wait)) {
197                 if (file->f_flags & O_NONBLOCK) {
198                         rets = -EAGAIN;
199                         goto out;
200                 }
201
202                 mutex_unlock(&dev->device_lock);
203
204                 if (wait_event_interruptible(cl->rx_wait,
205                                 (!list_empty(&cl->rd_completed)) ||
206                                 mei_cl_is_transitioning(cl))) {
207
208                         if (signal_pending(current))
209                                 return -EINTR;
210                         return -ERESTARTSYS;
211                 }
212
213                 mutex_lock(&dev->device_lock);
214                 if (mei_cl_is_transitioning(cl)) {
215                         rets = -EBUSY;
216                         goto out;
217                 }
218         }
219
220         cb = mei_cl_read_cb(cl, file);
221         if (!cb) {
222                 rets = 0;
223                 goto out;
224         }
225
226 copy_buffer:
227         /* now copy the data to user space */
228         if (cb->status) {
229                 rets = cb->status;
230                 dev_dbg(dev->dev, "read operation failed %d\n", rets);
231                 goto free;
232         }
233
234         dev_dbg(dev->dev, "buf.size = %d buf.idx= %ld\n",
235             cb->buf.size, cb->buf_idx);
236         if (length == 0 || ubuf == NULL || *offset > cb->buf_idx) {
237                 rets = -EMSGSIZE;
238                 goto free;
239         }
240
241         /* length is being truncated to PAGE_SIZE,
242          * however buf_idx may point beyond that */
243         length = min_t(size_t, length, cb->buf_idx - *offset);
244
245         if (copy_to_user(ubuf, cb->buf.data + *offset, length)) {
246                 dev_dbg(dev->dev, "failed to copy data to userland\n");
247                 rets = -EFAULT;
248                 goto free;
249         }
250
251         rets = length;
252         *offset += length;
253         if ((unsigned long)*offset < cb->buf_idx)
254                 goto out;
255
256 free:
257         mei_io_cb_free(cb);
258
259 out:
260         dev_dbg(dev->dev, "end mei read rets= %d\n", rets);
261         mutex_unlock(&dev->device_lock);
262         return rets;
263 }
264 /**
265  * mei_write - the write function.
266  *
267  * @file: pointer to file structure
268  * @ubuf: pointer to user buffer
269  * @length: buffer length
270  * @offset: data offset in buffer
271  *
272  * Return: >=0 data length on success , <0 on error
273  */
274 static ssize_t mei_write(struct file *file, const char __user *ubuf,
275                          size_t length, loff_t *offset)
276 {
277         struct mei_cl *cl = file->private_data;
278         struct mei_me_client *me_cl = NULL;
279         struct mei_cl_cb *write_cb = NULL;
280         struct mei_device *dev;
281         unsigned long timeout = 0;
282         int rets;
283
284         if (WARN_ON(!cl || !cl->dev))
285                 return -ENODEV;
286
287         dev = cl->dev;
288
289         mutex_lock(&dev->device_lock);
290
291         if (dev->dev_state != MEI_DEV_ENABLED) {
292                 rets = -ENODEV;
293                 goto out;
294         }
295
296         me_cl = mei_me_cl_by_uuid_id(dev, &cl->cl_uuid, cl->me_client_id);
297         if (!me_cl) {
298                 rets = -ENOTTY;
299                 goto out;
300         }
301
302         if (length == 0) {
303                 rets = 0;
304                 goto out;
305         }
306
307         if (length > me_cl->props.max_msg_length) {
308                 rets = -EFBIG;
309                 goto out;
310         }
311
312         if (cl->state != MEI_FILE_CONNECTED) {
313                 dev_err(dev->dev, "host client = %d,  is not connected to ME client = %d",
314                         cl->host_client_id, cl->me_client_id);
315                 rets = -ENODEV;
316                 goto out;
317         }
318         if (cl == &dev->iamthif_cl) {
319                 write_cb = mei_amthif_find_read_list_entry(dev, file);
320
321                 if (write_cb) {
322                         timeout = write_cb->read_time +
323                                 mei_secs_to_jiffies(MEI_IAMTHIF_READ_TIMER);
324
325                         if (time_after(jiffies, timeout)) {
326                                 *offset = 0;
327                                 mei_io_cb_free(write_cb);
328                                 write_cb = NULL;
329                         }
330                 }
331         }
332
333         *offset = 0;
334         write_cb = mei_cl_alloc_cb(cl, length, MEI_FOP_WRITE, file);
335         if (!write_cb) {
336                 rets = -ENOMEM;
337                 goto out;
338         }
339
340         rets = copy_from_user(write_cb->buf.data, ubuf, length);
341         if (rets) {
342                 dev_dbg(dev->dev, "failed to copy data from userland\n");
343                 rets = -EFAULT;
344                 goto out;
345         }
346
347         if (cl == &dev->iamthif_cl) {
348                 rets = mei_amthif_write(cl, write_cb);
349
350                 if (rets) {
351                         dev_err(dev->dev,
352                                 "amthif write failed with status = %d\n", rets);
353                         goto out;
354                 }
355                 mei_me_cl_put(me_cl);
356                 mutex_unlock(&dev->device_lock);
357                 return length;
358         }
359
360         rets = mei_cl_write(cl, write_cb, false);
361 out:
362         mei_me_cl_put(me_cl);
363         mutex_unlock(&dev->device_lock);
364         if (rets < 0)
365                 mei_io_cb_free(write_cb);
366         return rets;
367 }
368
369 /**
370  * mei_ioctl_connect_client - the connect to fw client IOCTL function
371  *
372  * @file: private data of the file object
373  * @data: IOCTL connect data, input and output parameters
374  *
375  * Locking: called under "dev->device_lock" lock
376  *
377  * Return: 0 on success, <0 on failure.
378  */
379 static int mei_ioctl_connect_client(struct file *file,
380                         struct mei_connect_client_data *data)
381 {
382         struct mei_device *dev;
383         struct mei_client *client;
384         struct mei_me_client *me_cl;
385         struct mei_cl *cl;
386         int rets;
387
388         cl = file->private_data;
389         dev = cl->dev;
390
391         if (dev->dev_state != MEI_DEV_ENABLED)
392                 return -ENODEV;
393
394         if (cl->state != MEI_FILE_INITIALIZING &&
395             cl->state != MEI_FILE_DISCONNECTED)
396                 return  -EBUSY;
397
398         /* find ME client we're trying to connect to */
399         me_cl = mei_me_cl_by_uuid(dev, &data->in_client_uuid);
400         if (!me_cl || me_cl->props.fixed_address) {
401                 dev_dbg(dev->dev, "Cannot connect to FW Client UUID = %pUl\n",
402                                 &data->in_client_uuid);
403                 return  -ENOTTY;
404         }
405
406         cl->me_client_id = me_cl->client_id;
407         cl->cl_uuid = me_cl->props.protocol_name;
408
409         dev_dbg(dev->dev, "Connect to FW Client ID = %d\n",
410                         cl->me_client_id);
411         dev_dbg(dev->dev, "FW Client - Protocol Version = %d\n",
412                         me_cl->props.protocol_version);
413         dev_dbg(dev->dev, "FW Client - Max Msg Len = %d\n",
414                         me_cl->props.max_msg_length);
415
416         /* if we're connecting to amthif client then we will use the
417          * existing connection
418          */
419         if (uuid_le_cmp(data->in_client_uuid, mei_amthif_guid) == 0) {
420                 dev_dbg(dev->dev, "FW Client is amthi\n");
421                 if (dev->iamthif_cl.state != MEI_FILE_CONNECTED) {
422                         rets = -ENODEV;
423                         goto end;
424                 }
425                 mei_cl_unlink(cl);
426
427                 kfree(cl);
428                 cl = NULL;
429                 dev->iamthif_open_count++;
430                 file->private_data = &dev->iamthif_cl;
431
432                 client = &data->out_client_properties;
433                 client->max_msg_length = me_cl->props.max_msg_length;
434                 client->protocol_version = me_cl->props.protocol_version;
435                 rets = dev->iamthif_cl.status;
436
437                 goto end;
438         }
439
440         /* prepare the output buffer */
441         client = &data->out_client_properties;
442         client->max_msg_length = me_cl->props.max_msg_length;
443         client->protocol_version = me_cl->props.protocol_version;
444         dev_dbg(dev->dev, "Can connect?\n");
445
446         rets = mei_cl_connect(cl, file);
447
448 end:
449         mei_me_cl_put(me_cl);
450         return rets;
451 }
452
453 /**
454  * mei_ioctl - the IOCTL function
455  *
456  * @file: pointer to file structure
457  * @cmd: ioctl command
458  * @data: pointer to mei message structure
459  *
460  * Return: 0 on success , <0 on error
461  */
462 static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data)
463 {
464         struct mei_device *dev;
465         struct mei_cl *cl = file->private_data;
466         struct mei_connect_client_data connect_data;
467         int rets;
468
469
470         if (WARN_ON(!cl || !cl->dev))
471                 return -ENODEV;
472
473         dev = cl->dev;
474
475         dev_dbg(dev->dev, "IOCTL cmd = 0x%x", cmd);
476
477         mutex_lock(&dev->device_lock);
478         if (dev->dev_state != MEI_DEV_ENABLED) {
479                 rets = -ENODEV;
480                 goto out;
481         }
482
483         switch (cmd) {
484         case IOCTL_MEI_CONNECT_CLIENT:
485                 dev_dbg(dev->dev, ": IOCTL_MEI_CONNECT_CLIENT.\n");
486                 if (copy_from_user(&connect_data, (char __user *)data,
487                                 sizeof(struct mei_connect_client_data))) {
488                         dev_dbg(dev->dev, "failed to copy data from userland\n");
489                         rets = -EFAULT;
490                         goto out;
491                 }
492
493                 rets = mei_ioctl_connect_client(file, &connect_data);
494                 if (rets)
495                         goto out;
496
497                 /* if all is ok, copying the data back to user. */
498                 if (copy_to_user((char __user *)data, &connect_data,
499                                 sizeof(struct mei_connect_client_data))) {
500                         dev_dbg(dev->dev, "failed to copy data to userland\n");
501                         rets = -EFAULT;
502                         goto out;
503                 }
504
505                 break;
506
507         default:
508                 dev_err(dev->dev, ": unsupported ioctl %d.\n", cmd);
509                 rets = -ENOIOCTLCMD;
510         }
511
512 out:
513         mutex_unlock(&dev->device_lock);
514         return rets;
515 }
516
517 /**
518  * mei_compat_ioctl - the compat IOCTL function
519  *
520  * @file: pointer to file structure
521  * @cmd: ioctl command
522  * @data: pointer to mei message structure
523  *
524  * Return: 0 on success , <0 on error
525  */
526 #ifdef CONFIG_COMPAT
527 static long mei_compat_ioctl(struct file *file,
528                         unsigned int cmd, unsigned long data)
529 {
530         return mei_ioctl(file, cmd, (unsigned long)compat_ptr(data));
531 }
532 #endif
533
534
535 /**
536  * mei_poll - the poll function
537  *
538  * @file: pointer to file structure
539  * @wait: pointer to poll_table structure
540  *
541  * Return: poll mask
542  */
543 static unsigned int mei_poll(struct file *file, poll_table *wait)
544 {
545         unsigned long req_events = poll_requested_events(wait);
546         struct mei_cl *cl = file->private_data;
547         struct mei_device *dev;
548         unsigned int mask = 0;
549
550         if (WARN_ON(!cl || !cl->dev))
551                 return POLLERR;
552
553         dev = cl->dev;
554
555         mutex_lock(&dev->device_lock);
556
557         if (!mei_cl_is_connected(cl)) {
558                 mask = POLLERR;
559                 goto out;
560         }
561
562         if (cl == &dev->iamthif_cl) {
563                 mask = mei_amthif_poll(dev, file, wait);
564                 goto out;
565         }
566
567         if (req_events & (POLLIN | POLLRDNORM)) {
568                 poll_wait(file, &cl->rx_wait, wait);
569
570                 if (!list_empty(&cl->rd_completed))
571                         mask |= POLLIN | POLLRDNORM;
572                 else
573                         mei_cl_read_start(cl, 0, file);
574         }
575
576 out:
577         mutex_unlock(&dev->device_lock);
578         return mask;
579 }
580
581 /**
582  * fw_status_show - mei device attribute show method
583  *
584  * @device: device pointer
585  * @attr: attribute pointer
586  * @buf:  char out buffer
587  *
588  * Return: number of the bytes printed into buf or error
589  */
590 static ssize_t fw_status_show(struct device *device,
591                 struct device_attribute *attr, char *buf)
592 {
593         struct mei_device *dev = dev_get_drvdata(device);
594         struct mei_fw_status fw_status;
595         int err, i;
596         ssize_t cnt = 0;
597
598         mutex_lock(&dev->device_lock);
599         err = mei_fw_status(dev, &fw_status);
600         mutex_unlock(&dev->device_lock);
601         if (err) {
602                 dev_err(device, "read fw_status error = %d\n", err);
603                 return err;
604         }
605
606         for (i = 0; i < fw_status.count; i++)
607                 cnt += scnprintf(buf + cnt, PAGE_SIZE - cnt, "%08X\n",
608                                 fw_status.status[i]);
609         return cnt;
610 }
611 static DEVICE_ATTR_RO(fw_status);
612
613 static struct attribute *mei_attrs[] = {
614         &dev_attr_fw_status.attr,
615         NULL
616 };
617 ATTRIBUTE_GROUPS(mei);
618
619 /*
620  * file operations structure will be used for mei char device.
621  */
622 static const struct file_operations mei_fops = {
623         .owner = THIS_MODULE,
624         .read = mei_read,
625         .unlocked_ioctl = mei_ioctl,
626 #ifdef CONFIG_COMPAT
627         .compat_ioctl = mei_compat_ioctl,
628 #endif
629         .open = mei_open,
630         .release = mei_release,
631         .write = mei_write,
632         .poll = mei_poll,
633         .llseek = no_llseek
634 };
635
636 static struct class *mei_class;
637 static dev_t mei_devt;
638 #define MEI_MAX_DEVS  MINORMASK
639 static DEFINE_MUTEX(mei_minor_lock);
640 static DEFINE_IDR(mei_idr);
641
642 /**
643  * mei_minor_get - obtain next free device minor number
644  *
645  * @dev:  device pointer
646  *
647  * Return: allocated minor, or -ENOSPC if no free minor left
648  */
649 static int mei_minor_get(struct mei_device *dev)
650 {
651         int ret;
652
653         mutex_lock(&mei_minor_lock);
654         ret = idr_alloc(&mei_idr, dev, 0, MEI_MAX_DEVS, GFP_KERNEL);
655         if (ret >= 0)
656                 dev->minor = ret;
657         else if (ret == -ENOSPC)
658                 dev_err(dev->dev, "too many mei devices\n");
659
660         mutex_unlock(&mei_minor_lock);
661         return ret;
662 }
663
664 /**
665  * mei_minor_free - mark device minor number as free
666  *
667  * @dev:  device pointer
668  */
669 static void mei_minor_free(struct mei_device *dev)
670 {
671         mutex_lock(&mei_minor_lock);
672         idr_remove(&mei_idr, dev->minor);
673         mutex_unlock(&mei_minor_lock);
674 }
675
676 int mei_register(struct mei_device *dev, struct device *parent)
677 {
678         struct device *clsdev; /* class device */
679         int ret, devno;
680
681         ret = mei_minor_get(dev);
682         if (ret < 0)
683                 return ret;
684
685         /* Fill in the data structures */
686         devno = MKDEV(MAJOR(mei_devt), dev->minor);
687         cdev_init(&dev->cdev, &mei_fops);
688         dev->cdev.owner = mei_fops.owner;
689
690         /* Add the device */
691         ret = cdev_add(&dev->cdev, devno, 1);
692         if (ret) {
693                 dev_err(parent, "unable to add device %d:%d\n",
694                         MAJOR(mei_devt), dev->minor);
695                 goto err_dev_add;
696         }
697
698         clsdev = device_create_with_groups(mei_class, parent, devno,
699                                            dev, mei_groups,
700                                            "mei%d", dev->minor);
701
702         if (IS_ERR(clsdev)) {
703                 dev_err(parent, "unable to create device %d:%d\n",
704                         MAJOR(mei_devt), dev->minor);
705                 ret = PTR_ERR(clsdev);
706                 goto err_dev_create;
707         }
708
709         ret = mei_dbgfs_register(dev, dev_name(clsdev));
710         if (ret) {
711                 dev_err(clsdev, "cannot register debugfs ret = %d\n", ret);
712                 goto err_dev_dbgfs;
713         }
714
715         return 0;
716
717 err_dev_dbgfs:
718         device_destroy(mei_class, devno);
719 err_dev_create:
720         cdev_del(&dev->cdev);
721 err_dev_add:
722         mei_minor_free(dev);
723         return ret;
724 }
725 EXPORT_SYMBOL_GPL(mei_register);
726
727 void mei_deregister(struct mei_device *dev)
728 {
729         int devno;
730
731         devno = dev->cdev.dev;
732         cdev_del(&dev->cdev);
733
734         mei_dbgfs_deregister(dev);
735
736         device_destroy(mei_class, devno);
737
738         mei_minor_free(dev);
739 }
740 EXPORT_SYMBOL_GPL(mei_deregister);
741
742 static int __init mei_init(void)
743 {
744         int ret;
745
746         mei_class = class_create(THIS_MODULE, "mei");
747         if (IS_ERR(mei_class)) {
748                 pr_err("couldn't create class\n");
749                 ret = PTR_ERR(mei_class);
750                 goto err;
751         }
752
753         ret = alloc_chrdev_region(&mei_devt, 0, MEI_MAX_DEVS, "mei");
754         if (ret < 0) {
755                 pr_err("unable to allocate char dev region\n");
756                 goto err_class;
757         }
758
759         ret = mei_cl_bus_init();
760         if (ret < 0) {
761                 pr_err("unable to initialize bus\n");
762                 goto err_chrdev;
763         }
764
765         return 0;
766
767 err_chrdev:
768         unregister_chrdev_region(mei_devt, MEI_MAX_DEVS);
769 err_class:
770         class_destroy(mei_class);
771 err:
772         return ret;
773 }
774
775 static void __exit mei_exit(void)
776 {
777         unregister_chrdev_region(mei_devt, MEI_MAX_DEVS);
778         class_destroy(mei_class);
779         mei_cl_bus_exit();
780 }
781
782 module_init(mei_init);
783 module_exit(mei_exit);
784
785 MODULE_AUTHOR("Intel Corporation");
786 MODULE_DESCRIPTION("Intel(R) Management Engine Interface");
787 MODULE_LICENSE("GPL v2");
788