static int intel_joiner_add_affected_crtcs(struct intel_atomic_state *state)
 {
        struct drm_i915_private *i915 = to_i915(state->base.dev);
+       const struct intel_plane_state *plane_state;
        struct intel_crtc_state *crtc_state;
+       struct intel_plane *plane;
        struct intel_crtc *crtc;
        u8 affected_pipes = 0;
        u8 modeset_pipes = 0;
        int i;
 
+       /*
+        * Any plane which is in use by the joiner needs its crtc.
+        * Pull those in first as this will not have happened yet
+        * if the plane remains disabled according to uapi.
+        */
+       for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
+               crtc = to_intel_crtc(plane_state->hw.crtc);
+               if (!crtc)
+                       continue;
+
+               crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
+               if (IS_ERR(crtc_state))
+                       return PTR_ERR(crtc_state);
+       }
+
+       /* Now pull in all joined crtcs */
        for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
                affected_pipes |= crtc_state->joiner_pipes;
                if (intel_crtc_needs_modeset(crtc_state))