drm/{i915, xe}/stolen: make struct intel_stolen_node opaque

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>
This commit is contained in:
Jani Nikula 2025-09-24 19:43:36 +03:00
parent 33c8d948bc
commit f74bab2d90
5 changed files with 89 additions and 30 deletions

View 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;
}
/**

View File

@ -24,6 +24,10 @@
#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);
}

View 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__ */

View 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

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