diff --git a/drivers/gpu/nvgpu/common/falcon/falcon.c b/drivers/gpu/nvgpu/common/falcon/falcon.c index 5f778f95b..76944f431 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon.c @@ -608,23 +608,30 @@ int nvgpu_falcon_bl_bootstrap(struct nvgpu_falcon *flcn, struct nvgpu_falcon_bl_info *bl_info) { struct nvgpu_falcon_ops *flcn_ops; - int status = 0; + int status = -EINVAL; + u32 imem_size; if (flcn == NULL) { - return -EINVAL; + goto exit; } flcn_ops = &flcn->flcn_ops; - if (flcn_ops->bl_bootstrap != NULL) { - status = flcn_ops->bl_bootstrap(flcn, bl_info); - } - else { + if (flcn_ops->bl_bootstrap == NULL) { nvgpu_warn(flcn->g, "Invalid op on falcon 0x%x ", flcn->flcn_id); - status = -EINVAL; + goto exit; } + imem_size = flcn_ops->get_mem_size(flcn, MEM_IMEM); + if (bl_info->bl_size > imem_size) { + nvgpu_err(flcn->g, "bootloader size greater than IMEM size"); + goto exit; + } + + status = flcn_ops->bl_bootstrap(flcn, bl_info); + +exit: return status; } diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c b/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c index 75b39fd4c..5e6dd3566 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c @@ -367,7 +367,6 @@ static int gk20a_falcon_bl_bootstrap(struct nvgpu_falcon *flcn, struct nvgpu_falcon_bl_info *bl_info) { struct gk20a *g = flcn->g; - u32 base_addr = flcn->flcn_base; u32 virt_addr = 0; u32 imem_size; u32 dst = 0; @@ -381,14 +380,7 @@ static int gk20a_falcon_bl_bootstrap(struct nvgpu_falcon *flcn, } /* copy bootloader to TOP of IMEM */ - imem_size = falcon_falcon_hwcfg_imem_size_v(gk20a_readl(g, - base_addr + falcon_falcon_hwcfg_r())) << 8; - - if (bl_info->bl_size > imem_size) { - err = -EINVAL; - goto exit; - } - + imem_size = gk20a_falcon_get_mem_size(flcn, MEM_IMEM); dst = imem_size - bl_info->bl_size; err = gk20a_falcon_copy_to_imem(flcn, dst, (u8 *)(bl_info->bl_src),