diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gp106/sec2_gp106.c')
-rw-r--r-- | drivers/gpu/nvgpu/gp106/sec2_gp106.c | 54 |
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 | ||