Messages in this thread | | | From | Sjur Brændeland <> | Subject | [RESEND PATCHv5 00/11] modem_shm: Driver for ST-E Thor M7400 LTE modem | Date | Tue, 31 Jan 2012 09:48:35 +0100 |
| |
This patch-set implements a shared memory interface for ST-Ericsson modem M7400. Review comments and feedback are welcome.
Patches are available at: git://github.com/sjurbren/modem-ipc.git for-next.
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 shm_ipctoc). It contains an array of channel descriptors (struct shm_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 modem_shm_netlink.h and and handled in shm_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_shm.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 ~~~~~~~~~~~~~~ A SHM bus is implemented, the example below shows one device of each type (stream and packet):
/sys/bus/modem_shm |-- devices | |-- shm0 -> ../../../devices/modem_shm/shm0 | `-- shm1 -> ../../../devices/modem_shm/shm1 |-- drivers | |-- caif_shm | | |-- bind | | |-- module -> ../../../../module/caif_shm | | |-- uevent | | |-- unbind | | `-- shm1 -> ../../../../devices/shm/shm1 | `-- shm_chr | |-- bind | |-- module -> ../../../../module/shm_chr | |-- uevent | |-- unbind | `-- shm0 -> ../../../../devices/shm/shm0 |-- drivers_autoprobe |-- drivers_probe `-- uevent
/sys/devices/modem_shm/ |-- bootimg |-- caif_ready |-- ipc_ready |-- uevent |-- shm0 | |-- driver -> ../../../bus/shm/drivers/modem_shm_chr | |-- misc | | `-- shm0 | | |-- dev | | |-- device -> ../../../shm0 | | |-- subsystem -> ../../../../../class/misc | | `-- uevent | |-- subsystem -> ../../../bus/shm | `-- uevent `-- shm1 |-- driver -> ../../../bus/shm/drivers/caif_shm |-- subsystem -> ../../../bus/shm `-- uevent
Sjur Brændeland (11): modem_shm: Shared Memory layout for ST-E M7400 driver. modem_shm: Channel config definitions for ST-E M7400 driver. modem_shm: Configuration for SHM Channel an devices. modem_shm: geni/geno driver interface. modem_shm: genio dummy driver modem_shm: Add SHM device bus. modem_shm: Add shm device implementation modem_shm: SHM Configuration data handling modem_shm: Character device for SHM channel access. modem_shm: Makefile and Kconfig for M7400 Shared Memory Drivers caif_shm: Add CAIF driver for Shared memory for M7400
drivers/Kconfig | 2 + drivers/Makefile | 1 + drivers/modem_shm/Kconfig | 62 ++ drivers/modem_shm/Makefile | 5 + drivers/modem_shm/dummy_c2c_genio.c | 76 ++ drivers/modem_shm/shm_boot.c | 1208 ++++++++++++++++++++++++++ drivers/modem_shm/shm_bus.c | 113 +++ drivers/modem_shm/shm_chr.c | 1242 +++++++++++++++++++++++++++ drivers/modem_shm/shm_dev.c | 527 ++++++++++++ drivers/modem_shm/shm_ipctoc.h | 154 ++++ drivers/net/caif/Kconfig | 12 +- drivers/net/caif/Makefile | 3 +- drivers/net/caif/caif_shm.c | 900 +++++++++++++++++++ include/linux/Kbuild | 1 + include/linux/c2c_genio.h | 195 +++++ include/linux/modem_shm/Kbuild | 1 + include/linux/modem_shm/modem_shm_netlink.h | 95 ++ include/linux/modem_shm/shm_dev.h | 245 ++++++ 18 files changed, 4840 insertions(+), 2 deletions(-) create mode 100644 drivers/modem_shm/Kconfig create mode 100644 drivers/modem_shm/Makefile create mode 100644 drivers/modem_shm/dummy_c2c_genio.c create mode 100644 drivers/modem_shm/shm_boot.c create mode 100644 drivers/modem_shm/shm_bus.c create mode 100644 drivers/modem_shm/shm_chr.c create mode 100644 drivers/modem_shm/shm_dev.c create mode 100644 drivers/modem_shm/shm_ipctoc.h create mode 100644 drivers/net/caif/caif_shm.c create mode 100644 include/linux/c2c_genio.h create mode 100644 include/linux/modem_shm/Kbuild create mode 100644 include/linux/modem_shm/modem_shm_netlink.h create mode 100644 include/linux/modem_shm/shm_dev.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/
| |