]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/{i915, xe}/frontbuffer: move frontbuffer handling to parent interface
authorJani Nikula <jani.nikula@intel.com>
Mon, 2 Mar 2026 18:17:37 +0000 (20:17 +0200)
committerJani Nikula <jani.nikula@intel.com>
Wed, 11 Mar 2026 09:32:10 +0000 (11:32 +0200)
Move the get/put/ref/flush_for_display calls to the display parent
interface.

For i915, move the hooks next to the other i915 core frontbuffer code in
i915_gem_object_frontbuffer.c. For xe, add new file xe_frontbuffer.c for
the same.

Note: The intel_frontbuffer_flush() calls from
i915_gem_object_frontbuffer.c will partially route back to i915 core via
the parent interface. This is less than stellar.

Reviewed-by: Jouni Högander <jouni.hogander@intel.com>
Link: https://patch.msgid.link/f69b967ed82bbcfd60ffa77ba197b26a1399f09f.1772475391.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
14 files changed:
drivers/gpu/drm/i915/display/intel_bo.c
drivers/gpu/drm/i915/display/intel_bo.h
drivers/gpu/drm/i915/display/intel_frontbuffer.c
drivers/gpu/drm/i915/display/intel_parent.c
drivers/gpu/drm/i915/display/intel_parent.h
drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/xe/Makefile
drivers/gpu/drm/xe/display/intel_bo.c
drivers/gpu/drm/xe/display/xe_display.c
drivers/gpu/drm/xe/display/xe_frontbuffer.c [new file with mode: 0644]
drivers/gpu/drm/xe/display/xe_frontbuffer.h [new file with mode: 0644]
include/drm/intel/display_parent_interface.h

index 8f372b33d48bf0043708ea9ae23a407247d9fded..2b6eaec351d8040e2a5f73ad77a9b4c3004ca0a5 100644 (file)
@@ -45,42 +45,6 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
        return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size);
 }
 
-struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj)
-{
-       struct drm_i915_gem_object *obj = to_intel_bo(_obj);
-       struct i915_frontbuffer *front;
-
-       front = i915_gem_object_frontbuffer_get(obj);
-       if (!front)
-               return NULL;
-
-       return &front->base;
-}
-
-void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
-{
-       struct i915_frontbuffer *front =
-               container_of(_front, typeof(*front), base);
-
-       i915_gem_object_frontbuffer_ref(front);
-}
-
-void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
-{
-       struct i915_frontbuffer *front =
-               container_of(_front, typeof(*front), base);
-
-       return i915_gem_object_frontbuffer_put(front);
-}
-
-void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
-{
-       struct i915_frontbuffer *front =
-               container_of(_front, typeof(*front), base);
-
-       i915_gem_object_flush_if_display(front->obj);
-}
-
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
 {
        i915_debugfs_describe_obj(m, to_intel_bo(obj));
index 516a3836a6bc09a7891aca161b6c10c8eb3d75c2..40390ed92cebe2e16456df911d2a52d0f9ace77b 100644 (file)
@@ -20,11 +20,6 @@ int intel_bo_key_check(struct drm_gem_object *obj);
 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
 
-struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj);
-void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front);
-void intel_bo_frontbuffer_put(struct intel_frontbuffer *front);
-void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
-
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
 
 #endif /* __INTEL_BO__ */
index 03c4978fa5ecf175bfc70de9adc210de61ecbfd4..a355dc0645286dd614bc5c9b0626a8139151fad4 100644 (file)
 #include <drm/drm_gem.h>
 #include <drm/drm_print.h>
 
-#include "intel_bo.h"
 #include "intel_display_trace.h"
 #include "intel_display_types.h"
 #include "intel_dp.h"
 #include "intel_drrs.h"
 #include "intel_fbc.h"
 #include "intel_frontbuffer.h"
+#include "intel_parent.h"
 #include "intel_psr.h"
 #include "intel_tdf.h"
 
@@ -150,7 +150,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
        struct intel_display *display = front->display;
 
        if (origin == ORIGIN_DIRTYFB)
-               intel_bo_frontbuffer_flush_for_display(front);
+               intel_parent_frontbuffer_flush_for_display(display, front);
 
        if (origin == ORIGIN_CS) {
                spin_lock(&display->fb_tracking.lock);
@@ -166,7 +166,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
 
 static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
 {
-       intel_bo_frontbuffer_ref(front);
+       intel_parent_frontbuffer_ref(front->display, front);
 }
 
 static void intel_frontbuffer_flush_work(struct work_struct *work)
@@ -209,12 +209,14 @@ void intel_frontbuffer_fini(struct intel_frontbuffer *front)
 
 struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj)
 {
-       return intel_bo_frontbuffer_get(obj);
+       struct intel_display *display = to_intel_display(obj->dev);
+
+       return intel_parent_frontbuffer_get(display, obj);
 }
 
 void intel_frontbuffer_put(struct intel_frontbuffer *front)
 {
-       intel_bo_frontbuffer_put(front);
+       intel_parent_frontbuffer_put(front->display, front);
 }
 
 /**
index 0c5962cb2f6dab38c2d49d0de89100f214c1bd33..2e3bad2b3e6b70c2a09c9cd8218ae4eb0df37f5e 100644 (file)
@@ -51,6 +51,27 @@ void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dp
                display->parent->dpt->resume(dpt);
 }
 
+/* frontbuffer */
+struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj)
+{
+       return display->parent->frontbuffer->get(obj);
+}
+
+void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front)
+{
+       display->parent->frontbuffer->ref(front);
+}
+
+void intel_parent_frontbuffer_put(struct intel_display *display, struct intel_frontbuffer *front)
+{
+       display->parent->frontbuffer->put(front);
+}
+
+void intel_parent_frontbuffer_flush_for_display(struct intel_display *display, struct intel_frontbuffer *front)
+{
+       display->parent->frontbuffer->flush_for_display(front);
+}
+
 /* hdcp */
 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
                                       struct intel_hdcp_gsc_context *gsc_context,
index 6e7d09133aee2826fb60d7193759d5f76244be72..2013e5ed5aa9b680dc42c24ced02b1c8ed8751f2 100644 (file)
@@ -13,6 +13,7 @@ struct drm_scanout_buffer;
 struct i915_vma;
 struct intel_display;
 struct intel_dpt;
+struct intel_frontbuffer;
 struct intel_hdcp_gsc_context;
 struct intel_panic;
 struct intel_stolen_node;
@@ -24,6 +25,12 @@ void intel_parent_dpt_destroy(struct intel_display *display, struct intel_dpt *d
 void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *dpt);
 void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt);
 
+/* frontbuffer */
+struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj);
+void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front);
+void intel_parent_frontbuffer_put(struct intel_display *display, struct intel_frontbuffer *front);
+void intel_parent_frontbuffer_flush_for_display(struct intel_display *display, struct intel_frontbuffer *front);
+
 /* hdcp */
 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
                                       struct intel_hdcp_gsc_context *gsc_context,
index cf0b66eaf11b888c135e76c87de12cba636fea43..f885c4fb1326e42b600e431e9a5e62aa9d55a99f 100644 (file)
@@ -1,6 +1,8 @@
 // SPDX-License-Identifier: MIT
 /* Copyright © 2025 Intel Corporation */
 
+#include <drm/intel/display_parent_interface.h>
+
 #include "i915_drv.h"
 #include "i915_gem_object_frontbuffer.h"
 
@@ -125,3 +127,46 @@ void __i915_gem_object_frontbuffer_invalidate(struct drm_i915_gem_object *obj,
                i915_gem_object_frontbuffer_put(front);
        }
 }
+
+static struct intel_frontbuffer *i915_frontbuffer_get(struct drm_gem_object *_obj)
+{
+       struct drm_i915_gem_object *obj = to_intel_bo(_obj);
+       struct i915_frontbuffer *front;
+
+       front = i915_gem_object_frontbuffer_get(obj);
+       if (!front)
+               return NULL;
+
+       return &front->base;
+}
+
+static void i915_frontbuffer_ref(struct intel_frontbuffer *_front)
+{
+       struct i915_frontbuffer *front =
+               container_of(_front, typeof(*front), base);
+
+       i915_gem_object_frontbuffer_ref(front);
+}
+
+static void i915_frontbuffer_put(struct intel_frontbuffer *_front)
+{
+       struct i915_frontbuffer *front =
+               container_of(_front, typeof(*front), base);
+
+       return i915_gem_object_frontbuffer_put(front);
+}
+
+static void i915_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
+{
+       struct i915_frontbuffer *front =
+               container_of(_front, typeof(*front), base);
+
+       i915_gem_object_flush_if_display(front->obj);
+}
+
+const struct intel_display_frontbuffer_interface i915_display_frontbuffer_interface = {
+       .get = i915_frontbuffer_get,
+       .ref = i915_frontbuffer_ref,
+       .put = i915_frontbuffer_put,
+       .flush_for_display = i915_frontbuffer_flush_for_display,
+};
index 46124048a59fb1b2fc5e590a47db2e238011522c..9c6d91f21c1906f9660d1d3e999ccaabed0138cc 100644 (file)
@@ -91,4 +91,6 @@ i915_gem_object_frontbuffer_lookup(const struct drm_i915_gem_object *obj)
        return front;
 }
 
+extern const struct intel_display_frontbuffer_interface i915_display_frontbuffer_interface;
+
 #endif
index 79ded07b5db530fe785174747969abd650038854..7a8c59a8c86556964bc564dbaee57741b1195f01 100644 (file)
@@ -78,6 +78,7 @@
 #include "gem/i915_gem_dmabuf.h"
 #include "gem/i915_gem_ioctls.h"
 #include "gem/i915_gem_mman.h"
+#include "gem/i915_gem_object_frontbuffer.h"
 #include "gem/i915_gem_pm.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_pm.h"
@@ -766,6 +767,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,
+       .frontbuffer = &i915_display_frontbuffer_interface,
        .hdcp = &i915_display_hdcp_interface,
        .initial_plane = &i915_display_initial_plane_interface,
        .irq = &i915_display_irq_interface,
index c4fb9f13371a740c8dc57fdd7d60ae69675770d3..7c5bb6e8fb8de05b1bb147ef50a95dd1a356a4ad 100644 (file)
@@ -218,6 +218,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
        display/xe_display_wa.o \
        display/xe_dsb_buffer.o \
        display/xe_fb_pin.o \
+       display/xe_frontbuffer.o \
        display/xe_hdcp_gsc.o \
        display/xe_initial_plane.o \
        display/xe_panic.o \
index 05d5e5c0a0de08c498ced5ad3264034146cf2773..fa1f2c796b812d01232821da779b53ba5c8aec67 100644 (file)
@@ -47,62 +47,6 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
        return xe_bo_read(bo, offset, dst, size);
 }
 
-struct xe_frontbuffer {
-       struct intel_frontbuffer base;
-       struct drm_gem_object *obj;
-       struct kref ref;
-};
-
-struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj)
-{
-       struct xe_frontbuffer *front;
-
-       front = kmalloc_obj(*front);
-       if (!front)
-               return NULL;
-
-       intel_frontbuffer_init(&front->base, obj->dev);
-
-       kref_init(&front->ref);
-
-       drm_gem_object_get(obj);
-       front->obj = obj;
-
-       return &front->base;
-}
-
-void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
-{
-       struct xe_frontbuffer *front =
-               container_of(_front, typeof(*front), base);
-
-       kref_get(&front->ref);
-}
-
-static void frontbuffer_release(struct kref *ref)
-{
-       struct xe_frontbuffer *front =
-               container_of(ref, typeof(*front), ref);
-
-       intel_frontbuffer_fini(&front->base);
-
-       drm_gem_object_put(front->obj);
-
-       kfree(front);
-}
-
-void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
-{
-       struct xe_frontbuffer *front =
-               container_of(_front, typeof(*front), base);
-
-       kref_put(&front->ref, frontbuffer_release);
-}
-
-void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
-{
-}
-
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
 {
        /* FIXME */
index c8dd3faa9b97f4ef92202432cff0c58cf01a3bc0..f1e1889a52d3396b009d5b5e7cc74af21965147b 100644 (file)
@@ -38,6 +38,7 @@
 #include "xe_display_pcode.h"
 #include "xe_display_rpm.h"
 #include "xe_dsb_buffer.h"
+#include "xe_frontbuffer.h"
 #include "xe_hdcp_gsc.h"
 #include "xe_initial_plane.h"
 #include "xe_module.h"
@@ -541,6 +542,7 @@ static const struct intel_display_irq_interface xe_display_irq_interface = {
 
 static const struct intel_display_parent_interface parent = {
        .dsb = &xe_display_dsb_interface,
+       .frontbuffer = &xe_display_frontbuffer_interface,
        .hdcp = &xe_display_hdcp_interface,
        .initial_plane = &xe_display_initial_plane_interface,
        .irq = &xe_display_irq_interface,
diff --git a/drivers/gpu/drm/xe/display/xe_frontbuffer.c b/drivers/gpu/drm/xe/display/xe_frontbuffer.c
new file mode 100644 (file)
index 0000000..113fc01
--- /dev/null
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: MIT
+/* Copyright © 2026 Intel Corporation */
+
+#include <drm/drm_gem.h>
+#include <drm/intel/display_parent_interface.h>
+
+#include "intel_frontbuffer.h"
+#include "xe_frontbuffer.h"
+
+struct xe_frontbuffer {
+       struct intel_frontbuffer base;
+       struct drm_gem_object *obj;
+       struct kref ref;
+};
+
+static struct intel_frontbuffer *xe_frontbuffer_get(struct drm_gem_object *obj)
+{
+       struct xe_frontbuffer *front;
+
+       front = kmalloc_obj(*front);
+       if (!front)
+               return NULL;
+
+       intel_frontbuffer_init(&front->base, obj->dev);
+
+       kref_init(&front->ref);
+
+       drm_gem_object_get(obj);
+       front->obj = obj;
+
+       return &front->base;
+}
+
+static void xe_frontbuffer_ref(struct intel_frontbuffer *_front)
+{
+       struct xe_frontbuffer *front =
+               container_of(_front, typeof(*front), base);
+
+       kref_get(&front->ref);
+}
+
+static void frontbuffer_release(struct kref *ref)
+{
+       struct xe_frontbuffer *front =
+               container_of(ref, typeof(*front), ref);
+
+       intel_frontbuffer_fini(&front->base);
+
+       drm_gem_object_put(front->obj);
+
+       kfree(front);
+}
+
+static void xe_frontbuffer_put(struct intel_frontbuffer *_front)
+{
+       struct xe_frontbuffer *front =
+               container_of(_front, typeof(*front), base);
+
+       kref_put(&front->ref, frontbuffer_release);
+}
+
+static void xe_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
+{
+}
+
+const struct intel_display_frontbuffer_interface xe_display_frontbuffer_interface = {
+       .get = xe_frontbuffer_get,
+       .ref = xe_frontbuffer_ref,
+       .put = xe_frontbuffer_put,
+       .flush_for_display = xe_frontbuffer_flush_for_display,
+};
diff --git a/drivers/gpu/drm/xe/display/xe_frontbuffer.h b/drivers/gpu/drm/xe/display/xe_frontbuffer.h
new file mode 100644 (file)
index 0000000..6b4f59b
--- /dev/null
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2026 Intel Corporation */
+
+#ifndef _XE_FRONTBUFFER_H_
+#define _XE_FRONTBUFFER_H_
+
+extern const struct intel_display_frontbuffer_interface xe_display_frontbuffer_interface;
+
+#endif
index 6a88c864068322afaed95e38bee39d14715e6dfe..c044472b9400bf1cb18b1aa61301d75aa433015b 100644 (file)
@@ -17,6 +17,7 @@ struct drm_scanout_buffer;
 struct i915_vma;
 struct intel_dpt;
 struct intel_dsb_buffer;
+struct intel_frontbuffer;
 struct intel_hdcp_gsc_context;
 struct intel_initial_plane_config;
 struct intel_panic;
@@ -42,6 +43,13 @@ struct intel_display_dsb_interface {
        void (*flush_map)(struct intel_dsb_buffer *dsb_buf);
 };
 
+struct intel_display_frontbuffer_interface {
+       struct intel_frontbuffer *(*get)(struct drm_gem_object *obj);
+       void (*ref)(struct intel_frontbuffer *front);
+       void (*put)(struct intel_frontbuffer *front);
+       void (*flush_for_display)(struct intel_frontbuffer *front);
+};
+
 struct intel_display_hdcp_interface {
        ssize_t (*gsc_msg_send)(struct intel_hdcp_gsc_context *gsc_context,
                                void *msg_in, size_t msg_in_len,
@@ -172,6 +180,9 @@ struct intel_display_parent_interface {
        /** @dsb: DSB buffer interface */
        const struct intel_display_dsb_interface *dsb;
 
+       /** @frontbuffer: Frontbuffer interface */
+       const struct intel_display_frontbuffer_interface *frontbuffer;
+
        /** @hdcp: HDCP GSC interface */
        const struct intel_display_hdcp_interface *hdcp;