All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Paul <seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
To: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Cc: jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
	robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	Sean Paul <seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>,
	hoegsberg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org,
	abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
Subject: [DPU PATCH 07/11] drm/msm: Use atomic private_obj instead of subclassing
Date: Wed, 28 Feb 2018 14:19:02 -0500	[thread overview]
Message-ID: <20180228191906.185417-8-seanpaul@chromium.org> (raw)
In-Reply-To: <20180228191906.185417-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>

Instead of subclassing atomic state, store driver private data in
private_obj/state. This allows us to remove the swap_state driver hook
for mdp5 and get closer to using the atomic helpers entirely.

Change-Id: I65a4a2887593ae257d584e00b352b5daf00e4e61
Signed-off-by: Sean Paul <seanpaul@chromium.org>
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 37 ++++++--------
 drivers/gpu/drm/msm/msm_atomic.c         | 30 -----------
 drivers/gpu/drm/msm/msm_drv.c            | 65 ++++++++++++++++++++++--
 drivers/gpu/drm/msm/msm_drv.h            |  4 +-
 drivers/gpu/drm/msm/msm_kms.h            | 28 +++++-----
 5 files changed, 95 insertions(+), 69 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 6d8e3a9a6fc0..f1a248419655 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -74,36 +74,32 @@ struct mdp5_state *mdp5_get_state(struct drm_atomic_state *s)
 {
 	struct msm_drm_private *priv = s->dev->dev_private;
 	struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms));
-	struct msm_kms_state *state = to_kms_state(s);
-	struct mdp5_state *new_state;
+	struct msm_kms_state *kms_state;
 	int ret;
 
-	if (state->state)
-		return state->state;
-
 	ret = drm_modeset_lock(&mdp5_kms->state_lock, s->acquire_ctx);
 	if (ret)
 		return ERR_PTR(ret);
 
-	new_state = kmalloc(sizeof(*mdp5_kms->state), GFP_KERNEL);
-	if (!new_state)
-		return ERR_PTR(-ENOMEM);
+	kms_state = msm_kms_get_state(s);
+	if (IS_ERR_OR_NULL(kms_state))
+		return (struct mdp5_state *)kms_state; /* casting ERR_PTR */
 
-	/* Copy state: */
-	new_state->hwpipe = mdp5_kms->state->hwpipe;
-	new_state->hwmixer = mdp5_kms->state->hwmixer;
-	if (mdp5_kms->smp)
-		new_state->smp = mdp5_kms->state->smp;
+	return kms_state->state;
+}
 
-	state->state = new_state;
+static void *mdp5_duplicate_state(void *state)
+{
+	if (!state)
+		return kzalloc(sizeof(struct mdp5_state), GFP_KERNEL);
 
-	return new_state;
+	return kmemdup(state, sizeof(struct mdp5_state), GFP_KERNEL);
 }
 
-static void mdp5_swap_state(struct msm_kms *kms, struct drm_atomic_state *state)
+static void mdp5_destroy_state(void *state)
 {
-	struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
-	swap(to_kms_state(state)->state, mdp5_kms->state);
+	struct mdp5_state *mdp_state = state;
+	kfree(mdp_state);
 }
 
 static void mdp5_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *state)
@@ -229,7 +225,8 @@ static const struct mdp_kms_funcs kms_funcs = {
 		.irq             = mdp5_irq,
 		.enable_vblank   = mdp5_enable_vblank,
 		.disable_vblank  = mdp5_disable_vblank,
-		.swap_state      = mdp5_swap_state,
+		.duplicate_state = mdp5_duplicate_state,
+		.destroy_state	 = mdp5_destroy_state,
 		.prepare_commit  = mdp5_prepare_commit,
 		.complete_commit = mdp5_complete_commit,
 		.wait_for_crtc_commit_done = mdp5_wait_for_crtc_commit_done,
@@ -726,8 +723,6 @@ static void mdp5_destroy(struct platform_device *pdev)
 
 	if (mdp5_kms->rpm_enabled)
 		pm_runtime_disable(&pdev->dev);
-
-	kfree(mdp5_kms->state);
 }
 
 static int construct_pipes(struct mdp5_kms *mdp5_kms, int cnt,
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
index 7e54eb65d096..1f53262ea46b 100644
--- a/drivers/gpu/drm/msm/msm_atomic.c
+++ b/drivers/gpu/drm/msm/msm_atomic.c
@@ -169,9 +169,6 @@ int msm_atomic_commit(struct drm_device *dev,
 	 */
 	BUG_ON(drm_atomic_helper_swap_state(state, false) < 0);
 
-	if (to_kms_state(state)->state)
-		priv->kms->funcs->swap_state(priv->kms, state);
-
 	/*
 	 * Provide the driver a chance to prepare for output fences. This is
 	 * done after the point of no return, but before asynchronous commits
@@ -210,30 +207,3 @@ int msm_atomic_commit(struct drm_device *dev,
 	drm_atomic_helper_cleanup_planes(dev, state);
 	return ret;
 }
-
-struct drm_atomic_state *msm_atomic_state_alloc(struct drm_device *dev)
-{
-	struct msm_kms_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
-
-	if (!state || drm_atomic_state_init(dev, &state->base) < 0) {
-		kfree(state);
-		return NULL;
-	}
-
-	return &state->base;
-}
-
-void msm_atomic_state_clear(struct drm_atomic_state *s)
-{
-	struct msm_kms_state *state = to_kms_state(s);
-	drm_atomic_state_default_clear(&state->base);
-	kfree(state->state);
-	state->state = NULL;
-}
-
-void msm_atomic_state_free(struct drm_atomic_state *state)
-{
-	kfree(to_kms_state(state)->state);
-	drm_atomic_state_default_release(state);
-	kfree(state);
-}
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index b354424cccb5..e582d5889b66 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -121,9 +121,62 @@ static const struct drm_mode_config_funcs mode_config_funcs = {
 	.output_poll_changed = msm_fb_output_poll_changed,
 	.atomic_check = msm_atomic_check,
 	.atomic_commit = msm_atomic_commit,
-	.atomic_state_alloc = msm_atomic_state_alloc,
-	.atomic_state_clear = msm_atomic_state_clear,
-	.atomic_state_free = msm_atomic_state_free,
+};
+
+static inline
+struct msm_kms *obj_to_kms(struct drm_private_obj *obj)
+{
+	return container_of(obj, struct msm_kms, base);
+}
+
+static inline
+struct msm_kms_state *state_to_kms_state(struct drm_private_state *state)
+{
+	return container_of(state, struct msm_kms_state, base);
+}
+
+struct msm_kms_state *msm_kms_get_state(struct drm_atomic_state *s)
+{
+	struct msm_drm_private *priv = s->dev->dev_private;
+	struct drm_private_obj *obj = &priv->kms->base;
+	struct drm_private_state *state;
+
+	state = drm_atomic_get_private_obj_state(s, obj);
+	if (IS_ERR_OR_NULL(state))
+		return (struct msm_kms_state *)state; /* casting ERR_PTR */
+
+	return state_to_kms_state(state);
+}
+
+static struct drm_private_state *
+msm_kms_duplicate_state(struct drm_private_obj *obj)
+{
+	struct msm_kms *kms = obj_to_kms(obj);
+	struct msm_kms_state *state = state_to_kms_state(obj->state);
+	struct msm_kms_state *new_state;
+
+	if (kms->funcs->duplicate_state)
+		new_state = kms->funcs->duplicate_state(state);
+
+	__drm_atomic_helper_private_obj_duplicate_state(obj, &new_state->base);
+
+	return &new_state->base;
+}
+
+static void msm_kms_destroy_state(struct drm_private_obj *obj,
+				  struct drm_private_state *state)
+{
+	struct msm_kms *kms = obj_to_kms(obj);
+	struct msm_kms_state *kms_state = state_to_kms_state(obj->state);
+
+	if (kms->funcs->destroy_state)
+		kms->funcs->destroy_state(kms_state->state);
+	kfree(kms_state);
+}
+
+static const struct drm_private_state_funcs kms_state_funcs = {
+	.atomic_duplicate_state = msm_kms_duplicate_state,
+	.atomic_destroy_state = msm_kms_destroy_state,
 };
 
 #ifdef CONFIG_DRM_MSM_REGISTER_LOGGING
@@ -341,6 +394,8 @@ static int msm_drm_uninit(struct device *dev)
 		}
 	}
 
+	drm_atomic_private_obj_fini(&kms->base);
+
 	msm_gem_shrinker_cleanup(ddev);
 
 	drm_kms_helper_poll_fini(ddev);
@@ -770,6 +825,10 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
 	}
 #endif
 
+	drm_atomic_private_obj_init(&kms->base,
+				    &kms->state.base,
+				    &kms_state_funcs);
+
 	/* perform subdriver post initialization */
 	if (kms && kms->funcs && kms->funcs->postinit) {
 		ret = kms->funcs->postinit(kms);
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 292496b682e8..8cab333df717 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -598,9 +598,7 @@ struct msm_format {
 
 int msm_atomic_commit(struct drm_device *dev,
 		struct drm_atomic_state *state, bool nonblock);
-struct drm_atomic_state *msm_atomic_state_alloc(struct drm_device *dev);
-void msm_atomic_state_clear(struct drm_atomic_state *state);
-void msm_atomic_state_free(struct drm_atomic_state *state);
+struct msm_kms_state *msm_kms_get_state(struct drm_atomic_state *state);
 
 void msm_gem_unmap_vma(struct msm_gem_address_space *aspace,
 		struct msm_gem_vma *vma, struct sg_table *sgt);
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
index 09ba1e79db50..4c5a69258c42 100644
--- a/drivers/gpu/drm/msm/msm_kms.h
+++ b/drivers/gpu/drm/msm/msm_kms.h
@@ -57,6 +57,8 @@ struct msm_kms_funcs {
 	void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
 	/* swap global atomic state: */
 	void (*swap_state)(struct msm_kms *kms, struct drm_atomic_state *state);
+	void *(*duplicate_state)(void *state);
+	void (*destroy_state)(void *state);
 	/* modeset, bracketing atomic_commit(): */
 	void (*prepare_fence)(struct msm_kms *kms,
 			struct drm_atomic_state *state);
@@ -114,16 +116,6 @@ struct msm_kms_funcs {
 #endif
 };
 
-struct msm_kms {
-	const struct msm_kms_funcs *funcs;
-
-	/* irq number to be passed on to drm_irq_install */
-	int irq;
-
-	/* mapper-id used to request GEM buffer mapped for scanout: */
-	struct msm_gem_address_space *aspace;
-};
-
 /**
  * Subclass of drm_atomic_state, to allow kms backend to have driver
  * private global state.  The kms backend can do whatever it wants
@@ -131,10 +123,22 @@ struct msm_kms {
  * is kfree'd and set back to NULL.
  */
 struct msm_kms_state {
-	struct drm_atomic_state base;
+	struct drm_private_state base;
 	void *state;
 };
-#define to_kms_state(x) container_of(x, struct msm_kms_state, base)
+
+struct msm_kms {
+	struct drm_private_obj base;
+	struct msm_kms_state state;
+
+	const struct msm_kms_funcs *funcs;
+
+	/* irq number to be passed on to drm_irq_install */
+	int irq;
+
+	/* mapper-id used to request GEM buffer mapped for scanout: */
+	struct msm_gem_address_space *aspace;
+};
 
 static inline void msm_kms_init(struct msm_kms *kms,
 		const struct msm_kms_funcs *funcs)
-- 
Sean Paul, Software Engineer, Google / Chromium OS

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

  parent reply	other threads:[~2018-02-28 19:19 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-28 19:18 [DPU PATCH 00/11] drm/msm: Use atomic helper functions for msm Sean Paul
     [not found] ` <20180228191906.185417-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-02-28 19:18   ` [DPU PATCH 01/11] drm/msm: Skip seamless disables in crtc/encoder Sean Paul
2018-03-03  0:04     ` jsanka
     [not found]       ` <d51bfdafccd143ee258fc995a7cafecc-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:14         ` Sean Paul
2018-03-13 18:10           ` Jeykumar Sankaran
2018-02-28 19:18   ` [DPU PATCH 02/11] drm/msm: Don't duplicate modeset_enables atomic helper Sean Paul
     [not found]     ` <20180228191906.185417-3-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  0:56       ` Jeykumar Sankaran
     [not found]         ` <aaf8f07e18801c60cdf7eb30b0cac123-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:21           ` Sean Paul
2018-03-13 23:57             ` Jeykumar Sankaran
     [not found]               ` <677c8c29a788a147aa45bc1e9768527e-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-14 15:14                 ` Sean Paul
2018-03-15  1:39                   ` Jeykumar Sankaran
     [not found]                     ` <645777c3f76662ce5b0b14bcf7b81acb-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-16 19:45                       ` [DPU PATCH v2] " Sean Paul
2018-03-16 20:57                         ` Jeykumar Sankaran
2018-02-28 19:18   ` [DPU PATCH 03/11] drm/msm: Refactor complete_commit() to look more the helpers Sean Paul
     [not found]     ` <20180228191906.185417-4-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  1:01       ` Jeykumar Sankaran
2018-02-28 19:18   ` [DPU PATCH 04/11] drm/msm: Move implicit sync fence handling to prepare_fb Sean Paul
     [not found]     ` <20180228191906.185417-5-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-03  0:20       ` jsanka-sgV2jX0FEOL9JmXXK+q4OQ
2018-02-28 19:19   ` [DPU PATCH 05/11] drm/msm: Mark the crtc->state->event consumed Sean Paul
2018-03-06  1:53     ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 06/11] drm/msm: Remove msm_commit/kthread, use atomic helper commit Sean Paul
     [not found]     ` <20180228191906.185417-7-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-01  4:07       ` jsanka-sgV2jX0FEOL9JmXXK+q4OQ
2018-03-01 15:27         ` Sean Paul
2018-03-01 20:37           ` jsanka-sgV2jX0FEOL9JmXXK+q4OQ
     [not found]             ` <156ab33c41d436c79cc661e84bebc353-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-02  0:37               ` Rob Clark
     [not found]                 ` <CAF6AEGvDZ8sWYwwbyPYcQZN6Ba01Gc7db724GeehF3cLY6d-XQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-03-02 14:56                   ` Sean Paul
2018-03-09  1:08                     ` Jeykumar Sankaran
2018-03-12 20:23                       ` Sean Paul
2018-03-19 15:01                         ` Sean Paul
2018-03-19 19:54                           ` Jeykumar Sankaran
2018-02-28 19:19   ` Sean Paul [this message]
     [not found]     ` <20180228191906.185417-8-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  1:59       ` [DPU PATCH 07/11] drm/msm: Use atomic private_obj instead of subclassing Jeykumar Sankaran
     [not found]         ` <7fb92416ee99990f6a1280a617736051-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:28           ` Sean Paul
2018-03-19 17:31             ` [DPU PATCH v2] " Sean Paul
     [not found]               ` <20180319173113.94879-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-19 19:33                 ` Jeykumar Sankaran
2018-03-19 19:58                   ` [DPU PATCH v3] " Sean Paul
     [not found]                     ` <20180319195853.49006-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-20 11:01                       ` Archit Taneja
     [not found]                         ` <41aebf2e-48a0-a2e2-167c-70da912353f4-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-25  1:16                           ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 08/11] drm/msm: Remove hand-rolled out fences Sean Paul
     [not found]     ` <20180228191906.185417-9-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-03  0:44       ` Jeykumar Sankaran
     [not found]         ` <1a1c79ddb6ddabbc72e4624b53460188-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:30           ` Sean Paul
2018-03-13 18:11             ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 09/11] drm/msm: Remove prepare_fence kms_function Sean Paul
     [not found]     ` <20180228191906.185417-10-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  1:28       ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
2018-02-28 19:19   ` [DPU PATCH 10/11] drm/msm: Switch to atomic_helper_commit() Sean Paul
     [not found]     ` <20180228191906.185417-11-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  3:28       ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
     [not found]         ` <bf44a79fc08d00245640694c364b8b03-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:32           ` Sean Paul
2018-03-13  2:08             ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
2018-02-28 19:19   ` [DPU PATCH 11/11] drm/msm: Remove dpu input fences Sean Paul
     [not found]     ` <20180228191906.185417-12-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-03  0:50       ` Jeykumar Sankaran

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=20180228191906.185417-8-seanpaul@chromium.org \
    --to=seanpaul-f7+t8e8rja9g9huczpvpmw@public.gmane.org \
    --cc=abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
    --cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=hoegsberg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org \
    --cc=jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
    --cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.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.