]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/mgag200: Introduce custom CRTC state
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 14 Jul 2021 14:22:39 +0000 (16:22 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Sun, 8 Aug 2021 18:14:12 +0000 (20:14 +0200)
Inherit from struct drm_crtc_state by embeding it and providing the
rsp callbacks for simple-kms helpers. No functional changes.

The new state struct mgag200_crtc_state will hold PLL values for modeset
operations.

v2:
* move the simple-kms changes into a separate patch (Sam)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210714142240.21979-13-tzimmermann@suse.de
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_mode.c

index e6f37cd23eec1240565e9b2e353dfbaab699b283..a85d5f783de440acbf49fe7529f43a515f8b2114 100644 (file)
@@ -157,6 +157,15 @@ struct mgag200_pll {
        const struct mgag200_pll_funcs *funcs;
 };
 
+struct mgag200_crtc_state {
+       struct drm_crtc_state base;
+};
+
+static inline struct mgag200_crtc_state *to_mgag200_crtc_state(struct drm_crtc_state *base)
+{
+       return container_of(base, struct mgag200_crtc_state, base);
+}
+
 #define to_mga_connector(x) container_of(x, struct mga_connector, base)
 
 struct mga_i2c_chan {
index ea068addbc7431fe212ba56bc1d9f798b9b4c8c9..6e8b0db1ffa079a6f371a556580967a95cb18f92 100644 (file)
@@ -964,6 +964,49 @@ mgag200_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
                mgag200_handle_damage(mdev, fb, &damage, &shadow_plane_state->map[0]);
 }
 
+static struct drm_crtc_state *
+mgag200_simple_display_pipe_duplicate_crtc_state(struct drm_simple_display_pipe *pipe)
+{
+       struct drm_crtc *crtc = &pipe->crtc;
+       struct drm_crtc_state *crtc_state = crtc->state;
+       struct mgag200_crtc_state *new_mgag200_crtc_state;
+
+       if (!crtc_state)
+               return NULL;
+
+       new_mgag200_crtc_state = kzalloc(sizeof(*new_mgag200_crtc_state), GFP_KERNEL);
+       if (!new_mgag200_crtc_state)
+               return NULL;
+       __drm_atomic_helper_crtc_duplicate_state(crtc, &new_mgag200_crtc_state->base);
+
+       return &new_mgag200_crtc_state->base;
+}
+
+static void mgag200_simple_display_pipe_destroy_crtc_state(struct drm_simple_display_pipe *pipe,
+                                                          struct drm_crtc_state *crtc_state)
+{
+       struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state);
+
+       __drm_atomic_helper_crtc_destroy_state(&mgag200_crtc_state->base);
+       kfree(mgag200_crtc_state);
+}
+
+static void mgag200_simple_display_pipe_reset_crtc(struct drm_simple_display_pipe *pipe)
+{
+       struct drm_crtc *crtc = &pipe->crtc;
+       struct mgag200_crtc_state *mgag200_crtc_state;
+
+       if (crtc->state) {
+               mgag200_simple_display_pipe_destroy_crtc_state(pipe, crtc->state);
+               crtc->state = NULL; /* must be set to NULL here */
+       }
+
+       mgag200_crtc_state = kzalloc(sizeof(*mgag200_crtc_state), GFP_KERNEL);
+       if (!mgag200_crtc_state)
+               return;
+       __drm_atomic_helper_crtc_reset(crtc, &mgag200_crtc_state->base);
+}
+
 static const struct drm_simple_display_pipe_funcs
 mgag200_simple_display_pipe_funcs = {
        .mode_valid = mgag200_simple_display_pipe_mode_valid,
@@ -971,6 +1014,9 @@ mgag200_simple_display_pipe_funcs = {
        .disable    = mgag200_simple_display_pipe_disable,
        .check      = mgag200_simple_display_pipe_check,
        .update     = mgag200_simple_display_pipe_update,
+       .reset_crtc = mgag200_simple_display_pipe_reset_crtc,
+       .duplicate_crtc_state = mgag200_simple_display_pipe_duplicate_crtc_state,
+       .destroy_crtc_state = mgag200_simple_display_pipe_destroy_crtc_state,
        DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS,
 };