From: "Peng Fan (OSS)" <peng.fan@oss.nxp.com>
To: Sudeep Holla <sudeep.holla@arm.com>,
Cristian Marussi <cristian.marussi@arm.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>
Cc: arm-scmi@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Peng Fan <peng.fan@nxp.com>
Subject: [PATCH 2/2] firmware: arm_scmi: set mailbox timeout value from device tree
Date: Fri, 21 Jun 2024 20:46:58 +0800 [thread overview]
Message-ID: <20240621-scmi-mailbox-v1-v1-2-8ed450735f46@nxp.com> (raw)
In-Reply-To: <20240621-scmi-mailbox-v1-v1-0-8ed450735f46@nxp.com>
From: Peng Fan <peng.fan@nxp.com>
Each platform might have its own maximum mailbox receive channel timeout
value, so get property max-rx-timeout-ms from device tree and use it. If
the property does not exist, use mailbox 'scmi_desc' fixed value 30ms as
before.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
drivers/firmware/arm_scmi/driver.c | 19 ++++++++++++++-----
drivers/firmware/arm_scmi/raw_mode.c | 11 +++++++----
drivers/firmware/arm_scmi/raw_mode.h | 3 ++-
3 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 6b6957f4743f..1aa613d4cb43 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -162,6 +162,7 @@ struct scmi_debug_info {
* @devreq_mtx: A mutex to serialize device creation for this SCMI instance
* @dbg: A pointer to debugfs related data (if any)
* @raw: An opaque reference handle used by SCMI Raw mode.
+ * @max_rx_timeout_ms: the maximum receive channel timeout value
*/
struct scmi_info {
int id;
@@ -188,6 +189,7 @@ struct scmi_info {
struct mutex devreq_mtx;
struct scmi_debug_info *dbg;
void *raw;
+ unsigned int max_rx_timeout_ms;
};
#define handle_to_scmi_info(h) container_of(h, struct scmi_info, handle)
@@ -1302,11 +1304,11 @@ static int scmi_wait_for_message_response(struct scmi_chan_info *cinfo,
trace_scmi_xfer_response_wait(xfer->transfer_id, xfer->hdr.id,
xfer->hdr.protocol_id, xfer->hdr.seq,
- info->desc->max_rx_timeout_ms,
+ info->max_rx_timeout_ms,
xfer->hdr.poll_completion);
return scmi_wait_for_reply(dev, info->desc, cinfo, xfer,
- info->desc->max_rx_timeout_ms);
+ info->max_rx_timeout_ms);
}
/**
@@ -2614,7 +2616,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device_node *of_node,
if (!cinfo)
return -ENOMEM;
- cinfo->rx_timeout_ms = info->desc->max_rx_timeout_ms;
+ cinfo->rx_timeout_ms = info->max_rx_timeout_ms;
/* Create a unique name for this transport device */
snprintf(name, 32, "__scmi_transport_device_%s_%02X",
@@ -2888,7 +2890,7 @@ static struct scmi_debug_info *scmi_debugfs_common_setup(struct scmi_info *info)
debugfs_create_bool("is_atomic", 0400, trans, &dbg->is_atomic);
debugfs_create_u32("max_rx_timeout_ms", 0400, trans,
- (u32 *)&info->desc->max_rx_timeout_ms);
+ (u32 *)&info->max_rx_timeout_ms);
debugfs_create_u32("max_msg_size", 0400, trans,
(u32 *)&info->desc->max_msg_size);
@@ -2940,7 +2942,8 @@ static int scmi_debugfs_raw_mode_setup(struct scmi_info *info)
info->raw = scmi_raw_mode_init(&info->handle, info->dbg->top_dentry,
info->id, channels, num_chans,
- info->desc, info->tx_minfo.max_msg);
+ info->desc, info->tx_minfo.max_msg,
+ info->max_rx_timeout_ms);
if (IS_ERR(info->raw)) {
dev_err(info->dev, "Failed to initialize SCMI RAW Mode !\n");
ret = PTR_ERR(info->raw);
@@ -2953,6 +2956,7 @@ static int scmi_debugfs_raw_mode_setup(struct scmi_info *info)
static int scmi_probe(struct platform_device *pdev)
{
int ret;
+ u32 timeout;
char *err_str = "probe failure\n";
struct scmi_handle *handle;
const struct scmi_desc *desc;
@@ -3002,6 +3006,11 @@ static int scmi_probe(struct platform_device *pdev)
info->atomic_threshold);
handle->is_transport_atomic = scmi_is_transport_atomic;
+ if (!of_property_read_u32(np, "max-rx-timeout-ms", &timeout))
+ info->max_rx_timeout_ms = timeout;
+ else
+ info->max_rx_timeout_ms = info->desc->max_rx_timeout_ms;
+
if (desc->ops->link_supplier) {
ret = desc->ops->link_supplier(dev);
if (ret) {
diff --git a/drivers/firmware/arm_scmi/raw_mode.c b/drivers/firmware/arm_scmi/raw_mode.c
index 130d13e9cd6b..d4f37ee664a2 100644
--- a/drivers/firmware/arm_scmi/raw_mode.c
+++ b/drivers/firmware/arm_scmi/raw_mode.c
@@ -379,7 +379,7 @@ static void scmi_xfer_raw_waiter_enqueue(struct scmi_raw_mode_info *raw,
trace_scmi_xfer_response_wait(rw->xfer->transfer_id, rw->xfer->hdr.id,
rw->xfer->hdr.protocol_id,
rw->xfer->hdr.seq,
- raw->desc->max_rx_timeout_ms,
+ raw->max_rx_timeout_ms,
rw->xfer->hdr.poll_completion);
mutex_lock(&raw->active_mtx);
@@ -437,7 +437,7 @@ static void scmi_xfer_raw_worker(struct work_struct *work)
raw = container_of(work, struct scmi_raw_mode_info, waiters_work);
dev = raw->handle->dev;
- max_tmo = msecs_to_jiffies(raw->desc->max_rx_timeout_ms);
+ max_tmo = msecs_to_jiffies(raw->max_rx_timeout_ms);
do {
int ret = 0;
@@ -574,7 +574,7 @@ static int scmi_xfer_raw_get_init(struct scmi_raw_mode_info *raw, void *buf,
dev_dbg(dev,
"...retrying[%d] inflight registration\n",
retry);
- msleep(raw->desc->max_rx_timeout_ms /
+ msleep(raw->max_rx_timeout_ms /
SCMI_XFER_RAW_MAX_RETRIES);
}
} while (ret && --retry);
@@ -1162,6 +1162,7 @@ static int scmi_raw_mode_setup(struct scmi_raw_mode_info *raw,
* @num_chans: The number of entries in @channels
* @desc: Reference to the transport operations
* @tx_max_msg: Max number of in-flight messages allowed by the transport
+ * @max_rx_timeout_ms: Max receive channel timeout value
*
* This function prepare the SCMI Raw stack and creates the debugfs API.
*
@@ -1170,7 +1171,8 @@ static int scmi_raw_mode_setup(struct scmi_raw_mode_info *raw,
void *scmi_raw_mode_init(const struct scmi_handle *handle,
struct dentry *top_dentry, int instance_id,
u8 *channels, int num_chans,
- const struct scmi_desc *desc, int tx_max_msg)
+ const struct scmi_desc *desc, int tx_max_msg,
+ u32 max_rx_timeout_ms)
{
int ret;
struct scmi_raw_mode_info *raw;
@@ -1188,6 +1190,7 @@ void *scmi_raw_mode_init(const struct scmi_handle *handle,
raw->desc = desc;
raw->tx_max_msg = tx_max_msg;
raw->id = instance_id;
+ raw->max_rx_timeout_ms = max_rx_timeout_ms;
ret = scmi_raw_mode_setup(raw, channels, num_chans);
if (ret) {
diff --git a/drivers/firmware/arm_scmi/raw_mode.h b/drivers/firmware/arm_scmi/raw_mode.h
index 8af756a83fd1..25d4a46261e7 100644
--- a/drivers/firmware/arm_scmi/raw_mode.h
+++ b/drivers/firmware/arm_scmi/raw_mode.h
@@ -20,7 +20,8 @@ enum {
void *scmi_raw_mode_init(const struct scmi_handle *handle,
struct dentry *top_dentry, int instance_id,
u8 *channels, int num_chans,
- const struct scmi_desc *desc, int tx_max_msg);
+ const struct scmi_desc *desc, int tx_max_msg,
+ u32 max_rx_timeout_ms);
void scmi_raw_mode_cleanup(void *raw);
void scmi_raw_message_report(void *raw, struct scmi_xfer *xfer,
--
2.37.1
next prev parent reply other threads:[~2024-06-21 12:38 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-21 12:46 [PATCH 0/2] firmware: arm_scmi: introduce max-rx-timeout-ms property Peng Fan (OSS)
2024-06-21 12:46 ` [PATCH 1/2] dt-bindings: firmware: arm,scmi: introduce property mbox-rx-timeout-ms Peng Fan (OSS)
2024-06-27 21:46 ` Rob Herring
2024-06-27 23:17 ` Peng Fan
2024-07-01 9:06 ` Sudeep Holla
2024-07-01 12:41 ` Peng Fan
2024-06-21 12:46 ` Peng Fan (OSS) [this message]
2024-06-28 2:59 ` [PATCH 2/2] firmware: arm_scmi: set mailbox timeout value from device tree kernel test robot
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=20240621-scmi-mailbox-v1-v1-2-8ed450735f46@nxp.com \
--to=peng.fan@oss.nxp.com \
--cc=arm-scmi@vger.kernel.org \
--cc=conor+dt@kernel.org \
--cc=cristian.marussi@arm.com \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peng.fan@nxp.com \
--cc=robh@kernel.org \
--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).