summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2014-09-30 10:49:44 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:11:52 -0400
commit748475df20bbe6843bdf4fbc02384dc5aa28866e (patch)
tree700012cf758d6731017b8b23153abae4311bf065 /drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
parent4739499f07b29282ee1031d08adaa76c238da2a6 (diff)
gpu: nvgpu: gm20b: Support secure FECS recovery
When falcons are secured use PMU commands to reload FECS firmware. Bug 200042729 Change-Id: I09f2472b16dac6a510dba067bce3950075973d5f Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/552544 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index e60de70b..0580f19d 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -2262,6 +2262,7 @@ void gk20a_init_pmu_ops(struct gpu_ops *gops)
2262 gops->pmu.prepare_ucode = gk20a_prepare_ucode; 2262 gops->pmu.prepare_ucode = gk20a_prepare_ucode;
2263 gops->pmu.pmu_setup_hw_and_bootstrap = gk20a_init_pmu_setup_hw1; 2263 gops->pmu.pmu_setup_hw_and_bootstrap = gk20a_init_pmu_setup_hw1;
2264 gops->pmu.pmu_setup_elpg = NULL; 2264 gops->pmu.pmu_setup_elpg = NULL;
2265 gops->pmu.init_wpr_region = NULL;
2265} 2266}
2266 2267
2267int gk20a_init_pmu_support(struct gk20a *g) 2268int gk20a_init_pmu_support(struct gk20a *g)
@@ -2749,7 +2750,7 @@ static int pmu_response_handle(struct pmu_gk20a *pmu,
2749 return 0; 2750 return 0;
2750} 2751}
2751 2752
2752static int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout, 2753int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout,
2753 u32 *var, u32 val); 2754 u32 *var, u32 val);
2754 2755
2755static void pmu_handle_zbc_msg(struct gk20a *g, struct pmu_msg *msg, 2756static void pmu_handle_zbc_msg(struct gk20a *g, struct pmu_msg *msg,
@@ -2902,10 +2903,14 @@ static int pmu_process_message(struct pmu_gk20a *pmu)
2902{ 2903{
2903 struct pmu_msg msg; 2904 struct pmu_msg msg;
2904 int status; 2905 int status;
2906 struct gk20a *g = gk20a_from_pmu(pmu);
2905 2907
2906 if (unlikely(!pmu->pmu_ready)) { 2908 if (unlikely(!pmu->pmu_ready)) {
2907 pmu_process_init_msg(pmu, &msg); 2909 pmu_process_init_msg(pmu, &msg);
2910 if (g->ops.pmu.init_wpr_region != NULL)
2911 g->ops.pmu.init_wpr_region(g);
2908 pmu_init_perfmon(pmu); 2912 pmu_init_perfmon(pmu);
2913
2909 return 0; 2914 return 0;
2910 } 2915 }
2911 2916
@@ -2930,7 +2935,7 @@ static int pmu_process_message(struct pmu_gk20a *pmu)
2930 return 0; 2935 return 0;
2931} 2936}
2932 2937
2933static int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout, 2938int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout,
2934 u32 *var, u32 val) 2939 u32 *var, u32 val)
2935{ 2940{
2936 struct gk20a *g = gk20a_from_pmu(pmu); 2941 struct gk20a *g = gk20a_from_pmu(pmu);
@@ -3166,10 +3171,11 @@ void gk20a_pmu_isr(struct gk20a *g)
3166 mask = gk20a_readl(g, pwr_falcon_irqmask_r()) & 3171 mask = gk20a_readl(g, pwr_falcon_irqmask_r()) &
3167 gk20a_readl(g, pwr_falcon_irqdest_r()); 3172 gk20a_readl(g, pwr_falcon_irqdest_r());
3168 3173
3169 intr = gk20a_readl(g, pwr_falcon_irqstat_r()) & mask; 3174 intr = gk20a_readl(g, pwr_falcon_irqstat_r());
3170 3175
3171 gk20a_dbg_pmu("received falcon interrupt: 0x%08x", intr); 3176 gk20a_dbg_pmu("received falcon interrupt: 0x%08x", intr);
3172 3177
3178 intr = gk20a_readl(g, pwr_falcon_irqstat_r()) & mask;
3173 if (!intr || pmu->pmu_state == PMU_STATE_OFF) { 3179 if (!intr || pmu->pmu_state == PMU_STATE_OFF) {
3174 gk20a_writel(g, pwr_falcon_irqsclr_r(), intr); 3180 gk20a_writel(g, pwr_falcon_irqsclr_r(), intr);
3175 mutex_unlock(&pmu->isr_mutex); 3181 mutex_unlock(&pmu->isr_mutex);
@@ -3631,6 +3637,10 @@ int gk20a_pmu_destroy(struct gk20a *g)
3631 pmu->pmu_ready = false; 3637 pmu->pmu_ready = false;
3632 pmu->perfmon_ready = false; 3638 pmu->perfmon_ready = false;
3633 pmu->zbc_ready = false; 3639 pmu->zbc_ready = false;
3640 g->ops.pmu.lspmuwprinitdone = false;
3641 g->ops.pmu.fecsbootstrapdone = false;
3642 g->ops.pmu.fecsrecoveryinprogress = 0;
3643
3634 3644
3635 gk20a_dbg_fn("done"); 3645 gk20a_dbg_fn("done");
3636 return 0; 3646 return 0;
@@ -3738,7 +3748,6 @@ int gk20a_pmu_ap_send_command(struct gk20a *g,
3738 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_INIT"); 3748 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_INIT");
3739 cmd.cmd.pg.ap_cmd.init.pg_sampling_period_us = 3749 cmd.cmd.pg.ap_cmd.init.pg_sampling_period_us =
3740 p_ap_cmd->init.pg_sampling_period_us; 3750 p_ap_cmd->init.pg_sampling_period_us;
3741 p_callback = ap_callback_init_and_enable_ctrl;
3742 break; 3751 break;
3743 3752
3744 case PMU_AP_CMD_ID_INIT_AND_ENABLE_CTRL: 3753 case PMU_AP_CMD_ID_INIT_AND_ENABLE_CTRL:
@@ -3782,7 +3791,7 @@ int gk20a_pmu_ap_send_command(struct gk20a *g,
3782 status = gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ, 3791 status = gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
3783 p_callback, pmu, &seq, ~0); 3792 p_callback, pmu, &seq, ~0);
3784 3793
3785 if (!status) { 3794 if (status) {
3786 gk20a_dbg_pmu( 3795 gk20a_dbg_pmu(
3787 "%s: Unable to submit Adaptive Power Command %d\n", 3796 "%s: Unable to submit Adaptive Power Command %d\n",
3788 __func__, p_ap_cmd->cmn.cmd_id); 3797 __func__, p_ap_cmd->cmn.cmd_id);