2 * Copyright (c) 2016, Linaro Ltd.
3 * Copyright (c) 2012, Michal Simek <monstr@monstr.eu>
4 * Copyright (c) 2012, PetaLogix
5 * Copyright (c) 2011, Texas Instruments, Inc.
6 * Copyright (c) 2011, Google, Inc.
8 * Based on rpmsg performance statistics driver by Michal Simek, which in turn
9 * was based on TI & Google OMX rpmsg driver.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 and
13 * only version 2 as published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 #include <linux/cdev.h>
21 #include <linux/device.h>
23 #include <linux/idr.h>
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/poll.h>
27 #include <linux/rpmsg.h>
28 #include <linux/skbuff.h>
29 #include <linux/slab.h>
30 #include <linux/uaccess.h>
31 #include <uapi/linux/rpmsg.h>
33 #include "rpmsg_internal.h"
35 #define RPMSG_DEV_MAX (MINORMASK + 1)
37 static dev_t rpmsg_major
;
38 static struct class *rpmsg_class
;
40 static DEFINE_IDA(rpmsg_ctrl_ida
);
41 static DEFINE_IDA(rpmsg_ept_ida
);
42 static DEFINE_IDA(rpmsg_minor_ida
);
44 #define dev_to_eptdev(dev) container_of(dev, struct rpmsg_eptdev, dev)
45 #define cdev_to_eptdev(i_cdev) container_of(i_cdev, struct rpmsg_eptdev, cdev)
47 #define dev_to_ctrldev(dev) container_of(dev, struct rpmsg_ctrldev, dev)
48 #define cdev_to_ctrldev(i_cdev) container_of(i_cdev, struct rpmsg_ctrldev, cdev)
51 * struct rpmsg_ctrldev - control device for instantiating endpoint devices
52 * @rpdev: underlaying rpmsg device
53 * @cdev: cdev for the ctrl device
54 * @dev: device for the ctrl device
56 struct rpmsg_ctrldev
{
57 struct rpmsg_device
*rpdev
;
63 * struct rpmsg_eptdev - endpoint device context
64 * @dev: endpoint device
65 * @cdev: cdev for the endpoint device
66 * @rpdev: underlaying rpmsg device
67 * @chinfo: info used to open the endpoint
68 * @ept_lock: synchronization of @ept modifications
69 * @ept: rpmsg endpoint reference, when open
70 * @queue_lock: synchronization of @queue operations
71 * @queue: incoming message queue
72 * @readq: wait object for incoming queue
78 struct rpmsg_device
*rpdev
;
79 struct rpmsg_channel_info chinfo
;
81 struct mutex ept_lock
;
82 struct rpmsg_endpoint
*ept
;
84 spinlock_t queue_lock
;
85 struct sk_buff_head queue
;
86 wait_queue_head_t readq
;
89 static int rpmsg_eptdev_destroy(struct device
*dev
, void *data
)
91 struct rpmsg_eptdev
*eptdev
= dev_to_eptdev(dev
);
93 mutex_lock(&eptdev
->ept_lock
);
95 rpmsg_destroy_ept(eptdev
->ept
);
98 mutex_unlock(&eptdev
->ept_lock
);
100 /* wake up any blocked readers */
101 wake_up_interruptible(&eptdev
->readq
);
103 device_del(&eptdev
->dev
);
104 put_device(&eptdev
->dev
);
109 static int rpmsg_ept_cb(struct rpmsg_device
*rpdev
, void *buf
, int len
,
110 void *priv
, u32 addr
)
112 struct rpmsg_eptdev
*eptdev
= priv
;
115 skb
= alloc_skb(len
, GFP_ATOMIC
);
119 skb_put_data(skb
, buf
, len
);
121 spin_lock(&eptdev
->queue_lock
);
122 skb_queue_tail(&eptdev
->queue
, skb
);
123 spin_unlock(&eptdev
->queue_lock
);
125 /* wake up any blocking processes, waiting for new data */
126 wake_up_interruptible(&eptdev
->readq
);
131 static int rpmsg_eptdev_open(struct inode
*inode
, struct file
*filp
)
133 struct rpmsg_eptdev
*eptdev
= cdev_to_eptdev(inode
->i_cdev
);
134 struct rpmsg_endpoint
*ept
;
135 struct rpmsg_device
*rpdev
= eptdev
->rpdev
;
136 struct device
*dev
= &eptdev
->dev
;
140 ept
= rpmsg_create_ept(rpdev
, rpmsg_ept_cb
, eptdev
, eptdev
->chinfo
);
142 dev_err(dev
, "failed to open %s\n", eptdev
->chinfo
.name
);
148 filp
->private_data
= eptdev
;
153 static int rpmsg_eptdev_release(struct inode
*inode
, struct file
*filp
)
155 struct rpmsg_eptdev
*eptdev
= cdev_to_eptdev(inode
->i_cdev
);
156 struct device
*dev
= &eptdev
->dev
;
159 /* Close the endpoint, if it's not already destroyed by the parent */
160 mutex_lock(&eptdev
->ept_lock
);
162 rpmsg_destroy_ept(eptdev
->ept
);
165 mutex_unlock(&eptdev
->ept_lock
);
167 /* Discard all SKBs */
168 while (!skb_queue_empty(&eptdev
->queue
)) {
169 skb
= skb_dequeue(&eptdev
->queue
);
178 static ssize_t
rpmsg_eptdev_read(struct file
*filp
, char __user
*buf
,
179 size_t len
, loff_t
*f_pos
)
181 struct rpmsg_eptdev
*eptdev
= filp
->private_data
;
189 spin_lock_irqsave(&eptdev
->queue_lock
, flags
);
191 /* Wait for data in the queue */
192 if (skb_queue_empty(&eptdev
->queue
)) {
193 spin_unlock_irqrestore(&eptdev
->queue_lock
, flags
);
195 if (filp
->f_flags
& O_NONBLOCK
)
198 /* Wait until we get data or the endpoint goes away */
199 if (wait_event_interruptible(eptdev
->readq
,
200 !skb_queue_empty(&eptdev
->queue
) ||
204 /* We lost the endpoint while waiting */
208 spin_lock_irqsave(&eptdev
->queue_lock
, flags
);
211 skb
= skb_dequeue(&eptdev
->queue
);
212 spin_unlock_irqrestore(&eptdev
->queue_lock
, flags
);
216 use
= min_t(size_t, len
, skb
->len
);
217 if (copy_to_user(buf
, skb
->data
, use
))
225 static ssize_t
rpmsg_eptdev_write(struct file
*filp
, const char __user
*buf
,
226 size_t len
, loff_t
*f_pos
)
228 struct rpmsg_eptdev
*eptdev
= filp
->private_data
;
232 kbuf
= memdup_user(buf
, len
);
234 return PTR_ERR(kbuf
);
236 if (mutex_lock_interruptible(&eptdev
->ept_lock
)) {
246 if (filp
->f_flags
& O_NONBLOCK
)
247 ret
= rpmsg_trysend(eptdev
->ept
, kbuf
, len
);
249 ret
= rpmsg_send(eptdev
->ept
, kbuf
, len
);
252 mutex_unlock(&eptdev
->ept_lock
);
256 return ret
< 0 ? ret
: len
;
259 static unsigned int rpmsg_eptdev_poll(struct file
*filp
, poll_table
*wait
)
261 struct rpmsg_eptdev
*eptdev
= filp
->private_data
;
262 unsigned int mask
= 0;
267 poll_wait(filp
, &eptdev
->readq
, wait
);
269 if (!skb_queue_empty(&eptdev
->queue
))
270 mask
|= POLLIN
| POLLRDNORM
;
272 mask
|= rpmsg_poll(eptdev
->ept
, filp
, wait
);
277 static long rpmsg_eptdev_ioctl(struct file
*fp
, unsigned int cmd
,
280 struct rpmsg_eptdev
*eptdev
= fp
->private_data
;
282 if (cmd
!= RPMSG_DESTROY_EPT_IOCTL
)
285 return rpmsg_eptdev_destroy(&eptdev
->dev
, NULL
);
288 static const struct file_operations rpmsg_eptdev_fops
= {
289 .owner
= THIS_MODULE
,
290 .open
= rpmsg_eptdev_open
,
291 .release
= rpmsg_eptdev_release
,
292 .read
= rpmsg_eptdev_read
,
293 .write
= rpmsg_eptdev_write
,
294 .poll
= rpmsg_eptdev_poll
,
295 .unlocked_ioctl
= rpmsg_eptdev_ioctl
,
298 static ssize_t
name_show(struct device
*dev
, struct device_attribute
*attr
,
301 struct rpmsg_eptdev
*eptdev
= dev_get_drvdata(dev
);
303 return sprintf(buf
, "%s\n", eptdev
->chinfo
.name
);
305 static DEVICE_ATTR_RO(name
);
307 static ssize_t
src_show(struct device
*dev
, struct device_attribute
*attr
,
310 struct rpmsg_eptdev
*eptdev
= dev_get_drvdata(dev
);
312 return sprintf(buf
, "%d\n", eptdev
->chinfo
.src
);
314 static DEVICE_ATTR_RO(src
);
316 static ssize_t
dst_show(struct device
*dev
, struct device_attribute
*attr
,
319 struct rpmsg_eptdev
*eptdev
= dev_get_drvdata(dev
);
321 return sprintf(buf
, "%d\n", eptdev
->chinfo
.dst
);
323 static DEVICE_ATTR_RO(dst
);
325 static struct attribute
*rpmsg_eptdev_attrs
[] = {
331 ATTRIBUTE_GROUPS(rpmsg_eptdev
);
333 static void rpmsg_eptdev_release_device(struct device
*dev
)
335 struct rpmsg_eptdev
*eptdev
= dev_to_eptdev(dev
);
337 ida_simple_remove(&rpmsg_ept_ida
, dev
->id
);
338 ida_simple_remove(&rpmsg_minor_ida
, MINOR(eptdev
->dev
.devt
));
339 cdev_del(&eptdev
->cdev
);
343 static int rpmsg_eptdev_create(struct rpmsg_ctrldev
*ctrldev
,
344 struct rpmsg_channel_info chinfo
)
346 struct rpmsg_device
*rpdev
= ctrldev
->rpdev
;
347 struct rpmsg_eptdev
*eptdev
;
351 eptdev
= kzalloc(sizeof(*eptdev
), GFP_KERNEL
);
356 eptdev
->rpdev
= rpdev
;
357 eptdev
->chinfo
= chinfo
;
359 mutex_init(&eptdev
->ept_lock
);
360 spin_lock_init(&eptdev
->queue_lock
);
361 skb_queue_head_init(&eptdev
->queue
);
362 init_waitqueue_head(&eptdev
->readq
);
364 device_initialize(dev
);
365 dev
->class = rpmsg_class
;
366 dev
->parent
= &ctrldev
->dev
;
367 dev
->groups
= rpmsg_eptdev_groups
;
368 dev_set_drvdata(dev
, eptdev
);
370 cdev_init(&eptdev
->cdev
, &rpmsg_eptdev_fops
);
371 eptdev
->cdev
.owner
= THIS_MODULE
;
373 ret
= ida_simple_get(&rpmsg_minor_ida
, 0, RPMSG_DEV_MAX
, GFP_KERNEL
);
376 dev
->devt
= MKDEV(MAJOR(rpmsg_major
), ret
);
378 ret
= ida_simple_get(&rpmsg_ept_ida
, 0, 0, GFP_KERNEL
);
382 dev_set_name(dev
, "rpmsg%d", ret
);
384 ret
= cdev_add(&eptdev
->cdev
, dev
->devt
, 1);
388 /* We can now rely on the release function for cleanup */
389 dev
->release
= rpmsg_eptdev_release_device
;
391 ret
= device_add(dev
);
393 dev_err(dev
, "device_add failed: %d\n", ret
);
400 ida_simple_remove(&rpmsg_ept_ida
, dev
->id
);
402 ida_simple_remove(&rpmsg_minor_ida
, MINOR(dev
->devt
));
410 static int rpmsg_ctrldev_open(struct inode
*inode
, struct file
*filp
)
412 struct rpmsg_ctrldev
*ctrldev
= cdev_to_ctrldev(inode
->i_cdev
);
414 get_device(&ctrldev
->dev
);
415 filp
->private_data
= ctrldev
;
420 static int rpmsg_ctrldev_release(struct inode
*inode
, struct file
*filp
)
422 struct rpmsg_ctrldev
*ctrldev
= cdev_to_ctrldev(inode
->i_cdev
);
424 put_device(&ctrldev
->dev
);
429 static long rpmsg_ctrldev_ioctl(struct file
*fp
, unsigned int cmd
,
432 struct rpmsg_ctrldev
*ctrldev
= fp
->private_data
;
433 void __user
*argp
= (void __user
*)arg
;
434 struct rpmsg_endpoint_info eptinfo
;
435 struct rpmsg_channel_info chinfo
;
437 if (cmd
!= RPMSG_CREATE_EPT_IOCTL
)
440 if (copy_from_user(&eptinfo
, argp
, sizeof(eptinfo
)))
443 memcpy(chinfo
.name
, eptinfo
.name
, RPMSG_NAME_SIZE
);
444 chinfo
.name
[RPMSG_NAME_SIZE
-1] = '\0';
445 chinfo
.src
= eptinfo
.src
;
446 chinfo
.dst
= eptinfo
.dst
;
448 return rpmsg_eptdev_create(ctrldev
, chinfo
);
451 static const struct file_operations rpmsg_ctrldev_fops
= {
452 .owner
= THIS_MODULE
,
453 .open
= rpmsg_ctrldev_open
,
454 .release
= rpmsg_ctrldev_release
,
455 .unlocked_ioctl
= rpmsg_ctrldev_ioctl
,
458 static void rpmsg_ctrldev_release_device(struct device
*dev
)
460 struct rpmsg_ctrldev
*ctrldev
= dev_to_ctrldev(dev
);
462 ida_simple_remove(&rpmsg_ctrl_ida
, dev
->id
);
463 ida_simple_remove(&rpmsg_minor_ida
, MINOR(dev
->devt
));
464 cdev_del(&ctrldev
->cdev
);
468 static int rpmsg_chrdev_probe(struct rpmsg_device
*rpdev
)
470 struct rpmsg_ctrldev
*ctrldev
;
474 ctrldev
= kzalloc(sizeof(*ctrldev
), GFP_KERNEL
);
478 ctrldev
->rpdev
= rpdev
;
481 device_initialize(dev
);
482 dev
->parent
= &rpdev
->dev
;
483 dev
->class = rpmsg_class
;
485 cdev_init(&ctrldev
->cdev
, &rpmsg_ctrldev_fops
);
486 ctrldev
->cdev
.owner
= THIS_MODULE
;
488 ret
= ida_simple_get(&rpmsg_minor_ida
, 0, RPMSG_DEV_MAX
, GFP_KERNEL
);
491 dev
->devt
= MKDEV(MAJOR(rpmsg_major
), ret
);
493 ret
= ida_simple_get(&rpmsg_ctrl_ida
, 0, 0, GFP_KERNEL
);
497 dev_set_name(&ctrldev
->dev
, "rpmsg_ctrl%d", ret
);
499 ret
= cdev_add(&ctrldev
->cdev
, dev
->devt
, 1);
503 /* We can now rely on the release function for cleanup */
504 dev
->release
= rpmsg_ctrldev_release_device
;
506 ret
= device_add(dev
);
508 dev_err(&rpdev
->dev
, "device_add failed: %d\n", ret
);
512 dev_set_drvdata(&rpdev
->dev
, ctrldev
);
517 ida_simple_remove(&rpmsg_ctrl_ida
, dev
->id
);
519 ida_simple_remove(&rpmsg_minor_ida
, MINOR(dev
->devt
));
527 static void rpmsg_chrdev_remove(struct rpmsg_device
*rpdev
)
529 struct rpmsg_ctrldev
*ctrldev
= dev_get_drvdata(&rpdev
->dev
);
532 /* Destroy all endpoints */
533 ret
= device_for_each_child(&ctrldev
->dev
, NULL
, rpmsg_eptdev_destroy
);
535 dev_warn(&rpdev
->dev
, "failed to nuke endpoints: %d\n", ret
);
537 device_del(&ctrldev
->dev
);
538 put_device(&ctrldev
->dev
);
541 static struct rpmsg_driver rpmsg_chrdev_driver
= {
542 .probe
= rpmsg_chrdev_probe
,
543 .remove
= rpmsg_chrdev_remove
,
545 .name
= "rpmsg_chrdev",
549 static int rpmsg_char_init(void)
553 ret
= alloc_chrdev_region(&rpmsg_major
, 0, RPMSG_DEV_MAX
, "rpmsg");
555 pr_err("rpmsg: failed to allocate char dev region\n");
559 rpmsg_class
= class_create(THIS_MODULE
, "rpmsg");
560 if (IS_ERR(rpmsg_class
)) {
561 pr_err("failed to create rpmsg class\n");
562 unregister_chrdev_region(rpmsg_major
, RPMSG_DEV_MAX
);
563 return PTR_ERR(rpmsg_class
);
566 ret
= register_rpmsg_driver(&rpmsg_chrdev_driver
);
568 pr_err("rpmsgchr: failed to register rpmsg driver\n");
569 class_destroy(rpmsg_class
);
570 unregister_chrdev_region(rpmsg_major
, RPMSG_DEV_MAX
);
575 postcore_initcall(rpmsg_char_init
);
577 static void rpmsg_chrdev_exit(void)
579 unregister_rpmsg_driver(&rpmsg_chrdev_driver
);
580 class_destroy(rpmsg_class
);
581 unregister_chrdev_region(rpmsg_major
, RPMSG_DEV_MAX
);
583 module_exit(rpmsg_chrdev_exit
);
585 MODULE_ALIAS("rpmsg:rpmsg_chrdev");
586 MODULE_LICENSE("GPL v2");