Kaynağa Gözat

disp: msm: enable power resources while dumping registers in WQ

Enable sde power resources while dumping the registers in
SDE_DBG_DUMP_IRQ_CTX context after switching to workqueue.
The call is initiated from IRQ context and queued to workqueue
for execution. The extra vote will make sure the resources are
kept enabled through the register dumping.

Change-Id: I938049f6e2f1504ada2ce34ed4f56abb9c564f10
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 4 yıl önce
ebeveyn
işleme
031b1b5935
1 değiştirilmiş dosya ile 12 ekleme ve 15 silme
  1. 12 15
      msm/sde_dbg.c

+ 12 - 15
msm/sde_dbg.c

@@ -444,17 +444,6 @@ static struct sde_debug_bus_entry dp_dbg_bus[] = {
 	{DPTX_DEBUG_BUS_CTRL, DPTX_DEBUG_BUS_OUTPUT, 0, 1, 0, 145},
 };
 
-/**
- * _sde_power_check - check if power needs to enabled
- * @dump_mode: to check if power need to be enabled
- * Return: true if success; false otherwise
- */
-static inline bool _sde_power_check(enum sde_dbg_dump_context dump_mode)
-{
-	return (dump_mode == SDE_DBG_DUMP_CLK_ENABLED_CTX ||
-		dump_mode == SDE_DBG_DUMP_IRQ_CTX) ? false : true;
-}
-
 /**
  * _sde_dump_reg - helper function for dumping rotator register set content
  * @dump_name: register set name
@@ -972,12 +961,19 @@ static void _sde_dump_array(bool do_panic, const char *name, bool dump_secure, u
 	int rc;
 	ktime_t start, end;
 	struct sde_dbg_base *dbg_base = &sde_dbg_base;
+	bool skip_power;
 
 	mutex_lock(&dbg_base->mutex);
 
+	/*
+	 * sde power resources are expected to be enabled in this context and might
+	 * result in deadlock if its called again.
+	 */
+	skip_power = (dbg_base->dump_mode == SDE_DBG_DUMP_CLK_ENABLED_CTX);
+
 	sde_evtlog_dump_all(dbg_base->evtlog);
 
-	if (_sde_power_check(dbg_base->dump_mode)) {
+	if (!skip_power) {
 		rc = pm_runtime_get_sync(dbg_base->dev);
 		if (rc < 0) {
 			pr_err("failed to enable power %d\n", rc);
@@ -989,8 +985,9 @@ static void _sde_dump_array(bool do_panic, const char *name, bool dump_secure, u
 	_sde_dump_reg_mask(dump_blk_mask, dump_secure);
 	end = ktime_get();
 	dev_info(dbg_base->dev,
-			"reg-dump logging time start_us:%llu, end_us:%llu , duration_us:%llu\n",
-			ktime_to_us(start), ktime_to_us(end), ktime_us_delta(end, start));
+		"ctx:%d, reg-dump logging time start_us:%llu, end_us:%llu , duration_us:%llu\n",
+		dbg_base->dump_mode, ktime_to_us(start), ktime_to_us(end),
+		ktime_us_delta(end, start));
 
 	start = ktime_get();
 	if (dump_blk_mask & SDE_DBG_SDE_DBGBUS)
@@ -1016,7 +1013,7 @@ static void _sde_dump_array(bool do_panic, const char *name, bool dump_secure, u
 			"debug-bus logging time start_us:%llu, end_us:%llu , duration_us:%llu\n",
 			ktime_to_us(start), ktime_to_us(end), ktime_us_delta(end, start));
 
-	if (_sde_power_check(dbg_base->dump_mode))
+	if (!skip_power)
 		pm_runtime_put_sync(dbg_base->dev);
 
 	if (do_panic && dbg_base->panic_on_err)