On 9/3/2024 10:52 AM, Doug Miller wrote:
I am trying to learn how to create an RPMSG-over-VIRTIO device (service) in order to perform communication between a host driver and a guest driver. The RPMSG-over-VIRTIO driver (client) side is fairly well documented and there is a good example (starting point, at least) in samples/rpmsg/rpmsg_client_sample.c. I see that I can create an endpoint (struct rpmsg_endpoint) using rpmsg_create_ept(), and from there I can use rpmsg_send() et al. and the rpmsg_rx_cb_t cb to perform the communications. However, this requires a struct rpmsg_device and it is not clear just how to get one that is suitable for this purpose. It appears that one or both of rpmsg_create_channel() and rpmsg_register_device() are needed in order to obtain a device for the specific host-guest communications channel. At some point, a "root" device is needed that will use virtio (VIRTIO_ID_RPMSG) such that new subdevices can be created for each host-guest pair. In addition, building a kernel with CONFIG_RPMSG, CONFIG_RPMSG_VIRTIO, and CONFIG_RPMSG_NS set, and doing a modprobe virtio_rpmsg_bus, seems to get things setup but that does not result in creation of any "root" rpmsg-over-virtio device. Presumably, any such device would have to be setup to use a specific range of addresses and also be tied to virtio_rpmsg_bus to ensure that virtio is used. It is also not clear if/how register_rpmsg_driver() will be required on the rpmsg driver side, even though the sample code does not use it. So, first questions are: * Am I looking at the correct interfaces in order to create the host rpmsg device side? * What needs to be done to get a "root" rpmsg-over-virtio device created (if required)? * How is a rpmsg-over-virtio device created for each host-guest driver pair, for use with rpmsg_create_ept()? * Does the guest side (rpmsg driver) require any special handling to plug-in to the host driver (rpmsg device) side? Aside from using the correct addresses to match device side.
It looks to me as though the virtio_rpmsg_bus module can create a "rpmsg_ctl" device, which could be used to create channels from which endpoints could be created. However, when I load the virtio_rpmsg_bus, rpmsg_ns, and rpmsg_core modules there is no "rpmsg_ctl" device created (this is running in the host OS, before any VMs are created/run). Is this the correct way to use RPMSG-over-VIRTIO? If so, what actions need to be taken to cause a "rpmsg_ctl" device to be created? What method would be used (in a kernel driver) to get a pointer to the "rpmsg_ctl" device, for use with rpmsg_create_channel()?
Thanks, Doug
External recipient