* [PATCH v6 0/2] UFS driver general fixes bundle 2 @ 2020-03-26 9:25 Can Guo 2020-03-26 9:25 ` [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path Can Guo [not found] ` <1585214742-5466-3-git-send-email-cang@codeaurora.org> 0 siblings, 2 replies; 6+ messages in thread From: Can Guo @ 2020-03-26 9:25 UTC (permalink / raw) To: asutoshd, nguyenb, hongwus, rnayak, linux-scsi, kernel-team, saravanak, salyzyn, cang This bundle includes 2 general fixes for UFS driver. Changes since v5: - Fixed a compilation error Changes since v4: - Incoperated comments from Avri. - Added trace back to func ufshcd_scale_clks() - Removed scale_up_gear goto - Added "Fixes" tag to commit messages Changes since v3: - Removed trivial spaces in comments Changes since v2: - Rebased on 5.7/scsi-queue and fixed minor conflicts Changes since v1: - Fixed minor typo Can Guo (1): scsi: ufs: Do not rely on prefetched data Subhash Jadavani (1): scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path drivers/scsi/ufs/ufshcd.c | 91 ++++++++++++++++++++++++++++++----------------- drivers/scsi/ufs/ufshcd.h | 11 ------ 2 files changed, 59 insertions(+), 43 deletions(-) -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path 2020-03-26 9:25 [PATCH v6 0/2] UFS driver general fixes bundle 2 Can Guo @ 2020-03-26 9:25 ` Can Guo 2020-03-26 10:00 ` [EXT] " Bean Huo (beanhuo) 2020-03-27 17:04 ` Martin K. Petersen [not found] ` <1585214742-5466-3-git-send-email-cang@codeaurora.org> 1 sibling, 2 replies; 6+ messages in thread From: Can Guo @ 2020-03-26 9:25 UTC (permalink / raw) To: asutoshd, nguyenb, hongwus, rnayak, linux-scsi, kernel-team, saravanak, salyzyn, cang Cc: Subhash Jadavani, Alim Akhtar, Avri Altman, James E.J. Bottomley, Martin K. Petersen, Stanley Chu, Bean Huo, Bart Van Assche, Venkat Gopalakrishnan, Tomas Winkler, open list From: Subhash Jadavani <subhashj@codeaurora.org> This change introduces a func ufshcd_set_clk_freq() to explicitly set clock frequency so that it can be used in reset_and_resotre path and in ufshcd_scale_clks(). Meanwhile, this change cleans up the clock scaling error out path. Fixes: a3cd5ec55f6c ("scsi: ufs: add load based scaling of UFS gear") Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org> Signed-off-by: Can Guo <cang@codeaurora.org> --- drivers/scsi/ufs/ufshcd.c | 65 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 2a2a63b..148e73a 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -855,28 +855,29 @@ static bool ufshcd_is_unipro_pa_params_tuning_req(struct ufs_hba *hba) return false; } -static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) +/** + * ufshcd_set_clk_freq - set UFS controller clock frequencies + * @hba: per adapter instance + * @scale_up: If True, set max possible frequency othewise set low frequency + * + * Returns 0 if successful + * Returns < 0 for any other errors + */ +static int ufshcd_set_clk_freq(struct ufs_hba *hba, bool scale_up) { int ret = 0; struct ufs_clk_info *clki; struct list_head *head = &hba->clk_list_head; - ktime_t start = ktime_get(); - bool clk_state_changed = false; if (list_empty(head)) goto out; - ret = ufshcd_vops_clk_scale_notify(hba, scale_up, PRE_CHANGE); - if (ret) - return ret; - list_for_each_entry(clki, head, list) { if (!IS_ERR_OR_NULL(clki->clk)) { if (scale_up && clki->max_freq) { if (clki->curr_freq == clki->max_freq) continue; - clk_state_changed = true; ret = clk_set_rate(clki->clk, clki->max_freq); if (ret) { dev_err(hba->dev, "%s: %s clk set rate(%dHz) failed, %d\n", @@ -895,7 +896,6 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) if (clki->curr_freq == clki->min_freq) continue; - clk_state_changed = true; ret = clk_set_rate(clki->clk, clki->min_freq); if (ret) { dev_err(hba->dev, "%s: %s clk set rate(%dHz) failed, %d\n", @@ -914,11 +914,37 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) clki->name, clk_get_rate(clki->clk)); } +out: + return ret; +} + +/** + * ufshcd_scale_clks - scale up or scale down UFS controller clocks + * @hba: per adapter instance + * @scale_up: True if scaling up and false if scaling down + * + * Returns 0 if successful + * Returns < 0 for any other errors + */ +static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) +{ + int ret = 0; + ktime_t start = ktime_get(); + + ret = ufshcd_vops_clk_scale_notify(hba, scale_up, PRE_CHANGE); + if (ret) + goto out; + + ret = ufshcd_set_clk_freq(hba, scale_up); + if (ret) + goto out; + ret = ufshcd_vops_clk_scale_notify(hba, scale_up, POST_CHANGE); + if (ret) + ufshcd_set_clk_freq(hba, !scale_up); out: - if (clk_state_changed) - trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), + trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), (scale_up ? "up" : "down"), ktime_to_us(ktime_sub(ktime_get(), start)), ret); return ret; @@ -1106,35 +1132,32 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up) ret = ufshcd_clock_scaling_prepare(hba); if (ret) - return ret; + goto out; /* scale down the gear before scaling down clocks */ if (!scale_up) { ret = ufshcd_scale_gear(hba, false); if (ret) - goto out; + goto out_unprepare; } ret = ufshcd_scale_clks(hba, scale_up); if (ret) { if (!scale_up) ufshcd_scale_gear(hba, true); - goto out; + goto out_unprepare; } /* scale up the gear after scaling up clocks */ if (scale_up) { ret = ufshcd_scale_gear(hba, true); - if (ret) { + if (ret) ufshcd_scale_clks(hba, false); - goto out; - } } - ret = ufshcd_vops_clk_scale_notify(hba, scale_up, POST_CHANGE); - -out: +out_unprepare: ufshcd_clock_scaling_unprepare(hba); +out: ufshcd_release(hba); return ret; } @@ -6251,7 +6274,7 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) spin_unlock_irqrestore(hba->host->host_lock, flags); /* scale up clocks to max frequency before full reinitialization */ - ufshcd_scale_clks(hba, true); + ufshcd_set_clk_freq(hba, true); err = ufshcd_hba_enable(hba); if (err) -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project. ^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [EXT] [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path 2020-03-26 9:25 ` [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path Can Guo @ 2020-03-26 10:00 ` Bean Huo (beanhuo) 2020-03-27 17:04 ` Martin K. Petersen 1 sibling, 0 replies; 6+ messages in thread From: Bean Huo (beanhuo) @ 2020-03-26 10:00 UTC (permalink / raw) To: Can Guo, asutoshd, nguyenb, hongwus, rnayak, linux-scsi, kernel-team, saravanak, salyzyn Cc: Subhash Jadavani, Alim Akhtar, Avri Altman, James E.J. Bottomley, Martin K. Petersen, Stanley Chu, Bart Van Assche, Venkat Gopalakrishnan, Tomas Winkler, open list > Fixes: a3cd5ec55f6c ("scsi: ufs: add load based scaling of UFS gear") > Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org> > Signed-off-by: Can Guo <cang@codeaurora.org> Reviewed-by: Bean Huo <beanhuo@micron.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path 2020-03-26 9:25 ` [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path Can Guo 2020-03-26 10:00 ` [EXT] " Bean Huo (beanhuo) @ 2020-03-27 17:04 ` Martin K. Petersen 1 sibling, 0 replies; 6+ messages in thread From: Martin K. Petersen @ 2020-03-27 17:04 UTC (permalink / raw) To: Can Guo Cc: asutoshd, nguyenb, hongwus, rnayak, linux-scsi, kernel-team, saravanak, salyzyn, Subhash Jadavani, Alim Akhtar, Avri Altman, James E.J. Bottomley, Martin K. Petersen, Stanley Chu, Bean Huo, Bart Van Assche, Venkat Gopalakrishnan, Tomas Winkler, open list Can, > This change introduces a func ufshcd_set_clk_freq() to explicitly set > clock frequency so that it can be used in reset_and_resotre path and > in ufshcd_scale_clks(). Meanwhile, this change cleans up the clock > scaling error out path. Applied to 5.7/scsi-queue, thanks! -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <1585214742-5466-3-git-send-email-cang@codeaurora.org>]
* Re: [PATCH v6 2/2] scsi: ufs: Do not rely on prefetched data [not found] ` <1585214742-5466-3-git-send-email-cang@codeaurora.org> @ 2020-03-27 2:58 ` Martin K. Petersen 2020-03-27 7:49 ` Avri Altman 0 siblings, 1 reply; 6+ messages in thread From: Martin K. Petersen @ 2020-03-27 2:58 UTC (permalink / raw) To: Can Guo Cc: asutoshd, nguyenb, hongwus, rnayak, linux-scsi, kernel-team, saravanak, salyzyn, Alim Akhtar, Avri Altman, James E.J. Bottomley, Martin K. Petersen, Matthias Brugger, Stanley Chu, Bean Huo, Bart Van Assche, Venkat Gopalakrishnan, Tomas Winkler, Bjorn Andersson, open list, moderated list:ARM/Mediatek SoC support, moderated list:ARM/Mediatek SoC support Can, > We were setting bActiveICCLevel attribute for UFS device only once but > type of this attribute has changed from persistent to volatile since > UFS device specification v2.1. This attribute is set to the default > value after power cycle or hardware reset event. It isn't safe to rely > on prefetched data (only used for bActiveICCLevel attribute > now). Hence this change removes the code related to data prefetching > and set this parameter on every attempt to probe the UFS device. Applied patch #2 to 5.7/scsi-queue. Awaiting Avri's feedback on patch #1. Thanks! -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v6 2/2] scsi: ufs: Do not rely on prefetched data 2020-03-27 2:58 ` [PATCH v6 2/2] scsi: ufs: Do not rely on prefetched data Martin K. Petersen @ 2020-03-27 7:49 ` Avri Altman 0 siblings, 0 replies; 6+ messages in thread From: Avri Altman @ 2020-03-27 7:49 UTC (permalink / raw) To: Martin K. Petersen, Can Guo Cc: asutoshd, nguyenb, hongwus, rnayak, linux-scsi, kernel-team, saravanak, salyzyn, Alim Akhtar, James E.J. Bottomley, Matthias Brugger, Stanley Chu, Bean Huo, Bart Van Assche, Venkat Gopalakrishnan, Tomas Winkler, Bjorn Andersson, open list, moderated list:ARM/Mediatek SoC support, moderated list:ARM/Mediatek SoC support > > Can, > > > We were setting bActiveICCLevel attribute for UFS device only once but > > type of this attribute has changed from persistent to volatile since > > UFS device specification v2.1. This attribute is set to the default > > value after power cycle or hardware reset event. It isn't safe to rely > > on prefetched data (only used for bActiveICCLevel attribute > > now). Hence this change removes the code related to data prefetching > > and set this parameter on every attempt to probe the UFS device. > > Applied patch #2 to 5.7/scsi-queue. Awaiting Avri's feedback on patch > #1. Thanks! It looks fine. Thanks, Avri > > -- > Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-03-27 17:05 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-03-26 9:25 [PATCH v6 0/2] UFS driver general fixes bundle 2 Can Guo 2020-03-26 9:25 ` [PATCH v6 1/2] scsi: ufs: Clean up ufshcd_scale_clks() and clock scaling error out path Can Guo 2020-03-26 10:00 ` [EXT] " Bean Huo (beanhuo) 2020-03-27 17:04 ` Martin K. Petersen [not found] ` <1585214742-5466-3-git-send-email-cang@codeaurora.org> 2020-03-27 2:58 ` [PATCH v6 2/2] scsi: ufs: Do not rely on prefetched data Martin K. Petersen 2020-03-27 7:49 ` Avri Altman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).