From: "Govindapillai, Vinod" <vinod.govindapillai@intel.com>
To: "intel-xe@lists.freedesktop.org" <intel-xe@lists.freedesktop.org>,
"Nikula, Jani" <jani.nikula@intel.com>,
"intel-gfx@lists.freedesktop.org"
<intel-gfx@lists.freedesktop.org>
Subject: Re: [PATCH v2 3/4] drm/{i915, xe}/stolen: move stolen memory handling to display parent interface
Date: Tue, 9 Dec 2025 14:15:59 +0000 [thread overview]
Message-ID: <1988d6afa4334db51f1074c36d8a609f711bc6c5.camel@intel.com> (raw)
In-Reply-To: <350c82c49fe40f6319d14d309180e2e2752145ac.1764930576.git.jani.nikula@intel.com>
On Fri, 2025-12-05 at 12:30 +0200, Jani Nikula wrote:
> 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 <jani.nikula@intel.com>
> ---
> 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));
Not related to this series, there are few other places in intel_fbc.c
where we use intel_parent_stolen_node_offset() directly as a parameter
to intel_de_write() which take u32. Wonder if we need to add the
similar warn on those places as well.
Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
> 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);
>
next prev parent reply other threads:[~2025-12-09 14:16 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-05 10:30 [PATCH v2 0/4] drm/{i915, xe}: migrate stolen interface to parent interface, cleanups Jani Nikula
2025-12-05 10:30 ` [PATCH v2 1/4] drm/i915/fbc: let to_intel_display() do its generic magic Jani Nikula
2025-12-09 13:25 ` Govindapillai, Vinod
2025-12-05 10:30 ` [PATCH v2 2/4] drm/xe/stolen: unify interface with i915 Jani Nikula
2025-12-09 13:34 ` Govindapillai, Vinod
2025-12-05 10:30 ` [PATCH v2 3/4] drm/{i915, xe}/stolen: move stolen memory handling to display parent interface Jani Nikula
2025-12-09 14:15 ` Govindapillai, Vinod [this message]
2025-12-05 10:30 ` [PATCH v2 4/4] drm/{i915, xe}/stolen: make insert_node, area_address, area_size optional Jani Nikula
2025-12-09 14:16 ` Govindapillai, Vinod
2025-12-05 11:45 ` ✗ CI.checkpatch: warning for drm/{i915, xe}: migrate stolen interface to parent interface, cleanups (rev2) Patchwork
2025-12-05 11:46 ` ✓ CI.KUnit: success " Patchwork
2025-12-05 12:01 ` ✗ CI.checksparse: warning " Patchwork
2025-12-05 12:49 ` ✓ Xe.CI.BAT: success " Patchwork
2025-12-05 14:30 ` ✗ Xe.CI.Full: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1988d6afa4334db51f1074c36d8a609f711bc6c5.camel@intel.com \
--to=vinod.govindapillai@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox