static void gk20a_ltc_init_cbc(struct gk20a *g, struct gr_gk20a *gr) { u32 max_size = gr->max_comptag_mem; u32 max_comptag_lines = max_size << 3; u32 compbit_base_post_divide; u64 compbit_base_post_multiply64; u64 compbit_store_iova; u64 compbit_base_post_divide64; if (tegra_platform_is_linsim()) compbit_store_iova = gk20a_mem_phys(&gr->compbit_store.mem); else compbit_store_iova = g->ops.mm.get_iova_addr(g, gr->compbit_store.mem.sgt->sgl, 0); compbit_base_post_divide64 = compbit_store_iova >> ltc_ltcs_ltss_cbc_base_alignment_shift_v(); do_div(compbit_base_post_divide64, g->ltc_count); compbit_base_post_divide = u64_lo32(compbit_base_post_divide64); compbit_base_post_multiply64 = ((u64)compbit_base_post_divide * g->ltc_count) << ltc_ltcs_ltss_cbc_base_alignment_shift_v(); if (compbit_base_post_multiply64 < compbit_store_iova) compbit_base_post_divide++; /* Bug 1477079 indicates sw adjustment on the posted divided base. */ if (g->ops.ltc.cbc_fix_config) compbit_base_post_divide = g->ops.ltc.cbc_fix_config(g, compbit_base_post_divide); gk20a_writel(g, ltc_ltcs_ltss_cbc_base_r(), compbit_base_post_divide); gk20a_dbg(gpu_dbg_info | gpu_dbg_map | gpu_dbg_pte, "compbit base.pa: 0x%x,%08x cbc_base:0x%08x\n", (u32)(compbit_store_iova >> 32), (u32)(compbit_store_iova & 0xffffffff), compbit_base_post_divide); gr->compbit_store.base_hw = compbit_base_post_divide; g->ops.ltc.cbc_ctrl(g, gk20a_cbc_op_invalidate, 0, max_comptag_lines - 1); }
static void gk20a_ltc_init_cbc(struct gk20a *g, struct gr_gk20a *gr) { u32 max_size = gr->max_comptag_mem; u32 max_comptag_lines = max_size << 3; u32 compbit_base_post_divide; u64 compbit_base_post_multiply64; u64 compbit_store_base_iova; u64 compbit_base_post_divide64; if (IS_ENABLED(CONFIG_GK20A_PHYS_PAGE_TABLES)) compbit_store_base_iova = gr->compbit_store.base_iova; else compbit_store_base_iova = NV_MC_SMMU_VADDR_TRANSLATE( gr->compbit_store.base_iova); compbit_base_post_divide64 = compbit_store_base_iova >> ltc_ltcs_ltss_cbc_base_alignment_shift_v(); do_div(compbit_base_post_divide64, gr->num_fbps); compbit_base_post_divide = u64_lo32(compbit_base_post_divide64); compbit_base_post_multiply64 = ((u64)compbit_base_post_divide * gr->num_fbps) << ltc_ltcs_ltss_cbc_base_alignment_shift_v(); if (compbit_base_post_multiply64 < compbit_store_base_iova) compbit_base_post_divide++; gk20a_writel(g, ltc_ltcs_ltss_cbc_base_r(), compbit_base_post_divide); gk20a_dbg(gpu_dbg_info | gpu_dbg_map | gpu_dbg_pte, "compbit base.pa: 0x%x,%08x cbc_base:0x%08x\n", (u32)(compbit_store_base_iova >> 32), (u32)(compbit_store_base_iova & 0xffffffff), compbit_base_post_divide); g->ops.ltc.cbc_ctrl(g, gk20a_cbc_op_invalidate, 0, max_comptag_lines - 1); }