drm/i915: Extract intel_sprite_uapi.c
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 14 Mar 2023 13:02:55 +0000 (15:02 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 17 Mar 2023 13:24:27 +0000 (15:24 +0200)
Move the sprite colorkey ioctl handler to its own file
so that intel_sprite.c becomes all about the low level
details of pre-skl sprite planes.

And drop a bunch of unnecessary includes while at it.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230314130255.23273-10-ville.syrjala@linux.intel.com
Reviewed-by: Jouni Högander <jouni.hogander@intel.com>
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/display/intel_sprite.c
drivers/gpu/drm/i915/display/intel_sprite_uapi.c [new file with mode: 0644]
drivers/gpu/drm/i915/display/intel_sprite_uapi.h [new file with mode: 0644]

index 8e46f57..a59937b 100644 (file)
@@ -267,6 +267,7 @@ i915-y += \
        display/intel_psr.o \
        display/intel_quirks.o \
        display/intel_sprite.o \
+       display/intel_sprite_uapi.o \
        display/intel_tc.o \
        display/intel_vblank.o \
        display/intel_vga.o \
index 3563fec..25034bb 100644 (file)
 
 #include <linux/string_helpers.h>
 
-#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_blend.h>
 #include <drm/drm_color_mgmt.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_damage_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_rect.h>
 
 #include "i915_drv.h"
 #include "i915_reg.h"
-#include "i915_vgpu.h"
 #include "i9xx_plane.h"
 #include "intel_atomic_plane.h"
-#include "intel_crtc.h"
 #include "intel_de.h"
 #include "intel_display_types.h"
 #include "intel_fb.h"
-#include "intel_frontbuffer.h"
 #include "intel_sprite.h"
-#include "intel_vrr.h"
 
 static void i9xx_plane_linear_gamma(u16 gamma[8])
 {
@@ -1391,124 +1384,6 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
        return 0;
 }
 
-static bool has_dst_key_in_primary_plane(struct drm_i915_private *dev_priv)
-{
-       return DISPLAY_VER(dev_priv) >= 9;
-}
-
-static void intel_plane_set_ckey(struct intel_plane_state *plane_state,
-                                const struct drm_intel_sprite_colorkey *set)
-{
-       struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
-
-       *key = *set;
-
-       /*
-        * We want src key enabled on the
-        * sprite and not on the primary.
-        */
-       if (plane->id == PLANE_PRIMARY &&
-           set->flags & I915_SET_COLORKEY_SOURCE)
-               key->flags = 0;
-
-       /*
-        * On SKL+ we want dst key enabled on
-        * the primary and not on the sprite.
-        */
-       if (DISPLAY_VER(dev_priv) >= 9 && plane->id != PLANE_PRIMARY &&
-           set->flags & I915_SET_COLORKEY_DESTINATION)
-               key->flags = 0;
-}
-
-int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
-                                   struct drm_file *file_priv)
-{
-       struct drm_i915_private *dev_priv = to_i915(dev);
-       struct drm_intel_sprite_colorkey *set = data;
-       struct drm_plane *plane;
-       struct drm_plane_state *plane_state;
-       struct drm_atomic_state *state;
-       struct drm_modeset_acquire_ctx ctx;
-       int ret = 0;
-
-       /* ignore the pointless "none" flag */
-       set->flags &= ~I915_SET_COLORKEY_NONE;
-
-       if (set->flags & ~(I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE))
-               return -EINVAL;
-
-       /* Make sure we don't try to enable both src & dest simultaneously */
-       if ((set->flags & (I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE)) == (I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE))
-               return -EINVAL;
-
-       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
-           set->flags & I915_SET_COLORKEY_DESTINATION)
-               return -EINVAL;
-
-       plane = drm_plane_find(dev, file_priv, set->plane_id);
-       if (!plane || plane->type != DRM_PLANE_TYPE_OVERLAY)
-               return -ENOENT;
-
-       /*
-        * SKL+ only plane 2 can do destination keying against plane 1.
-        * Also multiple planes can't do destination keying on the same
-        * pipe simultaneously.
-        */
-       if (DISPLAY_VER(dev_priv) >= 9 &&
-           to_intel_plane(plane)->id >= PLANE_SPRITE1 &&
-           set->flags & I915_SET_COLORKEY_DESTINATION)
-               return -EINVAL;
-
-       drm_modeset_acquire_init(&ctx, 0);
-
-       state = drm_atomic_state_alloc(plane->dev);
-       if (!state) {
-               ret = -ENOMEM;
-               goto out;
-       }
-       state->acquire_ctx = &ctx;
-
-       while (1) {
-               plane_state = drm_atomic_get_plane_state(state, plane);
-               ret = PTR_ERR_OR_ZERO(plane_state);
-               if (!ret)
-                       intel_plane_set_ckey(to_intel_plane_state(plane_state), set);
-
-               /*
-                * On some platforms we have to configure
-                * the dst colorkey on the primary plane.
-                */
-               if (!ret && has_dst_key_in_primary_plane(dev_priv)) {
-                       struct intel_crtc *crtc =
-                               intel_crtc_for_pipe(dev_priv,
-                                                   to_intel_plane(plane)->pipe);
-
-                       plane_state = drm_atomic_get_plane_state(state,
-                                                                crtc->base.primary);
-                       ret = PTR_ERR_OR_ZERO(plane_state);
-                       if (!ret)
-                               intel_plane_set_ckey(to_intel_plane_state(plane_state), set);
-               }
-
-               if (!ret)
-                       ret = drm_atomic_commit(state);
-
-               if (ret != -EDEADLK)
-                       break;
-
-               drm_atomic_state_clear(state);
-               drm_modeset_backoff(&ctx);
-       }
-
-       drm_atomic_state_put(state);
-out:
-       drm_modeset_drop_locks(&ctx);
-       drm_modeset_acquire_fini(&ctx);
-       return ret;
-}
-
 static const u32 g4x_sprite_formats[] = {
        DRM_FORMAT_XRGB8888,
        DRM_FORMAT_YUYV,
diff --git a/drivers/gpu/drm/i915/display/intel_sprite_uapi.c b/drivers/gpu/drm/i915/display/intel_sprite_uapi.c
new file mode 100644 (file)
index 0000000..70a3910
--- /dev/null
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include "i915_drv.h"
+#include "intel_crtc.h"
+#include "intel_display_types.h"
+#include "intel_sprite_uapi.h"
+
+static bool has_dst_key_in_primary_plane(struct drm_i915_private *dev_priv)
+{
+       return DISPLAY_VER(dev_priv) >= 9;
+}
+
+static void intel_plane_set_ckey(struct intel_plane_state *plane_state,
+                                const struct drm_intel_sprite_colorkey *set)
+{
+       struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
+       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
+       struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
+
+       *key = *set;
+
+       /*
+        * We want src key enabled on the
+        * sprite and not on the primary.
+        */
+       if (plane->id == PLANE_PRIMARY &&
+           set->flags & I915_SET_COLORKEY_SOURCE)
+               key->flags = 0;
+
+       /*
+        * On SKL+ we want dst key enabled on
+        * the primary and not on the sprite.
+        */
+       if (DISPLAY_VER(dev_priv) >= 9 && plane->id != PLANE_PRIMARY &&
+           set->flags & I915_SET_COLORKEY_DESTINATION)
+               key->flags = 0;
+}
+
+int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
+                                   struct drm_file *file_priv)
+{
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct drm_intel_sprite_colorkey *set = data;
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
+       struct drm_atomic_state *state;
+       struct drm_modeset_acquire_ctx ctx;
+       int ret = 0;
+
+       /* ignore the pointless "none" flag */
+       set->flags &= ~I915_SET_COLORKEY_NONE;
+
+       if (set->flags & ~(I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE))
+               return -EINVAL;
+
+       /* Make sure we don't try to enable both src & dest simultaneously */
+       if ((set->flags & (I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE)) == (I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE))
+               return -EINVAL;
+
+       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
+           set->flags & I915_SET_COLORKEY_DESTINATION)
+               return -EINVAL;
+
+       plane = drm_plane_find(dev, file_priv, set->plane_id);
+       if (!plane || plane->type != DRM_PLANE_TYPE_OVERLAY)
+               return -ENOENT;
+
+       /*
+        * SKL+ only plane 2 can do destination keying against plane 1.
+        * Also multiple planes can't do destination keying on the same
+        * pipe simultaneously.
+        */
+       if (DISPLAY_VER(dev_priv) >= 9 &&
+           to_intel_plane(plane)->id >= PLANE_SPRITE1 &&
+           set->flags & I915_SET_COLORKEY_DESTINATION)
+               return -EINVAL;
+
+       drm_modeset_acquire_init(&ctx, 0);
+
+       state = drm_atomic_state_alloc(plane->dev);
+       if (!state) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       state->acquire_ctx = &ctx;
+
+       while (1) {
+               plane_state = drm_atomic_get_plane_state(state, plane);
+               ret = PTR_ERR_OR_ZERO(plane_state);
+               if (!ret)
+                       intel_plane_set_ckey(to_intel_plane_state(plane_state), set);
+
+               /*
+                * On some platforms we have to configure
+                * the dst colorkey on the primary plane.
+                */
+               if (!ret && has_dst_key_in_primary_plane(dev_priv)) {
+                       struct intel_crtc *crtc =
+                               intel_crtc_for_pipe(dev_priv,
+                                                   to_intel_plane(plane)->pipe);
+
+                       plane_state = drm_atomic_get_plane_state(state,
+                                                                crtc->base.primary);
+                       ret = PTR_ERR_OR_ZERO(plane_state);
+                       if (!ret)
+                               intel_plane_set_ckey(to_intel_plane_state(plane_state), set);
+               }
+
+               if (!ret)
+                       ret = drm_atomic_commit(state);
+
+               if (ret != -EDEADLK)
+                       break;
+
+               drm_atomic_state_clear(state);
+               drm_modeset_backoff(&ctx);
+       }
+
+       drm_atomic_state_put(state);
+out:
+       drm_modeset_drop_locks(&ctx);
+       drm_modeset_acquire_fini(&ctx);
+       return ret;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_sprite_uapi.h b/drivers/gpu/drm/i915/display/intel_sprite_uapi.h
new file mode 100644 (file)
index 0000000..3eb5002
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef __INTEL_SPRITE_UAPI_H__
+#define __INTEL_SPRITE_UAPI_H__
+
+struct drm_device;
+struct drm_file;
+
+int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
+                                   struct drm_file *file_priv);
+
+#endif /* __INTEL_SPRITE_UAPI_H__ */