summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/ufs/ufshcd.c90
-rw-r--r--include/trace/events/ufs.h60
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 */