drm/i915: Explicitly track active fw_domain timers
Stop guessing over whether we have an extra wakeref held by the delayed fw put, and track it explicitly for the sake of debug. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190708154914.26850-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
15e7facb7b
commit
77adbd8fbf
@ -78,6 +78,8 @@ fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
|
|||||||
static inline void
|
static inline void
|
||||||
fw_domain_arm_timer(struct intel_uncore_forcewake_domain *d)
|
fw_domain_arm_timer(struct intel_uncore_forcewake_domain *d)
|
||||||
{
|
{
|
||||||
|
GEM_BUG_ON(d->uncore->fw_domains_timer & d->mask);
|
||||||
|
d->uncore->fw_domains_timer |= d->mask;
|
||||||
d->wake_count++;
|
d->wake_count++;
|
||||||
hrtimer_start_range_ns(&d->timer,
|
hrtimer_start_range_ns(&d->timer,
|
||||||
NSEC_PER_MSEC,
|
NSEC_PER_MSEC,
|
||||||
@ -353,9 +355,10 @@ intel_uncore_fw_release_timer(struct hrtimer *timer)
|
|||||||
return HRTIMER_RESTART;
|
return HRTIMER_RESTART;
|
||||||
|
|
||||||
spin_lock_irqsave(&uncore->lock, irqflags);
|
spin_lock_irqsave(&uncore->lock, irqflags);
|
||||||
if (WARN_ON(domain->wake_count == 0))
|
|
||||||
domain->wake_count++;
|
|
||||||
|
|
||||||
|
uncore->fw_domains_timer &= ~domain->mask;
|
||||||
|
|
||||||
|
GEM_BUG_ON(!domain->wake_count);
|
||||||
if (--domain->wake_count == 0)
|
if (--domain->wake_count == 0)
|
||||||
uncore->funcs.force_wake_put(uncore, domain->mask);
|
uncore->funcs.force_wake_put(uncore, domain->mask);
|
||||||
|
|
||||||
@ -673,8 +676,7 @@ static void __intel_uncore_forcewake_put(struct intel_uncore *uncore,
|
|||||||
fw_domains &= uncore->fw_domains;
|
fw_domains &= uncore->fw_domains;
|
||||||
|
|
||||||
for_each_fw_domain_masked(domain, fw_domains, uncore, tmp) {
|
for_each_fw_domain_masked(domain, fw_domains, uncore, tmp) {
|
||||||
if (WARN_ON(domain->wake_count == 0))
|
GEM_BUG_ON(!domain->wake_count);
|
||||||
continue;
|
|
||||||
|
|
||||||
if (--domain->wake_count) {
|
if (--domain->wake_count) {
|
||||||
domain->active = true;
|
domain->active = true;
|
||||||
@ -764,7 +766,7 @@ void assert_forcewakes_active(struct intel_uncore *uncore,
|
|||||||
unsigned int actual = READ_ONCE(domain->wake_count);
|
unsigned int actual = READ_ONCE(domain->wake_count);
|
||||||
unsigned int expect = 1;
|
unsigned int expect = 1;
|
||||||
|
|
||||||
if (hrtimer_active(&domain->timer) && READ_ONCE(domain->active))
|
if (uncore->fw_domains_timer & domain->mask)
|
||||||
expect++; /* pending automatic release */
|
expect++; /* pending automatic release */
|
||||||
|
|
||||||
if (WARN(actual < expect,
|
if (WARN(actual < expect,
|
||||||
@ -1160,8 +1162,7 @@ static noinline void ___force_wake_auto(struct intel_uncore *uncore,
|
|||||||
static inline void __force_wake_auto(struct intel_uncore *uncore,
|
static inline void __force_wake_auto(struct intel_uncore *uncore,
|
||||||
enum forcewake_domains fw_domains)
|
enum forcewake_domains fw_domains)
|
||||||
{
|
{
|
||||||
if (WARN_ON(!fw_domains))
|
GEM_BUG_ON(!fw_domains);
|
||||||
return;
|
|
||||||
|
|
||||||
/* Turn on all requested but inactive supported forcewake domains. */
|
/* Turn on all requested but inactive supported forcewake domains. */
|
||||||
fw_domains &= uncore->fw_domains;
|
fw_domains &= uncore->fw_domains;
|
||||||
|
@ -123,6 +123,7 @@ struct intel_uncore {
|
|||||||
|
|
||||||
enum forcewake_domains fw_domains;
|
enum forcewake_domains fw_domains;
|
||||||
enum forcewake_domains fw_domains_active;
|
enum forcewake_domains fw_domains_active;
|
||||||
|
enum forcewake_domains fw_domains_timer;
|
||||||
enum forcewake_domains fw_domains_saved; /* user domains saved for S3 */
|
enum forcewake_domains fw_domains_saved; /* user domains saved for S3 */
|
||||||
|
|
||||||
struct intel_uncore_forcewake_domain {
|
struct intel_uncore_forcewake_domain {
|
||||||
|
Loading…
Reference in New Issue
Block a user