All of lore.kernel.org
 help / color / mirror / Atom feed
From: Deepak Rawat <drawat@vmware.com>
To: dri-devel@lists.freedesktop.org,
	linux-graphics-maintainer@vmware.com, thellstrom@vmware.com,
	syeh@vmware.com
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>, Deepak Rawat <drawat@vmware.com>
Subject: [PATCH v3 05/18] drm: Add helper to implement legacy dirtyfb
Date: Wed, 10 Oct 2018 17:16:44 -0700	[thread overview]
Message-ID: <20181011001657.1715-5-drawat@vmware.com> (raw)
In-Reply-To: <20181011001657.1715-1-drawat@vmware.com>

From: Rob Clark <robdclark@gmail.com>

Add an atomic helper to implement dirtyfb support.  This is needed to
support DSI command-mode panels with x11 userspace (ie. when we can't
rely on pageflips to trigger a flush to the panel).

v2: Modified the helper to use plane fb_damage_clips property and
removed plane_state::dirty flag.

v3:
- Use uapi drm_mode_rect.
- Support annotate flags.

v4: Correct kernel doc.

Cc: ville.syrjala@linux.intel.com
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Pekka Paalanen <ppaalanen@gmail.com>
Cc: Daniel Stone <daniel@fooishbar.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
Signed-off-by: Deepak Rawat <drawat@vmware.com>
---
 drivers/gpu/drm/drm_damage_helper.c | 124 ++++++++++++++++++++++++++++
 include/drm/drm_damage_helper.h     |   4 +
 2 files changed, 128 insertions(+)

diff --git a/drivers/gpu/drm/drm_damage_helper.c b/drivers/gpu/drm/drm_damage_helper.c
index e80fa6e08a99..fdb5a072d7e9 100644
--- a/drivers/gpu/drm/drm_damage_helper.c
+++ b/drivers/gpu/drm/drm_damage_helper.c
@@ -26,6 +26,7 @@
  *
  * Authors:
  * Deepak Rawat <drawat@vmware.com>
+ * Rob Clark <robdclark@gmail.com>
  *
  **************************************************************************/
 
@@ -70,6 +71,21 @@
  * rectangles clipped to &drm_plane_state.src.
  */
 
+static void convert_clip_rect_to_rect(const struct drm_clip_rect *src,
+				      struct drm_mode_rect *dest,
+				      uint32_t num_clips, uint32_t src_inc)
+{
+	while (num_clips > 0) {
+		dest->x1 = src->x1;
+		dest->y1 = src->y1;
+		dest->x2 = src->x2;
+		dest->y2 = src->y2;
+		src += src_inc;
+		dest++;
+		num_clips--;
+	}
+}
+
 /**
  * drm_plane_enable_fb_damage_clips - Enables plane fb damage clips property.
  * @plane: Plane on which to enable damage clips property.
@@ -123,6 +139,114 @@ void drm_atomic_helper_check_plane_damage(struct drm_atomic_state *state,
 }
 EXPORT_SYMBOL(drm_atomic_helper_check_plane_damage);
 
+/**
+ * drm_atomic_helper_dirtyfb - Helper for dirtyfb.
+ * @fb: DRM framebuffer.
+ * @file_priv: Drm file for the ioctl call.
+ * @flags: Dirty fb annotate flags.
+ * @color: Color for annotate fill.
+ * @clips: Dirty region.
+ * @num_clips: Count of clip in clips.
+ *
+ * A helper to implement &drm_framebuffer_funcs::dirty using damage interface
+ * during plane update. If num_clips is 0 then this helper will do a full plane
+ * update. This is the same behaviour expected by dirtyfb ioctl().
+ *
+ * Note that this helper is blocking implementation. This is because current
+ * user of this helper is vmwgfx which needs blocking.
+ *
+ * Return: Zero on success, negative errno on failure.
+ */
+int drm_atomic_helper_dirtyfb(struct drm_framebuffer *fb,
+			      struct drm_file *file_priv, unsigned flags,
+			      unsigned color, struct drm_clip_rect *clips,
+			      unsigned num_clips)
+{
+	struct drm_modeset_acquire_ctx ctx;
+	struct drm_property_blob *damage = NULL;
+	struct drm_mode_rect *rects = NULL;
+	struct drm_atomic_state *state;
+	struct drm_plane *plane;
+	int ret = 0;
+
+	/*
+	 * When called from ioctl, we are interruptable, but not when called
+	 * internally (ie. defio worker)
+	 */
+	drm_modeset_acquire_init(&ctx,
+		file_priv ? DRM_MODESET_ACQUIRE_INTERRUPTIBLE : 0);
+
+	state = drm_atomic_state_alloc(fb->dev);
+	if (!state) {
+		ret = -ENOMEM;
+		goto out;
+	}
+	state->acquire_ctx = &ctx;
+
+	if (clips) {
+		uint32_t inc = 1;
+
+		if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) {
+			inc = 2;
+			num_clips /= 2;
+		}
+
+		rects = kcalloc(num_clips, sizeof(*rects), GFP_KERNEL);
+		if (!rects) {
+			ret = -ENOMEM;
+			goto out;
+		}
+
+		convert_clip_rect_to_rect(clips, rects, num_clips, inc);
+		damage = drm_property_create_blob(fb->dev,
+						  num_clips * sizeof(*rects),
+						  rects);
+		if (IS_ERR(damage)) {
+			ret = PTR_ERR(damage);
+			damage = NULL;
+			goto out;
+		}
+	}
+
+retry:
+	drm_for_each_plane(plane, fb->dev) {
+		struct drm_plane_state *plane_state;
+
+		if (plane->state->fb != fb)
+			continue;
+
+		plane_state = drm_atomic_get_plane_state(state, plane);
+		if (IS_ERR(plane_state)) {
+			ret = PTR_ERR(plane_state);
+			goto out;
+		}
+
+		drm_property_replace_blob(&plane_state->fb_damage_clips,
+					  damage);
+	}
+
+	ret = drm_atomic_commit(state);
+
+out:
+	if (ret == -EDEADLK) {
+		drm_atomic_state_clear(state);
+		ret = drm_modeset_backoff(&ctx);
+		if (!ret)
+			goto retry;
+	}
+
+	drm_property_blob_put(damage);
+	kfree(rects);
+	drm_atomic_state_put(state);
+
+	drm_modeset_drop_locks(&ctx);
+	drm_modeset_acquire_fini(&ctx);
+
+	return ret;
+
+}
+EXPORT_SYMBOL(drm_atomic_helper_dirtyfb);
+
 /**
  * drm_atomic_helper_damage_iter_init - Initialize the damage iterator.
  * @iter: The iterator to initialize.
diff --git a/include/drm/drm_damage_helper.h b/include/drm/drm_damage_helper.h
index b9a0d05fb093..82a7128c9f97 100644
--- a/include/drm/drm_damage_helper.h
+++ b/include/drm/drm_damage_helper.h
@@ -67,6 +67,10 @@ struct drm_atomic_helper_damage_iter {
 void drm_plane_enable_fb_damage_clips(struct drm_plane *plane);
 void drm_atomic_helper_check_plane_damage(struct drm_atomic_state *state,
 					  struct drm_plane_state *plane_state);
+int drm_atomic_helper_dirtyfb(struct drm_framebuffer *fb,
+			      struct drm_file *file_priv, unsigned flags,
+			      unsigned color, struct drm_clip_rect *clips,
+			      unsigned num_clips);
 void
 drm_atomic_helper_damage_iter_init(struct drm_atomic_helper_damage_iter *iter,
 				   const struct drm_plane_state *old_state,
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2018-10-11  0:17 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-11  0:16 [PATCH v3 01/18] drm: Add a new plane property to send damage during plane update Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 02/18] drm: Add a new helper to validate damage during atomic_check Deepak Rawat
2018-10-15 22:01   ` Sinclair Yeh
2018-10-11  0:16 ` [PATCH v3 03/18] drm: Add helper iterator functions for plane fb_damage_clips blob Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 04/18] drm/selftest: Add drm damage helper selftest Deepak Rawat
2018-10-11  0:16   ` [Intel-gfx] " Deepak Rawat
2018-10-11 16:23   ` Daniel Vetter
2018-10-11 16:23     ` [Intel-gfx] " Daniel Vetter
2018-10-15 16:11     ` Deepak Singh Rawat
2018-10-16 12:21       ` Daniel Vetter
2018-10-16 12:21         ` [Intel-gfx] " Daniel Vetter
2018-10-16 12:52         ` Alexandru-Cosmin Gheorghe
2018-10-16 12:52           ` Alexandru-Cosmin Gheorghe
2018-10-16 16:14           ` Deepak Singh Rawat
2018-10-16 16:14             ` Deepak Singh Rawat
2018-10-16 16:00         ` Deepak Singh Rawat
2018-10-16 16:00           ` [Intel-gfx] " Deepak Singh Rawat
2018-10-11  0:16 ` Deepak Rawat [this message]
2018-10-11 16:15   ` [PATCH v3 05/18] drm: Add helper to implement legacy dirtyfb Daniel Vetter
2018-10-11 16:21     ` Daniel Vetter
2018-10-11  0:16 ` [PATCH v3 06/18] drm/vmwgfx: Add a new interface for plane update on a display unit Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 07/18] drm/vmwgfx: Implement STDU plane update for surface backed fb Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 08/18] drm/vmwgfx: Implement STDU plane update for BO " Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 09/18] drm/vmwgfx: Use the new interface for STDU plane update Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 10/18] drm/vmwgfx: Updated comment for stdu " Deepak Rawat
2018-10-15 13:09   ` Thomas Hellstrom
2018-10-11  0:16 ` [PATCH v3 11/18] drm/vmwgfx: Enable FB_DAMAGE_CLIPS property for STDU primary plane Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 12/18] drm/vmwgfx: Implement SOU plane update for surface backed fb Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 13/18] drm/vmwgfx: Implement SOU plane update for BO " Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 14/18] drm/vmwgfx: Use the new interface for SOU plane update Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 15/18] drm/vmwgfx: Update comments for sou plane update function Deepak Rawat
2018-10-15 13:10   ` Thomas Hellstrom
2018-10-11  0:16 ` [PATCH v3 16/18] drm/vmwgfx: Enable FB_DAMAGE_CLIPS property for SOU primary plane Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 17/18] drm/vmwgfx: Use atomic helper function for dirty fb IOCTL Deepak Rawat
2018-10-11  0:16 ` [PATCH v3 18/18] drm/vmwgfx: Don't clear mode::type anymore Deepak Rawat
2018-10-15 13:12   ` Thomas Hellstrom
2018-10-15 13:15 ` [PATCH v3 01/18] drm: Add a new plane property to send damage during plane update Thomas Hellstrom

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=20181011001657.1715-5-drawat@vmware.com \
    --to=drawat@vmware.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-graphics-maintainer@vmware.com \
    --cc=syeh@vmware.com \
    --cc=thellstrom@vmware.com \
    /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.