Commit b6e8d4aa authored by Alexandre Bounine's avatar Alexandre Bounine Committed by Linus Torvalds
Browse files

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: default avatarAlexandre Bounine <alexandre.bounine@idt.com>
Tested-by: default avatarBarry 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1730f146
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line
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).
+9 −0
Original line number Diff line number Diff line
@@ -67,6 +67,15 @@ config RAPIDIO_ENUM_BASIC

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
	tristate "RapidIO /dev mport device driver"
	depends on RAPIDIO
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ obj-$(CONFIG_RAPIDIO) += rapidio.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_CHMAN)	+= rio_cm.o

obj-$(CONFIG_RAPIDIO)		+= switches/
obj-$(CONFIG_RAPIDIO)		+= devices/
+2366 −0

File added.

Preview size limit exceeded, changes collapsed.

+1 −0
Original line number Diff line number Diff line
@@ -357,6 +357,7 @@ header-y += reiserfs_fs.h
header-y += reiserfs_xattr.h
header-y += resource.h
header-y += rfkill.h
header-y += rio_cm_cdev.h
header-y += rio_mport_cdev.h
header-y += romfs_fs.h
header-y += rose.h
Loading