aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2014-11-07 13:20:50 -0500
committerRob Clark <robdclark@gmail.com>2014-11-16 14:22:44 -0500
commitbb6c018d3556dd683e3f16d24f2e9d60bcaed1b2 (patch)
tree8d64e8bd4caa6c4c2925426d89dfee003c1b500f
parent88ff1c2f3b5d4826bbe3b6ec3cf12a223dc0cb22 (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.c41
-rw-r--r--drivers/gpu/drm/msm/msm_kms.h5
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 @@
25struct mdp4_crtc { 25struct 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,
65struct msm_kms *mdp4_kms_init(struct drm_device *dev); 65struct msm_kms *mdp4_kms_init(struct drm_device *dev);
66struct msm_kms *mdp5_kms_init(struct drm_device *dev); 66struct 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__ */