From 7878824093972a6b8805dd8c00f1838e24a61ec0 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Wed, 18 Jun 2014 14:39:25 +0300 Subject: gpu: nvgpu: Separate PMU firmware load from init Separate the code to load PMU firmware from the software init. This allows folding ACR and non-ACR PMU software initialization sequences. Bug 200006956 Change-Id: I74b289747852167e8ebf1be63036c790ae634da4 Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/424768 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/gm20b/acr_gm20b.c | 151 +----------------------------------- 1 file changed, 1 insertion(+), 150 deletions(-) (limited to 'drivers/gpu/nvgpu/gm20b/acr_gm20b.c') diff --git a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c index 1a136cdb..2b7be4f7 100644 --- a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c @@ -68,7 +68,7 @@ void start_gm20b_pmu(struct gk20a *g) void gm20b_init_secure_pmu(struct gpu_ops *gops) { - gops->pmu.pmu_setup_sw = gm20b_pmu_setup_sw; + gops->pmu.prepare_ucode = prepare_ucode_blob; gops->pmu.pmu_setup_hw_and_bootstrap = gm20b_bootstrap_hs_flcn; } @@ -77,155 +77,6 @@ static void free_blob_res(struct gk20a *g) /*TODO */ } -int gm20b_pmu_setup_sw(struct gk20a *g) -{ - /*from pmu_gk20a.c*/ - struct pmu_gk20a *pmu = &g->pmu; - struct mm_gk20a *mm = &g->mm; - struct vm_gk20a *vm = &mm->pmu.vm; - struct device *d = dev_from_gk20a(g); - int i, err = 0; - u8 *ptr; - struct sg_table *sgt_seq_buf; - dma_addr_t iova; - - gk20a_dbg_fn(""); - /* Make any ACR structure settings here if ever need be*/ - - if (pmu->sw_ready) { - for (i = 0; i < pmu->mutex_cnt; i++) { - pmu->mutex[i].id = i; - pmu->mutex[i].index = i; - } - pmu_seq_init(pmu); - - mutex_init(&pmu->elpg_mutex); - mutex_init(&pmu->isr_mutex); - mutex_init(&pmu->pmu_copy_lock); - mutex_init(&pmu->pmu_seq_lock); - gk20a_dbg_fn("skip init"); - goto skip_init; - } - gm20b_dbg_pmu("gk20a_init_pmu_setup_sw 2\n"); - - /* TBD: sysmon subtask */ - - if (IS_ENABLED(CONFIG_TEGRA_GK20A_PERFMON)) - pmu->perfmon_sampling_enabled = true; - - pmu->mutex_cnt = pwr_pmu_mutex__size_1_v(); - pmu->mutex = kzalloc(pmu->mutex_cnt * - sizeof(struct pmu_mutex), GFP_KERNEL); - if (!pmu->mutex) { - err = -ENOMEM; - goto err; - } - - for (i = 0; i < pmu->mutex_cnt; i++) { - pmu->mutex[i].id = i; - pmu->mutex[i].index = i; - } - gm20b_dbg_pmu("gk20a_init_pmu_setup_sw 3\n"); - - pmu->seq = kzalloc(PMU_MAX_NUM_SEQUENCES * - sizeof(struct pmu_sequence), GFP_KERNEL); - if (!pmu->seq) { - err = -ENOMEM; - goto err_free_mutex; - } - - pmu_seq_init(pmu); - mutex_init(&pmu->elpg_mutex); - mutex_init(&pmu->isr_mutex); - mutex_init(&pmu->pmu_copy_lock); - mutex_init(&pmu->pmu_seq_lock); - - err = prepare_ucode_blob(g); - if (err) - goto err_free_seq; - INIT_WORK(&pmu->pg_init, pmu_setup_hw); - pmu->seq_buf.cpuva = dma_alloc_coherent(d, GK20A_PMU_SEQ_BUF_SIZE, - &iova, - GFP_KERNEL); - if (!pmu->seq_buf.cpuva) { - gk20a_err(d, "failed to allocate memory\n"); - err = -ENOMEM; - goto err_free_blob_res; - } - - pmu->seq_buf.iova = iova; - err = gk20a_get_sgtable(d, &sgt_seq_buf, - pmu->seq_buf.cpuva, - pmu->seq_buf.iova, - GK20A_PMU_SEQ_BUF_SIZE); - if (err) { - gk20a_err(d, "failed to allocate sg table\n"); - goto err_free_seq_buf; - } - - pmu->seq_buf.pmu_va = gk20a_gmmu_map(vm, &sgt_seq_buf, - GK20A_PMU_SEQ_BUF_SIZE, - 0, /* flags */ - gk20a_mem_flag_none); - if (!pmu->seq_buf.pmu_va) { - gk20a_err(d, "failed to map pmu ucode memory!!"); - goto err_free_seq_buf_sgt; - } - - ptr = (u8 *)pmu->seq_buf.cpuva; - if (!ptr) { - gk20a_err(d, "failed to map cpu ptr for zbc buffer"); - goto err_unmap_seq_buf; - } - - /* TBD: remove this if ZBC save/restore is handled by PMU - * end an empty ZBC sequence for now */ - ptr[0] = 0x16; /* opcode EXIT */ - ptr[1] = 0; ptr[2] = 1; ptr[3] = 0; - ptr[4] = 0; ptr[5] = 0; ptr[6] = 0; ptr[7] = 0; - - pmu->seq_buf.size = GK20A_PMU_SEQ_BUF_SIZE; - - gk20a_dbg_fn("done"); - gk20a_free_sgtable(&sgt_seq_buf); - - pmu->sw_ready = true; - -skip_init: - pmu->perfmon_counter.index = 3; /* GR & CE2 */ - pmu->perfmon_counter.group_id = PMU_DOMAIN_GROUP_PSTATE; - - pmu->remove_support = gk20a_remove_pmu_support; - err = gk20a_init_pmu(pmu); - if (err) { - gk20a_err(d, "failed to set function pointers\n"); - goto err_unmap_seq_buf; - } - - gk20a_dbg_fn("done"); - return 0; - - err_unmap_seq_buf: - gk20a_gmmu_unmap(vm, pmu->seq_buf.pmu_va, - GK20A_PMU_SEQ_BUF_SIZE, gk20a_mem_flag_none); - err_free_seq_buf_sgt: - gk20a_free_sgtable(&sgt_seq_buf); - err_free_seq_buf: - dma_free_coherent(d, GK20A_PMU_SEQ_BUF_SIZE, - pmu->seq_buf.cpuva, pmu->seq_buf.iova); - pmu->seq_buf.cpuva = NULL; - pmu->seq_buf.iova = 0; - err_free_blob_res: - free_blob_res(g); - err_free_seq: - kfree(pmu->seq); - err_free_mutex: - kfree(pmu->mutex); - err: - gk20a_dbg_fn("fail"); - return err; -} - int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img) { const struct firmware *pmu_fw; -- cgit v1.2.2