#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__ */
#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"
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));
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);
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:
#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,
#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,
*/
#include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
#include "display/intel_display_core.h"
#include "display/intel_display_rpm.h"
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;
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);
{
return i915_vma_offset(dpt_vma);
}
+
+const struct intel_display_dpt_interface i915_display_dpt_interface = {
+ .create = i915_dpt_create,
+ .destroy = i915_dpt_destroy,
+};
--- /dev/null
+/* 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__ */
#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"
}
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,
#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"
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;
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;
/* 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);
* 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;