All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel.vetter@ffwll.ch>
To: DRI Development <dri-devel@lists.freedesktop.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>,
	Daniel Vetter <daniel.vetter@intel.com>
Subject: [PATCH 24/27] drm: Resurrect atomic rmfb code
Date: Wed,  8 Jun 2016 14:19:16 +0200	[thread overview]
Message-ID: <1465388359-8070-24-git-send-email-daniel.vetter@ffwll.ch> (raw)
In-Reply-To: <1465388359-8070-1-git-send-email-daniel.vetter@ffwll.ch>

This was somehow lost between v3 and the merged version in Maarten's
patch merged as:

commit f2d580b9a8149735cbc4b59c4a8df60173658140
Author: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Date:   Wed May 4 14:38:26 2016 +0200

    drm/core: Do not preserve framebuffer on rmfb, v4.

Actual code copied from Maarten's patch, but with the slight change to
just use dev->mode_config.funcs->atomic_commit to decide whether to
use the atomic path or not.

Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
---
 drivers/gpu/drm/drm_atomic.c        | 66 +++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_crtc.c          |  6 ++++
 drivers/gpu/drm/drm_crtc_internal.h |  1 +
 3 files changed, 73 insertions(+)

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index d99ab2f6663f..dac0875e669c 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -1564,6 +1564,72 @@ void drm_atomic_clean_old_fb(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_atomic_clean_old_fb);
 
+int drm_atomic_remove_fb(struct drm_framebuffer *fb)
+{
+	struct drm_modeset_acquire_ctx ctx;
+	struct drm_device *dev = fb->dev;
+	struct drm_atomic_state *state;
+	struct drm_plane *plane;
+	int ret = 0;
+	unsigned plane_mask;
+
+	state = drm_atomic_state_alloc(dev);
+	if (!state)
+		return -ENOMEM;
+
+	drm_modeset_acquire_init(&ctx, 0);
+	state->acquire_ctx = &ctx;
+
+retry:
+	plane_mask = 0;
+	ret = drm_modeset_lock_all_ctx(dev, &ctx);
+	if (ret)
+		goto unlock;
+
+	drm_for_each_plane(plane, 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 unlock;
+		}
+
+		drm_atomic_set_fb_for_plane(plane_state, NULL);
+		ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
+		if (ret)
+			goto unlock;
+
+		plane_mask |= BIT(drm_plane_index(plane));
+
+		plane->old_fb = plane->fb;
+		plane->fb = NULL;
+	}
+
+	if (plane_mask)
+		ret = drm_atomic_commit(state);
+
+unlock:
+	if (plane_mask)
+		drm_atomic_clean_old_fb(dev, plane_mask, ret);
+
+	if (ret == -EDEADLK) {
+		drm_modeset_backoff(&ctx);
+		goto retry;
+	}
+
+	if (ret || !plane_mask)
+		drm_atomic_state_free(state);
+
+	drm_modeset_drop_locks(&ctx);
+	drm_modeset_acquire_fini(&ctx);
+
+	return ret;
+}
+
 int drm_mode_atomic_ioctl(struct drm_device *dev,
 			  void *data, struct drm_file *file_priv)
 {
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index ce0569c3f942..60a0a646dd6e 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -600,6 +600,11 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
 	 * in this manner.
 	 */
 	if (drm_framebuffer_read_refcount(fb) > 1) {
+		if (dev->mode_config.funcs->atomic_commit) {
+			drm_atomic_remove_fb(fb);
+			goto out;
+		}
+
 		drm_modeset_lock_all(dev);
 		/* remove from any CRTC */
 		drm_for_each_crtc(crtc, dev) {
@@ -621,6 +626,7 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
 		drm_modeset_unlock_all(dev);
 	}
 
+out:
 	drm_framebuffer_unreference(fb);
 }
 EXPORT_SYMBOL(drm_framebuffer_remove);
diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
index 8186c0e05c42..b426d37bc916 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -125,4 +125,5 @@ int drm_atomic_get_property(struct drm_mode_object *obj,
 			    struct drm_property *property, uint64_t *val);
 int drm_mode_atomic_ioctl(struct drm_device *dev,
 			  void *data, struct drm_file *file_priv);
+int drm_atomic_remove_fb(struct drm_framebuffer *fb);
 
-- 
2.8.1

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

  parent reply	other threads:[~2016-06-08 12:19 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-08 12:18 [PATCH 01/27] drm/atomic-helper: Massage swap_state signature somewhat Daniel Vetter
2016-06-08 12:18 ` [PATCH 02/27] drm/arc: Nuke event_list Daniel Vetter
2016-06-08 12:18   ` Daniel Vetter
2016-06-08 14:13   ` Maarten Lankhorst
2016-06-08 14:13     ` Maarten Lankhorst
2016-06-08 12:18 ` [PATCH 03/27] drm/arc: Actually bother with handling atomic events Daniel Vetter
2016-06-08 12:18   ` Daniel Vetter
2016-06-08 14:14   ` Maarten Lankhorst
2016-06-08 14:14     ` Maarten Lankhorst
2016-06-08 14:30     ` Daniel Vetter
2016-06-08 14:30       ` Daniel Vetter
2016-06-09 10:54       ` Alexey Brodkin
2016-06-09 10:54         ` Alexey Brodkin
2016-06-09 12:26         ` Daniel Vetter
2016-06-09 12:26           ` Daniel Vetter
2016-06-09 12:48           ` Alexey Brodkin
2016-06-09 12:48             ` Alexey Brodkin
2016-06-09 13:23             ` Daniel Vetter
2016-06-09 13:23               ` Daniel Vetter
2016-06-09 13:27               ` Alexey Brodkin
2016-06-09 13:27                 ` Alexey Brodkin
2016-06-09 13:52                 ` Daniel Vetter
2016-06-09 13:52                   ` Daniel Vetter
2016-06-09 14:29                   ` Alexey Brodkin
2016-06-09 14:29                     ` Alexey Brodkin
2016-06-09 14:31                     ` Daniel Vetter
2016-06-09 14:31                       ` Daniel Vetter
2016-06-09 14:37                       ` Daniel Vetter
2016-06-09 14:37                         ` Daniel Vetter
2016-06-10 13:23                         ` Alexey Brodkin
2016-06-10 13:23                           ` Alexey Brodkin
2016-06-10 14:19                           ` Daniel Vetter
2016-06-10 14:19                             ` Daniel Vetter
2016-06-10 14:54                             ` Daniel Vetter
2016-06-10 14:54                               ` Daniel Vetter
2016-06-10 15:01                               ` Alexey Brodkin
2016-06-10 15:01                                 ` Alexey Brodkin
2016-06-10 15:09                                 ` Daniel Vetter
2016-06-10 15:09                                   ` Daniel Vetter
2016-06-10 15:16                                   ` Alexey Brodkin
2016-06-10 15:16                                     ` Alexey Brodkin
2016-06-08 12:18 ` [PATCH 04/27] drm/fsl-du: Implement some semblance of vblank event handling Daniel Vetter
2016-06-08 14:15   ` Maarten Lankhorst
2016-06-08 12:18 ` [PATCH 05/27] drm/hisilicon: " Daniel Vetter
2016-06-08 14:17   ` Maarten Lankhorst
2016-06-08 14:32     ` Daniel Vetter
2016-06-08 12:18 ` [PATCH 06/27] drm/sun4i: " Daniel Vetter
2016-06-09  9:03   ` Maarten Lankhorst
2017-01-02 12:23   ` Laurent Pinchart
2016-06-08 12:18 ` [PATCH 07/27] drm/atomic: kerneldoc for drm_atomic_crtc_needs_modeset Daniel Vetter
2016-06-08 14:11   ` Liviu Dudau
2016-06-09  9:03   ` Maarten Lankhorst
2016-06-08 12:19 ` [PATCH 08/27] drm/atomic: Add struct drm_crtc_commit to track async updates Daniel Vetter
2016-06-08 14:41   ` Maarten Lankhorst
2016-06-09 10:09   ` Liviu Dudau
2016-06-08 12:19 ` [PATCH 09/27] drm/atomic-helper: roll out commit synchronization Daniel Vetter
2016-06-08 14:40   ` Maarten Lankhorst
2016-06-08 15:15   ` [PATCH] " Daniel Vetter
2017-01-02 12:09     ` Laurent Pinchart
2017-01-04  8:49       ` Daniel Vetter
2016-06-09 14:22   ` [PATCH 09/27] " Maarten Lankhorst
2016-06-08 12:19 ` [PATCH 10/27] drm/atomic-helper: nonblocking commit support Daniel Vetter
2016-06-08 14:44   ` Maarten Lankhorst
2016-06-08 15:05     ` Daniel Vetter
2016-06-08 15:54       ` Chris Wilson
2016-06-08 16:19         ` Daniel Vetter
2016-06-08 16:22           ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 11/27] drm/arc: Implement nonblocking commit correctly Daniel Vetter
2016-06-08 12:19   ` Daniel Vetter
2016-06-08 14:27   ` Maarten Lankhorst
2016-06-08 14:27     ` Maarten Lankhorst
2016-06-08 12:19 ` [PATCH 12/27] drm/hdlcd: Use helper support for nonblocking commits Daniel Vetter
2016-06-08 12:19 ` [PATCH 13/27] drm/i915: Signal drm events for atomic Daniel Vetter
2016-06-08 14:25   ` Maarten Lankhorst
2016-06-08 12:19 ` [PATCH 14/27] drm/i915: Roll out the helper nonblock tracking Daniel Vetter
2016-06-09 14:01   ` Maarten Lankhorst
2016-06-08 12:19 ` [PATCH 15/27] drm/i915: nonblocking commit Daniel Vetter
2016-06-09 14:03   ` Maarten Lankhorst
2016-06-09 14:40     ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 16/27] drm/i915: Use atomic commits for legacy page_flips Daniel Vetter
2016-06-08 14:24   ` Chris Wilson
2016-06-08 14:34     ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 17/27] drm/i915: Move fb_bits updating later in atomic_commit Daniel Vetter
2016-06-08 12:19 ` [PATCH 18/27] drm/rockchip: Disarm vop->is_enabled Daniel Vetter
2016-06-08 12:19 ` [PATCH 19/27] drm/rockchip: Fix crtc_state->event signalling Daniel Vetter
2016-06-08 12:19 ` [PATCH 20/27] drm/rockchip: convert to helper nonblocking atomic commit Daniel Vetter
2016-06-08 12:19 ` [PATCH 21/27] drm/rockchip: Nuke pending event handling in preclose Daniel Vetter
2016-06-10 15:21   ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 22/27] drm/virtio: Don't reinvent a flipping wheel Daniel Vetter
2016-06-09 22:07   ` [PATCH] " Daniel Vetter
2016-06-10 15:20     ` Daniel Vetter
2016-06-13  9:20       ` Gerd Hoffmann
2016-06-13 13:34         ` Daniel Vetter
2016-06-14 14:25           ` Gerd Hoffmann
2016-06-14 14:33             ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 23/27] drm: Replace fb_helper->atomic with mode_config->atomic_commit Daniel Vetter
2016-06-08 12:36   ` Boris Brezillon
2016-06-12  9:01   ` Ying Liu
2016-06-13  7:58     ` Daniel Vetter
2016-06-13  9:26       ` Ying Liu
2016-06-13 14:01         ` Daniel Vetter
2016-06-20  5:55           ` Ying Liu
2016-06-20 13:26             ` Daniel Vetter
2016-06-08 12:19 ` Daniel Vetter [this message]
2016-07-13 10:15   ` [PATCH 24/27] drm: Resurrect atomic rmfb code Maarten Lankhorst
2016-07-13 10:56     ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 25/27] drm/sti: Don't call drm_helper_disable_unused_functions Daniel Vetter
2016-06-08 12:19 ` [PATCH 26/27] drm/crtc-helper: disable_unused_functions really isn't for atomic Daniel Vetter
2016-06-08 22:36   ` Laurent Pinchart
2016-06-09  8:26     ` Daniel Vetter
2016-06-21  9:12       ` Laurent Pinchart
2016-06-21  9:46         ` Daniel Vetter
2016-06-09 22:14     ` [PATCH] drm/omapdrm: don't call drm_helper_disable_unused_functions Daniel Vetter
2016-06-09 22:50       ` Laurent Pinchart
2016-06-10  6:24       ` Tomi Valkeinen
2016-06-10  6:26         ` Tomi Valkeinen
2016-06-21  8:02           ` Daniel Vetter
2016-06-08 12:19 ` [PATCH 27/27] drm/atomic-helper: Annotate a bunch more RETURNS: sections Daniel Vetter
2016-06-08 14:11 ` [PATCH 01/27] drm/atomic-helper: Massage swap_state signature somewhat Maarten Lankhorst
2016-06-09 22:06 ` [PATCH] " Daniel Vetter

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=1465388359-8070-24-git-send-email-daniel.vetter@ffwll.ch \
    --to=daniel.vetter@ffwll.ch \
    --cc=daniel.vetter@intel.com \
    --cc=dri-devel@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.