drm/msm: atomic fixes
Fixes for a couple little issues found in testing.
Signed-off-by: Rob Clark <robdclark@gmail.com>
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
index 8cf3361..f0de412 100644
--- a/drivers/gpu/drm/msm/msm_atomic.c
+++ b/drivers/gpu/drm/msm/msm_atomic.c
@@ -117,7 +117,7 @@
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);
}
diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
index f4e42d5..84dec16 100644
--- a/drivers/gpu/drm/msm/msm_fb.c
+++ b/drivers/gpu/drm/msm/msm_fb.c
@@ -120,6 +120,8 @@
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);
}
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
index 15a0fec9..1e9d8c2 100644
--- a/drivers/gpu/drm/msm/msm_kms.h
+++ b/drivers/gpu/drm/msm/msm_kms.h
@@ -68,6 +68,11 @@
/* 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__ */