diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 45fa58f19..076bf89f2 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1124,6 +1124,9 @@ struct gpu_ops { int (*init)(struct gk20a *g); int (*preos_wait_for_halt)(struct gk20a *g); void (*preos_reload_check)(struct gk20a *g); + int (*devinit)(struct gk20a *g); + int (*preos)(struct gk20a *g); + int (*verify_devinit)(struct gk20a *g); } bios; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/gp106/bios_gp106.c b/drivers/gpu/nvgpu/gp106/bios_gp106.c index 3363aebad..b102eef2d 100644 --- a/drivers/gpu/nvgpu/gp106/bios_gp106.c +++ b/drivers/gpu/nvgpu/gp106/bios_gp106.c @@ -73,7 +73,7 @@ static void upload_data(struct gk20a *g, u32 dst, u8 *src, u32 size, u8 port) gk20a_writel(g, pwr_falcon_dmemd_r(port), src_u32[i]); } -static int gp106_bios_devinit(struct gk20a *g) +int gp106_bios_devinit(struct gk20a *g) { int err = 0; int devinit_completed; @@ -142,7 +142,7 @@ int gp106_bios_preos_wait_for_halt(struct gk20a *g) return err; } -static int gp106_bios_preos(struct gk20a *g) +int gp106_bios_preos(struct gk20a *g) { int err = 0; @@ -220,19 +220,31 @@ int gp106_bios_init(struct gk20a *g) nvgpu_log_fn(g, "done"); - err = gp106_bios_devinit(g); - if (err) { - nvgpu_err(g, "devinit failed"); - goto free_firmware; + if (g->ops.bios.devinit) { + err = g->ops.bios.devinit(g); + if (err) { + nvgpu_err(g, "devinit failed"); + goto free_firmware; + } } - if (nvgpu_is_enabled(g, NVGPU_PMU_RUN_PREOS)) { - err = gp106_bios_preos(g); + if (nvgpu_is_enabled(g, NVGPU_PMU_RUN_PREOS) && + g->ops.bios.preos) { + err = g->ops.bios.preos(g); if (err) { nvgpu_err(g, "pre-os failed"); goto free_firmware; } } + + if (g->ops.bios.verify_devinit) { + err = g->ops.bios.verify_devinit(g); + if (err) { + nvgpu_err(g, "devinit status verification failed"); + goto free_firmware; + } + } + g->bios_is_init = true; return 0; diff --git a/drivers/gpu/nvgpu/gp106/bios_gp106.h b/drivers/gpu/nvgpu/gp106/bios_gp106.h index a5229fff5..37ec91e6e 100644 --- a/drivers/gpu/nvgpu/gp106/bios_gp106.h +++ b/drivers/gpu/nvgpu/gp106/bios_gp106.h @@ -28,4 +28,6 @@ struct gpu_ops; int gp106_bios_init(struct gk20a *g); int gp106_bios_preos_wait_for_halt(struct gk20a *g); +int gp106_bios_devinit(struct gk20a *g); +int gp106_bios_preos(struct gk20a *g); #endif diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c index 4111ac7d4..66123fabd 100644 --- a/drivers/gpu/nvgpu/gp106/hal_gp106.c +++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c @@ -234,6 +234,9 @@ static const struct gpu_ops gp106_ops = { .bios = { .init = gp106_bios_init, .preos_wait_for_halt = gp106_bios_preos_wait_for_halt, + .devinit = gp106_bios_devinit, + .preos = gp106_bios_preos, + .verify_devinit = NULL, }, .ltc = { .determine_L2_size_bytes = gp10b_determine_L2_size_bytes, diff --git a/drivers/gpu/nvgpu/gv100/hal_gv100.c b/drivers/gpu/nvgpu/gv100/hal_gv100.c index 4a7106894..595dbdaf6 100644 --- a/drivers/gpu/nvgpu/gv100/hal_gv100.c +++ b/drivers/gpu/nvgpu/gv100/hal_gv100.c @@ -263,6 +263,9 @@ static const struct gpu_ops gv100_ops = { .init = gp106_bios_init, .preos_wait_for_halt = gv100_bios_preos_wait_for_halt, .preos_reload_check = gv100_bios_preos_reload_check, + .devinit = gp106_bios_devinit, + .preos = gp106_bios_preos, + .verify_devinit = NULL, }, .ltc = { .determine_L2_size_bytes = gp10b_determine_L2_size_bytes,