diff options
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 90 | ||||
| -rw-r--r-- | include/trace/events/ufs.h | 60 |
2 files changed, 112 insertions, 38 deletions
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 62a2fc0a056f..a2c32209ca80 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -666,6 +666,40 @@ static inline int ufshcd_is_hba_active(struct ufs_hba *hba) return (ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & 0x1) ? 0 : 1; } +static const char *ufschd_uic_link_state_to_string( + enum uic_link_state state) +{ + switch (state) { + case UIC_LINK_OFF_STATE: return "UIC_LINK_OFF_STATE"; + case UIC_LINK_ACTIVE_STATE: return "UIC_LINK_ACTIVE_STATE"; + case UIC_LINK_HIBERN8_STATE: return "UIC_LINK_HIBERN8_STATE"; + default: return "UNKNOWN_STATE"; + } +} + +static const char *ufschd_ufs_dev_pwr_mode_to_string( + enum ufs_dev_pwr_mode state) +{ + switch (state) { + case UFS_ACTIVE_PWR_MODE: return "UFS_ACTIVE_PWR_MODE"; + case UFS_SLEEP_PWR_MODE: return "UFS_SLEEP_PWR_MODE"; + case UFS_POWERDOWN_PWR_MODE: return "UFS_POWERDOWN_PWR_MODE"; + default: return "UNKNOWN_STATE"; + } +} + +static const char *ufschd_clk_gating_state_to_string( + enum clk_gating_state state) +{ + switch (state) { + case CLKS_OFF: return "CLKS_OFF"; + case CLKS_ON: return "CLKS_ON"; + case REQ_CLKS_OFF: return "REQ_CLKS_OFF"; + case REQ_CLKS_ON: return "REQ_CLKS_ON"; + default: return "UNKNOWN_STATE"; + } +} + static void ufshcd_ungate_work(struct work_struct *work) { int ret; @@ -704,17 +738,6 @@ unblock_reqs: scsi_unblock_requests(hba->host); } -static const char *to_string(enum clk_gating_state state) -{ - switch (state) { - case CLKS_OFF: return "CLKS_OFF"; - case CLKS_ON: return "CLKS_ON"; - case REQ_CLKS_OFF: return "REQ_CLKS_OFF"; - case REQ_CLKS_ON: return "REQ_CLKS_ON"; - default: return "UNKNOWN_STATE"; - } -} - /** * ufshcd_hold - Enable clocks that were gated earlier due to ufshcd_release. * Also, exit from hibern8 mode and set the link as active. @@ -739,7 +762,8 @@ start: if (cancel_delayed_work(&hba->clk_gating.gate_work)) { hba->clk_gating.state = CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); break; } /* @@ -751,7 +775,8 @@ start: scsi_block_requests(hba->host); hba->clk_gating.state = REQ_CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); schedule_work(&hba->clk_gating.ungate_work); /* * fall through to check if we should wait for this @@ -790,7 +815,8 @@ static void ufshcd_gate_work(struct work_struct *work) if (hba->clk_gating.is_suspended) { hba->clk_gating.state = CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); goto rel_lock; } @@ -807,7 +833,8 @@ static void ufshcd_gate_work(struct work_struct *work) if (ufshcd_uic_hibern8_enter(hba)) { hba->clk_gating.state = CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); goto out; } ufshcd_set_link_hibern8(hba); @@ -837,7 +864,8 @@ static void ufshcd_gate_work(struct work_struct *work) if (hba->clk_gating.state == REQ_CLKS_OFF) { hba->clk_gating.state = CLKS_OFF; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); } rel_lock: spin_unlock_irqrestore(hba->host->host_lock, flags); @@ -861,7 +889,8 @@ static void __ufshcd_release(struct ufs_hba *hba) hba->clk_gating.state = REQ_CLKS_OFF; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); schedule_delayed_work(&hba->clk_gating.gate_work, msecs_to_jiffies(hba->clk_gating.delay_ms)); } @@ -3607,6 +3636,7 @@ static int ufshcd_enable_auto_bkops(struct ufs_hba *hba) } hba->auto_bkops_enabled = true; + trace_ufshcd_auto_bkops_state(dev_name(hba->dev), "Enabled"); /* No need of URGENT_BKOPS exception from the device */ err = ufshcd_disable_ee(hba, MASK_EE_URGENT_BKOPS); @@ -3657,6 +3687,7 @@ static int ufshcd_disable_auto_bkops(struct ufs_hba *hba) } hba->auto_bkops_enabled = false; + trace_ufshcd_auto_bkops_state(dev_name(hba->dev), "Disabled"); out: return err; } @@ -4721,7 +4752,9 @@ out: } trace_ufshcd_init(dev_name(hba->dev), ret, - ktime_to_us(ktime_sub(ktime_get(), start))); + ktime_to_us(ktime_sub(ktime_get(), start)), + ufschd_uic_link_state_to_string(hba->uic_link_state), + ufschd_ufs_dev_pwr_mode_to_string(hba->curr_dev_pwr_mode)); return ret; } @@ -5206,7 +5239,8 @@ out: spin_lock_irqsave(hba->host->host_lock, flags); hba->clk_gating.state = CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string( + hba->clk_gating.state)); spin_unlock_irqrestore(hba->host->host_lock, flags); } @@ -5685,7 +5719,7 @@ disable_clks: hba->clk_gating.state = CLKS_OFF; trace_ufshcd_clk_gating(dev_name(hba->dev), - to_string(hba->clk_gating.state)); + ufschd_clk_gating_state_to_string(hba->clk_gating.state)); /* * Disable the host irq as host controller as there won't be any * host controller transaction expected till resume. @@ -5849,7 +5883,9 @@ int ufshcd_system_suspend(struct ufs_hba *hba) ret = ufshcd_suspend(hba, UFS_SYSTEM_PM); out: trace_ufshcd_system_suspend(dev_name(hba->dev), ret, - ktime_to_us(ktime_sub(ktime_get(), start))); + ktime_to_us(ktime_sub(ktime_get(), start)), + ufschd_uic_link_state_to_string(hba->uic_link_state), + ufschd_ufs_dev_pwr_mode_to_string(hba->curr_dev_pwr_mode)); if (!ret) hba->is_sys_suspended = true; return ret; @@ -5878,7 +5914,9 @@ int ufshcd_system_resume(struct ufs_hba *hba) ret = ufshcd_resume(hba, UFS_SYSTEM_PM); out: trace_ufshcd_system_resume(dev_name(hba->dev), ret, - ktime_to_us(ktime_sub(ktime_get(), start))); + ktime_to_us(ktime_sub(ktime_get(), start)), + ufschd_uic_link_state_to_string(hba->uic_link_state), + ufschd_ufs_dev_pwr_mode_to_string(hba->curr_dev_pwr_mode)); return ret; } EXPORT_SYMBOL(ufshcd_system_resume); @@ -5902,7 +5940,9 @@ int ufshcd_runtime_suspend(struct ufs_hba *hba) ret = ufshcd_suspend(hba, UFS_RUNTIME_PM); out: trace_ufshcd_runtime_suspend(dev_name(hba->dev), ret, - ktime_to_us(ktime_sub(ktime_get(), start))); + ktime_to_us(ktime_sub(ktime_get(), start)), + ufschd_uic_link_state_to_string(hba->uic_link_state), + ufschd_ufs_dev_pwr_mode_to_string(hba->curr_dev_pwr_mode)); return ret; } @@ -5940,7 +5980,9 @@ int ufshcd_runtime_resume(struct ufs_hba *hba) ret = ufshcd_resume(hba, UFS_RUNTIME_PM); out: trace_ufshcd_runtime_resume(dev_name(hba->dev), ret, - ktime_to_us(ktime_sub(ktime_get(), start))); + ktime_to_us(ktime_sub(ktime_get(), start)), + ufschd_uic_link_state_to_string(hba->uic_link_state), + ufschd_ufs_dev_pwr_mode_to_string(hba->curr_dev_pwr_mode)); return ret; } EXPORT_SYMBOL(ufshcd_runtime_resume); diff --git a/include/trace/events/ufs.h b/include/trace/events/ufs.h index 36cd5ac3d43a..7b3d9e140272 100644 --- a/include/trace/events/ufs.h +++ b/include/trace/events/ufs.h @@ -67,50 +67,82 @@ TRACE_EVENT(ufshcd_clk_scaling, __entry->prev_state, __entry->curr_state) ); +TRACE_EVENT(ufshcd_auto_bkops_state, + + TP_PROTO(const char *dev_name, const char *state), + + TP_ARGS(dev_name, state), + + TP_STRUCT__entry( + __string(dev_name, dev_name) + __string(state, state) + ), + + TP_fast_assign( + __assign_str(dev_name, dev_name); + __assign_str(state, state); + ), + + TP_printk("%s: auto bkops - %s", + __get_str(dev_name), __get_str(state)) +); + DECLARE_EVENT_CLASS(ufshcd_template, - TP_PROTO(const char *dev_name, int err, s64 usecs), + TP_PROTO(const char *dev_name, int err, s64 usecs, + const char *dev_state, const char *link_state), - TP_ARGS(dev_name, err, usecs), + TP_ARGS(dev_name, err, usecs, dev_state, link_state), TP_STRUCT__entry( __field(s64, usecs) __field(int, err) __string(dev_name, dev_name) + __string(dev_state, dev_state) + __string(link_state, link_state) ), TP_fast_assign( __entry->usecs = usecs; __entry->err = err; __assign_str(dev_name, dev_name); + __assign_str(dev_state, dev_state); + __assign_str(link_state, link_state); ), TP_printk( - "took %lld usecs, %s err %d", - __entry->usecs, + "%s: took %lld usecs, dev_state: %s, link_state: %s, err %d", __get_str(dev_name), + __entry->usecs, + __get_str(dev_state), + __get_str(link_state), __entry->err ) ); DEFINE_EVENT(ufshcd_template, ufshcd_system_suspend, - TP_PROTO(const char *dev_name, int err, s64 usecs), - TP_ARGS(dev_name, err, usecs)); + TP_PROTO(const char *dev_name, int err, s64 usecs, + const char *dev_state, const char *link_state), + TP_ARGS(dev_name, err, usecs, dev_state, link_state)); DEFINE_EVENT(ufshcd_template, ufshcd_system_resume, - TP_PROTO(const char *dev_name, int err, s64 usecs), - TP_ARGS(dev_name, err, usecs)); + TP_PROTO(const char *dev_name, int err, s64 usecs, + const char *dev_state, const char *link_state), + TP_ARGS(dev_name, err, usecs, dev_state, link_state)); DEFINE_EVENT(ufshcd_template, ufshcd_runtime_suspend, - TP_PROTO(const char *dev_name, int err, s64 usecs), - TP_ARGS(dev_name, err, usecs)); + TP_PROTO(const char *dev_name, int err, s64 usecs, + const char *dev_state, const char *link_state), + TP_ARGS(dev_name, err, usecs, dev_state, link_state)); DEFINE_EVENT(ufshcd_template, ufshcd_runtime_resume, - TP_PROTO(const char *dev_name, int err, s64 usecs), - TP_ARGS(dev_name, err, usecs)); + TP_PROTO(const char *dev_name, int err, s64 usecs, + const char *dev_state, const char *link_state), + TP_ARGS(dev_name, err, usecs, dev_state, link_state)); DEFINE_EVENT(ufshcd_template, ufshcd_init, - TP_PROTO(const char *dev_name, int err, s64 usecs), - TP_ARGS(dev_name, err, usecs)); + TP_PROTO(const char *dev_name, int err, s64 usecs, + const char *dev_state, const char *link_state), + TP_ARGS(dev_name, err, usecs, dev_state, link_state)); #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */ /* This part must be outside protection */ |
