Call the stolen memory interface through the display parent interface. This makes xe compat gem/i915_gem_stolen.h redundant, and it can be removed.
v2: Rebase, convert one more call that appeared Signed-off-by: Jani Nikula <[email protected]> --- drivers/gpu/drm/i915/display/intel_fbc.c | 71 ++++++++++--------- drivers/gpu/drm/i915/display/intel_parent.c | 66 +++++++++++++++++ drivers/gpu/drm/i915/display/intel_parent.h | 19 +++++ drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 52 +++++++++----- drivers/gpu/drm/i915/gem/i915_gem_stolen.h | 23 +----- drivers/gpu/drm/i915/i915_driver.c | 1 + .../compat-i915-headers/gem/i915_gem_stolen.h | 40 ----------- drivers/gpu/drm/xe/display/xe_display.c | 4 +- drivers/gpu/drm/xe/display/xe_stolen.c | 47 ++++++++---- drivers/gpu/drm/xe/display/xe_stolen.h | 9 +++ include/drm/intel/display_parent_interface.h | 20 ++++++ 11 files changed, 222 insertions(+), 130 deletions(-) delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h create mode 100644 drivers/gpu/drm/xe/display/xe_stolen.h diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index 0e946bed484f..fef2f35ff1e9 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -45,8 +45,6 @@ #include <drm/drm_fourcc.h> #include <drm/drm_print.h> -#include "gem/i915_gem_stolen.h" - #include "i915_vma.h" #include "i9xx_plane_regs.h" #include "intel_de.h" @@ -393,17 +391,17 @@ static void i8xx_fbc_program_cfb(struct intel_fbc *fbc) struct intel_display *display = fbc->display; drm_WARN_ON(display->drm, - range_end_overflows_t(u64, i915_gem_stolen_area_address(display->drm), - i915_gem_stolen_node_offset(fbc->compressed_fb), + range_end_overflows_t(u64, intel_parent_stolen_area_address(display), + intel_parent_stolen_node_offset(display, fbc->compressed_fb), U32_MAX)); drm_WARN_ON(display->drm, - range_end_overflows_t(u64, i915_gem_stolen_area_address(display->drm), - i915_gem_stolen_node_offset(fbc->compressed_llb), + range_end_overflows_t(u64, intel_parent_stolen_area_address(display), + intel_parent_stolen_node_offset(display, fbc->compressed_llb), U32_MAX)); intel_de_write(display, FBC_CFB_BASE, - i915_gem_stolen_node_address(fbc->compressed_fb)); + intel_parent_stolen_node_address(display, fbc->compressed_fb)); intel_de_write(display, FBC_LL_BASE, - i915_gem_stolen_node_address(fbc->compressed_llb)); + intel_parent_stolen_node_address(display, fbc->compressed_llb)); } static const struct intel_fbc_funcs i8xx_fbc_funcs = { @@ -511,7 +509,7 @@ static void g4x_fbc_program_cfb(struct intel_fbc *fbc) struct intel_display *display = fbc->display; intel_de_write(display, DPFC_CB_BASE, - i915_gem_stolen_node_offset(fbc->compressed_fb)); + intel_parent_stolen_node_offset(display, fbc->compressed_fb)); } static const struct intel_fbc_funcs g4x_fbc_funcs = { @@ -580,7 +578,7 @@ static void ilk_fbc_program_cfb(struct intel_fbc *fbc) struct intel_display *display = fbc->display; intel_de_write(display, ILK_DPFC_CB_BASE(fbc->id), - i915_gem_stolen_node_offset(fbc->compressed_fb)); + intel_parent_stolen_node_offset(display, fbc->compressed_fb)); } static const struct intel_fbc_funcs ilk_fbc_funcs = { @@ -819,7 +817,7 @@ static u64 intel_fbc_stolen_end(struct intel_display *display) * underruns, even if that range is not reserved by the BIOS. */ if (display->platform.broadwell || (DISPLAY_VER(display) == 9 && !display->platform.broxton)) - end = i915_gem_stolen_area_size(display->drm) - 8 * 1024 * 1024; + end = intel_parent_stolen_area_size(display) - 8 * 1024 * 1024; else end = U64_MAX; @@ -854,14 +852,14 @@ static int find_compression_limit(struct intel_fbc *fbc, size /= limit; /* Try to over-allocate to reduce reallocations and fragmentation. */ - ret = i915_gem_stolen_insert_node_in_range(fbc->compressed_fb, - size <<= 1, 4096, 0, end); + ret = intel_parent_stolen_insert_node_in_range(display, fbc->compressed_fb, + size <<= 1, 4096, 0, end); if (ret == 0) return limit; for (; limit <= intel_fbc_max_limit(display); limit <<= 1) { - ret = i915_gem_stolen_insert_node_in_range(fbc->compressed_fb, - size >>= 1, 4096, 0, end); + ret = intel_parent_stolen_insert_node_in_range(display, fbc->compressed_fb, + size >>= 1, 4096, 0, end); if (ret == 0) return limit; } @@ -876,12 +874,12 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, int ret; drm_WARN_ON(display->drm, - i915_gem_stolen_node_allocated(fbc->compressed_fb)); + intel_parent_stolen_node_allocated(display, fbc->compressed_fb)); drm_WARN_ON(display->drm, - i915_gem_stolen_node_allocated(fbc->compressed_llb)); + intel_parent_stolen_node_allocated(display, fbc->compressed_llb)); if (DISPLAY_VER(display) < 5 && !display->platform.g4x) { - ret = i915_gem_stolen_insert_node(fbc->compressed_llb, 4096, 4096); + ret = intel_parent_stolen_insert_node(display, fbc->compressed_llb, 4096, 4096); if (ret) goto err; } @@ -897,14 +895,14 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, drm_dbg_kms(display->drm, "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", - i915_gem_stolen_node_size(fbc->compressed_fb), fbc->limit); + intel_parent_stolen_node_size(display, fbc->compressed_fb), fbc->limit); return 0; err_llb: - if (i915_gem_stolen_node_allocated(fbc->compressed_llb)) - i915_gem_stolen_remove_node(fbc->compressed_llb); + if (intel_parent_stolen_node_allocated(display, fbc->compressed_llb)) + intel_parent_stolen_remove_node(display, fbc->compressed_llb); err: - if (i915_gem_stolen_initialized(display->drm)) + if (intel_parent_stolen_initialized(display)) drm_info_once(display->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); return -ENOSPC; @@ -1010,7 +1008,7 @@ static void fbc_sys_cache_enable(const struct intel_fbc *fbc) range = fbc_sys_cache_limit(display) / (64 * 1024); - offset = i915_gem_stolen_node_offset(fbc->compressed_fb) / (4 * 1024); + offset = intel_parent_stolen_node_offset(display, fbc->compressed_fb) / (4 * 1024); cfg = FBC_SYS_CACHE_TAG_USE_RES_SPACE | FBC_SYS_CACHEABLE_RANGE(range) | FBC_SYS_CACHE_START_BASE(offset); @@ -1024,13 +1022,15 @@ static void fbc_sys_cache_enable(const struct intel_fbc *fbc) static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) { + struct intel_display *display = fbc->display; + if (WARN_ON(intel_fbc_hw_is_active(fbc))) return; - if (i915_gem_stolen_node_allocated(fbc->compressed_llb)) - i915_gem_stolen_remove_node(fbc->compressed_llb); - if (i915_gem_stolen_node_allocated(fbc->compressed_fb)) - i915_gem_stolen_remove_node(fbc->compressed_fb); + if (intel_parent_stolen_node_allocated(display, fbc->compressed_llb)) + intel_parent_stolen_remove_node(display, fbc->compressed_llb); + if (intel_parent_stolen_node_allocated(display, fbc->compressed_fb)) + intel_parent_stolen_remove_node(display, fbc->compressed_fb); } void intel_fbc_cleanup(struct intel_display *display) @@ -1043,8 +1043,8 @@ void intel_fbc_cleanup(struct intel_display *display) __intel_fbc_cleanup_cfb(fbc); mutex_unlock(&fbc->lock); - i915_gem_stolen_node_free(fbc->compressed_fb); - i915_gem_stolen_node_free(fbc->compressed_llb); + intel_parent_stolen_node_free(display, fbc->compressed_fb); + intel_parent_stolen_node_free(display, fbc->compressed_llb); kfree(fbc); } @@ -1480,12 +1480,13 @@ static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state) static bool intel_fbc_is_cfb_ok(const struct intel_plane_state *plane_state) { + struct intel_display *display = to_intel_display(plane_state); struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); struct intel_fbc *fbc = plane->fbc; return intel_fbc_min_limit(plane_state) <= fbc->limit && intel_fbc_cfb_size(plane_state) <= fbc->limit * - i915_gem_stolen_node_size(fbc->compressed_fb); + intel_parent_stolen_node_size(display, fbc->compressed_fb); } static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state) @@ -1577,7 +1578,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, if (!fbc) return 0; - if (!i915_gem_stolen_initialized(display->drm)) { + if (!intel_parent_stolen_initialized(display)) { plane_state->no_fbc_reason = "stolen memory not initialised"; return 0; } @@ -2282,10 +2283,10 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display, if (!fbc) return NULL; - fbc->compressed_fb = i915_gem_stolen_node_alloc(display->drm); + fbc->compressed_fb = intel_parent_stolen_node_alloc(display); if (!fbc->compressed_fb) goto err; - fbc->compressed_llb = i915_gem_stolen_node_alloc(display->drm); + fbc->compressed_llb = intel_parent_stolen_node_alloc(display); if (!fbc->compressed_llb) goto err; @@ -2310,8 +2311,8 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display, return fbc; err: - i915_gem_stolen_node_free(fbc->compressed_llb); - i915_gem_stolen_node_free(fbc->compressed_fb); + intel_parent_stolen_node_free(display, fbc->compressed_llb); + intel_parent_stolen_node_free(display, fbc->compressed_fb); kfree(fbc); return NULL; diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 2ea310cc3509..49cb64ca8c4c 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -79,6 +79,72 @@ void intel_parent_rps_ilk_irq_handler(struct intel_display *display) display->parent->rps->ilk_irq_handler(display->drm); } +int intel_parent_stolen_insert_node_in_range(struct intel_display *display, + struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end) +{ + return display->parent->stolen->insert_node_in_range(node, size, align, start, end); +} + +int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size, + unsigned int align) +{ + return display->parent->stolen->insert_node(node, size, align); +} + +void intel_parent_stolen_remove_node(struct intel_display *display, + struct intel_stolen_node *node) +{ + display->parent->stolen->remove_node(node); +} + +bool intel_parent_stolen_initialized(struct intel_display *display) +{ + return display->parent->stolen->initialized(display->drm); +} + +bool intel_parent_stolen_node_allocated(struct intel_display *display, + const struct intel_stolen_node *node) +{ + return display->parent->stolen->node_allocated(node); +} + +u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node) +{ + return display->parent->stolen->node_offset(node); +} + +u64 intel_parent_stolen_area_address(struct intel_display *display) +{ + return display->parent->stolen->area_address(display->drm); +} + +u64 intel_parent_stolen_area_size(struct intel_display *display) +{ + return display->parent->stolen->area_size(display->drm); +} + +u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node) +{ + return display->parent->stolen->node_address(node); +} + +u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node) +{ + return display->parent->stolen->node_size(node); +} + +struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display) +{ + return display->parent->stolen->node_alloc(display->drm); +} + +void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node) +{ + display->parent->stolen->node_free(node); +} + + bool intel_parent_vgpu_active(struct intel_display *display) { return display->parent->vgpu_active && display->parent->vgpu_active(display->drm); diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 8f91a6f75c53..bc740dfad985 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -9,6 +9,7 @@ struct dma_fence; struct intel_display; struct intel_hdcp_gsc_context; +struct intel_stolen_node; ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, struct intel_hdcp_gsc_context *gsc_context, @@ -27,6 +28,24 @@ void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive); void intel_parent_rps_ilk_irq_handler(struct intel_display *display); +int intel_parent_stolen_insert_node_in_range(struct intel_display *display, + struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end); +int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size, + unsigned int align); +void intel_parent_stolen_remove_node(struct intel_display *display, + struct intel_stolen_node *node); +bool intel_parent_stolen_initialized(struct intel_display *display); +bool intel_parent_stolen_node_allocated(struct intel_display *display, + const struct intel_stolen_node *node); +u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node); +u64 intel_parent_stolen_area_address(struct intel_display *display); +u64 intel_parent_stolen_area_size(struct intel_display *display); +u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node); +u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node); +struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display); +void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node); + bool intel_parent_vgpu_active(struct intel_display *display); bool intel_parent_has_fenced_regions(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c index f859c99f969b..c3e0b8da485c 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c @@ -8,6 +8,7 @@ #include <drm/drm_mm.h> #include <drm/drm_print.h> +#include <drm/intel/display_parent_interface.h> #include <drm/intel/i915_drm.h> #include "gem/i915_gem_lmem.h" @@ -64,8 +65,8 @@ static int __i915_gem_stolen_insert_node_in_range(struct drm_i915_private *i915, return ret; } -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned int alignment, u64 start, u64 end) +static int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, + unsigned int alignment, u64 start, u64 end) { return __i915_gem_stolen_insert_node_in_range(node->i915, &node->node, size, alignment, @@ -82,8 +83,8 @@ static int __i915_gem_stolen_insert_node(struct drm_i915_private *i915, U64_MAX); } -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, - unsigned int alignment) +static int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, + unsigned int alignment) { return __i915_gem_stolen_insert_node(node->i915, &node->node, size, alignment); } @@ -96,7 +97,7 @@ static void __i915_gem_stolen_remove_node(struct drm_i915_private *i915, mutex_unlock(&i915->mm.stolen_lock); } -void i915_gem_stolen_remove_node(struct intel_stolen_node *node) +static void i915_gem_stolen_remove_node(struct intel_stolen_node *node) { __i915_gem_stolen_remove_node(node->i915, &node->node); } @@ -1025,50 +1026,50 @@ bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj) return obj->ops == &i915_gem_object_stolen_ops; } -bool i915_gem_stolen_initialized(struct drm_device *drm) +static bool i915_gem_stolen_initialized(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); return drm_mm_initialized(&i915->mm.stolen); } -u64 i915_gem_stolen_area_address(struct drm_device *drm) +static u64 i915_gem_stolen_area_address(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); return i915->dsm.stolen.start; } -u64 i915_gem_stolen_area_size(struct drm_device *drm) +static u64 i915_gem_stolen_area_size(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); return resource_size(&i915->dsm.stolen); } -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node) +static u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) +{ + return node->node.start; +} + +static u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node) { struct drm_i915_private *i915 = node->i915; return i915->dsm.stolen.start + i915_gem_stolen_node_offset(node); } -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node) +static bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node) { return drm_mm_node_allocated(&node->node); } -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) -{ - return node->node.start; -} - -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node) +static u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node) { return node->node.size; } -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) +static struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); struct intel_stolen_node *node; @@ -1082,7 +1083,22 @@ struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) return node; } -void i915_gem_stolen_node_free(const struct intel_stolen_node *node) +static void i915_gem_stolen_node_free(const struct intel_stolen_node *node) { kfree(node); } + +const struct intel_display_stolen_interface i915_display_stolen_interface = { + .insert_node_in_range = i915_gem_stolen_insert_node_in_range, + .insert_node = i915_gem_stolen_insert_node, + .remove_node = i915_gem_stolen_remove_node, + .initialized = i915_gem_stolen_initialized, + .node_allocated = i915_gem_stolen_node_allocated, + .node_offset = i915_gem_stolen_node_offset, + .area_address = i915_gem_stolen_area_address, + .area_size = i915_gem_stolen_area_size, + .node_address = i915_gem_stolen_node_address, + .node_size = i915_gem_stolen_node_size, + .node_alloc = i915_gem_stolen_node_alloc, + .node_free = i915_gem_stolen_node_free, +}; diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h index 7b0386002ed4..6db5262046a2 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h @@ -8,17 +8,9 @@ #include <linux/types.h> -struct drm_device; struct drm_i915_gem_object; struct drm_i915_private; -struct intel_stolen_node; - -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, - unsigned alignment); -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned alignment, u64 start, - u64 end); -void i915_gem_stolen_remove_node(struct intel_stolen_node *node); + struct intel_memory_region * i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, u16 instance); @@ -34,17 +26,6 @@ bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj); #define I915_GEM_STOLEN_BIAS SZ_128K -bool i915_gem_stolen_initialized(struct drm_device *drm); -u64 i915_gem_stolen_area_address(struct drm_device *drm); -u64 i915_gem_stolen_area_size(struct drm_device *drm); - -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node); - -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node); -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node); -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node); - -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm); -void i915_gem_stolen_node_free(const struct intel_stolen_node *node); +extern const struct intel_display_stolen_interface i915_display_stolen_interface; #endif /* __I915_GEM_STOLEN_H__ */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index d98839427ef9..fe84df4eae8f 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -762,6 +762,7 @@ static const struct intel_display_parent_interface parent = { .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, .rps = &i915_display_rps_interface, + .stolen = &i915_display_stolen_interface, .vgpu_active = vgpu_active, .has_fenced_regions = has_fenced_regions, .fence_priority_display = fence_priority_display, diff --git a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h deleted file mode 100644 index 368045a470d1..000000000000 --- a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2024 Intel Corporation - */ - -#ifndef _I915_GEM_STOLEN_H_ -#define _I915_GEM_STOLEN_H_ - -#include <linux/types.h> - -struct drm_device; -struct intel_stolen_node; - -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned int align, u64 start, u64 end); - -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, - unsigned int align); - -void i915_gem_stolen_remove_node(struct intel_stolen_node *node); - -bool i915_gem_stolen_initialized(struct drm_device *drm); - -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node); - -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node); - -u64 i915_gem_stolen_area_address(struct drm_device *drm); - -u64 i915_gem_stolen_area_size(struct drm_device *drm); - -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node); - -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node); - -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm); - -void i915_gem_stolen_node_free(const struct intel_stolen_node *node); - -#endif diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index 9d2aa69ea428..9fb5c2f3ddd8 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -36,8 +36,9 @@ #include "intel_opregion.h" #include "skl_watermark.h" #include "xe_display_rpm.h" -#include "xe_module.h" #include "xe_hdcp_gsc.h" +#include "xe_module.h" +#include "xe_stolen.h" /* Ensure drm and display members are placed properly. */ INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display); @@ -538,6 +539,7 @@ static const struct intel_display_parent_interface parent = { .hdcp = &xe_display_hdcp_interface, .rpm = &xe_display_rpm_interface, .irq = &xe_display_irq_interface, + .stolen = &xe_display_stolen_interface, }; /** diff --git a/drivers/gpu/drm/xe/display/xe_stolen.c b/drivers/gpu/drm/xe/display/xe_stolen.c index 387506586288..cc7aec7db76c 100644 --- a/drivers/gpu/drm/xe/display/xe_stolen.c +++ b/drivers/gpu/drm/xe/display/xe_stolen.c @@ -1,8 +1,10 @@ // SPDX-License-Identifier: MIT /* Copyright © 2025 Intel Corporation */ -#include "gem/i915_gem_stolen.h" +#include <drm/intel/display_parent_interface.h> + #include "xe_res_cursor.h" +#include "xe_stolen.h" #include "xe_ttm_stolen_mgr.h" #include "xe_validation.h" @@ -11,8 +13,8 @@ struct intel_stolen_node { struct xe_bo *bo; }; -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned int align, u64 start, u64 end) +static int xe_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end) { struct xe_device *xe = node->xe; @@ -41,7 +43,7 @@ int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 siz return err; } -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align) +static int xe_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align) { /* Not used on xe */ WARN_ON(1); @@ -49,25 +51,25 @@ int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsign return -ENODEV; } -void i915_gem_stolen_remove_node(struct intel_stolen_node *node) +static void xe_stolen_remove_node(struct intel_stolen_node *node) { xe_bo_unpin_map_no_vm(node->bo); node->bo = NULL; } -bool i915_gem_stolen_initialized(struct drm_device *drm) +static bool xe_stolen_initialized(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); return ttm_manager_type(&xe->ttm, XE_PL_STOLEN); } -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node) +static bool xe_stolen_node_allocated(const struct intel_stolen_node *node) { return node->bo; } -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) +static u64 xe_stolen_node_offset(const struct intel_stolen_node *node) { struct xe_res_cursor res; @@ -76,7 +78,7 @@ u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) } /* Used for < gen4. These are not supported by Xe */ -u64 i915_gem_stolen_area_address(struct drm_device *drm) +static u64 xe_stolen_area_address(struct drm_device *drm) { WARN_ON(1); @@ -84,26 +86,26 @@ u64 i915_gem_stolen_area_address(struct drm_device *drm) } /* Used for gen9 specific WA. Gen9 is not supported by Xe */ -u64 i915_gem_stolen_area_size(struct drm_device *drm) +static u64 xe_stolen_area_size(struct drm_device *drm) { WARN_ON(1); return 0; } -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node) +static u64 xe_stolen_node_address(const struct intel_stolen_node *node) { struct xe_device *xe = node->xe; - return xe_ttm_stolen_gpu_offset(xe) + i915_gem_stolen_node_offset(node); + return xe_ttm_stolen_gpu_offset(xe) + xe_stolen_node_offset(node); } -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node) +static u64 xe_stolen_node_size(const struct intel_stolen_node *node) { return node->bo->ttm.base.size; } -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) +static struct intel_stolen_node *xe_stolen_node_alloc(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); struct intel_stolen_node *node; @@ -117,7 +119,22 @@ struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) return node; } -void i915_gem_stolen_node_free(const struct intel_stolen_node *node) +static void xe_stolen_node_free(const struct intel_stolen_node *node) { kfree(node); } + +const struct intel_display_stolen_interface xe_display_stolen_interface = { + .insert_node_in_range = xe_stolen_insert_node_in_range, + .insert_node = xe_stolen_insert_node, + .remove_node = xe_stolen_remove_node, + .initialized = xe_stolen_initialized, + .node_allocated = xe_stolen_node_allocated, + .node_offset = xe_stolen_node_offset, + .area_address = xe_stolen_area_address, + .area_size = xe_stolen_area_size, + .node_address = xe_stolen_node_address, + .node_size = xe_stolen_node_size, + .node_alloc = xe_stolen_node_alloc, + .node_free = xe_stolen_node_free, +}; diff --git a/drivers/gpu/drm/xe/display/xe_stolen.h b/drivers/gpu/drm/xe/display/xe_stolen.h new file mode 100644 index 000000000000..db86b9e01242 --- /dev/null +++ b/drivers/gpu/drm/xe/display/xe_stolen.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __XE_STOLEN_H__ +#define __XE_STOLEN_H__ + +extern const struct intel_display_stolen_interface xe_display_stolen_interface; + +#endif diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 61d1b22adc83..f590e846464d 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -9,6 +9,7 @@ struct dma_fence; struct drm_device; struct intel_hdcp_gsc_context; +struct intel_stolen_node; struct ref_tracker; struct intel_display_rpm_interface { @@ -47,6 +48,22 @@ struct intel_display_rps_interface { void (*ilk_irq_handler)(struct drm_device *drm); }; +struct intel_display_stolen_interface { + int (*insert_node_in_range)(struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end); + int (*insert_node)(struct intel_stolen_node *node, u64 size, unsigned int align); + void (*remove_node)(struct intel_stolen_node *node); + bool (*initialized)(struct drm_device *drm); + bool (*node_allocated)(const struct intel_stolen_node *node); + u64 (*node_offset)(const struct intel_stolen_node *node); + u64 (*area_address)(struct drm_device *drm); + u64 (*area_size)(struct drm_device *drm); + u64 (*node_address)(const struct intel_stolen_node *node); + u64 (*node_size)(const struct intel_stolen_node *node); + struct intel_stolen_node *(*node_alloc)(struct drm_device *drm); + void (*node_free)(const struct intel_stolen_node *node); +}; + /** * struct intel_display_parent_interface - services parent driver provides to display * @@ -72,6 +89,9 @@ struct intel_display_parent_interface { /** @rpm: RPS interface. Optional. */ const struct intel_display_rps_interface *rps; + /** @stolen: Stolen memory. */ + const struct intel_display_stolen_interface *stolen; + /** @vgpu_active: Is vGPU active? Optional. */ bool (*vgpu_active)(struct drm_device *drm); -- 2.47.3
