All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mahesh Kumar <mahesh1.kumar@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH] drm/i915/skl: distribute DDB based on panel resolution
Date: Mon, 30 Jul 2018 19:42:02 +0530	[thread overview]
Message-ID: <20180730141202.18021-1-mahesh1.kumar@intel.com> (raw)

We distribute DDB equally among all pipes irrespective of display
buffer requirement of each pipe. This leads to a situation where high
resolution y-tiled display can not be enabled with 2 low resolution
displays.

Main contributing factor for DDB requirement is width of the display.
This patch make changes to distribute ddb based on display width.
So display with higher width will get bigger chunk of DDB.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107113
Cc: raviraj.p.sitaram@intel.com
Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com>
---
 drivers/gpu/drm/i915/intel_pm.c | 55 +++++++++++++++++++++++++++++++----------
 1 file changed, 42 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 7312ecb73415..e092f0deb93d 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3814,8 +3814,14 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
 	struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	struct drm_crtc *for_crtc = cstate->base.crtc;
+	enum pipe for_pipe = to_intel_crtc(for_crtc)->pipe;
+	const struct drm_crtc_state *crtc_state;
+	const struct drm_crtc *crtc;
+	u32 pipe_width[I915_MAX_PIPES] = {0};
+	u32 total_width = 0, width_before_pipe = 0;
 	unsigned int pipe_size, ddb_size;
-	int nth_active_pipe;
+	u16 ddb_size_before_pipe;
+	u32 i;
 
 	if (WARN_ON(!state) || !cstate->base.active) {
 		alloc->start = 0;
@@ -3833,14 +3839,14 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
 				      *num_active, ddb);
 
 	/*
-	 * If the state doesn't change the active CRTC's, then there's
-	 * no need to recalculate; the existing pipe allocation limits
-	 * should remain unchanged.  Note that we're safe from racing
-	 * commits since any racing commit that changes the active CRTC
-	 * list would need to grab _all_ crtc locks, including the one
-	 * we currently hold.
+	 * If the state doesn't change the active CRTC's or there is no
+	 * modeset request, then there's no need to recalculate;
+	 * the existing pipe allocation limits should remain unchanged.
+	 * Note that we're safe from racing commits since any racing commit
+	 * that changes the active CRTC list or do modeset would need to
+	 * grab _all_ crtc locks, including the one we currently hold.
 	 */
-	if (!intel_state->active_pipe_changes) {
+	if (!intel_state->active_pipe_changes && !intel_state->modeset) {
 		/*
 		 * alloc may be cleared by clear_intel_crtc_state,
 		 * copy from old state to be sure
@@ -3849,10 +3855,33 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
 		return;
 	}
 
-	nth_active_pipe = hweight32(intel_state->active_crtcs &
-				    (drm_crtc_mask(for_crtc) - 1));
-	pipe_size = ddb_size / hweight32(intel_state->active_crtcs);
-	alloc->start = nth_active_pipe * ddb_size / *num_active;
+	/*
+	 * Watermark/ddb requirement highly depends upon width of the
+	 * framebuffer, So instead of allocating DDB equally among pipes
+	 * distribute DDB based on resolution/width of the display.
+	 */
+	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+		const struct drm_display_mode *adjusted_mode;
+		int hdisplay, vdisplay;
+		enum pipe pipe;
+
+		if (!crtc_state->enable)
+			continue;
+
+		pipe = to_intel_crtc(crtc)->pipe;
+		adjusted_mode = &crtc_state->adjusted_mode;
+		drm_mode_get_hv_timing(adjusted_mode, &hdisplay, &vdisplay);
+		pipe_width[pipe] = hdisplay;
+		total_width += pipe_width[pipe];
+
+		if (pipe < for_pipe)
+			width_before_pipe += pipe_width[pipe];
+	}
+
+	ddb_size_before_pipe = div_u64(ddb_size * width_before_pipe,
+				       total_width);
+	pipe_size = div_u64(ddb_size * pipe_width[for_pipe], total_width);
+	alloc->start = ddb_size_before_pipe;
 	alloc->end = alloc->start + pipe_size;
 }
 
@@ -5259,7 +5288,7 @@ skl_ddb_add_affected_pipes(struct drm_atomic_state *state, bool *changed)
 	 * any other display updates race with this transaction, so we need
 	 * to grab the lock on *all* CRTC's.
 	 */
-	if (intel_state->active_pipe_changes) {
+	if (intel_state->active_pipe_changes || intel_state->modeset) {
 		realloc_pipes = ~0;
 		intel_state->wm_results.dirty_pipes = ~0;
 	}
-- 
2.16.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

             reply	other threads:[~2018-07-30 14:11 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-30 14:12 Mahesh Kumar [this message]
2018-07-30 15:37 ` ✓ Fi.CI.BAT: success for drm/i915/skl: distribute DDB based on panel resolution Patchwork
2018-07-30 15:38 ` [PATCH] " Chris Wilson
2018-07-31  6:16   ` Kumar, Mahesh
2018-07-31 14:24     ` [PATCH v2 0/2] " Mahesh Kumar
2018-07-31 14:24       ` [PATCH v1 1/2] drm/i915: ddb_size is of u16 type Mahesh Kumar
2018-07-31 21:54         ` Chris Wilson
2018-07-31 14:24       ` [PATCH v2 2/2] drm/i915/skl: distribute DDB based on panel resolution Mahesh Kumar
2018-07-31 21:53         ` Chris Wilson
2018-08-01 15:11           ` [PATCH v3 " Mahesh Kumar
2018-08-01 15:11             ` Chris Wilson
2018-08-07  8:35               ` Maarten Lankhorst
2018-07-30 17:04 ` ✓ Fi.CI.IGT: success for " Patchwork
2018-07-31 15:13 ` ✓ Fi.CI.BAT: success for drm/i915/skl: distribute DDB based on panel resolution (rev2) Patchwork
2018-07-31 16:51 ` ✓ Fi.CI.IGT: " Patchwork
2018-08-01 15:43 ` ✓ Fi.CI.BAT: success for drm/i915/skl: distribute DDB based on panel resolution (rev3) Patchwork
2018-08-01 17:40 ` ✓ Fi.CI.IGT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180730141202.18021-1-mahesh1.kumar@intel.com \
    --to=mahesh1.kumar@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.