From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 921623750CC; Tue, 28 Apr 2026 09:09:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777367382; cv=none; b=C9im5YyZPlEG/xa8RdYOutPgSFga4BBBSSXUeQ1M+sFjROBvwVrt9FzVb/avdp9zGLj4zFAQl9x6HaJs5g1QaPjRNYICoA6oP7bhhN5MI3rT0w+aRg1GcchHlIZpUcTk60OL6BbHRSIGJpdFD+ji/8yJ3LaZl5bP0WvEGTZPrD4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777367382; c=relaxed/simple; bh=GYXRskg5/qhVw6pKgiOBBQbsrrMzbFFyDXfTzTPgaDk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SHrY8GJfOwIEhbERISKsYOiS7K1eP0XQL5NJeWpgUYs0x9Q4ySOeMCbFdcLtn22Aox8Y/e99Pvx1DKHQVVvrRzIW6ydt2n3IZQryufzm1/tIdp3U5RnxGxh5dhvLPklwW7fqzTj82LCPmMZRCAyZ4eaWkNXkqmjP2MNbUQwknvY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=M3J/xy85; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="M3J/xy85" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3571F16A3; Tue, 28 Apr 2026 02:09:33 -0700 (PDT) Received: from donnerap.manchester.arm.com (donnerap.manchester.arm.com [10.33.8.81]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 457C83F62B; Tue, 28 Apr 2026 02:09:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1777367378; bh=GYXRskg5/qhVw6pKgiOBBQbsrrMzbFFyDXfTzTPgaDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M3J/xy85dhKh7Ubwxr0HZTOJZjcycpHY/GjRfT5xFMvq3aS3ynre739O87dvswv++ 77I9QiGROugqQ29VlBuvh2G/he2l3dc3GMGnrAb+lMhPT1pWCSI+1327uyadqPEHO8 Bxcj5z3i3jy8uYREpTckFH01KGheaNO442KiJYBs= From: Philip Radford To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, arm-scmi@vger.kernel.org, linux-pm@vger.kernel.org Cc: sudeep.holla@arm.com, james.quinlan@broadcom.com, f.fainelli@gmail.com, vincent.guittot@linaro.org, etienne.carriere@st.com, peng.fan@oss.nxp.com, michal.simek@amd.com, quic_sibis@quicinc.com, dan.carpenter@linaro.org, d-gole@ti.com, souvik.chakravarty@arm.com, Cristian Marussi , Philip Radford Subject: [PATCH v5 01/12] firmware: arm_scmi: Add an optional custom parameter to fastchannel helpers Date: Tue, 28 Apr 2026 10:09:10 +0100 Message-ID: <20260428090922.346069-2-philip.radford@arm.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260428090922.346069-1-philip.radford@arm.com> References: <20260428090922.346069-1-philip.radford@arm.com> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Cristian Marussi Starting from SCMIv4.0 the protocols DESCRIBE_FASTCHANNEL commands allow to specify one additional per-protocol custom field in the outgoing message request in order to, optionally, further narrow down the scope of the fastchannel discovery request; the related message-reply format is instead unchanged. Add an optional custom protocol parameter to the common fastchannel helper so as to enable the caller to choose the kind of message to send based on the detected protocol version. Signed-off-by: Cristian Marussi Signed-off-by: Philip Radford --- drivers/firmware/arm_scmi/driver.c | 12 ++++++++++-- drivers/firmware/arm_scmi/perf.c | 8 ++++---- drivers/firmware/arm_scmi/powercap.c | 8 ++++---- drivers/firmware/arm_scmi/protocols.h | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c index f167194f7cf6..adff81a3d233 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -1872,6 +1872,11 @@ static int scmi_iterator_run(void *iter) struct scmi_msg_get_fc_info { __le32 domain; __le32 message_id; + __le32 custom; +#define MSG_FC_INFO_SZ_EXTENDED \ + (sizeof(struct scmi_msg_get_fc_info)) +#define MSG_FC_INFO_SZ \ + (sizeof(struct scmi_msg_get_fc_info) - sizeof(__le32)) }; struct scmi_msg_resp_desc_fc { @@ -1900,7 +1905,7 @@ struct scmi_msg_resp_desc_fc { static void scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph, u8 describe_id, u32 message_id, u32 valid_size, - u32 domain, void __iomem **p_addr, + u32 domain, u32 *custom, void __iomem **p_addr, struct scmi_fc_db_info **p_db, u32 *rate_limit) { int ret; @@ -1931,13 +1936,16 @@ scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph, } ret = ph->xops->xfer_get_init(ph, describe_id, - sizeof(*info), sizeof(*resp), &t); + custom ? MSG_FC_INFO_SZ_EXTENDED : + MSG_FC_INFO_SZ, sizeof(*resp), &t); if (ret) goto err_out; info = t->tx.buf; info->domain = cpu_to_le32(domain); info->message_id = cpu_to_le32(message_id); + if (custom) + info->custom = cpu_to_le32(*custom); /* * Bail out on error leaving fc_info addresses zeroed; this includes diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c index 4583d02bee1c..7f283f457e02 100644 --- a/drivers/firmware/arm_scmi/perf.c +++ b/drivers/firmware/arm_scmi/perf.c @@ -835,25 +835,25 @@ static void scmi_perf_domain_init_fc(const struct scmi_protocol_handle *ph, return; ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, - PERF_LEVEL_GET, 4, dom->id, + PERF_LEVEL_GET, 4, dom->id, NULL, &fc[PERF_FC_LEVEL].get_addr, NULL, &fc[PERF_FC_LEVEL].rate_limit); ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, - PERF_LIMITS_GET, 8, dom->id, + PERF_LIMITS_GET, 8, dom->id, NULL, &fc[PERF_FC_LIMIT].get_addr, NULL, &fc[PERF_FC_LIMIT].rate_limit); if (dom->info.set_perf) ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, - PERF_LEVEL_SET, 4, dom->id, + PERF_LEVEL_SET, 4, dom->id, NULL, &fc[PERF_FC_LEVEL].set_addr, &fc[PERF_FC_LEVEL].set_db, &fc[PERF_FC_LEVEL].rate_limit); if (dom->set_limits) ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, - PERF_LIMITS_SET, 8, dom->id, + PERF_LIMITS_SET, 8, dom->id, NULL, &fc[PERF_FC_LIMIT].set_addr, &fc[PERF_FC_LIMIT].set_db, &fc[PERF_FC_LIMIT].rate_limit); diff --git a/drivers/firmware/arm_scmi/powercap.c b/drivers/firmware/arm_scmi/powercap.c index ab9733f4458b..22aff71c75e9 100644 --- a/drivers/firmware/arm_scmi/powercap.c +++ b/drivers/firmware/arm_scmi/powercap.c @@ -716,24 +716,24 @@ static void scmi_powercap_domain_init_fc(const struct scmi_protocol_handle *ph, return; ph->hops->fastchannel_init(ph, POWERCAP_DESCRIBE_FASTCHANNEL, - POWERCAP_CAP_SET, 4, domain, + POWERCAP_CAP_SET, 4, domain, NULL, &fc[POWERCAP_FC_CAP].set_addr, &fc[POWERCAP_FC_CAP].set_db, &fc[POWERCAP_FC_CAP].rate_limit); ph->hops->fastchannel_init(ph, POWERCAP_DESCRIBE_FASTCHANNEL, - POWERCAP_CAP_GET, 4, domain, + POWERCAP_CAP_GET, 4, domain, NULL, &fc[POWERCAP_FC_CAP].get_addr, NULL, &fc[POWERCAP_FC_CAP].rate_limit); ph->hops->fastchannel_init(ph, POWERCAP_DESCRIBE_FASTCHANNEL, - POWERCAP_PAI_SET, 4, domain, + POWERCAP_PAI_SET, 4, domain, NULL, &fc[POWERCAP_FC_PAI].set_addr, &fc[POWERCAP_FC_PAI].set_db, &fc[POWERCAP_FC_PAI].rate_limit); ph->hops->fastchannel_init(ph, POWERCAP_DESCRIBE_FASTCHANNEL, - POWERCAP_PAI_GET, 4, domain, + POWERCAP_PAI_GET, 4, domain, NULL, &fc[POWERCAP_FC_PAI].get_addr, NULL, &fc[POWERCAP_FC_PAI].rate_limit); diff --git a/drivers/firmware/arm_scmi/protocols.h b/drivers/firmware/arm_scmi/protocols.h index f51245aca259..e618d3141c95 100644 --- a/drivers/firmware/arm_scmi/protocols.h +++ b/drivers/firmware/arm_scmi/protocols.h @@ -280,7 +280,7 @@ struct scmi_proto_helpers_ops { u32 message_id, u32 *attributes); void (*fastchannel_init)(const struct scmi_protocol_handle *ph, u8 describe_id, u32 message_id, - u32 valid_size, u32 domain, + u32 valid_size, u32 domain, u32 *custom, void __iomem **p_addr, struct scmi_fc_db_info **p_db, u32 *rate_limit); -- 2.47.3