From nobody Wed Dec 17 12:19:45 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E65F019596F; Wed, 10 Jul 2024 17:32:41 +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=1720632763; cv=none; b=RHzhcJ6maSYACq6zznkrdz0J5n5+JtdX/g5bD+v1K2KY8jGPriIqHUvUJfyDaOx4ZrN40ruwl3Gap30i1ily4ojIcX1fOlAV3EyiYBPI3J1AgcWumAQLNcb3L6S9qWNZe4ryKN9jmhrclWxN2zLDDJqVeZ4vPdBlJw3vFf9eqBE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720632763; c=relaxed/simple; bh=PfJDwgZTwNcazMQE3BP9zpZ2rHTdN9OwVLAKpv3mw6A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L0F1VLFHPC0YN/+OlDjaqrYvh9tfUUnBGsseSf6iQmmraM3E4v7Vidumu1uAD21nxeV49VhTkahodVMRiWbzUnRIXMnHvex0wl6od027DqfLPeMzu7zm0CONEUFcvBNnSJk7IaOq8qOfEgMsENRUwrGXI0p5a2u7NEif+rg5jl8= 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; 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 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 7FAE61063; Wed, 10 Jul 2024 10:33:06 -0700 (PDT) Received: from pluto.guestnet.cambridge.arm.com (usa-sjc-mx-foss1.foss.arm.com [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B34163F766; Wed, 10 Jul 2024 10:32:38 -0700 (PDT) From: Cristian Marussi To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, arm-scmi@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, quic_nkela@quicinc.com, ptosi@google.com, dan.carpenter@linaro.org, souvik.chakravarty@arm.com, Cristian Marussi Subject: [PATCH v2 8/8] firmware: arm_scmi: Remove legacy transport-layer code Date: Wed, 10 Jul 2024 18:31:53 +0100 Message-ID: <20240710173153.4060457-9-cristian.marussi@arm.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240710173153.4060457-1-cristian.marussi@arm.com> References: <20240710173153.4060457-1-cristian.marussi@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Since all SCMI transports have been made standalone drivers, remove all the core SCMI stack legacy support that was needed to run transports as built into the stack. Signed-off-by: Cristian Marussi --- drivers/firmware/arm_scmi/common.h | 18 ------ drivers/firmware/arm_scmi/driver.c | 96 ++++-------------------------- drivers/firmware/arm_scmi/msg.c | 2 +- drivers/firmware/arm_scmi/shmem.c | 2 +- 4 files changed, 15 insertions(+), 103 deletions(-) diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi= /common.h index 28d52b9102c3..0a31d3b2f2c2 100644 --- a/drivers/firmware/arm_scmi/common.h +++ b/drivers/firmware/arm_scmi/common.h @@ -183,7 +183,6 @@ struct scmi_chan_info { /** * struct scmi_transport_ops - Structure representing a SCMI transport ops * - * @link_supplier: Optional callback to add link to a supplier device * @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 @@ -198,7 +197,6 @@ struct scmi_chan_info { * @poll_done: Callback to poll transfer status */ struct scmi_transport_ops { - int (*link_supplier)(struct device *dev); bool (*chan_available)(struct device_node *of_node, int idx); int (*chan_setup)(struct scmi_chan_info *cinfo, struct device *dev, bool tx); @@ -219,12 +217,6 @@ struct scmi_transport_ops { /** * struct scmi_desc - Description of SoC integration * - * @transport_init: An optional function that a transport can provide to - * initialize some transport-specific setup during SCMI core - * initialization, so ahead of SCMI core probing. - * @transport_exit: An optional function that a transport can provide to - * de-initialize some transport-specific setup during SCMI core - * de-initialization, so after SCMI core removal. * @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 for a channel type (tx or rx) that= can @@ -245,8 +237,6 @@ struct scmi_transport_ops { * when requested. */ struct scmi_desc { - int (*transport_init)(void); - void (*transport_exit)(void); const struct scmi_transport_ops *ops; int max_rx_timeout_ms; int max_msg; @@ -287,8 +277,6 @@ int scmi_xfer_raw_wait_for_message_response(struct scmi= _chan_info *cinfo, struct scmi_xfer *xfer, unsigned int timeout_ms); =20 -void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *pri= v); - enum scmi_bad_msg { MSG_UNEXPECTED =3D -1, MSG_INVALID =3D -2, @@ -297,9 +285,6 @@ enum scmi_bad_msg { MSG_MBOX_SPURIOUS =3D -5, }; =20 -void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_hdr, - enum scmi_bad_msg err); - /* shmem related declarations */ struct scmi_shared_mem; =20 @@ -448,9 +433,6 @@ static struct platform_driver __trans##_driver =3D { \ .remove_new =3D __trans##_remove, \ } =20 -extern const struct scmi_shared_mem_operations scmi_shmem_ops; -extern const struct scmi_message_operations scmi_msg_ops; - void scmi_notification_instance_data_set(const struct scmi_handle *handle, void *priv); void *scmi_notification_instance_data_get(const struct scmi_handle *handle= ); diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi= /driver.c index 2a1f87c97abe..ea0595193dec 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -194,6 +194,11 @@ struct scmi_info { #define bus_nb_to_scmi_info(nb) container_of(nb, struct scmi_info, bus_nb) #define req_nb_to_scmi_info(nb) container_of(nb, struct scmi_info, dev_req= _nb) =20 +static void scmi_rx_callback(struct scmi_chan_info *cinfo, + u32 msg_hdr, void *priv); +static void scmi_bad_message_trace(struct scmi_chan_info *cinfo, + u32 msg_hdr, enum scmi_bad_msg err); + static struct scmi_transport_core_operations scmi_trans_core_ops =3D { .bad_message_trace =3D scmi_bad_message_trace, .rx_callback =3D scmi_rx_callback, @@ -838,8 +843,8 @@ scmi_xfer_lookup_unlocked(struct scmi_xfers_info *minfo= , u16 xfer_id) * timed-out message that arrives and as such, can be traced only referrin= g to * the header content, since the payload is missing/unreliable. */ -void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_hdr, - enum scmi_bad_msg err) +static void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_h= dr, + enum scmi_bad_msg err) { char *tag; struct scmi_info *info =3D handle_to_scmi_info(cinfo->handle); @@ -1165,7 +1170,8 @@ static void scmi_handle_response(struct scmi_chan_inf= o *cinfo, * NOTE: This function will be invoked in IRQ context, hence should be * as optimal as possible. */ -void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *pri= v) +static void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, + void *priv) { u8 msg_type =3D MSG_XTRACT_TYPE(msg_hdr); =20 @@ -2988,14 +2994,11 @@ static int scmi_probe(struct platform_device *pdev) struct device *dev =3D &pdev->dev; struct device_node *child, *np =3D dev->of_node; =20 - desc =3D of_device_get_match_data(dev); + desc =3D scmi_transport_lookup(dev); if (!desc) { - desc =3D scmi_transport_lookup(dev); - if (!desc) { - err_str =3D "transport invalid\n"; - ret =3D -EINVAL; - goto out_err; - } + err_str =3D "transport invalid\n"; + ret =3D -EINVAL; + goto out_err; } =20 info =3D devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); @@ -3035,14 +3038,6 @@ static int scmi_probe(struct platform_device *pdev) info->atomic_threshold); handle->is_transport_atomic =3D scmi_is_transport_atomic; =20 - if (desc->ops->link_supplier) { - ret =3D desc->ops->link_supplier(dev); - if (ret) { - err_str =3D "transport not ready\n"; - goto clear_ida; - } - } - /* Setup all channels described in the DT at first */ ret =3D scmi_channels_setup(info); if (ret) { @@ -3249,72 +3244,16 @@ static struct attribute *versions_attrs[] =3D { }; ATTRIBUTE_GROUPS(versions); =20 -/* Each compatible listed below must have descriptor associated with it */ -static const struct of_device_id scmi_of_match[] =3D { - { /* Sentinel */ }, -}; - -MODULE_DEVICE_TABLE(of, scmi_of_match); - static struct platform_driver scmi_driver =3D { .driver =3D { .name =3D "arm-scmi", .suppress_bind_attrs =3D true, - .of_match_table =3D scmi_of_match, .dev_groups =3D versions_groups, }, .probe =3D scmi_probe, .remove_new =3D scmi_remove, }; =20 -/** - * __scmi_transports_setup - Common helper to call transport-specific - * .init/.exit code if provided. - * - * @init: A flag to distinguish between init and exit. - * - * Note that, if provided, we invoke .init/.exit functions for all the - * transports currently compiled in. - * - * Return: 0 on Success. - */ -static inline int __scmi_transports_setup(bool init) -{ - int ret =3D 0; - const struct of_device_id *trans; - - for (trans =3D scmi_of_match; trans->data; trans++) { - const struct scmi_desc *tdesc =3D trans->data; - - if ((init && !tdesc->transport_init) || - (!init && !tdesc->transport_exit)) - continue; - - if (init) - ret =3D tdesc->transport_init(); - else - tdesc->transport_exit(); - - if (ret) { - pr_err("SCMI transport %s FAILED initialization!\n", - trans->compatible); - break; - } - } - - return ret; -} - -static int __init scmi_transports_init(void) -{ - return __scmi_transports_setup(true); -} - -static void __exit scmi_transports_exit(void) -{ - __scmi_transports_setup(false); -} - static struct dentry *scmi_debugfs_init(void) { struct dentry *d; @@ -3330,17 +3269,10 @@ static struct dentry *scmi_debugfs_init(void) =20 static int __init scmi_driver_init(void) { - int ret; - /* Bail out if no SCMI transport was configured */ if (WARN_ON(!IS_ENABLED(CONFIG_ARM_SCMI_HAVE_TRANSPORT))) return -EINVAL; =20 - /* Initialize any compiled-in transport which provided an init/exit */ - ret =3D scmi_transports_init(); - if (ret) - return ret; - if (IS_ENABLED(CONFIG_ARM_SCMI_HAVE_SHMEM)) scmi_trans_core_ops.shmem =3D scmi_shared_mem_operations_get(); =20 @@ -3380,8 +3312,6 @@ static void __exit scmi_driver_exit(void) scmi_powercap_unregister(); scmi_pinctrl_unregister(); =20 - scmi_transports_exit(); - platform_driver_unregister(&scmi_driver); =20 debugfs_remove_recursive(scmi_top_dentry); diff --git a/drivers/firmware/arm_scmi/msg.c b/drivers/firmware/arm_scmi/ms= g.c index 0bed1d2825af..ca916817878d 100644 --- a/drivers/firmware/arm_scmi/msg.c +++ b/drivers/firmware/arm_scmi/msg.c @@ -110,7 +110,7 @@ static void msg_fetch_notification(struct scmi_msg_payl= d *msg, size_t len, memcpy(xfer->rx.buf, msg->msg_payload, xfer->rx.len); } =20 -const struct scmi_message_operations scmi_msg_ops =3D { +static const struct scmi_message_operations scmi_msg_ops =3D { .tx_prepare =3D msg_tx_prepare, .command_size =3D msg_command_size, .response_size =3D msg_response_size, diff --git a/drivers/firmware/arm_scmi/shmem.c b/drivers/firmware/arm_scmi/= shmem.c index b1fc0c31495b..e17eb603d871 100644 --- a/drivers/firmware/arm_scmi/shmem.c +++ b/drivers/firmware/arm_scmi/shmem.c @@ -176,7 +176,7 @@ static void __iomem *shmem_setup_iomap(struct scmi_chan= _info *cinfo, return addr; } =20 -const struct scmi_shared_mem_operations scmi_shmem_ops =3D { +static const struct scmi_shared_mem_operations scmi_shmem_ops =3D { .tx_prepare =3D shmem_tx_prepare, .read_header =3D shmem_read_header, .fetch_response =3D shmem_fetch_response, --=20 2.45.2