All of lore.kernel.org
 help / color / mirror / Atom feed
From: Elliot Berman <quic_eberman@quicinc.com>
To: Bjorn Andersson <quic_bjorande@quicinc.com>,
	Jassi Brar <jassisinghbrar@gmail.com>
Cc: Elliot Berman <quic_eberman@quicinc.com>,
	Murali Nalajala <quic_mnalajal@quicinc.com>,
	Trilok Soni <quic_tsoni@quicinc.com>,
	"Srivatsa Vaddagiri" <quic_svaddagi@quicinc.com>,
	Carl van Schaik <quic_cvanscha@quicinc.com>,
	Andy Gross <agross@kernel.org>,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	<linux-arm-kernel@lists.infradead.org>,
	"Mark Rutland" <mark.rutland@arm.com>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Sudeep Holla <sudeep.holla@arm.com>,
	"Marc Zyngier" <maz@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	Jonathan Corbet <corbet@lwn.net>, Will Deacon <will@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	<devicetree@vger.kernel.org>, <linux-doc@vger.kernel.org>,
	<linux-arm-msm@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH v4 07/14] mailbox: Allow direct registration to a channel
Date: Wed, 28 Sep 2022 12:56:26 -0700	[thread overview]
Message-ID: <20220928195633.2348848-8-quic_eberman@quicinc.com> (raw)
In-Reply-To: <20220928195633.2348848-1-quic_eberman@quicinc.com>

Support virtual mailbox controllers and clients which are not platform
devices or come from the devicetree by allowing them to match client to
channel via some other mechanism.

Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
 drivers/mailbox/mailbox.c      | 96 ++++++++++++++++++++++++----------
 include/linux/mailbox_client.h |  1 +
 2 files changed, 69 insertions(+), 28 deletions(-)

diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index 4229b9b5da98..adf36c05fa43 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -317,6 +317,71 @@ int mbox_flush(struct mbox_chan *chan, unsigned long timeout)
 }
 EXPORT_SYMBOL_GPL(mbox_flush);
 
+static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
+{
+	struct device *dev = cl->dev;
+	unsigned long flags;
+	int ret;
+
+	if (chan->cl || !try_module_get(chan->mbox->dev->driver->owner)) {
+		dev_dbg(dev, "%s: mailbox not free\n", __func__);
+		return -EBUSY;
+	}
+
+	spin_lock_irqsave(&chan->lock, flags);
+	chan->msg_free = 0;
+	chan->msg_count = 0;
+	chan->active_req = NULL;
+	chan->cl = cl;
+	init_completion(&chan->tx_complete);
+
+	if (chan->txdone_method	== TXDONE_BY_POLL && cl->knows_txdone)
+		chan->txdone_method = TXDONE_BY_ACK;
+
+	spin_unlock_irqrestore(&chan->lock, flags);
+
+	if (chan->mbox->ops->startup) {
+		ret = chan->mbox->ops->startup(chan);
+
+		if (ret) {
+			dev_err(dev, "Unable to startup the chan (%d)\n", ret);
+			mbox_free_channel(chan);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+/**
+ * mbox_bind_client - Request a mailbox channel.
+ * @chan: The mailbox channel to bind the client to.
+ * @cl: Identity of the client requesting the channel.
+ *
+ * The Client specifies its requirements and capabilities while asking for
+ * a mailbox channel. It can't be called from atomic context.
+ * The channel is exclusively allocated and can't be used by another
+ * client before the owner calls mbox_free_channel.
+ * After assignment, any packet received on this channel will be
+ * handed over to the client via the 'rx_callback'.
+ * The framework holds reference to the client, so the mbox_client
+ * structure shouldn't be modified until the mbox_free_channel returns.
+ *
+ * Return: 0 if the channel was assigned to the client successfully.
+ *         <0 for request failure.
+ */
+int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
+{
+	int ret;
+
+	mutex_lock(&con_mutex);
+	ret = __mbox_bind_client(chan, cl);
+	mutex_unlock(&con_mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(mbox_bind_client);
+
 /**
  * mbox_request_channel - Request a mailbox channel.
  * @cl: Identity of the client requesting the channel.
@@ -340,7 +405,6 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
 	struct mbox_controller *mbox;
 	struct of_phandle_args spec;
 	struct mbox_chan *chan;
-	unsigned long flags;
 	int ret;
 
 	if (!dev || !dev->of_node) {
@@ -372,33 +436,9 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
 		return chan;
 	}
 
-	if (chan->cl || !try_module_get(mbox->dev->driver->owner)) {
-		dev_dbg(dev, "%s: mailbox not free\n", __func__);
-		mutex_unlock(&con_mutex);
-		return ERR_PTR(-EBUSY);
-	}
-
-	spin_lock_irqsave(&chan->lock, flags);
-	chan->msg_free = 0;
-	chan->msg_count = 0;
-	chan->active_req = NULL;
-	chan->cl = cl;
-	init_completion(&chan->tx_complete);
-
-	if (chan->txdone_method	== TXDONE_BY_POLL && cl->knows_txdone)
-		chan->txdone_method = TXDONE_BY_ACK;
-
-	spin_unlock_irqrestore(&chan->lock, flags);
-
-	if (chan->mbox->ops->startup) {
-		ret = chan->mbox->ops->startup(chan);
-
-		if (ret) {
-			dev_err(dev, "Unable to startup the chan (%d)\n", ret);
-			mbox_free_channel(chan);
-			chan = ERR_PTR(ret);
-		}
-	}
+	ret = __mbox_bind_client(chan, cl);
+	if (ret)
+		chan = ERR_PTR(ret);
 
 	mutex_unlock(&con_mutex);
 	return chan;
diff --git a/include/linux/mailbox_client.h b/include/linux/mailbox_client.h
index 65229a45590f..734694912ef7 100644
--- a/include/linux/mailbox_client.h
+++ b/include/linux/mailbox_client.h
@@ -37,6 +37,7 @@ struct mbox_client {
 	void (*tx_done)(struct mbox_client *cl, void *mssg, int r);
 };
 
+int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl);
 struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl,
 					      const char *name);
 struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index);
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Elliot Berman <quic_eberman@quicinc.com>
To: Bjorn Andersson <quic_bjorande@quicinc.com>,
	Jassi Brar <jassisinghbrar@gmail.com>
Cc: Elliot Berman <quic_eberman@quicinc.com>,
	Murali Nalajala <quic_mnalajal@quicinc.com>,
	Trilok Soni <quic_tsoni@quicinc.com>,
	"Srivatsa Vaddagiri" <quic_svaddagi@quicinc.com>,
	Carl van Schaik <quic_cvanscha@quicinc.com>,
	Andy Gross <agross@kernel.org>,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	<linux-arm-kernel@lists.infradead.org>,
	"Mark Rutland" <mark.rutland@arm.com>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Sudeep Holla <sudeep.holla@arm.com>,
	"Marc Zyngier" <maz@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	Jonathan Corbet <corbet@lwn.net>, Will Deacon <will@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	<devicetree@vger.kernel.org>, <linux-doc@vger.kernel.org>,
	<linux-arm-msm@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH v4 07/14] mailbox: Allow direct registration to a channel
Date: Wed, 28 Sep 2022 12:56:26 -0700	[thread overview]
Message-ID: <20220928195633.2348848-8-quic_eberman@quicinc.com> (raw)
In-Reply-To: <20220928195633.2348848-1-quic_eberman@quicinc.com>

Support virtual mailbox controllers and clients which are not platform
devices or come from the devicetree by allowing them to match client to
channel via some other mechanism.

Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
 drivers/mailbox/mailbox.c      | 96 ++++++++++++++++++++++++----------
 include/linux/mailbox_client.h |  1 +
 2 files changed, 69 insertions(+), 28 deletions(-)

diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index 4229b9b5da98..adf36c05fa43 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -317,6 +317,71 @@ int mbox_flush(struct mbox_chan *chan, unsigned long timeout)
 }
 EXPORT_SYMBOL_GPL(mbox_flush);
 
+static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
+{
+	struct device *dev = cl->dev;
+	unsigned long flags;
+	int ret;
+
+	if (chan->cl || !try_module_get(chan->mbox->dev->driver->owner)) {
+		dev_dbg(dev, "%s: mailbox not free\n", __func__);
+		return -EBUSY;
+	}
+
+	spin_lock_irqsave(&chan->lock, flags);
+	chan->msg_free = 0;
+	chan->msg_count = 0;
+	chan->active_req = NULL;
+	chan->cl = cl;
+	init_completion(&chan->tx_complete);
+
+	if (chan->txdone_method	== TXDONE_BY_POLL && cl->knows_txdone)
+		chan->txdone_method = TXDONE_BY_ACK;
+
+	spin_unlock_irqrestore(&chan->lock, flags);
+
+	if (chan->mbox->ops->startup) {
+		ret = chan->mbox->ops->startup(chan);
+
+		if (ret) {
+			dev_err(dev, "Unable to startup the chan (%d)\n", ret);
+			mbox_free_channel(chan);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+/**
+ * mbox_bind_client - Request a mailbox channel.
+ * @chan: The mailbox channel to bind the client to.
+ * @cl: Identity of the client requesting the channel.
+ *
+ * The Client specifies its requirements and capabilities while asking for
+ * a mailbox channel. It can't be called from atomic context.
+ * The channel is exclusively allocated and can't be used by another
+ * client before the owner calls mbox_free_channel.
+ * After assignment, any packet received on this channel will be
+ * handed over to the client via the 'rx_callback'.
+ * The framework holds reference to the client, so the mbox_client
+ * structure shouldn't be modified until the mbox_free_channel returns.
+ *
+ * Return: 0 if the channel was assigned to the client successfully.
+ *         <0 for request failure.
+ */
+int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
+{
+	int ret;
+
+	mutex_lock(&con_mutex);
+	ret = __mbox_bind_client(chan, cl);
+	mutex_unlock(&con_mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(mbox_bind_client);
+
 /**
  * mbox_request_channel - Request a mailbox channel.
  * @cl: Identity of the client requesting the channel.
@@ -340,7 +405,6 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
 	struct mbox_controller *mbox;
 	struct of_phandle_args spec;
 	struct mbox_chan *chan;
-	unsigned long flags;
 	int ret;
 
 	if (!dev || !dev->of_node) {
@@ -372,33 +436,9 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
 		return chan;
 	}
 
-	if (chan->cl || !try_module_get(mbox->dev->driver->owner)) {
-		dev_dbg(dev, "%s: mailbox not free\n", __func__);
-		mutex_unlock(&con_mutex);
-		return ERR_PTR(-EBUSY);
-	}
-
-	spin_lock_irqsave(&chan->lock, flags);
-	chan->msg_free = 0;
-	chan->msg_count = 0;
-	chan->active_req = NULL;
-	chan->cl = cl;
-	init_completion(&chan->tx_complete);
-
-	if (chan->txdone_method	== TXDONE_BY_POLL && cl->knows_txdone)
-		chan->txdone_method = TXDONE_BY_ACK;
-
-	spin_unlock_irqrestore(&chan->lock, flags);
-
-	if (chan->mbox->ops->startup) {
-		ret = chan->mbox->ops->startup(chan);
-
-		if (ret) {
-			dev_err(dev, "Unable to startup the chan (%d)\n", ret);
-			mbox_free_channel(chan);
-			chan = ERR_PTR(ret);
-		}
-	}
+	ret = __mbox_bind_client(chan, cl);
+	if (ret)
+		chan = ERR_PTR(ret);
 
 	mutex_unlock(&con_mutex);
 	return chan;
diff --git a/include/linux/mailbox_client.h b/include/linux/mailbox_client.h
index 65229a45590f..734694912ef7 100644
--- a/include/linux/mailbox_client.h
+++ b/include/linux/mailbox_client.h
@@ -37,6 +37,7 @@ struct mbox_client {
 	void (*tx_done)(struct mbox_client *cl, void *mssg, int r);
 };
 
+int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl);
 struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl,
 					      const char *name);
 struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index);
-- 
2.25.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2022-09-28 19:57 UTC|newest]

Thread overview: 102+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-28 19:56 [PATCH v4 00/14] Drivers for gunyah hypervisor Elliot Berman
2022-09-28 19:56 ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 01/14] docs: gunyah: Introduce Gunyah Hypervisor Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-29  3:43   ` Bagas Sanjaya
2022-09-29  3:43     ` Bagas Sanjaya
2022-09-29  4:02     ` Elliot Berman
2022-09-29  4:02       ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 02/14] dt-bindings: Add binding for gunyah hypervisor Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 03/14] gunyah: Common types and error codes for Gunyah hypercalls Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 04/14] arm64: smccc: Include alternative-macros.h Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 05/14] virt: gunyah: Add hypercalls to identify Gunyah Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 06/14] virt: gunyah: Add sysfs nodes Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-30 12:09   ` Greg Kroah-Hartman
2022-09-30 12:09     ` Greg Kroah-Hartman
2022-10-04 23:50     ` Elliot Berman
2022-10-04 23:50       ` Elliot Berman
2022-10-05  6:23       ` Greg Kroah-Hartman
2022-10-05  6:23         ` Greg Kroah-Hartman
2022-09-28 19:56 ` Elliot Berman [this message]
2022-09-28 19:56   ` [PATCH v4 07/14] mailbox: Allow direct registration to a channel Elliot Berman
2022-09-28 19:56 ` [PATCH v4 08/14] virt: gunyah: msgq: Add hypercalls to send and receive messages Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 09/14] mailbox: Add Gunyah message queue mailbox Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-29 16:59   ` Bjorn Andersson
2022-09-29 16:59     ` Bjorn Andersson
2022-09-29 17:37     ` Jassi Brar
2022-09-29 17:37       ` Jassi Brar
2022-09-28 19:56 ` [PATCH v4 10/14] gunyah: sysfs: Add node to describe supported features Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-29  7:36   ` Joe Perches
2022-09-29  7:36     ` Joe Perches
2022-09-29 20:47     ` Elliot Berman
2022-09-29 20:47       ` Elliot Berman
2022-10-02 23:30     ` Jeff Johnson
2022-10-02 23:30       ` Jeff Johnson
2022-10-02 23:58       ` Joe Perches
2022-10-02 23:58         ` Joe Perches
2022-09-30 12:06   ` Greg Kroah-Hartman
2022-09-30 12:06     ` Greg Kroah-Hartman
2022-10-04 23:53     ` Elliot Berman
2022-10-04 23:53       ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 11/14] gunyah: rsc_mgr: Add resource manager RPC core Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-28 19:56 ` [PATCH v4 12/14] gunyah: rsc_mgr: Add RPC for console services Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-30 12:22   ` Greg Kroah-Hartman
2022-09-30 12:22     ` Greg Kroah-Hartman
2022-10-03  1:46     ` new checkpatch flexible array test ? (was Re: [PATCH v4 12/14] gunyah: rsc_mgr: Add RPC for console services) Joe Perches
2022-10-03  1:46       ` Joe Perches
2022-10-03  5:29       ` Greg Kroah-Hartman
2022-10-03  5:29         ` Greg Kroah-Hartman
2022-10-03  5:38         ` Joe Perches
2022-10-03  5:38           ` Joe Perches
2022-10-31 18:23           ` Gustavo A. R. Silva
2022-10-31 18:23             ` Gustavo A. R. Silva
2022-09-28 19:56 ` [PATCH v4 13/14] gunyah: rsc_mgr: Add auxiliary devices for console Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-30 12:19   ` Greg Kroah-Hartman
2022-09-30 12:19     ` Greg Kroah-Hartman
2022-10-04 23:49     ` Elliot Berman
2022-10-04 23:49       ` Elliot Berman
2022-10-05  6:21       ` Greg Kroah-Hartman
2022-10-05  6:21         ` Greg Kroah-Hartman
2022-10-05 21:47         ` Elliot Berman
2022-10-05 21:47           ` Elliot Berman
2022-10-06  6:28           ` Greg Kroah-Hartman
2022-10-06  6:28             ` Greg Kroah-Hartman
2022-09-28 19:56 ` [PATCH v4 14/14] tty: gunyah: Add tty console driver for RM Console Services Elliot Berman
2022-09-28 19:56   ` Elliot Berman
2022-09-30 12:17   ` Greg Kroah-Hartman
2022-09-30 12:17     ` Greg Kroah-Hartman
2022-10-07  5:59     ` Elliot Berman
2022-10-07  5:59       ` Elliot Berman
2022-10-07  7:40       ` Greg Kroah-Hartman
2022-10-07  7:40         ` Greg Kroah-Hartman
2022-10-09 20:59         ` Elliot Berman
2022-10-09 20:59           ` Elliot Berman
2022-10-10 20:23           ` Greg Kroah-Hartman
2022-10-10 20:23             ` Greg Kroah-Hartman
2022-10-10 20:58             ` Elliot Berman
2022-10-10 20:58               ` Elliot Berman
2022-10-11  6:22               ` Greg Kroah-Hartman
2022-10-11  6:22                 ` Greg Kroah-Hartman
2022-10-11 22:04                 ` Elliot Berman
2022-10-11 22:04                   ` Elliot Berman
2022-10-12  6:53                   ` Greg Kroah-Hartman
2022-10-12  6:53                     ` Greg Kroah-Hartman
2022-10-08  7:41     ` Zhou Furong
2022-10-08  7:41       ` Zhou Furong
2022-10-08  9:52       ` Greg Kroah-Hartman
2022-10-08  9:52         ` Greg Kroah-Hartman
2022-10-03  7:01   ` Jiri Slaby
2022-10-03  7:01     ` Jiri Slaby
2022-10-10 18:06     ` Elliot Berman
2022-10-10 18:06       ` Elliot Berman

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=20220928195633.2348848-8-quic_eberman@quicinc.com \
    --to=quic_eberman@quicinc.com \
    --cc=agross@kernel.org \
    --cc=arnd@arndb.de \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jassisinghbrar@gmail.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=maz@kernel.org \
    --cc=quic_bjorande@quicinc.com \
    --cc=quic_cvanscha@quicinc.com \
    --cc=quic_mnalajal@quicinc.com \
    --cc=quic_svaddagi@quicinc.com \
    --cc=quic_tsoni@quicinc.com \
    --cc=robh+dt@kernel.org \
    --cc=sudeep.holla@arm.com \
    --cc=will@kernel.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.