mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
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:
parent
33c8d948bc
commit
f74bab2d90
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user