mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
rpmsg: Driver for user space endpoint interface
This driver allows rpmsg instances to expose access to rpmsg endpoints
to user space processes. It provides a control interface, allowing
userspace to export endpoints and an endpoint interface for each exposed
endpoint.
The implementation is based on prior art by Texas Instrument, Google,
PetaLogix and was derived from a FreeRTOS performance statistics driver
written by Michal Simek.
The control interface provides a "create endpoint" ioctl, which is fed a
name, source and destination address. The three values are used to
create the endpoint, in a backend-specific way, and a rpmsg endpoint
device is created - with the three parameters are available in sysfs for
udev usage.
E.g. to create an endpoint device for one of the Qualcomm SMD channel
related to DIAG one would issue:
struct rpmsg_endpoint_info info = { "DIAG_CNTL", 0, 0 };
int fd = open("/dev/rpmsg_ctrl0", O_RDWR);
ioctl(fd, RPMSG_CREATE_EPT_IOCTL, &info);
Each created endpoint device shows up as an individual character device
in /dev, allowing permission to be controlled on a per-endpoint basis.
The rpmsg endpoint will be created and destroyed following the opening
and closing of the endpoint device, allowing rpmsg backends to open and
close the physical channel, if supported by the wire protocol.
Cc: Marek Novak <marek.novak@nxp.com>
Cc: Matteo Sartori <matteo.sartori@t3lab.it>
Cc: Michal Simek <monstr@monstr.eu>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
@@ -321,6 +321,7 @@ Code Seq#(hex) Include File Comments
|
||||
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
|
||||
0xB3 00 linux/mmc/ioctl.h
|
||||
0xB4 00-0F linux/gpio.h <mailto:linux-gpio@vger.kernel.org>
|
||||
0xB5 00-0F uapi/linux/rpmsg.h <mailto:linux-remoteproc@vger.kernel.org>
|
||||
0xC0 00-0F linux/usb/iowarrior.h
|
||||
0xCA 00-0F uapi/misc/cxl.h
|
||||
0xCA 80-8F uapi/scsi/cxlflash_ioctl.h
|
||||
|
||||
@@ -4,6 +4,14 @@ menu "Rpmsg drivers"
|
||||
config RPMSG
|
||||
tristate
|
||||
|
||||
config RPMSG_CHAR
|
||||
tristate "RPMSG device interface"
|
||||
depends on RPMSG
|
||||
help
|
||||
Say Y here to export rpmsg endpoints as device files, usually found
|
||||
in /dev. They make it possible for user-space programs to send and
|
||||
receive rpmsg packets.
|
||||
|
||||
config RPMSG_QCOM_SMD
|
||||
tristate "Qualcomm Shared Memory Driver (SMD)"
|
||||
depends on QCOM_SMEM
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
obj-$(CONFIG_RPMSG) += rpmsg_core.o
|
||||
obj-$(CONFIG_RPMSG_CHAR) += rpmsg_char.o
|
||||
obj-$(CONFIG_RPMSG_QCOM_SMD) += qcom_smd.o
|
||||
obj-$(CONFIG_RPMSG_VIRTIO) += virtio_rpmsg_bus.o
|
||||
|
||||
585
drivers/rpmsg/rpmsg_char.c
Normal file
585
drivers/rpmsg/rpmsg_char.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -82,4 +82,19 @@ int rpmsg_unregister_device(struct device *parent,
|
||||
struct device *rpmsg_find_device(struct device *parent,
|
||||
struct rpmsg_channel_info *chinfo);
|
||||
|
||||
/**
|
||||
* rpmsg_chrdev_register_device() - register chrdev device based on rpdev
|
||||
* @rpdev: prepared rpdev to be used for creating endpoints
|
||||
*
|
||||
* This function wraps rpmsg_register_device() preparing the rpdev for use as
|
||||
* basis for the rpmsg chrdev.
|
||||
*/
|
||||
static inline int rpmsg_chrdev_register_device(struct rpmsg_device *rpdev)
|
||||
{
|
||||
strcpy(rpdev->id.name, "rpmsg_chrdev");
|
||||
rpdev->driver_override = "rpmsg_chrdev";
|
||||
|
||||
return rpmsg_register_device(rpdev);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
35
include/uapi/linux/rpmsg.h
Normal file
35
include/uapi/linux/rpmsg.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Linaro Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
* only version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_RPMSG_H_
|
||||
#define _UAPI_RPMSG_H_
|
||||
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/**
|
||||
* struct rpmsg_endpoint_info - endpoint info representation
|
||||
* @name: name of service
|
||||
* @src: local address
|
||||
* @dst: destination address
|
||||
*/
|
||||
struct rpmsg_endpoint_info {
|
||||
char name[32];
|
||||
__u32 src;
|
||||
__u32 dst;
|
||||
};
|
||||
|
||||
#define RPMSG_CREATE_EPT_IOCTL _IOW(0xb5, 0x1, struct rpmsg_endpoint_info)
|
||||
#define RPMSG_DESTROY_EPT_IOCTL _IO(0xb5, 0x2)
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user