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: Deepak Rawat <drawat@vmware.com>, lukasz.spintzyk@displaylink.com
Subject: [PATCH 04/14] drm: add helper to implement legacy dirtyfb
Date: Wed, 5 Sep 2018 16:38:51 -0700	[thread overview]
Message-ID: <20180905233901.2321-5-drawat@vmware.com> (raw)
In-Reply-To: <20180905233901.2321-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.

Signed-off-by: Rob Clark <robdclark@gmail.com>
Signed-off-by: Deepak Rawat <drawat@vmware.com>
---
 drivers/gpu/drm/drm_damage_helper.c | 116 ++++++++++++++++++++++++++++
 include/drm/drm_damage_helper.h     |   4 +
 2 files changed, 120 insertions(+)

diff --git a/drivers/gpu/drm/drm_damage_helper.c b/drivers/gpu/drm/drm_damage_helper.c
index 7d70f6001889..b016ec375295 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>
  *
  **************************************************************************/
 
@@ -81,6 +82,21 @@ static int convert_fixed_to_32(int fixed)
 	return ((fixed >> 15) & 1) + (fixed >> 16);
 }
 
+static void convert_clip_rect_to_rect(const struct drm_clip_rect *src,
+				      struct drm_rect *dest,
+				      uint32_t num_clips)
+{
+	while (num_clips > 0) {
+		dest->x1 = src->x1;
+		dest->y1 = src->y1;
+		dest->x2 = src->x2;
+		dest->y2 = src->y2;
+		src++;
+		dest++;
+		num_clips--;
+	}
+}
+
 /**
  * drm_plane_enable_fb_damage_clips - enables plane fb damage clips property
  * @plane: plane on which to enable damage clips property
@@ -183,3 +199,103 @@ drm_atomic_helper_damage_iter_next(struct drm_atomic_helper_damage_iter *iter,
 	return ret;
 }
 EXPORT_SYMBOL(drm_atomic_helper_damage_iter_next);
+
+/**
+ * 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. This helper will do a
+ * full update in case of annotate flags.
+ *
+ * Returns: 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_atomic_state *state;
+	struct drm_plane *plane;
+	struct drm_rect *rects = NULL;
+	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;
+
+	WARN_ONCE(flags & DRM_MODE_FB_DIRTY_FLAGS,
+		  "Full update for dirtyfb with DRM_MODE_FB_DIRTY_FLAGS\n");
+
+	if (!(flags & DRM_MODE_FB_DIRTY_FLAGS)) {
+		rects = kcalloc(num_clips, sizeof(*rects), GFP_KERNEL);
+		if (!rects) {
+			ret = -ENOMEM;
+			goto out;
+		}
+
+		convert_clip_rect_to_rect(clips, rects, num_clips);
+		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);
diff --git a/include/drm/drm_damage_helper.h b/include/drm/drm_damage_helper.h
index 1f988f7fdd72..9d5c9444761b 100644
--- a/include/drm/drm_damage_helper.h
+++ b/include/drm/drm_damage_helper.h
@@ -89,5 +89,9 @@ drm_atomic_helper_damage_iter_init(struct drm_atomic_helper_damage_iter *iter,
 bool
 drm_atomic_helper_damage_iter_next(struct drm_atomic_helper_damage_iter *iter,
 				   struct drm_rect *rect);
+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);
 
 #endif
-- 
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-09-05 23:39 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-05 23:38 [PATCH 00/14] plane update with damage Deepak Rawat
2018-09-05 23:38 ` [PATCH 01/14] drm: add new plane property FB_DAMAGE_CLIPS to send damage during plane update Deepak Rawat
2018-09-06  7:42   ` Daniel Vetter
2018-09-06 21:36     ` Deepak Singh Rawat
2018-09-07  9:27       ` Pekka Paalanen
2018-09-11  4:33         ` Deepak Singh Rawat
2018-09-06  8:00   ` Daniel Vetter
2018-09-06 11:59   ` Ville Syrjälä
2018-09-06 22:32     ` Deepak Singh Rawat
2018-09-07 14:23       ` Ville Syrjälä
2018-09-11  4:43         ` Deepak Singh Rawat
2018-09-05 23:38 ` [PATCH 02/14] drm: add helper iterator functions for plane fb_damage_clips blob Deepak Rawat
2018-09-06  7:51   ` Daniel Vetter
2018-09-06 21:44     ` Deepak Singh Rawat
2018-09-07 19:41       ` Daniel Vetter
2018-09-05 23:38 ` [PATCH 03/14] drm: clear plane damage during full modeset Deepak Rawat
2018-09-06  7:56   ` Daniel Vetter
2018-09-06 21:47     ` Deepak Singh Rawat
2018-09-06 12:02   ` Ville Syrjälä
2018-09-06 14:12     ` Daniel Vetter
2018-09-06 14:29       ` Ville Syrjälä
2018-09-05 23:38 ` Deepak Rawat [this message]
2018-09-06  8:21   ` [PATCH 04/14] drm: add helper to implement legacy dirtyfb Daniel Vetter
2018-09-05 23:38 ` [PATCH 05/14] drm/vmwgfx: add a new interface for plane update on a display unit Deepak Rawat
2018-09-10  8:09   ` Thomas Hellstrom
2018-09-10  8:21     ` Jani Nikula
2018-09-05 23:38 ` [PATCH 06/14] drm/vmwgfx: implement STDU plane update for surface backed fb Deepak Rawat
2018-09-05 23:38 ` [PATCH 07/14] drm/vmwgfx: implement STDU plane update for BO " Deepak Rawat
2018-09-05 23:38 ` [PATCH 08/14] drm/vmwgfx: use the new interface for STDU plane update Deepak Rawat
2018-09-10  8:18   ` Thomas Hellstrom
2018-09-05 23:38 ` [PATCH 09/14] drm/vmwgfx: enable FB_DAMAGE_CLIPS property for STDU primary plane Deepak Rawat
2018-09-10  8:20   ` Thomas Hellstrom
2018-09-05 23:38 ` [PATCH 10/14] drm/vmwgfx: implement SOU plane update for surface backed fb Deepak Rawat
2018-09-05 23:38 ` [PATCH 11/14] drm/vmwgfx: implement SOU plane update for BO " Deepak Rawat
2018-09-05 23:38 ` [PATCH 12/14] drm/vmwgfx: use the new interface for SOU plane update Deepak Rawat
2018-09-05 23:39 ` [PATCH 13/14] drm/vmwgfx: enable FB_DAMAGE_CLIPS property for SOU primary plane Deepak Rawat
2018-09-05 23:39 ` [PATCH 14/14] drm/vmwgfx: use atomic helper function for dirty fb IOCTL Deepak Rawat

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=20180905233901.2321-5-drawat@vmware.com \
    --to=drawat@vmware.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-graphics-maintainer@vmware.com \
    --cc=lukasz.spintzyk@displaylink.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.