aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArchit Taneja <architt@codeaurora.org>2018-02-21 09:37:24 -0500
committerRob Clark <robdclark@gmail.com>2018-06-03 16:49:00 -0400
commitc21c731d93e8148d926a63797d33075128e60cdd (patch)
treebc33392c05ae173df956f6ebae1bb46e8a1f1bd9
parent7907a0d77cb461f58045763c205a5830be72e97c (diff)
drm/msm: Don't subclass drm_atomic_state anymore
With the addition of "private_objs" in drm_atomic_state, we no longer need to subclass drm_atomic_state to store state of share resources that don't perfectly fit within planes/crtc/connector state information. We can now save this state within drm_atomic_state itself using the private objects. Remove the infrastructure that allowed subclassing of drm_atomic_state in the driver. Changes in v3: - Added to the msm atomic helper patch set Changes in v4: - None Signed-off-by: Archit Taneja <architt@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Sean Paul <seanpaul@chromium.org>
-rw-r--r--drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c46
-rw-r--r--drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h22
-rw-r--r--drivers/gpu/drm/msm/msm_atomic.c31
-rw-r--r--drivers/gpu/drm/msm/msm_drv.c3
-rw-r--r--drivers/gpu/drm/msm/msm_kms.h14
5 files changed, 0 insertions, 116 deletions
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 6ada098dba0b..6e12e275deba 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -70,42 +70,6 @@ static int mdp5_hw_init(struct msm_kms *kms)
70 return 0; 70 return 0;
71} 71}
72 72
73struct mdp5_state *mdp5_get_state(struct drm_atomic_state *s)
74{
75 struct msm_drm_private *priv = s->dev->dev_private;
76 struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms));
77 struct msm_kms_state *state = to_kms_state(s);
78 struct mdp5_state *new_state;
79 int ret;
80
81 if (state->state)
82 return state->state;
83
84 ret = drm_modeset_lock(&mdp5_kms->state_lock, s->acquire_ctx);
85 if (ret)
86 return ERR_PTR(ret);
87
88 new_state = kmalloc(sizeof(*mdp5_kms->state), GFP_KERNEL);
89 if (!new_state)
90 return ERR_PTR(-ENOMEM);
91
92 /* Copy state: */
93 new_state->hwpipe = mdp5_kms->state->hwpipe;
94 new_state->hwmixer = mdp5_kms->state->hwmixer;
95 if (mdp5_kms->smp)
96 new_state->smp = mdp5_kms->state->smp;
97
98 state->state = new_state;
99
100 return new_state;
101}
102
103static void mdp5_swap_state(struct msm_kms *kms, struct drm_atomic_state *state)
104{
105 struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
106 swap(to_kms_state(state)->state, mdp5_kms->state);
107}
108
109/* Global/shared object state funcs */ 73/* Global/shared object state funcs */
110 74
111/* 75/*
@@ -315,7 +279,6 @@ static const struct mdp_kms_funcs kms_funcs = {
315 .irq = mdp5_irq, 279 .irq = mdp5_irq,
316 .enable_vblank = mdp5_enable_vblank, 280 .enable_vblank = mdp5_enable_vblank,
317 .disable_vblank = mdp5_disable_vblank, 281 .disable_vblank = mdp5_disable_vblank,
318 .swap_state = mdp5_swap_state,
319 .prepare_commit = mdp5_prepare_commit, 282 .prepare_commit = mdp5_prepare_commit,
320 .complete_commit = mdp5_complete_commit, 283 .complete_commit = mdp5_complete_commit,
321 .wait_for_crtc_commit_done = mdp5_wait_for_crtc_commit_done, 284 .wait_for_crtc_commit_done = mdp5_wait_for_crtc_commit_done,
@@ -815,8 +778,6 @@ static void mdp5_destroy(struct platform_device *pdev)
815 778
816 drm_atomic_private_obj_fini(&mdp5_kms->glob_state); 779 drm_atomic_private_obj_fini(&mdp5_kms->glob_state);
817 drm_modeset_lock_fini(&mdp5_kms->glob_state_lock); 780 drm_modeset_lock_fini(&mdp5_kms->glob_state_lock);
818
819 kfree(mdp5_kms->state);
820} 781}
821 782
822static int construct_pipes(struct mdp5_kms *mdp5_kms, int cnt, 783static int construct_pipes(struct mdp5_kms *mdp5_kms, int cnt,
@@ -969,13 +930,6 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
969 mdp5_kms->dev = dev; 930 mdp5_kms->dev = dev;
970 mdp5_kms->pdev = pdev; 931 mdp5_kms->pdev = pdev;
971 932
972 drm_modeset_lock_init(&mdp5_kms->state_lock);
973 mdp5_kms->state = kzalloc(sizeof(*mdp5_kms->state), GFP_KERNEL);
974 if (!mdp5_kms->state) {
975 ret = -ENOMEM;
976 goto fail;
977 }
978
979 ret = mdp5_global_obj_init(mdp5_kms); 933 ret = mdp5_global_obj_init(mdp5_kms);
980 if (ret) 934 if (ret)
981 goto fail; 935 goto fail;
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
index 76f0ddfca322..854dfd30e829 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
@@ -28,8 +28,6 @@
28#include "mdp5_ctl.h" 28#include "mdp5_ctl.h"
29#include "mdp5_smp.h" 29#include "mdp5_smp.h"
30 30
31struct mdp5_state;
32
33struct mdp5_kms { 31struct mdp5_kms {
34 struct mdp_kms base; 32 struct mdp_kms base;
35 33
@@ -49,12 +47,6 @@ struct mdp5_kms {
49 struct mdp5_cfg_handler *cfg; 47 struct mdp5_cfg_handler *cfg;
50 uint32_t caps; /* MDP capabilities (MDP_CAP_XXX bits) */ 48 uint32_t caps; /* MDP capabilities (MDP_CAP_XXX bits) */
51 49
52 /**
53 * Global atomic state. Do not access directly, use mdp5_get_state()
54 */
55 struct mdp5_state *state;
56 struct drm_modeset_lock state_lock;
57
58 /* 50 /*
59 * Global private object state, Do not access directly, use 51 * Global private object state, Do not access directly, use
60 * mdp5_global_get_state() 52 * mdp5_global_get_state()
@@ -88,20 +80,6 @@ struct mdp5_kms {
88}; 80};
89#define to_mdp5_kms(x) container_of(x, struct mdp5_kms, base) 81#define to_mdp5_kms(x) container_of(x, struct mdp5_kms, base)
90 82
91/* Global atomic state for tracking resources that are shared across
92 * multiple kms objects (planes/crtcs/etc).
93 *
94 * For atomic updates which require modifying global state,
95 */
96struct mdp5_state {
97 struct mdp5_hw_pipe_state hwpipe;
98 struct mdp5_hw_mixer_state hwmixer;
99 struct mdp5_smp_state smp;
100};
101
102struct mdp5_state *__must_check
103mdp5_get_state(struct drm_atomic_state *s);
104
105/* Global private object state for tracking resources that are shared across 83/* Global private object state for tracking resources that are shared across
106 * multiple kms objects (planes/crtcs/etc). 84 * multiple kms objects (planes/crtcs/etc).
107 */ 85 */
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
index bf5f8c39f34d..9d0a0ca1f0cb 100644
--- a/drivers/gpu/drm/msm/msm_atomic.c
+++ b/drivers/gpu/drm/msm/msm_atomic.c
@@ -224,11 +224,7 @@ int msm_atomic_commit(struct drm_device *dev,
224 * This is the point of no return - everything below never fails except 224 * This is the point of no return - everything below never fails except
225 * when the hw goes bonghits. Which means we can commit the new state on 225 * when the hw goes bonghits. Which means we can commit the new state on
226 * the software side now. 226 * the software side now.
227 *
228 * swap driver private state while still holding state_lock
229 */ 227 */
230 if (to_kms_state(state)->state)
231 priv->kms->funcs->swap_state(priv->kms, state);
232 228
233 /* 229 /*
234 * Everything below can be run asynchronously without the need to grab 230 * Everything below can be run asynchronously without the need to grab
@@ -262,30 +258,3 @@ error:
262 drm_atomic_helper_cleanup_planes(dev, state); 258 drm_atomic_helper_cleanup_planes(dev, state);
263 return ret; 259 return ret;
264} 260}
265
266struct drm_atomic_state *msm_atomic_state_alloc(struct drm_device *dev)
267{
268 struct msm_kms_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
269
270 if (!state || drm_atomic_state_init(dev, &state->base) < 0) {
271 kfree(state);
272 return NULL;
273 }
274
275 return &state->base;
276}
277
278void msm_atomic_state_clear(struct drm_atomic_state *s)
279{
280 struct msm_kms_state *state = to_kms_state(s);
281 drm_atomic_state_default_clear(&state->base);
282 kfree(state->state);
283 state->state = NULL;
284}
285
286void msm_atomic_state_free(struct drm_atomic_state *state)
287{
288 kfree(to_kms_state(state)->state);
289 drm_atomic_state_default_release(state);
290 kfree(state);
291}
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 30cd514d8f7c..1c89195da4ff 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -42,9 +42,6 @@ static const struct drm_mode_config_funcs mode_config_funcs = {
42 .output_poll_changed = drm_fb_helper_output_poll_changed, 42 .output_poll_changed = drm_fb_helper_output_poll_changed,
43 .atomic_check = drm_atomic_helper_check, 43 .atomic_check = drm_atomic_helper_check,
44 .atomic_commit = msm_atomic_commit, 44 .atomic_commit = msm_atomic_commit,
45 .atomic_state_alloc = msm_atomic_state_alloc,
46 .atomic_state_clear = msm_atomic_state_clear,
47 .atomic_state_free = msm_atomic_state_free,
48}; 45};
49 46
50#ifdef CONFIG_DRM_MSM_REGISTER_LOGGING 47#ifdef CONFIG_DRM_MSM_REGISTER_LOGGING
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
index aaa329dc020e..dfd92947de2c 100644
--- a/drivers/gpu/drm/msm/msm_kms.h
+++ b/drivers/gpu/drm/msm/msm_kms.h
@@ -40,8 +40,6 @@ struct msm_kms_funcs {
40 irqreturn_t (*irq)(struct msm_kms *kms); 40 irqreturn_t (*irq)(struct msm_kms *kms);
41 int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); 41 int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
42 void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); 42 void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
43 /* swap global atomic state: */
44 void (*swap_state)(struct msm_kms *kms, struct drm_atomic_state *state);
45 /* modeset, bracketing atomic_commit(): */ 43 /* modeset, bracketing atomic_commit(): */
46 void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state); 44 void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
47 void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state); 45 void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
@@ -80,18 +78,6 @@ struct msm_kms {
80 struct msm_gem_address_space *aspace; 78 struct msm_gem_address_space *aspace;
81}; 79};
82 80
83/**
84 * Subclass of drm_atomic_state, to allow kms backend to have driver
85 * private global state. The kms backend can do whatever it wants
86 * with the ->state ptr. On ->atomic_state_clear() the ->state ptr
87 * is kfree'd and set back to NULL.
88 */
89struct msm_kms_state {
90 struct drm_atomic_state base;
91 void *state;
92};
93#define to_kms_state(x) container_of(x, struct msm_kms_state, base)
94
95static inline void msm_kms_init(struct msm_kms *kms, 81static inline void msm_kms_init(struct msm_kms *kms,
96 const struct msm_kms_funcs *funcs) 82 const struct msm_kms_funcs *funcs)
97{ 83{