skip_init:
mutex_init(&pmu->elpg_mutex);
mutex_init(&pmu->isr_mutex);
+ mutex_init(&pmu->isr_enable_lock);
mutex_init(&pmu->pmu_copy_lock);
mutex_init(&pmu->pmu_seq_lock);
gk20a_dbg_fn("");
+ mutex_lock(&pmu->isr_enable_lock);
pmu_reset(pmu);
+ pmu->isr_enabled = true;
+ mutex_unlock(&pmu->isr_enable_lock);
/* setup apertures - virtual */
gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_UCODE),
gk20a_dbg_fn("");
+ mutex_lock(&pmu->isr_enable_lock);
+ if (!pmu->isr_enabled) {
+ mutex_unlock(&pmu->isr_enable_lock);
+ return;
+ }
+
mutex_lock(&pmu->isr_mutex);
mask = gk20a_readl(g, pwr_falcon_irqmask_r()) &
if (!intr) {
mutex_unlock(&pmu->isr_mutex);
+ mutex_unlock(&pmu->isr_enable_lock);
return;
}
}
mutex_unlock(&pmu->isr_mutex);
+ mutex_unlock(&pmu->isr_enable_lock);
}
static bool pmu_validate_cmd(struct pmu_gk20a *pmu, struct pmu_cmd *cmd,
g->pg_ungating_time_us += (u64)elpg_ungating_time;
g->pg_gating_cnt += gating_cnt;
+ mutex_lock(&pmu->isr_enable_lock);
pmu_enable(pmu, false);
+ pmu->isr_enabled = false;
+ mutex_unlock(&pmu->isr_enable_lock);
+
pmu->pmu_state = PMU_STATE_OFF;
pmu->pmu_ready = false;
pmu->perfmon_ready = false;