From patchwork Tue Oct 27 17:52:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861249 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2C48C92C for ; Tue, 27 Oct 2020 17:53:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EFBAE21556 for ; Tue, 27 Oct 2020 17:53:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="AW7Crox0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822754AbgJ0RwX (ORCPT ); Tue, 27 Oct 2020 13:52:23 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:39914 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822748AbgJ0RwW (ORCPT ); Tue, 27 Oct 2020 13:52:22 -0400 Received: by mail-pf1-f193.google.com with SMTP id e15so1350241pfh.6 for ; Tue, 27 Oct 2020 10:52:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SgrFXXp1ypl5lAcA/DQtZ24kT3qaVTmDEKfWi4abAIA=; b=AW7Crox0kG9gPbSGrrteohBkDI630oUZkkV0WHn/78DKblezxhId+uWuLZxmREiowl M0G1YFJMVBKIeo6DjVt1etuo5Dndjg0kKl/4HAko6c+JKWuMuoDAl3iIGXZf46NyAxLZ YUfuhDhbqeD/+b4rfc24Eh9X9R8FnsQGwLSy0DKH7zbBJrki+JNlbPC6EPmcEsmRyjzB lqKtCSSt/TxR51eqL4dPEIvc4GRfHT1qHLFBef7vcPRJ5aNb/aDluVu3n0gyLkdmgp4q cKTfQ/0aeaIH6ILI9y/BUnZzfNv/o2T1yzLY5yzqbZ2ifDmKGr/HmC7eakK9ShoJSlJD U5GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SgrFXXp1ypl5lAcA/DQtZ24kT3qaVTmDEKfWi4abAIA=; b=HH6cPf9ykWfQPVEdmhny1HMMgfRK7CGGYJdEnX/P36OpUJIjawlrAqoh1irhrq2RlO X8UECyDhLyMDSH3CCQH/c9hAsmoB2YeYaJ+StuU5dAlvIVemd13rdzxNY9JPoFrKi8LZ APbvcbSNB/gnhfConYxaXR+PU+YHlK2adWz43PxfUStdW1T7LC+glelowKKHB/jGCTuc rrlJe5lzVvPFBO1Zj/nbI4nxZkyBDID9rJPKozQRVA74TTEoTYgsMw7Aoa9RAWCvQrb4 WutrXhDXt/Z1KGP2rOlDAZF/CAKo3Kafh4DA1+qsGxQg/nmjift0TTX1jbxko2EiaRTW S7rg== X-Gm-Message-State: AOAM533gyXXwiHdRQXDrVZ0X5My9Hoo4dEydGq3thJ7Arx8rJ5f3Dg2N tz4vdiT6fbD0ajB+W2/WPAIlVA== X-Google-Smtp-Source: ABdhPJyWIwOvROq1w0ceEg+4BPHG1ARNVOvGliGxaD8bO7WhV7UPxYIl5LswwXLowP6NGbq9djjhVQ== X-Received: by 2002:a63:7e4f:: with SMTP id o15mr2917912pgn.428.1603821141680; Tue, 27 Oct 2020 10:52:21 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:21 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 1/8] rpmsg: Introduce __rpmsg{16|32|64} types Date: Tue, 27 Oct 2020 11:52:11 -0600 Message-Id: <20201027175218.1033609-2-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Introduce __rpmsg{16|32|64} types along with byte order conversion functions based on an rpmsg_device operation as a foundation to make RPMSG modular and transport agnostic. Suggested-by: Guennadi Liakhovetski Signed-off-by: Mathieu Poirier Reviewed-by: Arnaud Pouliquen --- include/linux/rpmsg.h | 51 ++++++++++++++++++++++++ include/linux/rpmsg_byteorder.h | 67 ++++++++++++++++++++++++++++++++ include/uapi/linux/rpmsg_types.h | 11 ++++++ 3 files changed, 129 insertions(+) create mode 100644 include/linux/rpmsg_byteorder.h create mode 100644 include/uapi/linux/rpmsg_types.h diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h index 9fe156d1c018..97098a90c496 100644 --- a/include/linux/rpmsg.h +++ b/include/linux/rpmsg.h @@ -17,6 +17,7 @@ #include #include #include +#include #define RPMSG_ADDR_ANY 0xFFFFFFFF @@ -46,6 +47,7 @@ struct rpmsg_channel_info { * @dst: destination address * @ept: the rpmsg endpoint of this channel * @announce: if set, rpmsg will announce the creation/removal of this channel + * @little_endian: True if transport is using little endian byte representation */ struct rpmsg_device { struct device dev; @@ -55,6 +57,7 @@ struct rpmsg_device { u32 dst; struct rpmsg_endpoint *ept; bool announce; + bool little_endian; const struct rpmsg_device_ops *ops; }; @@ -111,6 +114,54 @@ struct rpmsg_driver { int (*callback)(struct rpmsg_device *, void *, int, void *, u32); }; +static inline u16 rpmsg16_to_cpu(struct rpmsg_device *rpdev, __rpmsg16 val) +{ + if (!rpdev) + return __rpmsg16_to_cpu(rpmsg_is_little_endian(), val); + else + return __rpmsg16_to_cpu(rpdev->little_endian, val); +} + +static inline __rpmsg16 cpu_to_rpmsg16(struct rpmsg_device *rpdev, u16 val) +{ + if (!rpdev) + return __cpu_to_rpmsg16(rpmsg_is_little_endian(), val); + else + return __cpu_to_rpmsg16(rpdev->little_endian, val); +} + +static inline u32 rpmsg32_to_cpu(struct rpmsg_device *rpdev, __rpmsg32 val) +{ + if (!rpdev) + return __rpmsg32_to_cpu(rpmsg_is_little_endian(), val); + else + return __rpmsg32_to_cpu(rpdev->little_endian, val); +} + +static inline __rpmsg32 cpu_to_rpmsg32(struct rpmsg_device *rpdev, u32 val) +{ + if (!rpdev) + return __cpu_to_rpmsg32(rpmsg_is_little_endian(), val); + else + return __cpu_to_rpmsg32(rpdev->little_endian, val); +} + +static inline u64 rpmsg64_to_cpu(struct rpmsg_device *rpdev, __rpmsg64 val) +{ + if (!rpdev) + return __rpmsg64_to_cpu(rpmsg_is_little_endian(), val); + else + return __rpmsg64_to_cpu(rpdev->little_endian, val); +} + +static inline __rpmsg64 cpu_to_rpmsg64(struct rpmsg_device *rpdev, u64 val) +{ + if (!rpdev) + return __cpu_to_rpmsg64(rpmsg_is_little_endian(), val); + else + return __cpu_to_rpmsg64(rpdev->little_endian, val); +} + #if IS_ENABLED(CONFIG_RPMSG) int register_rpmsg_device(struct rpmsg_device *dev); diff --git a/include/linux/rpmsg_byteorder.h b/include/linux/rpmsg_byteorder.h new file mode 100644 index 000000000000..c0f565dbad6d --- /dev/null +++ b/include/linux/rpmsg_byteorder.h @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Follows implementation found in linux/virtio_byteorder.h + */ +#ifndef _LINUX_RPMSG_BYTEORDER_H +#define _LINUX_RPMSG_BYTEORDER_H +#include +#include + +static inline bool rpmsg_is_little_endian(void) +{ +#ifdef __LITTLE_ENDIAN + return true; +#else + return false; +#endif +} + +static inline u16 __rpmsg16_to_cpu(bool little_endian, __rpmsg16 val) +{ + if (little_endian) + return le16_to_cpu((__force __le16)val); + else + return be16_to_cpu((__force __be16)val); +} + +static inline __rpmsg16 __cpu_to_rpmsg16(bool little_endian, u16 val) +{ + if (little_endian) + return (__force __rpmsg16)cpu_to_le16(val); + else + return (__force __rpmsg16)cpu_to_be16(val); +} + +static inline u32 __rpmsg32_to_cpu(bool little_endian, __rpmsg32 val) +{ + if (little_endian) + return le32_to_cpu((__force __le32)val); + else + return be32_to_cpu((__force __be32)val); +} + +static inline __rpmsg32 __cpu_to_rpmsg32(bool little_endian, u32 val) +{ + if (little_endian) + return (__force __rpmsg32)cpu_to_le32(val); + else + return (__force __rpmsg32)cpu_to_be32(val); +} + +static inline u64 __rpmsg64_to_cpu(bool little_endian, __rpmsg64 val) +{ + if (little_endian) + return le64_to_cpu((__force __le64)val); + else + return be64_to_cpu((__force __be64)val); +} + +static inline __rpmsg64 __cpu_to_rpmsg64(bool little_endian, u64 val) +{ + if (little_endian) + return (__force __rpmsg64)cpu_to_le64(val); + else + return (__force __rpmsg64)cpu_to_be64(val); +} + +#endif /* _LINUX_RPMSG_BYTEORDER_H */ diff --git a/include/uapi/linux/rpmsg_types.h b/include/uapi/linux/rpmsg_types.h new file mode 100644 index 000000000000..36e3b9404391 --- /dev/null +++ b/include/uapi/linux/rpmsg_types.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_RPMSG_TYPES_H +#define _UAPI_LINUX_RPMSG_TYPES_H + +#include + +typedef __u16 __bitwise __rpmsg16; +typedef __u32 __bitwise __rpmsg32; +typedef __u64 __bitwise __rpmsg64; + +#endif /* _UAPI_LINUX_RPMSG_TYPES_H */ From patchwork Tue Oct 27 17:52:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861243 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 18A5C6A2 for ; Tue, 27 Oct 2020 17:52:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E44AF2054F for ; Tue, 27 Oct 2020 17:52:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="kKu79bsj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822776AbgJ0Rw2 (ORCPT ); Tue, 27 Oct 2020 13:52:28 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:43066 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822760AbgJ0RwZ (ORCPT ); Tue, 27 Oct 2020 13:52:25 -0400 Received: by mail-pf1-f194.google.com with SMTP id a200so1341451pfa.10 for ; Tue, 27 Oct 2020 10:52:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Maoz4TjyFhNxFrO34KGhBMWS2T9NxVUKPLWcAUcS3mQ=; b=kKu79bsjxYaOLAr7SR+v+qNoc7VuY2iNmCpklJkVfQQBxu1hRhyieLWdbFHQjY6QXw xBm5aNoHmpyyld1gF1ImqtvDLQLHmQ5F3r1yiU7YiuuS0hzfuyDDut7931DZ4HhkaOeV QzY1SzDrps+vXiBZzh2r3dpuaHGEVZUv7yINAEoromNsbC3CZQjSu9GRApEXIdTiwQ7t csRbEIXA5n3uTUCe8CEqTxgLYLSE6gJFCpltKhjBO5s/uSKBniqXjWZoWNw4Qsivd2E/ FBJHpLEhxm8a1l9wDgxnJGK6U7s4AQU1r2WxsFyFJtPnJ1VrY93JxMc1p0kq4Me32Abs AoNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Maoz4TjyFhNxFrO34KGhBMWS2T9NxVUKPLWcAUcS3mQ=; b=VQvViQiWCoIW9jTv3WIH3FUJ/k7nCQv99O8ZFkiZdgoFHacMcgUztG6E6XMkXfmYLX nDnz3MI49rfzYJfBiSQkWxPbEz1Q30O/aUk8Sf+wXCq0E8jWFJPwqRrUaDqMwyiWsQM3 v9M7sfjZHBkgVEMpM/4oe2wCa4yRxaYJUmdtdN3CRav7Jz8fd0sGItM5gjZ8WnoN05lC x+K205xJEp1dnCHC0DwcZ5TPvbxpA+BmJyL/vPZrNdVMJvorTcK5GtqsdF7cGXCHaOgL nHs34zW5Sn+DbHIS41CGS4YOpvR1I5zyz0dpHo3C3p8x1O7jcwkinZgT7id3TVoZAvdi 6M0w== X-Gm-Message-State: AOAM530pbX/O3o5tKPyprviMHfidGm9Jt71Oj/zJ26Nl8WBRuKTk5wNZ 1Uw03mmNqfgEo9Dtll+o+yKMxg== X-Google-Smtp-Source: ABdhPJyhKrPQtYJs9yxYUzeiRTV2JXsT4gZbuNR96qDh6AOMnwKQOwQtKkkIKoYRpH6O4oaHHz3J0A== X-Received: by 2002:aa7:91c8:0:b029:155:c7c1:3fae with SMTP id z8-20020aa791c80000b0290155c7c13faemr3354461pfa.74.1603821143333; Tue, 27 Oct 2020 10:52:23 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:22 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 2/8] rpmsg: virtio: Move from virtio to rpmsg byte conversion Date: Tue, 27 Oct 2020 11:52:12 -0600 Message-Id: <20201027175218.1033609-3-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Use rpmsg byte conversion functions in order for the RPMSG headers and generic functions to be used by external entities. Signed-off-by: Mathieu Poirier Reviewed-by: Arnaud Pouliquen --- drivers/rpmsg/virtio_rpmsg_bus.c | 53 +++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index 7d7ed4e5cce7..22f57d14904e 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -19,11 +19,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include @@ -85,11 +85,11 @@ struct virtproc_info { * Every message sent(/received) on the rpmsg bus begins with this header. */ struct rpmsg_hdr { - __virtio32 src; - __virtio32 dst; - __virtio32 reserved; - __virtio16 len; - __virtio16 flags; + __rpmsg32 src; + __rpmsg32 dst; + __rpmsg32 reserved; + __rpmsg16 len; + __rpmsg16 flags; u8 data[]; } __packed; @@ -107,8 +107,8 @@ struct rpmsg_hdr { */ struct rpmsg_ns_msg { char name[RPMSG_NAME_SIZE]; - __virtio32 addr; - __virtio32 flags; + __rpmsg32 addr; + __rpmsg32 flags; } __packed; /** @@ -341,8 +341,8 @@ static int virtio_rpmsg_announce_create(struct rpmsg_device *rpdev) struct rpmsg_ns_msg nsm; strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE); - nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr); - nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_CREATE); + nsm.addr = cpu_to_rpmsg32(rpdev, rpdev->ept->addr); + nsm.flags = cpu_to_rpmsg32(rpdev, RPMSG_NS_CREATE); err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR); if (err) @@ -365,8 +365,8 @@ static int virtio_rpmsg_announce_destroy(struct rpmsg_device *rpdev) struct rpmsg_ns_msg nsm; strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE); - nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr); - nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_DESTROY); + nsm.addr = cpu_to_rpmsg32(rpdev, rpdev->ept->addr); + nsm.flags = cpu_to_rpmsg32(rpdev, RPMSG_NS_DESTROY); err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR); if (err) @@ -425,6 +425,7 @@ static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp, rpdev->src = chinfo->src; rpdev->dst = chinfo->dst; rpdev->ops = &virtio_rpmsg_ops; + rpdev->little_endian = virtio_is_little_endian(vrp->vdev); /* * rpmsg server channels has predefined local address (for now), @@ -618,10 +619,10 @@ static int rpmsg_send_offchannel_raw(struct rpmsg_device *rpdev, } } - msg->len = cpu_to_virtio16(vrp->vdev, len); + msg->len = cpu_to_rpmsg16(rpdev, len); msg->flags = 0; - msg->src = cpu_to_virtio32(vrp->vdev, src); - msg->dst = cpu_to_virtio32(vrp->vdev, dst); + msg->src = cpu_to_rpmsg32(rpdev, src); + msg->dst = cpu_to_rpmsg32(rpdev, dst); msg->reserved = 0; memcpy(msg->data, data, len); @@ -710,14 +711,15 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, { struct rpmsg_endpoint *ept; struct scatterlist sg; - unsigned int msg_len = virtio16_to_cpu(vrp->vdev, msg->len); + bool little_endian = virtio_is_little_endian(vrp->vdev); + unsigned int msg_len = __rpmsg16_to_cpu(little_endian, msg->len); int err; dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n", - virtio32_to_cpu(vrp->vdev, msg->src), - virtio32_to_cpu(vrp->vdev, msg->dst), msg_len, - virtio16_to_cpu(vrp->vdev, msg->flags), - virtio32_to_cpu(vrp->vdev, msg->reserved)); + __rpmsg32_to_cpu(little_endian, msg->src), + __rpmsg32_to_cpu(little_endian, msg->dst), msg_len, + __rpmsg16_to_cpu(little_endian, msg->flags), + __rpmsg32_to_cpu(little_endian, msg->reserved)); #if defined(CONFIG_DYNAMIC_DEBUG) dynamic_hex_dump("rpmsg_virtio RX: ", DUMP_PREFIX_NONE, 16, 1, msg, sizeof(*msg) + msg_len, true); @@ -736,7 +738,7 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, /* use the dst addr to fetch the callback of the appropriate user */ mutex_lock(&vrp->endpoints_lock); - ept = idr_find(&vrp->endpoints, virtio32_to_cpu(vrp->vdev, msg->dst)); + ept = idr_find(&vrp->endpoints, __rpmsg32_to_cpu(little_endian, msg->dst)); /* let's make sure no one deallocates ept while we use it */ if (ept) @@ -750,7 +752,7 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, if (ept->cb) ept->cb(ept->rpdev, msg->data, msg_len, ept->priv, - virtio32_to_cpu(vrp->vdev, msg->src)); + __rpmsg32_to_cpu(little_endian, msg->src)); mutex_unlock(&ept->cb_lock); @@ -830,6 +832,7 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, struct rpmsg_channel_info chinfo; struct virtproc_info *vrp = priv; struct device *dev = &vrp->vdev->dev; + bool little_endian = virtio_is_little_endian(vrp->vdev); int ret; #if defined(CONFIG_DYNAMIC_DEBUG) @@ -858,13 +861,13 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, strncpy(chinfo.name, msg->name, sizeof(chinfo.name)); chinfo.src = RPMSG_ADDR_ANY; - chinfo.dst = virtio32_to_cpu(vrp->vdev, msg->addr); + chinfo.dst = __rpmsg32_to_cpu(little_endian, msg->addr); dev_info(dev, "%sing channel %s addr 0x%x\n", - virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY ? + __rpmsg32_to_cpu(little_endian, msg->flags) & RPMSG_NS_DESTROY ? "destroy" : "creat", msg->name, chinfo.dst); - if (virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY) { + if (__rpmsg32_to_cpu(little_endian, 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); From patchwork Tue Oct 27 17:52:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861235 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9A04E6A2 for ; Tue, 27 Oct 2020 17:52:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6C214206E3 for ; Tue, 27 Oct 2020 17:52:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="HOi7o3j/" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822779AbgJ0Rw2 (ORCPT ); Tue, 27 Oct 2020 13:52:28 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:36410 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822758AbgJ0RwZ (ORCPT ); Tue, 27 Oct 2020 13:52:25 -0400 Received: by mail-pf1-f195.google.com with SMTP id w65so1357620pfd.3 for ; Tue, 27 Oct 2020 10:52:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2RF5KZ6D5NXkOtLEZgeVFNMVDzLukO3tGuEfFyz0uKo=; b=HOi7o3j/C5yMctib6W5NjKoEIEHQSOgFn6MZA0Qr0BRTPw2jPplGwqLm4/wNfrp2ty Y5zslQdOnat1NrFopGTcLkKDqVt3gFC3Tvb3kxjMTn9LgBsVphN9t/IciJHYsw95L/ML kyIsgcHDFWy2gZMcUuOoznfRXcuVmX5iXnSxjrn0HDJd0VgcI0LjMg4I0PCx+JWrB0Yo HSd61RdaGYwsrgFXNhCm+oJ9XZjdjhYhj6PqByTj1zV5cwhPhguSbNfdoXOMd4LF7wRK l6UOY/knmXygH7lIxqGWgX/pGI11DCDckVQ2PNTPysFDx5iOlfFkzqn6Z7PsoWrZlF6j O9PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2RF5KZ6D5NXkOtLEZgeVFNMVDzLukO3tGuEfFyz0uKo=; b=NYy808H6QoeDnW7iEVFEWgXX/HbKzeLIU+CCRjVDVE1en5TvFvKQ+EjA6QM5/Q5/2G CVkeMBqTmgw1WUWqxGh0Fb6pCVawUcWQQYdwo9l98cnQGMN5pO2UEGGxigW3P8oJaOwc q4lkMPogs0+kb3JrEW8t7oEvQeUwBxO+GaNLbW4shbZKylH3+Z0D2sT7T54wqCXWn1zw fiLxY2BX3hv4SKl5IAeayQsDF45SF9mqDVBoAk3YtcvMqd8yOml1rh63EGLT1GXhlLeZ ZQT02dDqnTZP5cwQHIZyIX1qdN+6gIJuiqMQbzZoo2dAKZinSt+6pD81h/GkTvfaSxT5 pgGQ== X-Gm-Message-State: AOAM532s74mpzq9HY5SuRQ+CPzAXC4w1pxKt019ICEbpJ7G81/HhPuKx hpXIOQyF+mJwATU/CiEl42H2Ig== X-Google-Smtp-Source: ABdhPJyYSFWZwj1Yw1uKdoddHFWr3ALsUQGasix6mHU4+fPWFFZmZH6XGxcewwhE206/uqhuJJUBzA== X-Received: by 2002:a63:af4c:: with SMTP id s12mr2801714pgo.395.1603821144507; Tue, 27 Oct 2020 10:52:24 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:23 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 3/8] rpmsg: Move structure rpmsg_ns_msg to header file Date: Tue, 27 Oct 2020 11:52:13 -0600 Message-Id: <20201027175218.1033609-4-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Move structure rpmsg_ns_msg to its own header file so that it can be used by other entities. Signed-off-by: Mathieu Poirier Reviewed-by: Arnaud Pouliquen --- drivers/rpmsg/virtio_rpmsg_bus.c | 32 +----------------------- include/linux/rpmsg_ns.h | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 include/linux/rpmsg_ns.h diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index 22f57d14904e..064a5ddcf7c0 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -93,34 +94,6 @@ struct rpmsg_hdr { u8 data[]; } __packed; -/** - * struct rpmsg_ns_msg - dynamic name service announcement message - * @name: name of remote service that is published - * @addr: address of remote service that is published - * @flags: indicates whether service is created or destroyed - * - * This message is sent across to publish a new service, or announce - * about its removal. When we receive these messages, an appropriate - * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe() - * or ->remove() handler of the appropriate rpmsg driver will be invoked - * (if/as-soon-as one is registered). - */ -struct rpmsg_ns_msg { - char name[RPMSG_NAME_SIZE]; - __rpmsg32 addr; - __rpmsg32 flags; -} __packed; - -/** - * enum rpmsg_ns_flags - dynamic name service announcement flags - * - * @RPMSG_NS_CREATE: a new remote service was just created - * @RPMSG_NS_DESTROY: a known remote service was just destroyed - */ -enum rpmsg_ns_flags { - RPMSG_NS_CREATE = 0, - RPMSG_NS_DESTROY = 1, -}; /** * struct virtio_rpmsg_channel - rpmsg channel descriptor @@ -167,9 +140,6 @@ struct virtio_rpmsg_channel { */ #define RPMSG_RESERVED_ADDRESSES (1024) -/* Address 53 is reserved for advertising remote services */ -#define RPMSG_NS_ADDR (53) - static void virtio_rpmsg_destroy_ept(struct rpmsg_endpoint *ept); static int virtio_rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len); static int virtio_rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, diff --git a/include/linux/rpmsg_ns.h b/include/linux/rpmsg_ns.h new file mode 100644 index 000000000000..bb479f430080 --- /dev/null +++ b/include/linux/rpmsg_ns.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _LINUX_RPMSG_NS_H +#define _LINUX_RPMSG_NS_H + +#include +#include +#include + +/** + * struct rpmsg_ns_msg - dynamic name service announcement message + * @name: name of remote service that is published + * @addr: address of remote service that is published + * @flags: indicates whether service is created or destroyed + * + * This message is sent across to publish a new service, or announce + * about its removal. When we receive these messages, an appropriate + * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe() + * or ->remove() handler of the appropriate rpmsg driver will be invoked + * (if/as-soon-as one is registered). + */ +struct rpmsg_ns_msg { + char name[RPMSG_NAME_SIZE]; + __rpmsg32 addr; + __rpmsg32 flags; +} __packed; + +/** + * enum rpmsg_ns_flags - dynamic name service announcement flags + * + * @RPMSG_NS_CREATE: a new remote service was just created + * @RPMSG_NS_DESTROY: a known remote service was just destroyed + */ +enum rpmsg_ns_flags { + RPMSG_NS_CREATE = 0, + RPMSG_NS_DESTROY = 1, +}; + +/* Address 53 is reserved for advertising remote services */ +#define RPMSG_NS_ADDR (53) + +#endif From patchwork Tue Oct 27 17:52:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861245 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CC2206A2 for ; Tue, 27 Oct 2020 17:52:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A43B12054F for ; Tue, 27 Oct 2020 17:52:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="AhB9yxjE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822816AbgJ0Rwt (ORCPT ); Tue, 27 Oct 2020 13:52:49 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:36171 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822770AbgJ0Rw1 (ORCPT ); Tue, 27 Oct 2020 13:52:27 -0400 Received: by mail-pg1-f196.google.com with SMTP id z24so1227882pgk.3 for ; Tue, 27 Oct 2020 10:52:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hxjbKzwWoRD40O1+8yIOYppCPE1O5hDOkWo3lEMuP9E=; b=AhB9yxjE+oTFnHBvWkXQ1VwSvJONRbmdfYDgefWFNWvk5Wis3UPohWet2v/uqNw/KE Uxzw4t88R0JCVK3rRe8HgNZDX7GmJKMw1/rsjRD9qM2jlO35dJ6eDcICWe7jMmnz9BpW BKJt+x9zcJqhH8RZa3fDDS3TiWLMRddJXCmRKcOehLTIkg7AP4LOrOzkRaIzB4m5IVnq b3nlR9aBTRvn+MkDx18PpA5YMSsTFlQIGNz2V8sKRmAx5IlbZ7CJDh9iUh3/mB2uMZ4b WMK5QiTSfhK3/I20E04e/Qa6w/CvquSrWQt2/wJlOaEICRzbRvopsG2pZYn2bOTYcGfF uwsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hxjbKzwWoRD40O1+8yIOYppCPE1O5hDOkWo3lEMuP9E=; b=ktfuQuUDsThv85FYjaRtbVrceEfDxPMv2/SgFK0ic/W5TU3KpWCGNrhVNPArJKHxIx /aS+pCZ7/qy0xGo/H4Wb7eZ00QZrX6NdZOqinDY6wctMHb8StLklDO04aB+OPh96pwKa 0o8dXzSV749gfiKkVsYjaYKmMhWIVGnn3fMfYyeNPZDwLojy1/9jlMCbbV7lPoZ4gXog ZnObydV6vX/p8hMJLaHZ3NEkjPPJBPVtJA6+adboAiCVX2Yui3rbCAepf+7RS1HMkLbv 3RkeENMhrgqmr3SidiLh/FXom9y3VX2xYM9VTqDP7mnagB4qBSxD47+iGHeNUl/N8C24 yjYQ== X-Gm-Message-State: AOAM532DcPHiie5zhKyz5yCiaWnk7oDnSLYxHvY69Xmpvxjit1XPBMfT C9tgajX0wVbzjMFIclysHm7AXg== X-Google-Smtp-Source: ABdhPJzb/Y2FlMAxI4SxtC0Nvt4H/XMijvQBJrCPJfb/Zlmk7pJHYbEcXkdLe1HKKdLaLSUseMajqw== X-Received: by 2002:a63:cd48:: with SMTP id a8mr2741390pgj.83.1603821145679; Tue, 27 Oct 2020 10:52:25 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:25 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 4/8] rpmsg: virtio: Rename rpmsg_create_channel Date: Tue, 27 Oct 2020 11:52:14 -0600 Message-Id: <20201027175218.1033609-5-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org From: Arnaud Pouliquen Rename the internal function as it is internal, and as the name will be used in rpmsg_core. Signed-off-by: Arnaud Pouliquen Signed-off-by: Mathieu Poirier Reviewed-by: Guennadi Liakhovetski --- drivers/rpmsg/virtio_rpmsg_bus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index 064a5ddcf7c0..01f05bc570a4 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -365,8 +365,8 @@ static void virtio_rpmsg_release_device(struct device *dev) * this function will be used to create both static and dynamic * channels. */ -static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp, - struct rpmsg_channel_info *chinfo) +static struct rpmsg_device * __rpmsg_create_channel(struct virtproc_info *vrp, + struct rpmsg_channel_info *chinfo) { struct virtio_rpmsg_channel *vch; struct rpmsg_device *rpdev; @@ -842,7 +842,7 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, if (ret) dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret); } else { - newch = rpmsg_create_channel(vrp, &chinfo); + newch = __rpmsg_create_channel(vrp, &chinfo); if (!newch) dev_err(dev, "rpmsg_create_channel failed\n"); } From patchwork Tue Oct 27 17:52:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861247 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A9CAB6A2 for ; Tue, 27 Oct 2020 17:52:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8362221556 for ; Tue, 27 Oct 2020 17:52:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ySnEVeU9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822827AbgJ0Rwz (ORCPT ); Tue, 27 Oct 2020 13:52:55 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:35017 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822769AbgJ0Rw1 (ORCPT ); Tue, 27 Oct 2020 13:52:27 -0400 Received: by mail-pf1-f194.google.com with SMTP id b3so1358732pfo.2 for ; Tue, 27 Oct 2020 10:52:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dV45urz8CEkil+8k/x+LWNSg/bkz6TIq0p5IEVSCoA0=; b=ySnEVeU9jWeTb0qiecTxIE+ABKsLlD1d4Cemwq17LC264SVdVApeXPBoN/wKIBTrKK R8IcREor0bMosp53Ls1CGAlHZVQnJidYjycMx1wcUxOexQaKCpsMOy3PTMubpGxy+Kcr ClDA56SZs/W+In5LkLtQFr+1a2VHzsmij7jrA3BXeWFNV+bHzuWxFDdUpVmTK5vGhpHN qwJjkcsum7U2BAEaSwLztyx95QqMZ/HyXRv1BQSjGfZ6imvCF/0I/sv0SkBqD+POIFsO 0WrU/O+j8U9Odzvg9ZvNtilBR1AWS0q9WJRjZd4NNuqrgr3vAUrleyhOA8GtSIpQHTGl ZCFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dV45urz8CEkil+8k/x+LWNSg/bkz6TIq0p5IEVSCoA0=; b=V82u5h7S4z7rUjvuhz7EXkz51Q6dRNKjF7F9BOQDNroljF0Q3xSXKYUwdforllBz/E XWlCS6OTWaHTtVp/T1UfRqvBN+T6/uMrqVZ/0a9uMFKObG1dXjnez4pRkxEHfGNTU+eK KBDDEzadkGFF6yJbZxSFHSzJZPAf3D9IBAqJl9DNqcDmLyGzD8+N2ROMSMu1YHA2xLjc nfN/a/ZWRo9CWe61Y6LO5PwsS6ksprs30+Mg17wZvUf7ig2tIXIz7IwHq5lIOv3r17Xz X59oKMWJVF6HGosxiy6p2GN0k3KKGAByDaDIhp/J3xKZQfbondW7kQlqkY0lBgR6pEfR sfPQ== X-Gm-Message-State: AOAM530+a5RPeuML00IdVAfWr0nxReFaYnookd+Ffj5VJo/X1XWiKLhT sNQgQU/+ScL7Pgj6CwFJvpo+Dg== X-Google-Smtp-Source: ABdhPJxyXDNprNmTkanMO0scohW4O656dD1a2h0+KFfGY4U6rW1J7gTwUmogL8k5Sy9AUmzatN/00w== X-Received: by 2002:a63:e642:: with SMTP id p2mr2882647pgj.79.1603821146803; Tue, 27 Oct 2020 10:52:26 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:26 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 5/8] rpmsg: core: Add channel creation internal API Date: Tue, 27 Oct 2020 11:52:15 -0600 Message-Id: <20201027175218.1033609-6-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org From: Arnaud Pouliquen Add the channel creation API as a first step to be able to define the name service announcement as a rpmsg driver independent from the RPMsg virtio bus. Signed-off-by: Arnaud Pouliquen Signed-off-by: Mathieu Poirier Reviewed-by: Guennadi Liakhovetski --- drivers/rpmsg/rpmsg_core.c | 44 ++++++++++++++++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 10 ++++++++ 2 files changed, 54 insertions(+) diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c index 91de940896e3..6381c1e00741 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/rpmsg_core.c @@ -20,6 +20,50 @@ #include "rpmsg_internal.h" +/** + * rpmsg_create_channel() - create a new rpmsg channel + * using its name and address info. + * @rpdev: rpmsg device + * @chinfo: channel_info to bind + * + * Returns a pointer to the new rpmsg device on success, or NULL on error. + */ +struct rpmsg_device * rpmsg_create_channel(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo) +{ + if (WARN_ON(!rpdev)) + return NULL; + if (!rpdev->ops || !rpdev->ops->create_channel) { + dev_err(&rpdev->dev, "no create_channel ops found\n"); + return NULL; + } + + return rpdev->ops->create_channel(rpdev, chinfo); +} +EXPORT_SYMBOL(rpmsg_create_channel); + +/** + * rpmsg_release_channel() - release a rpmsg channel + * using its name and address info. + * @rpdev: rpmsg device + * @chinfo: channel_info to bind + * + * Returns 0 on success or an appropriate error value. + */ +int rpmsg_release_channel(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo) +{ + if (WARN_ON(!rpdev)) + return -EINVAL; + if (!rpdev->ops || !rpdev->ops->release_channel) { + dev_err(&rpdev->dev, "no release_channel ops found\n"); + return -ENXIO; + } + + return rpdev->ops->release_channel(rpdev, chinfo); +} +EXPORT_SYMBOL(rpmsg_release_channel); + /** * rpmsg_create_ept() - create a new rpmsg_endpoint * @rpdev: rpmsg channel device diff --git a/drivers/rpmsg/rpmsg_internal.h b/drivers/rpmsg/rpmsg_internal.h index 3fc83cd50e98..810dd95cc9bd 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -20,6 +20,8 @@ /** * struct rpmsg_device_ops - indirection table for the rpmsg_device operations + * @create_channel: create backend-specific channel, optional + * @release_channel: release backend-specific channel, optional * @create_ept: create backend-specific endpoint, required * @announce_create: announce presence of new channel, optional * @announce_destroy: announce destruction of channel, optional @@ -29,6 +31,10 @@ * advertise new channels implicitly by creating the endpoints. */ struct rpmsg_device_ops { + struct rpmsg_device *(*create_channel)(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo); + int (*release_channel)(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo); struct rpmsg_endpoint *(*create_ept)(struct rpmsg_device *rpdev, rpmsg_rx_cb_t cb, void *priv, struct rpmsg_channel_info chinfo); @@ -75,6 +81,10 @@ int rpmsg_unregister_device(struct device *parent, struct device *rpmsg_find_device(struct device *parent, struct rpmsg_channel_info *chinfo); +struct rpmsg_device * rpmsg_create_channel(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo); +int rpmsg_release_channel(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo); /** * rpmsg_chrdev_register_device() - register chrdev device based on rpdev * @rpdev: prepared rpdev to be used for creating endpoints From patchwork Tue Oct 27 17:52:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861237 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F00A192C for ; Tue, 27 Oct 2020 17:52:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CA9292225C for ; Tue, 27 Oct 2020 17:52:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ma8MrtpK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822786AbgJ0Rw3 (ORCPT ); Tue, 27 Oct 2020 13:52:29 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:37775 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822758AbgJ0Rw3 (ORCPT ); Tue, 27 Oct 2020 13:52:29 -0400 Received: by mail-pf1-f193.google.com with SMTP id 126so1354381pfu.4 for ; Tue, 27 Oct 2020 10:52:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=807sOLdqwgnAyj71IoZ5gIos6+0azuDGDEd483PBBLI=; b=ma8MrtpKWnvLHz9JdBhZmp3Bb1x9dZ9VDEljydi7sbfA58vIxGmi/rJR7xGJh34A9t 2di7lSTtL/p3h3Y/vNXK0DfOBD5QUj6IG9C2+TINopx6/RGrbnl5/4WV+j7j854Gkwyb FOTbHpvQq/wJx0NGKTTbcpVF0N5s5omoG3hBW3EpDj3kmtqO0qmdE3CdgaFBFF32nDi+ wIXADSibPCcXIYrScuFOZa75PAQc6XD/zzEjawwyhJjiB5UOAWbu5RVzPOiiezftYU1j XOevQ22B+EjBFLiNhfVaQPU87ADom08sCBlAyB+pabn6BhRT1jSuag4YTUIhqC0YNc6k fjfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=807sOLdqwgnAyj71IoZ5gIos6+0azuDGDEd483PBBLI=; b=WQI4rHRtT3/1tg1wmPDYit7XY+P1V7dV6Hz2+OoVtBlPNCBSACRXFVeTUV7eGQCxaC y7DBV1LOvnP1PKqqi5tS9VtTWMBemk+rN+/Y3aod4h/4ZzLDn3PxZKYUu+Jz33uVEgq6 FInrDdoDX00dnd1UxFliGToc6Uyx7JaYlVBJmnmgvZ01c5wD2gUI8iMY9qgwymacCJM8 Nf/c1Skxgb3cYGzud3BPlru77dEekVitLV3NxtgRtc4ULnIgBmBnuDrTw9cck+30WFGQ JNBdlXzdt4EB8dzvbjgA67JAGExPX6i1KZ/KXgpf7RG3QIfa0VPRKWgh+5PLvnBc3GV/ +mYA== X-Gm-Message-State: AOAM533HBIDzNq8z3zbuNXiINEiSFDNgVZrvaHNwshUSOmYZPtIbc696 EzX1Yg6nNQyQ7ailGlrvk+Uk2A== X-Google-Smtp-Source: ABdhPJw6GaFY7swybF+dTqPUmiaT1hhGvUuDyS8QpPNK2sJv0otV705hGsfD2LEhNN0dgDxs97dxrg== X-Received: by 2002:aa7:9192:0:b029:15c:ebd2:971c with SMTP id x18-20020aa791920000b029015cebd2971cmr3489331pfa.33.1603821147934; Tue, 27 Oct 2020 10:52:27 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:27 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 6/8] rpmsg: virtio: Add rpmsg channel device ops Date: Tue, 27 Oct 2020 11:52:16 -0600 Message-Id: <20201027175218.1033609-7-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org From: Arnaud Pouliquen Implement the create and release of the RPMsg channel for the RPMsg virtio bus. Signed-off-by: Arnaud Pouliquen Signed-off-by: Mathieu Poirier Reviewed-by: Guennadi Liakhovetski --- drivers/rpmsg/virtio_rpmsg_bus.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index 01f05bc570a4..ff8afee807cc 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -151,6 +151,8 @@ static int virtio_rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst); static int virtio_rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, void *data, int len); +static struct rpmsg_device * __rpmsg_create_channel(struct virtproc_info *vrp, + struct rpmsg_channel_info *chinfo); static const struct rpmsg_endpoint_ops virtio_endpoint_ops = { .destroy_ept = virtio_rpmsg_destroy_ept, @@ -255,6 +257,24 @@ static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp, return NULL; } +static struct rpmsg_device *virtio_rpmsg_create_channel(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo) +{ + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev); + struct virtproc_info *vrp = vch->vrp; + + return __rpmsg_create_channel(vrp, chinfo); +} + +static int virtio_rpmsg_release_channel(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo) +{ + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev); + struct virtproc_info *vrp = vch->vrp; + + return rpmsg_unregister_device(&vrp->vdev->dev, chinfo); +} + static struct rpmsg_endpoint *virtio_rpmsg_create_ept(struct rpmsg_device *rpdev, rpmsg_rx_cb_t cb, void *priv, @@ -347,6 +367,8 @@ static int virtio_rpmsg_announce_destroy(struct rpmsg_device *rpdev) } static const struct rpmsg_device_ops virtio_rpmsg_ops = { + .create_channel = virtio_rpmsg_create_channel, + .release_channel = virtio_rpmsg_release_channel, .create_ept = virtio_rpmsg_create_ept, .announce_create = virtio_rpmsg_announce_create, .announce_destroy = virtio_rpmsg_announce_destroy, From patchwork Tue Oct 27 17:52:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861241 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A7846157C for ; Tue, 27 Oct 2020 17:52:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 811C5206FA for ; Tue, 27 Oct 2020 17:52:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="k7SmtA60" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1822790AbgJ0Rwo (ORCPT ); Tue, 27 Oct 2020 13:52:44 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:37939 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822783AbgJ0Rw3 (ORCPT ); Tue, 27 Oct 2020 13:52:29 -0400 Received: by mail-pg1-f194.google.com with SMTP id i26so1222066pgl.5 for ; Tue, 27 Oct 2020 10:52:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eac2eJkbULJAn6wCUm/Bl8+weiuvIgiBhtMaMSxo0p4=; b=k7SmtA60wvpc0U2kvqBONBwbf0f3C7O1ycXiRo7OlegsSuHwoaCKYwvxObt9ceFc9a b29NTzGKQxjk9klylTq29KLhJ5BML/2W8fibrLXDGQ54MHrmnwF4xLepPWYDvwu8nC/R TV7yk/e+4HioImM/a93sKuBq3FgXjRovzqoL/k+edNatd/hUFVnv1SZWnZ5gaypOXln7 2MdQMQrqgX6PHJ6sn4P9tuBU5UopiO3yslsblMOjgMlm4uGrwdkBrsNJIxQcFO5xRyil 6fuUd42ZqHYL6ttXq50Y1X128gtrDUF6c0NZcPOhGE1JjKFc0DiEqRzA40sHWyQ+WQ2+ KZng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eac2eJkbULJAn6wCUm/Bl8+weiuvIgiBhtMaMSxo0p4=; b=R1/e7Nsmi3yvg8k3y+qxTqRntdTvNyt9HyQciNxmD2TSOgbcmkepmsq59jDziIZ1Rl Cz6m3PC0+nDOizh/upLVYUA/n1lBR9LkNx+dzDCrhXfrH93BtmvH7FXqdnQVDBCr1o0R E1rHGj882MB9EwbQXwgqpE+lmdfYjIIgvZxVYst+ylxzrmGt5IUPmfvSxse/P2v4yfRD w6IgUk9nwKiZ2BBoEMzJiOHEzdJF+grTQHE7EFk6x54ZKDu9D8pXy/c2sZ0J5ZvSWbJd zt0+rhq4T2xzQb4so6oxWJhjCz5vL+BzUYNVG4DXnpr2RHt+8UUPMBsFk2KX1Gj5/DvM 2CQw== X-Gm-Message-State: AOAM532mJkiYlwCPieZHG+hZJBmaauEqO8yzWAnNB08nsKIigPivHJg+ j6aN89rRWufFapmrTXOq+nebsA== X-Google-Smtp-Source: ABdhPJy4mT5osUUWJEN8seQ1fBtwbI/HOAnZ3vjTXG8ndfKMU3cH4VWKnAxBb49yGWtNw8BMN/xf+g== X-Received: by 2002:a63:1e5a:: with SMTP id p26mr2948756pgm.85.1603821149032; Tue, 27 Oct 2020 10:52:29 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:28 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 7/8] rpmsg: Make rpmsg_{register|unregister}_device() public Date: Tue, 27 Oct 2020 11:52:17 -0600 Message-Id: <20201027175218.1033609-8-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Make function rpmsg_register_device() and rpmsg_unregister_device() functions public so that they can be used by other clients. While doing so get rid of two obsolete function, i.e register_rpmsg_device() and unregister_rpmsg_device(), to prevent confusion. Signed-off-by: Mathieu Poirier Reviewed-by: Arnaud Pouliquen Reviewed-by: Guennadi Liakhovetski --- drivers/rpmsg/rpmsg_internal.h | 4 ---- include/linux/rpmsg.h | 12 ++++++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/rpmsg/rpmsg_internal.h b/drivers/rpmsg/rpmsg_internal.h index 810dd95cc9bd..0721294ed415 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -74,10 +74,6 @@ struct rpmsg_endpoint_ops { poll_table *wait); }; -int rpmsg_register_device(struct rpmsg_device *rpdev); -int rpmsg_unregister_device(struct device *parent, - struct rpmsg_channel_info *chinfo); - struct device *rpmsg_find_device(struct device *parent, struct rpmsg_channel_info *chinfo); diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h index 97098a90c496..8ee1b1dab657 100644 --- a/include/linux/rpmsg.h +++ b/include/linux/rpmsg.h @@ -164,8 +164,9 @@ static inline __rpmsg64 cpu_to_rpmsg64(struct rpmsg_device *rpdev, u64 val) #if IS_ENABLED(CONFIG_RPMSG) -int register_rpmsg_device(struct rpmsg_device *dev); -void unregister_rpmsg_device(struct rpmsg_device *dev); +int rpmsg_register_device(struct rpmsg_device *rpdev); +int rpmsg_unregister_device(struct device *parent, + struct rpmsg_channel_info *chinfo); int __register_rpmsg_driver(struct rpmsg_driver *drv, struct module *owner); void unregister_rpmsg_driver(struct rpmsg_driver *drv); void rpmsg_destroy_ept(struct rpmsg_endpoint *); @@ -188,15 +189,18 @@ __poll_t rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp, #else -static inline int register_rpmsg_device(struct rpmsg_device *dev) +static inline int rpmsg_register_device(struct rpmsg_device *rpdev) { return -ENXIO; } -static inline void unregister_rpmsg_device(struct rpmsg_device *dev) +static inline int rpmsg_unregister_device(struct device *parent, + struct rpmsg_channel_info *chinfo) { /* This shouldn't be possible */ WARN_ON(1); + + return -ENXIO; } static inline int __register_rpmsg_driver(struct rpmsg_driver *drv, From patchwork Tue Oct 27 17:52:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 11861239 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6A4DC6A2 for ; Tue, 27 Oct 2020 17:52:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3235D2076A for ; Tue, 27 Oct 2020 17:52:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="yLRp7slj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758799AbgJ0Rwo (ORCPT ); Tue, 27 Oct 2020 13:52:44 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:38025 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1822790AbgJ0Rwb (ORCPT ); Tue, 27 Oct 2020 13:52:31 -0400 Received: by mail-pf1-f194.google.com with SMTP id 10so1354067pfp.5 for ; Tue, 27 Oct 2020 10:52:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GPkHdy8MGi6Bt+MEPO/Ik2XEeabWbUHNhno0NBmhNT4=; b=yLRp7slj8mvMGULdR0YTRJWGZsXUZEmCZl8KxeiIs7nc2qj6lZ1cYS1c/ptzKMIl2u lo/fdbvVEwie6AN0nPdFrfiXr3wIObSLqJU5zKy0w2qg5/vij6yeCtw86kxF2Y2kuMUO USXZtw9nLQCBVPsCRuK21fhSW+OVPebwoiV5BJKz6dr0izudZQkoJGkUh6RxR1UHXTwe oC1dGZttuf51aiSKpu/X8xsCR4WussOB7kIlNkg4d3L3q02DuqdMZg3Asp/cc8PAK3o+ zBOyHfdeQ1zxcFtE85CkkEyw94s7bAj0VIVUTzkcirUlBtNthizzddUORBKU4mkUmU5y Ps6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GPkHdy8MGi6Bt+MEPO/Ik2XEeabWbUHNhno0NBmhNT4=; b=ErtGVltHaSQPyzjsqVNl+yESB60GEs4FVWzbfWW0Iw+RTCQ5EWITsriNrA/QiNtMRw B8fp0cXnQfhoJIFDyy/ySo70nlh4Pl8wkqWUdjXJxI0ZGBaLkGz1viu2rQuox54wFZYT 08xX5v8dWKZ2K9YSeb4ie2FYguxY1ONltlshtW4hAD6WFAo0+BxWKRd6W4uBZnny1qvG CPLwkaoJ7A3VRYBu0KNCyKbs8Ye2DhZciWlK99LccssaUKyY02H0irXViu9DtgK0WB02 ed7ZGV1YEhbAYNPdMCq9Vy6qKjCYoD8a2UQpxEQjvH/pWm6TDvU9iD2VIjCBPQbj2l77 ialg== X-Gm-Message-State: AOAM531bXQteojFiNSIKCh9fGL5r+8SdiFa7nQvtDusulKElC0PkVUFT BSf+GyawidA8TzAB1RJD3QeYsA== X-Google-Smtp-Source: ABdhPJyjcHPMcthUKMsxQ0cwsBmjDU5VAWcrNWG4SLKOc1U9BpdwJ2J/kZgzhXdltrAq5XgkNLxzCA== X-Received: by 2002:aa7:8b03:0:b029:152:a364:5084 with SMTP id f3-20020aa78b030000b0290152a3645084mr3441912pfd.29.1603821150333; Tue, 27 Oct 2020 10:52:30 -0700 (PDT) Received: from xps15.cg.shawcable.net (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id r8sm2761225pgl.57.2020.10.27.10.52.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 10:52:29 -0700 (PDT) From: Mathieu Poirier To: ohad@wizery.com, bjorn.andersson@linaro.org Cc: guennadi.liakhovetski@linux.intel.com, arnaud.pouliquen@st.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 8/8] rpmsg: Turn name service into a stand alone driver Date: Tue, 27 Oct 2020 11:52:18 -0600 Message-Id: <20201027175218.1033609-9-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201027175218.1033609-1-mathieu.poirier@linaro.org> References: <20201027175218.1033609-1-mathieu.poirier@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org From: Arnaud Pouliquen Make the RPMSG name service announcement a stand alone driver so that it can be reused by other subsystems. It is also the first step in making the functionatlity transport independent, i.e that is not tied to virtIO. Co-developed-by: Mathieu Poirier Signed-off-by: Arnaud Pouliquen --- drivers/rpmsg/Kconfig | 8 +++ drivers/rpmsg/Makefile | 1 + drivers/rpmsg/rpmsg_ns.c | 108 +++++++++++++++++++++++++++++++ drivers/rpmsg/virtio_rpmsg_bus.c | 86 ++++++------------------ include/linux/rpmsg_ns.h | 17 +++++ 5 files changed, 153 insertions(+), 67 deletions(-) create mode 100644 drivers/rpmsg/rpmsg_ns.c diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig index f96716893c2a..c3fc75e6514b 100644 --- a/drivers/rpmsg/Kconfig +++ b/drivers/rpmsg/Kconfig @@ -15,6 +15,14 @@ config RPMSG_CHAR in /dev. They make it possible for user-space programs to send and receive rpmsg packets. +config RPMSG_NS + tristate "RPMSG name service announcement" + depends on RPMSG + help + Say Y here to enable the support of the name service announcement + channel that probes the associated RPMsg device on remote endpoint + service announcement. + config RPMSG_MTK_SCP tristate "MediaTek SCP" depends on MTK_SCP diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile index ffe932ef6050..8d452656f0ee 100644 --- a/drivers/rpmsg/Makefile +++ b/drivers/rpmsg/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_RPMSG) += rpmsg_core.o obj-$(CONFIG_RPMSG_CHAR) += rpmsg_char.o +obj-$(CONFIG_RPMSG_NS) += rpmsg_ns.o obj-$(CONFIG_RPMSG_MTK_SCP) += mtk_rpmsg.o qcom_glink-objs := qcom_glink_native.o qcom_glink_ssr.o obj-$(CONFIG_RPMSG_QCOM_GLINK) += qcom_glink.o diff --git a/drivers/rpmsg/rpmsg_ns.c b/drivers/rpmsg/rpmsg_ns.c new file mode 100644 index 000000000000..8e26824ca328 --- /dev/null +++ b/drivers/rpmsg/rpmsg_ns.c @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) STMicroelectronics 2020 - All Rights Reserved + */ +#include +#include +#include +#include +#include +#include + +#include "rpmsg_internal.h" + +/* invoked when a name service announcement arrives */ +static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, + void *priv, u32 src) +{ + struct rpmsg_ns_msg *msg = data; + struct rpmsg_device *newch; + struct rpmsg_channel_info chinfo; + struct device *dev = rpdev->dev.parent; + int ret; + +#if defined(CONFIG_DYNAMIC_DEBUG) + dynamic_hex_dump("NS announcement: ", DUMP_PREFIX_NONE, 16, 1, + data, len, true); +#endif + + if (len != sizeof(*msg)) { + dev_err(dev, "malformed ns msg (%d)\n", len); + return -EINVAL; + } + + /* don't trust the remote processor for null terminating the name */ + msg->name[RPMSG_NAME_SIZE - 1] = '\0'; + + strncpy(chinfo.name, msg->name, sizeof(chinfo.name)); + chinfo.src = RPMSG_ADDR_ANY; + chinfo.dst = rpmsg32_to_cpu(rpdev, msg->addr); + + dev_info(dev, "%sing channel %s addr 0x%x\n", + rpmsg32_to_cpu(rpdev, msg->flags) & RPMSG_NS_DESTROY ? + "destroy" : "creat", msg->name, chinfo.dst); + + if (rpmsg32_to_cpu(rpdev, msg->flags) & RPMSG_NS_DESTROY) { + ret = rpmsg_release_channel(rpdev, &chinfo); + if (ret) + dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret); + } else { + newch = rpmsg_create_channel(rpdev, &chinfo); + if (!newch) + dev_err(dev, "rpmsg_create_channel failed\n"); + } + + return 0; +} + +static int rpmsg_ns_probe(struct rpmsg_device *rpdev) +{ + struct rpmsg_endpoint *ns_ept; + struct rpmsg_channel_info ns_chinfo = { + .src = RPMSG_NS_ADDR, + .dst = RPMSG_NS_ADDR, + .name = "name_service", + }; + + /* + * Create the NS announcement service endpoint associated to the RPMsg + * device. The endpoint will be automatically destroyed when the RPMsg + * device will be deleted. + */ + ns_ept = rpmsg_create_ept(rpdev, rpmsg_ns_cb, NULL, ns_chinfo); + if (!ns_ept) { + dev_err(&rpdev->dev, "failed to create the ns ept\n"); + return -ENOMEM; + } + rpdev->ept = ns_ept; + + return 0; +} + +static struct rpmsg_driver rpmsg_ns_driver = { + .drv.name = "rpmsg_ns", + .probe = rpmsg_ns_probe, +}; + +static int rpmsg_ns_init(void) +{ + int ret; + + ret = register_rpmsg_driver(&rpmsg_ns_driver); + if (ret < 0) + pr_err("%s: Failed to register rpmsg driver\n", __func__); + + return ret; +} +postcore_initcall(rpmsg_ns_init); + +static void rpmsg_ns_exit(void) +{ + unregister_rpmsg_driver(&rpmsg_ns_driver); +} +module_exit(rpmsg_ns_exit); + +MODULE_DESCRIPTION("Name service announcement rpmsg Driver"); +MODULE_AUTHOR("Arnaud Pouliquen "); +MODULE_ALIAS("rpmsg_ns"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index ff8afee807cc..128cffa88d0f 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -49,7 +49,6 @@ * @endpoints_lock: lock of the endpoints set * @sendq: wait queue of sending contexts waiting for a tx buffers * @sleepers: number of senders that are waiting for a tx buffer - * @ns_ept: the bus's name service endpoint * * This structure stores the rpmsg state of a given virtio remote processor * device (there might be several virtio proc devices for each physical @@ -68,7 +67,6 @@ struct virtproc_info { struct mutex endpoints_lock; wait_queue_head_t sendq; atomic_t sleepers; - struct rpmsg_endpoint *ns_ept; }; /* The feature bitmap for virtio rpmsg */ @@ -815,69 +813,14 @@ static void rpmsg_xmit_done(struct virtqueue *svq) wake_up_interruptible(&vrp->sendq); } -/* invoked when a name service announcement arrives */ -static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, - void *priv, u32 src) -{ - struct rpmsg_ns_msg *msg = data; - struct rpmsg_device *newch; - struct rpmsg_channel_info chinfo; - struct virtproc_info *vrp = priv; - struct device *dev = &vrp->vdev->dev; - bool little_endian = virtio_is_little_endian(vrp->vdev); - int ret; - -#if defined(CONFIG_DYNAMIC_DEBUG) - dynamic_hex_dump("NS announcement: ", DUMP_PREFIX_NONE, 16, 1, - data, len, true); -#endif - - if (len != sizeof(*msg)) { - dev_err(dev, "malformed ns msg (%d)\n", len); - return -EINVAL; - } - - /* - * the name service ept does _not_ belong to a real rpmsg channel, - * and is handled by the rpmsg bus itself. - * for sanity reasons, make sure a valid rpdev has _not_ sneaked - * in somehow. - */ - if (rpdev) { - dev_err(dev, "anomaly: ns ept has an rpdev handle\n"); - return -EINVAL; - } - - /* don't trust the remote processor for null terminating the name */ - msg->name[RPMSG_NAME_SIZE - 1] = '\0'; - - strncpy(chinfo.name, msg->name, sizeof(chinfo.name)); - chinfo.src = RPMSG_ADDR_ANY; - chinfo.dst = __rpmsg32_to_cpu(little_endian, msg->addr); - - dev_info(dev, "%sing channel %s addr 0x%x\n", - __rpmsg32_to_cpu(little_endian, msg->flags) & RPMSG_NS_DESTROY ? - "destroy" : "creat", msg->name, chinfo.dst); - - if (__rpmsg32_to_cpu(little_endian, 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); - } else { - newch = __rpmsg_create_channel(vrp, &chinfo); - if (!newch) - dev_err(dev, "rpmsg_create_channel failed\n"); - } - - return 0; -} - static int rpmsg_probe(struct virtio_device *vdev) { vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done }; static const char * const names[] = { "input", "output" }; struct virtqueue *vqs[2]; struct virtproc_info *vrp; + struct virtio_rpmsg_channel *vch; + struct rpmsg_device *rpdev_ns; void *bufs_va; int err = 0, i; size_t total_buf_space; @@ -953,14 +896,26 @@ static int rpmsg_probe(struct virtio_device *vdev) /* if supported by the remote processor, enable the name service */ if (virtio_has_feature(vdev, VIRTIO_RPMSG_F_NS)) { - /* a dedicated endpoint handles the name service msgs */ - vrp->ns_ept = __rpmsg_create_ept(vrp, NULL, rpmsg_ns_cb, - vrp, RPMSG_NS_ADDR); - if (!vrp->ns_ept) { - dev_err(&vdev->dev, "failed to create the ns ept\n"); + vch = kzalloc(sizeof(*vch), GFP_KERNEL); + if (!vch) { err = -ENOMEM; goto free_coherent; } + + /* Link the channel to our vrp */ + vch->vrp = vrp; + + /* Assign public information to the rpmsg_device */ + rpdev_ns = &vch->rpdev; + rpdev_ns->ops = &virtio_rpmsg_ops; + rpdev_ns->little_endian = virtio_is_little_endian(vrp->vdev); + + rpdev_ns->dev.parent = &vrp->vdev->dev; + rpdev_ns->dev.release = virtio_rpmsg_release_device; + + err = rpmsg_ns_register_device(rpdev_ns); + if (err) + goto free_coherent; } /* @@ -1013,9 +968,6 @@ static void rpmsg_remove(struct virtio_device *vdev) if (ret) dev_warn(&vdev->dev, "can't remove rpmsg device: %d\n", ret); - if (vrp->ns_ept) - __rpmsg_destroy_ept(vrp, vrp->ns_ept); - idr_destroy(&vrp->endpoints); vdev->config->del_vqs(vrp->vdev); diff --git a/include/linux/rpmsg_ns.h b/include/linux/rpmsg_ns.h index bb479f430080..42786bb759b5 100644 --- a/include/linux/rpmsg_ns.h +++ b/include/linux/rpmsg_ns.h @@ -39,4 +39,21 @@ enum rpmsg_ns_flags { /* Address 53 is reserved for advertising remote services */ #define RPMSG_NS_ADDR (53) +/** + * rpmsg_ns_register_device() - register name service device based on rpdev + * @rpdev: prepared rpdev to be used for creating endpoints + * + * This function wraps rpmsg_register_device() preparing the rpdev for use as + * basis for the rpmsg name service device. + */ +static inline int rpmsg_ns_register_device(struct rpmsg_device *rpdev) +{ + strcpy(rpdev->id.name, "rpmsg_ns"); + rpdev->driver_override = "rpmsg_ns"; + rpdev->src = RPMSG_NS_ADDR; + rpdev->dst = RPMSG_NS_ADDR; + + return rpmsg_register_device(rpdev); +} + #endif