From 007660db89dd796b3fb50dec9fea378e4ff1b4b0 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Date: Thu, 12 Jan 2023 17:25:21 -0500 Subject: [PATCH] drm/i915/display: Implement FBC support Initialise the stolen memory allocator earlier to make it available when FBC is initialised, so we can check if it's succesfull there. With this, we can easily implement FBC by hooking a few calls inside intel_fbc.c Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> --- drivers/gpu/drm/i915/display/intel_fbc.c | 80 ++++++++++++++++++------ 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index dc1047d7c096..3184e3f628dd 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -56,27 +56,63 @@ #ifdef I915 #define i915_gem_stolen_initialized(i915) (drm_mm_initialized(&(i915)->mm.stolen)) +#define i915_gem_stolen_allocated(node) drm_mm_node_allocated(&(node)) +#define i915_gem_stolen_compressed_offset(node) ((node).start) +#define i915_gem_stolen_compressed_size(node) ((node).size) #else -/* No stolen memory support in xe yet */ -static int i915_gem_stolen_insert_node_in_range(struct xe_device *xe, void *ptr, u32 size, u32 align, u32 start, u32 end) +#include "xe_ttm_stolen_mgr.h" +#include "xe_res_cursor.h" + +static int i915_gem_stolen_insert_node_in_range(struct xe_device *xe, struct xe_bo **bo, u32 size, u32 align, u32 start, u32 end) { - return -ENODEV; + int err; + u32 flags = XE_BO_CREATE_PINNED_BIT | XE_BO_CREATE_STOLEN_BIT; + + *bo = xe_bo_create_locked_range(xe, to_gt(xe), NULL, size, start, end, + ttm_bo_type_kernel, flags); + if (IS_ERR(*bo)) { + err = PTR_ERR(*bo); + bo = NULL; + return err; + } + err = xe_bo_pin(*bo); + xe_bo_unlock_vm_held(*bo); + + if (err) { + xe_bo_put(*bo); + *bo = NULL; + } + + return err; } -static int i915_gem_stolen_insert_node(struct xe_device *xe, void *ptr, u32 size, u32 align) +static int i915_gem_stolen_insert_node(struct xe_device *xe, struct xe_bo **bo, u32 size, u32 align) { - XE_WARN_ON(1); + /* Not used on xe */ + BUG_ON(1); return -ENODEV; } -static void i915_gem_stolen_remove_node(struct xe_device *xe, void *ptr) +static void i915_gem_stolen_remove_node(struct xe_device *xe, struct xe_bo **bo) { + xe_bo_unpin_map_no_vm(*bo); + *bo = NULL; } -#define i915_gem_stolen_initialized(xe) ((xe) && 0) +#define i915_gem_stolen_initialized(xe) (!!ttm_manager_type(&(xe)->ttm, XE_PL_STOLEN)) +#define i915_gem_stolen_allocated(bo) (!!(bo)) +static u32 i915_gem_stolen_compressed_offset(struct xe_bo *bo) +{ + struct xe_res_cursor res; + + xe_res_first(bo->ttm.resource, 0, 4096, &res); + return res.start; +} + +#define i915_gem_stolen_compressed_size(fb) ((u64)((fb)->ttm.base.size)) #endif #define for_each_fbc_id(__dev_priv, __fbc_id) \ @@ -119,8 +155,11 @@ struct intel_fbc { struct mutex lock; unsigned int busy_bits; - struct drm_mm_node compressed_fb; - struct drm_mm_node compressed_llb; +#ifdef I915 + struct drm_mm_node compressed_fb, compressed_llb; +#else + struct xe_bo *compressed_fb, *compressed_llb; +#endif enum intel_fbc_id id; @@ -474,7 +513,8 @@ static void g4x_fbc_program_cfb(struct intel_fbc *fbc) { struct drm_i915_private *i915 = fbc->i915; - intel_de_write(i915, DPFC_CB_BASE, fbc->compressed_fb.start); + intel_de_write(i915, DPFC_CB_BASE, + i915_gem_stolen_compressed_offset(fbc->compressed_fb)); } static const struct intel_fbc_funcs g4x_fbc_funcs = { @@ -525,7 +565,8 @@ static void ilk_fbc_program_cfb(struct intel_fbc *fbc) { struct drm_i915_private *i915 = fbc->i915; - intel_de_write(i915, ILK_DPFC_CB_BASE(fbc->id), fbc->compressed_fb.start); + intel_de_write(i915, ILK_DPFC_CB_BASE(fbc->id), + i915_gem_stolen_compressed_offset(fbc->compressed_fb)); } static const struct intel_fbc_funcs ilk_fbc_funcs = { @@ -745,8 +786,6 @@ static u64 intel_fbc_stolen_end(struct drm_i915_private *i915) (DISPLAY_VER(i915) == 9 && !IS_BROXTON(i915))) end = resource_size(&i915->dsm.stolen) - 8 * 1024 * 1024; else -#else - /* TODO */ #endif end = U64_MAX; @@ -803,9 +842,9 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, int ret; drm_WARN_ON(&i915->drm, - drm_mm_node_allocated(&fbc->compressed_fb)); + i915_gem_stolen_allocated(fbc->compressed_fb)); drm_WARN_ON(&i915->drm, - drm_mm_node_allocated(&fbc->compressed_llb)); + i915_gem_stolen_allocated(fbc->compressed_llb)); if (DISPLAY_VER(i915) < 5 && !IS_G4X(i915)) { ret = i915_gem_stolen_insert_node(i915, &fbc->compressed_llb, @@ -825,12 +864,12 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, drm_dbg_kms(&i915->drm, "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", - fbc->compressed_fb.size, fbc->limit); + i915_gem_stolen_compressed_size(fbc->compressed_fb), fbc->limit); return 0; err_llb: - if (drm_mm_node_allocated(&fbc->compressed_llb)) + if (i915_gem_stolen_allocated(fbc->compressed_llb)) i915_gem_stolen_remove_node(i915, &fbc->compressed_llb); err: if (i915_gem_stolen_initialized(i915)) @@ -858,9 +897,9 @@ static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) if (WARN_ON(intel_fbc_hw_is_active(fbc))) return; - if (drm_mm_node_allocated(&fbc->compressed_llb)) + if (i915_gem_stolen_allocated(fbc->compressed_llb)) i915_gem_stolen_remove_node(i915, &fbc->compressed_llb); - if (drm_mm_node_allocated(&fbc->compressed_fb)) + if (i915_gem_stolen_allocated(fbc->compressed_fb)) i915_gem_stolen_remove_node(i915, &fbc->compressed_fb); } @@ -1068,7 +1107,8 @@ static bool intel_fbc_is_cfb_ok(const struct intel_plane_state *plane_state) struct intel_fbc *fbc = plane->fbc; return intel_fbc_min_limit(plane_state) <= fbc->limit && - intel_fbc_cfb_size(plane_state) <= fbc->compressed_fb.size * fbc->limit; + intel_fbc_cfb_size(plane_state) <= fbc->limit * + i915_gem_stolen_compressed_size(fbc->compressed_fb); } static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state) -- GitLab