aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0681-drm-Introduce-an-atomic_commit_setup-function.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0681-drm-Introduce-an-atomic_commit_setup-function.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0681-drm-Introduce-an-atomic_commit_setup-function.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0681-drm-Introduce-an-atomic_commit_setup-function.patch b/target/linux/bcm27xx/patches-5.10/950-0681-drm-Introduce-an-atomic_commit_setup-function.patch
new file mode 100644
index 0000000000..35b874ce71
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0681-drm-Introduce-an-atomic_commit_setup-function.patch
@@ -0,0 +1,95 @@
+From 86fc6b59ae170399aaf8fd9880f1a3f79948f5a3 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Fri, 4 Dec 2020 16:11:32 +0100
+Subject: [PATCH] drm: Introduce an atomic_commit_setup function
+
+Private objects storing a state shared across all CRTCs need to be
+carefully handled to avoid a use-after-free issue.
+
+The proper way to do this to track all the commits using that shared
+state and wait for the previous commits to be done before going on with
+the current one to avoid the reordering of commits that could occur.
+
+However, this commit setup needs to be done after
+drm_atomic_helper_setup_commit(), because before the CRTC commit
+structure hasn't been allocated before, and before the workqueue is
+scheduled, because we would be potentially reordered already otherwise.
+
+That means that drivers currently have to roll their own
+drm_atomic_helper_commit() function, even though it would be identical
+if not for the commit setup.
+
+Let's introduce a hook to do so that would be called as part of
+drm_atomic_helper_commit, allowing us to reuse the atomic helpers.
+
+Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/drm_atomic_helper.c | 9 +++++++++
+ include/drm/drm_modeset_helper_vtables.h | 21 +++++++++++++++++++++
+ 2 files changed, 30 insertions(+)
+
+--- a/drivers/gpu/drm/drm_atomic_helper.c
++++ b/drivers/gpu/drm/drm_atomic_helper.c
+@@ -2039,6 +2039,9 @@ crtc_or_fake_commit(struct drm_atomic_st
+ * should always call this function from their
+ * &drm_mode_config_funcs.atomic_commit hook.
+ *
++ * Drivers that need to extend the commit setup to private objects can use the
++ * &drm_mode_config_helper_funcs.atomic_commit_setup hook.
++ *
+ * To be able to use this support drivers need to use a few more helper
+ * functions. drm_atomic_helper_wait_for_dependencies() must be called before
+ * actually committing the hardware state, and for nonblocking commits this call
+@@ -2082,8 +2085,11 @@ int drm_atomic_helper_setup_commit(struc
+ struct drm_plane *plane;
+ struct drm_plane_state *old_plane_state, *new_plane_state;
+ struct drm_crtc_commit *commit;
++ const struct drm_mode_config_helper_funcs *funcs;
+ int i, ret;
+
++ funcs = state->dev->mode_config.helper_private;
++
+ for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
+ commit = kzalloc(sizeof(*commit), GFP_KERNEL);
+ if (!commit)
+@@ -2160,6 +2166,9 @@ int drm_atomic_helper_setup_commit(struc
+ new_plane_state->commit = drm_crtc_commit_get(commit);
+ }
+
++ if (funcs && funcs->atomic_commit_setup)
++ return funcs->atomic_commit_setup(state);
++
+ return 0;
+ }
+ EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
+--- a/include/drm/drm_modeset_helper_vtables.h
++++ b/include/drm/drm_modeset_helper_vtables.h
+@@ -1396,6 +1396,27 @@ struct drm_mode_config_helper_funcs {
+ * drm_atomic_helper_commit_tail().
+ */
+ void (*atomic_commit_tail)(struct drm_atomic_state *state);
++
++ /**
++ * @atomic_commit_setup:
++ *
++ * This hook is used by the default atomic_commit() hook implemented in
++ * drm_atomic_helper_commit() together with the nonblocking helpers (see
++ * drm_atomic_helper_setup_commit()) to extend the DRM commit setup. It
++ * is not used by the atomic helpers.
++ *
++ * This function is called at the end of
++ * drm_atomic_helper_setup_commit(), so once the commit has been
++ * properly setup across the generic DRM object states. It allows
++ * drivers to do some additional commit tracking that isn't related to a
++ * CRTC, plane or connector, tracked in a &drm_private_obj structure.
++ *
++ * Note that the documentation of &drm_private_obj has more details on
++ * how one should implement this.
++ *
++ * This hook is optional.
++ */
++ int (*atomic_commit_setup)(struct drm_atomic_state *state);
+ };
+
+ #endif