On Wed, Jul 01, 2020 at 06:00:30AM -0400, Michael S. Tsirkin wrote: > On Tue, Jun 30, 2020 at 11:50:57AM -0600, Mathieu Poirier wrote: > > On Tue, Jun 16, 2020 at 09:30:11AM +0200, Guennadi Liakhovetski wrote: > > > According to the VirtIO 1.0 spec data, sent over virtual queues must > > > be in little-endian format. Update the RPMsg VirtIO implementation > > > to enforce that but let legacy configurations continue use native > > > endianness. > > > > > > Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@xxxxxxxxxxxxxxx> > > > --- > > > > > > v2: Following suggestions from Michael and Mathieu switch to using virtio16/32 > > > types and conversion functions. > > > > > > drivers/rpmsg/virtio_rpmsg_bus.c | 63 ++++++++++++++++++++++------------------ > > > 1 file changed, 35 insertions(+), 28 deletions(-) > > > > > > diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c > > > index 07d4f33..41025df 100644 > > > --- a/drivers/rpmsg/virtio_rpmsg_bus.c > > > +++ b/drivers/rpmsg/virtio_rpmsg_bus.c > > > @@ -11,6 +11,8 @@ > > > > > > #define pr_fmt(fmt) "%s: " fmt, __func__ > > > > > > +#include <asm/byteorder.h> > > > + > > > > Not sure about this header - what does it provide? It was needed for the original cpu_to_le... and friends version of the patch. > > > > > #include <linux/dma-mapping.h> > > > #include <linux/idr.h> > > > #include <linux/jiffies.h> > > > @@ -22,6 +24,7 @@ > > > #include <linux/scatterlist.h> > > > #include <linux/slab.h> > > > #include <linux/sched.h> > > > +#include <linux/types.h> > > > > This too... It should be fine with linux/virtio_config.h below since it > > already includes linux/virtio_byteorder.h > > It's probably best to include linux/virtio_byteorder.h explicitly. Yep, will do. > > Moreover, please send another revision that applies on rproc-next. The third > > hunk in this patch doesn't apply. > > > > With the above: > > > > Reviewed-by: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx> > > > > > #include <linux/virtio.h> > > > #include <linux/virtio_ids.h> > > > #include <linux/virtio_config.h> [snip] > > > @@ -846,15 +853,15 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, > > > /* don't trust the remote processor for null terminating the name */ > > > msg->name[RPMSG_NAME_SIZE - 1] = '\0'; > > > > > > - dev_info(dev, "%sing channel %s addr 0x%x\n", > > > - msg->flags & RPMSG_NS_DESTROY ? "destroy" : "creat", > > > - msg->name, msg->addr); > > > - > > > strncpy(chinfo.name, msg->name, sizeof(chinfo.name)); > > > chinfo.src = RPMSG_ADDR_ANY; > > > - chinfo.dst = msg->addr; > > > + chinfo.dst = virtio32_to_cpu(vrp->vdev, msg->addr); > > > + > > > + dev_info(dev, "%sing channel %s addr 0x%x\n", > > > Let's not try tricks. Just %s and destroying/creating below. > Wastes 3 bytes of kernel space but is clearer. Those aren't my tricks - they're already there, but sure, I can replace that while at it. Thanks Guennadi > > > > + virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY ? > > > + "destroy" : "creat", msg->name, chinfo.dst); > > > > > > - if (msg->flags & RPMSG_NS_DESTROY) { > > > + if (virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY) { > > > ret = rpmsg_unregister_device(&vrp->vdev->dev, &chinfo); > > > if (ret) > > > dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret); > > > -- > > > 1.9.3 > > > >