#define gr_gk20a_elpg_protected_call(g, func) \
({ \
int err; \
- mutex_lock(&g->pmu.pg_init_mutex); \
gk20a_pmu_disable_elpg(g); \
err = func; \
gk20a_pmu_enable_elpg(g); \
- mutex_unlock(&g->pmu.pg_init_mutex); \
err; \
})
mutex_init(&pmu->isr_mutex);
mutex_init(&pmu->pmu_copy_lock);
mutex_init(&pmu->pmu_seq_lock);
- mutex_init(&pmu->pg_init_mutex);
pmu->perfmon_counter.index = 3; /* GR & CE2 */
pmu->perfmon_counter.group_id = PMU_DOMAIN_GROUP_PSTATE;
*/
gk20a_writel(g, 0x10a164, 0x109ff);
- mutex_lock(&pmu->pg_init_mutex);
pmu->initialized = true;
pmu->zbc_ready = true;
if (g->elpg_enabled)
gk20a_pmu_enable_elpg(g);
- mutex_unlock(&pmu->pg_init_mutex);
return 0;
gk20a_pmu_get_elpg_residency_gating(g, &elpg_ingating_time,
&elpg_ungating_time, &gating_cnt);
- mutex_lock(&pmu->pg_init_mutex);
gk20a_pmu_disable_elpg_defer_enable(g, false);
- pmu->initialized = false;
- mutex_unlock(&pmu->pg_init_mutex);
/* update the s/w ELPG residency counters */
g->pg_ingating_time_us += (u64)elpg_ingating_time;
struct work_struct pg_init;
bool elpg_enable_allow; /* true after init, false after disable, true after delay */
struct mutex elpg_mutex; /* protect elpg enable/disable */
- struct mutex pg_init_mutex; /* protect pmu pg_initialization routine */
int elpg_refcnt; /* disable -1, enable +1, <=0 elpg disabled, > 0 elpg enabled */
struct pmu_perfmon_counter perfmon_counter;