summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
diff options
context:
space:
mode:
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}