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 <[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));

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 <[email protected]>

>       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);
>  

Reply via email to