Messages in this thread | | | From | Sjur Brændeland <> | Subject | [PATCH 0/9] XSHM: Shared Memory Driver for ST-E Thor M7400 LTE modem | Date | Wed, 7 Dec 2011 10:27:59 +0100 |
| |
Introduction: ~~~~~~~~~~~~~ This patch-set introduces the Shared Memory Driver for ST-Ericsson's Thor M7400 LTE modem. The shared memory model is implemented for Chip-to-chip and uses a reserved memory area and a number of bi-directional channels. Each channel has it's own designated data area where payload data is copied into.
Two different channel types are defined, one stream channel which is implemented as a traditional ring-buffer, and a packet channel which is a ring-buffer of fix sized buffers where each buffer contains an array of CAIF frames.
The notification of read and write index updates are handled in a separate driver called c2c_genio. This driver will be contributed separately, but the API is included in this patch-set.
The channel configuration is stored in shared memory, each channel has a designated area in shared memory for configuration data, read and write indexes and a data area.
Configuration ~~~~~~~~~~~~~~~
IPC-TOC +--------------------+ Index Area | Channel Descr 0 | -----> +------------+ | | -+ | Read Index | |--------------------| | |------------| | Channel Descr 1 | | | Write Index| | | | +------------+ |--------------------| | Data Area | ... | | +------------+ | | +---> | | +--------------------+ | | | | +------------+
A IPC-TOC (table of content) is used for holding configuration data for the channels (struct xshm_ipctoc). It contains an array of channel descriptors (struct xshm_ipctoc_channel). The channel descriptors points out the data area and the location of read and write indexes.
The configuration is provided from user-space using gen-netlink. The gen-netlink format is defined in xshm_netlink.h and and handled in xshm_boot.c
Packet data ~~~~~~~~~~~ The packet channel is set up to minimize interrupts needed to transfer a packet and to allow efficient DMA operations on the modem.
Ring Buffer Indexes: +------------+ +-| Read Index | | |------------| | | Write Index|------------------------+ | +------------+ | | | V | Buffer-0: V Buffer-1: +----------------------------------------+---------------+--- |ofs,len|ofs,len| ....| frm-0|frm-1| ... | ofs,len | ....|... +----------------------------------------+---------------+-- | | ^ ^ +---------------------+ | +---------------------+
Packet data is organized in a channel containing a number of fixed- size buffers. The channel has a read and write pointer to a buffer in a normal ring-buffer fashion.
Each buffer holds an array of CAIF-frames, and starts with an descriptor array containing pointers to the data frames in the buffer. The descriptor array contains offset and length of each frame.
The packet device (caif_xshm.c) is implemented as a network interface of type ARPHRD_CAIF.
Stream data ~~~~~~~~~~~ The driver for the stream channel is implemented as a character device interface to user space. The character device implements non-blocking open and non-blocking IO in general. The character device is implementing a traditional circular buffer directly in the shared memory region for the channel.
Driver model ~~~~~~~~~~~~~~ Current implementation is using the platform bus for XSHM devices. The packet channels are named "xshmp", and stream channel "xshms".
/sys/bus: |-- platform | |-- devices | | |-- xshmp.1 -> ../../../devices/platform/xshm/xshmp.1 | | `-- xshms.0 -> ../../../devices/platform/xshm/xshms.0 | |-- drivers | | |-- xshmp | | | |-- module -> ../../../../module/caif_xshm | | | `-- xshmp.1 -> ../../../../devices/platform/xshm/xshmp.1 | | `-- xshms | | |-- module -> ../../../../module/xshm_chr | | `-- xshms.0 -> ../../../../devices/platform/xshm/xshms.0 /sys/devices: |-- platform | |-- uevent | `-- xshm | |-- bootimg | |-- caif_ready | |-- ipc_ready | |-- subsystem -> ../../../bus/platform | |-- xshmp.1 | | |-- driver -> ../../../../bus/platform/drivers/xshmp | | |-- subsystem -> ../../../../bus/platform | `-- xshms.0 | |-- driver -> ../../../../bus/platform/drivers/xshms | |-- misc | | `-- xshm0 | | |-- device -> ../../../xshms.0 | | |-- subsystem -> ../../../../../../class/misc `-- virtual |-- net | |-- cfshm0
Review comments and feedback is welcome.
Patchset is based on todays linux-next.
Regards, Sjur Brændeland
Sjur Brændeland (9): xshm: Shared Memory layout for ST-E M7400 driver. xshm: Channel config definitions for ST-E M7400 driver. xshm: Config data use for platform devices. xshm: geni/geno driver interface. xshm: genio dummy driver xshm: Platform device for XSHM xshm: Character device for XSHM channel access. xshm: Makefile and Kconfig for M7400 Shared Memory Drivers caif-xshm: Add CAIF driver for Shared memory for M7400
drivers/Kconfig | 2 + drivers/Makefile | 1 + drivers/net/caif/Kconfig | 10 + drivers/net/caif/Makefile | 1 + drivers/net/caif/caif_xshm.c | 935 +++++++++++++++++++++++++++ drivers/xshm/Kconfig | 17 + drivers/xshm/Makefile | 3 + drivers/xshm/genio_dummy.c | 61 ++ drivers/xshm/xshm_boot.c | 1187 ++++++++++++++++++++++++++++++++++ drivers/xshm/xshm_chr.c | 1269 +++++++++++++++++++++++++++++++++++++ drivers/xshm/xshm_dev.c | 468 ++++++++++++++ include/linux/Kbuild | 1 + include/linux/c2c_genio.h | 195 ++++++ include/linux/xshm/Kbuild | 1 + include/linux/xshm/xshm_ipctoc.h | 160 +++++ include/linux/xshm/xshm_netlink.h | 95 +++ include/linux/xshm/xshm_pdev.h | 188 ++++++ 17 files changed, 4594 insertions(+), 0 deletions(-) create mode 100644 drivers/net/caif/caif_xshm.c create mode 100644 drivers/xshm/Kconfig create mode 100644 drivers/xshm/Makefile create mode 100644 drivers/xshm/genio_dummy.c create mode 100644 drivers/xshm/xshm_boot.c create mode 100644 drivers/xshm/xshm_chr.c create mode 100644 drivers/xshm/xshm_dev.c create mode 100644 include/linux/c2c_genio.h create mode 100644 include/linux/xshm/Kbuild create mode 100644 include/linux/xshm/xshm_ipctoc.h create mode 100644 include/linux/xshm/xshm_netlink.h create mode 100644 include/linux/xshm/xshm_pdev.h
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |