drm/msm: atomic fixes
authorRob Clark <robdclark@gmail.com>
Wed, 19 Nov 2014 17:29:33 +0000 (12:29 -0500)
committerRob Clark <robdclark@gmail.com>
Fri, 21 Nov 2014 13:57:22 +0000 (08:57 -0500)
Fixes for a couple little issues found in testing.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_atomic.c
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/msm/msm_kms.h

index 8cf3361..f0de412 100644 (file)
@@ -117,7 +117,7 @@ int msm_atomic_commit(struct drm_device *dev,
                if (!plane)
                        continue;
 
-               if (plane->state->fb != new_state->fb)
+               if ((plane->state->fb != new_state->fb) && new_state->fb)
                        add_fb(c, new_state->fb);
        }
 
index f4e42d5..84dec16 100644 (file)
@@ -120,6 +120,8 @@ void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id)
 uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane)
 {
        struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
+       if (!msm_fb->planes[plane])
+               return 0;
        return msm_gem_iova(msm_fb->planes[plane], id);
 }
 
index 15a0fec..1e9d8c2 100644 (file)
@@ -68,6 +68,11 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev);
 /* TODO move these helper iterator macro somewhere common: */
 #define for_each_plane_on_crtc(_crtc, _plane) \
        list_for_each_entry((_plane), &(_crtc)->dev->mode_config.plane_list, head) \
-               if ((_plane)->crtc == (_crtc))
+               if ((_plane)->state->crtc == (_crtc))
+
+#define for_each_pending_plane_on_crtc(_state, _crtc, _plane) \
+       list_for_each_entry((_plane), &(_crtc)->dev->mode_config.plane_list, head) \
+               if (({struct drm_plane_state *_ps = (_state)->plane_states[drm_plane_index(_plane)]; \
+                       _ps && _ps->crtc == (_crtc);}))
 
 #endif /* __MSM_KMS_H__ */