From: sashiko-bot@kernel.org
To: "Michal Simek" <michal.simek@amd.com>
Cc: linux-scsi@vger.kernel.org
Subject: Re: [PATCH] firmware: xilinx: ufs: move PHY/SRAM ready polling into the firmware backend
Date: Tue, 04 Aug 2026 15:32:02 +0000 [thread overview]
Message-ID: <20260804153203.5CD251F000E9@smtp.kernel.org> (raw)
In-Reply-To: <eaeaaea8ed76069943e0706a0917139ff6569929.1785855749.git.michal.simek@amd.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] The patch makes per-read primitives static and un-exports them, contradicting the commit message claim that they stay exported.
- [Medium] The refactoring regresses error handling by grouping lower-level firmware transport failures under hardware-specific timeout error messages.
--
--- Patch [1]: [PATCH] firmware: xilinx: ufs: move PHY/SRAM ready polling into the firmware backend ---
commit e824b853b832156de7cffafd5b473161a8e6545d
Author: Michal Simek <michal.simek@amd.com>
firmware: xilinx: ufs: move PHY/SRAM ready polling into the firmware backend
This commit moves the open-coded do/while polling loops for UFS PHY and SRAM
initialization into coarse blocking helpers in the firmware driver. It
introduces zynqmp_pm_wait_mphy_tx_rx_config_ready() and
zynqmp_pm_wait_sram_init_done() to keep the UFS controller backend-agnostic.
> Introduce coarse blocking helpers, zynqmp_pm_wait_mphy_tx_rx_config_ready()
> and zynqmp_pm_wait_sram_init_done(), that take a caller-supplied timeout
> budget and contain the poll loop. The loop is EEMI-specific (legacy
> firmware only exposes the per-read status primitive) so it lives in the
> firmware driver, keeping the UFS driver backend-agnostic: a future
> backend can offload the wait to the platform in a single call without
> touching the controller driver again. The existing per-read primitives stay
> exported, so the current EEMI interface is unchanged.
[Severity: Medium]
The commit message indicates that "The existing per-read primitives stay
exported, so the current EEMI interface is unchanged." However, the code
modifications below make these functions static and remove their prototypes.
Is it intentional to un-export these primitives, contrary to the commit
message?
> diff --git a/drivers/firmware/xilinx/zynqmp-ufs.c b/drivers/firmware/xilinx/zynqmp-ufs.c
> index 85da8a822f3a5..81ccf61a037ce 100644
> --- a/drivers/firmware/xilinx/zynqmp-ufs.c
> +++ b/drivers/firmware/xilinx/zynqmp-ufs.c
[ ... ]
> @@ -33,7 +34,7 @@
> *
> * Return: Returns 0 on success or error value on failure.
> */
> -int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready)
> +static int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready)
> {
> u32 regval;
> int ret;
> @@ -53,7 +54,6 @@ int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready)
>
> return ret;
> }
> -EXPORT_SYMBOL_GPL(zynqmp_pm_is_mphy_tx_rx_config_ready);
[ ... ]
> @@ -61,7 +61,7 @@ EXPORT_SYMBOL_GPL(zynqmp_pm_is_mphy_tx_rx_config_ready);
> *
> * Return: Returns 0 on success or error value on failure.
> */
> -int zynqmp_pm_is_sram_init_done(bool *is_done)
> +static int zynqmp_pm_is_sram_init_done(bool *is_done)
> {
> u32 regval;
> int ret;
> @@ -81,7 +81,69 @@ int zynqmp_pm_is_sram_init_done(bool *is_done)
>
> return ret;
> }
> -EXPORT_SYMBOL_GPL(zynqmp_pm_is_sram_init_done);
[ ... ]
> diff --git a/drivers/ufs/host/ufs-amd-versal2.c b/drivers/ufs/host/ufs-amd-versal2.c
> index 2154d62868171..dff0c2c954865 100644
> --- a/drivers/ufs/host/ufs-amd-versal2.c
> +++ b/drivers/ufs/host/ufs-amd-versal2.c
[ ... ]
> @@ -235,23 +233,15 @@ static int ufs_versal2_phy_init(struct ufs_hba *hba)
> { UIC_ARG_MIB(VS_MPHYCFGUPDT), 1, DME_LOCAL }
> };
>
> - /* Wait for Tx/Rx config_rdy */
> - time_left = TIMEOUT_MICROSEC;
> - do {
> - time_left--;
> - ret = zynqmp_pm_is_mphy_tx_rx_config_ready(&is_ready);
> - if (ret)
> - return ret;
> -
> - if (!is_ready)
> - break;
> -
> - usleep_range(1, 5);
> - } while (time_left);
> -
> - if (!time_left) {
> + /*
> + * Wait for Tx/Rx config_rdy. The poll loop lives in the firmware
> + * backend (EEMI today, SCMI in future) so this driver stays
> + * backend-agnostic; the timeout budget stays here with the consumer.
> + */
> + ret = zynqmp_pm_wait_mphy_tx_rx_config_ready(TIMEOUT_MICROSEC);
> + if (ret) {
> dev_err(hba->dev, "Tx/Rx configuration signal busy.\n");
> - return -ETIMEDOUT;
> + return ret;
> }
[Severity: Medium]
Will this change result in misleading error logs if a firmware transport
error occurs?
In the original code, if zynqmp_pm_is_mphy_tx_rx_config_ready() failed with a
transport error like -EIO, the function returned silently. The
"Tx/Rx configuration signal busy" error was only logged when the timeout
actually expired.
With this update, if zynqmp_pm_wait_mphy_tx_rx_config_ready() returns -EIO,
it seems we will incorrectly log "Tx/Rx configuration signal busy." instead
of propagating the transport failure silently.
> ret = ufshcd_dwc_dme_set_attrs(hba, rmmi_attrs, ARRAY_SIZE(rmmi_attrs));
> @@ -264,23 +254,11 @@ static int ufs_versal2_phy_init(struct ufs_hba *hba)
> return ret;
> }
>
> - /* Wait for SRAM init done */
> - time_left = TIMEOUT_MICROSEC;
> - do {
> - time_left--;
> - ret = zynqmp_pm_is_sram_init_done(&is_ready);
> - if (ret)
> - return ret;
> -
> - if (is_ready)
> - break;
> -
> - usleep_range(1, 5);
> - } while (time_left);
> -
> - if (!time_left) {
> + /* Wait for SRAM init done (poll handled by the firmware backend). */
> + ret = zynqmp_pm_wait_sram_init_done(TIMEOUT_MICROSEC);
> + if (ret) {
> dev_err(hba->dev, "SRAM initialization failed.\n");
> - return -ETIMEDOUT;
> + return ret;
> }
[Severity: Medium]
Similarly, if zynqmp_pm_wait_sram_init_done() returns a generic firmware
transport error, will it now misleadingly print "SRAM initialization failed."
rather than bubbling up the underlying error?
[ ... ]
> diff --git a/include/linux/firmware/xlnx-zynqmp-ufs.h b/include/linux/firmware/xlnx-zynqmp-ufs.h
> index d3538dd5822a5..00383dd835f24 100644
> --- a/include/linux/firmware/xlnx-zynqmp-ufs.h
> +++ b/include/linux/firmware/xlnx-zynqmp-ufs.h
> @@ -9,17 +9,17 @@
> #define __FIRMWARE_XLNX_ZYNQMP_UFS_H__
>
> #if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
> -int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready);
> -int zynqmp_pm_is_sram_init_done(bool *is_done);
[Severity: Medium]
Is it intentional to remove these prototypes from the public header, despite
the commit message mentioning that the per-read primitives stay exported?
--
Sashiko AI review · https://sashiko.dev/#/patchset/eaeaaea8ed76069943e0706a0917139ff6569929.1785855749.git.michal.simek@amd.com?part=1
next prev parent reply other threads:[~2026-08-04 15:32 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 15:02 [PATCH] firmware: xilinx: ufs: move PHY/SRAM ready polling into the firmware backend Michal Simek
2026-08-04 15:32 ` sashiko-bot [this message]
2026-08-11 14:25 ` Sai Krishna Potthuri
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=20260804153203.5CD251F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=michal.simek@amd.com \
--cc=sashiko-reviews@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.