rapidio: add RapidIO channelized messaging driver
Add channelized messaging driver to support native RapidIO messaging exchange between multiple senders/recipients on devices that use kernel RapidIO subsystem services. This device driver is the result of collaboration within the RapidIO.org Software Task Group (STG) between Texas Instruments, Prodrive Technologies, Nokia Networks, BAE and IDT. Additional input was received from other members of RapidIO.org. The objective was to create a character mode driver interface which exposes messaging capabilities of RapidIO endpoint devices (mports) directly to applications, in a manner that allows the numerous and varied RapidIO implementations to interoperate. This char mode device driver allows user-space applications to setup messaging communication channels using single shared RapidIO messaging mailbox. By default this driver uses RapidIO MBOX_1 (MBOX_0 is reserved for use by RIONET Ethernet emulation driver). [weiyj.lk@gmail.com: rapidio/rio_cm: fix return value check in riocm_init()] Link: http://lkml.kernel.org/r/1469198221-21970-1-git-send-email-alexandre.bounine@idt.com Link: http://lkml.kernel.org/r/1468952862-18056-1-git-send-email-alexandre.bounine@idt.com Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com> Tested-by: Barry Wood <barry.wood@idt.com> Cc: Matt Porter <mporter@kernel.crashing.org> Cc: Aurelien Jacquiot <a-jacquiot@ti.com> Cc: Andre van Herk <andre.van.herk@prodrive-technologies.com> Cc: Barry Wood <barry.wood@idt.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
1730f14660
commit
b6e8d4aa11
|
@ -0,0 +1,119 @@
|
||||||
|
RapidIO subsystem Channelized Messaging character device driver (rio_cm.c)
|
||||||
|
==========================================================================
|
||||||
|
|
||||||
|
Version History:
|
||||||
|
----------------
|
||||||
|
1.0.0 - Initial driver release.
|
||||||
|
|
||||||
|
==========================================================================
|
||||||
|
|
||||||
|
I. Overview
|
||||||
|
|
||||||
|
This device driver is the result of collaboration within the RapidIO.org
|
||||||
|
Software Task Group (STG) between Texas Instruments, Prodrive Technologies,
|
||||||
|
Nokia Networks, BAE and IDT. Additional input was received from other members
|
||||||
|
of RapidIO.org.
|
||||||
|
|
||||||
|
The objective was to create a character mode driver interface which exposes
|
||||||
|
messaging capabilities of RapidIO endpoint devices (mports) directly
|
||||||
|
to applications, in a manner that allows the numerous and varied RapidIO
|
||||||
|
implementations to interoperate.
|
||||||
|
|
||||||
|
This driver (RIO_CM) provides to user-space applications shared access to
|
||||||
|
RapidIO mailbox messaging resources.
|
||||||
|
|
||||||
|
RapidIO specification (Part 2) defines that endpoint devices may have up to four
|
||||||
|
messaging mailboxes in case of multi-packet message (up to 4KB) and
|
||||||
|
up to 64 mailboxes if single-packet messages (up to 256 B) are used. In addition
|
||||||
|
to protocol definition limitations, a particular hardware implementation can
|
||||||
|
have reduced number of messaging mailboxes. RapidIO aware applications must
|
||||||
|
therefore share the messaging resources of a RapidIO endpoint.
|
||||||
|
|
||||||
|
Main purpose of this device driver is to provide RapidIO mailbox messaging
|
||||||
|
capability to large number of user-space processes by introducing socket-like
|
||||||
|
operations using a single messaging mailbox. This allows applications to
|
||||||
|
use the limited RapidIO messaging hardware resources efficiently.
|
||||||
|
|
||||||
|
Most of device driver's operations are supported through 'ioctl' system calls.
|
||||||
|
|
||||||
|
When loaded this device driver creates a single file system node named rio_cm
|
||||||
|
in /dev directory common for all registered RapidIO mport devices.
|
||||||
|
|
||||||
|
Following ioctl commands are available to user-space applications:
|
||||||
|
|
||||||
|
- RIO_CM_MPORT_GET_LIST : Returns to caller list of local mport devices that
|
||||||
|
support messaging operations (number of entries up to RIO_MAX_MPORTS).
|
||||||
|
Each list entry is combination of mport's index in the system and RapidIO
|
||||||
|
destination ID assigned to the port.
|
||||||
|
- RIO_CM_EP_GET_LIST_SIZE : Returns number of messaging capable remote endpoints
|
||||||
|
in a RapidIO network associated with the specified mport device.
|
||||||
|
- RIO_CM_EP_GET_LIST : Returns list of RapidIO destination IDs for messaging
|
||||||
|
capable remote endpoints (peers) available in a RapidIO network associated
|
||||||
|
with the specified mport device.
|
||||||
|
- RIO_CM_CHAN_CREATE : Creates RapidIO message exchange channel data structure
|
||||||
|
with channel ID assigned automatically or as requested by a caller.
|
||||||
|
- RIO_CM_CHAN_BIND : Binds the specified channel data structure to the specified
|
||||||
|
mport device.
|
||||||
|
- RIO_CM_CHAN_LISTEN : Enables listening for connection requests on the specified
|
||||||
|
channel.
|
||||||
|
- RIO_CM_CHAN_ACCEPT : Accepts a connection request from peer on the specified
|
||||||
|
channel. If wait timeout for this request is specified by a caller it is
|
||||||
|
a blocking call. If timeout set to 0 this is non-blocking call - ioctl
|
||||||
|
handler checks for a pending connection request and if one is not available
|
||||||
|
exits with -EGAIN error status immediately.
|
||||||
|
- RIO_CM_CHAN_CONNECT : Sends a connection request to a remote peer/channel.
|
||||||
|
- RIO_CM_CHAN_SEND : Sends a data message through the specified channel.
|
||||||
|
The handler for this request assumes that message buffer specified by
|
||||||
|
a caller includes the reserved space for a packet header required by
|
||||||
|
this driver.
|
||||||
|
- RIO_CM_CHAN_RECEIVE : Receives a data message through a connected channel.
|
||||||
|
If the channel does not have an incoming message ready to return this ioctl
|
||||||
|
handler will wait for new message until timeout specified by a caller
|
||||||
|
expires. If timeout value is set to 0, ioctl handler uses a default value
|
||||||
|
defined by MAX_SCHEDULE_TIMEOUT.
|
||||||
|
- RIO_CM_CHAN_CLOSE : Closes a specified channel and frees associated buffers.
|
||||||
|
If the specified channel is in the CONNECTED state, sends close notification
|
||||||
|
to the remote peer.
|
||||||
|
|
||||||
|
The ioctl command codes and corresponding data structures intended for use by
|
||||||
|
user-space applications are defined in 'include/uapi/linux/rio_cm_cdev.h'.
|
||||||
|
|
||||||
|
II. Hardware Compatibility
|
||||||
|
|
||||||
|
This device driver uses standard interfaces defined by kernel RapidIO subsystem
|
||||||
|
and therefore it can be used with any mport device driver registered by RapidIO
|
||||||
|
subsystem with limitations set by available mport HW implementation of messaging
|
||||||
|
mailboxes.
|
||||||
|
|
||||||
|
III. Module parameters
|
||||||
|
|
||||||
|
- 'dbg_level' - This parameter allows to control amount of debug information
|
||||||
|
generated by this device driver. This parameter is formed by set of
|
||||||
|
bit masks that correspond to the specific functional block.
|
||||||
|
For mask definitions see 'drivers/rapidio/devices/rio_cm.c'
|
||||||
|
This parameter can be changed dynamically.
|
||||||
|
Use CONFIG_RAPIDIO_DEBUG=y to enable debug output at the top level.
|
||||||
|
|
||||||
|
- 'cmbox' - Number of RapidIO mailbox to use (default value is 1).
|
||||||
|
This parameter allows to set messaging mailbox number that will be used
|
||||||
|
within entire RapidIO network. It can be used when default mailbox is
|
||||||
|
used by other device drivers or is not supported by some nodes in the
|
||||||
|
RapidIO network.
|
||||||
|
|
||||||
|
- 'chstart' - Start channel number for dynamic assignment. Default value - 256.
|
||||||
|
Allows to exclude channel numbers below this parameter from dynamic
|
||||||
|
allocation to avoid conflicts with software components that use
|
||||||
|
reserved predefined channel numbers.
|
||||||
|
|
||||||
|
IV. Known problems
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
V. User-space Applications and API Library
|
||||||
|
|
||||||
|
Messaging API library and applications that use this device driver are available
|
||||||
|
from RapidIO.org.
|
||||||
|
|
||||||
|
VI. TODO List
|
||||||
|
|
||||||
|
- Add support for system notification messages (reserved channel 0).
|
|
@ -67,6 +67,15 @@ config RAPIDIO_ENUM_BASIC
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config RAPIDIO_CHMAN
|
||||||
|
tristate "RapidIO Channelized Messaging driver"
|
||||||
|
depends on RAPIDIO
|
||||||
|
help
|
||||||
|
This option includes RapidIO channelized messaging driver which
|
||||||
|
provides socket-like interface to allow sharing of single RapidIO
|
||||||
|
messaging mailbox between multiple user-space applications.
|
||||||
|
See "Documentation/rapidio/rio_cm.txt" for driver description.
|
||||||
|
|
||||||
config RAPIDIO_MPORT_CDEV
|
config RAPIDIO_MPORT_CDEV
|
||||||
tristate "RapidIO /dev mport device driver"
|
tristate "RapidIO /dev mport device driver"
|
||||||
depends on RAPIDIO
|
depends on RAPIDIO
|
||||||
|
|
|
@ -5,6 +5,7 @@ obj-$(CONFIG_RAPIDIO) += rapidio.o
|
||||||
rapidio-y := rio.o rio-access.o rio-driver.o rio-sysfs.o
|
rapidio-y := rio.o rio-access.o rio-driver.o rio-sysfs.o
|
||||||
|
|
||||||
obj-$(CONFIG_RAPIDIO_ENUM_BASIC) += rio-scan.o
|
obj-$(CONFIG_RAPIDIO_ENUM_BASIC) += rio-scan.o
|
||||||
|
obj-$(CONFIG_RAPIDIO_CHMAN) += rio_cm.o
|
||||||
|
|
||||||
obj-$(CONFIG_RAPIDIO) += switches/
|
obj-$(CONFIG_RAPIDIO) += switches/
|
||||||
obj-$(CONFIG_RAPIDIO) += devices/
|
obj-$(CONFIG_RAPIDIO) += devices/
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -357,6 +357,7 @@ header-y += reiserfs_fs.h
|
||||||
header-y += reiserfs_xattr.h
|
header-y += reiserfs_xattr.h
|
||||||
header-y += resource.h
|
header-y += resource.h
|
||||||
header-y += rfkill.h
|
header-y += rfkill.h
|
||||||
|
header-y += rio_cm_cdev.h
|
||||||
header-y += rio_mport_cdev.h
|
header-y += rio_mport_cdev.h
|
||||||
header-y += romfs_fs.h
|
header-y += romfs_fs.h
|
||||||
header-y += rose.h
|
header-y += rose.h
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Integrated Device Technology Inc.
|
||||||
|
* Copyright (c) 2015, Prodrive Technologies
|
||||||
|
* Copyright (c) 2015, RapidIO Trade Association
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is available to you under a choice of one of two licenses.
|
||||||
|
* You may choose to be licensed under the terms of the GNU General Public
|
||||||
|
* License(GPL) Version 2, or the BSD-3 Clause license below:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RIO_CM_CDEV_H_
|
||||||
|
#define _RIO_CM_CDEV_H_
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
struct rio_cm_channel {
|
||||||
|
__u16 id;
|
||||||
|
__u16 remote_channel;
|
||||||
|
__u16 remote_destid;
|
||||||
|
__u8 mport_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rio_cm_msg {
|
||||||
|
__u16 ch_num;
|
||||||
|
__u16 size;
|
||||||
|
__u32 rxto; /* receive timeout in mSec. 0 = blocking */
|
||||||
|
__u64 msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rio_cm_accept {
|
||||||
|
__u16 ch_num;
|
||||||
|
__u16 pad0;
|
||||||
|
__u32 wait_to; /* accept timeout in mSec. 0 = blocking */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* RapidIO Channelized Messaging Driver IOCTLs */
|
||||||
|
#define RIO_CM_IOC_MAGIC 'c'
|
||||||
|
|
||||||
|
#define RIO_CM_EP_GET_LIST_SIZE _IOWR(RIO_CM_IOC_MAGIC, 1, __u32)
|
||||||
|
#define RIO_CM_EP_GET_LIST _IOWR(RIO_CM_IOC_MAGIC, 2, __u32)
|
||||||
|
#define RIO_CM_CHAN_CREATE _IOWR(RIO_CM_IOC_MAGIC, 3, __u16)
|
||||||
|
#define RIO_CM_CHAN_CLOSE _IOW(RIO_CM_IOC_MAGIC, 4, __u16)
|
||||||
|
#define RIO_CM_CHAN_BIND _IOW(RIO_CM_IOC_MAGIC, 5, struct rio_cm_channel)
|
||||||
|
#define RIO_CM_CHAN_LISTEN _IOW(RIO_CM_IOC_MAGIC, 6, __u16)
|
||||||
|
#define RIO_CM_CHAN_ACCEPT _IOWR(RIO_CM_IOC_MAGIC, 7, struct rio_cm_accept)
|
||||||
|
#define RIO_CM_CHAN_CONNECT _IOW(RIO_CM_IOC_MAGIC, 8, struct rio_cm_channel)
|
||||||
|
#define RIO_CM_CHAN_SEND _IOW(RIO_CM_IOC_MAGIC, 9, struct rio_cm_msg)
|
||||||
|
#define RIO_CM_CHAN_RECEIVE _IOWR(RIO_CM_IOC_MAGIC, 10, struct rio_cm_msg)
|
||||||
|
#define RIO_CM_MPORT_GET_LIST _IOWR(RIO_CM_IOC_MAGIC, 11, __u32)
|
||||||
|
|
||||||
|
#endif /* _RIO_CM_CDEV_H_ */
|
Loading…
Reference in New Issue