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        get_device(dev);
 131
 132        ept = rpmsg_create_ept(rpdev, rpmsg_ept_cb, eptdev, eptdev->chinfo);
 133        if (!ept) {
 134                dev_err(dev, "failed to open %s\n", eptdev->chinfo.name);
 135                put_device(dev);
 136                return -EINVAL;
 137        }
 138
 139        eptdev->ept = ept;
 140        filp->private_data = eptdev;
 141
 142        return 0;
 143}
 144
 145static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
 146{
 147        struct rpmsg_eptdev *eptdev = cdev_to_eptdev(inode->i_cdev);
 148        struct device *dev = &eptdev->dev;
 149        struct sk_buff *skb;
 150
 151        /* Close the endpoint, if it's not already destroyed by the parent */
 152        mutex_lock(&eptdev->ept_lock);
 153        if (eptdev->ept) {
 154                rpmsg_destroy_ept(eptdev->ept);
 155                eptdev->ept = NULL;
 156        }
 157        mutex_unlock(&eptdev->ept_lock);
 158
 159        /* Discard all SKBs */
 160        while (!skb_queue_empty(&eptdev->queue)) {
 161                skb = skb_dequeue(&eptdev->queue);
 162                kfree_skb(skb);
 163        }
 164
 165        put_device(dev);
 166
 167        return 0;
 168}
 169
 170static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
 171                                 size_t len, loff_t *f_pos)
 172{
 173        struct rpmsg_eptdev *eptdev = filp->private_data;
 174        unsigned long flags;
 175        struct sk_buff *skb;
 176        int use;
 177
 178        if (!eptdev->ept)
 179                return -EPIPE;
 180
 181        spin_lock_irqsave(&eptdev->queue_lock, flags);
 182
 183        /* Wait for data in the queue */
 184        if (skb_queue_empty(&eptdev->queue)) {
 185                spin_unlock_irqrestore(&eptdev->queue_lock, flags);
 186
 187                if (filp->f_flags & O_NONBLOCK)
 188                        return -EAGAIN;
 189
 190                /* Wait until we get data or the endpoint goes away */
 191                if (wait_event_interruptible(eptdev->readq,
 192                                             !skb_queue_empty(&eptdev->queue) ||
 193                                             !eptdev->ept))
 194                        return -ERESTARTSYS;
 195
 196                /* We lost the endpoint while waiting */
 197                if (!eptdev->ept)
 198                        return -EPIPE;
 199
 200                spin_lock_irqsave(&eptdev->queue_lock, flags);
 201        }
 202
 203        skb = skb_dequeue(&eptdev->queue);
 204        spin_unlock_irqrestore(&eptdev->queue_lock, flags);
 205        if (!skb)
 206                return -EFAULT;
 207
 208        use = min_t(size_t, len, skb->len);
 209        if (copy_to_user(buf, skb->data, use))
 210                use = -EFAULT;
 211
 212        kfree_skb(skb);
 213
 214        return use;
 215}
 216
 217static ssize_t rpmsg_eptdev_write(struct file *filp, const char __user *buf,
 218                                  size_t len, loff_t *f_pos)
 219{
 220        struct rpmsg_eptdev *eptdev = filp->private_data;
 221        void *kbuf;
 222        int ret;
 223
 224        kbuf = memdup_user(buf, len);
 225        if (IS_ERR(kbuf))
 226                return PTR_ERR(kbuf);
 227
 228        if (mutex_lock_interruptible(&eptdev->ept_lock)) {
 229                ret = -ERESTARTSYS;
 230                goto free_kbuf;
 231        }
 232
 233        if (!eptdev->ept) {
 234                ret = -EPIPE;
 235                goto unlock_eptdev;
 236        }
 237
 238        if (filp->f_flags & O_NONBLOCK)
 239                ret = rpmsg_trysend(eptdev->ept, kbuf, len);
 240        else
 241                ret = rpmsg_send(eptdev->ept, kbuf, len);
 242
 243unlock_eptdev:
 244        mutex_unlock(&eptdev->ept_lock);
 245
 246free_kbuf:
 247        kfree(kbuf);
 248        return ret < 0 ? ret : len;
 249}
 250
 251static __poll_t rpmsg_eptdev_poll(struct file *filp, poll_table *wait)
 252{
 253        struct rpmsg_eptdev *eptdev = filp->private_data;
 254        __poll_t mask = 0;
 255
 256        if (!eptdev->ept)
 257                return EPOLLERR;
 258
 259        poll_wait(filp, &eptdev->readq, wait);
 260
 261        if (!skb_queue_empty(&eptdev->queue))
 262                mask |= EPOLLIN | EPOLLRDNORM;
 263
 264        mask |= rpmsg_poll(eptdev->ept, filp, wait);
 265
 266        return mask;
 267}
 268
 269static long rpmsg_eptdev_ioctl(struct file *fp, unsigned int cmd,
 270                               unsigned long arg)
 271{
 272        struct rpmsg_eptdev *eptdev = fp->private_data;
 273
 274        if (cmd != RPMSG_DESTROY_EPT_IOCTL)
 275                return -EINVAL;
 276
 277        return rpmsg_eptdev_destroy(&eptdev->dev, NULL);
 278}
 279
 280static const struct file_operations rpmsg_eptdev_fops = {
 281        .owner = THIS_MODULE,
 282        .open = rpmsg_eptdev_open,
 283        .release = rpmsg_eptdev_release,
 284        .read = rpmsg_eptdev_read,
 285        .write = rpmsg_eptdev_write,
 286        .poll = rpmsg_eptdev_poll,
 287        .unlocked_ioctl = rpmsg_eptdev_ioctl,
 288};
 289
 290static ssize_t name_show(struct device *dev, struct device_attribute *attr,
 291                         char *buf)
 292{
 293        struct rpmsg_eptdev *eptdev = dev_get_drvdata(dev);
 294
 295        return sprintf(buf, "%s\n", eptdev->chinfo.name);
 296}
 297static DEVICE_ATTR_RO(name);
 298
 299static ssize_t src_show(struct device *dev, struct device_attribute *attr,
 300                         char *buf)
 301{
 302        struct rpmsg_eptdev *eptdev = dev_get_drvdata(dev);
 303
 304        return sprintf(buf, "%d\n", eptdev->chinfo.src);
 305}
 306static DEVICE_ATTR_RO(src);
 307
 308static ssize_t dst_show(struct device *dev, struct device_attribute *attr,
 309                         char *buf)
 310{
 311        struct rpmsg_eptdev *eptdev = dev_get_drvdata(dev);
 312
 313        return sprintf(buf, "%d\n", eptdev->chinfo.dst);
 314}
 315static DEVICE_ATTR_RO(dst);
 316
 317static struct attribute *rpmsg_eptdev_attrs[] = {
 318        &dev_attr_name.attr,
 319        &dev_attr_src.attr,
 320        &dev_attr_dst.attr,
 321        NULL
 322};
 323ATTRIBUTE_GROUPS(rpmsg_eptdev);
 324
 325static void rpmsg_eptdev_release_device(struct device *dev)
 326{
 327        struct rpmsg_eptdev *eptdev = dev_to_eptdev(dev);
 328
 329        ida_simple_remove(&rpmsg_ept_ida, dev->id);
 330        ida_simple_remove(&rpmsg_minor_ida, MINOR(eptdev->dev.devt));
 331        cdev_del(&eptdev->cdev);
 332        kfree(eptdev);
 333}
 334
 335static int rpmsg_eptdev_create(struct rpmsg_ctrldev *ctrldev,
 336                               struct rpmsg_channel_info chinfo)
 337{
 338        struct rpmsg_device *rpdev = ctrldev->rpdev;
 339        struct rpmsg_eptdev *eptdev;
 340        struct device *dev;
 341        int ret;
 342
 343        eptdev = kzalloc(sizeof(*eptdev), GFP_KERNEL);
 344        if (!eptdev)
 345                return -ENOMEM;
 346
 347        dev = &eptdev->dev;
 348        eptdev->rpdev = rpdev;
 349        eptdev->chinfo = chinfo;
 350
 351        mutex_init(&eptdev->ept_lock);
 352        spin_lock_init(&eptdev->queue_lock);
 353        skb_queue_head_init(&eptdev->queue);
 354        init_waitqueue_head(&eptdev->readq);
 355
 356        device_initialize(dev);
 357        dev->class = rpmsg_class;
 358        dev->parent = &ctrldev->dev;
 359        dev->groups = rpmsg_eptdev_groups;
 360        dev_set_drvdata(dev, eptdev);
 361
 362        cdev_init(&eptdev->cdev, &rpmsg_eptdev_fops);
 363        eptdev->cdev.owner = THIS_MODULE;
 364
 365        ret = ida_simple_get(&rpmsg_minor_ida, 0, RPMSG_DEV_MAX, GFP_KERNEL);
 366        if (ret < 0)
 367                goto free_eptdev;
 368        dev->devt = MKDEV(MAJOR(rpmsg_major), ret);
 369
 370        ret = ida_simple_get(&rpmsg_ept_ida, 0, 0, GFP_KERNEL);
 371        if (ret < 0)
 372                goto free_minor_ida;
 373        dev->id = ret;
 374        dev_set_name(dev, "rpmsg%d", ret);
 375
 376        ret = cdev_add(&eptdev->cdev, dev->devt, 1);
 377        if (ret)
 378                goto free_ept_ida;
 379
 380        /* We can now rely on the release function for cleanup */
 381        dev->release = rpmsg_eptdev_release_device;
 382
 383        ret = device_add(dev);
 384        if (ret) {
 385                dev_err(dev, "device_add failed: %d\n", ret);
 386                put_device(dev);
 387        }
 388
 389        return ret;
 390
 391free_ept_ida:
 392        ida_simple_remove(&rpmsg_ept_ida, dev->id);
 393free_minor_ida:
 394        ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
 395free_eptdev:
 396        put_device(dev);
 397        kfree(eptdev);
 398
 399        return ret;
 400}
 401
 402static int rpmsg_ctrldev_open(struct inode *inode, struct file *filp)
 403{
 404        struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
 405
 406        get_device(&ctrldev->dev);
 407        filp->private_data = ctrldev;
 408
 409        return 0;
 410}
 411
 412static int rpmsg_ctrldev_release(struct inode *inode, struct file *filp)
 413{
 414        struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
 415
 416        put_device(&ctrldev->dev);
 417
 418        return 0;
 419}
 420
 421static long rpmsg_ctrldev_ioctl(struct file *fp, unsigned int cmd,
 422                                unsigned long arg)
 423{
 424        struct rpmsg_ctrldev *ctrldev = fp->private_data;
 425        void __user *argp = (void __user *)arg;
 426        struct rpmsg_endpoint_info eptinfo;
 427        struct rpmsg_channel_info chinfo;
 428
 429        if (cmd != RPMSG_CREATE_EPT_IOCTL)
 430                return -EINVAL;
 431
 432        if (copy_from_user(&eptinfo, argp, sizeof(eptinfo)))
 433                return -EFAULT;
 434
 435        memcpy(chinfo.name, eptinfo.name, RPMSG_NAME_SIZE);
 436        chinfo.name[RPMSG_NAME_SIZE-1] = '\0';
 437        chinfo.src = eptinfo.src;
 438        chinfo.dst = eptinfo.dst;
 439
 440        return rpmsg_eptdev_create(ctrldev, chinfo);
 441};
 442
 443static const struct file_operations rpmsg_ctrldev_fops = {
 444        .owner = THIS_MODULE,
 445        .open = rpmsg_ctrldev_open,
 446        .release = rpmsg_ctrldev_release,
 447        .unlocked_ioctl = rpmsg_ctrldev_ioctl,
 448};
 449
 450static void rpmsg_ctrldev_release_device(struct device *dev)
 451{
 452        struct rpmsg_ctrldev *ctrldev = dev_to_ctrldev(dev);
 453
 454        ida_simple_remove(&rpmsg_ctrl_ida, dev->id);
 455        ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
 456        cdev_del(&ctrldev->cdev);
 457        kfree(ctrldev);
 458}
 459
 460static int rpmsg_chrdev_probe(struct rpmsg_device *rpdev)
 461{
 462        struct rpmsg_ctrldev *ctrldev;
 463        struct device *dev;
 464        int ret;
 465
 466        ctrldev = kzalloc(sizeof(*ctrldev), GFP_KERNEL);
 467        if (!ctrldev)
 468                return -ENOMEM;
 469
 470        ctrldev->rpdev = rpdev;
 471
 472        dev = &ctrldev->dev;
 473        device_initialize(dev);
 474        dev->parent = &rpdev->dev;
 475        dev->class = rpmsg_class;
 476
 477        cdev_init(&ctrldev->cdev, &rpmsg_ctrldev_fops);
 478        ctrldev->cdev.owner = THIS_MODULE;
 479
 480        ret = ida_simple_get(&rpmsg_minor_ida, 0, RPMSG_DEV_MAX, GFP_KERNEL);
 481        if (ret < 0)
 482                goto free_ctrldev;
 483        dev->devt = MKDEV(MAJOR(rpmsg_major), ret);
 484
 485        ret = ida_simple_get(&rpmsg_ctrl_ida, 0, 0, GFP_KERNEL);
 486        if (ret < 0)
 487                goto free_minor_ida;
 488        dev->id = ret;
 489        dev_set_name(&ctrldev->dev, "rpmsg_ctrl%d", ret);
 490
 491        ret = cdev_add(&ctrldev->cdev, dev->devt, 1);
 492        if (ret)
 493                goto free_ctrl_ida;
 494
 495        /* We can now rely on the release function for cleanup */
 496        dev->release = rpmsg_ctrldev_release_device;
 497
 498        ret = device_add(dev);
 499        if (ret) {
 500                dev_err(&rpdev->dev, "device_add failed: %d\n", ret);
 501                put_device(dev);
 502        }
 503
 504        dev_set_drvdata(&rpdev->dev, ctrldev);
 505
 506        return ret;
 507
 508free_ctrl_ida:
 509        ida_simple_remove(&rpmsg_ctrl_ida, dev->id);
 510free_minor_ida:
 511        ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
 512free_ctrldev:
 513        put_device(dev);
 514        kfree(ctrldev);
 515
 516        return ret;
 517}
 518
 519static void rpmsg_chrdev_remove(struct rpmsg_device *rpdev)
 520{
 521        struct rpmsg_ctrldev *ctrldev = dev_get_drvdata(&rpdev->dev);
 522        int ret;
 523
 524        /* Destroy all endpoints */
 525        ret = device_for_each_child(&ctrldev->dev, NULL, rpmsg_eptdev_destroy);
 526        if (ret)
 527                dev_warn(&rpdev->dev, "failed to nuke endpoints: %d\n", ret);
 528
 529        device_del(&ctrldev->dev);
 530        put_device(&ctrldev->dev);
 531}
 532
 533static struct rpmsg_driver rpmsg_chrdev_driver = {
 534        .probe = rpmsg_chrdev_probe,
 535        .remove = rpmsg_chrdev_remove,
 536        .drv = {
 537                .name = "rpmsg_chrdev",
 538        },
 539};
 540
 541static int rpmsg_char_init(void)
 542{
 543        int ret;
 544
 545        ret = alloc_chrdev_region(&rpmsg_major, 0, RPMSG_DEV_MAX, "rpmsg");
 546        if (ret < 0) {
 547                pr_err("rpmsg: failed to allocate char dev region\n");
 548                return ret;
 549        }
 550
 551        rpmsg_class = class_create(THIS_MODULE, "rpmsg");
 552        if (IS_ERR(rpmsg_class)) {
 553                pr_err("failed to create rpmsg class\n");
 554                unregister_chrdev_region(rpmsg_major, RPMSG_DEV_MAX);
 555                return PTR_ERR(rpmsg_class);
 556        }
 557
 558        ret = register_rpmsg_driver(&rpmsg_chrdev_driver);
 559        if (ret < 0) {
 560                pr_err("rpmsgchr: failed to register rpmsg driver\n");
 561                class_destroy(rpmsg_class);
 562                unregister_chrdev_region(rpmsg_major, RPMSG_DEV_MAX);
 563        }
 564
 565        return ret;
 566}
 567postcore_initcall(rpmsg_char_init);
 568
 569static void rpmsg_chrdev_exit(void)
 570{
 571        unregister_rpmsg_driver(&rpmsg_chrdev_driver);
 572        class_destroy(rpmsg_class);
 573        unregister_chrdev_region(rpmsg_major, RPMSG_DEV_MAX);
 574}
 575module_exit(rpmsg_chrdev_exit);
 576
 577MODULE_ALIAS("rpmsg:rpmsg_chrdev");
 578MODULE_LICENSE("GPL v2");
 579