From: Sarannya S <quic_sarannya@quicinc.com>
To: <quic_bjorande@quicinc.com>, <arnaud.pouliquen@foss.st.com>,
<swboyd@chromium.org>, <quic_clew@quicinc.com>,
<mathieu.poirier@linaro.org>
Cc: <linux-kernel@vger.kernel.org>, <linux-arm-msm@vger.kernel.org>,
<linux-remoteproc@vger.kernel.org>,
Sarannya S <quic_sarannya@quicinc.com>,
Deepak Kumar Singh <quic_deesin@quicinc.com>,
Andy Gross <agross@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konrad.dybcio@somainline.org>
Subject: [PATCH V4 2/3] rpmsg: glink: Add support to handle signals command
Date: Wed, 7 Dec 2022 18:34:17 +0530 [thread overview]
Message-ID: <1670418258-11502-3-git-send-email-quic_sarannya@quicinc.com> (raw)
In-Reply-To: <1670418258-11502-1-git-send-email-quic_sarannya@quicinc.com>
Remote peripherals send signal notifications over glink with commandID 15.
Add support to send and receive the signal command and based signals
enable or disable flow control with remote host.
Signed-off-by: Chris Lew <quic_clew@quicinc.com>
Signed-off-by: Deepak Kumar Singh <quic_deesin@quicinc.com>
Signed-off-by: Sarannya S <quic_sarannya@quicinc.com>
---
drivers/rpmsg/qcom_glink_native.c | 64 +++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index 115c0a1..57c0caa 100644
--- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -17,6 +17,7 @@
#include <linux/rpmsg.h>
#include <linux/sizes.h>
#include <linux/slab.h>
+#include <linux/termios.h>
#include <linux/workqueue.h>
#include <linux/mailbox_client.h>
@@ -203,9 +204,15 @@ static const struct rpmsg_endpoint_ops glink_endpoint_ops;
#define RPM_CMD_TX_DATA_CONT 12
#define RPM_CMD_READ_NOTIF 13
#define RPM_CMD_RX_DONE_W_REUSE 14
+#define RPM_CMD_SIGNALS 15
#define GLINK_FEATURE_INTENTLESS BIT(1)
+#define NATIVE_DTR_SIG NATIVE_DSR_SIG
+#define NATIVE_DSR_SIG BIT(31)
+#define NATIVE_RTS_SIG NATIVE_CTS_SIG
+#define NATIVE_CTS_SIG BIT(30)
+
static void qcom_glink_rx_done_work(struct work_struct *work);
static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink,
@@ -1001,6 +1008,58 @@ static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)
return 0;
}
+/**
+ * qcom_glink_set_flow_control() - convert a signal cmd to wire format and
+ * transmit
+ * @ept: Rpmsg endpoint for channel.
+ * @enable: True/False - enable or disable flow control
+ * @dst: destination address of the endpoint
+ *
+ * Return: 0 on success or standard Linux error code.
+ */
+static int qcom_glink_set_flow_control(struct rpmsg_endpoint *ept, bool enable, u32 dst)
+{
+ struct glink_channel *channel = to_glink_channel(ept);
+ struct qcom_glink *glink = channel->glink;
+ struct glink_msg msg;
+ u32 sigs = 0;
+
+ if (enable)
+ sigs |= NATIVE_DTR_SIG | NATIVE_RTS_SIG;
+
+ msg.cmd = cpu_to_le16(RPM_CMD_SIGNALS);
+ msg.param1 = cpu_to_le16(channel->lcid);
+ msg.param2 = cpu_to_le32(sigs);
+
+ return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
+}
+
+static int qcom_glink_handle_signals(struct qcom_glink *glink,
+ unsigned int rcid, unsigned int sigs)
+{
+ struct glink_channel *channel;
+ unsigned long flags;
+ bool enable = false;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, rcid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (!channel) {
+ dev_err(glink->dev, "signal for non-existing channel\n");
+ return -EINVAL;
+ }
+
+ if (!channel->ept.flow_cb)
+ return 0;
+
+ if (sigs & (NATIVE_DSR_SIG | NATIVE_CTS_SIG))
+ enable = true;
+
+ channel->ept.flow_cb(channel->ept.rpdev, channel->ept.priv, enable);
+
+ return 0;
+}
+
static irqreturn_t qcom_glink_native_intr(int irq, void *data)
{
struct qcom_glink *glink = data;
@@ -1065,6 +1124,10 @@ static irqreturn_t qcom_glink_native_intr(int irq, void *data)
qcom_glink_handle_intent_req_ack(glink, param1, param2);
qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
break;
+ case RPM_CMD_SIGNALS:
+ qcom_glink_handle_signals(glink, param1, param2);
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
+ break;
default:
dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd);
ret = -EINVAL;
@@ -1440,6 +1503,7 @@ static const struct rpmsg_endpoint_ops glink_endpoint_ops = {
.sendto = qcom_glink_sendto,
.trysend = qcom_glink_trysend,
.trysendto = qcom_glink_trysendto,
+ .set_flow_control = qcom_glink_set_flow_control,
};
static void qcom_glink_rpdev_release(struct device *dev)
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
next prev parent reply other threads:[~2022-12-07 13:06 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-07 13:04 [PATCH V4 0/3] rpmsg signaling/flowcontrol patches Sarannya S
2022-12-07 13:04 ` [PATCH V4 1/3] rpmsg: core: Add signal API support Sarannya S
2022-12-21 16:12 ` Arnaud POULIQUEN
2022-12-27 15:32 ` Bjorn Andersson
2023-01-03 13:50 ` Arnaud POULIQUEN
2023-01-04 16:30 ` Bjorn Andersson
2023-01-04 18:31 ` Arnaud POULIQUEN
2022-12-07 13:04 ` Sarannya S [this message]
2022-12-07 13:04 ` [PATCH V4 3/3] rpmsg: char: Add TIOCMGET/TIOCMSET ioctl support Sarannya S
2022-12-21 16:28 ` Arnaud POULIQUEN
2022-12-27 15:56 ` Bjorn Andersson
2023-01-03 14:50 ` Arnaud POULIQUEN
2023-01-04 16:03 ` Bjorn Andersson
2023-01-04 18:31 ` Arnaud POULIQUEN
-- strict thread matches above, loose matches on Subject: below --
2022-11-28 18:02 [PATCH V4 0/3] rpmsg signaling/flowcontrol patches Sarannya S
2022-11-28 18:02 ` [PATCH V4 2/3] rpmsg: glink: Add support to handle signals command Sarannya S
2022-11-28 13:28 [PATCH V4 1/3] rpmsg: core: Add signal API support Sarannya S
2022-11-28 13:28 ` [PATCH V4 2/3] rpmsg: glink: Add support to handle signals command Sarannya S
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1670418258-11502-3-git-send-email-quic_sarannya@quicinc.com \
--to=quic_sarannya@quicinc.com \
--cc=agross@kernel.org \
--cc=andersson@kernel.org \
--cc=arnaud.pouliquen@foss.st.com \
--cc=konrad.dybcio@somainline.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
--cc=quic_bjorande@quicinc.com \
--cc=quic_clew@quicinc.com \
--cc=quic_deesin@quicinc.com \
--cc=swboyd@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.