gpu: nvgpu: Query ctx image size only once

Newer netlist does not require image size queries to boot. Save 2ms
from GPU boot time by skipping it if we know the sizes.

Bug 1435870

Change-Id: Ie1b13c8a6e420adf06e635bde8b469385e1d5c60
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/419873
This commit is contained in:
Terje Bergstrom
2014-06-06 09:33:36 +03:00
committed by Dan Willemsen
parent 7f991657c1
commit 91d83a078c

View File

@@ -2207,9 +2207,7 @@ static int gr_gk20a_wait_ctxsw_ready(struct gk20a *g)
static int gr_gk20a_init_ctx_state(struct gk20a *g, struct gr_gk20a *gr) static int gr_gk20a_init_ctx_state(struct gk20a *g, struct gr_gk20a *gr)
{ {
u32 golden_ctx_image_size = 0; u32 pm_ctx_image_size;
u32 zcull_ctx_image_size = 0;
u32 pm_ctx_image_size = 0;
u32 ret; u32 ret;
struct fecs_method_op_gk20a op = { struct fecs_method_op_gk20a op = {
.mailbox = { .id = 0, .data = 0, .mailbox = { .id = 0, .data = 0,
@@ -2220,23 +2218,27 @@ static int gr_gk20a_init_ctx_state(struct gk20a *g, struct gr_gk20a *gr)
}; };
gk20a_dbg_fn(""); gk20a_dbg_fn("");
op.method.addr = gr_fecs_method_push_adr_discover_image_size_v(); if (!g->gr.ctx_vars.golden_image_size) {
op.mailbox.ret = &golden_ctx_image_size; op.method.addr =
gr_fecs_method_push_adr_discover_image_size_v();
op.mailbox.ret = &g->gr.ctx_vars.golden_image_size;
ret = gr_gk20a_submit_fecs_method_op(g, op); ret = gr_gk20a_submit_fecs_method_op(g, op);
if (ret) { if (ret) {
gk20a_err(dev_from_gk20a(g), gk20a_err(dev_from_gk20a(g),
"query golden image size failed"); "query golden image size failed");
return ret; return ret;
} }
op.method.addr = gr_fecs_method_push_adr_discover_zcull_image_size_v(); op.method.addr =
op.mailbox.ret = &zcull_ctx_image_size; gr_fecs_method_push_adr_discover_zcull_image_size_v();
op.mailbox.ret = &g->gr.ctx_vars.zcull_ctxsw_image_size;
ret = gr_gk20a_submit_fecs_method_op(g, op); ret = gr_gk20a_submit_fecs_method_op(g, op);
if (ret) { if (ret) {
gk20a_err(dev_from_gk20a(g), gk20a_err(dev_from_gk20a(g),
"query zcull ctx image size failed"); "query zcull ctx image size failed");
return ret; return ret;
} }
op.method.addr = gr_fecs_method_push_adr_discover_pm_image_size_v(); op.method.addr =
gr_fecs_method_push_adr_discover_pm_image_size_v();
op.mailbox.ret = &pm_ctx_image_size; op.mailbox.ret = &pm_ctx_image_size;
ret = gr_gk20a_submit_fecs_method_op(g, op); ret = gr_gk20a_submit_fecs_method_op(g, op);
if (ret) { if (ret) {
@@ -2244,18 +2246,8 @@ static int gr_gk20a_init_ctx_state(struct gk20a *g, struct gr_gk20a *gr)
"query pm ctx image size failed"); "query pm ctx image size failed");
return ret; return ret;
} }
if (!g->gr.ctx_vars.golden_image_size &&
!g->gr.ctx_vars.zcull_ctxsw_image_size) {
g->gr.ctx_vars.golden_image_size = golden_ctx_image_size;
g->gr.ctx_vars.zcull_ctxsw_image_size = zcull_ctx_image_size;
} else {
/* hw is different after railgating? */
BUG_ON(g->gr.ctx_vars.golden_image_size != golden_ctx_image_size);
BUG_ON(g->gr.ctx_vars.zcull_ctxsw_image_size != zcull_ctx_image_size);
}
g->gr.ctx_vars.priv_access_map_size = 512 * 1024; g->gr.ctx_vars.priv_access_map_size = 512 * 1024;
}
gk20a_dbg_fn("done"); gk20a_dbg_fn("done");
return 0; return 0;