static int gk20a_ltc_alloc_phys_cbc(struct gk20a *g, size_t compbit_backing_size) { struct gr_gk20a *gr = &g->gr; int order = ffs(compbit_backing_size >> PAGE_SHIFT); struct page *pages; struct sg_table *sgt; int err = 0; /* allocate few pages */ pages = alloc_pages(GFP_KERNEL, order); if (!pages) { gk20a_dbg(gpu_dbg_pte, "alloc_pages failed\n"); err = -ENOMEM; goto err_alloc_pages; } /* clean up the pages */ memset(page_address(pages), 0, compbit_backing_size); /* allocate room for placing the pages pointer.. */ gr->compbit_store.pages = kzalloc(sizeof(*gr->compbit_store.pages), GFP_KERNEL); if (!gr->compbit_store.pages) { gk20a_dbg(gpu_dbg_pte, "failed to allocate pages struct"); err = -ENOMEM; goto err_alloc_compbit_store; } err = gk20a_get_sgtable_from_pages(&g->dev->dev, &sgt, &pages, 0, compbit_backing_size); if (err) { gk20a_dbg(gpu_dbg_pte, "could not get sg table for pages\n"); goto err_alloc_sg_table; } /* store the parameters to gr structure */ *gr->compbit_store.pages = pages; gr->compbit_store.base_iova = sg_phys(sgt->sgl); gr->compbit_store.size = compbit_backing_size; gr->compbit_store.sgt = sgt; return 0; err_alloc_sg_table: kfree(gr->compbit_store.pages); gr->compbit_store.pages = NULL; err_alloc_compbit_store: __free_pages(pages, order); err_alloc_pages: return err; }
void gk20a_priv_ring_isr(struct gk20a *g) { u32 status0, status1; u32 cmd; s32 retry = 100; if (tegra_platform_is_linsim()) return; status0 = gk20a_readl(g, pri_ringmaster_intr_status0_r()); status1 = gk20a_readl(g, pri_ringmaster_intr_status1_r()); gk20a_dbg(gpu_dbg_intr, "ringmaster intr status0: 0x%08x," "status1: 0x%08x", status0, status1); if (status0 & (0x1 | 0x2 | 0x4)) { gk20a_reset_priv_ring(g); } if (status0 & 0x100) { gk20a_dbg(gpu_dbg_intr, "SYS write error. ADR %08x WRDAT %08x INFO %08x, CODE %08x", gk20a_readl(g, 0x122120), gk20a_readl(g, 0x122124), gk20a_readl(g, 0x122128), gk20a_readl(g, 0x12212c)); } if (status1 & 0x1) { gk20a_dbg(gpu_dbg_intr, "GPC write error. ADR %08x WRDAT %08x INFO %08x, CODE %08x", gk20a_readl(g, 0x128120), gk20a_readl(g, 0x128124), gk20a_readl(g, 0x128128), gk20a_readl(g, 0x12812c)); } cmd = gk20a_readl(g, pri_ringmaster_command_r()); cmd = set_field(cmd, pri_ringmaster_command_cmd_m(), pri_ringmaster_command_cmd_ack_interrupt_f()); gk20a_writel(g, pri_ringmaster_command_r(), cmd); do { cmd = pri_ringmaster_command_cmd_v( gk20a_readl(g, pri_ringmaster_command_r())); usleep_range(20, 40); } while (cmd != pri_ringmaster_command_cmd_no_cmd_v() && --retry); if (retry <= 0) gk20a_warn(dev_from_gk20a(g), "priv ringmaster cmd ack too many retries"); status0 = gk20a_readl(g, pri_ringmaster_intr_status0_r()); status1 = gk20a_readl(g, pri_ringmaster_intr_status1_r()); gk20a_dbg_info("ringmaster intr status0: 0x%08x," " status1: 0x%08x", status0, status1); }
int gr_gk20a_init_ctx_vars_sim(struct gk20a *g, struct gr_gk20a *gr) { int err = 0; u32 i, temp; char *size_path = NULL; char *reg_path = NULL; char *value_path = NULL; gk20a_dbg(gpu_dbg_fn | gpu_dbg_info, "querying grctx info from chiplib"); g->gr.ctx_vars.dynamic = true; g->gr.netlist = GR_NETLIST_DYNAMIC; /* query sizes and counts */ gk20a_sim_esc_readl(g, "GRCTX_UCODE_INST_FECS_COUNT", 0, &g->gr.ctx_vars.ucode.fecs.inst.count); gk20a_sim_esc_readl(g, "GRCTX_UCODE_DATA_FECS_COUNT", 0, &g->gr.ctx_vars.ucode.fecs.data.count); gk20a_sim_esc_readl(g, "GRCTX_UCODE_INST_GPCCS_COUNT", 0, &g->gr.ctx_vars.ucode.gpccs.inst.count); gk20a_sim_esc_readl(g, "GRCTX_UCODE_DATA_GPCCS_COUNT", 0, &g->gr.ctx_vars.ucode.gpccs.data.count); gk20a_sim_esc_readl(g, "GRCTX_ALL_CTX_TOTAL_WORDS", 0, &temp); g->gr.ctx_vars.buffer_size = temp << 2; gk20a_sim_esc_readl(g, "GRCTX_SW_BUNDLE_INIT_SIZE", 0, &g->gr.ctx_vars.sw_bundle_init.count); gk20a_sim_esc_readl(g, "GRCTX_SW_METHOD_INIT_SIZE", 0, &g->gr.ctx_vars.sw_method_init.count); gk20a_sim_esc_readl(g, "GRCTX_SW_CTX_LOAD_SIZE", 0, &g->gr.ctx_vars.sw_ctx_load.count); switch (0) { /*g->gr.ctx_vars.reg_init_override)*/ #if 0 case NV_REG_STR_RM_GR_REG_INIT_OVERRIDE_PROD_DIFF: sizePath = "GRCTX_NONCTXSW_PROD_DIFF_REG_SIZE"; regPath = "GRCTX_NONCTXSW_PROD_DIFF_REG:REG"; valuePath = "GRCTX_NONCTXSW_PROD_DIFF_REG:VALUE"; break; #endif default: size_path = "GRCTX_NONCTXSW_REG_SIZE"; reg_path = "GRCTX_NONCTXSW_REG:REG"; value_path = "GRCTX_NONCTXSW_REG:VALUE"; break; } gk20a_sim_esc_readl(g, size_path, 0, &g->gr.ctx_vars.sw_non_ctx_load.count); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_SYS_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.sys.count); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_GPC_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.gpc.count); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_TPC_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.tpc.count); #if 0 /* looks to be unused, actually chokes the sim */ gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PPC_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.ppc.count); #endif gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_ZCULL_GPC_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.zcull_gpc.count); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_SYS_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.pm_sys.count); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_GPC_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.pm_gpc.count); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_TPC_COUNT", 0, &g->gr.ctx_vars.ctxsw_regs.pm_tpc.count); err |= !alloc_u32_list_gk20a(&g->gr.ctx_vars.ucode.fecs.inst); err |= !alloc_u32_list_gk20a(&g->gr.ctx_vars.ucode.fecs.data); err |= !alloc_u32_list_gk20a(&g->gr.ctx_vars.ucode.gpccs.inst); err |= !alloc_u32_list_gk20a(&g->gr.ctx_vars.ucode.gpccs.data); err |= !alloc_av_list_gk20a(&g->gr.ctx_vars.sw_bundle_init); err |= !alloc_av_list_gk20a(&g->gr.ctx_vars.sw_method_init); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.sw_ctx_load); err |= !alloc_av_list_gk20a(&g->gr.ctx_vars.sw_non_ctx_load); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.sys); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.gpc); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.tpc); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.zcull_gpc); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.ppc); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.pm_sys); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.pm_gpc); err |= !alloc_aiv_list_gk20a(&g->gr.ctx_vars.ctxsw_regs.pm_tpc); if (err) goto fail; for (i = 0; i < g->gr.ctx_vars.ucode.fecs.inst.count; i++) gk20a_sim_esc_readl(g, "GRCTX_UCODE_INST_FECS", i, &g->gr.ctx_vars.ucode.fecs.inst.l[i]); for (i = 0; i < g->gr.ctx_vars.ucode.fecs.data.count; i++) gk20a_sim_esc_readl(g, "GRCTX_UCODE_DATA_FECS", i, &g->gr.ctx_vars.ucode.fecs.data.l[i]); for (i = 0; i < g->gr.ctx_vars.ucode.gpccs.inst.count; i++) gk20a_sim_esc_readl(g, "GRCTX_UCODE_INST_GPCCS", i, &g->gr.ctx_vars.ucode.gpccs.inst.l[i]); for (i = 0; i < g->gr.ctx_vars.ucode.gpccs.data.count; i++) gk20a_sim_esc_readl(g, "GRCTX_UCODE_DATA_GPCCS", i, &g->gr.ctx_vars.ucode.gpccs.data.l[i]); for (i = 0; i < g->gr.ctx_vars.sw_bundle_init.count; i++) { struct av_gk20a *l = g->gr.ctx_vars.sw_bundle_init.l; gk20a_sim_esc_readl(g, "GRCTX_SW_BUNDLE_INIT:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_SW_BUNDLE_INIT:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.sw_method_init.count; i++) { struct av_gk20a *l = g->gr.ctx_vars.sw_method_init.l; gk20a_sim_esc_readl(g, "GRCTX_SW_METHOD_INIT:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_SW_METHOD_INIT:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.sw_ctx_load.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.sw_ctx_load.l; gk20a_sim_esc_readl(g, "GRCTX_SW_CTX_LOAD:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_SW_CTX_LOAD:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_SW_CTX_LOAD:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.sw_non_ctx_load.count; i++) { struct av_gk20a *l = g->gr.ctx_vars.sw_non_ctx_load.l; gk20a_sim_esc_readl(g, reg_path, i, &l[i].addr); gk20a_sim_esc_readl(g, value_path, i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.sys.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.sys.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_SYS:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_SYS:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_SYS:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.gpc.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.gpc.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_GPC:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_GPC:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_GPC:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.tpc.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.tpc.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_TPC:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_TPC:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_TPC:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.ppc.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.ppc.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PPC:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PPC:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PPC:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.zcull_gpc.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.zcull_gpc.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_ZCULL_GPC:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_ZCULL_GPC:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_ZCULL_GPC:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.pm_sys.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.pm_sys.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_SYS:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_SYS:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_SYS:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.pm_gpc.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.pm_gpc.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_GPC:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_GPC:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_GPC:VALUE", i, &l[i].value); } for (i = 0; i < g->gr.ctx_vars.ctxsw_regs.pm_tpc.count; i++) { struct aiv_gk20a *l = g->gr.ctx_vars.ctxsw_regs.pm_tpc.l; gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_TPC:ADDR", i, &l[i].addr); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_TPC:INDEX", i, &l[i].index); gk20a_sim_esc_readl(g, "GRCTX_REG_LIST_PM_TPC:VALUE", i, &l[i].value); } g->gr.ctx_vars.valid = true; gk20a_sim_esc_readl(g, "GRCTX_GEN_CTX_REGS_BASE_INDEX", 0, &g->gr.ctx_vars.regs_base_index); gk20a_dbg(gpu_dbg_info | gpu_dbg_fn, "finished querying grctx info from chiplib"); return 0; fail: gk20a_err(dev_from_gk20a(g), "failed querying grctx info from chiplib"); return err; }