2020-01-23 07:28:13

by Can Guo

[permalink] [raw]
Subject: [PATCH v4 8/8] scsi: ufs: Select INITIAL adapt for HS Gear4

ADAPT is added specifically for HS Gear4 mode only, select INITIAL adapt
before do power mode change to G4 and select no adapt before switch to
non-G4 modes.

Signed-off-by: Can Guo <[email protected]>
---
drivers/scsi/ufs/ufshcd.c | 14 +++++++++++++-
drivers/scsi/ufs/ufshci.h | 1 +
drivers/scsi/ufs/unipro.h | 7 +++++++
3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 1ee2187..f6d4828 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -4134,6 +4134,17 @@ static int ufshcd_change_power_mode(struct ufs_hba *hba,
ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES),
pwr_mode->hs_rate);

+ if (hba->ufs_version >= UFSHCI_VERSION_30) {
+ if (pwr_mode->gear_tx == UFS_HS_G4)
+ /* INITIAL ADAPT */
+ ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXHSADAPTTYPE),
+ PA_INITIAL_ADAPT);
+ else
+ /* NO ADAPT */
+ ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXHSADAPTTYPE),
+ PA_NO_ADAPT);
+ }
+
ret = ufshcd_uic_change_pwr_mode(hba, pwr_mode->pwr_rx << 4
| pwr_mode->pwr_tx);

@@ -8422,7 +8433,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
if ((hba->ufs_version != UFSHCI_VERSION_10) &&
(hba->ufs_version != UFSHCI_VERSION_11) &&
(hba->ufs_version != UFSHCI_VERSION_20) &&
- (hba->ufs_version != UFSHCI_VERSION_21))
+ (hba->ufs_version != UFSHCI_VERSION_21) &&
+ (hba->ufs_version != UFSHCI_VERSION_30))
dev_err(hba->dev, "invalid UFS version 0x%x\n",
hba->ufs_version);

diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h
index dbb75cd..95b4b03 100644
--- a/drivers/scsi/ufs/ufshci.h
+++ b/drivers/scsi/ufs/ufshci.h
@@ -104,6 +104,7 @@ enum {
UFSHCI_VERSION_11 = 0x00010100, /* 1.1 */
UFSHCI_VERSION_20 = 0x00000200, /* 2.0 */
UFSHCI_VERSION_21 = 0x00000210, /* 2.1 */
+ UFSHCI_VERSION_30 = 0x00000300, /* 3.0 */
};

/*
diff --git a/drivers/scsi/ufs/unipro.h b/drivers/scsi/ufs/unipro.h
index f539f87..960d175 100644
--- a/drivers/scsi/ufs/unipro.h
+++ b/drivers/scsi/ufs/unipro.h
@@ -146,6 +146,12 @@
#define PA_SLEEPNOCONFIGTIME 0x15A2
#define PA_STALLNOCONFIGTIME 0x15A3
#define PA_SAVECONFIGTIME 0x15A4
+#define PA_TXHSADAPTTYPE 0x15D4
+
+/* Adpat type for PA_TXHSADAPTTYPE attribute */
+#define PA_REFRESH_ADAPT 0x00
+#define PA_INITIAL_ADAPT 0x01
+#define PA_NO_ADAPT 0x03

#define PA_TACTIVATE_TIME_UNIT_US 10
#define PA_HIBERN8_TIME_UNIT_US 100
@@ -192,6 +198,7 @@ enum ufs_hs_gear_tag {
UFS_HS_G1, /* HS Gear 1 (default for reset) */
UFS_HS_G2, /* HS Gear 2 */
UFS_HS_G3, /* HS Gear 3 */
+ UFS_HS_G4, /* HS Gear 4 */
};

enum ufs_unipro_ver {
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


2020-01-24 20:58:32

by Asutosh Das (asd)

[permalink] [raw]
Subject: Re: [PATCH v4 8/8] scsi: ufs: Select INITIAL adapt for HS Gear4

On 1/22/2020 11:25 PM, Can Guo wrote:
> ADAPT is added specifically for HS Gear4 mode only, select INITIAL adapt
> before do power mode change to G4 and select no adapt before switch to
> non-G4 modes.
>
> Signed-off-by: Can Guo <[email protected]>
> ---

LGTM.

Reviewed-by: Asutosh Das <[email protected]>

> drivers/scsi/ufs/ufshcd.c | 14 +++++++++++++-
> drivers/scsi/ufs/ufshci.h | 1 +
> drivers/scsi/ufs/unipro.h | 7 +++++++
> 3 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 1ee2187..f6d4828 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -4134,6 +4134,17 @@ static int ufshcd_change_power_mode(struct ufs_hba *hba,
> ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES),
> pwr_mode->hs_rate);
>
> + if (hba->ufs_version >= UFSHCI_VERSION_30) {
> + if (pwr_mode->gear_tx == UFS_HS_G4)
> + /* INITIAL ADAPT */
> + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXHSADAPTTYPE),
> + PA_INITIAL_ADAPT);
> + else
> + /* NO ADAPT */
> + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXHSADAPTTYPE),
> + PA_NO_ADAPT);
> + }
> +
> ret = ufshcd_uic_change_pwr_mode(hba, pwr_mode->pwr_rx << 4
> | pwr_mode->pwr_tx);
>
> @@ -8422,7 +8433,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
> if ((hba->ufs_version != UFSHCI_VERSION_10) &&
> (hba->ufs_version != UFSHCI_VERSION_11) &&
> (hba->ufs_version != UFSHCI_VERSION_20) &&
> - (hba->ufs_version != UFSHCI_VERSION_21))
> + (hba->ufs_version != UFSHCI_VERSION_21) &&
> + (hba->ufs_version != UFSHCI_VERSION_30))
> dev_err(hba->dev, "invalid UFS version 0x%x\n",
> hba->ufs_version);
>
> diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h
> index dbb75cd..95b4b03 100644
> --- a/drivers/scsi/ufs/ufshci.h
> +++ b/drivers/scsi/ufs/ufshci.h
> @@ -104,6 +104,7 @@ enum {
> UFSHCI_VERSION_11 = 0x00010100, /* 1.1 */
> UFSHCI_VERSION_20 = 0x00000200, /* 2.0 */
> UFSHCI_VERSION_21 = 0x00000210, /* 2.1 */
> + UFSHCI_VERSION_30 = 0x00000300, /* 3.0 */
> };
>
> /*
> diff --git a/drivers/scsi/ufs/unipro.h b/drivers/scsi/ufs/unipro.h
> index f539f87..960d175 100644
> --- a/drivers/scsi/ufs/unipro.h
> +++ b/drivers/scsi/ufs/unipro.h
> @@ -146,6 +146,12 @@
> #define PA_SLEEPNOCONFIGTIME 0x15A2
> #define PA_STALLNOCONFIGTIME 0x15A3
> #define PA_SAVECONFIGTIME 0x15A4
> +#define PA_TXHSADAPTTYPE 0x15D4
> +
> +/* Adpat type for PA_TXHSADAPTTYPE attribute */
> +#define PA_REFRESH_ADAPT 0x00
> +#define PA_INITIAL_ADAPT 0x01
> +#define PA_NO_ADAPT 0x03
>
> #define PA_TACTIVATE_TIME_UNIT_US 10
> #define PA_HIBERN8_TIME_UNIT_US 100
> @@ -192,6 +198,7 @@ enum ufs_hs_gear_tag {
> UFS_HS_G1, /* HS Gear 1 (default for reset) */
> UFS_HS_G2, /* HS Gear 2 */
> UFS_HS_G3, /* HS Gear 3 */
> + UFS_HS_G4, /* HS Gear 4 */
> };
>
> enum ufs_unipro_ver {
>


--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
Linux Foundation Collaborative Project

2020-01-26 03:39:14

by Bart Van Assche

[permalink] [raw]
Subject: Re: [PATCH v4 8/8] scsi: ufs: Select INITIAL adapt for HS Gear4

On 2020-01-22 23:25, Can Guo wrote:
> @@ -8422,7 +8433,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
> if ((hba->ufs_version != UFSHCI_VERSION_10) &&
> (hba->ufs_version != UFSHCI_VERSION_11) &&
> (hba->ufs_version != UFSHCI_VERSION_20) &&
> - (hba->ufs_version != UFSHCI_VERSION_21))
> + (hba->ufs_version != UFSHCI_VERSION_21) &&
> + (hba->ufs_version != UFSHCI_VERSION_30))
> dev_err(hba->dev, "invalid UFS version 0x%x\n",
> hba->ufs_version);

Is the UFS specification backwards compatible? Or in other words, does
the existing driver work fine for devices with a controller that
supports a newer version of the spec? I'm asking this because in Linux
kernel driver a version check that excludes newer controller versions is
very unusual. Can the above version check be removed in its entirety?

Thanks,

Bart.