diff options
author | Archit Taneja <architt@codeaurora.org> | 2018-02-21 09:37:24 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2018-06-03 16:49:00 -0400 |
commit | c21c731d93e8148d926a63797d33075128e60cdd (patch) | |
tree | bc33392c05ae173df956f6ebae1bb46e8a1f1bd9 | |
parent | 7907a0d77cb461f58045763c205a5830be72e97c (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.c | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_atomic.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_kms.h | 14 |
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 | ||
73 | struct 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 | |||
103 | static 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 | ||
822 | static int construct_pipes(struct mdp5_kms *mdp5_kms, int cnt, | 783 | static 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 | ||
31 | struct mdp5_state; | ||
32 | |||
33 | struct mdp5_kms { | 31 | struct 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 | */ | ||
96 | struct mdp5_state { | ||
97 | struct mdp5_hw_pipe_state hwpipe; | ||
98 | struct mdp5_hw_mixer_state hwmixer; | ||
99 | struct mdp5_smp_state smp; | ||
100 | }; | ||
101 | |||
102 | struct mdp5_state *__must_check | ||
103 | mdp5_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 | |||
266 | struct 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 | |||
278 | void 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 | |||
286 | void 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 | */ | ||
89 | struct 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 | |||
95 | static inline void msm_kms_init(struct msm_kms *kms, | 81 | static 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 | { |