summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/acr_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/acr_gm20b.c45
1 files changed, 11 insertions, 34 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
index ee861933..3a638373 100644
--- a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
@@ -27,6 +27,7 @@
27#include <nvgpu/acr/nvgpu_acr.h> 27#include <nvgpu/acr/nvgpu_acr.h>
28#include <nvgpu/firmware.h> 28#include <nvgpu/firmware.h>
29#include <nvgpu/pmu.h> 29#include <nvgpu/pmu.h>
30#include <nvgpu/falcon.h>
30 31
31#include <nvgpu/linux/dma.h> 32#include <nvgpu/linux/dma.h>
32 33
@@ -1221,12 +1222,9 @@ static int bl_bootstrap(struct nvgpu_pmu *pmu,
1221 struct gk20a *g = gk20a_from_pmu(pmu); 1222 struct gk20a *g = gk20a_from_pmu(pmu);
1222 struct acr_desc *acr = &g->acr; 1223 struct acr_desc *acr = &g->acr;
1223 struct mm_gk20a *mm = &g->mm; 1224 struct mm_gk20a *mm = &g->mm;
1224 u32 imem_dst_blk = 0;
1225 u32 virt_addr = 0; 1225 u32 virt_addr = 0;
1226 u32 tag = 0;
1227 u32 index = 0;
1228 struct hsflcn_bl_desc *pmu_bl_gm10x_desc = g->acr.pmu_hsbl_desc; 1226 struct hsflcn_bl_desc *pmu_bl_gm10x_desc = g->acr.pmu_hsbl_desc;
1229 u32 *bl_ucode; 1227 u32 dst;
1230 1228
1231 gk20a_dbg_fn(""); 1229 gk20a_dbg_fn("");
1232 gk20a_writel(g, pwr_falcon_itfen_r(), 1230 gk20a_writel(g, pwr_falcon_itfen_r(),
@@ -1238,42 +1236,21 @@ static int bl_bootstrap(struct nvgpu_pmu *pmu,
1238 pwr_pmu_new_instblk_valid_f(1) | 1236 pwr_pmu_new_instblk_valid_f(1) |
1239 pwr_pmu_new_instblk_target_sys_coh_f()); 1237 pwr_pmu_new_instblk_target_sys_coh_f());
1240 1238
1241 /* TBD: load all other surfaces */
1242 /*copy bootloader interface structure to dmem*/ 1239 /*copy bootloader interface structure to dmem*/
1243 gk20a_writel(g, pwr_falcon_dmemc_r(0),
1244 pwr_falcon_dmemc_offs_f(0) |
1245 pwr_falcon_dmemc_blk_f(0) |
1246 pwr_falcon_dmemc_aincw_f(1));
1247 nvgpu_flcn_copy_to_dmem(pmu->flcn, 0, (u8 *)pbl_desc, 1240 nvgpu_flcn_copy_to_dmem(pmu->flcn, 0, (u8 *)pbl_desc,
1248 sizeof(struct flcn_bl_dmem_desc), 0); 1241 sizeof(struct flcn_bl_dmem_desc), 0);
1249 /*TODO This had to be copied to bl_desc_dmem_load_off, but since
1250 * this is 0, so ok for now*/
1251
1252 /* Now copy bootloader to TOP of IMEM */
1253 imem_dst_blk = (pwr_falcon_hwcfg_imem_size_v(
1254 gk20a_readl(g, pwr_falcon_hwcfg_r()))) - bl_sz/256;
1255
1256 /* Set Auto-Increment on write */
1257 gk20a_writel(g, pwr_falcon_imemc_r(0),
1258 pwr_falcon_imemc_offs_f(0) |
1259 pwr_falcon_imemc_blk_f(imem_dst_blk) |
1260 pwr_falcon_imemc_aincw_f(1));
1261 virt_addr = pmu_bl_gm10x_desc->bl_start_tag << 8;
1262 tag = virt_addr >> 8; /* tag is always 256B aligned */
1263 bl_ucode = (u32 *)(acr->hsbl_ucode.cpu_va);
1264 for (index = 0; index < bl_sz/4; index++) {
1265 if ((index % 64) == 0) {
1266 gk20a_writel(g, pwr_falcon_imemt_r(0),
1267 (tag & 0xffff) << 0);
1268 tag++;
1269 }
1270 gk20a_writel(g, pwr_falcon_imemd_r(0),
1271 bl_ucode[index] & 0xffffffff);
1272 }
1273 1242
1274 gk20a_writel(g, pwr_falcon_imemt_r(0), (0 & 0xffff) << 0); 1243 /* copy bootloader to TOP of IMEM */
1244 dst = (pwr_falcon_hwcfg_imem_size_v(
1245 gk20a_readl(g, pwr_falcon_hwcfg_r())) << 8) - bl_sz;
1246
1247 nvgpu_flcn_copy_to_imem(pmu->flcn, dst,
1248 (u8 *)(acr->hsbl_ucode.cpu_va), bl_sz, 0, 0,
1249 pmu_bl_gm10x_desc->bl_start_tag);
1250
1275 gm20b_dbg_pmu("Before starting falcon with BL\n"); 1251 gm20b_dbg_pmu("Before starting falcon with BL\n");
1276 1252
1253 virt_addr = pmu_bl_gm10x_desc->bl_start_tag << 8;
1277 gk20a_writel(g, pwr_falcon_bootvec_r(), 1254 gk20a_writel(g, pwr_falcon_bootvec_r(),
1278 pwr_falcon_bootvec_vec_f(virt_addr)); 1255 pwr_falcon_bootvec_vec_f(virt_addr));
1279 1256