From 0695d03ab92d647e4d567dd9b833fa1ebf82f9c1 Mon Sep 17 00:00:00 2001 From: Asutosh Das Date: Mon, 4 May 2020 18:31:29 -0700 Subject: [PATCH 1/4] scsi: ufs: remove unnecessary memset Remove memset Change-Id: I24fb8bc48679fd3b9801ff10d7557cea2366d13a Signed-off-by: Asutosh Das --- drivers/scsi/ufs/ufshcd.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 77aa0e1900ee..c780ec8c68c7 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -3,7 +3,7 @@ * * This code is based on drivers/scsi/ufs/ufshcd.c * Copyright (C) 2011-2013 Samsung India Software Operations - * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. * * Authors: * Santosh Yaraganavi @@ -7154,11 +7154,8 @@ static int ufshcd_device_params_init(struct ufs_hba *hba) __func__, ret); goto out; } - ufs_fixup_device_setup(hba); - /* Clear any previous UFS device information */ - memset(&hba->dev_info, 0, sizeof(hba->dev_info)); if (!ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_READ_FLAG, QUERY_FLAG_IDN_PWR_ON_WPE, &flag)) hba->dev_info.f_power_on_wp_en = flag; From a546e4ea24ba6ce50e2ee4bd00134da3302669da Mon Sep 17 00:00:00 2001 From: Asutosh Das Date: Mon, 4 May 2020 19:15:55 -0700 Subject: [PATCH 2/4] scsi: ufshcd: Add a wmb before sending uic cmd Adds a wmb Change-Id: Iaf69210a2451227db040ec6dea57aeb09c284635 Signed-off-by: Asutosh Das --- drivers/scsi/ufs/ufshcd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index c780ec8c68c7..e09ebf22cfb5 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -2062,6 +2062,8 @@ ufshcd_dispatch_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) /* Write UIC Cmd */ ufshcd_writel(hba, uic_cmd->command & COMMAND_OPCODE_MASK, REG_UIC_COMMAND); + /* Ensure that the command is written */ + wmb(); } /** From 8fa52ab695c9b01719cf0f1793977b9456bab37e Mon Sep 17 00:00:00 2001 From: Asutosh Das Date: Tue, 12 May 2020 17:39:19 -0700 Subject: [PATCH 3/4] scsi: ufshcd: Turn-off Vdd-hba during suspend Turn-off Vdd-hba of ufs when link is not off. This will not prevent CxPC. Change-Id: I70dc95a2b4f2001ce052877f698930adb6b4b72b Signed-off-by: Asutosh Das --- drivers/scsi/ufs/ufshcd.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index e09ebf22cfb5..9c4ba109494f 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -8026,6 +8026,23 @@ out: return ret; } +#if defined(CONFIG_SCSI_UFSHCD_QTI) +static void ufshcd_hba_vreg_set_lpm(struct ufs_hba *hba) +{ + if (ufshcd_is_link_off(hba) || + (ufshcd_is_link_hibern8(hba) + && ufshcd_is_power_collapse_during_hibern8_allowed(hba))) + ufshcd_setup_hba_vreg(hba, false); +} + +static void ufshcd_hba_vreg_set_hpm(struct ufs_hba *hba) +{ + if (ufshcd_is_link_off(hba) || + (ufshcd_is_link_hibern8(hba) + && ufshcd_is_power_collapse_during_hibern8_allowed(hba))) + ufshcd_setup_hba_vreg(hba, true); +} +#else static void ufshcd_hba_vreg_set_lpm(struct ufs_hba *hba) { if (ufshcd_is_link_off(hba)) @@ -8037,6 +8054,7 @@ static void ufshcd_hba_vreg_set_hpm(struct ufs_hba *hba) if (ufshcd_is_link_off(hba)) ufshcd_setup_hba_vreg(hba, true); } +#endif /** * ufshcd_suspend - helper function for suspend operations From 5dcd3204a950a08509f91cd06d84682254fa8f45 Mon Sep 17 00:00:00 2001 From: Asutosh Das Date: Wed, 15 Apr 2020 14:26:01 -0700 Subject: [PATCH 4/4] scsi: ufshcd: Move to ufshcd core Hereon use upstream ufshcd core. Change-Id: I814921a5a30f27cf6911e9a99c952790888f7e56 Signed-off-by: Asutosh Das --- arch/arm64/configs/vendor/lahaina_QGKI.config | 2 +- drivers/scsi/ufs/Kconfig | 4 +- drivers/scsi/ufs/Makefile | 4 -- drivers/scsi/ufs/ufshcd-qti.c | 3 +- drivers/scsi/ufs/ufshcd.c | 1 + drivers/scsi/ufs/ufshcd.h | 38 ++----------------- 6 files changed, 9 insertions(+), 43 deletions(-) diff --git a/arch/arm64/configs/vendor/lahaina_QGKI.config b/arch/arm64/configs/vendor/lahaina_QGKI.config index c751575ed5d5..a5b4e69b22eb 100644 --- a/arch/arm64/configs/vendor/lahaina_QGKI.config +++ b/arch/arm64/configs/vendor/lahaina_QGKI.config @@ -54,7 +54,7 @@ CONFIG_I2C_RTC6226_QCA=m CONFIG_SCSI_UFSHCD_QTI=y CONFIG_SCSI_UFS_BSG=y CONFIG_MSM_EXT_DISPLAY=y -# CONFIG_SCSI_UFSHCD is not set +CONFIG_SCSI_UFSHCD=y # CONFIG_RADIO_SI470X is not set # CONFIG_RADIO_SI4713 is not set # CONFIG_USB_MR800 is not set diff --git a/drivers/scsi/ufs/Kconfig b/drivers/scsi/ufs/Kconfig index bb773ed7c65d..aa2d16e2050a 100644 --- a/drivers/scsi/ufs/Kconfig +++ b/drivers/scsi/ufs/Kconfig @@ -52,7 +52,7 @@ config SCSI_UFSHCD config SCSI_UFSHCD_QTI tristate "Universal Flash Storage Controller Driver Core QTI" - depends on SCSI && SCSI_DMA && QGKI && !SCSI_UFSHCD + depends on SCSI && SCSI_DMA && QGKI && SCSI_UFSHCD select PM_DEVFREQ select DEVFREQ_GOV_SIMPLE_ONDEMAND select NLS @@ -171,7 +171,7 @@ config SCSI_UFS_BSG config SCSI_UFS_CRYPTO bool "UFS Crypto Engine Support" - depends on (SCSI_UFSHCD || SCSI_UFSHCD_QTI) && BLK_INLINE_ENCRYPTION + depends on SCSI_UFSHCD && BLK_INLINE_ENCRYPTION help Enable Crypto Engine Support in UFS. Enabling this makes it possible for the kernel to use the crypto diff --git a/drivers/scsi/ufs/Makefile b/drivers/scsi/ufs/Makefile index fe3cb5a786bf..8a0421a1b569 100644 --- a/drivers/scsi/ufs/Makefile +++ b/drivers/scsi/ufs/Makefile @@ -11,9 +11,5 @@ obj-$(CONFIG_SCSI_UFSHCD_PCI) += ufshcd-pci.o obj-$(CONFIG_SCSI_UFSHCD_PLATFORM) += ufshcd-pltfrm.o obj-$(CONFIG_SCSI_UFS_HISI) += ufs-hisi.o obj-$(CONFIG_SCSI_UFS_MEDIATEK) += ufs-mediatek.o -obj-$(CONFIG_SCSI_UFSHCD_QTI) += ufshcd-qti-core.o -ufshcd-qti-core-y += ufshcd-qti.o ufs-sysfs.o -ufshcd-qti-core-$(CONFIG_SCSI_UFS_BSG) += ufs_bsg.o ufshcd-core-$(CONFIG_SCSI_UFS_CRYPTO) += ufshcd-crypto.o -ufshcd-qti-core-$(CONFIG_SCSI_UFS_CRYPTO) += ufshcd-crypto.o obj-$(CONFIG_SCSI_UFS_CRYPTO_QTI) += ufshcd-crypto-qti.o diff --git a/drivers/scsi/ufs/ufshcd-qti.c b/drivers/scsi/ufs/ufshcd-qti.c index 327e9ae52a5c..64143b5b0207 100644 --- a/drivers/scsi/ufs/ufshcd-qti.c +++ b/drivers/scsi/ufs/ufshcd-qti.c @@ -8214,7 +8214,8 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) int ret; ktime_t start = ktime_get(); - dev_err(hba->dev, "*** This is %s ***\n", __FILE__); + dev_err(hba->dev, "Using %s: Move to upstream ufs core --\n", __FILE__); + return -EPERM; ret = ufshcd_link_startup(hba); if (ret) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 9c4ba109494f..8857f2687797 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -7219,6 +7219,7 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async) int ret; ktime_t start = ktime_get(); + dev_err(hba->dev, "*** This is %s ***\n", __FILE__); ret = ufshcd_link_startup(hba); if (ret) goto out; diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 35d27896d028..0ef5f12e02c4 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -432,14 +432,13 @@ enum clk_gating_state { struct ufs_clk_gating { #ifdef CONFIG_SCSI_UFSHCD_QTI struct hrtimer gate_hrtimer; - struct work_struct gate_work; unsigned long delay_ms_pwr_save; unsigned long delay_ms_perf; struct device_attribute delay_pwr_save_attr; struct device_attribute delay_perf_attr; -#else - struct delayed_work gate_work; #endif + struct delayed_work gate_work; + struct work_struct ungate_work; enum clk_gating_state state; unsigned long delay_ms; @@ -513,19 +512,6 @@ struct ufshcd_cmd_log { u32 seq_num; }; -#define UIC_ERR_REG_HIST_LENGTH 20 -/** - * struct ufs_uic_err_reg_hist - keeps history of uic errors - * @pos: index to indicate cyclic buffer position - * @reg: cyclic buffer for registers value - * @tstamp: cyclic buffer for time stamp - */ -struct ufs_uic_err_reg_hist { - int pos; - u32 reg[UIC_ERR_REG_HIST_LENGTH]; - ktime_t tstamp[UIC_ERR_REG_HIST_LENGTH]; -}; - /* UFS Host Controller debug print bitmask */ #define UFSHCD_DBG_PRINT_CLK_FREQ_EN UFS_BIT(0) #define UFSHCD_DBG_PRINT_UIC_ERR_HIST_EN UFS_BIT(1) @@ -647,21 +633,15 @@ struct ufs_stats { u32 power_mode_change_cnt; struct ufshcd_clk_ctx clk_hold; struct ufshcd_clk_ctx clk_rel; - struct ufs_uic_err_reg_hist pa_err; - struct ufs_uic_err_reg_hist dl_err; - struct ufs_uic_err_reg_hist nl_err; - struct ufs_uic_err_reg_hist tl_err; - struct ufs_uic_err_reg_hist dme_err; u32 last_intr_status; ktime_t last_intr_ts; -#else +#endif /* uic specific errors */ struct ufs_err_reg_hist pa_err; struct ufs_err_reg_hist dl_err; struct ufs_err_reg_hist nl_err; struct ufs_err_reg_hist tl_err; struct ufs_err_reg_hist dme_err; -#endif /* fatal errors */ struct ufs_err_reg_hist auto_hibern8_err; @@ -1246,18 +1226,6 @@ void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit); int ufshcd_hold(struct ufs_hba *hba, bool async); void ufshcd_release(struct ufs_hba *hba); -#ifdef CONFIG_SCSI_UFSHCD_QTI -void ufshcd_scsi_block_requests(struct ufs_hba *hba); -void ufshcd_scsi_unblock_requests(struct ufs_hba *hba); -int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba, u64 wait_timeout_us); -int ufshcd_change_power_mode(struct ufs_hba *hba, - struct ufs_pa_layer_attr *pwr_mode); - -extern void ufshcd_apply_pm_quirks(struct ufs_hba *hba); -extern int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up); -extern int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size); -#endif - int ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, int *desc_length);