* [PATCH v5 01/11] scsi: ufs: qcom: Perform read back after writing reset bit
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 02/11] scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US Andrew Halaney
` (11 subsequent siblings)
12 siblings, 0 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
Currently, the reset bit for the UFS provided reset controller (used by
its phy) is written to, and then a mb() happens to try and ensure that
hit the device. Immediately afterwards a usleep_range() occurs.
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure the bit hits the device. By doing so and
guaranteeing the ordering against the immediately following
usleep_range(), the mb() can safely be removed.
Fixes: 81c0fc51b7a7 ("ufs-qcom: add support for Qualcomm Technologies Inc platforms")
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/host/ufs-qcom.h | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h
index 9dd9a391ebb7..b9de170983c9 100644
--- a/drivers/ufs/host/ufs-qcom.h
+++ b/drivers/ufs/host/ufs-qcom.h
@@ -151,10 +151,10 @@ static inline void ufs_qcom_assert_reset(struct ufs_hba *hba)
ufshcd_rmwl(hba, UFS_PHY_SOFT_RESET, UFS_PHY_SOFT_RESET, REG_UFS_CFG1);
/*
- * Make sure assertion of ufs phy reset is written to
- * register before returning
+ * Dummy read to ensure the write takes effect before doing any sort
+ * of delay
*/
- mb();
+ ufshcd_readl(hba, REG_UFS_CFG1);
}
static inline void ufs_qcom_deassert_reset(struct ufs_hba *hba)
@@ -162,10 +162,10 @@ static inline void ufs_qcom_deassert_reset(struct ufs_hba *hba)
ufshcd_rmwl(hba, UFS_PHY_SOFT_RESET, 0, REG_UFS_CFG1);
/*
- * Make sure de-assertion of ufs phy reset is written to
- * register before returning
+ * Dummy read to ensure the write takes effect before doing any sort
+ * of delay
*/
- mb();
+ ufshcd_readl(hba, REG_UFS_CFG1);
}
/* Host controller hardware version: major.minor.step */
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v5 02/11] scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 01/11] scsi: ufs: qcom: Perform read back after writing reset bit Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-04-02 4:45 ` Manivannan Sadhasivam
2024-03-29 20:46 ` [PATCH v5 03/11] scsi: ufs: qcom: Remove unnecessary mb() after writing testbus config Andrew Halaney
` (10 subsequent siblings)
12 siblings, 1 reply; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel
Currently after writing to REG_UFS_SYS1CLK_1US a mb() is used to ensure
that write has gone through to the device.
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure the bit hits the device. Because the mb()'s
purpose wasn't to add extra ordering (on top of the ordering guaranteed
by writel()/readl()), it can safely be removed.
Fixes: f06fcc7155dc ("scsi: ufs-qcom: add QUniPro hardware support and power optimizations")
Reviewed-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/host/ufs-qcom.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 06859e17b67b..804dc8153e7b 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -501,7 +501,7 @@ static int ufs_qcom_cfg_timers(struct ufs_hba *hba, u32 gear,
* make sure above write gets applied before we return from
* this function.
*/
- mb();
+ ufshcd_readl(hba, REG_UFS_SYS1CLK_1US);
}
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v5 02/11] scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US
2024-03-29 20:46 ` [PATCH v5 02/11] scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US Andrew Halaney
@ 2024-04-02 4:45 ` Manivannan Sadhasivam
0 siblings, 0 replies; 24+ messages in thread
From: Manivannan Sadhasivam @ 2024-04-02 4:45 UTC (permalink / raw)
To: Andrew Halaney
Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, James E.J. Bottomley,
Martin K. Petersen, Hannes Reinecke, Janek Kotas, Alim Akhtar,
Avri Altman, Bart Van Assche, Can Guo, Anjana Hari, Will Deacon,
linux-arm-msm, linux-scsi, linux-kernel
On Fri, Mar 29, 2024 at 03:46:44PM -0500, Andrew Halaney wrote:
> Currently after writing to REG_UFS_SYS1CLK_1US a mb() is used to ensure
> that write has gone through to the device.
>
> mb() ensure that the write completes, but completion doesn't mean that
> it isn't stored in a buffer somewhere. The recommendation for
> ensuring this bit has taken effect on the device is to perform a read
> back to force it to make it all the way to the device. This is
> documented in device-io.rst and a talk by Will Deacon on this can
> be seen over here:
>
> https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
>
> Let's do that to ensure the bit hits the device. Because the mb()'s
> purpose wasn't to add extra ordering (on top of the ordering guaranteed
> by writel()/readl()), it can safely be removed.
>
> Fixes: f06fcc7155dc ("scsi: ufs-qcom: add QUniPro hardware support and power optimizations")
> Reviewed-by: Can Guo <quic_cang@quicinc.com>
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> drivers/ufs/host/ufs-qcom.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 06859e17b67b..804dc8153e7b 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -501,7 +501,7 @@ static int ufs_qcom_cfg_timers(struct ufs_hba *hba, u32 gear,
> * make sure above write gets applied before we return from
> * this function.
> */
> - mb();
> + ufshcd_readl(hba, REG_UFS_SYS1CLK_1US);
> }
>
> return 0;
>
> --
> 2.44.0
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v5 03/11] scsi: ufs: qcom: Remove unnecessary mb() after writing testbus config
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 01/11] scsi: ufs: qcom: Perform read back after writing reset bit Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 02/11] scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-04-02 4:46 ` Manivannan Sadhasivam
2024-03-29 20:46 ` [PATCH v5 04/11] scsi: ufs: qcom: Perform read back after writing unipro mode Andrew Halaney
` (9 subsequent siblings)
12 siblings, 1 reply; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel
Currently, the testbus configuration is written and completed with an
mb().
mb() ensure that the write completes, but completion doesn't mean
that it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
But, there's really no reason to even ensure completion before
continuing. The only requirement here is that this write is ordered to
this endpoint (which readl()/writel() guarantees already). For that
reason the mb() can be dropped altogether without anything forcing
completion.
Fixes: 9c46b8676271 ("scsi: ufs-qcom: dump additional testbus registers")
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/host/ufs-qcom.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 804dc8153e7b..649fada24345 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -1445,11 +1445,6 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host)
(u32)host->testbus.select_minor << offset,
reg);
ufs_qcom_enable_test_bus(host);
- /*
- * Make sure the test bus configuration is
- * committed before returning.
- */
- mb();
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v5 03/11] scsi: ufs: qcom: Remove unnecessary mb() after writing testbus config
2024-03-29 20:46 ` [PATCH v5 03/11] scsi: ufs: qcom: Remove unnecessary mb() after writing testbus config Andrew Halaney
@ 2024-04-02 4:46 ` Manivannan Sadhasivam
0 siblings, 0 replies; 24+ messages in thread
From: Manivannan Sadhasivam @ 2024-04-02 4:46 UTC (permalink / raw)
To: Andrew Halaney
Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, James E.J. Bottomley,
Martin K. Petersen, Hannes Reinecke, Janek Kotas, Alim Akhtar,
Avri Altman, Bart Van Assche, Can Guo, Anjana Hari, Will Deacon,
linux-arm-msm, linux-scsi, linux-kernel
On Fri, Mar 29, 2024 at 03:46:45PM -0500, Andrew Halaney wrote:
> Currently, the testbus configuration is written and completed with an
> mb().
>
> mb() ensure that the write completes, but completion doesn't mean
> that it isn't stored in a buffer somewhere. The recommendation for
> ensuring this bit has taken effect on the device is to perform a read
> back to force it to make it all the way to the device. This is
> documented in device-io.rst and a talk by Will Deacon on this can
> be seen over here:
>
> https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
>
> But, there's really no reason to even ensure completion before
> continuing. The only requirement here is that this write is ordered to
> this endpoint (which readl()/writel() guarantees already). For that
> reason the mb() can be dropped altogether without anything forcing
> completion.
>
> Fixes: 9c46b8676271 ("scsi: ufs-qcom: dump additional testbus registers")
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> drivers/ufs/host/ufs-qcom.c | 5 -----
> 1 file changed, 5 deletions(-)
>
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 804dc8153e7b..649fada24345 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -1445,11 +1445,6 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host)
> (u32)host->testbus.select_minor << offset,
> reg);
> ufs_qcom_enable_test_bus(host);
> - /*
> - * Make sure the test bus configuration is
> - * committed before returning.
> - */
> - mb();
>
> return 0;
> }
>
> --
> 2.44.0
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v5 04/11] scsi: ufs: qcom: Perform read back after writing unipro mode
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (2 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 03/11] scsi: ufs: qcom: Remove unnecessary mb() after writing testbus config Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-04-02 4:47 ` Manivannan Sadhasivam
2024-03-29 20:46 ` [PATCH v5 05/11] scsi: ufs: qcom: Perform read back after writing CGC enable Andrew Halaney
` (8 subsequent siblings)
12 siblings, 1 reply; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel
Currently, the QUNIPRO_SEL bit is written to and then an mb() is used to
ensure that completes before continuing.
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
But, there's really no reason to even ensure completion before
continuing. The only requirement here is that this write is ordered to
this endpoint (which readl()/writel() guarantees already). For that
reason the mb() can be dropped altogether without anything forcing
completion.
Fixes: f06fcc7155dc ("scsi: ufs-qcom: add QUniPro hardware support and power optimizations")
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/host/ufs-qcom.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 649fada24345..66a6c95f5d72 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -278,9 +278,6 @@ static void ufs_qcom_select_unipro_mode(struct ufs_qcom_host *host)
if (host->hw_ver.major >= 0x05)
ufshcd_rmwl(host->hba, QUNIPRO_G4_SEL, 0, REG_UFS_CFG0);
-
- /* make sure above configuration is applied before we return */
- mb();
}
/*
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v5 04/11] scsi: ufs: qcom: Perform read back after writing unipro mode
2024-03-29 20:46 ` [PATCH v5 04/11] scsi: ufs: qcom: Perform read back after writing unipro mode Andrew Halaney
@ 2024-04-02 4:47 ` Manivannan Sadhasivam
0 siblings, 0 replies; 24+ messages in thread
From: Manivannan Sadhasivam @ 2024-04-02 4:47 UTC (permalink / raw)
To: Andrew Halaney
Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, James E.J. Bottomley,
Martin K. Petersen, Hannes Reinecke, Janek Kotas, Alim Akhtar,
Avri Altman, Bart Van Assche, Can Guo, Anjana Hari, Will Deacon,
linux-arm-msm, linux-scsi, linux-kernel
On Fri, Mar 29, 2024 at 03:46:46PM -0500, Andrew Halaney wrote:
> Currently, the QUNIPRO_SEL bit is written to and then an mb() is used to
> ensure that completes before continuing.
>
> mb() ensure that the write completes, but completion doesn't mean that
> it isn't stored in a buffer somewhere. The recommendation for
> ensuring this bit has taken effect on the device is to perform a read
> back to force it to make it all the way to the device. This is
> documented in device-io.rst and a talk by Will Deacon on this can
> be seen over here:
>
> https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
>
> But, there's really no reason to even ensure completion before
> continuing. The only requirement here is that this write is ordered to
> this endpoint (which readl()/writel() guarantees already). For that
> reason the mb() can be dropped altogether without anything forcing
> completion.
>
> Fixes: f06fcc7155dc ("scsi: ufs-qcom: add QUniPro hardware support and power optimizations")
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> drivers/ufs/host/ufs-qcom.c | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 649fada24345..66a6c95f5d72 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -278,9 +278,6 @@ static void ufs_qcom_select_unipro_mode(struct ufs_qcom_host *host)
>
> if (host->hw_ver.major >= 0x05)
> ufshcd_rmwl(host->hba, QUNIPRO_G4_SEL, 0, REG_UFS_CFG0);
> -
> - /* make sure above configuration is applied before we return */
> - mb();
> }
>
> /*
>
> --
> 2.44.0
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v5 05/11] scsi: ufs: qcom: Perform read back after writing CGC enable
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (3 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 04/11] scsi: ufs: qcom: Perform read back after writing unipro mode Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 06/11] scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV Andrew Halaney
` (7 subsequent siblings)
12 siblings, 0 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
Currently, the CGC enable bit is written and then an mb() is used to
ensure that completes before continuing.
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure the bit hits the device. Because the mb()'s
purpose wasn't to add extra ordering (on top of the ordering guaranteed
by writel()/readl()), it can safely be removed.
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: Can Guo <quic_cang@quicinc.com>
Fixes: 81c0fc51b7a7 ("ufs-qcom: add support for Qualcomm Technologies Inc platforms")
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/host/ufs-qcom.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 66a6c95f5d72..1439c1df0481 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -406,7 +406,7 @@ static void ufs_qcom_enable_hw_clk_gating(struct ufs_hba *hba)
REG_UFS_CFG2);
/* Ensure that HW clock gating is enabled before next operations */
- mb();
+ ufshcd_readl(hba, REG_UFS_CFG2);
}
static int ufs_qcom_hce_enable_notify(struct ufs_hba *hba,
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v5 06/11] scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (4 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 05/11] scsi: ufs: qcom: Perform read back after writing CGC enable Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 21:47 ` Bart Van Assche
2024-03-29 20:46 ` [PATCH v5 07/11] scsi: ufs: core: Perform read back after writing UTP_TASK_REQ_LIST_BASE_H Andrew Halaney
` (6 subsequent siblings)
12 siblings, 1 reply; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
Currently, HCLKDIV is written to and then completed with an mb().
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure the bit hits the device. Because the mb()'s
purpose wasn't to add extra ordering (on top of the ordering guaranteed
by writel()/readl()), it can safely be removed.
Fixes: d90996dae8e4 ("scsi: ufs: Add UFS platform driver for Cadence UFS")
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/host/cdns-pltfrm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/host/cdns-pltfrm.c b/drivers/ufs/host/cdns-pltfrm.c
index bb30267da471..66811d8d1929 100644
--- a/drivers/ufs/host/cdns-pltfrm.c
+++ b/drivers/ufs/host/cdns-pltfrm.c
@@ -136,7 +136,7 @@ static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba)
* Make sure the register was updated,
* UniPro layer will not work with an incorrect value.
*/
- mb();
+ ufshcd_readl(hba, CDNS_UFS_REG_HCLKDIV);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v5 06/11] scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV
2024-03-29 20:46 ` [PATCH v5 06/11] scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV Andrew Halaney
@ 2024-03-29 21:47 ` Bart Van Assche
0 siblings, 0 replies; 24+ messages in thread
From: Bart Van Assche @ 2024-03-29 21:47 UTC (permalink / raw)
To: Andrew Halaney, Andy Gross, Bjorn Andersson, Konrad Dybcio,
Manivannan Sadhasivam, James E.J. Bottomley, Martin K. Petersen,
Hannes Reinecke, Janek Kotas, Alim Akhtar, Avri Altman, Can Guo,
Anjana Hari
Cc: Will Deacon, linux-arm-msm, linux-scsi, linux-kernel,
Manivannan Sadhasivam
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v5 07/11] scsi: ufs: core: Perform read back after writing UTP_TASK_REQ_LIST_BASE_H
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (5 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 06/11] scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 08/11] scsi: ufs: core: Perform read back after disabling interrupts Andrew Halaney
` (5 subsequent siblings)
12 siblings, 0 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
Currently, the UTP_TASK_REQ_LIST_BASE_L/UTP_TASK_REQ_LIST_BASE_H regs
are written to and then completed with an mb().
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring these bits have taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure the bits hit the device. Because the mb()'s
purpose wasn't to add extra ordering (on top of the ordering guaranteed
by writel()/readl()), it can safely be removed.
Fixes: 88441a8d355d ("scsi: ufs: core: Add hibernation callbacks")
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/core/ufshcd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index e30fd125988d..a89887878d98 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -10395,7 +10395,7 @@ int ufshcd_system_restore(struct device *dev)
* are updated with the latest queue addresses. Only after
* updating these addresses, we can queue the new commands.
*/
- mb();
+ ufshcd_readl(hba, REG_UTP_TASK_REQ_LIST_BASE_H);
/* Resuming from hibernate, assume that link was OFF */
ufshcd_set_link_off(hba);
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v5 08/11] scsi: ufs: core: Perform read back after disabling interrupts
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (6 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 07/11] scsi: ufs: core: Perform read back after writing UTP_TASK_REQ_LIST_BASE_H Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 09/11] scsi: ufs: core: Perform read back after disabling UIC_COMMAND_COMPL Andrew Halaney
` (4 subsequent siblings)
12 siblings, 0 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
Currently, interrupts are cleared and disabled prior to registering the
interrupt. An mb() is used to complete the clear/disable writes before
the interrupt is registered.
mb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring these bits have taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure these bits hit the device. Because the mb()'s
purpose wasn't to add extra ordering (on top of the ordering guaranteed
by writel()/readl()), it can safely be removed.
Fixes: 199ef13cac7d ("scsi: ufs: avoid spurious UFS host controller interrupts")
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/core/ufshcd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a89887878d98..268fcfebd7bd 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -10616,7 +10616,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
* Make sure that UFS interrupts are disabled and any pending interrupt
* status is cleared before registering UFS interrupt handler.
*/
- mb();
+ ufshcd_readl(hba, REG_INTERRUPT_ENABLE);
/* IRQ registration */
err = devm_request_irq(dev, irq, ufshcd_intr, IRQF_SHARED, UFSHCD, hba);
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v5 09/11] scsi: ufs: core: Perform read back after disabling UIC_COMMAND_COMPL
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (7 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 08/11] scsi: ufs: core: Perform read back after disabling interrupts Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 20:46 ` [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell Andrew Halaney
` (3 subsequent siblings)
12 siblings, 0 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
Currently, the UIC_COMMAND_COMPL interrupt is disabled and a wmb() is
used to complete the register write before any following writes.
wmb() ensures the writes complete in that order, but completion doesn't
mean that it isn't stored in a buffer somewhere. The recommendation for
ensuring this bit has taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
Let's do that to ensure the bit hits the device. Because the wmb()'s
purpose wasn't to add extra ordering (on top of the ordering guaranteed
by writel()/readl()), it can safely be removed.
Fixes: d75f7fe495cf ("scsi: ufs: reduce the interrupts for power mode change requests")
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Can Guo <quic_cang@quicinc.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/core/ufshcd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 268fcfebd7bd..dfa4f827766a 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -4287,7 +4287,7 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
* Make sure UIC command completion interrupt is disabled before
* issuing UIC command.
*/
- wmb();
+ ufshcd_readl(hba, REG_INTERRUPT_ENABLE);
reenable_intr = true;
}
spin_unlock_irqrestore(hba->host->host_lock, flags);
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (8 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 09/11] scsi: ufs: core: Perform read back after disabling UIC_COMMAND_COMPL Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 21:48 ` Bart Van Assche
2024-04-02 4:49 ` Manivannan Sadhasivam
2024-03-29 20:46 ` [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs Andrew Halaney
` (2 subsequent siblings)
12 siblings, 2 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel
Currently, the doorbell is written to and a wmb() is used to commit it
immediately.
wmb() ensures that the write completes before following writes occur,
but completion doesn't mean that it isn't stored in a buffer somewhere.
The recommendation for ensuring this bit has taken effect on the device
is to perform a read back to force it to make it all the way to the
device. This is documented in device-io.rst and a talk by Will Deacon on
this can be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
But, completion and taking effect aren't necessary to guarantee here.
There's already other examples of the doorbell being rung that don't do
this. The writel() of the doorbell guarantees prior writes by this
thread (to the request being setup for example) complete prior to the
ringing of the doorbell, and the following
wait_for_completion_io_timeout() doesn't require any special memory
barriers either.
With that in mind, just remove the wmb() altogether here.
Fixes: ad1a1b9cd67a ("scsi: ufs: commit descriptors before setting the doorbell")
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/core/ufshcd.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index dfa4f827766a..a2f2941450fd 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -7090,10 +7090,7 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
/* send command to the controller */
__set_bit(task_tag, &hba->outstanding_tasks);
-
ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
- /* Make sure that doorbell is committed immediately */
- wmb();
spin_unlock_irqrestore(host->host_lock, flags);
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell
2024-03-29 20:46 ` [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell Andrew Halaney
@ 2024-03-29 21:48 ` Bart Van Assche
2024-03-29 21:48 ` Bart Van Assche
2024-04-02 4:49 ` Manivannan Sadhasivam
1 sibling, 1 reply; 24+ messages in thread
From: Bart Van Assche @ 2024-03-29 21:48 UTC (permalink / raw)
To: Andrew Halaney, Andy Gross, Bjorn Andersson, Konrad Dybcio,
Manivannan Sadhasivam, James E.J. Bottomley, Martin K. Petersen,
Hannes Reinecke, Janek Kotas, Alim Akhtar, Avri Altman, Can Guo,
Anjana Hari
Cc: Will Deacon, linux-arm-msm, linux-scsi, linux-kernel
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell
2024-03-29 21:48 ` Bart Van Assche
@ 2024-03-29 21:48 ` Bart Van Assche
0 siblings, 0 replies; 24+ messages in thread
From: Bart Van Assche @ 2024-03-29 21:48 UTC (permalink / raw)
To: Andrew Halaney, Andy Gross, Bjorn Andersson, Konrad Dybcio,
Manivannan Sadhasivam, James E.J. Bottomley, Martin K. Petersen,
Hannes Reinecke, Janek Kotas, Alim Akhtar, Avri Altman, Can Guo,
Anjana Hari
Cc: Will Deacon, linux-arm-msm, linux-scsi, linux-kernel
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell
2024-03-29 20:46 ` [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell Andrew Halaney
2024-03-29 21:48 ` Bart Van Assche
@ 2024-04-02 4:49 ` Manivannan Sadhasivam
1 sibling, 0 replies; 24+ messages in thread
From: Manivannan Sadhasivam @ 2024-04-02 4:49 UTC (permalink / raw)
To: Andrew Halaney
Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, James E.J. Bottomley,
Martin K. Petersen, Hannes Reinecke, Janek Kotas, Alim Akhtar,
Avri Altman, Bart Van Assche, Can Guo, Anjana Hari, Will Deacon,
linux-arm-msm, linux-scsi, linux-kernel
On Fri, Mar 29, 2024 at 03:46:52PM -0500, Andrew Halaney wrote:
> Currently, the doorbell is written to and a wmb() is used to commit it
> immediately.
>
> wmb() ensures that the write completes before following writes occur,
> but completion doesn't mean that it isn't stored in a buffer somewhere.
> The recommendation for ensuring this bit has taken effect on the device
> is to perform a read back to force it to make it all the way to the
> device. This is documented in device-io.rst and a talk by Will Deacon on
> this can be seen over here:
>
> https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
>
> But, completion and taking effect aren't necessary to guarantee here.
>
> There's already other examples of the doorbell being rung that don't do
> this. The writel() of the doorbell guarantees prior writes by this
> thread (to the request being setup for example) complete prior to the
> ringing of the doorbell, and the following
> wait_for_completion_io_timeout() doesn't require any special memory
> barriers either.
>
> With that in mind, just remove the wmb() altogether here.
>
> Fixes: ad1a1b9cd67a ("scsi: ufs: commit descriptors before setting the doorbell")
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> drivers/ufs/core/ufshcd.c | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index dfa4f827766a..a2f2941450fd 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -7090,10 +7090,7 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
>
> /* send command to the controller */
> __set_bit(task_tag, &hba->outstanding_tasks);
> -
> ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
> - /* Make sure that doorbell is committed immediately */
> - wmb();
>
> spin_unlock_irqrestore(host->host_lock, flags);
>
>
> --
> 2.44.0
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (9 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell Andrew Halaney
@ 2024-03-29 20:46 ` Andrew Halaney
2024-03-29 21:49 ` Bart Van Assche
2024-04-02 4:49 ` Manivannan Sadhasivam
2024-04-06 1:09 ` [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Martin K. Petersen
2024-04-09 3:08 ` Martin K. Petersen
12 siblings, 2 replies; 24+ messages in thread
From: Andrew Halaney @ 2024-03-29 20:46 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari
Cc: Andrew Halaney, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel
Currently a wmb() is used to ensure that writes to the
UTP_TASK_REQ_LIST_BASE* regs are completed prior to following writes to
the run/stop registers.
wmb() ensure that the write completes, but completion doesn't mean that
it isn't stored in a buffer somewhere. The recommendation for
ensuring the bits have taken effect on the device is to perform a read
back to force it to make it all the way to the device. This is
documented in device-io.rst and a talk by Will Deacon on this can
be seen over here:
https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
But, none of that is necessary here. All of the writel()/readl()'s here
are to the same endpoint, so they will be ordered. There's no subsequent
delay() etc that requires it to have taken effect already, so no
readback is necessary here.
For that reason just drop the wmb() altogether.
Fixes: 897efe628d7e ("scsi: ufs: add missing memory barriers")
Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
drivers/ufs/core/ufshcd.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a2f2941450fd..cf6a24e550f0 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -4769,12 +4769,6 @@ int ufshcd_make_hba_operational(struct ufs_hba *hba)
ufshcd_writel(hba, upper_32_bits(hba->utmrdl_dma_addr),
REG_UTP_TASK_REQ_LIST_BASE_H);
- /*
- * Make sure base address and interrupt setup are updated before
- * enabling the run/stop registers below.
- */
- wmb();
-
/*
* UCRDY, UTMRLDY and UTRLRDY bits must be 1
*/
--
2.44.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs
2024-03-29 20:46 ` [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs Andrew Halaney
@ 2024-03-29 21:49 ` Bart Van Assche
2024-03-29 21:49 ` Bart Van Assche
2024-04-02 4:49 ` Manivannan Sadhasivam
1 sibling, 1 reply; 24+ messages in thread
From: Bart Van Assche @ 2024-03-29 21:49 UTC (permalink / raw)
To: Andrew Halaney, Andy Gross, Bjorn Andersson, Konrad Dybcio,
Manivannan Sadhasivam, James E.J. Bottomley, Martin K. Petersen,
Hannes Reinecke, Janek Kotas, Alim Akhtar, Avri Altman, Can Guo,
Anjana Hari
Cc: Will Deacon, linux-arm-msm, linux-scsi, linux-kernel
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs
2024-03-29 21:49 ` Bart Van Assche
@ 2024-03-29 21:49 ` Bart Van Assche
0 siblings, 0 replies; 24+ messages in thread
From: Bart Van Assche @ 2024-03-29 21:49 UTC (permalink / raw)
To: Andrew Halaney, Andy Gross, Bjorn Andersson, Konrad Dybcio,
Manivannan Sadhasivam, James E.J. Bottomley, Martin K. Petersen,
Hannes Reinecke, Janek Kotas, Alim Akhtar, Avri Altman, Can Guo,
Anjana Hari
Cc: Will Deacon, linux-arm-msm, linux-scsi, linux-kernel
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs
2024-03-29 20:46 ` [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs Andrew Halaney
2024-03-29 21:49 ` Bart Van Assche
@ 2024-04-02 4:49 ` Manivannan Sadhasivam
1 sibling, 0 replies; 24+ messages in thread
From: Manivannan Sadhasivam @ 2024-04-02 4:49 UTC (permalink / raw)
To: Andrew Halaney
Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, James E.J. Bottomley,
Martin K. Petersen, Hannes Reinecke, Janek Kotas, Alim Akhtar,
Avri Altman, Bart Van Assche, Can Guo, Anjana Hari, Will Deacon,
linux-arm-msm, linux-scsi, linux-kernel
On Fri, Mar 29, 2024 at 03:46:53PM -0500, Andrew Halaney wrote:
> Currently a wmb() is used to ensure that writes to the
> UTP_TASK_REQ_LIST_BASE* regs are completed prior to following writes to
> the run/stop registers.
>
> wmb() ensure that the write completes, but completion doesn't mean that
> it isn't stored in a buffer somewhere. The recommendation for
> ensuring the bits have taken effect on the device is to perform a read
> back to force it to make it all the way to the device. This is
> documented in device-io.rst and a talk by Will Deacon on this can
> be seen over here:
>
> https://youtu.be/i6DayghhA8Q?si=MiyxB5cKJXSaoc01&t=1678
>
> But, none of that is necessary here. All of the writel()/readl()'s here
> are to the same endpoint, so they will be ordered. There's no subsequent
> delay() etc that requires it to have taken effect already, so no
> readback is necessary here.
>
> For that reason just drop the wmb() altogether.
>
> Fixes: 897efe628d7e ("scsi: ufs: add missing memory barriers")
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> drivers/ufs/core/ufshcd.c | 6 ------
> 1 file changed, 6 deletions(-)
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index a2f2941450fd..cf6a24e550f0 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -4769,12 +4769,6 @@ int ufshcd_make_hba_operational(struct ufs_hba *hba)
> ufshcd_writel(hba, upper_32_bits(hba->utmrdl_dma_addr),
> REG_UTP_TASK_REQ_LIST_BASE_H);
>
> - /*
> - * Make sure base address and interrupt setup are updated before
> - * enabling the run/stop registers below.
> - */
> - wmb();
> -
> /*
> * UCRDY, UTMRLDY and UTRLRDY bits must be 1
> */
>
> --
> 2.44.0
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (10 preceding siblings ...)
2024-03-29 20:46 ` [PATCH v5 11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs Andrew Halaney
@ 2024-04-06 1:09 ` Martin K. Petersen
2024-04-09 3:08 ` Martin K. Petersen
12 siblings, 0 replies; 24+ messages in thread
From: Martin K. Petersen @ 2024-04-06 1:09 UTC (permalink / raw)
To: Andrew Halaney
Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Martin K. Petersen, Hannes Reinecke,
Janek Kotas, Alim Akhtar, Avri Altman, Bart Van Assche, Can Guo,
Anjana Hari, Will Deacon, linux-arm-msm, linux-scsi, linux-kernel,
Manivannan Sadhasivam
Andrew,
> Please review with care as I'm not all that confident in this subject.
> UFS has a lot of mb() variants used, most with comments saying "ensure
> this takes effect before continuing". mb()'s aren't really the way to
> guarantee that, a read back is the best method.
Applied to 6.10/scsi-staging, thanks!
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers
2024-03-29 20:46 [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Andrew Halaney
` (11 preceding siblings ...)
2024-04-06 1:09 ` [PATCH v5 00/11] scsi: ufs: Remove overzealous memory barriers Martin K. Petersen
@ 2024-04-09 3:08 ` Martin K. Petersen
12 siblings, 0 replies; 24+ messages in thread
From: Martin K. Petersen @ 2024-04-09 3:08 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Manivannan Sadhasivam,
James E.J. Bottomley, Hannes Reinecke, Janek Kotas, Alim Akhtar,
Avri Altman, Bart Van Assche, Can Guo, Anjana Hari,
Andrew Halaney
Cc: Martin K . Petersen, Will Deacon, linux-arm-msm, linux-scsi,
linux-kernel, Manivannan Sadhasivam
On Fri, 29 Mar 2024 15:46:42 -0500, Andrew Halaney wrote:
> Please review with care as I'm not all that confident in this subject.
> UFS has a lot of mb() variants used, most with comments saying "ensure this
> takes effect before continuing". mb()'s aren't really the way to
> guarantee that, a read back is the best method.
>
> Some of these though I think could go a step further and remove the mb()
> variant without a read back. As far as I can tell there's no real reason
> to ensure it takes effect in most cases (there's no delay() or anything
> afterwards, and eventually another readl()/writel() happens which is by
> definition ordered). Some of the patches in this series do that if I was
> confident it was safe (or a reviewer pointed out prior that they thought
> it was safe to do so).
>
> [...]
Applied to 6.10/scsi-queue, thanks!
[01/11] scsi: ufs: qcom: Perform read back after writing reset bit
https://git.kernel.org/mkp/scsi/c/c4d28e06b0c9
[02/11] scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US
https://git.kernel.org/mkp/scsi/c/a862fafa263a
[03/11] scsi: ufs: qcom: Remove unnecessary mb() after writing testbus config
https://git.kernel.org/mkp/scsi/c/95d26dda90df
[04/11] scsi: ufs: qcom: Perform read back after writing unipro mode
https://git.kernel.org/mkp/scsi/c/823150ecf04f
[05/11] scsi: ufs: qcom: Perform read back after writing CGC enable
https://git.kernel.org/mkp/scsi/c/d9488511b3ac
[06/11] scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV
https://git.kernel.org/mkp/scsi/c/b715c55daf59
[07/11] scsi: ufs: core: Perform read back after writing UTP_TASK_REQ_LIST_BASE_H
https://git.kernel.org/mkp/scsi/c/408e28086f1c
[08/11] scsi: ufs: core: Perform read back after disabling interrupts
https://git.kernel.org/mkp/scsi/c/e4a628877119
[09/11] scsi: ufs: core: Perform read back after disabling UIC_COMMAND_COMPL
https://git.kernel.org/mkp/scsi/c/4bf3855497b6
[10/11] scsi: ufs: core: Remove unnecessary wmb() after ringing doorbell
https://git.kernel.org/mkp/scsi/c/d3fb9a24a602
[11/11] scsi: ufs: core: Remove unnecessary wmb() prior to writing run/stop regs
https://git.kernel.org/mkp/scsi/c/356a8ce7cd50
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 24+ messages in thread