linux/drivers/rpmsg/rpmsg_char.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   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.
   8 *
   9 * Based on rpmsg performance statistics driver by Michal Simek, which in turn
  10 * was based on TI & Google OMX rpmsg driver.
  11 */
  12#include <linux/cdev.h>
  13#include <linux/device.h>
  14#include <linux/fs.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>
  24
  25#include "rpmsg_internal.h"
  26
  27#define RPMSG_DEV_MAX   (MINORMASK + 1)
  28
  29static dev_t rpmsg_major;
  30static struct class *rpmsg_class;
  31
  32static DEFINE_IDA(rpmsg_ctrl_ida);
  33static DEFINE_IDA(rpmsg_ept_ida);
  34static DEFINE_IDA(rpmsg_minor_ida);
  35
  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)
  38
  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)
  41
  42/**
  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
  47 */
  48struct rpmsg_ctrldev {
  49        struct rpmsg_device *rpdev;
  50        struct cdev cdev;
  51        struct device dev;
  52};
  53
  54/**
  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
  65 */
  66struct rpmsg_eptdev {
  67        struct device dev;
  68        struct cdev cdev;
  69
  70        struct rpmsg_device *rpdev;
  71        struct rpmsg_channel_info chinfo;
  72
  73        struct mutex ept_lock;
  74        struct rpmsg_endpoint *ept;
  75
  76        spinlock_t queue_lock;
  77        struct sk_buff_head queue;
  78        wait_queue_head_t readq;
  79};
  80
  81static int rpmsg_eptdev_destroy(struct device *dev, void *data)
  82{
  83        struct rpmsg_eptdev *eptdev = dev_to_eptdev(dev);
  84
  85        mutex_lock(&eptdev->ept_lock);
  86        if (eptdev->ept) {
  87                rpmsg_destroy_ept(eptdev->ept);
  88                eptdev->ept = NULL;
  89        }
  90        mutex_unlock(&eptdev->ept_lock);
  91
  92        /* wake up any blocked readers */
  93        wake_up_interruptible(&eptdev->readq);
  94
  95        device_del(&eptdev->dev);
  96        put_device(&eptdev->dev);
  97
  98        return 0;
  99}
 100
 101static int rpmsg_ept_cb(struct rpmsg_device *rpdev, void *buf, int len,
 102                        void *priv, u32 addr)
 103{
 104        struct rpmsg_eptdev *eptdev = priv;
 105        struct sk_buff *skb;
 106
 107        skb = alloc_skb(len, GFP_ATOMIC);
 108        if (!skb)
 109                return -ENOMEM;
 110
 111        skb_put_data(skb, buf, len);
 112
 113        spin_lock(&eptdev->queue_lock);
 114        skb_queue_tail(&eptdev->queue, skb);
 115        spin_unlock(&eptdev->queue_lock);
 116
 117        /* wake up any blocking processes, waiting for new data */
 118        wake_up_interruptible(&eptdev->readq);
 119
 120        return 0;
 121}
 122
 123static int rpmsg_eptdev_open(struct inode *inode, struct file *filp)
 124{
 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;
 129
 130        if (eptdev->ept)
 131                return -EBUSY;
 132
 133        get_device(dev);
 134
 135        ept = rpmsg_create_ept(rpdev, rpmsg_ept_cb, eptdev, eptdev->chinfo);
 136        if (!ept) {
 137                dev_err(dev, "failed to open %s\n", eptdev->chinfo.name);
 138                put_device(dev);
 139                return -EINVAL;
 140        }
 141
 142        eptdev->ept = ept;
 143        filp->private_data = eptdev;
 144
 145        return 0;
 146}
 147
 148static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
 149{
 150        struct rpmsg_eptdev *eptdev = cdev_to_eptdev(inode->i_cdev);
 151        struct device *dev = &eptdev->dev;
 152
 153        /* Close the endpoint, if it's not already destroyed by the parent */
 154        mutex_lock(&eptdev->ept_lock);
 155        if (eptdev->ept) {
 156                rpmsg_destroy_ept(eptdev->ept);
 157                eptdev->ept = NULL;
 158        }
 159        mutex_unlock(&eptdev->ept_lock);
 160
 161        /* Discard all SKBs */
 162        skb_queue_purge(&eptdev->queue);
 163
 164        put_device(dev);
 165
 166        return 0;
 167}
 168
 169static ssize_t rpmsg_eptdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
 170{
 171        struct file *filp = iocb->ki_filp;
 172        struct rpmsg_eptdev *eptdev = filp->private_data;
 173        unsigned long flags;
 174        struct sk_buff *skb;
 175        int use;
 176
 177        if (!eptdev->ept)
 178                return -EPIPE;
 179
 180        spin_lock_irqsave(&eptdev->queue_lock, flags);
 181
 182        /* Wait for data in the queue */
 183        if (skb_queue_empty(&eptdev->queue)) {
 184                spin_unlock_irqrestore(&eptdev->queue_lock, flags);
 185
 186                if (filp->f_flags & O_NONBLOCK)
 187                        return -EAGAIN;
 188
 189                /* Wait until we get data or the endpoint goes away */
 190                if (wait_event_interruptible(eptdev->readq,
 191                                             !skb_queue_empty(&eptdev->queue) ||
 192                                             !eptdev->ept))
 193                        return -ERESTARTSYS;
 194
 195                /* We lost the endpoint while waiting */
 196                if (!eptdev->ept)
 197                        return -EPIPE;
 198
 199                spin_lock_irqsave(&eptdev->queue_lock, flags);
 200        }
 201
 202        skb = skb_dequeue(&eptdev->queue);
 203        spin_unlock_irqrestore(&eptdev->queue_lock, flags);
 204        if (!skb)
 205                return -EFAULT;
 206
 207        use = min_t(size_t, iov_iter_count(to), skb->len);
 208        if (copy_to_iter(skb->data, use, to) != use)
 209                use = -EFAULT;
 210
 211        kfree_skb(skb);
 212
 213        return use;
 214}
 215
 216static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb,
 217                                       struct iov_iter *from)
 218{
 219        struct file *filp = iocb->ki_filp;
 220        struct rpmsg_eptdev *eptdev = filp->private_data;
 221        size_t len = iov_iter_count(from);
 222        void *kbuf;
 223        int ret;
 224
 225        kbuf = kzalloc(len, GFP_KERNEL);
 226        if (!kbuf)
 227                return -ENOMEM;
 228
 229        if (!copy_from_iter_full(kbuf, len, from)) {
 230                ret = -EFAULT;
 231                goto free_kbuf;
 232        }
 233
 234        if (mutex_lock_interruptible(&eptdev->ept_lock)) {
 235                ret = -ERESTARTSYS;
 236                goto free_kbuf;
 237        }
 238
 239        if (!eptdev->ept) {
 240                ret = -EPIPE;
 241                goto unlock_eptdev;
 242        }
 243
 244        if (filp->f_flags & O_NONBLOCK)
 245                ret = rpmsg_trysendto(eptdev->ept, kbuf, len, eptdev->chinfo.dst);
 246        else
 247                ret = rpmsg_sendto(eptdev->ept, kbuf, len, eptdev->chinfo.dst);
 248
 249unlock_eptdev:
 250        mutex_unlock(&eptdev->ept_lock);
 251
 252free_kbuf:
 253        kfree(kbuf);
 254        return ret < 0 ? ret : len;
 255}
 256
 257static __poll_t rpmsg_eptdev_poll(struct file *filp, poll_table *wait)
 258{
 259        struct rpmsg_eptdev *eptdev = filp->private_data;
 260        __poll_t mask = 0;
 261
 262        if (!eptdev->ept)
 263                return EPOLLERR;
 264
 265        poll_wait(filp, &eptdev->readq, wait);
 266
 267        if (!skb_queue_empty(&eptdev->queue))
 268                mask |= EPOLLIN | EPOLLRDNORM;
 269
 270        mask |= rpmsg_poll(eptdev->ept, filp, wait);
 271
 272        return mask;
 273}
 274
 275static long rpmsg_eptdev_ioctl(struct file *fp, unsigned int cmd,
 276                               unsigned long arg)
 277{
 278        struct rpmsg_eptdev *eptdev = fp->private_data;
 279
 280        if (cmd != RPMSG_DESTROY_EPT_IOCTL)
 281                return -EINVAL;
 282
 283        return rpmsg_eptdev_destroy(&eptdev->dev, NULL);
 284}
 285
 286static const struct file_operations rpmsg_eptdev_fops = {
 287        .owner = THIS_MODULE,
 288        .open = rpmsg_eptdev_open,
 289        .release = rpmsg_eptdev_release,
 290        .read_iter = rpmsg_eptdev_read_iter,
 291        .write_iter = rpmsg_eptdev_write_iter,
 292        .poll = rpmsg_eptdev_poll,
 293        .unlocked_ioctl = rpmsg_eptdev_ioctl,
 294        .compat_ioctl = compat_ptr_ioctl,
 295};
 296
 297static ssize_t name_show(struct device *dev, struct device_attribute *attr,
 298                         char *buf)
 299{
 300        struct rpmsg_eptdev *eptdev = dev_get_drvdata(dev);
 301
 302        return sprintf(buf, "%s\n", eptdev->chinfo.name);
 303}
 304static DEVICE_ATTR_RO(name);
 305
 306static ssize_t src_show(struct device *dev, struct device_attribute *attr,
 307                         char *buf)
 308{
 309        struct rpmsg_eptdev *eptdev = dev_get_drvdata(dev);
 310
 311        return sprintf(buf, "%d\n", eptdev->chinfo.src);
 312}
 313static DEVICE_ATTR_RO(src);
 314
 315static ssize_t dst_show(struct device *dev, struct device_attribute *attr,
 316                         char *buf)
 317{
 318        struct rpmsg_eptdev *eptdev = dev_get_drvdata(dev);
 319
 320        return sprintf(buf, "%d\n", eptdev->chinfo.dst);
 321}
 322static DEVICE_ATTR_RO(dst);
 323
 324static struct attribute *rpmsg_eptdev_attrs[] = {
 325        &dev_attr_name.attr,
 326        &dev_attr_src.attr,
 327        &dev_attr_dst.attr,
 328        NULL
 329};
 330ATTRIBUTE_GROUPS(rpmsg_eptdev);
 331
 332static void rpmsg_eptdev_release_device(struct device *dev)
 333{
 334        struct rpmsg_eptdev *eptdev = dev_to_eptdev(dev);
 335
 336        ida_simple_remove(&rpmsg_ept_ida, dev->id);
 337        ida_simple_remove(&rpmsg_minor_ida, MINOR(eptdev->dev.devt));
 338        cdev_del(&eptdev->cdev);
 339        kfree(eptdev);
 340}
 341
 342static int rpmsg_eptdev_create(struct rpmsg_ctrldev *ctrldev,
 343                               struct rpmsg_channel_info chinfo)
 344{
 345        struct rpmsg_device *rpdev = ctrldev->rpdev;
 346        struct rpmsg_eptdev *eptdev;
 347        struct device *dev;
 348        int ret;
 349
 350        eptdev = kzalloc(sizeof(*eptdev), GFP_KERNEL);
 351        if (!eptdev)
 352                return -ENOMEM;
 353
 354        dev = &eptdev->dev;
 355        eptdev->rpdev = rpdev;
 356        eptdev->chinfo = chinfo;
 357
 358        mutex_init(&eptdev->ept_lock);
 359        spin_lock_init(&eptdev->queue_lock);
 360        skb_queue_head_init(&eptdev->queue);
 361        init_waitqueue_head(&eptdev->readq);
 362
 363        device_initialize(dev);
 364        dev->class = rpmsg_class;
 365        dev->parent = &ctrldev->dev;
 366        dev->groups = rpmsg_eptdev_groups;
 367        dev_set_drvdata(dev, eptdev);
 368
 369        cdev_init(&eptdev->cdev, &rpmsg_eptdev_fops);
 370        eptdev->cdev.owner = THIS_MODULE;
 371
 372        ret = ida_simple_get(&rpmsg_minor_ida, 0, RPMSG_DEV_MAX, GFP_KERNEL);
 373        if (ret < 0)
 374                goto free_eptdev;
 375        dev->devt = MKDEV(MAJOR(rpmsg_major), ret);
 376
 377        ret = ida_simple_get(&rpmsg_ept_ida, 0, 0, GFP_KERNEL);
 378        if (ret < 0)
 379                goto free_minor_ida;
 380        dev->id = ret;
 381        dev_set_name(dev, "rpmsg%d", ret);
 382
 383        ret = cdev_add(&eptdev->cdev, dev->devt, 1);
 384        if (ret)
 385                goto free_ept_ida;
 386
 387        /* We can now rely on the release function for cleanup */
 388        dev->release = rpmsg_eptdev_release_device;
 389
 390        ret = device_add(dev);
 391        if (ret) {
 392                dev_err(dev, "device_add failed: %d\n", ret);
 393                put_device(dev);
 394        }
 395
 396        return ret;
 397
 398free_ept_ida:
 399        ida_simple_remove(&rpmsg_ept_ida, dev->id);
 400free_minor_ida:
 401        ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
 402free_eptdev:
 403        put_device(dev);
 404        kfree(eptdev);
 405
 406        return ret;
 407}
 408
 409static int rpmsg_ctrldev_open(struct inode *inode, struct file *filp)
 410{
 411        struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
 412
 413        get_device(&ctrldev->dev);
 414        filp->private_data = ctrldev;
 415
 416        return 0;
 417}
 418
 419static int rpmsg_ctrldev_release(struct inode *inode, struct file *filp)
 420{
 421        struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
 422
 423        put_device(&ctrldev->dev);
 424
 425        return 0;
 426}
 427
 428static long rpmsg_ctrldev_ioctl(struct file *fp, unsigned int cmd,
 429                                unsigned long arg)
 430{
 431        struct rpmsg_ctrldev *ctrldev = fp->private_data;
 432        void __user *argp = (void __user *)arg;
 433        struct rpmsg_endpoint_info eptinfo;
 434        struct rpmsg_channel_info chinfo;
 435
 436        if (cmd != RPMSG_CREATE_EPT_IOCTL)
 437                return -EINVAL;
 438
 439        if (copy_from_user(&eptinfo, argp, sizeof(eptinfo)))
 440                return -EFAULT;
 441
 442        memcpy(chinfo.name, eptinfo.name, RPMSG_NAME_SIZE);
 443        chinfo.name[RPMSG_NAME_SIZE-1] = '\0';
 444        chinfo.src = eptinfo.src;
 445        chinfo.dst = eptinfo.dst;
 446
 447        return rpmsg_eptdev_create(ctrldev, chinfo);
 448};
 449
 450static const struct file_operations rpmsg_ctrldev_fops = {
 451        .owner = THIS_MODULE,
 452        .open = rpmsg_ctrldev_open,
 453        .release = rpmsg_ctrldev_release,
 454        .unlocked_ioctl = rpmsg_ctrldev_ioctl,
 455        .compat_ioctl = compat_ptr_ioctl,
 456};
 457
 458static void rpmsg_ctrldev_release_device(struct device *dev)
 459{
 460        struct rpmsg_ctrldev *ctrldev = dev_to_ctrldev(dev);
 461
 462        ida_simple_remove(&rpmsg_ctrl_ida, dev->id);
 463        ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
 464        cdev_del(&ctrldev->cdev);
 465        kfree(ctrldev);
 466}
 467
 468static int rpmsg_chrdev_probe(struct rpmsg_device *rpdev)
 469{
 470        struct rpmsg_ctrldev *ctrldev;
 471        struct device *dev;
 472        int ret;
 473
 474        ctrldev = kzalloc(sizeof(*ctrldev), GFP_KERNEL);
 475        if (!ctrldev)
 476                return -ENOMEM;
 477
 478        ctrldev->rpdev = rpdev;
 479
 480        dev = &ctrldev->dev;
 481        device_initialize(dev);
 482        dev->parent = &rpdev->dev;
 483        dev->class = rpmsg_class;
 484
 485        cdev_init(&ctrldev->cdev, &rpmsg_ctrldev_fops);
 486        ctrldev->cdev.owner = THIS_MODULE;
 487
 488        ret = ida_simple_get(&rpmsg_minor_ida, 0, RPMSG_DEV_MAX, GFP_KERNEL);
 489        if (ret < 0)
 490                goto free_ctrldev;
 491        dev->devt = MKDEV(MAJOR(rpmsg_major), ret);
 492
 493        ret = ida_simple_get(&rpmsg_ctrl_ida, 0, 0, GFP_KERNEL);
 494        if (ret < 0)
 495                goto free_minor_ida;
 496        dev->id = ret;
 497        dev_set_name(&ctrldev->dev, "rpmsg_ctrl%d", ret);
 498
 499        ret = cdev_add(&ctrldev->cdev, dev->devt, 1);
 500        if (ret)
 501                goto free_ctrl_ida;
 502
 503        /* We can now rely on the release function for cleanup */
 504        dev->release = rpmsg_ctrldev_release_device;
 505
 506        ret = device_add(dev);
 507        if (ret) {
 508                dev_err(&rpdev->dev, "device_add failed: %d\n", ret);
 509                put_device(dev);
 510        }
 511
 512        dev_set_drvdata(&rpdev->dev, ctrldev);
 513
 514        return ret;
 515
 516free_ctrl_ida:
 517        ida_simple_remove(&rpmsg_ctrl_ida, dev->id);
 518free_minor_ida:
 519        ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
 520free_ctrldev:
 521        put_device(dev);
 522        kfree(ctrldev);
 523
 524        return ret;
 525}
 526
 527static void rpmsg_chrdev_remove(struct rpmsg_device *rpdev)
 528{
 529        struct rpmsg_ctrldev *ctrldev = dev_get_drvdata(&rpdev->dev);
 530        int ret;
 531
 532        /* Destroy all endpoints */
 533        ret = device_for_each_child(&ctrldev->dev, NULL, rpmsg_eptdev_destroy);
 534        if (ret)
 535                dev_warn(&rpdev->dev, "failed to nuke endpoints: %d\n", ret);
 536
 537        device_del(&ctrldev->dev);
 538        put_device(&ctrldev->dev);
 539}
 540
 541static struct rpmsg_driver rpmsg_chrdev_driver = {
 542        .probe = rpmsg_chrdev_probe,
 543        .remove = rpmsg_chrdev_remove,
 544        .drv = {
 545                .name = "rpmsg_chrdev",
 546        },
 547};
 548
 549static int rpmsg_chrdev_init(void)
 550{
 551        int ret;
 552
 553        ret = alloc_chrdev_region(&rpmsg_major, 0, RPMSG_DEV_MAX, "rpmsg");
 554        if (ret < 0) {
 555                pr_err("rpmsg: failed to allocate char dev region\n");
 556                return ret;
 557        }
 558
 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);
 564        }
 565
 566        ret = register_rpmsg_driver(&rpmsg_chrdev_driver);
 567        if (ret < 0) {
 568                pr_err("rpmsgchr: failed to register rpmsg driver\n");
 569                class_destroy(rpmsg_class);
 570                unregister_chrdev_region(rpmsg_major, RPMSG_DEV_MAX);
 571        }
 572
 573        return ret;
 574}
 575postcore_initcall(rpmsg_chrdev_init);
 576
 577static void rpmsg_chrdev_exit(void)
 578{
 579        unregister_rpmsg_driver(&rpmsg_chrdev_driver);
 580        class_destroy(rpmsg_class);
 581        unregister_chrdev_region(rpmsg_major, RPMSG_DEV_MAX);
 582}
 583module_exit(rpmsg_chrdev_exit);
 584
 585MODULE_ALIAS("rpmsg:rpmsg_chrdev");
 586MODULE_LICENSE("GPL v2");
 587