Add the initial plane handling functions to the display parent
interface. Add the call wrappers in dedicated intel_initial_plane.c
instead of intel_parent.c, as we'll be refactoring the calls heavily.

Signed-off-by: Jani Nikula <[email protected]>
---
 drivers/gpu/drm/i915/Makefile                 |  1 +
 .../drm/i915/display/intel_initial_plane.c    | 20 +++++++++++++++++++
 drivers/gpu/drm/i915/i915_driver.c            |  2 ++
 drivers/gpu/drm/i915/i915_initial_plane.c     | 16 +++++++++++----
 drivers/gpu/drm/i915/i915_initial_plane.h     |  9 +++++++++
 drivers/gpu/drm/xe/Makefile                   |  1 +
 drivers/gpu/drm/xe/display/xe_display.c       |  2 ++
 drivers/gpu/drm/xe/display/xe_initial_plane.c | 17 ++++++++++++----
 drivers/gpu/drm/xe/display/xe_initial_plane.h |  9 +++++++++
 include/drm/intel/display_parent_interface.h  |  9 +++++++++
 10 files changed, 78 insertions(+), 8 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/display/intel_initial_plane.c
 create mode 100644 drivers/gpu/drm/i915/i915_initial_plane.h
 create mode 100644 drivers/gpu/drm/xe/display/xe_initial_plane.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 8d2ca226c86f..6f6b8e0ba647 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -288,6 +288,7 @@ i915-y += \
        display/intel_hotplug.o \
        display/intel_hotplug_irq.o \
        display/intel_hti.o \
+       display/intel_initial_plane.o \
        display/intel_link_bw.o \
        display/intel_load_detect.o \
        display/intel_lpe_audio.o \
diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c 
b/drivers/gpu/drm/i915/display/intel_initial_plane.c
new file mode 100644
index 000000000000..c68d7555aee5
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: MIT
+/* Copyright © 2025 Intel Corporation */
+
+#include <drm/intel/display_parent_interface.h>
+
+#include "intel_display_core.h"
+#include "intel_display_types.h"
+#include "intel_initial_plane.h"
+
+void intel_initial_plane_vblank_wait(struct intel_crtc *crtc)
+{
+       struct intel_display *display = to_intel_display(crtc);
+
+       display->parent->initial_plane->vblank_wait(&crtc->base);
+}
+
+void intel_initial_plane_config(struct intel_display *display)
+{
+       display->parent->initial_plane->config(display->drm);
+}
diff --git a/drivers/gpu/drm/i915/i915_driver.c 
b/drivers/gpu/drm/i915/i915_driver.c
index 9bc5ef988be7..a6057c7cdd5c 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -98,6 +98,7 @@
 #include "i915_gmch.h"
 #include "i915_hdcp_gsc.h"
 #include "i915_hwmon.h"
+#include "i915_initial_plane.h"
 #include "i915_ioc32.h"
 #include "i915_ioctl.h"
 #include "i915_irq.h"
@@ -769,6 +770,7 @@ static bool vgpu_active(struct drm_device *drm)
 
 static const struct intel_display_parent_interface parent = {
        .hdcp = &i915_display_hdcp_interface,
+       .initial_plane = &i915_display_initial_plane_interface,
        .irq = &i915_display_irq_interface,
        .panic = &i915_display_panic_interface,
        .rpm = &i915_display_rpm_interface,
diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c 
b/drivers/gpu/drm/i915/i915_initial_plane.c
index b7f115708c32..f26563eed9ba 100644
--- a/drivers/gpu/drm/i915/i915_initial_plane.c
+++ b/drivers/gpu/drm/i915/i915_initial_plane.c
@@ -4,6 +4,7 @@
  */
 
 #include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
 
 #include "display/intel_crtc.h"
 #include "display/intel_display.h"
@@ -17,10 +18,11 @@
 #include "gem/i915_gem_region.h"
 
 #include "i915_drv.h"
+#include "i915_initial_plane.h"
 
-void intel_initial_plane_vblank_wait(struct intel_crtc *crtc)
+static void i915_initial_plane_vblank_wait(struct drm_crtc *crtc)
 {
-       intel_crtc_wait_for_next_vblank(crtc);
+       intel_crtc_wait_for_next_vblank(to_intel_crtc(crtc));
 }
 
 static bool
@@ -406,8 +408,9 @@ static void plane_config_fini(struct 
intel_initial_plane_config *plane_config)
                i915_vma_put(plane_config->vma);
 }
 
-void intel_initial_plane_config(struct intel_display *display)
+static void i915_initial_plane_config(struct drm_device *drm)
 {
+       struct intel_display *display = to_intel_display(drm);
        struct intel_initial_plane_config plane_configs[I915_MAX_PIPES] = {};
        struct intel_crtc *crtc;
 
@@ -436,8 +439,13 @@ void intel_initial_plane_config(struct intel_display 
*display)
                intel_find_initial_plane_obj(crtc, plane_configs);
 
                if (display->funcs.display->fixup_initial_plane_config(crtc, 
plane_config))
-                       intel_initial_plane_vblank_wait(crtc);
+                       i915_initial_plane_vblank_wait(&crtc->base);
 
                plane_config_fini(plane_config);
        }
 }
+
+const struct intel_display_initial_plane_interface 
i915_display_initial_plane_interface = {
+       .vblank_wait = i915_initial_plane_vblank_wait,
+       .config = i915_initial_plane_config,
+};
diff --git a/drivers/gpu/drm/i915/i915_initial_plane.h 
b/drivers/gpu/drm/i915/i915_initial_plane.h
new file mode 100644
index 000000000000..99ba462659a6
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_initial_plane.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2025 Intel Corporation */
+
+#ifndef __I915_INITIAL_PLANE_H__
+#define __I915_INITIAL_PLANE_H__
+
+extern const struct intel_display_initial_plane_interface 
i915_display_initial_plane_interface;
+
+#endif
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 84fd9f88f63d..89dc48cd73e2 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -294,6 +294,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
        i915-display/intel_hotplug.o \
        i915-display/intel_hotplug_irq.o \
        i915-display/intel_hti.o \
+       i915-display/intel_initial_plane.o \
        i915-display/intel_link_bw.o \
        i915-display/intel_lspcon.o \
        i915-display/intel_lt_phy.o \
diff --git a/drivers/gpu/drm/xe/display/xe_display.c 
b/drivers/gpu/drm/xe/display/xe_display.c
index eda65a05f601..f8a831b5dc7d 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -37,6 +37,7 @@
 #include "skl_watermark.h"
 #include "xe_display_rpm.h"
 #include "xe_hdcp_gsc.h"
+#include "xe_initial_plane.h"
 #include "xe_module.h"
 #include "xe_panic.h"
 #include "xe_stolen.h"
@@ -538,6 +539,7 @@ static const struct intel_display_irq_interface 
xe_display_irq_interface = {
 
 static const struct intel_display_parent_interface parent = {
        .hdcp = &xe_display_hdcp_interface,
+       .initial_plane = &xe_display_initial_plane_interface,
        .irq = &xe_display_irq_interface,
        .panic = &xe_display_panic_interface,
        .rpm = &xe_display_rpm_interface,
diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c 
b/drivers/gpu/drm/xe/display/xe_initial_plane.c
index 9d5760e56c4c..dd69f1c65903 100644
--- a/drivers/gpu/drm/xe/display/xe_initial_plane.c
+++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c
@@ -6,6 +6,8 @@
 /* for ioread64 */
 #include <linux/io-64-nonatomic-lo-hi.h>
 
+#include <drm/intel/display_parent_interface.h>
+
 #include "regs/xe_gtt_defs.h"
 #include "xe_ggtt.h"
 #include "xe_mmio.h"
@@ -27,9 +29,10 @@
 
 #include <generated/xe_device_wa_oob.h>
 
-void intel_initial_plane_vblank_wait(struct intel_crtc *crtc)
+/* Early xe has no irq */
+static void xe_initial_plane_vblank_wait(struct drm_crtc *_crtc)
 {
-       /* Early xe has no irq */
+       struct intel_crtc *crtc = to_intel_crtc(_crtc);
        struct xe_device *xe = to_xe_device(crtc->base.dev);
        struct xe_reg pipe_frmtmstmp = 
XE_REG(i915_mmio_reg_offset(PIPE_FRMTMSTMP(crtc->pipe)));
        u32 timestamp;
@@ -284,8 +287,9 @@ static void plane_config_fini(struct 
intel_initial_plane_config *plane_config)
        }
 }
 
-void intel_initial_plane_config(struct intel_display *display)
+static void xe_initial_plane_config(struct drm_device *drm)
 {
+       struct intel_display *display = to_intel_display(drm);
        struct intel_initial_plane_config plane_configs[I915_MAX_PIPES] = {};
        struct intel_crtc *crtc;
 
@@ -314,8 +318,13 @@ void intel_initial_plane_config(struct intel_display 
*display)
                intel_find_initial_plane_obj(crtc, plane_configs);
 
                if (display->funcs.display->fixup_initial_plane_config(crtc, 
plane_config))
-                       intel_initial_plane_vblank_wait(crtc);
+                       xe_initial_plane_vblank_wait(&crtc->base);
 
                plane_config_fini(plane_config);
        }
 }
+
+const struct intel_display_initial_plane_interface 
xe_display_initial_plane_interface = {
+       .vblank_wait = xe_initial_plane_vblank_wait,
+       .config = xe_initial_plane_config,
+};
diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.h 
b/drivers/gpu/drm/xe/display/xe_initial_plane.h
new file mode 100644
index 000000000000..399d15f14441
--- /dev/null
+++ b/drivers/gpu/drm/xe/display/xe_initial_plane.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2025 Intel Corporation */
+
+#ifndef __XE_INITIAL_PLANE_H__
+#define __XE_INITIAL_PLANE_H__
+
+extern const struct intel_display_initial_plane_interface 
xe_display_initial_plane_interface;
+
+#endif
diff --git a/include/drm/intel/display_parent_interface.h 
b/include/drm/intel/display_parent_interface.h
index 55d4df714645..76341b4b03f7 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -7,6 +7,7 @@
 #include <linux/types.h>
 
 struct dma_fence;
+struct drm_crtc;
 struct drm_device;
 struct drm_scanout_buffer;
 struct intel_hdcp_gsc_context;
@@ -25,6 +26,11 @@ struct intel_display_hdcp_interface {
        void (*gsc_context_free)(struct intel_hdcp_gsc_context *gsc_context);
 };
 
+struct intel_display_initial_plane_interface {
+       void (*vblank_wait)(struct drm_crtc *crtc);
+       void (*config)(struct drm_device *drm);
+};
+
 struct intel_display_irq_interface {
        bool (*enabled)(struct drm_device *drm);
        void (*synchronize)(struct drm_device *drm);
@@ -90,6 +96,9 @@ struct intel_display_parent_interface {
        /** @hdcp: HDCP GSC interface */
        const struct intel_display_hdcp_interface *hdcp;
 
+       /** @initial_plane: Initial plane interface */
+       const struct intel_display_initial_plane_interface *initial_plane;
+
        /** @irq: IRQ interface */
        const struct intel_display_irq_interface *irq;
 
-- 
2.47.3

Reply via email to