diff options
author | Rob Clark <robdclark@gmail.com> | 2014-11-07 13:20:50 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2014-11-16 14:22:44 -0500 |
commit | bb6c018d3556dd683e3f16d24f2e9d60bcaed1b2 (patch) | |
tree | 8d64e8bd4caa6c4c2925426d89dfee003c1b500f | |
parent | 88ff1c2f3b5d4826bbe3b6ec3cf12a223dc0cb22 (diff) |
drm/msm/mdp4: drop attached planes table
Simplify things a bit for atomic, gets rid of some bookkeeping, and
makes the code cleaner.
TODO move iterator macro somewhere common.
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 41 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_kms.h | 5 |
2 files changed, 21 insertions, 25 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c index d0e6c279cc72..a28b1615b3d4 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | |||
@@ -25,7 +25,6 @@ | |||
25 | struct mdp4_crtc { | 25 | struct mdp4_crtc { |
26 | struct drm_crtc base; | 26 | struct drm_crtc base; |
27 | char name[8]; | 27 | char name[8]; |
28 | struct drm_plane *planes[8]; | ||
29 | int id; | 28 | int id; |
30 | int ovlp; | 29 | int ovlp; |
31 | enum mdp4_dma dma; | 30 | enum mdp4_dma dma; |
@@ -96,15 +95,14 @@ static void crtc_flush(struct drm_crtc *crtc) | |||
96 | { | 95 | { |
97 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); | 96 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); |
98 | struct mdp4_kms *mdp4_kms = get_kms(crtc); | 97 | struct mdp4_kms *mdp4_kms = get_kms(crtc); |
99 | uint32_t i, flush = 0; | 98 | struct drm_plane *plane; |
99 | uint32_t flush = 0; | ||
100 | 100 | ||
101 | for (i = 0; i < ARRAY_SIZE(mdp4_crtc->planes); i++) { | 101 | for_each_plane_on_crtc(crtc, plane) { |
102 | struct drm_plane *plane = mdp4_crtc->planes[i]; | 102 | enum mdp4_pipe pipe_id = mdp4_plane_pipe(plane); |
103 | if (plane) { | 103 | flush |= pipe2flush(pipe_id); |
104 | enum mdp4_pipe pipe_id = mdp4_plane_pipe(plane); | ||
105 | flush |= pipe2flush(pipe_id); | ||
106 | } | ||
107 | } | 104 | } |
105 | |||
108 | flush |= ovlp2flush(mdp4_crtc->ovlp); | 106 | flush |= ovlp2flush(mdp4_crtc->ovlp); |
109 | 107 | ||
110 | DBG("%s: flush=%08x", mdp4_crtc->name, flush); | 108 | DBG("%s: flush=%08x", mdp4_crtc->name, flush); |
@@ -254,6 +252,7 @@ static void blend_setup(struct drm_crtc *crtc) | |||
254 | { | 252 | { |
255 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); | 253 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); |
256 | struct mdp4_kms *mdp4_kms = get_kms(crtc); | 254 | struct mdp4_kms *mdp4_kms = get_kms(crtc); |
255 | struct drm_plane *plane; | ||
257 | int i, ovlp = mdp4_crtc->ovlp; | 256 | int i, ovlp = mdp4_crtc->ovlp; |
258 | uint32_t mixer_cfg = 0; | 257 | uint32_t mixer_cfg = 0; |
259 | static const enum mdp_mixer_stage_id stages[] = { | 258 | static const enum mdp_mixer_stage_id stages[] = { |
@@ -283,19 +282,16 @@ static void blend_setup(struct drm_crtc *crtc) | |||
283 | mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_HIGH0(ovlp), 0); | 282 | mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_HIGH0(ovlp), 0); |
284 | mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_HIGH1(ovlp), 0); | 283 | mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_HIGH1(ovlp), 0); |
285 | 284 | ||
286 | for (i = 0; i < ARRAY_SIZE(mdp4_crtc->planes); i++) { | 285 | for_each_plane_on_crtc(crtc, plane) { |
287 | struct drm_plane *plane = mdp4_crtc->planes[i]; | 286 | enum mdp4_pipe pipe_id = mdp4_plane_pipe(plane); |
288 | if (plane) { | 287 | int idx = idxs[pipe_id]; |
289 | enum mdp4_pipe pipe_id = mdp4_plane_pipe(plane); | 288 | if (idx > 0) { |
290 | int idx = idxs[pipe_id]; | 289 | const struct mdp_format *format = |
291 | if (idx > 0) { | ||
292 | const struct mdp_format *format = | ||
293 | to_mdp_format(msm_framebuffer_format(plane->fb)); | 290 | to_mdp_format(msm_framebuffer_format(plane->fb)); |
294 | alpha[idx-1] = format->alpha_enable; | 291 | alpha[idx-1] = format->alpha_enable; |
295 | } | ||
296 | mixer_cfg = mixercfg(mixer_cfg, mdp4_crtc->mixer, | ||
297 | pipe_id, stages[idx]); | ||
298 | } | 292 | } |
293 | mixer_cfg = mixercfg(mixer_cfg, mdp4_crtc->mixer, | ||
294 | pipe_id, stages[idx]); | ||
299 | } | 295 | } |
300 | 296 | ||
301 | /* this shouldn't happen.. and seems to cause underflow: */ | 297 | /* this shouldn't happen.. and seems to cause underflow: */ |
@@ -718,12 +714,6 @@ static void set_attach(struct drm_crtc *crtc, enum mdp4_pipe pipe_id, | |||
718 | { | 714 | { |
719 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); | 715 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); |
720 | 716 | ||
721 | BUG_ON(pipe_id >= ARRAY_SIZE(mdp4_crtc->planes)); | ||
722 | |||
723 | if (mdp4_crtc->planes[pipe_id] == plane) | ||
724 | return; | ||
725 | |||
726 | mdp4_crtc->planes[pipe_id] = plane; | ||
727 | blend_setup(crtc); | 717 | blend_setup(crtc); |
728 | if (mdp4_crtc->enabled && (plane != crtc->primary)) | 718 | if (mdp4_crtc->enabled && (plane != crtc->primary)) |
729 | crtc_flush(crtc); | 719 | crtc_flush(crtc); |
@@ -785,6 +775,7 @@ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev, | |||
785 | 775 | ||
786 | drm_crtc_init_with_planes(dev, crtc, plane, NULL, &mdp4_crtc_funcs); | 776 | drm_crtc_init_with_planes(dev, crtc, plane, NULL, &mdp4_crtc_funcs); |
787 | drm_crtc_helper_add(crtc, &mdp4_crtc_helper_funcs); | 777 | drm_crtc_helper_add(crtc, &mdp4_crtc_helper_funcs); |
778 | plane->crtc = crtc; | ||
788 | 779 | ||
789 | mdp4_plane_install_properties(plane, &crtc->base); | 780 | mdp4_plane_install_properties(plane, &crtc->base); |
790 | 781 | ||
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h index 06437745bc2c..15a0fec99c70 100644 --- a/drivers/gpu/drm/msm/msm_kms.h +++ b/drivers/gpu/drm/msm/msm_kms.h | |||
@@ -65,4 +65,9 @@ static inline void msm_kms_init(struct msm_kms *kms, | |||
65 | struct msm_kms *mdp4_kms_init(struct drm_device *dev); | 65 | struct msm_kms *mdp4_kms_init(struct drm_device *dev); |
66 | struct msm_kms *mdp5_kms_init(struct drm_device *dev); | 66 | struct msm_kms *mdp5_kms_init(struct drm_device *dev); |
67 | 67 | ||
68 | /* TODO move these helper iterator macro somewhere common: */ | ||
69 | #define for_each_plane_on_crtc(_crtc, _plane) \ | ||
70 | list_for_each_entry((_plane), &(_crtc)->dev->mode_config.plane_list, head) \ | ||
71 | if ((_plane)->crtc == (_crtc)) | ||
72 | |||
68 | #endif /* __MSM_KMS_H__ */ | 73 | #endif /* __MSM_KMS_H__ */ |