Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8acd9db authored by Subhash Jadavani's avatar Subhash Jadavani Committed by Gerrit - the friendly Code Review server
Browse files

scsi: ufs: add additional tracing messages



This patch adds following tracing messages:
 - Add support to trace the automatic background operations enable/disable
   events.
 - Add addition logs to trace the UFS device and UFS link state during
   suspend/resume and initialization.

Change-Id: I732b255296042442e50278c2700c52bd166e1d8b
Signed-off-by: default avatarSubhash Jadavani <subhashj@codeaurora.org>
parent a18d2ea1
Loading
Loading
Loading
Loading
+66 −24
Original line number Diff line number Diff line
@@ -662,6 +662,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;
@@ -700,17 +734,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.
@@ -735,7 +758,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;
		}
		/*
@@ -747,7 +771,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
@@ -784,7 +809,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;
	}

@@ -801,7 +827,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);
@@ -831,7 +858,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);
@@ -855,7 +883,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));
}
@@ -3512,6 +3541,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);
@@ -3562,6 +3592,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;
}
@@ -4548,7 +4579,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;
}

@@ -5020,7 +5053,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);
	}
	return ret;
@@ -5466,7 +5500,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 trasanction expected till resume.
@@ -5625,7 +5659,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;
@@ -5654,7 +5690,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);
@@ -5678,7 +5716,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;
}
EXPORT_SYMBOL(ufshcd_runtime_suspend);
@@ -5715,7 +5755,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);
+46 −14
Original line number Diff line number Diff line
@@ -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 */