Commit 5da6d6c7 authored by Jani Nikula's avatar Jani Nikula

drm/i915: move fb_tracking under display sub-struct

Move display frontbuffer tracking related members under drm_i915_private
display sub-struct.

Rename struct i915_frontbuffer_tracking to intel_frontbuffer_tracking
while at it.

FIXME: fb_tracking.lock mutex init should be moved away from
i915_gem_init_early().
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/a5444d0a373afca46da9a2f6e4db442af21b429b.1661779055.git.jani.nikula@intel.com
parent 20478b88
...@@ -120,6 +120,17 @@ struct intel_dpll { ...@@ -120,6 +120,17 @@ struct intel_dpll {
} ref_clks; } ref_clks;
}; };
struct intel_frontbuffer_tracking {
spinlock_t lock;
/*
* Tracking bits for delayed frontbuffer flushing du to gpu activity or
* scheduled flips.
*/
unsigned busy_bits;
unsigned flip_bits;
};
struct intel_hotplug { struct intel_hotplug {
struct delayed_work hotplug_work; struct delayed_work hotplug_work;
...@@ -363,6 +374,7 @@ struct intel_display { ...@@ -363,6 +374,7 @@ struct intel_display {
struct intel_dmc dmc; struct intel_dmc dmc;
struct intel_dpll dpll; struct intel_dpll dpll;
struct intel_fbc *fbc[I915_MAX_FBCS]; struct intel_fbc *fbc[I915_MAX_FBCS];
struct intel_frontbuffer_tracking fb_tracking;
struct intel_hotplug hotplug; struct intel_hotplug hotplug;
struct intel_opregion opregion; struct intel_opregion opregion;
struct intel_overlay *overlay; struct intel_overlay *overlay;
......
...@@ -37,10 +37,10 @@ static int i915_frontbuffer_tracking(struct seq_file *m, void *unused) ...@@ -37,10 +37,10 @@ static int i915_frontbuffer_tracking(struct seq_file *m, void *unused)
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
seq_printf(m, "FB tracking busy bits: 0x%08x\n", seq_printf(m, "FB tracking busy bits: 0x%08x\n",
dev_priv->fb_tracking.busy_bits); dev_priv->display.fb_tracking.busy_bits);
seq_printf(m, "FB tracking flip bits: 0x%08x\n", seq_printf(m, "FB tracking flip bits: 0x%08x\n",
dev_priv->fb_tracking.flip_bits); dev_priv->display.fb_tracking.flip_bits);
return 0; return 0;
} }
......
...@@ -81,9 +81,9 @@ static void frontbuffer_flush(struct drm_i915_private *i915, ...@@ -81,9 +81,9 @@ static void frontbuffer_flush(struct drm_i915_private *i915,
enum fb_op_origin origin) enum fb_op_origin origin)
{ {
/* Delay flushing when rings are still busy.*/ /* Delay flushing when rings are still busy.*/
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
frontbuffer_bits &= ~i915->fb_tracking.busy_bits; frontbuffer_bits &= ~i915->display.fb_tracking.busy_bits;
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
if (!frontbuffer_bits) if (!frontbuffer_bits)
return; return;
...@@ -111,11 +111,11 @@ static void frontbuffer_flush(struct drm_i915_private *i915, ...@@ -111,11 +111,11 @@ static void frontbuffer_flush(struct drm_i915_private *i915,
void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915, void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915,
unsigned frontbuffer_bits) unsigned frontbuffer_bits)
{ {
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
i915->fb_tracking.flip_bits |= frontbuffer_bits; i915->display.fb_tracking.flip_bits |= frontbuffer_bits;
/* Remove stale busy bits due to the old buffer. */ /* Remove stale busy bits due to the old buffer. */
i915->fb_tracking.busy_bits &= ~frontbuffer_bits; i915->display.fb_tracking.busy_bits &= ~frontbuffer_bits;
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
} }
/** /**
...@@ -131,11 +131,11 @@ void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915, ...@@ -131,11 +131,11 @@ void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915,
void intel_frontbuffer_flip_complete(struct drm_i915_private *i915, void intel_frontbuffer_flip_complete(struct drm_i915_private *i915,
unsigned frontbuffer_bits) unsigned frontbuffer_bits)
{ {
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
/* Mask any cancelled flips. */ /* Mask any cancelled flips. */
frontbuffer_bits &= i915->fb_tracking.flip_bits; frontbuffer_bits &= i915->display.fb_tracking.flip_bits;
i915->fb_tracking.flip_bits &= ~frontbuffer_bits; i915->display.fb_tracking.flip_bits &= ~frontbuffer_bits;
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
if (frontbuffer_bits) if (frontbuffer_bits)
frontbuffer_flush(i915, frontbuffer_bits, ORIGIN_FLIP); frontbuffer_flush(i915, frontbuffer_bits, ORIGIN_FLIP);
...@@ -155,10 +155,10 @@ void intel_frontbuffer_flip_complete(struct drm_i915_private *i915, ...@@ -155,10 +155,10 @@ void intel_frontbuffer_flip_complete(struct drm_i915_private *i915,
void intel_frontbuffer_flip(struct drm_i915_private *i915, void intel_frontbuffer_flip(struct drm_i915_private *i915,
unsigned frontbuffer_bits) unsigned frontbuffer_bits)
{ {
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
/* Remove stale busy bits due to the old buffer. */ /* Remove stale busy bits due to the old buffer. */
i915->fb_tracking.busy_bits &= ~frontbuffer_bits; i915->display.fb_tracking.busy_bits &= ~frontbuffer_bits;
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
frontbuffer_flush(i915, frontbuffer_bits, ORIGIN_FLIP); frontbuffer_flush(i915, frontbuffer_bits, ORIGIN_FLIP);
} }
...@@ -170,10 +170,10 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front, ...@@ -170,10 +170,10 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front,
struct drm_i915_private *i915 = to_i915(front->obj->base.dev); struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
if (origin == ORIGIN_CS) { if (origin == ORIGIN_CS) {
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
i915->fb_tracking.busy_bits |= frontbuffer_bits; i915->display.fb_tracking.busy_bits |= frontbuffer_bits;
i915->fb_tracking.flip_bits &= ~frontbuffer_bits; i915->display.fb_tracking.flip_bits &= ~frontbuffer_bits;
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
} }
trace_intel_frontbuffer_invalidate(frontbuffer_bits, origin); trace_intel_frontbuffer_invalidate(frontbuffer_bits, origin);
...@@ -191,11 +191,11 @@ void __intel_fb_flush(struct intel_frontbuffer *front, ...@@ -191,11 +191,11 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
struct drm_i915_private *i915 = to_i915(front->obj->base.dev); struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
if (origin == ORIGIN_CS) { if (origin == ORIGIN_CS) {
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
/* Filter out new bits since rendering started. */ /* Filter out new bits since rendering started. */
frontbuffer_bits &= i915->fb_tracking.busy_bits; frontbuffer_bits &= i915->display.fb_tracking.busy_bits;
i915->fb_tracking.busy_bits &= ~frontbuffer_bits; i915->display.fb_tracking.busy_bits &= ~frontbuffer_bits;
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
} }
if (frontbuffer_bits) if (frontbuffer_bits)
...@@ -221,7 +221,7 @@ static void frontbuffer_retire(struct i915_active *ref) ...@@ -221,7 +221,7 @@ static void frontbuffer_retire(struct i915_active *ref)
} }
static void frontbuffer_release(struct kref *ref) static void frontbuffer_release(struct kref *ref)
__releases(&to_i915(front->obj->base.dev)->fb_tracking.lock) __releases(&to_i915(front->obj->base.dev)->display.fb_tracking.lock)
{ {
struct intel_frontbuffer *front = struct intel_frontbuffer *front =
container_of(ref, typeof(*front), ref); container_of(ref, typeof(*front), ref);
...@@ -238,7 +238,7 @@ static void frontbuffer_release(struct kref *ref) ...@@ -238,7 +238,7 @@ static void frontbuffer_release(struct kref *ref)
spin_unlock(&obj->vma.lock); spin_unlock(&obj->vma.lock);
RCU_INIT_POINTER(obj->frontbuffer, NULL); RCU_INIT_POINTER(obj->frontbuffer, NULL);
spin_unlock(&to_i915(obj->base.dev)->fb_tracking.lock); spin_unlock(&to_i915(obj->base.dev)->display.fb_tracking.lock);
i915_active_fini(&front->write); i915_active_fini(&front->write);
...@@ -268,7 +268,7 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj) ...@@ -268,7 +268,7 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)
frontbuffer_retire, frontbuffer_retire,
I915_ACTIVE_RETIRE_SLEEPS); I915_ACTIVE_RETIRE_SLEEPS);
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->display.fb_tracking.lock);
if (rcu_access_pointer(obj->frontbuffer)) { if (rcu_access_pointer(obj->frontbuffer)) {
kfree(front); kfree(front);
front = rcu_dereference_protected(obj->frontbuffer, true); front = rcu_dereference_protected(obj->frontbuffer, true);
...@@ -277,7 +277,7 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj) ...@@ -277,7 +277,7 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)
i915_gem_object_get(obj); i915_gem_object_get(obj);
rcu_assign_pointer(obj->frontbuffer, front); rcu_assign_pointer(obj->frontbuffer, front);
} }
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->display.fb_tracking.lock);
return front; return front;
} }
...@@ -286,7 +286,7 @@ void intel_frontbuffer_put(struct intel_frontbuffer *front) ...@@ -286,7 +286,7 @@ void intel_frontbuffer_put(struct intel_frontbuffer *front)
{ {
kref_put_lock(&front->ref, kref_put_lock(&front->ref,
frontbuffer_release, frontbuffer_release,
&to_i915(front->obj->base.dev)->fb_tracking.lock); &to_i915(front->obj->base.dev)->display.fb_tracking.lock);
} }
/** /**
......
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
#include "display/intel_display.h" #include "display/intel_display.h"
#include "display/intel_display_core.h" #include "display/intel_display_core.h"
#include "display/intel_dsb.h" #include "display/intel_dsb.h"
#include "display/intel_frontbuffer.h"
#include "gem/i915_gem_context_types.h" #include "gem/i915_gem_context_types.h"
#include "gem/i915_gem_lmem.h" #include "gem/i915_gem_lmem.h"
...@@ -188,17 +187,6 @@ i915_fence_timeout(const struct drm_i915_private *i915) ...@@ -188,17 +187,6 @@ i915_fence_timeout(const struct drm_i915_private *i915)
#define HAS_HW_SAGV_WM(i915) (DISPLAY_VER(i915) >= 13 && !IS_DGFX(i915)) #define HAS_HW_SAGV_WM(i915) (DISPLAY_VER(i915) >= 13 && !IS_DGFX(i915))
struct i915_frontbuffer_tracking {
spinlock_t lock;
/*
* Tracking bits for delayed frontbuffer flushing du to gpu activity or
* scheduled flips.
*/
unsigned busy_bits;
unsigned flip_bits;
};
struct i915_virtual_gpu { struct i915_virtual_gpu {
struct mutex lock; /* serialises sending of g2v_notify command pkts */ struct mutex lock; /* serialises sending of g2v_notify command pkts */
bool active; bool active;
...@@ -333,8 +321,6 @@ struct drm_i915_private { ...@@ -333,8 +321,6 @@ struct drm_i915_private {
struct list_head global_obj_list; struct list_head global_obj_list;
struct i915_frontbuffer_tracking fb_tracking;
struct intel_atomic_helper { struct intel_atomic_helper {
struct llist_head free_list; struct llist_head free_list;
struct work_struct free_work; struct work_struct free_work;
......
...@@ -1212,7 +1212,7 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv) ...@@ -1212,7 +1212,7 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv)
i915_gem_init__mm(dev_priv); i915_gem_init__mm(dev_priv);
i915_gem_init__contexts(dev_priv); i915_gem_init__contexts(dev_priv);
spin_lock_init(&dev_priv->fb_tracking.lock); spin_lock_init(&dev_priv->display.fb_tracking.lock);
} }
void i915_gem_cleanup_early(struct drm_i915_private *dev_priv) void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment