Loading drivers/scsi/ufs/ufshcd.c +25 −1 Original line number Diff line number Diff line Loading @@ -3240,10 +3240,12 @@ static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) { int ret; struct uic_command uic_cmd = {0}; ktime_t start = ktime_get(); uic_cmd.command = UIC_CMD_DME_HIBER_ENTER; ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); trace_ufshcd_profile_hibern8(dev_name(hba->dev), "enter", ktime_to_us(ktime_sub(ktime_get(), start)), ret); if (ret) { UFSHCD_UPDATE_ERROR_STATS(hba, UFS_ERR_HIBERN8_ENTER); Loading @@ -3258,9 +3260,13 @@ static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) { struct uic_command uic_cmd = {0}; int ret; ktime_t start = ktime_get(); uic_cmd.command = UIC_CMD_DME_HIBER_EXIT; ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); trace_ufshcd_profile_hibern8(dev_name(hba->dev), "exit", ktime_to_us(ktime_sub(ktime_get(), start)), ret); if (ret) { ufshcd_set_link_off(hba); UFSHCD_UPDATE_ERROR_STATS(hba, UFS_ERR_HIBERN8_EXIT); Loading Loading @@ -5950,6 +5956,8 @@ static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, struct ufs_clk_info *clki; struct list_head *head = &hba->clk_list_head; unsigned long flags; ktime_t start = ktime_get(); bool clk_state_changed = false; if (!head || list_empty(head)) goto out; Loading @@ -5959,6 +5967,7 @@ static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, if (skip_ref_clk && !strcmp(clki->name, "ref_clk")) continue; clk_state_changed = on ^ clki->enabled; if (on && !clki->enabled) { ret = clk_prepare_enable(clki->clk); if (ret) { Loading Loading @@ -5994,6 +6003,11 @@ out: if (hba->vops->update_sec_cfg) hba->vops->update_sec_cfg(hba, true); } if (clk_state_changed) trace_ufshcd_profile_clk_gating(dev_name(hba->dev), (on ? "on" : "off"), ktime_to_us(ktime_sub(ktime_get(), start)), ret); return ret; } Loading Loading @@ -7026,6 +7040,8 @@ static int ufshcd_scale_clks(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 (!head || list_empty(head)) goto out; Loading @@ -7035,6 +7051,8 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) 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", Loading @@ -7051,6 +7069,8 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) } else if (!scale_up && clki->min_freq) { 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", Loading @@ -7071,6 +7091,10 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) if (hba->vops->clk_scale_notify) hba->vops->clk_scale_notify(hba); out: if (clk_state_changed) trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), (scale_up ? "up" : "down"), ktime_to_us(ktime_sub(ktime_get(), start)), ret); return ret; } Loading include/trace/events/ufs.h +40 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,46 @@ TRACE_EVENT(ufshcd_auto_bkops_state, __get_str(dev_name), __get_str(state)) ); DECLARE_EVENT_CLASS(ufshcd_profiling_template, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err), TP_STRUCT__entry( __string(dev_name, dev_name) __string(profile_info, profile_info) __field(s64, time_us) __field(int, err) ), TP_fast_assign( __assign_str(dev_name, dev_name); __assign_str(profile_info, profile_info); __entry->time_us = time_us; __entry->err = err; ), TP_printk("%s: %s: took %lld usecs, err %d", __get_str(dev_name), __get_str(profile_info), __entry->time_us, __entry->err) ); DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err)); DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err)); DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err)); DECLARE_EVENT_CLASS(ufshcd_template, TP_PROTO(const char *dev_name, int err, s64 usecs, const char *dev_state, const char *link_state), Loading Loading
drivers/scsi/ufs/ufshcd.c +25 −1 Original line number Diff line number Diff line Loading @@ -3240,10 +3240,12 @@ static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) { int ret; struct uic_command uic_cmd = {0}; ktime_t start = ktime_get(); uic_cmd.command = UIC_CMD_DME_HIBER_ENTER; ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); trace_ufshcd_profile_hibern8(dev_name(hba->dev), "enter", ktime_to_us(ktime_sub(ktime_get(), start)), ret); if (ret) { UFSHCD_UPDATE_ERROR_STATS(hba, UFS_ERR_HIBERN8_ENTER); Loading @@ -3258,9 +3260,13 @@ static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) { struct uic_command uic_cmd = {0}; int ret; ktime_t start = ktime_get(); uic_cmd.command = UIC_CMD_DME_HIBER_EXIT; ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); trace_ufshcd_profile_hibern8(dev_name(hba->dev), "exit", ktime_to_us(ktime_sub(ktime_get(), start)), ret); if (ret) { ufshcd_set_link_off(hba); UFSHCD_UPDATE_ERROR_STATS(hba, UFS_ERR_HIBERN8_EXIT); Loading Loading @@ -5950,6 +5956,8 @@ static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, struct ufs_clk_info *clki; struct list_head *head = &hba->clk_list_head; unsigned long flags; ktime_t start = ktime_get(); bool clk_state_changed = false; if (!head || list_empty(head)) goto out; Loading @@ -5959,6 +5967,7 @@ static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, if (skip_ref_clk && !strcmp(clki->name, "ref_clk")) continue; clk_state_changed = on ^ clki->enabled; if (on && !clki->enabled) { ret = clk_prepare_enable(clki->clk); if (ret) { Loading Loading @@ -5994,6 +6003,11 @@ out: if (hba->vops->update_sec_cfg) hba->vops->update_sec_cfg(hba, true); } if (clk_state_changed) trace_ufshcd_profile_clk_gating(dev_name(hba->dev), (on ? "on" : "off"), ktime_to_us(ktime_sub(ktime_get(), start)), ret); return ret; } Loading Loading @@ -7026,6 +7040,8 @@ static int ufshcd_scale_clks(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 (!head || list_empty(head)) goto out; Loading @@ -7035,6 +7051,8 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) 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", Loading @@ -7051,6 +7069,8 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) } else if (!scale_up && clki->min_freq) { 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", Loading @@ -7071,6 +7091,10 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) if (hba->vops->clk_scale_notify) hba->vops->clk_scale_notify(hba); out: if (clk_state_changed) trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), (scale_up ? "up" : "down"), ktime_to_us(ktime_sub(ktime_get(), start)), ret); return ret; } Loading
include/trace/events/ufs.h +40 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,46 @@ TRACE_EVENT(ufshcd_auto_bkops_state, __get_str(dev_name), __get_str(state)) ); DECLARE_EVENT_CLASS(ufshcd_profiling_template, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err), TP_STRUCT__entry( __string(dev_name, dev_name) __string(profile_info, profile_info) __field(s64, time_us) __field(int, err) ), TP_fast_assign( __assign_str(dev_name, dev_name); __assign_str(profile_info, profile_info); __entry->time_us = time_us; __entry->err = err; ), TP_printk("%s: %s: took %lld usecs, err %d", __get_str(dev_name), __get_str(profile_info), __entry->time_us, __entry->err) ); DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err)); DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err)); DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling, TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, int err), TP_ARGS(dev_name, profile_info, time_us, err)); DECLARE_EVENT_CLASS(ufshcd_template, TP_PROTO(const char *dev_name, int err, s64 usecs, const char *dev_state, const char *link_state), Loading