]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/{i915, xe}/stolen: make struct intel_stolen_node opaque
authorJani Nikula <jani.nikula@intel.com>
Wed, 24 Sep 2025 16:43:36 +0000 (19:43 +0300)
committerJani Nikula <jani.nikula@intel.com>
Mon, 29 Sep 2025 09:41:30 +0000 (12:41 +0300)
Add i915_gem_stolen_node_alloc() and i915_gem_stolen_node_free(),
returning struct intel_stolen_node pointer. Make struct
intel_stolen_node an opaque pointer, with different implementations in
i915 and xe.

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://lore.kernel.org/r/3fe71bbb4c75ee86b4d129fafa3d4cd6526363f4.1758732183.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_fbc.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.h
drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h
drivers/gpu/drm/xe/display/xe_stolen.c

index cc67de6c06cff62f3342c49aad294de9f0c8910f..05199434cb7c166d49f789c14695fba2fde2c001 100644 (file)
@@ -102,7 +102,8 @@ struct intel_fbc {
        struct mutex lock;
        unsigned int busy_bits;
 
-       struct intel_stolen_node compressed_fb, compressed_llb;
+       struct intel_stolen_node *compressed_fb;
+       struct intel_stolen_node *compressed_llb;
 
        enum intel_fbc_id id;
 
@@ -380,16 +381,16 @@ static void i8xx_fbc_program_cfb(struct intel_fbc *fbc)
 
        drm_WARN_ON(display->drm,
                    range_end_overflows_t(u64, i915_gem_stolen_area_address(i915),
-                                         i915_gem_stolen_node_offset(&fbc->compressed_fb),
+                                         i915_gem_stolen_node_offset(fbc->compressed_fb),
                                          U32_MAX));
        drm_WARN_ON(display->drm,
                    range_end_overflows_t(u64, i915_gem_stolen_area_address(i915),
-                                         i915_gem_stolen_node_offset(&fbc->compressed_llb),
+                                         i915_gem_stolen_node_offset(fbc->compressed_llb),
                                          U32_MAX));
        intel_de_write(display, FBC_CFB_BASE,
-                      i915_gem_stolen_node_address(i915, &fbc->compressed_fb));
+                      i915_gem_stolen_node_address(i915, fbc->compressed_fb));
        intel_de_write(display, FBC_LL_BASE,
-                      i915_gem_stolen_node_address(i915, &fbc->compressed_llb));
+                      i915_gem_stolen_node_address(i915, fbc->compressed_llb));
 }
 
 static const struct intel_fbc_funcs i8xx_fbc_funcs = {
@@ -497,7 +498,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));
+                      i915_gem_stolen_node_offset(fbc->compressed_fb));
 }
 
 static const struct intel_fbc_funcs g4x_fbc_funcs = {
@@ -566,7 +567,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));
+                      i915_gem_stolen_node_offset(fbc->compressed_fb));
 }
 
 static const struct intel_fbc_funcs ilk_fbc_funcs = {
@@ -842,13 +843,13 @@ 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(i915, &fbc->compressed_fb,
+       ret = i915_gem_stolen_insert_node_in_range(i915, 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(i915, &fbc->compressed_fb,
+               ret = i915_gem_stolen_insert_node_in_range(i915, fbc->compressed_fb,
                                                           size >>= 1, 4096, 0, end);
                if (ret == 0)
                        return limit;
@@ -865,12 +866,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));
+                   i915_gem_stolen_node_allocated(fbc->compressed_fb));
        drm_WARN_ON(display->drm,
-                   i915_gem_stolen_node_allocated(&fbc->compressed_llb));
+                   i915_gem_stolen_node_allocated(fbc->compressed_llb));
 
        if (DISPLAY_VER(display) < 5 && !display->platform.g4x) {
-               ret = i915_gem_stolen_insert_node(i915, &fbc->compressed_llb,
+               ret = i915_gem_stolen_insert_node(i915, fbc->compressed_llb,
                                                  4096, 4096);
                if (ret)
                        goto err;
@@ -887,12 +888,12 @@ 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);
+                   i915_gem_stolen_node_size(fbc->compressed_fb), fbc->limit);
        return 0;
 
 err_llb:
-       if (i915_gem_stolen_node_allocated(&fbc->compressed_llb))
-               i915_gem_stolen_remove_node(i915, &fbc->compressed_llb);
+       if (i915_gem_stolen_node_allocated(fbc->compressed_llb))
+               i915_gem_stolen_remove_node(i915, fbc->compressed_llb);
 err:
        if (i915_gem_stolen_initialized(i915))
                drm_info_once(display->drm,
@@ -951,10 +952,10 @@ static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc)
        if (WARN_ON(intel_fbc_hw_is_active(fbc)))
                return;
 
-       if (i915_gem_stolen_node_allocated(&fbc->compressed_llb))
-               i915_gem_stolen_remove_node(i915, &fbc->compressed_llb);
-       if (i915_gem_stolen_node_allocated(&fbc->compressed_fb))
-               i915_gem_stolen_remove_node(i915, &fbc->compressed_fb);
+       if (i915_gem_stolen_node_allocated(fbc->compressed_llb))
+               i915_gem_stolen_remove_node(i915, fbc->compressed_llb);
+       if (i915_gem_stolen_node_allocated(fbc->compressed_fb))
+               i915_gem_stolen_remove_node(i915, fbc->compressed_fb);
 }
 
 void intel_fbc_cleanup(struct intel_display *display)
@@ -967,6 +968,9 @@ 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);
+
                kfree(fbc);
        }
 }
@@ -1355,7 +1359,7 @@ static bool intel_fbc_is_cfb_ok(const struct intel_plane_state *plane_state)
 
        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);
+                       i915_gem_stolen_node_size(fbc->compressed_fb);
 }
 
 static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state)
@@ -2083,6 +2087,13 @@ 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);
+       if (!fbc->compressed_fb)
+               goto err;
+       fbc->compressed_llb = i915_gem_stolen_node_alloc(display->drm);
+       if (!fbc->compressed_llb)
+               goto err;
+
        fbc->id = fbc_id;
        fbc->display = display;
        INIT_WORK(&fbc->underrun_work, intel_fbc_underrun_work_fn);
@@ -2102,6 +2113,13 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display,
                fbc->funcs = &i8xx_fbc_funcs;
 
        return fbc;
+
+err:
+       i915_gem_stolen_node_free(fbc->compressed_llb);
+       i915_gem_stolen_node_free(fbc->compressed_fb);
+       kfree(fbc);
+
+       return NULL;
 }
 
 /**
index 70ee34303e3670ae0829b98f6da0a488f9f0a701..5991ccd3f328b01eb427e3e52bf2ed1c08f6a4ca 100644 (file)
 #include "intel_mchbar_regs.h"
 #include "intel_pci_config.h"
 
+struct intel_stolen_node {
+       struct drm_mm_node node;
+};
+
 /*
  * The BIOS typically reserves some of the system's memory for the exclusive
  * use of the integrated graphics. This memory is no longer available for
@@ -1057,3 +1061,19 @@ 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)
+{
+       struct intel_stolen_node *node;
+
+       node = kzalloc(sizeof(*node), GFP_KERNEL);
+       if (!node)
+               return NULL;
+
+       return node;
+}
+
+void i915_gem_stolen_node_free(const struct intel_stolen_node *node)
+{
+       kfree(node);
+}
index 9e42d5a4cf13dc34ced6529d2c3474b085f52dc1..25ec8325fb2923f88bd37d5c9ff9ccc939425da4 100644 (file)
@@ -7,14 +7,11 @@
 #define __I915_GEM_STOLEN_H__
 
 #include <linux/types.h>
-#include <drm/drm_mm.h>
 
+struct drm_device;
 struct drm_i915_gem_object;
 struct drm_i915_private;
-
-struct intel_stolen_node {
-       struct drm_mm_node node;
-};
+struct intel_stolen_node;
 
 int i915_gem_stolen_insert_node(struct drm_i915_private *i915,
                                struct intel_stolen_node *node, u64 size,
@@ -51,4 +48,7 @@ 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);
+
 #endif /* __I915_GEM_STOLEN_H__ */
index 10f110b9bf77de9b0ff8ac3b3cfca4a2db31df8c..b0bc3efcaf6c1ff806f0106fbb9492cf31e2ca64 100644 (file)
@@ -8,13 +8,10 @@
 
 #include <linux/types.h>
 
-struct xe_bo;
+struct drm_device;
+struct intel_stolen_node;
 struct xe_device;
 
-struct intel_stolen_node {
-       struct xe_bo *bo;
-};
-
 int i915_gem_stolen_insert_node_in_range(struct xe_device *xe,
                                         struct intel_stolen_node *node,
                                         u32 size, u32 align,
@@ -42,4 +39,8 @@ u64 i915_gem_stolen_node_address(struct xe_device *xe,
 
 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
index ab156a9f2c26bc4eab2bcfe485011c6ffb429a2c..b218df40324ace02c4ed86f5ee89bef7384d1e09 100644 (file)
@@ -6,6 +6,10 @@
 #include "xe_ttm_stolen_mgr.h"
 #include "xe_validation.h"
 
+struct intel_stolen_node {
+       struct xe_bo *bo;
+};
+
 int i915_gem_stolen_insert_node_in_range(struct xe_device *xe,
                                         struct intel_stolen_node *node,
                                         u32 size, u32 align,
@@ -97,3 +101,19 @@ u64 i915_gem_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)
+{
+       struct intel_stolen_node *node;
+
+       node = kzalloc(sizeof(*node), GFP_KERNEL);
+       if (!node)
+               return NULL;
+
+       return node;
+}
+
+void i915_gem_stolen_node_free(const struct intel_stolen_node *node)
+{
+       kfree(node);
+}