summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-05-08 11:45:39 +0300
committerMandar Padmawar <mpadmawar@nvidia.com>2014-06-03 07:33:45 -0700
commit27ddcf9a6ce0777a975dabbc59cb2356c208ac18 (patch)
tree5c731954aa284595be994fbd6d43be963455ba55 /drivers/gpu
parent6355a9d7ab54fc5c2aa1e5a7351a45bf059a69be (diff)
gpu: nvgpu: Do not clear PMU state on rail gate
When rail gating, we cleared all PMU status. Clear only the relevant fields. Change-Id: I5b4e8d74339aae6f1c6b945f45b8378bb563e8be Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/406843 (cherry-picked from commit 4e35d12b2059140beb58554633c6b3f291e6fec7) Reviewed-on: http://git-master/r/413226 Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com> Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c5
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c71
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.h15
3 files changed, 16 insertions, 75 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index 19880da4d82a..aa63f499f85c 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -609,8 +609,9 @@ static void gk20a_remove_support(struct platform_device *dev)
{
struct gk20a *g = get_gk20a(dev);
- /* pmu support should already be removed when driver turns off
- gpu power rail in prepapre_poweroff */
+ if (g->pmu.remove_support)
+ g->pmu.remove_support(&g->pmu);
+
if (g->gk20a_cdev.gk20a_cooling_dev)
thermal_cooling_device_unregister(g->gk20a_cdev.gk20a_cooling_dev);
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index 8e2a62ded331..32db00ecef41 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -1491,57 +1491,11 @@ static int pmu_queue_close(struct pmu_gk20a *pmu,
return 0;
}
-static void gk20a_save_pmu_sw_state(struct pmu_gk20a *pmu,
- struct gk20a_pmu_save_state *save)
-{
- save->seq = pmu->seq;
- save->next_seq_desc = pmu->next_seq_desc;
- save->mutex = pmu->mutex;
- save->mutex_cnt = pmu->mutex_cnt;
- save->desc = pmu->desc;
- save->ucode = pmu->ucode;
- save->elpg_enable = pmu->elpg_enable;
- save->pg_wq = pmu->pg_wq;
- save->seq_buf = pmu->seq_buf;
- save->pg_buf = pmu->pg_buf;
- save->sw_ready = pmu->sw_ready;
- save->pg_init = pmu->pg_init;
-}
-
-static void gk20a_restore_pmu_sw_state(struct pmu_gk20a *pmu,
- struct gk20a_pmu_save_state *save)
-{
- pmu->seq = save->seq;
- pmu->next_seq_desc = save->next_seq_desc;
- pmu->mutex = save->mutex;
- pmu->mutex_cnt = save->mutex_cnt;
- pmu->desc = save->desc;
- pmu->ucode = save->ucode;
- pmu->elpg_enable = save->elpg_enable;
- pmu->pg_wq = save->pg_wq;
- pmu->seq_buf = save->seq_buf;
- pmu->pg_buf = save->pg_buf;
- pmu->sw_ready = save->sw_ready;
- pmu->pg_init = save->pg_init;
-}
-
void gk20a_remove_pmu_support(struct pmu_gk20a *pmu)
{
- struct gk20a_pmu_save_state save;
-
gk20a_dbg_fn("");
gk20a_allocator_destroy(&pmu->dmem);
-
- /* Save the stuff you don't want to lose */
- gk20a_save_pmu_sw_state(pmu, &save);
-
- /* this function is also called by pmu_destory outside gk20a deinit that
- releases gk20a struct so fill up with zeros here. */
- memset(pmu, 0, sizeof(struct pmu_gk20a));
-
- /* Restore stuff you want to keep */
- gk20a_restore_pmu_sw_state(pmu, &save);
}
int gk20a_init_pmu_reset_enable_hw(struct gk20a *g)
@@ -2197,7 +2151,7 @@ static int pmu_init_perfmon(struct pmu_gk20a *pmu)
struct pmu_payload payload;
u32 seq;
u32 data;
- int err;
+ int err = 0;
gk20a_dbg_fn("");
@@ -2247,8 +2201,9 @@ static int pmu_init_perfmon(struct pmu_gk20a *pmu)
pwr_pmu_idle_ctrl_filter_disabled_f());
gk20a_writel(g, pwr_pmu_idle_ctrl_r(2), data);
- pmu->sample_buffer = 0;
- err = pmu->dmem.alloc(&pmu->dmem, &pmu->sample_buffer, 2 * sizeof(u16));
+ if (!pmu->sample_buffer)
+ err = pmu->dmem.alloc(&pmu->dmem,
+ &pmu->sample_buffer, 2 * sizeof(u16));
if (err) {
gk20a_err(dev_from_gk20a(g),
"failed to allocate perfmon sample buffer");
@@ -2347,10 +2302,11 @@ static int pmu_process_init_msg(struct pmu_gk20a *pmu,
for (i = 0; i < PMU_QUEUE_COUNT; i++)
pmu_queue_init(pmu, i, init);
- gk20a_allocator_init(&pmu->dmem, "gk20a_pmu_dmem",
- pv->get_pmu_init_msg_pmu_sw_mg_off(init),
- pv->get_pmu_init_msg_pmu_sw_mg_size(init),
- PMU_DMEM_ALLOC_ALIGNMENT);
+ if (!pmu->dmem.alloc)
+ gk20a_allocator_init(&pmu->dmem, "gk20a_pmu_dmem",
+ pv->get_pmu_init_msg_pmu_sw_mg_off(init),
+ pv->get_pmu_init_msg_pmu_sw_mg_size(init),
+ PMU_DMEM_ALLOC_ALIGNMENT);
pmu->pmu_ready = true;
@@ -3448,11 +3404,10 @@ int gk20a_pmu_destroy(struct gk20a *g)
g->pg_gating_cnt += gating_cnt;
pmu_enable(pmu, false);
-
- if (pmu->remove_support) {
- pmu->remove_support(pmu);
- pmu->remove_support = NULL;
- }
+ pmu->pmu_ready = false;
+ pmu->perfmon_ready = false;
+ pmu->zbc_ready = false;
+ pmu->elpg_ready = false;
gk20a_dbg_fn("done");
return 0;
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
index de519bf67b62..7cc351bf292a 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
@@ -1051,21 +1051,6 @@ struct pmu_gk20a {
};
};
-struct gk20a_pmu_save_state {
- struct pmu_sequence *seq;
- u32 next_seq_desc;
- struct pmu_mutex *mutex;
- u32 mutex_cnt;
- struct pmu_ucode_desc *desc;
- struct pmu_mem_desc ucode;
- struct pmu_mem_desc seq_buf;
- struct pmu_mem_desc pg_buf;
- struct delayed_work elpg_enable;
- wait_queue_head_t pg_wq;
- bool sw_ready;
- struct work_struct pg_init;
-};
-
int gk20a_init_pmu_support(struct gk20a *g);
int gk20a_init_pmu_setup_hw2(struct gk20a *g);