summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp106/sec2_gp106.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gp106/sec2_gp106.c')
-rw-r--r--drivers/gpu/nvgpu/gp106/sec2_gp106.c54
1 files changed, 11 insertions, 43 deletions
diff --git a/drivers/gpu/nvgpu/gp106/sec2_gp106.c b/drivers/gpu/nvgpu/gp106/sec2_gp106.c
index 0f265710..ccd1b3ad 100644
--- a/drivers/gpu/nvgpu/gp106/sec2_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/sec2_gp106.c
@@ -12,19 +12,11 @@
12 */ 12 */
13 13
14#include <nvgpu/pmu.h> 14#include <nvgpu/pmu.h>
15#include <nvgpu/falcon.h>
15 16
16#include "gk20a/gk20a.h" 17#include "gk20a/gk20a.h"
17#include "gk20a/pmu_gk20a.h"
18
19#include "gm20b/pmu_gm20b.h"
20
21#include "gp10b/pmu_gp10b.h"
22
23#include "gp106/pmu_gp106.h"
24
25#include "sec2_gp106.h" 18#include "sec2_gp106.h"
26 19
27#include <nvgpu/hw/gp106/hw_mc_gp106.h>
28#include <nvgpu/hw/gp106/hw_pwr_gp106.h> 20#include <nvgpu/hw/gp106/hw_pwr_gp106.h>
29#include <nvgpu/hw/gp106/hw_psec_gp106.h> 21#include <nvgpu/hw/gp106/hw_psec_gp106.h>
30 22
@@ -73,13 +65,10 @@ int bl_bootstrap_sec2(struct nvgpu_pmu *pmu,
73 struct gk20a *g = gk20a_from_pmu(pmu); 65 struct gk20a *g = gk20a_from_pmu(pmu);
74 struct acr_desc *acr = &g->acr; 66 struct acr_desc *acr = &g->acr;
75 struct mm_gk20a *mm = &g->mm; 67 struct mm_gk20a *mm = &g->mm;
76 u32 imem_dst_blk = 0;
77 u32 virt_addr = 0; 68 u32 virt_addr = 0;
78 u32 tag = 0;
79 u32 index = 0;
80 struct hsflcn_bl_desc *pmu_bl_gm10x_desc = g->acr.pmu_hsbl_desc; 69 struct hsflcn_bl_desc *pmu_bl_gm10x_desc = g->acr.pmu_hsbl_desc;
81 u32 *bl_ucode;
82 u32 data = 0; 70 u32 data = 0;
71 u32 dst;
83 72
84 gk20a_dbg_fn(""); 73 gk20a_dbg_fn("");
85 74
@@ -104,44 +93,23 @@ int bl_bootstrap_sec2(struct nvgpu_pmu *pmu,
104 data |= (1 << 3); 93 data |= (1 << 3);
105 gk20a_writel(g, psec_falcon_engctl_r(), data); 94 gk20a_writel(g, psec_falcon_engctl_r(), data);
106 95
107 /* TBD: load all other surfaces */
108 /*copy bootloader interface structure to dmem*/ 96 /*copy bootloader interface structure to dmem*/
109 gk20a_writel(g, psec_falcon_dmemc_r(0),
110 psec_falcon_dmemc_offs_f(0) |
111 psec_falcon_dmemc_blk_f(0) |
112 psec_falcon_dmemc_aincw_f(1));
113 nvgpu_flcn_copy_to_dmem(&g->sec2_flcn, 0, (u8 *)desc, 97 nvgpu_flcn_copy_to_dmem(&g->sec2_flcn, 0, (u8 *)desc,
114 sizeof(struct flcn_bl_dmem_desc), 0); 98 sizeof(struct flcn_bl_dmem_desc), 0);
115 /*TODO This had to be copied to bl_desc_dmem_load_off, but since 99
116 * this is 0, so ok for now*/ 100 /* copy bootloader to TOP of IMEM */
117 101 dst = (psec_falcon_hwcfg_imem_size_v(
118 /* Now copy bootloader to TOP of IMEM */ 102 gk20a_readl(g, psec_falcon_hwcfg_r())) << 8) - bl_sz;
119 imem_dst_blk = (psec_falcon_hwcfg_imem_size_v( 103
120 gk20a_readl(g, psec_falcon_hwcfg_r()))) - bl_sz/256; 104 nvgpu_flcn_copy_to_imem(&g->sec2_flcn, dst,
121 105 (u8 *)(acr->hsbl_ucode.cpu_va), bl_sz, 0, 0,
122 /* Set Auto-Increment on write */ 106 pmu_bl_gm10x_desc->bl_start_tag);
123 gk20a_writel(g, psec_falcon_imemc_r(0),
124 psec_falcon_imemc_offs_f(0) |
125 psec_falcon_imemc_blk_f(imem_dst_blk) |
126 psec_falcon_imemc_aincw_f(1));
127 virt_addr = pmu_bl_gm10x_desc->bl_start_tag << 8;
128 tag = virt_addr >> 8; /* tag is always 256B aligned */
129 bl_ucode = (u32 *)(acr->hsbl_ucode.cpu_va);
130 for (index = 0; index < bl_sz/4; index++) {
131 if ((index % 64) == 0) {
132 gk20a_writel(g, psec_falcon_imemt_r(0),
133 (tag & 0xffff) << 0);
134 tag++;
135 }
136 gk20a_writel(g, psec_falcon_imemd_r(0),
137 bl_ucode[index] & 0xffffffff);
138 }
139 gk20a_writel(g, psec_falcon_imemt_r(0), (0 & 0xffff) << 0);
140 107
141 gm20b_dbg_pmu("Before starting falcon with BL\n"); 108 gm20b_dbg_pmu("Before starting falcon with BL\n");
142 109
143 gk20a_writel(g, psec_falcon_mailbox0_r(), 0xDEADA5A5); 110 gk20a_writel(g, psec_falcon_mailbox0_r(), 0xDEADA5A5);
144 111
112 virt_addr = pmu_bl_gm10x_desc->bl_start_tag << 8;
145 gk20a_writel(g, psec_falcon_bootvec_r(), 113 gk20a_writel(g, psec_falcon_bootvec_r(),
146 psec_falcon_bootvec_vec_f(virt_addr)); 114 psec_falcon_bootvec_vec_f(virt_addr));
147 115