1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2016, Linaro Ltd.
4 * Copyright (c) 2012, Michal Simek <monstr@monstr.eu>
5 * Copyright (c) 2012, PetaLogix
6 * Copyright (c) 2011, Texas Instruments, Inc.
7 * Copyright (c) 2011, Google, Inc.
9 * Based on rpmsg performance statistics driver by Michal Simek, which in turn
10 * was based on TI & Google OMX rpmsg driver.
12 #include <linux/cdev.h>
13 #include <linux/device.h>
15 #include <linux/idr.h>
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/poll.h>
19 #include <linux/rpmsg.h>
20 #include <linux/skbuff.h>
21 #include <linux/slab.h>
22 #include <linux/uaccess.h>
23 #include <uapi/linux/rpmsg.h>
25 #include "rpmsg_internal.h"
27 #define RPMSG_DEV_MAX (MINORMASK + 1)
29 static dev_t rpmsg_major
;
30 static struct class *rpmsg_class
;
32 static DEFINE_IDA(rpmsg_ctrl_ida
);
33 static DEFINE_IDA(rpmsg_ept_ida
);
34 static DEFINE_IDA(rpmsg_minor_ida
);
36 #define dev_to_eptdev(dev) container_of(dev, struct rpmsg_eptdev, dev)
37 #define cdev_to_eptdev(i_cdev) container_of(i_cdev, struct rpmsg_eptdev, cdev)
39 #define dev_to_ctrldev(dev) container_of(dev, struct rpmsg_ctrldev, dev)
40 #define cdev_to_ctrldev(i_cdev) container_of(i_cdev, struct rpmsg_ctrldev, cdev)
43 * struct rpmsg_ctrldev - control device for instantiating endpoint devices
44 * @rpdev: underlaying rpmsg device
45 * @cdev: cdev for the ctrl device
46 * @dev: device for the ctrl device
48 struct rpmsg_ctrldev
{
49 struct rpmsg_device
*rpdev
;
55 * struct rpmsg_eptdev - endpoint device context
56 * @dev: endpoint device
57 * @cdev: cdev for the endpoint device
58 * @rpdev: underlaying rpmsg device
59 * @chinfo: info used to open the endpoint
60 * @ept_lock: synchronization of @ept modifications
61 * @ept: rpmsg endpoint reference, when open
62 * @queue_lock: synchronization of @queue operations
63 * @queue: incoming message queue
64 * @readq: wait object for incoming queue
70 struct rpmsg_device
*rpdev
;
71 struct rpmsg_channel_info chinfo
;
73 struct mutex ept_lock
;
74 struct rpmsg_endpoint
*ept
;
76 spinlock_t queue_lock
;
77 struct sk_buff_head queue
;
78 wait_queue_head_t readq
;
81 static int rpmsg_eptdev_destroy(struct device
*dev
, void *data
)
83 struct rpmsg_eptdev
*eptdev
= dev_to_eptdev(dev
);
85 mutex_lock(&eptdev
->ept_lock
);
87 rpmsg_destroy_ept(eptdev
->ept
);
90 mutex_unlock(&eptdev
->ept_lock
);
92 /* wake up any blocked readers */
93 wake_up_interruptible(&eptdev
->readq
);
95 device_del(&eptdev
->dev
);
96 put_device(&eptdev
->dev
);
101 static int rpmsg_ept_cb(struct rpmsg_device
*rpdev
, void *buf
, int len
,
102 void *priv
, u32 addr
)
104 struct rpmsg_eptdev
*eptdev
= priv
;
107 skb
= alloc_skb(len
, GFP_ATOMIC
);
111 skb_put_data(skb
, buf
, len
);
113 spin_lock(&eptdev
->queue_lock
);
114 skb_queue_tail(&eptdev
->queue
, skb
);
115 spin_unlock(&eptdev
->queue_lock
);
117 /* wake up any blocking processes, waiting for new data */
118 wake_up_interruptible(&eptdev
->readq
);
123 static int rpmsg_eptdev_open(struct inode
*inode
, struct file
*filp
)
125 struct rpmsg_eptdev
*eptdev
= cdev_to_eptdev(inode
->i_cdev
);
126 struct rpmsg_endpoint
*ept
;
127 struct rpmsg_device
*rpdev
= eptdev
->rpdev
;
128 struct device
*dev
= &eptdev
->dev
;
132 ept
= rpmsg_create_ept(rpdev
, rpmsg_ept_cb
, eptdev
, eptdev
->chinfo
);
134 dev_err(dev
, "failed to open %s\n", eptdev
->chinfo
.name
);
140 filp
->private_data
= eptdev
;
145 static int rpmsg_eptdev_release(struct inode
*inode
, struct file
*filp
)
147 struct rpmsg_eptdev
*eptdev
= cdev_to_eptdev(inode
->i_cdev
);
148 struct device
*dev
= &eptdev
->dev
;
151 /* Close the endpoint, if it's not already destroyed by the parent */
152 mutex_lock(&eptdev
->ept_lock
);
154 rpmsg_destroy_ept(eptdev
->ept
);
157 mutex_unlock(&eptdev
->ept_lock
);
159 /* Discard all SKBs */
160 while (!skb_queue_empty(&eptdev
->queue
)) {
161 skb
= skb_dequeue(&eptdev
->queue
);
170 static ssize_t
rpmsg_eptdev_read_iter(struct kiocb
*iocb
, struct iov_iter
*to
)
172 struct file
*filp
= iocb
->ki_filp
;
173 struct rpmsg_eptdev
*eptdev
= filp
->private_data
;
181 spin_lock_irqsave(&eptdev
->queue_lock
, flags
);
183 /* Wait for data in the queue */
184 if (skb_queue_empty(&eptdev
->queue
)) {
185 spin_unlock_irqrestore(&eptdev
->queue_lock
, flags
);
187 if (filp
->f_flags
& O_NONBLOCK
)
190 /* Wait until we get data or the endpoint goes away */
191 if (wait_event_interruptible(eptdev
->readq
,
192 !skb_queue_empty(&eptdev
->queue
) ||
196 /* We lost the endpoint while waiting */
200 spin_lock_irqsave(&eptdev
->queue_lock
, flags
);
203 skb
= skb_dequeue(&eptdev
->queue
);
204 spin_unlock_irqrestore(&eptdev
->queue_lock
, flags
);
208 use
= min_t(size_t, iov_iter_count(to
), skb
->len
);
209 if (copy_to_iter(skb
->data
, use
, to
) != use
)
217 static ssize_t
rpmsg_eptdev_write_iter(struct kiocb
*iocb
,
218 struct iov_iter
*from
)
220 struct file
*filp
= iocb
->ki_filp
;
221 struct rpmsg_eptdev
*eptdev
= filp
->private_data
;
222 size_t len
= iov_iter_count(from
);
226 kbuf
= kzalloc(len
, GFP_KERNEL
);
230 if (!copy_from_iter_full(kbuf
, len
, from
))
233 if (mutex_lock_interruptible(&eptdev
->ept_lock
)) {
243 if (filp
->f_flags
& O_NONBLOCK
)
244 ret
= rpmsg_trysend(eptdev
->ept
, kbuf
, len
);
246 ret
= rpmsg_send(eptdev
->ept
, kbuf
, len
);
249 mutex_unlock(&eptdev
->ept_lock
);
253 return ret
< 0 ? ret
: len
;
256 static __poll_t
rpmsg_eptdev_poll(struct file
*filp
, poll_table
*wait
)
258 struct rpmsg_eptdev
*eptdev
= filp
->private_data
;
264 poll_wait(filp
, &eptdev
->readq
, wait
);
266 if (!skb_queue_empty(&eptdev
->queue
))
267 mask
|= EPOLLIN
| EPOLLRDNORM
;
269 mask
|= rpmsg_poll(eptdev
->ept
, filp
, wait
);
274 static long rpmsg_eptdev_ioctl(struct file
*fp
, unsigned int cmd
,
277 struct rpmsg_eptdev
*eptdev
= fp
->private_data
;
279 if (cmd
!= RPMSG_DESTROY_EPT_IOCTL
)
282 return rpmsg_eptdev_destroy(&eptdev
->dev
, NULL
);
285 static const struct file_operations rpmsg_eptdev_fops
= {
286 .owner
= THIS_MODULE
,
287 .open
= rpmsg_eptdev_open
,
288 .release
= rpmsg_eptdev_release
,
289 .read_iter
= rpmsg_eptdev_read_iter
,
290 .write_iter
= rpmsg_eptdev_write_iter
,
291 .poll
= rpmsg_eptdev_poll
,
292 .unlocked_ioctl
= rpmsg_eptdev_ioctl
,
293 .compat_ioctl
= rpmsg_eptdev_ioctl
,
296 static ssize_t
name_show(struct device
*dev
, struct device_attribute
*attr
,
299 struct rpmsg_eptdev
*eptdev
= dev_get_drvdata(dev
);
301 return sprintf(buf
, "%s\n", eptdev
->chinfo
.name
);
303 static DEVICE_ATTR_RO(name
);
305 static ssize_t
src_show(struct device
*dev
, struct device_attribute
*attr
,
308 struct rpmsg_eptdev
*eptdev
= dev_get_drvdata(dev
);
310 return sprintf(buf
, "%d\n", eptdev
->chinfo
.src
);
312 static DEVICE_ATTR_RO(src
);
314 static ssize_t
dst_show(struct device
*dev
, struct device_attribute
*attr
,
317 struct rpmsg_eptdev
*eptdev
= dev_get_drvdata(dev
);
319 return sprintf(buf
, "%d\n", eptdev
->chinfo
.dst
);
321 static DEVICE_ATTR_RO(dst
);
323 static struct attribute
*rpmsg_eptdev_attrs
[] = {
329 ATTRIBUTE_GROUPS(rpmsg_eptdev
);
331 static void rpmsg_eptdev_release_device(struct device
*dev
)
333 struct rpmsg_eptdev
*eptdev
= dev_to_eptdev(dev
);
335 ida_simple_remove(&rpmsg_ept_ida
, dev
->id
);
336 ida_simple_remove(&rpmsg_minor_ida
, MINOR(eptdev
->dev
.devt
));
337 cdev_del(&eptdev
->cdev
);
341 static int rpmsg_eptdev_create(struct rpmsg_ctrldev
*ctrldev
,
342 struct rpmsg_channel_info chinfo
)
344 struct rpmsg_device
*rpdev
= ctrldev
->rpdev
;
345 struct rpmsg_eptdev
*eptdev
;
349 eptdev
= kzalloc(sizeof(*eptdev
), GFP_KERNEL
);
354 eptdev
->rpdev
= rpdev
;
355 eptdev
->chinfo
= chinfo
;
357 mutex_init(&eptdev
->ept_lock
);
358 spin_lock_init(&eptdev
->queue_lock
);
359 skb_queue_head_init(&eptdev
->queue
);
360 init_waitqueue_head(&eptdev
->readq
);
362 device_initialize(dev
);
363 dev
->class = rpmsg_class
;
364 dev
->parent
= &ctrldev
->dev
;
365 dev
->groups
= rpmsg_eptdev_groups
;
366 dev_set_drvdata(dev
, eptdev
);
368 cdev_init(&eptdev
->cdev
, &rpmsg_eptdev_fops
);
369 eptdev
->cdev
.owner
= THIS_MODULE
;
371 ret
= ida_simple_get(&rpmsg_minor_ida
, 0, RPMSG_DEV_MAX
, GFP_KERNEL
);
374 dev
->devt
= MKDEV(MAJOR(rpmsg_major
), ret
);
376 ret
= ida_simple_get(&rpmsg_ept_ida
, 0, 0, GFP_KERNEL
);
380 dev_set_name(dev
, "rpmsg%d", ret
);
382 ret
= cdev_add(&eptdev
->cdev
, dev
->devt
, 1);
386 /* We can now rely on the release function for cleanup */
387 dev
->release
= rpmsg_eptdev_release_device
;
389 ret
= device_add(dev
);
391 dev_err(dev
, "device_add failed: %d\n", ret
);
398 ida_simple_remove(&rpmsg_ept_ida
, dev
->id
);
400 ida_simple_remove(&rpmsg_minor_ida
, MINOR(dev
->devt
));
408 static int rpmsg_ctrldev_open(struct inode
*inode
, struct file
*filp
)
410 struct rpmsg_ctrldev
*ctrldev
= cdev_to_ctrldev(inode
->i_cdev
);
412 get_device(&ctrldev
->dev
);
413 filp
->private_data
= ctrldev
;
418 static int rpmsg_ctrldev_release(struct inode
*inode
, struct file
*filp
)
420 struct rpmsg_ctrldev
*ctrldev
= cdev_to_ctrldev(inode
->i_cdev
);
422 put_device(&ctrldev
->dev
);
427 static long rpmsg_ctrldev_ioctl(struct file
*fp
, unsigned int cmd
,
430 struct rpmsg_ctrldev
*ctrldev
= fp
->private_data
;
431 void __user
*argp
= (void __user
*)arg
;
432 struct rpmsg_endpoint_info eptinfo
;
433 struct rpmsg_channel_info chinfo
;
435 if (cmd
!= RPMSG_CREATE_EPT_IOCTL
)
438 if (copy_from_user(&eptinfo
, argp
, sizeof(eptinfo
)))
441 memcpy(chinfo
.name
, eptinfo
.name
, RPMSG_NAME_SIZE
);
442 chinfo
.name
[RPMSG_NAME_SIZE
-1] = '\0';
443 chinfo
.src
= eptinfo
.src
;
444 chinfo
.dst
= eptinfo
.dst
;
446 return rpmsg_eptdev_create(ctrldev
, chinfo
);
449 static const struct file_operations rpmsg_ctrldev_fops
= {
450 .owner
= THIS_MODULE
,
451 .open
= rpmsg_ctrldev_open
,
452 .release
= rpmsg_ctrldev_release
,
453 .unlocked_ioctl
= rpmsg_ctrldev_ioctl
,
454 .compat_ioctl
= rpmsg_ctrldev_ioctl
,
457 static void rpmsg_ctrldev_release_device(struct device
*dev
)
459 struct rpmsg_ctrldev
*ctrldev
= dev_to_ctrldev(dev
);
461 ida_simple_remove(&rpmsg_ctrl_ida
, dev
->id
);
462 ida_simple_remove(&rpmsg_minor_ida
, MINOR(dev
->devt
));
463 cdev_del(&ctrldev
->cdev
);
467 static int rpmsg_chrdev_probe(struct rpmsg_device
*rpdev
)
469 struct rpmsg_ctrldev
*ctrldev
;
473 ctrldev
= kzalloc(sizeof(*ctrldev
), GFP_KERNEL
);
477 ctrldev
->rpdev
= rpdev
;
480 device_initialize(dev
);
481 dev
->parent
= &rpdev
->dev
;
482 dev
->class = rpmsg_class
;
484 cdev_init(&ctrldev
->cdev
, &rpmsg_ctrldev_fops
);
485 ctrldev
->cdev
.owner
= THIS_MODULE
;
487 ret
= ida_simple_get(&rpmsg_minor_ida
, 0, RPMSG_DEV_MAX
, GFP_KERNEL
);
490 dev
->devt
= MKDEV(MAJOR(rpmsg_major
), ret
);
492 ret
= ida_simple_get(&rpmsg_ctrl_ida
, 0, 0, GFP_KERNEL
);
496 dev_set_name(&ctrldev
->dev
, "rpmsg_ctrl%d", ret
);
498 ret
= cdev_add(&ctrldev
->cdev
, dev
->devt
, 1);
502 /* We can now rely on the release function for cleanup */
503 dev
->release
= rpmsg_ctrldev_release_device
;
505 ret
= device_add(dev
);
507 dev_err(&rpdev
->dev
, "device_add failed: %d\n", ret
);
511 dev_set_drvdata(&rpdev
->dev
, ctrldev
);
516 ida_simple_remove(&rpmsg_ctrl_ida
, dev
->id
);
518 ida_simple_remove(&rpmsg_minor_ida
, MINOR(dev
->devt
));
526 static void rpmsg_chrdev_remove(struct rpmsg_device
*rpdev
)
528 struct rpmsg_ctrldev
*ctrldev
= dev_get_drvdata(&rpdev
->dev
);
531 /* Destroy all endpoints */
532 ret
= device_for_each_child(&ctrldev
->dev
, NULL
, rpmsg_eptdev_destroy
);
534 dev_warn(&rpdev
->dev
, "failed to nuke endpoints: %d\n", ret
);
536 device_del(&ctrldev
->dev
);
537 put_device(&ctrldev
->dev
);
540 static struct rpmsg_driver rpmsg_chrdev_driver
= {
541 .probe
= rpmsg_chrdev_probe
,
542 .remove
= rpmsg_chrdev_remove
,
544 .name
= "rpmsg_chrdev",
548 static int rpmsg_char_init(void)
552 ret
= alloc_chrdev_region(&rpmsg_major
, 0, RPMSG_DEV_MAX
, "rpmsg");
554 pr_err("rpmsg: failed to allocate char dev region\n");
558 rpmsg_class
= class_create(THIS_MODULE
, "rpmsg");
559 if (IS_ERR(rpmsg_class
)) {
560 pr_err("failed to create rpmsg class\n");
561 unregister_chrdev_region(rpmsg_major
, RPMSG_DEV_MAX
);
562 return PTR_ERR(rpmsg_class
);
565 ret
= register_rpmsg_driver(&rpmsg_chrdev_driver
);
567 pr_err("rpmsgchr: failed to register rpmsg driver\n");
568 class_destroy(rpmsg_class
);
569 unregister_chrdev_region(rpmsg_major
, RPMSG_DEV_MAX
);
574 postcore_initcall(rpmsg_char_init
);
576 static void rpmsg_chrdev_exit(void)
578 unregister_rpmsg_driver(&rpmsg_chrdev_driver
);
579 class_destroy(rpmsg_class
);
580 unregister_chrdev_region(rpmsg_major
, RPMSG_DEV_MAX
);
582 module_exit(rpmsg_chrdev_exit
);
584 MODULE_ALIAS("rpmsg:rpmsg_chrdev");
585 MODULE_LICENSE("GPL v2");