gpu: nvgpu: Avoid resetting CDE flag
sujeet baranwal [Tue, 6 Oct 2015 16:07:24 +0000 (09:07 -0700)]
While loading the context, erstwhile set CDE flag was being
overwritten by copying code of golden context, thus losing
the information. This was not letting the CDE info reach
to the ucode, and T1 was not configured to 128B mem access.

Bug 200096226

Change-Id: Iaec1471fbcbffd63f8f3919088c7e9295074419d
Signed-off-by: sujeet baranwal <sbaranwal@nvidia.com>
Reviewed-on: http://git-master/r/811741
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: Roopa Ranganathan <rranganathan@nvidia.com>

drivers/gpu/nvgpu/gk20a/cde_gk20a.c
drivers/gpu/nvgpu/gk20a/gk20a.h
drivers/gpu/nvgpu/gk20a/gr_gk20a.c
drivers/gpu/nvgpu/gk20a/hw_ctxsw_prog_gk20a.h
drivers/gpu/nvgpu/gm20b/gr_gm20b.c
drivers/gpu/nvgpu/gm20b/hw_ctxsw_prog_gm20b.h

index 539c773..f148c65 100644 (file)
@@ -488,7 +488,7 @@ static int gk20a_init_cde_required_class(struct gk20a_cde_ctx *cde_ctx,
        alloc_obj_ctx.flags = 0;
 
        /* CDE enabled */
-       cde_ctx->ch->cde = 1;
+       cde_ctx->ch->cde = true;
 
        err = gk20a_alloc_obj_ctx(cde_ctx->ch, &alloc_obj_ctx);
        if (err) {
index 360262b..def40ba 100644 (file)
@@ -180,6 +180,7 @@ struct gpu_ops {
                int (*wait_empty)(struct gk20a *g, unsigned long end_jiffies,
                       u32 expect_delay);
                void (*init_cyclestats)(struct gk20a *g);
+               void (*enable_cde_in_fecs)(void *ctx_ptr);
        } gr;
        const char *name;
        struct {
index 88f2d85..a855bd6 100644 (file)
@@ -1613,7 +1613,7 @@ int gr_gk20a_load_golden_ctx_image(struct gk20a *g,
        struct channel_ctx_gk20a *ch_ctx = &c->ch_ctx;
        u32 virt_addr_lo;
        u32 virt_addr_hi;
-       u32 i, v, data, cde_v;
+       u32 i, v, data;
        int ret = 0;
        void *ctx_ptr = NULL;
 
@@ -1632,18 +1632,12 @@ int gr_gk20a_load_golden_ctx_image(struct gk20a *g,
        if (!ctx_ptr)
                return -ENOMEM;
 
-       /* Enable CDE in FECS header. Default cde = 0, is disabled,
-        * so no need to do anythign in else {}
-        */
-       if (c->cde) {
-               cde_v = gk20a_mem_rd32(ctx_ptr + ctxsw_prog_main_image_ctl_o(), 0);
-               cde_v |=  ctxsw_prog_main_image_ctl_cde_enabled_f();
-               gk20a_mem_wr32(ctx_ptr + ctxsw_prog_main_image_ctl_o(), 0, cde_v);
-       }
-
        for (i = 0; i < gr->ctx_vars.golden_image_size / 4; i++)
                gk20a_mem_wr32(ctx_ptr, i, gr->ctx_vars.local_golden_image[i]);
 
+       if (g->ops.gr.enable_cde_in_fecs && c->cde)
+               g->ops.gr.enable_cde_in_fecs(ctx_ptr);
+
        gk20a_mem_wr32(ctx_ptr + ctxsw_prog_main_image_num_save_ops_o(), 0, 0);
        gk20a_mem_wr32(ctx_ptr + ctxsw_prog_main_image_num_restore_ops_o(), 0, 0);
 
index bfefc33..4e3fae1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2012-2015, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -58,22 +58,6 @@ static inline u32 ctxsw_prog_main_image_num_gpcs_o(void)
 {
        return 0x00000008;
 }
-static inline u32 ctxsw_prog_main_image_ctl_o(void)
-{
-       return 0x0000000c;
-}
-static inline u32 ctxsw_prog_main_image_ctl_cde_v(u32 r)
-{
-       return (r >> 10) & 0x1;
-}
-static inline u32 ctxsw_prog_main_image_ctl_cde_enabled_f(void)
-{
-       return 0x400;
-}
-static inline u32 ctxsw_prog_main_image_ctl_cde_disabled_f(void)
-{
-       return 0x0;
-}
 static inline u32 ctxsw_prog_main_image_patch_count_o(void)
 {
        return 0x00000010;
index 106b2ee..e291507 100644 (file)
@@ -1052,6 +1052,15 @@ static void gr_gm20b_init_cyclestats(struct gk20a *g)
 #endif
 }
 
+void gr_gm20b_enable_cde_in_fecs(void *ctx_ptr)
+{
+       u32 cde_v;
+
+       cde_v = gk20a_mem_rd32(ctx_ptr + ctxsw_prog_main_image_ctl_o(), 0);
+       cde_v |=  ctxsw_prog_main_image_ctl_cde_enabled_f();
+       gk20a_mem_wr32(ctx_ptr + ctxsw_prog_main_image_ctl_o(), 0, cde_v);
+}
+
 void gm20b_init_gr(struct gpu_ops *gops)
 {
        gops->gr.init_gpc_mmu = gr_gm20b_init_gpc_mmu;
@@ -1107,4 +1116,5 @@ void gm20b_init_gr(struct gpu_ops *gops)
        gops->gr.init_sm_dsm_reg_info = gr_gm20b_init_sm_dsm_reg_info;
        gops->gr.wait_empty = gr_gk20a_wait_idle;
        gops->gr.init_cyclestats = gr_gm20b_init_cyclestats;
+       gops->gr.enable_cde_in_fecs = gr_gm20b_enable_cde_in_fecs;
 }
index 805a44a..34f8a6a 100644 (file)
@@ -62,10 +62,6 @@ static inline u32 ctxsw_prog_main_image_ctl_o(void)
 {
        return 0x0000000c;
 }
-static inline u32 ctxsw_prog_main_image_ctl_cde_v(u32 r)
-{
-       return (r >> 10) & 0x1;
-}
 static inline u32 ctxsw_prog_main_image_ctl_cde_enabled_f(void)
 {
        return 0x400;