drm/i915: Tweak BIOS fb reuse check
authorjsg <jsg@openbsd.org>
Tue, 13 Aug 2024 00:25:13 +0000 (00:25 +0000)
committerjsg <jsg@openbsd.org>
Tue, 13 Aug 2024 00:25:13 +0000 (00:25 +0000)
From Ville Syrjala
ea5e150ac2cf88f586299c06244d5a4d473c041e in mainline linux

sys/dev/pci/drm/i915/display/intel_plane_initial.c

index 40c129a..48aaaef 100644 (file)
 #include "intel_plane_initial.h"
 
 static bool
-intel_reuse_initial_plane_obj(struct drm_i915_private *i915,
-                             const struct intel_initial_plane_config *plane_config,
+intel_reuse_initial_plane_obj(struct intel_crtc *this,
+                             const struct intel_initial_plane_config plane_configs[],
                              struct drm_framebuffer **fb,
                              struct i915_vma **vma)
 {
+       struct drm_i915_private *i915 = to_i915(this->base.dev);
        struct intel_crtc *crtc;
 
        for_each_intel_crtc(&i915->drm, crtc) {
-               struct intel_crtc_state *crtc_state =
-                       to_intel_crtc_state(crtc->base.state);
                struct intel_plane *plane =
                        to_intel_plane(crtc->base.primary);
-               struct intel_plane_state *plane_state =
+               const struct intel_plane_state *plane_state =
                        to_intel_plane_state(plane->base.state);
+               const struct intel_crtc_state *crtc_state =
+                       to_intel_crtc_state(crtc->base.state);
 
                if (!crtc_state->uapi.active)
                        continue;
@@ -33,7 +34,7 @@ intel_reuse_initial_plane_obj(struct drm_i915_private *i915,
                if (!plane_state->ggtt_vma)
                        continue;
 
-               if (intel_plane_ggtt_offset(plane_state) == plane_config->base) {
+               if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) {
                        *fb = plane_state->hw.fb;
                        *vma = plane_state->ggtt_vma;
                        return true;
@@ -264,10 +265,11 @@ err_vma:
 
 static void
 intel_find_initial_plane_obj(struct intel_crtc *crtc,
-                            struct intel_initial_plane_config *plane_config)
+                            struct intel_initial_plane_config plane_configs[])
 {
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       struct intel_initial_plane_config *plane_config =
+               &plane_configs[crtc->pipe];
        struct intel_plane *plane =
                to_intel_plane(crtc->base.primary);
        struct intel_plane_state *plane_state =
@@ -293,7 +295,7 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc,
         * Failed to alloc the obj, check to see if we should share
         * an fb with another CRTC instead
         */
-       if (intel_reuse_initial_plane_obj(dev_priv, plane_config, &fb, &vma))
+       if (intel_reuse_initial_plane_obj(crtc, plane_configs, &fb, &vma))
                goto valid_fb;
 
        /*
@@ -358,10 +360,12 @@ static void plane_config_fini(struct intel_initial_plane_config *plane_config)
 
 void intel_initial_plane_config(struct drm_i915_private *i915)
 {
+       struct intel_initial_plane_config plane_configs[I915_MAX_PIPES] = {};
        struct intel_crtc *crtc;
 
        for_each_intel_crtc(&i915->drm, crtc) {
-               struct intel_initial_plane_config plane_config = {};
+               struct intel_initial_plane_config *plane_config =
+                       &plane_configs[crtc->pipe];
 
                if (!to_intel_crtc_state(crtc->base.state)->uapi.active)
                        continue;
@@ -373,14 +377,14 @@ void intel_initial_plane_config(struct drm_i915_private *i915)
                 * can even allow for smooth boot transitions if the BIOS
                 * fb is large enough for the active pipe configuration.
                 */
-               i915->display.funcs.display->get_initial_plane_config(crtc, &plane_config);
+               i915->display.funcs.display->get_initial_plane_config(crtc, plane_config);
 
                /*
                 * If the fb is shared between multiple heads, we'll
                 * just get the first one.
                 */
-               intel_find_initial_plane_obj(crtc, &plane_config);
+               intel_find_initial_plane_obj(crtc, plane_configs);
 
-               plane_config_fini(&plane_config);
+               plane_config_fini(plane_config);
        }
 }