Currently, private CRTC state(priv_crtc_state) is not get used by the cursor's+static int lsdc_primary_plane_atomic_check(struct drm_plane *plane,Storing the pixel format in the CRTC state is weird? What would happen
+ struct drm_atomic_state *state)
+{
+ struct drm_device *ddev = plane->dev;
+ struct lsdc_device *ldev = to_lsdc(ddev);
+ struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state, plane);
+ struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, plane);
+ struct drm_framebuffer *new_fb = new_plane_state->fb;
+ struct drm_framebuffer *old_fb = old_plane_state->fb;
+ struct drm_crtc *crtc = new_plane_state->crtc;
+ u32 new_format = new_fb->format->format;
+ struct drm_crtc_state *new_crtc_state;
+ struct lsdc_crtc_state *priv_crtc_state;
+ int ret;
+
+ if (!crtc)
+ return 0;
+
+ new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+ if (WARN_ON(!new_crtc_state))
+ return -EINVAL;
+
+ priv_crtc_state = to_lsdc_crtc_state(new_crtc_state);
+
+ ret = drm_atomic_helper_check_plane_state(new_plane_state,
+ new_crtc_state,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_HELPER_NO_SCALING,
+ false,
+ true);
+ if (ret)
+ return ret;
+
+ /*
+ * Require full modeset if enabling or disabling a plane,
+ * or changing its position, size, depth or format.
+ */
+ if ((!new_fb || !old_fb ||
+ old_plane_state->crtc_x != new_plane_state->crtc_x ||
+ old_plane_state->crtc_y != new_plane_state->crtc_y ||
+ old_plane_state->crtc_w != new_plane_state->crtc_w ||
+ old_plane_state->crtc_h != new_plane_state->crtc_h ||
+ old_fb->format->format != new_format))
+ new_crtc_state->mode_changed = true;
+
+
+ priv_crtc_state->pix_fmt = lsdc_primary_get_default_format(crtc);
if you have a primary plane and a cursor in different formats?
Also, reading the default format from a register doesn't look right.
atomic_check can occur at any time, including before a previous commit,
or while the hardware is disabled. You should rely on either a constant
or the previous state here.