Move intel_reuse_initial_plane_obj() into common display code, and split
the ->find_obj hook into ->alloc_obj and ->setup hooks.

Return the struct drm_gem_object from ->alloc_obj in preparation for
moving more things to display.

Signed-off-by: Jani Nikula <[email protected]>
---
 .../drm/i915/display/intel_initial_plane.c    | 55 ++++++++++++++-
 drivers/gpu/drm/i915/i915_initial_plane.c     | 70 ++++---------------
 drivers/gpu/drm/xe/display/xe_initial_plane.c | 67 ++++--------------
 include/drm/intel/display_parent_interface.h  |  7 +-
 4 files changed, 88 insertions(+), 111 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c 
b/drivers/gpu/drm/i915/display/intel_initial_plane.c
index 9e67da94ac02..cbfcc52f180f 100644
--- a/drivers/gpu/drm/i915/display/intel_initial_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c
@@ -14,6 +14,43 @@ void intel_initial_plane_vblank_wait(struct intel_crtc *crtc)
        display->parent->initial_plane->vblank_wait(&crtc->base);
 }
 
+static const struct intel_plane_state *
+intel_reuse_initial_plane_obj(struct intel_crtc *this,
+                             const struct intel_initial_plane_config 
plane_configs[])
+{
+       struct intel_display *display = to_intel_display(this);
+       struct intel_crtc *crtc;
+
+       for_each_intel_crtc(display->drm, crtc) {
+               struct intel_plane *plane =
+                       to_intel_plane(crtc->base.primary);
+               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->hw.active)
+                       continue;
+
+               if (!plane_state->ggtt_vma)
+                       continue;
+
+               if (plane_configs[this->pipe].base == 
plane_configs[crtc->pipe].base)
+                       return plane_state;
+       }
+
+       return NULL;
+}
+
+static struct drm_gem_object *
+intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
+                             struct intel_initial_plane_config *plane_config)
+{
+       struct intel_display *display = to_intel_display(crtc);
+
+       return display->parent->initial_plane->alloc_obj(&crtc->base, 
plane_config);
+}
+
 static void
 intel_find_initial_plane_obj(struct intel_crtc *crtc,
                             struct intel_initial_plane_config plane_configs[])
@@ -21,6 +58,8 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc,
        struct intel_display *display = to_intel_display(crtc);
        struct intel_initial_plane_config *plane_config = 
&plane_configs[crtc->pipe];
        struct intel_plane *plane = to_intel_plane(crtc->base.primary);
+       struct drm_framebuffer *fb;
+       struct i915_vma *vma;
        int ret;
 
        /*
@@ -31,7 +70,21 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc,
        if (!plane_config->fb)
                return;
 
-       ret = display->parent->initial_plane->find_obj(&crtc->base, 
plane_configs);
+       if (intel_alloc_initial_plane_obj(crtc, plane_config)) {
+               fb = &plane_config->fb->base;
+               vma = plane_config->vma;
+       } else {
+               const struct intel_plane_state *other_plane_state;
+
+               other_plane_state = intel_reuse_initial_plane_obj(crtc, 
plane_configs);
+               if (!other_plane_state)
+                       goto nofb;
+
+               fb = other_plane_state->hw.fb;
+               vma = other_plane_state->ggtt_vma;
+       }
+
+       ret = display->parent->initial_plane->setup(&crtc->base, plane_config, 
fb, vma);
        if (ret)
                goto nofb;
 
diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c 
b/drivers/gpu/drm/i915/i915_initial_plane.c
index 40b9f981c9ac..0117f9e115d1 100644
--- a/drivers/gpu/drm/i915/i915_initial_plane.c
+++ b/drivers/gpu/drm/i915/i915_initial_plane.c
@@ -25,34 +25,6 @@ static void i915_initial_plane_vblank_wait(struct drm_crtc 
*crtc)
        intel_crtc_wait_for_next_vblank(to_intel_crtc(crtc));
 }
 
-static const struct intel_plane_state *
-intel_reuse_initial_plane_obj(struct intel_crtc *this,
-                             const struct intel_initial_plane_config 
plane_configs[])
-{
-       struct intel_display *display = to_intel_display(this);
-       struct intel_crtc *crtc;
-
-       for_each_intel_crtc(display->drm, crtc) {
-               struct intel_plane *plane =
-                       to_intel_plane(crtc->base.primary);
-               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->hw.active)
-                       continue;
-
-               if (!plane_state->ggtt_vma)
-                       continue;
-
-               if (plane_configs[this->pipe].base == 
plane_configs[crtc->pipe].base)
-                       return plane_state;
-       }
-
-       return NULL;
-}
-
 static enum intel_memory_type
 initial_plane_memory_type(struct intel_display *display)
 {
@@ -258,10 +230,11 @@ initial_plane_vma(struct intel_display *display,
        return NULL;
 }
 
-static bool
-intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
-                             struct intel_initial_plane_config *plane_config)
+static struct drm_gem_object *
+i915_alloc_initial_plane_obj(struct drm_crtc *_crtc,
+                            struct intel_initial_plane_config *plane_config)
 {
+       struct intel_crtc *crtc = to_intel_crtc(_crtc);
        struct intel_display *display = to_intel_display(crtc);
        struct drm_mode_fb_cmd2 mode_cmd = {};
        struct drm_framebuffer *fb = &plane_config->fb->base;
@@ -277,12 +250,12 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
                drm_dbg(display->drm,
                        "Unsupported modifier for initial FB: 0x%llx\n",
                        fb->modifier);
-               return false;
+               return NULL;
        }
 
        vma = initial_plane_vma(display, plane_config);
        if (!vma)
-               return false;
+               return NULL;
 
        mode_cmd.pixel_format = fb->format->format;
        mode_cmd.width = fb->width;
@@ -299,41 +272,25 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
        }
 
        plane_config->vma = vma;
-       return true;
+       return intel_bo_to_drm_bo(vma->obj);
 
 err_vma:
        i915_vma_put(vma);
-       return false;
+       return NULL;
 }
 
 static int
-i915_find_initial_plane_obj(struct drm_crtc *_crtc,
-                           struct intel_initial_plane_config plane_configs[])
+i915_initial_plane_setup(struct drm_crtc *_crtc,
+                        struct intel_initial_plane_config *plane_config,
+                        struct drm_framebuffer *fb,
+                        struct i915_vma *vma)
 {
        struct intel_crtc *crtc = to_intel_crtc(_crtc);
        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 =
                to_intel_plane_state(plane->base.state);
-       struct drm_framebuffer *fb;
-       struct i915_vma *vma;
-
-       if (intel_alloc_initial_plane_obj(crtc, plane_config)) {
-               fb = &plane_config->fb->base;
-               vma = plane_config->vma;
-       } else {
-               const struct intel_plane_state *other_plane_state;
-
-               other_plane_state = intel_reuse_initial_plane_obj(crtc, 
plane_configs);
-               if (!other_plane_state)
-                       return -EINVAL;
-
-               fb = other_plane_state->hw.fb;
-               vma = other_plane_state->ggtt_vma;
-       }
 
        plane_state->uapi.rotation = plane_config->rotation;
        intel_fb_fill_view(to_intel_framebuffer(fb),
@@ -379,6 +336,7 @@ static void i915_plane_config_fini(struct 
intel_initial_plane_config *plane_conf
 
 const struct intel_display_initial_plane_interface 
i915_display_initial_plane_interface = {
        .vblank_wait = i915_initial_plane_vblank_wait,
-       .find_obj = i915_find_initial_plane_obj,
+       .alloc_obj = i915_alloc_initial_plane_obj,
+       .setup = i915_initial_plane_setup,
        .config_fini = i915_plane_config_fini,
 };
diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c 
b/drivers/gpu/drm/xe/display/xe_initial_plane.c
index 42d2c2f8138e..2ce0f78cd7b1 100644
--- a/drivers/gpu/drm/xe/display/xe_initial_plane.c
+++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c
@@ -45,34 +45,6 @@ static void xe_initial_plane_vblank_wait(struct drm_crtc 
*_crtc)
                drm_warn(&xe->drm, "waiting for early vblank failed with %i\n", 
ret);
 }
 
-static const struct intel_plane_state *
-intel_reuse_initial_plane_obj(struct intel_crtc *this,
-                             const struct intel_initial_plane_config 
plane_configs[])
-{
-       struct xe_device *xe = to_xe_device(this->base.dev);
-       struct intel_crtc *crtc;
-
-       for_each_intel_crtc(&xe->drm, crtc) {
-               struct intel_plane *plane =
-                       to_intel_plane(crtc->base.primary);
-               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->hw.active)
-                       continue;
-
-               if (!plane_state->ggtt_vma)
-                       continue;
-
-               if (plane_configs[this->pipe].base == 
plane_configs[crtc->pipe].base)
-                       return plane_state;
-       }
-
-       return NULL;
-}
-
 static struct xe_bo *
 initial_plane_bo(struct xe_device *xe,
                 struct intel_initial_plane_config *plane_config)
@@ -152,10 +124,11 @@ initial_plane_bo(struct xe_device *xe,
        return bo;
 }
 
-static bool
-intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
-                             struct intel_initial_plane_config *plane_config)
+static struct drm_gem_object *
+xe_alloc_initial_plane_obj(struct drm_crtc *_crtc,
+                          struct intel_initial_plane_config *plane_config)
 {
+       struct intel_crtc *crtc = to_intel_crtc(_crtc);
        struct xe_device *xe = to_xe_device(crtc->base.dev);
        struct drm_mode_fb_cmd2 mode_cmd = { 0 };
        struct drm_framebuffer *fb = &plane_config->fb->base;
@@ -171,7 +144,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
                drm_dbg_kms(&xe->drm,
                            "Unsupported modifier for initial FB: 0x%llx\n",
                            fb->modifier);
-               return false;
+               return NULL;
        }
 
        mode_cmd.pixel_format = fb->format->format;
@@ -183,7 +156,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
 
        bo = initial_plane_bo(xe, plane_config);
        if (!bo)
-               return false;
+               return NULL;
 
        if (intel_framebuffer_init(to_intel_framebuffer(fb),
                                   &bo->ttm.base, fb->format, &mode_cmd)) {
@@ -193,39 +166,26 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
        /* Reference handed over to fb */
        xe_bo_put(bo);
 
-       return true;
+       return &bo->ttm.base;
 
 err_bo:
        xe_bo_unpin_map_no_vm(bo);
-       return false;
+       return NULL;
 }
 
 static int
-xe_find_initial_plane_obj(struct drm_crtc *_crtc,
-                         struct intel_initial_plane_config plane_configs[])
+xe_initial_plane_setup(struct drm_crtc *_crtc,
+                      struct intel_initial_plane_config *plane_config,
+                      struct drm_framebuffer *fb,
+                      struct i915_vma *_unused)
 {
        struct intel_crtc *crtc = to_intel_crtc(_crtc);
-       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 =
                to_intel_plane_state(plane->base.state);
-       struct drm_framebuffer *fb;
        struct i915_vma *vma;
 
-       if (intel_alloc_initial_plane_obj(crtc, plane_config)) {
-               fb = &plane_config->fb->base;
-       } else {
-               const struct intel_plane_state *other_plane_state;
-
-               other_plane_state = intel_reuse_initial_plane_obj(crtc, 
plane_configs);
-               if (!other_plane_state)
-                       return -EINVAL;
-
-               fb = other_plane_state->hw.fb;
-       }
-
        plane_state->uapi.rotation = plane_config->rotation;
        intel_fb_fill_view(to_intel_framebuffer(fb),
                           plane_state->uapi.rotation, &plane_state->view);
@@ -268,6 +228,7 @@ static void xe_plane_config_fini(struct 
intel_initial_plane_config *plane_config
 
 const struct intel_display_initial_plane_interface 
xe_display_initial_plane_interface = {
        .vblank_wait = xe_initial_plane_vblank_wait,
-       .find_obj = xe_find_initial_plane_obj,
+       .alloc_obj = xe_alloc_initial_plane_obj,
+       .setup = xe_initial_plane_setup,
        .config_fini = xe_plane_config_fini,
 };
diff --git a/include/drm/intel/display_parent_interface.h 
b/include/drm/intel/display_parent_interface.h
index 1be6320a5fc4..164f3d473e3a 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -9,7 +9,10 @@
 struct dma_fence;
 struct drm_crtc;
 struct drm_device;
+struct drm_framebuffer;
+struct drm_gem_object;
 struct drm_scanout_buffer;
+struct i915_vma;
 struct intel_hdcp_gsc_context;
 struct intel_initial_plane_config;
 struct intel_panic;
@@ -29,7 +32,9 @@ struct intel_display_hdcp_interface {
 
 struct intel_display_initial_plane_interface {
        void (*vblank_wait)(struct drm_crtc *crtc);
-       int (*find_obj)(struct drm_crtc *crtc, struct 
intel_initial_plane_config *plane_configs);
+       struct drm_gem_object *(*alloc_obj)(struct drm_crtc *crtc, struct 
intel_initial_plane_config *plane_config);
+       int (*setup)(struct drm_crtc *crtc, struct intel_initial_plane_config 
*plane_config,
+                    struct drm_framebuffer *fb, struct i915_vma *vma);
        void (*config_fini)(struct intel_initial_plane_config *plane_configs);
 };
 
-- 
2.47.3

Reply via email to