diff options
author | Archit Taneja <architt@codeaurora.org> | 2018-02-21 09:37:23 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2018-06-03 16:49:00 -0400 |
commit | 7907a0d77cb461f58045763c205a5830be72e97c (patch) | |
tree | f842c08966fe136f30162fd4fd053c1e4d15ce35 | |
parent | 8d58ef346f30cbbeb9213a7eb90c832abf903fa0 (diff) |
drm/msm/mdp5: Use the new private_obj state
This replaces the usage of the subclassed atomic state (mdp5_state)
with a private_obj state embedded within drm_atomic_state. The latter
method is the preferred approach, since it's simpler to implement
and less prone to errors.
The new API replaces the older and equivalent mdp5_state usage in the
following pattern:
- References to "mdp5_kms->state" (i.e, the old/existing state) is
replaced with mdp5_get_existing_global_state(). In the atomic_check
path, this should be called with the glob_state_lock drm_modeset_lock
alredy taken.
- References to "mdp5_get_state()" are replaced with
mdp5_get_global_state(). This acquires glob_state_lock and uses
drm_atomic_get_private_obj_state() to create a new duplicated state.
Changes in v3:
- Acquire glob_state_lock in mdp5_smp.c
- 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 | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c | 17 |
4 files changed, 37 insertions, 22 deletions
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c index fcbdef385a8a..6ada098dba0b 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | |||
@@ -190,20 +190,26 @@ static void mdp5_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *st | |||
190 | { | 190 | { |
191 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); | 191 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); |
192 | struct device *dev = &mdp5_kms->pdev->dev; | 192 | struct device *dev = &mdp5_kms->pdev->dev; |
193 | struct mdp5_global_state *global_state; | ||
194 | |||
195 | global_state = mdp5_get_existing_global_state(mdp5_kms); | ||
193 | 196 | ||
194 | pm_runtime_get_sync(dev); | 197 | pm_runtime_get_sync(dev); |
195 | 198 | ||
196 | if (mdp5_kms->smp) | 199 | if (mdp5_kms->smp) |
197 | mdp5_smp_prepare_commit(mdp5_kms->smp, &mdp5_kms->state->smp); | 200 | mdp5_smp_prepare_commit(mdp5_kms->smp, &global_state->smp); |
198 | } | 201 | } |
199 | 202 | ||
200 | static void mdp5_complete_commit(struct msm_kms *kms, struct drm_atomic_state *state) | 203 | static void mdp5_complete_commit(struct msm_kms *kms, struct drm_atomic_state *state) |
201 | { | 204 | { |
202 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); | 205 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); |
203 | struct device *dev = &mdp5_kms->pdev->dev; | 206 | struct device *dev = &mdp5_kms->pdev->dev; |
207 | struct mdp5_global_state *global_state; | ||
208 | |||
209 | global_state = mdp5_get_existing_global_state(mdp5_kms); | ||
204 | 210 | ||
205 | if (mdp5_kms->smp) | 211 | if (mdp5_kms->smp) |
206 | mdp5_smp_complete_commit(mdp5_kms->smp, &mdp5_kms->state->smp); | 212 | mdp5_smp_complete_commit(mdp5_kms->smp, &global_state->smp); |
207 | 213 | ||
208 | pm_runtime_put_sync(dev); | 214 | pm_runtime_put_sync(dev); |
209 | } | 215 | } |
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c index 8a00991f03c7..113e6b569562 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c | |||
@@ -52,14 +52,14 @@ int mdp5_mixer_assign(struct drm_atomic_state *s, struct drm_crtc *crtc, | |||
52 | { | 52 | { |
53 | struct msm_drm_private *priv = s->dev->dev_private; | 53 | struct msm_drm_private *priv = s->dev->dev_private; |
54 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); | 54 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); |
55 | struct mdp5_state *state = mdp5_get_state(s); | 55 | struct mdp5_global_state *global_state = mdp5_get_global_state(s); |
56 | struct mdp5_hw_mixer_state *new_state; | 56 | struct mdp5_hw_mixer_state *new_state; |
57 | int i; | 57 | int i; |
58 | 58 | ||
59 | if (IS_ERR(state)) | 59 | if (IS_ERR(global_state)) |
60 | return PTR_ERR(state); | 60 | return PTR_ERR(global_state); |
61 | 61 | ||
62 | new_state = &state->hwmixer; | 62 | new_state = &global_state->hwmixer; |
63 | 63 | ||
64 | for (i = 0; i < mdp5_kms->num_hwmixers; i++) { | 64 | for (i = 0; i < mdp5_kms->num_hwmixers; i++) { |
65 | struct mdp5_hw_mixer *cur = mdp5_kms->hwmixers[i]; | 65 | struct mdp5_hw_mixer *cur = mdp5_kms->hwmixers[i]; |
@@ -129,8 +129,8 @@ int mdp5_mixer_assign(struct drm_atomic_state *s, struct drm_crtc *crtc, | |||
129 | 129 | ||
130 | void mdp5_mixer_release(struct drm_atomic_state *s, struct mdp5_hw_mixer *mixer) | 130 | void mdp5_mixer_release(struct drm_atomic_state *s, struct mdp5_hw_mixer *mixer) |
131 | { | 131 | { |
132 | struct mdp5_state *state = mdp5_get_state(s); | 132 | struct mdp5_global_state *global_state = mdp5_get_global_state(s); |
133 | struct mdp5_hw_mixer_state *new_state = &state->hwmixer; | 133 | struct mdp5_hw_mixer_state *new_state = &global_state->hwmixer; |
134 | 134 | ||
135 | if (!mixer) | 135 | if (!mixer) |
136 | return; | 136 | return; |
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c index ff52c49095f9..1ef26bc63163 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c | |||
@@ -24,17 +24,19 @@ int mdp5_pipe_assign(struct drm_atomic_state *s, struct drm_plane *plane, | |||
24 | { | 24 | { |
25 | struct msm_drm_private *priv = s->dev->dev_private; | 25 | struct msm_drm_private *priv = s->dev->dev_private; |
26 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); | 26 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); |
27 | struct mdp5_state *state; | 27 | struct mdp5_global_state *new_global_state, *old_global_state; |
28 | struct mdp5_hw_pipe_state *old_state, *new_state; | 28 | struct mdp5_hw_pipe_state *old_state, *new_state; |
29 | int i, j; | 29 | int i, j; |
30 | 30 | ||
31 | state = mdp5_get_state(s); | 31 | new_global_state = mdp5_get_global_state(s); |
32 | if (IS_ERR(state)) | 32 | if (IS_ERR(new_global_state)) |
33 | return PTR_ERR(state); | 33 | return PTR_ERR(new_global_state); |
34 | 34 | ||
35 | /* grab old_state after mdp5_get_state(), since now we hold lock: */ | 35 | /* grab old_state after mdp5_get_global_state(), since now we hold lock: */ |
36 | old_state = &mdp5_kms->state->hwpipe; | 36 | old_global_state = mdp5_get_existing_global_state(mdp5_kms); |
37 | new_state = &state->hwpipe; | 37 | |
38 | old_state = &old_global_state->hwpipe; | ||
39 | new_state = &new_global_state->hwpipe; | ||
38 | 40 | ||
39 | for (i = 0; i < mdp5_kms->num_hwpipes; i++) { | 41 | for (i = 0; i < mdp5_kms->num_hwpipes; i++) { |
40 | struct mdp5_hw_pipe *cur = mdp5_kms->hwpipes[i]; | 42 | struct mdp5_hw_pipe *cur = mdp5_kms->hwpipes[i]; |
@@ -107,7 +109,7 @@ int mdp5_pipe_assign(struct drm_atomic_state *s, struct drm_plane *plane, | |||
107 | WARN_ON(r_hwpipe); | 109 | WARN_ON(r_hwpipe); |
108 | 110 | ||
109 | DBG("%s: alloc SMP blocks", (*hwpipe)->name); | 111 | DBG("%s: alloc SMP blocks", (*hwpipe)->name); |
110 | ret = mdp5_smp_assign(mdp5_kms->smp, &state->smp, | 112 | ret = mdp5_smp_assign(mdp5_kms->smp, &new_global_state->smp, |
111 | (*hwpipe)->pipe, blkcfg); | 113 | (*hwpipe)->pipe, blkcfg); |
112 | if (ret) | 114 | if (ret) |
113 | return -ENOMEM; | 115 | return -ENOMEM; |
@@ -132,7 +134,7 @@ void mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe) | |||
132 | { | 134 | { |
133 | struct msm_drm_private *priv = s->dev->dev_private; | 135 | struct msm_drm_private *priv = s->dev->dev_private; |
134 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); | 136 | struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); |
135 | struct mdp5_state *state = mdp5_get_state(s); | 137 | struct mdp5_global_state *state = mdp5_get_global_state(s); |
136 | struct mdp5_hw_pipe_state *new_state = &state->hwpipe; | 138 | struct mdp5_hw_pipe_state *new_state = &state->hwpipe; |
137 | 139 | ||
138 | if (!hwpipe) | 140 | if (!hwpipe) |
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c index ae4983d9d0a5..96c2b828dba4 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c | |||
@@ -340,17 +340,20 @@ void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p) | |||
340 | struct mdp5_kms *mdp5_kms = get_kms(smp); | 340 | struct mdp5_kms *mdp5_kms = get_kms(smp); |
341 | struct mdp5_hw_pipe_state *hwpstate; | 341 | struct mdp5_hw_pipe_state *hwpstate; |
342 | struct mdp5_smp_state *state; | 342 | struct mdp5_smp_state *state; |
343 | struct mdp5_global_state *global_state; | ||
343 | int total = 0, i, j; | 344 | int total = 0, i, j; |
344 | 345 | ||
345 | drm_printf(p, "name\tinuse\tplane\n"); | 346 | drm_printf(p, "name\tinuse\tplane\n"); |
346 | drm_printf(p, "----\t-----\t-----\n"); | 347 | drm_printf(p, "----\t-----\t-----\n"); |
347 | 348 | ||
348 | if (drm_can_sleep()) | 349 | if (drm_can_sleep()) |
349 | drm_modeset_lock(&mdp5_kms->state_lock, NULL); | 350 | drm_modeset_lock(&mdp5_kms->glob_state_lock, NULL); |
351 | |||
352 | global_state = mdp5_get_existing_global_state(mdp5_kms); | ||
350 | 353 | ||
351 | /* grab these *after* we hold the state_lock */ | 354 | /* grab these *after* we hold the state_lock */ |
352 | hwpstate = &mdp5_kms->state->hwpipe; | 355 | hwpstate = &global_state->hwpipe; |
353 | state = &mdp5_kms->state->smp; | 356 | state = &global_state->smp; |
354 | 357 | ||
355 | for (i = 0; i < mdp5_kms->num_hwpipes; i++) { | 358 | for (i = 0; i < mdp5_kms->num_hwpipes; i++) { |
356 | struct mdp5_hw_pipe *hwpipe = mdp5_kms->hwpipes[i]; | 359 | struct mdp5_hw_pipe *hwpipe = mdp5_kms->hwpipes[i]; |
@@ -374,7 +377,7 @@ void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p) | |||
374 | bitmap_weight(state->state, smp->blk_cnt)); | 377 | bitmap_weight(state->state, smp->blk_cnt)); |
375 | 378 | ||
376 | if (drm_can_sleep()) | 379 | if (drm_can_sleep()) |
377 | drm_modeset_unlock(&mdp5_kms->state_lock); | 380 | drm_modeset_unlock(&mdp5_kms->glob_state_lock); |
378 | } | 381 | } |
379 | 382 | ||
380 | void mdp5_smp_destroy(struct mdp5_smp *smp) | 383 | void mdp5_smp_destroy(struct mdp5_smp *smp) |
@@ -384,7 +387,8 @@ void mdp5_smp_destroy(struct mdp5_smp *smp) | |||
384 | 387 | ||
385 | struct mdp5_smp *mdp5_smp_init(struct mdp5_kms *mdp5_kms, const struct mdp5_smp_block *cfg) | 388 | struct mdp5_smp *mdp5_smp_init(struct mdp5_kms *mdp5_kms, const struct mdp5_smp_block *cfg) |
386 | { | 389 | { |
387 | struct mdp5_smp_state *state = &mdp5_kms->state->smp; | 390 | struct mdp5_smp_state *state; |
391 | struct mdp5_global_state *global_state; | ||
388 | struct mdp5_smp *smp = NULL; | 392 | struct mdp5_smp *smp = NULL; |
389 | int ret; | 393 | int ret; |
390 | 394 | ||
@@ -398,6 +402,9 @@ struct mdp5_smp *mdp5_smp_init(struct mdp5_kms *mdp5_kms, const struct mdp5_smp_ | |||
398 | smp->blk_cnt = cfg->mmb_count; | 402 | smp->blk_cnt = cfg->mmb_count; |
399 | smp->blk_size = cfg->mmb_size; | 403 | smp->blk_size = cfg->mmb_size; |
400 | 404 | ||
405 | global_state = mdp5_get_existing_global_state(mdp5_kms); | ||
406 | state = &global_state->smp; | ||
407 | |||
401 | /* statically tied MMBs cannot be re-allocated: */ | 408 | /* statically tied MMBs cannot be re-allocated: */ |
402 | bitmap_copy(state->state, cfg->reserved_state, smp->blk_cnt); | 409 | bitmap_copy(state->state, cfg->reserved_state, smp->blk_cnt); |
403 | memcpy(smp->reserved, cfg->reserved, sizeof(smp->reserved)); | 410 | memcpy(smp->reserved, cfg->reserved, sizeof(smp->reserved)); |