From: Peter Hilber <peter.hilber@opensynergy.com>
To: <linux-arm-kernel@lists.infradead.org>, <devicetree@vger.kernel.org>
Cc: Igor Skalkin <igor.skalkin@opensynergy.com>,
Peter Hilber <peter.hilber@opensynergy.com>,
Rob Herring <robh+dt@kernel.org>, <linux-kernel@vger.kernel.org>,
<sudeep.holla@arm.com>, <souvik.chakravarty@arm.com>,
<alex.bennee@linaro.org>, <jean-philippe@linaro.org>,
<mikhail.golubev@opensynergy.com>,
<anton.yakovlev@opensynergy.com>,
Vasyl Vavrychuk <Vasyl.Vavrychuk@opensynergy.com>,
Andriy Tryshnivskyy <Andriy.Tryshnivskyy@opensynergy.com>,
Cristian Marussi <cristian.marussi@arm.com>
Subject: [RFC PATCH v3 03/12] firmware: arm_scmi: Add op to override max message #
Date: Tue, 11 May 2021 02:20:31 +0200 [thread overview]
Message-ID: <20210511002040.802226-4-peter.hilber@opensynergy.com> (raw)
In-Reply-To: <20210511002040.802226-1-peter.hilber@opensynergy.com>
From: Igor Skalkin <igor.skalkin@opensynergy.com>
The number of simultaneously pending messages that the upcoming
scmi-virtio transport can support depends on the virtio device (SCMI
platform) and can differ for each channel. (The scmi-virtio transport
does only have one tx and at most 1 rx channel.)
Add an optional transport op so that scmi-virtio can report the actual
max message # for each channel type. Respect these new limits.
Reflect that the limit in struct scmi_desc is now only a default any
more.
Signed-off-by: Igor Skalkin <igor.skalkin@opensynergy.com>
[ Peter: Adapted patch for submission to upstream. ]
Co-developed-by: Peter Hilber <peter.hilber@opensynergy.com>
Signed-off-by: Peter Hilber <peter.hilber@opensynergy.com>
---
drivers/firmware/arm_scmi/common.h | 9 ++++--
drivers/firmware/arm_scmi/driver.c | 44 +++++++++++++++++++++---------
2 files changed, 38 insertions(+), 15 deletions(-)
diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
index 961a3c63cc42..13be8dedcd6b 100644
--- a/drivers/firmware/arm_scmi/common.h
+++ b/drivers/firmware/arm_scmi/common.h
@@ -286,6 +286,9 @@ struct scmi_chan_info {
* @chan_available: Callback to check if channel is available or not
* @chan_setup: Callback to allocate and setup a channel
* @chan_free: Callback to free a channel
+ * @get_max_msg: Optional callback to provide max_msg dynamically
+ * @return: Maximum number of messages for the channel type (tx or rx)
+ * that can be pending simultaneously in the system
* @send_message: Callback to send a message
* @mark_txdone: Callback to mark tx as done
* @fetch_response: Callback to fetch response
@@ -298,6 +301,7 @@ struct scmi_transport_ops {
int (*chan_setup)(struct scmi_chan_info *cinfo, struct device *dev,
bool tx);
int (*chan_free)(int id, void *p, void *data);
+ unsigned int (*get_max_msg)(bool tx, struct scmi_chan_info *base_cinfo);
int (*send_message)(struct scmi_chan_info *cinfo,
struct scmi_xfer *xfer);
void (*mark_txdone)(struct scmi_chan_info *cinfo, int ret);
@@ -319,8 +323,9 @@ struct scmi_device *scmi_child_dev_find(struct device *parent,
*
* @ops: Pointer to the transport specific ops structure
* @max_rx_timeout_ms: Timeout for communication with SoC (in Milliseconds)
- * @max_msg: Maximum number of messages that can be pending
- * simultaneously in the system
+ * @max_msg: Maximum number of messages for a channel type (tx or rx) that can
+ * be pending simultaneously in the system. May be overridden by the
+ * get_max_msg op.
* @max_msg_size: Maximum size of data per message that can be handled.
*/
struct scmi_desc {
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 471c5de827c1..b7271f8fd1c7 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -73,11 +73,13 @@ struct scmi_requested_dev {
* Index of this bitmap table is also used for message
* sequence identifier.
* @xfer_lock: Protection for message allocation
+ * @max_msg: Maximum number of messages that can be pending
*/
struct scmi_xfers_info {
struct scmi_xfer *xfer_block;
unsigned long *xfer_alloc_table;
spinlock_t xfer_lock;
+ int max_msg;
};
/**
@@ -224,13 +226,11 @@ static struct scmi_xfer *scmi_xfer_get(const struct scmi_handle *handle,
u16 xfer_id;
struct scmi_xfer *xfer;
unsigned long flags, bit_pos;
- struct scmi_info *info = handle_to_scmi_info(handle);
/* Keep the locked section as small as possible */
spin_lock_irqsave(&minfo->xfer_lock, flags);
- bit_pos = find_first_zero_bit(minfo->xfer_alloc_table,
- info->desc->max_msg);
- if (bit_pos == info->desc->max_msg) {
+ bit_pos = find_first_zero_bit(minfo->xfer_alloc_table, minfo->max_msg);
+ if (bit_pos == minfo->max_msg) {
spin_unlock_irqrestore(&minfo->xfer_lock, flags);
return ERR_PTR(-ENOMEM);
}
@@ -1013,32 +1013,39 @@ int scmi_handle_put(const struct scmi_handle *handle)
}
static int __scmi_xfer_info_init(struct scmi_info *sinfo,
- struct scmi_xfers_info *info)
+ struct scmi_xfers_info *info,
+ bool tx,
+ struct scmi_chan_info *base_cinfo)
{
int i;
struct scmi_xfer *xfer;
struct device *dev = sinfo->dev;
const struct scmi_desc *desc = sinfo->desc;
+ info->max_msg = desc->max_msg;
+
+ if (desc->ops->get_max_msg)
+ info->max_msg = desc->ops->get_max_msg(tx, base_cinfo);
+
/* Pre-allocated messages, no more than what hdr.seq can support */
- if (WARN_ON(desc->max_msg >= MSG_TOKEN_MAX)) {
+ if (WARN_ON(info->max_msg >= MSG_TOKEN_MAX)) {
dev_err(dev, "Maximum message of %d exceeds supported %ld\n",
- desc->max_msg, MSG_TOKEN_MAX);
+ info->max_msg, MSG_TOKEN_MAX);
return -EINVAL;
}
- info->xfer_block = devm_kcalloc(dev, desc->max_msg,
+ info->xfer_block = devm_kcalloc(dev, info->max_msg,
sizeof(*info->xfer_block), GFP_KERNEL);
if (!info->xfer_block)
return -ENOMEM;
- info->xfer_alloc_table = devm_kcalloc(dev, BITS_TO_LONGS(desc->max_msg),
+ info->xfer_alloc_table = devm_kcalloc(dev, BITS_TO_LONGS(info->max_msg),
sizeof(long), GFP_KERNEL);
if (!info->xfer_alloc_table)
return -ENOMEM;
/* Pre-initialize the buffer pointer to pre-allocated buffers */
- for (i = 0, xfer = info->xfer_block; i < desc->max_msg; i++, xfer++) {
+ for (i = 0, xfer = info->xfer_block; i < info->max_msg; i++, xfer++) {
xfer->rx.buf = devm_kcalloc(dev, sizeof(u8), desc->max_msg_size,
GFP_KERNEL);
if (!xfer->rx.buf)
@@ -1055,10 +1062,21 @@ static int __scmi_xfer_info_init(struct scmi_info *sinfo,
static int scmi_xfer_info_init(struct scmi_info *sinfo)
{
- int ret = __scmi_xfer_info_init(sinfo, &sinfo->tx_minfo);
+ int ret;
+ struct scmi_chan_info *base_tx_cinfo;
+ struct scmi_chan_info *base_rx_cinfo;
+
+ base_tx_cinfo = idr_find(&sinfo->tx_idr, SCMI_PROTOCOL_BASE);
+ if (unlikely(!base_tx_cinfo))
+ return -EINVAL;
+
+ ret = __scmi_xfer_info_init(sinfo, &sinfo->tx_minfo, true,
+ base_tx_cinfo);
- if (!ret && idr_find(&sinfo->rx_idr, SCMI_PROTOCOL_BASE))
- ret = __scmi_xfer_info_init(sinfo, &sinfo->rx_minfo);
+ base_rx_cinfo = idr_find(&sinfo->rx_idr, SCMI_PROTOCOL_BASE);
+ if (!ret && base_rx_cinfo)
+ ret = __scmi_xfer_info_init(sinfo, &sinfo->rx_minfo, false,
+ base_rx_cinfo);
return ret;
}
--
2.25.1
next prev parent reply other threads:[~2021-05-11 0:28 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-11 0:20 [RFC PATCH v3 00/12] firmware: arm_scmi: Add virtio transport Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 01/12] firmware: arm_scmi, smccc, mailbox: Make shmem based transports optional Peter Hilber
2021-06-21 4:09 ` Jassi Brar
2021-06-21 8:54 ` Sudeep Holla
2021-06-21 9:01 ` Cristian Marussi
2021-05-11 0:20 ` [RFC PATCH v3 02/12] firmware: arm_scmi: Add transport init/deinit Peter Hilber
2021-05-11 0:20 ` Peter Hilber [this message]
2021-05-11 0:20 ` [RFC PATCH v3 04/12] firmware: arm_scmi: Add optional link_supplier() transport op Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 05/12] firmware: arm_scmi: Add per-device transport private info Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 06/12] firmware: arm_scmi: Add is_scmi_protocol_device() Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 07/12] firmware: arm_scmi: Add msg_handle to some transport ops Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 08/12] firmware: arm_scmi: Add optional drop_message() transport op Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 09/12] firmware: arm_scmi: Add message passing abstractions for transports Peter Hilber
2021-05-11 0:20 ` [RFC PATCH v3 10/12] dt-bindings: arm: Add virtio transport for SCMI Peter Hilber
2021-05-17 21:39 ` Rob Herring
2021-05-11 0:20 ` [RFC PATCH v3 11/12] firmware: arm_scmi: Add virtio transport Peter Hilber
2021-05-18 8:08 ` Cristian Marussi
2021-05-26 14:40 ` Cristian Marussi
2021-06-04 9:19 ` Peter Hilber
2021-06-04 11:56 ` Cristian Marussi
2021-06-01 14:53 ` Vincent Guittot
2021-06-02 8:25 ` Peter Hilber
2021-06-02 8:33 ` Cristian Marussi
2021-06-02 8:34 ` Vincent Guittot
2021-05-11 0:20 ` [RFC PATCH v3 12/12] firmware: arm_scmi: Handle races between core and transport Peter Hilber
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=20210511002040.802226-4-peter.hilber@opensynergy.com \
--to=peter.hilber@opensynergy.com \
--cc=Andriy.Tryshnivskyy@opensynergy.com \
--cc=Vasyl.Vavrychuk@opensynergy.com \
--cc=alex.bennee@linaro.org \
--cc=anton.yakovlev@opensynergy.com \
--cc=cristian.marussi@arm.com \
--cc=devicetree@vger.kernel.org \
--cc=igor.skalkin@opensynergy.com \
--cc=jean-philippe@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mikhail.golubev@opensynergy.com \
--cc=robh+dt@kernel.org \
--cc=souvik.chakravarty@arm.com \
--cc=sudeep.holla@arm.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).