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));
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__ */
#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"
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);
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)
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);
}
/**
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,
struct i915_vma;
struct intel_display;
struct intel_dpt;
+struct intel_frontbuffer;
struct intel_hdcp_gsc_context;
struct intel_panic;
struct intel_stolen_node;
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,
// 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"
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,
+};
return front;
}
+extern const struct intel_display_frontbuffer_interface i915_display_frontbuffer_interface;
+
#endif
#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"
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,
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 \
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 */
#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"
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,
--- /dev/null
+// 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,
+};
--- /dev/null
+/* 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
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;
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,
/** @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;