This series restructures the RPMsg char driver to decorrelate the control part and to create a generic RPMsg ioctl interface compatible with other RPMsg services. The V4 and V5 fix compilation issues reported by the kernel test robot <lkp@xxxxxxxxx> and analyzed by Dan Carpenter <dan.carpenter@xxxxxxxxxx>. The V3 is based on the guideline proposed by Mathieu Poirier to keep as much as possible the legacy implementation of the rpmsg_char used by the GLINK and SMD platforms. Objectives of the series: - Allow to create a service from Linux user application: - with a specific name - with or without name service announcement. - Allow to probe the same service by receiving either a NS announcement from the remote firmware or a Linux user application request. - Use these services independently of the RPMsg transport implementation (e.g be able to use RPMSg char with the RPMsg virtio bus). Steps in the series: - Extract the control part of the char dev and create the rpmsg_ctrl.c file (patches 1 to 6) - Enable the use of the chardev with the virtio backend (patches 7 to 11) - Introduce the RPMSG_CREATE_DEV_IOCTL IOCTL to instantiate RPMsg devices (patch 12) The application can then create or release a channel by specifying: - the name service of the device to instantiate. - the source address. - the destination address. - Instantiate the /dev/rpmsg interface on remote NS announcement (patches 13 to 16) In this revision, I do not divide the series into several parts in order to show a complete picture of the proposed evolution. To simplify the review, if requested, I can send it in several steps listed above. Known current Limitations: - Tested only with virtio RPMsg bus. The glink and smd drivers adaptations have not been tested (not able to test it). - For the virtio backend: No NS announcement is sent to the remote processor if the source address is set to RPMSG_ADDR_ANY. - For the virtio backend: the existing RPMSG_CREATE_EPT_IOCTL is working but the endpoints are not attached to an exiting channel. - to limit patches the pending RPMSG_DESTROY_DEV_IOCTL has not ben implemented. This will be proposed in a second step. This series can be applied on git/andersson/remoteproc.git for-next branch (d9ff3a5789cb). This series can be tested using rpmsgexport, rpmsgcreatedev and ping tools available here: https://github.com/arnopo/rpmsgexport.git Reference to the V4 discussion thread: https://lkml.org/lkml/2021/2/17/384 Arnaud Pouliquen (16): rpmsg: char: rename rpmsg_char_init to rpmsg_chrdev_init rpmsg: move RPMSG_ADDR_ANY in user API rpmsg: add short description of the IOCTL defined in UAPI. rpmsg: char: export eptdev create an destroy functions rpmsg: char: dissociate the control device from the rpmsg class rpmsg: move the rpmsg control device from rpmsg_char to rpmsg_ctrl rpmsg: update rpmsg_chrdev_register_device function rpmsg: glink: add sendto and trysendto ops rpmsg: smd: add sendto and trysendto ops rpmsg: char: use sendto to specify the message destination address rpmsg: virtio: register the rpmsg_ctrl device rpmsg: ctrl: introduce RPMSG_CREATE_DEV_IOCTL rpmsg: char: introduce __rpmsg_chrdev_create_eptdev function rpmsg: char: introduce a RPMsg driver for the RPMsg char device rpmsg: char: no dynamic endpoint management for the default one rpmsg: char: return an error if device already open drivers/rpmsg/Kconfig | 9 ++ drivers/rpmsg/Makefile | 1 + drivers/rpmsg/qcom_glink_native.c | 18 ++- drivers/rpmsg/qcom_smd.c | 18 ++- drivers/rpmsg/rpmsg_char.c | 237 +++++++++++------------------- drivers/rpmsg/rpmsg_char.h | 51 +++++++ drivers/rpmsg/rpmsg_ctrl.c | 229 +++++++++++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 10 +- drivers/rpmsg/virtio_rpmsg_bus.c | 57 ++++++- include/linux/rpmsg.h | 3 +- include/uapi/linux/rpmsg.h | 18 ++- 11 files changed, 485 insertions(+), 166 deletions(-) create mode 100644 drivers/rpmsg/rpmsg_char.h create mode 100644 drivers/rpmsg/rpmsg_ctrl.c -- 2.17.1