Merge tag 'fuse-update-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/mszered...
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_simple_kms_helper.c
index 0b095a3..72989ed 100644 (file)
@@ -9,6 +9,8 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
@@ -143,6 +145,39 @@ static const struct drm_crtc_helper_funcs drm_simple_kms_crtc_helper_funcs = {
        .atomic_disable = drm_simple_kms_crtc_disable,
 };
 
+static void drm_simple_kms_crtc_reset(struct drm_crtc *crtc)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(crtc, struct drm_simple_display_pipe, crtc);
+       if (!pipe->funcs || !pipe->funcs->reset_crtc)
+               return drm_atomic_helper_crtc_reset(crtc);
+
+       return pipe->funcs->reset_crtc(pipe);
+}
+
+static struct drm_crtc_state *drm_simple_kms_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(crtc, struct drm_simple_display_pipe, crtc);
+       if (!pipe->funcs || !pipe->funcs->duplicate_crtc_state)
+               return drm_atomic_helper_crtc_duplicate_state(crtc);
+
+       return pipe->funcs->duplicate_crtc_state(pipe);
+}
+
+static void drm_simple_kms_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(crtc, struct drm_simple_display_pipe, crtc);
+       if (!pipe->funcs || !pipe->funcs->destroy_crtc_state)
+               drm_atomic_helper_crtc_destroy_state(crtc, state);
+       else
+               pipe->funcs->destroy_crtc_state(pipe, state);
+}
+
 static int drm_simple_kms_crtc_enable_vblank(struct drm_crtc *crtc)
 {
        struct drm_simple_display_pipe *pipe;
@@ -166,12 +201,12 @@ static void drm_simple_kms_crtc_disable_vblank(struct drm_crtc *crtc)
 }
 
 static const struct drm_crtc_funcs drm_simple_kms_crtc_funcs = {
-       .reset = drm_atomic_helper_crtc_reset,
+       .reset = drm_simple_kms_crtc_reset,
        .destroy = drm_crtc_cleanup,
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
-       .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+       .atomic_duplicate_state = drm_simple_kms_crtc_duplicate_state,
+       .atomic_destroy_state = drm_simple_kms_crtc_destroy_state,
        .enable_vblank = drm_simple_kms_crtc_enable_vblank,
        .disable_vblank = drm_simple_kms_crtc_disable_vblank,
 };
@@ -225,8 +260,14 @@ static int drm_simple_kms_plane_prepare_fb(struct drm_plane *plane,
        struct drm_simple_display_pipe *pipe;
 
        pipe = container_of(plane, struct drm_simple_display_pipe, plane);
-       if (!pipe->funcs || !pipe->funcs->prepare_fb)
-               return 0;
+       if (!pipe->funcs || !pipe->funcs->prepare_fb) {
+               if (WARN_ON_ONCE(!drm_core_check_feature(plane->dev, DRIVER_GEM)))
+                       return 0;
+
+               WARN_ON_ONCE(pipe->funcs && pipe->funcs->cleanup_fb);
+
+               return drm_gem_simple_display_pipe_prepare_fb(pipe, state);
+       }
 
        return pipe->funcs->prepare_fb(pipe, state);
 }