]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
gpu: nvgpu: Do not clear PMU state on rail gate
authorTerje Bergstrom <tbergstrom@nvidia.com>
Thu, 8 May 2014 08:45:39 +0000 (11:45 +0300)
committerMandar Padmawar <mpadmawar@nvidia.com>
Tue, 3 Jun 2014 14:33:45 +0000 (07:33 -0700)
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>
drivers/gpu/nvgpu/gk20a/gk20a.c
drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
drivers/gpu/nvgpu/gk20a/pmu_gk20a.h

index 19880da4d82a5738c1231c29ed11405c4d74e0fe..aa63f499f85c6e20267293bd14e9265cb1e01d77 100644 (file)
@@ -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);
 
index 8e2a62ded33139e9e7a371eb8ede62d194826274..32db00ecef41c805b38f20e353536f9c0942d1b1 100644 (file)
@@ -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;
index de519bf67b62d82c41fd1c0242ed14ae2bcda5af..7cc351bf292afffb489fd2427f72ad63f5758611 100644 (file)
@@ -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);