Move the DPT create/destroy calls to the display parent interface.

With this, we can remove the dummy xe implementation.

Signed-off-by: Jani Nikula <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dpt.h     |  3 ---
 drivers/gpu/drm/i915/display/intel_fb.c      |  8 ++++----
 drivers/gpu/drm/i915/display/intel_parent.c  | 17 +++++++++++++++++
 drivers/gpu/drm/i915/display/intel_parent.h  |  8 ++++++++
 drivers/gpu/drm/i915/i915_dpt.c              | 11 ++++++++---
 drivers/gpu/drm/i915/i915_dpt.h              |  9 +++++++++
 drivers/gpu/drm/i915/i915_driver.c           |  2 ++
 drivers/gpu/drm/xe/display/xe_fb_pin.c       | 20 --------------------
 include/drm/intel/display_parent_interface.h |  9 +++++++++
 9 files changed, 57 insertions(+), 30 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/i915_dpt.h

diff --git a/drivers/gpu/drm/i915/display/intel_dpt.h 
b/drivers/gpu/drm/i915/display/intel_dpt.h
index 79d9bb80941a..e05b3a716310 100644
--- a/drivers/gpu/drm/i915/display/intel_dpt.h
+++ b/drivers/gpu/drm/i915/display/intel_dpt.h
@@ -8,18 +8,15 @@
 
 #include <linux/types.h>
 
-struct drm_gem_object;
 struct i915_address_space;
 struct i915_vma;
 struct intel_display;
 
-void intel_dpt_destroy(struct i915_address_space *vm);
 struct i915_vma *intel_dpt_pin_to_ggtt(struct i915_address_space *vm,
                                       unsigned int alignment);
 void intel_dpt_unpin_from_ggtt(struct i915_address_space *vm);
 void intel_dpt_suspend(struct intel_display *display);
 void intel_dpt_resume(struct intel_display *display);
-struct i915_address_space *intel_dpt_create(struct drm_gem_object *obj, size_t 
size);
 u64 intel_dpt_offset(struct i915_vma *dpt_vma);
 
 #endif /* __INTEL_DPT_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_fb.c 
b/drivers/gpu/drm/i915/display/intel_fb.c
index 5ea3ad27153c..b9f6de894d70 100644
--- a/drivers/gpu/drm/i915/display/intel_fb.c
+++ b/drivers/gpu/drm/i915/display/intel_fb.c
@@ -16,7 +16,6 @@
 #include "intel_display_core.h"
 #include "intel_display_types.h"
 #include "intel_display_utils.h"
-#include "intel_dpt.h"
 #include "intel_fb.h"
 #include "intel_fb_bo.h"
 #include "intel_frontbuffer.h"
@@ -2104,12 +2103,13 @@ int intel_plane_compute_gtt(struct intel_plane_state 
*plane_state)
 
 static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
 {
+       struct intel_display *display = to_intel_display(fb->dev);
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
 
        drm_framebuffer_cleanup(fb);
 
        if (intel_fb_uses_dpt(fb))
-               intel_dpt_destroy(intel_fb->dpt_vm);
+               intel_parent_dpt_destroy(display, intel_fb->dpt_vm);
 
        intel_fb_bo_framebuffer_fini(intel_fb_bo(fb));
 
@@ -2311,7 +2311,7 @@ int intel_framebuffer_init(struct intel_framebuffer 
*intel_fb,
                if (intel_fb_needs_pot_stride_remap(intel_fb))
                        size = 
intel_remapped_info_size(&intel_fb->remapped_view.gtt.remapped);
 
-               vm = intel_dpt_create(obj, size);
+               vm = intel_parent_dpt_create(display, obj, size);
                if (IS_ERR(vm)) {
                        drm_dbg_kms(display->drm, "failed to create DPT\n");
                        ret = PTR_ERR(vm);
@@ -2331,7 +2331,7 @@ int intel_framebuffer_init(struct intel_framebuffer 
*intel_fb,
 
 err_free_dpt:
        if (intel_fb_uses_dpt(fb))
-               intel_dpt_destroy(intel_fb->dpt_vm);
+               intel_parent_dpt_destroy(display, intel_fb->dpt_vm);
 err_bo_framebuffer_fini:
        intel_fb_bo_framebuffer_fini(obj);
 err_frontbuffer_put:
diff --git a/drivers/gpu/drm/i915/display/intel_parent.c 
b/drivers/gpu/drm/i915/display/intel_parent.c
index 7f73695a0444..c43e3518a139 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -23,6 +23,23 @@
 #include "intel_display_core.h"
 #include "intel_parent.h"
 
+/* dpt */
+struct i915_address_space *intel_parent_dpt_create(struct intel_display 
*display,
+                                                  struct drm_gem_object *obj,
+                                                  size_t size)
+{
+       if (display->parent->dpt)
+               return display->parent->dpt->create(obj, size);
+
+       return NULL;
+}
+
+void intel_parent_dpt_destroy(struct intel_display *display, struct 
i915_address_space *vm)
+{
+       if (display->parent->dpt)
+               display->parent->dpt->destroy(vm);
+}
+
 /* hdcp */
 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
                                       struct intel_hdcp_gsc_context 
*gsc_context,
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h 
b/drivers/gpu/drm/i915/display/intel_parent.h
index 04782bb26b61..88860e471a0d 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -7,12 +7,20 @@
 #include <linux/types.h>
 
 struct dma_fence;
+struct drm_gem_object;
 struct drm_scanout_buffer;
+struct i915_address_space;
 struct intel_display;
 struct intel_hdcp_gsc_context;
 struct intel_panic;
 struct intel_stolen_node;
 
+/* dpt */
+struct i915_address_space *intel_parent_dpt_create(struct intel_display 
*display,
+                                                  struct drm_gem_object *obj,
+                                                  size_t size);
+void intel_parent_dpt_destroy(struct intel_display *display, struct 
i915_address_space *vm);
+
 /* hdcp */
 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
                                       struct intel_hdcp_gsc_context 
*gsc_context,
diff --git a/drivers/gpu/drm/i915/i915_dpt.c b/drivers/gpu/drm/i915/i915_dpt.c
index c01e5576f09e..143929a84b62 100644
--- a/drivers/gpu/drm/i915/i915_dpt.c
+++ b/drivers/gpu/drm/i915/i915_dpt.c
@@ -4,6 +4,7 @@
  */
 
 #include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
 
 #include "display/intel_display_core.h"
 #include "display/intel_display_rpm.h"
@@ -242,8 +243,7 @@ void intel_dpt_suspend(struct intel_display *display)
        mutex_unlock(&display->drm->mode_config.fb_lock);
 }
 
-struct i915_address_space *
-intel_dpt_create(struct drm_gem_object *obj, size_t size)
+static struct i915_address_space *i915_dpt_create(struct drm_gem_object *obj, 
size_t size)
 {
        struct drm_i915_private *i915 = to_i915(obj->dev);
        struct drm_i915_gem_object *dpt_obj;
@@ -308,7 +308,7 @@ intel_dpt_create(struct drm_gem_object *obj, size_t size)
        return &dpt->vm;
 }
 
-void intel_dpt_destroy(struct i915_address_space *vm)
+static void i915_dpt_destroy(struct i915_address_space *vm)
 {
        struct i915_dpt *dpt = i915_vm_to_dpt(vm);
 
@@ -320,3 +320,8 @@ u64 intel_dpt_offset(struct i915_vma *dpt_vma)
 {
        return i915_vma_offset(dpt_vma);
 }
+
+const struct intel_display_dpt_interface i915_display_dpt_interface = {
+       .create = i915_dpt_create,
+       .destroy = i915_dpt_destroy,
+};
diff --git a/drivers/gpu/drm/i915/i915_dpt.h b/drivers/gpu/drm/i915/i915_dpt.h
new file mode 100644
index 000000000000..494cd4af3bcd
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_dpt.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright 2026 Intel Corporation */
+
+#ifndef __I915_DPT_H__
+#define __I915_DPT_H__
+
+extern const struct intel_display_dpt_interface i915_display_dpt_interface;
+
+#endif /* __I915_DPT_H__ */
diff --git a/drivers/gpu/drm/i915/i915_driver.c 
b/drivers/gpu/drm/i915/i915_driver.c
index c01a35ecfa2f..d4f71d02b90e 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -90,6 +90,7 @@
 
 #include "i915_debugfs.h"
 #include "i915_display_pc8.h"
+#include "i915_dpt.h"
 #include "i915_driver.h"
 #include "i915_drm_client.h"
 #include "i915_drv.h"
@@ -760,6 +761,7 @@ static bool vgpu_active(struct drm_device *drm)
 }
 
 static const struct intel_display_parent_interface parent = {
+       .dpt = &i915_display_dpt_interface,
        .dsb = &i915_display_dsb_interface,
        .hdcp = &i915_display_hdcp_interface,
        .initial_plane = &i915_display_initial_plane_interface,
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c 
b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 36eb6c0b9d76..4cb37717d3b4 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -8,7 +8,6 @@
 #include "i915_vma.h"
 #include "intel_display_core.h"
 #include "intel_display_types.h"
-#include "intel_dpt.h"
 #include "intel_fb.h"
 #include "intel_fb_pin.h"
 #include "intel_fbdev.h"
@@ -452,25 +451,6 @@ void intel_plane_unpin_fb(struct intel_plane_state 
*old_plane_state)
        old_plane_state->ggtt_vma = NULL;
 }
 
-/*
- * For Xe introduce dummy intel_dpt_create which just return NULL,
- * intel_dpt_destroy which does nothing, and fake intel_dpt_ofsset returning 0;
- */
-struct i915_address_space *intel_dpt_create(struct drm_gem_object *obj, size_t 
size)
-{
-       return NULL;
-}
-
-void intel_dpt_destroy(struct i915_address_space *vm)
-{
-       return;
-}
-
-u64 intel_dpt_offset(struct i915_vma *dpt_vma)
-{
-       return 0;
-}
-
 void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
 {
        *map = vma->bo->vmap;
diff --git a/include/drm/intel/display_parent_interface.h 
b/include/drm/intel/display_parent_interface.h
index 41f4afe7928c..48abbe187d61 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -13,6 +13,7 @@ struct drm_framebuffer;
 struct drm_gem_object;
 struct drm_plane_state;
 struct drm_scanout_buffer;
+struct i915_address_space;
 struct i915_vma;
 struct intel_dsb_buffer;
 struct intel_hdcp_gsc_context;
@@ -23,6 +24,11 @@ struct ref_tracker;
 
 /* Keep struct definitions sorted */
 
+struct intel_display_dpt_interface {
+       struct i915_address_space *(*create)(struct drm_gem_object *obj, size_t 
size);
+       void (*destroy)(struct i915_address_space *vm);
+};
+
 struct intel_display_dsb_interface {
        u32 (*ggtt_offset)(struct intel_dsb_buffer *dsb_buf);
        void (*write)(struct intel_dsb_buffer *dsb_buf, u32 idx, u32 val);
@@ -124,6 +130,9 @@ struct intel_display_stolen_interface {
  * check the optional pointers.
  */
 struct intel_display_parent_interface {
+       /** @dsb: DPT interface. Optional. */
+       const struct intel_display_dpt_interface *dpt;
+
        /** @dsb: DSB buffer interface */
        const struct intel_display_dsb_interface *dsb;
 
-- 
2.47.3

Reply via email to