From patchwork Wed Aug 16 17:19:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sricharan Ramabadhran X-Patchwork-Id: 9904463 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3EA93600CA for ; Wed, 16 Aug 2017 17:52:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2B94828A4D for ; Wed, 16 Aug 2017 17:52:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2082E28A59; Wed, 16 Aug 2017 17:52:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_LOW autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6D89D28A4D for ; Wed, 16 Aug 2017 17:52:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=MWv4IOV0PrqlpRqUd7xsST2RAYTCx1bJyjwpYJ3/zbw=; b=pvRA8knzOUvu8GN0WwXkhHGIYX 2yZGJtHL7LGc/iKRip0nrbq4lGrXwQgqYmdzNHRNvhMI35ZmG/3X9pagK5C9UVQDqaDosZsgNQUV4 Wr878xwiXgT72NVM30H9ggqN+JENJ0RIKJECORllj+geYvhm6z+Tx1QhyVD7Hnm/lQJoiKUbSdUcT qrwOtpyacTXIue9unOaK9sOtXgQGLyBQu+xJwH98eTndVF1KwFDDmtbPEHV1Ejzp48dTj33TpvJfd hNtNKDsudhdwnNB7Xaxx7tGDvIICRLSXAOL2j0EFJQ0zYWwud+eu5kJ1pfmGpLXjQlV8ViVCc5Rv8 71s/CXCw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1di2U0-000650-7F; Wed, 16 Aug 2017 17:51:56 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1di2SS-0003ys-2O for linux-arm-kernel@bombadil.infradead.org; Wed, 16 Aug 2017 17:50:20 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=/19v0qgsdcZil4iswPErJjegwLAtwcmPhZ2Hr/oL7c8=; b=dmLKLWErozmFiYQUFcnMdEBxZ xpJGqhq1r9TawmuMdUR8HocXlIr/Uob2osgY5ds8BL5JzOy6CVlDzqj7PUmnstcjJ/IaIFSe+A2Tp PDVqTFojHNQisvm1DYkIZ7AphyN5UqL7ISNrMQGDey4wM+pPuzaS4+RICH1ovyd0uk47EDpnjcD0Q S/n333cGP0+gy9/h39NMaKmN1gzrIu3baY24nCCnW+Op1GwLr/V4bnHv0Fy+bOuGO4HiEmeU12Gay ijeMa4RhCF4mHdUOvhsUPROcb74z5QaEpF3Hw99G8QTfTFSlJo4GwaNjJg0OiLCSUWX49Vs2rDqNi rCEqCxbHw==; Received: from smtp.codeaurora.org ([198.145.29.96]) by merlin.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1di202-0005bf-BB for linux-arm-kernel@lists.infradead.org; Wed, 16 Aug 2017 17:20:59 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id EBC3E607BA; Wed, 16 Aug 2017 17:20:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1502904026; bh=WlKrcks94SEPJZtLy0yZh7tZm6W8sQE+X0YrV7oMUFo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J8WHv5rNJLpyiHxEEm8lFM6CGIRS3U9eMNs63mpdfVNP7Maqg54faDt2EKC2wBmLm amjfFdSGLSg+ZQ6mekNzn18cMUVVFqRk9RBbKJr1Ekwbk5y1tPoOcDZeXZ41z/DA5J Mm/TfZRmrEtvjW9nm3lnZyMfxxtTp0FQJa1Ru+vI= Received: from srichara-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: sricharan@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id F30E7606DB; Wed, 16 Aug 2017 17:20:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1502904007; bh=WlKrcks94SEPJZtLy0yZh7tZm6W8sQE+X0YrV7oMUFo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HeLyBPCUmzBf1AsnVT1kF/3KsM6gbeHb8vBjUD4dmQTXSuWtpEJpiIqB59gob/lA5 iHWsmkJw1wJHgUR5a0b2/UxZGmVH2L5/jTWH3qYoaFovYVVH8VAgd3yNzhe5ZdG7oW raO7eVf/vjxHh1V714+YG2qmqez5TpDwI9OrGnA8= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org F30E7606DB Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=sricharan@codeaurora.org From: Sricharan R To: ohad@wizery.com, bjorn.andersson@linaro.org, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 13/18] rpmsg: glink: Add rx done command Date: Wed, 16 Aug 2017 22:49:06 +0530 Message-Id: <1502903951-5403-14-git-send-email-sricharan@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1502903951-5403-1-git-send-email-sricharan@codeaurora.org> References: <1502903951-5403-1-git-send-email-sricharan@codeaurora.org> X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: sricharan@codeaurora.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Send RX data receive ack to remote and also inform that local intent buffer is used and freed. This informs the remote to request for next set of intent buffers before doing a send operation. Signed-off-by: Sricharan R Signed-off-by: Bjorn Andersson --- drivers/rpmsg/qcom_glink_native.c | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index b2a583a..b8db74a 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -76,6 +76,8 @@ struct glink_core_rx_intent { bool reuse; bool in_use; u32 offset; + + struct list_head node; }; /** @@ -137,6 +139,8 @@ enum { * @rcid: channel id, in remote space * @intent_lock: lock for protection of @liids * @liids: idr of all local intents + * @intent_work: worker responsible for transmitting rx_done packets + * @done_intents: list of intents that needs to be announced rx_done * @buf: receive buffer, for gathering fragments * @buf_offset: write offset in @buf * @buf_size: size of current @buf @@ -159,6 +163,8 @@ struct glink_channel { spinlock_t intent_lock; struct idr liids; + struct work_struct intent_work; + struct list_head done_intents; struct glink_core_rx_intent *buf; int buf_offset; @@ -178,15 +184,19 @@ struct glink_channel { #define RPM_CMD_CLOSE 3 #define RPM_CMD_OPEN_ACK 4 #define RPM_CMD_INTENT 5 +#define RPM_CMD_RX_DONE 6 #define RPM_CMD_RX_INTENT_REQ 7 #define RPM_CMD_RX_INTENT_REQ_ACK 8 #define RPM_CMD_TX_DATA 9 #define RPM_CMD_CLOSE_ACK 11 #define RPM_CMD_TX_DATA_CONT 12 #define RPM_CMD_READ_NOTIF 13 +#define RPM_CMD_RX_DONE_W_REUSE 14 #define GLINK_FEATURE_INTENTLESS BIT(1) +static void qcom_glink_rx_done_work(struct work_struct *work); + static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink, const char *name) { @@ -198,12 +208,16 @@ static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink, /* Setup glink internal glink_channel data */ spin_lock_init(&channel->recv_lock); + channel->glink = glink; channel->name = kstrdup(name, GFP_KERNEL); init_completion(&channel->open_req); init_completion(&channel->open_ack); + INIT_LIST_HEAD(&channel->done_intents); + INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work); + idr_init(&channel->liids); kref_init(&channel->refcount); @@ -395,6 +409,70 @@ static void qcom_glink_send_close_ack(struct qcom_glink *glink, qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true); } +static void qcom_glink_rx_done_work(struct work_struct *work) +{ + struct glink_channel *channel = container_of(work, struct glink_channel, + intent_work); + struct qcom_glink *glink = channel->glink; + struct glink_core_rx_intent *intent, *tmp; + struct { + u16 id; + u16 lcid; + u32 liid; + } __packed cmd; + + unsigned int cid = channel->lcid; + unsigned int iid; + bool reuse; + unsigned long flags; + + spin_lock_irqsave(&channel->intent_lock, flags); + list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { + list_del(&intent->node); + spin_unlock_irqrestore(&channel->intent_lock, flags); + iid = intent->id; + reuse = intent->reuse; + + cmd.id = reuse ? RPM_CMD_RX_DONE_W_REUSE : RPM_CMD_RX_DONE; + cmd.lcid = cid; + cmd.liid = iid; + + qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); + if (!reuse) { + kfree(intent->data); + kfree(intent); + } + spin_lock_irqsave(&channel->intent_lock, flags); + } + spin_unlock_irqrestore(&channel->intent_lock, flags); +} + +static void qcom_glink_rx_done(struct qcom_glink *glink, + struct glink_channel *channel, + struct glink_core_rx_intent *intent) +{ + /* We don't send RX_DONE to intentless systems */ + if (glink->intentless) { + kfree(intent->data); + kfree(intent); + return; + } + + /* Take it off the tree of receive intents */ + if (!intent->reuse) { + spin_lock(&channel->intent_lock); + idr_remove(&channel->liids, intent->id); + spin_unlock(&channel->intent_lock); + } + + /* Schedule the sending of a rx_done indication */ + spin_lock(&channel->intent_lock); + list_add_tail(&intent->node, &channel->done_intents); + spin_unlock(&channel->intent_lock); + + schedule_work(&channel->intent_work); +} + /** * qcom_glink_receive_version() - receive version/features from remote system * @@ -711,6 +789,8 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) intent->offset = 0; channel->buf = NULL; + + qcom_glink_rx_done(glink, channel, intent); } advance_rx: @@ -1100,6 +1180,9 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) if (WARN(!channel, "close request on unknown channel\n")) return; + /* cancel pending rx_done work */ + cancel_work_sync(&channel->intent_work); + if (channel->rpdev) { strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); chinfo.src = RPMSG_ADDR_ANY;