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

Commit 77b32938 authored by Narendra Muppalla's avatar Narendra Muppalla
Browse files

drm/msm/sde: add kernel traces to measure enable/disable/kickoff times



Add kernel debug traces in drm to measure the performance of
the driver during enable/disable/commit/kickoff.

Change-Id: I7122e81b2c320f05bb42091971827908b7c6436f
Signed-off-by: default avatarNarendra Muppalla <NarendraM@codeaurora.org>
parent 6a9b4102
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "msm_kms.h"
#include "sde_connector.h"
#include "dsi_drm.h"
#include "sde_trace.h"

#define to_dsi_bridge(x)     container_of((x), struct dsi_bridge, base)
#define to_dsi_state(x)      container_of((x), struct dsi_connector_state, base)
@@ -134,19 +135,24 @@ static void dsi_bridge_pre_enable(struct drm_bridge *bridge)
		return;
	}

	SDE_ATRACE_BEGIN("dsi_bridge_pre_enable");
	rc = dsi_display_prepare(c_bridge->display);
	if (rc) {
		pr_err("[%d] DSI display prepare failed, rc=%d\n",
		       c_bridge->id, rc);
		SDE_ATRACE_END("dsi_bridge_pre_enable");
		return;
	}

	SDE_ATRACE_BEGIN("dsi_display_enable");
	rc = dsi_display_enable(c_bridge->display);
	if (rc) {
		pr_err("[%d] DSI display enable failed, rc=%d\n",
		       c_bridge->id, rc);
		(void)dsi_display_unprepare(c_bridge->display);
	}
	SDE_ATRACE_END("dsi_display_enable");
	SDE_ATRACE_END("dsi_bridge_pre_enable");
}

static void dsi_bridge_enable(struct drm_bridge *bridge)
@@ -197,19 +203,25 @@ static void dsi_bridge_post_disable(struct drm_bridge *bridge)
		return;
	}

	SDE_ATRACE_BEGIN("dsi_bridge_post_disable");
	SDE_ATRACE_BEGIN("dsi_display_disable");
	rc = dsi_display_disable(c_bridge->display);
	if (rc) {
		pr_err("[%d] DSI display disable failed, rc=%d\n",
		       c_bridge->id, rc);
		SDE_ATRACE_END("dsi_display_disable");
		return;
	}
	SDE_ATRACE_END("dsi_display_disable");

	rc = dsi_display_unprepare(c_bridge->display);
	if (rc) {
		pr_err("[%d] DSI display unprepare failed, rc=%d\n",
		       c_bridge->id, rc);
		SDE_ATRACE_END("dsi_bridge_post_disable");
		return;
	}
	SDE_ATRACE_END("dsi_bridge_post_disable");
}

static void dsi_bridge_mode_set(struct drm_bridge *bridge,
+17 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "msm_kms.h"
#include "msm_gem.h"
#include "msm_fence.h"
#include "sde_trace.h"

struct msm_commit {
	struct drm_device *dev;
@@ -96,6 +97,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
	struct drm_crtc_state *old_crtc_state;
	int i;

	SDE_ATRACE_BEGIN("msm_disable");
	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
		const struct drm_encoder_helper_funcs *funcs;
		struct drm_encoder *encoder;
@@ -177,6 +179,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
		else
			funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
	}
	SDE_ATRACE_END("msm_disable");
}

static void
@@ -286,6 +289,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
	int bridge_enable_count = 0;
	int i;

	SDE_ATRACE_BEGIN("msm_enable");
	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
		const struct drm_crtc_helper_funcs *funcs;

@@ -352,8 +356,10 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
	}

	/* If no bridges were pre_enabled, skip iterating over them again */
	if (bridge_enable_count == 0)
	if (bridge_enable_count == 0) {
		SDE_ATRACE_END("msm_enable");
		return;
	}

	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
		struct drm_encoder *encoder;
@@ -373,6 +379,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,

		drm_bridge_enable(encoder->bridge);
	}
	SDE_ATRACE_END("msm_enable");
}

/* The (potentially) asynchronous part of the commit.  At this point
@@ -430,7 +437,9 @@ static void _msm_drm_commit_work_cb(struct kthread_work *work)

	commit = container_of(work, struct msm_commit, commit_work);

	SDE_ATRACE_BEGIN("complete_commit");
	complete_commit(commit);
	SDE_ATRACE_END("complete_commit");
}

static struct msm_commit *commit_init(struct drm_atomic_state *state)
@@ -512,9 +521,12 @@ int msm_atomic_commit(struct drm_device *dev,
	struct drm_plane_state *plane_state;
	int i, ret;

	SDE_ATRACE_BEGIN("atomic_commit");
	ret = drm_atomic_helper_prepare_planes(dev, state);
	if (ret)
	if (ret) {
		SDE_ATRACE_END("atomic_commit");
		return ret;
	}

	c = commit_init(state);
	if (!c) {
@@ -592,14 +604,17 @@ int msm_atomic_commit(struct drm_device *dev,
			commit_destroy(c);
			goto error;
		}
		SDE_ATRACE_END("atomic_commit");
		return 0;
	}

	complete_commit(c);

	SDE_ATRACE_END("atomic_commit");
	return 0;

error:
	drm_atomic_helper_cleanup_planes(dev, state);
	SDE_ATRACE_END("atomic_commit");
	return ret;
}
+8 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
#include "sde_connector.h"
#include "sde_power_handle.h"
#include "sde_core_perf.h"
#include "sde_trace.h"

struct sde_crtc_irq_info {
	struct sde_irq_callback irq;
@@ -1739,6 +1740,7 @@ static void _sde_crtc_wait_for_fences(struct drm_crtc *crtc)
	 * if its fence has timed out. Call input fence wait multiple times if
	 * fence wait is interrupted due to interrupt call.
	 */
	SDE_ATRACE_BEGIN("plane_wait_input_fence");
	drm_atomic_crtc_for_each_plane(plane, crtc) {
		do {
			kt_wait = ktime_sub(kt_end, ktime_get());
@@ -1750,6 +1752,7 @@ static void _sde_crtc_wait_for_fences(struct drm_crtc *crtc)
			rc = sde_plane_wait_input_fence(plane, wait_ms);
		} while (wait_ms && rc == -ERESTARTSYS);
	}
	SDE_ATRACE_END("plane_wait_input_fence");
}

static void _sde_crtc_setup_mixer_for_encoder(
@@ -2076,6 +2079,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc)
	if (unlikely(!sde_crtc->num_mixers))
		return;

	SDE_ATRACE_BEGIN("crtc_commit");
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
		struct sde_encoder_kickoff_params params = { 0 };

@@ -2097,7 +2101,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc)
		SDE_ERROR("crtc%d invalid frame pending\n",
				crtc->base.id);
		SDE_EVT32(DRMID(crtc), 0);
		return;
		goto end;
	} else if (atomic_inc_return(&sde_crtc->frame_pending) == 1) {
		/* acquire bandwidth and other resources */
		SDE_DEBUG("crtc%d first commit\n", crtc->base.id);
@@ -2113,6 +2117,9 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc)

		sde_encoder_kickoff(encoder);
	}
end:
	SDE_ATRACE_END("crtc_commit");
	return;
}

/**
+7 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include "sde_power_handle.h"
#include "sde_hw_dsc.h"
#include "sde_crtc.h"
#include "sde_trace.h"

#define SDE_DEBUG_ENC(e, fmt, ...) SDE_DEBUG("enc%d " fmt,\
		(e) ? (e)->base.base.id : -1, ##__VA_ARGS__)
@@ -1580,6 +1581,7 @@ static void sde_encoder_vblank_callback(struct drm_encoder *drm_enc,
	if (!drm_enc || !phy_enc)
		return;

	SDE_ATRACE_BEGIN("encoder_vblank_callback");
	sde_enc = to_sde_encoder_virt(drm_enc);

	spin_lock_irqsave(&sde_enc->enc_spinlock, lock_flags);
@@ -1588,6 +1590,7 @@ static void sde_encoder_vblank_callback(struct drm_encoder *drm_enc,
	spin_unlock_irqrestore(&sde_enc->enc_spinlock, lock_flags);

	atomic_inc(&phy_enc->vsync_cnt);
	SDE_ATRACE_END("encoder_vblank_callback");
}

static void sde_encoder_underrun_callback(struct drm_encoder *drm_enc,
@@ -1596,8 +1599,10 @@ static void sde_encoder_underrun_callback(struct drm_encoder *drm_enc,
	if (!phy_enc)
		return;

	SDE_ATRACE_BEGIN("encoder_underrun_callback");
	atomic_inc(&phy_enc->underrun_cnt);
	SDE_EVT32(DRMID(drm_enc), atomic_read(&phy_enc->underrun_cnt));
	SDE_ATRACE_END("encoder_underrun_callback");
}

void sde_encoder_register_vblank_callback(struct drm_encoder *drm_enc,
@@ -2133,6 +2138,7 @@ void sde_encoder_kickoff(struct drm_encoder *drm_enc)
		SDE_ERROR("invalid encoder\n");
		return;
	}
	SDE_ATRACE_BEGIN("encoder_kickoff");
	sde_enc = to_sde_encoder_virt(drm_enc);

	SDE_DEBUG_ENC(sde_enc, "\n");
@@ -2152,6 +2158,7 @@ void sde_encoder_kickoff(struct drm_encoder *drm_enc)
		if (phys && phys->ops.handle_post_kickoff)
			phys->ops.handle_post_kickoff(phys);
	}
	SDE_ATRACE_END("encoder_kickoff");
}

int sde_encoder_helper_hw_release(struct sde_encoder_phys *phys_enc,