summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2018-06-20 14:42:01 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-07-10 02:40:10 -0400
commit4cd59404a2d4ab1c31605d96cff848dd4e93c3b4 (patch)
tree24884407db02f117d90cccb28b9e713731f18274 /drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
parent876953fbb85f9440bbcc1d7d59435593886b53c4 (diff)
gpu: nvgpu: falcon code cleanup
-Created common falcon function nvgpu_flcn_bl_bootstrap() to bootstrap falcon bootloader -Created HAL gk20a_falcon_bl_bootstrap() which does actual bootloader bootstrap by fetching parameters and loading code/parameters as needed. -Created HAL ops bl_bootstrap under nvgpu_falcon_ops. -Created struct nvgpu_falcon_bl_info to hold info required for bootloader to pass to common function -Removed falcons bootstrap code in multiple file & made changes to fill struct nvgpu_falcon_bl_info & call nvgpu_flcn_bl_bootstrap(). Change-Id: Iee275233915ff11f9afb5207ac0c3338ca9dacc1 Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1756104 Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: svc-misra-checker <svc-misra-checker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/flcn_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/flcn_gk20a.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c b/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
index 83850a19..520d9bb2 100644
--- a/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
@@ -432,6 +432,46 @@ static void gk20a_falcon_mailbox_write(struct nvgpu_falcon *flcn,
432 nvgpu_err(g, "incorrect mailbox id %d", mailbox_index); 432 nvgpu_err(g, "incorrect mailbox id %d", mailbox_index);
433} 433}
434 434
435static int gk20a_falcon_bl_bootstrap(struct nvgpu_falcon *flcn,
436 struct nvgpu_falcon_bl_info *bl_info)
437{
438 struct gk20a *g = flcn->g;
439 u32 base_addr = flcn->flcn_base;
440 u32 virt_addr = 0;
441 u32 dst = 0;
442 int err = 0;
443
444 /*copy bootloader interface structure to dmem*/
445 err = gk20a_flcn_copy_to_dmem(flcn, 0, (u8 *)bl_info->bl_desc,
446 bl_info->bl_desc_size, (u8)0);
447 if (err != 0) {
448 goto exit;
449 }
450
451 /* copy bootloader to TOP of IMEM */
452 dst = (falcon_falcon_hwcfg_imem_size_v(gk20a_readl(g,
453 base_addr + falcon_falcon_hwcfg_r())) << 8) - bl_info->bl_size;
454
455 err = gk20a_flcn_copy_to_imem(flcn, dst, (u8 *)(bl_info->bl_src),
456 bl_info->bl_size, (u8)0, false, bl_info->bl_start_tag);
457 if (err != 0) {
458 goto exit;
459 }
460
461 gk20a_falcon_mailbox_write(flcn, FALCON_MAILBOX_0, 0xDEADA5A5U);
462
463 virt_addr = bl_info->bl_start_tag << 8;
464
465 err = gk20a_falcon_bootstrap(flcn, virt_addr);
466
467exit:
468 if (err != 0) {
469 nvgpu_err(g, "falcon id-0x%x bootstrap failed", flcn->flcn_id);
470 }
471
472 return err;
473}
474
435static void gk20a_falcon_dump_imblk(struct nvgpu_falcon *flcn) 475static void gk20a_falcon_dump_imblk(struct nvgpu_falcon *flcn)
436{ 476{
437 struct gk20a *g = flcn->g; 477 struct gk20a *g = flcn->g;
@@ -644,6 +684,7 @@ void gk20a_falcon_ops(struct nvgpu_falcon *flcn)
644 flcn_ops->dump_falcon_stats = gk20a_falcon_dump_stats; 684 flcn_ops->dump_falcon_stats = gk20a_falcon_dump_stats;
645 flcn_ops->mailbox_read = gk20a_falcon_mailbox_read; 685 flcn_ops->mailbox_read = gk20a_falcon_mailbox_read;
646 flcn_ops->mailbox_write = gk20a_falcon_mailbox_write; 686 flcn_ops->mailbox_write = gk20a_falcon_mailbox_write;
687 flcn_ops->bl_bootstrap = gk20a_falcon_bl_bootstrap;
647 688
648 gk20a_falcon_engine_dependency_ops(flcn); 689 gk20a_falcon_engine_dependency_ops(flcn);
649} 690}