Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'rpmsg-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc

Pull rpmsg update from Bjorn Andersson:
"This ensures that rpmsg uses little-endian, per the VirtIO 1.0
specification"

* tag 'rpmsg-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc:
rpmsg: virtio: add endianness conversions

+34 -29
+34 -29
drivers/rpmsg/virtio_rpmsg_bus.c
··· 23 23 #include <linux/slab.h> 24 24 #include <linux/sched.h> 25 25 #include <linux/virtio.h> 26 + #include <linux/virtio_byteorder.h> 26 27 #include <linux/virtio_ids.h> 27 28 #include <linux/virtio_config.h> 28 29 #include <linux/wait.h> ··· 85 84 * Every message sent(/received) on the rpmsg bus begins with this header. 86 85 */ 87 86 struct rpmsg_hdr { 88 - u32 src; 89 - u32 dst; 90 - u32 reserved; 91 - u16 len; 92 - u16 flags; 87 + __virtio32 src; 88 + __virtio32 dst; 89 + __virtio32 reserved; 90 + __virtio16 len; 91 + __virtio16 flags; 93 92 u8 data[]; 94 93 } __packed; 95 94 ··· 107 106 */ 108 107 struct rpmsg_ns_msg { 109 108 char name[RPMSG_NAME_SIZE]; 110 - u32 addr; 111 - u32 flags; 109 + __virtio32 addr; 110 + __virtio32 flags; 112 111 } __packed; 113 112 114 113 /** ··· 336 335 struct rpmsg_ns_msg nsm; 337 336 338 337 strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE); 339 - nsm.addr = rpdev->ept->addr; 340 - nsm.flags = RPMSG_NS_CREATE; 338 + nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr); 339 + nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_CREATE); 341 340 342 341 err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR); 343 342 if (err) ··· 360 359 struct rpmsg_ns_msg nsm; 361 360 362 361 strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE); 363 - nsm.addr = rpdev->ept->addr; 364 - nsm.flags = RPMSG_NS_DESTROY; 362 + nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr); 363 + nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_DESTROY); 365 364 366 365 err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR); 367 366 if (err) ··· 613 612 } 614 613 } 615 614 616 - msg->len = len; 615 + msg->len = cpu_to_virtio16(vrp->vdev, len); 617 616 msg->flags = 0; 618 - msg->src = src; 619 - msg->dst = dst; 617 + msg->src = cpu_to_virtio32(vrp->vdev, src); 618 + msg->dst = cpu_to_virtio32(vrp->vdev, dst); 620 619 msg->reserved = 0; 621 620 memcpy(msg->data, data, len); 622 621 623 622 dev_dbg(dev, "TX From 0x%x, To 0x%x, Len %d, Flags %d, Reserved %d\n", 624 - msg->src, msg->dst, msg->len, msg->flags, msg->reserved); 623 + src, dst, len, msg->flags, msg->reserved); 625 624 #if defined(CONFIG_DYNAMIC_DEBUG) 626 625 dynamic_hex_dump("rpmsg_virtio TX: ", DUMP_PREFIX_NONE, 16, 1, 627 - msg, sizeof(*msg) + msg->len, true); 626 + msg, sizeof(*msg) + len, true); 628 627 #endif 629 628 630 629 rpmsg_sg_init(&sg, msg, sizeof(*msg) + len); ··· 705 704 { 706 705 struct rpmsg_endpoint *ept; 707 706 struct scatterlist sg; 707 + unsigned int msg_len = virtio16_to_cpu(vrp->vdev, msg->len); 708 708 int err; 709 709 710 710 dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n", 711 - msg->src, msg->dst, msg->len, msg->flags, msg->reserved); 711 + virtio32_to_cpu(vrp->vdev, msg->src), 712 + virtio32_to_cpu(vrp->vdev, msg->dst), msg_len, 713 + virtio16_to_cpu(vrp->vdev, msg->flags), 714 + virtio32_to_cpu(vrp->vdev, msg->reserved)); 712 715 #if defined(CONFIG_DYNAMIC_DEBUG) 713 716 dynamic_hex_dump("rpmsg_virtio RX: ", DUMP_PREFIX_NONE, 16, 1, 714 - msg, sizeof(*msg) + msg->len, true); 717 + msg, sizeof(*msg) + msg_len, true); 715 718 #endif 716 719 717 720 /* ··· 723 718 * the reported payload length. 724 719 */ 725 720 if (len > vrp->buf_size || 726 - msg->len > (len - sizeof(struct rpmsg_hdr))) { 727 - dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len); 721 + msg_len > (len - sizeof(struct rpmsg_hdr))) { 722 + dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg_len); 728 723 return -EINVAL; 729 724 } 730 725 731 726 /* use the dst addr to fetch the callback of the appropriate user */ 732 727 mutex_lock(&vrp->endpoints_lock); 733 728 734 - ept = idr_find(&vrp->endpoints, msg->dst); 729 + ept = idr_find(&vrp->endpoints, virtio32_to_cpu(vrp->vdev, msg->dst)); 735 730 736 731 /* let's make sure no one deallocates ept while we use it */ 737 732 if (ept) ··· 744 739 mutex_lock(&ept->cb_lock); 745 740 746 741 if (ept->cb) 747 - ept->cb(ept->rpdev, msg->data, msg->len, ept->priv, 748 - msg->src); 742 + ept->cb(ept->rpdev, msg->data, msg_len, ept->priv, 743 + virtio32_to_cpu(vrp->vdev, msg->src)); 749 744 750 745 mutex_unlock(&ept->cb_lock); 751 746 ··· 851 846 /* don't trust the remote processor for null terminating the name */ 852 847 msg->name[RPMSG_NAME_SIZE - 1] = '\0'; 853 848 854 - dev_info(dev, "%sing channel %s addr 0x%x\n", 855 - msg->flags & RPMSG_NS_DESTROY ? "destroy" : "creat", 856 - msg->name, msg->addr); 857 - 858 849 strncpy(chinfo.name, msg->name, sizeof(chinfo.name)); 859 850 chinfo.src = RPMSG_ADDR_ANY; 860 - chinfo.dst = msg->addr; 851 + chinfo.dst = virtio32_to_cpu(vrp->vdev, msg->addr); 861 852 862 - if (msg->flags & RPMSG_NS_DESTROY) { 853 + dev_info(dev, "%sing channel %s addr 0x%x\n", 854 + virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY ? 855 + "destroy" : "creat", msg->name, chinfo.dst); 856 + 857 + if (virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY) { 863 858 ret = rpmsg_unregister_device(&vrp->vdev->dev, &chinfo); 864 859 if (ret) 865 860 dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret);