| From 7873482a98850173d8244fae7c90f98863b42d68 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 17 Aug 2022 18:27:30 +0100 |
| Subject: firmware: arm_scmi: Fix the asynchronous reset requests |
| |
| From: Cristian Marussi <cristian.marussi@arm.com> |
| |
| [ Upstream commit b75c83d9b961fd3abf7310f8d36d5e6e9f573efb ] |
| |
| SCMI Reset protocol specification allows the asynchronous reset request |
| only when an autonomous reset action is specified. Reset requests based |
| on explicit assert/deassert of signals should not be served |
| asynchronously. |
| |
| Current implementation will instead issue an asynchronous request in any |
| case, as long as the reset domain had advertised to support asynchronous |
| resets. |
| |
| Avoid requesting the asynchronous resets when the reset action is not |
| of the autonomous type, even if the target reset domain does, in general, |
| support the asynchronous requests. |
| |
| Link: https://lore.kernel.org/r/20220817172731.1185305-6-cristian.marussi@arm.com |
| Fixes: 95a15d80aa0d ("firmware: arm_scmi: Add RESET protocol in SCMI v2.0") |
| Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> |
| Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/firmware/arm_scmi/reset.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c |
| index fc6237d6e926..e80a78205845 100644 |
| --- a/drivers/firmware/arm_scmi/reset.c |
| +++ b/drivers/firmware/arm_scmi/reset.c |
| @@ -158,7 +158,7 @@ static int scmi_domain_reset(const struct scmi_protocol_handle *ph, u32 domain, |
| return -EINVAL; |
| |
| rdom = pi->dom_info + domain; |
| - if (rdom->async_reset) |
| + if (rdom->async_reset && flags & AUTONOMOUS_RESET) |
| flags |= ASYNCHRONOUS_RESET; |
| |
| ret = ph->xops->xfer_get_init(ph, RESET, sizeof(*dom), 0, &t); |
| @@ -170,7 +170,7 @@ static int scmi_domain_reset(const struct scmi_protocol_handle *ph, u32 domain, |
| dom->flags = cpu_to_le32(flags); |
| dom->reset_state = cpu_to_le32(state); |
| |
| - if (rdom->async_reset) |
| + if (flags & ASYNCHRONOUS_RESET) |
| ret = ph->xops->do_xfer_with_response(ph, t); |
| else |
| ret = ph->xops->do_xfer(ph, t); |
| -- |
| 2.35.1 |
| |