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
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
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.