diff options
author | Vijayakumar <vsubbu@nvidia.com> | 2014-09-30 10:49:44 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:11:52 -0400 |
commit | 748475df20bbe6843bdf4fbc02384dc5aa28866e (patch) | |
tree | 700012cf758d6731017b8b23153abae4311bf065 /drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |
parent | 4739499f07b29282ee1031d08adaa76c238da2a6 (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.c | 19 |
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 | ||
2267 | int gk20a_init_pmu_support(struct gk20a *g) | 2268 | int 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 | ||
2752 | static int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout, | 2753 | int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout, |
2753 | u32 *var, u32 val); | 2754 | u32 *var, u32 val); |
2754 | 2755 | ||
2755 | static void pmu_handle_zbc_msg(struct gk20a *g, struct pmu_msg *msg, | 2756 | static 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 | ||
2933 | static int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout, | 2938 | int 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); |