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