From b57c6501c75b478b08b9ea6e226c55e5039b5c86 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Wed, 18 Jun 2014 15:37:44 +0300 Subject: gu: nvgpu: Add PMU state ELPG booting Add PMU state ELPG booting. Prevent ISR processing when PMU is in OFF state. Bug 200006956 Change-Id: Ibcf69a2d81965cc87f520bf864c4425681f04531 Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/424769 --- drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 9 ++++++--- drivers/gpu/nvgpu/gk20a/pmu_gk20a.h | 12 +++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a') diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index ac66dbef..cfbdceae 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c @@ -2017,6 +2017,8 @@ int gk20a_init_pmu_support(struct gk20a *g) err = g->ops.pmu.pmu_setup_hw_and_bootstrap(g); if (err) return err; + + pmu->pmu_state = PMU_STATE_STARTING; } return err; @@ -2047,7 +2049,7 @@ static void pmu_handle_pg_elpg_msg(struct gk20a *g, struct pmu_msg *msg, case PMU_PG_ELPG_MSG_DISALLOW_ACK: gk20a_dbg_pmu("DISALLOW is acknowledged from PMU"); pmu->elpg_stat = PMU_ELPG_STAT_OFF; - if (pmu->pmu_state == PMU_STATE_STARTING) + if (pmu->pmu_state == PMU_STATE_ELPG_BOOTING) pmu->pmu_state = PMU_STATE_ELPG_BOOTED; schedule_work(&pmu->pg_init); break; @@ -2147,7 +2149,7 @@ static int pmu_init_powergating(struct pmu_gk20a *pmu) /* start with elpg disabled until first enable call */ pmu->elpg_refcnt = 0; - pmu->pmu_state = PMU_STATE_STARTING; + pmu->pmu_state = PMU_STATE_ELPG_BOOTING; return 0; } @@ -2891,7 +2893,8 @@ void gk20a_pmu_isr(struct gk20a *g) gk20a_dbg_pmu("received falcon interrupt: 0x%08x", intr); - if (!intr) { + if (!intr || pmu->pmu_state == PMU_STATE_OFF) { + gk20a_writel(g, pwr_falcon_irqsclr_r(), intr); mutex_unlock(&pmu->isr_mutex); return; } diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h index 1789f5ea..6f4e6c2e 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h @@ -991,11 +991,13 @@ struct pmu_pg_stats { /* Choices for pmu_state */ #define PMU_STATE_OFF 0 /* PMU is off */ -#define PMU_STATE_STARTING 1 /* PMU is booting */ -#define PMU_STATE_ELPG_BOOTED 2 /* ELPG is initialized */ -#define PMU_STATE_LOADING_PG_BUF 3 /* Loading PG buf */ -#define PMU_STATE_LOADING_ZBC 4 /* Loading ZBC buf */ -#define PMU_STATE_STARTED 5 /* Fully unitialized */ +#define PMU_STATE_STARTING 1 /* PMU is on, but not booted */ +#define PMU_STATE_ELPG_BOOTING 2 /* PMU is booting */ +#define PMU_STATE_ELPG_BOOTED 3 /* ELPG is initialized */ +#define PMU_STATE_LOADING_PG_BUF 4 /* Loading PG buf */ +#define PMU_STATE_LOADING_ZBC 5 /* Loading ZBC buf */ +#define PMU_STATE_STARTED 6 /* Fully unitialized */ + struct pmu_gk20a { -- cgit v1.2.2