]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: host: Impl ctx buffer size calc
authorTerje Bergstrom <tbergstrom@nvidia.com>
Tue, 11 Feb 2014 13:19:41 +0000 (15:19 +0200)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Sat, 15 Feb 2014 14:24:41 +0000 (06:24 -0800)
Fix ctx buffer size calculation and use it in allocation function.

Bug 1453402

Change-Id: I3e9b1d4c910a14faf3ddf49eb34f7ab5ef7126e1
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/366022

drivers/video/tegra/host/gk20a/gk20a.h
drivers/video/tegra/host/gk20a/gr_gk20a.c

index 965388178e27991299b5ddb523db0f5c504bfe12..11231e607d07d795d5d8fe2dadfb7591e2e2b2c4 100644 (file)
@@ -64,7 +64,7 @@ struct gpu_ops {
                void (*access_smpc_reg)(struct gk20a *g, u32 quad, u32 offset);
                void (*bundle_cb_defaults)(struct gk20a *g);
                void (*cb_size_default)(struct gk20a *g);
-               void (*calc_global_ctx_buffer_size)(struct gk20a *g);
+               int (*calc_global_ctx_buffer_size)(struct gk20a *g);
                void (*commit_global_attrib_cb)(struct gk20a *g,
                                                struct channel_ctx_gk20a *ch_ctx,
                                                u64 addr, bool patch);
index 3201945ff92d7949757b97be0d82bb1cc5645631..8ed35390a81afa67c4125f507d7b1a6539c2d9c7 100644 (file)
@@ -2186,48 +2186,17 @@ static int gr_gk20a_alloc_global_ctx_buffers(struct gk20a *g)
        struct gr_gk20a *gr = &g->gr;
        struct mem_mgr *memmgr = mem_mgr_from_g(g);
        struct mem_handle *mem;
-       u32 i, attr_buffer_size;
+       int i, attr_buffer_size;
 
-       u32 cb_buffer_size = gr_scc_bundle_cb_size_div_256b__prod_v() *
+       u32 cb_buffer_size = gr->bundle_cb_default_size *
                gr_scc_bundle_cb_size_div_256b_byte_granularity_v();
 
        u32 pagepool_buffer_size = gr_scc_pagepool_total_pages_hwmax_value_v() *
                gr_scc_pagepool_total_pages_byte_granularity_v();
 
-       u32 attr_cb_default_size = gr_gpc0_ppc0_cbm_cfg_size_default_v();
-       u32 alpha_cb_default_size = gr_gpc0_ppc0_cbm_cfg2_size_default_v();
-
-       u32 attr_cb_size =
-               attr_cb_default_size + (attr_cb_default_size >> 1);
-       u32 alpha_cb_size =
-               alpha_cb_default_size + (alpha_cb_default_size >> 1);
-
-       u32 num_tpcs_per_pes = proj_scal_litter_num_tpcs_per_pes_v();
-       u32 attr_max_size_per_tpc =
-               gr_gpc0_ppc0_cbm_cfg_size_v(~0) / num_tpcs_per_pes;
-       u32 alpha_max_size_per_tpc =
-               gr_gpc0_ppc0_cbm_cfg2_size_v(~0) / num_tpcs_per_pes;
-
-
        nvhost_dbg_fn("");
 
-       attr_cb_size =
-               (attr_cb_size > attr_max_size_per_tpc) ?
-                       attr_max_size_per_tpc : attr_cb_size;
-       attr_cb_default_size =
-               (attr_cb_default_size > attr_cb_size) ?
-                       attr_cb_size : attr_cb_default_size;
-       alpha_cb_size =
-               (alpha_cb_size > alpha_max_size_per_tpc) ?
-                       alpha_max_size_per_tpc : alpha_cb_size;
-       alpha_cb_default_size =
-               (alpha_cb_default_size > alpha_cb_size) ?
-                       alpha_cb_size : alpha_cb_default_size;
-
-       attr_buffer_size =
-               (gr_gpc0_ppc0_cbm_cfg_size_granularity_v() * alpha_cb_size +
-                gr_gpc0_ppc0_cbm_cfg2_size_granularity_v() * alpha_cb_size) *
-                gr->gpc_count;
+       attr_buffer_size = g->ops.gr.calc_global_ctx_buffer_size(g);
 
        nvhost_dbg_info("cb_buffer_size : %d", cb_buffer_size);
 
@@ -6686,13 +6655,24 @@ static void gr_gk20a_cb_size_default(struct gk20a *g)
                gr_gpc0_ppc0_cbm_cfg2_size_default_v();
 }
 
-static void gr_gk20a_calc_global_ctx_buffer_size(struct gk20a *g)
+static int gr_gk20a_calc_global_ctx_buffer_size(struct gk20a *g)
 {
        struct gr_gk20a *gr = &g->gr;
+       int size;
 
        gr->attrib_cb_size = gr->attrib_cb_default_size;
        gr->alpha_cb_size = gr->alpha_cb_default_size
                + (gr->alpha_cb_default_size >> 1);
+
+       size = gr->attrib_cb_size *
+               gr_gpc0_ppc0_cbm_cfg_size_granularity_v() *
+               gr->max_tpc_count;
+
+       size += gr->alpha_cb_size *
+               gr_gpc0_ppc0_cbm_cfg2_size_granularity_v() *
+               gr->max_tpc_count;
+
+       return size;
 }
 
 void gk20a_init_gr(struct gpu_ops *gops)