diff options
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 90 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 93 |
2 files changed, 91 insertions, 92 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index 1dc5603f..817cb98d 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |||
@@ -55,6 +55,7 @@ | |||
55 | 55 | ||
56 | #define BLK_SIZE (256) | 56 | #define BLK_SIZE (256) |
57 | 57 | ||
58 | static int gk20a_init_gr_bind_fecs_elpg(struct gk20a *g); | ||
58 | static int gr_gk20a_commit_inst(struct channel_gk20a *c, u64 gpu_va); | 59 | static int gr_gk20a_commit_inst(struct channel_gk20a *c, u64 gpu_va); |
59 | 60 | ||
60 | /* global ctx buffer */ | 61 | /* global ctx buffer */ |
@@ -4560,6 +4561,91 @@ clean_up: | |||
4560 | return err; | 4561 | return err; |
4561 | } | 4562 | } |
4562 | 4563 | ||
4564 | static int gk20a_init_gr_bind_fecs_elpg(struct gk20a *g) | ||
4565 | { | ||
4566 | struct pmu_gk20a *pmu = &g->pmu; | ||
4567 | struct mm_gk20a *mm = &g->mm; | ||
4568 | struct vm_gk20a *vm = &mm->pmu.vm; | ||
4569 | struct device *d = dev_from_gk20a(g); | ||
4570 | int err = 0; | ||
4571 | |||
4572 | u32 size; | ||
4573 | struct sg_table *sgt_pg_buf; | ||
4574 | dma_addr_t iova; | ||
4575 | |||
4576 | gk20a_dbg_fn(""); | ||
4577 | |||
4578 | size = 0; | ||
4579 | |||
4580 | err = gr_gk20a_fecs_get_reglist_img_size(g, &size); | ||
4581 | if (err) { | ||
4582 | gk20a_err(dev_from_gk20a(g), | ||
4583 | "fail to query fecs pg buffer size"); | ||
4584 | return err; | ||
4585 | } | ||
4586 | |||
4587 | if (!pmu->pg_buf.cpuva) { | ||
4588 | pmu->pg_buf.cpuva = dma_alloc_coherent(d, size, | ||
4589 | &iova, | ||
4590 | GFP_KERNEL); | ||
4591 | if (!pmu->pg_buf.cpuva) { | ||
4592 | gk20a_err(d, "failed to allocate memory\n"); | ||
4593 | return -ENOMEM; | ||
4594 | } | ||
4595 | |||
4596 | pmu->pg_buf.iova = iova; | ||
4597 | pmu->pg_buf.size = size; | ||
4598 | |||
4599 | err = gk20a_get_sgtable(d, &sgt_pg_buf, | ||
4600 | pmu->pg_buf.cpuva, | ||
4601 | pmu->pg_buf.iova, | ||
4602 | size); | ||
4603 | if (err) { | ||
4604 | gk20a_err(d, "failed to create sg table\n"); | ||
4605 | goto err_free_pg_buf; | ||
4606 | } | ||
4607 | |||
4608 | pmu->pg_buf.pmu_va = gk20a_gmmu_map(vm, | ||
4609 | &sgt_pg_buf, | ||
4610 | size, | ||
4611 | 0, /* flags */ | ||
4612 | gk20a_mem_flag_none); | ||
4613 | if (!pmu->pg_buf.pmu_va) { | ||
4614 | gk20a_err(d, "failed to map fecs pg buffer"); | ||
4615 | err = -ENOMEM; | ||
4616 | goto err_free_sgtable; | ||
4617 | } | ||
4618 | |||
4619 | gk20a_free_sgtable(&sgt_pg_buf); | ||
4620 | } | ||
4621 | |||
4622 | |||
4623 | err = gr_gk20a_fecs_set_reglist_bind_inst(g, mm->pmu.inst_block.cpu_pa); | ||
4624 | if (err) { | ||
4625 | gk20a_err(dev_from_gk20a(g), | ||
4626 | "fail to bind pmu inst to gr"); | ||
4627 | return err; | ||
4628 | } | ||
4629 | |||
4630 | err = gr_gk20a_fecs_set_reglist_virtual_addr(g, pmu->pg_buf.pmu_va); | ||
4631 | if (err) { | ||
4632 | gk20a_err(dev_from_gk20a(g), | ||
4633 | "fail to set pg buffer pmu va"); | ||
4634 | return err; | ||
4635 | } | ||
4636 | |||
4637 | return err; | ||
4638 | |||
4639 | err_free_sgtable: | ||
4640 | gk20a_free_sgtable(&sgt_pg_buf); | ||
4641 | err_free_pg_buf: | ||
4642 | dma_free_coherent(d, size, | ||
4643 | pmu->pg_buf.cpuva, pmu->pg_buf.iova); | ||
4644 | pmu->pg_buf.cpuva = NULL; | ||
4645 | pmu->pg_buf.iova = 0; | ||
4646 | return err; | ||
4647 | } | ||
4648 | |||
4563 | int gk20a_init_gr_support(struct gk20a *g) | 4649 | int gk20a_init_gr_support(struct gk20a *g) |
4564 | { | 4650 | { |
4565 | u32 err; | 4651 | u32 err; |
@@ -4581,6 +4667,10 @@ int gk20a_init_gr_support(struct gk20a *g) | |||
4581 | if (err) | 4667 | if (err) |
4582 | return err; | 4668 | return err; |
4583 | 4669 | ||
4670 | err = gk20a_init_gr_bind_fecs_elpg(g); | ||
4671 | if (err) | ||
4672 | return err; | ||
4673 | |||
4584 | /* GR is inialized, signal possible waiters */ | 4674 | /* GR is inialized, signal possible waiters */ |
4585 | g->gr.initialized = true; | 4675 | g->gr.initialized = true; |
4586 | wake_up(&g->gr.init_wq); | 4676 | wake_up(&g->gr.init_wq); |
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index 395afdd4..e60de70b 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |||
@@ -2174,93 +2174,11 @@ void pmu_setup_hw(struct work_struct *work) | |||
2174 | int gk20a_init_pmu_bind_fecs(struct gk20a *g) | 2174 | int gk20a_init_pmu_bind_fecs(struct gk20a *g) |
2175 | { | 2175 | { |
2176 | struct pmu_gk20a *pmu = &g->pmu; | 2176 | struct pmu_gk20a *pmu = &g->pmu; |
2177 | struct mm_gk20a *mm = &g->mm; | ||
2178 | struct vm_gk20a *vm = &mm->pmu.vm; | ||
2179 | struct device *d = dev_from_gk20a(g); | ||
2180 | struct pmu_cmd cmd; | 2177 | struct pmu_cmd cmd; |
2181 | u32 desc; | 2178 | u32 desc; |
2182 | int err; | 2179 | int err = 0; |
2183 | u32 size; | ||
2184 | struct sg_table *sgt_pg_buf; | ||
2185 | dma_addr_t iova; | ||
2186 | |||
2187 | gk20a_dbg_fn(""); | 2180 | gk20a_dbg_fn(""); |
2188 | 2181 | ||
2189 | size = 0; | ||
2190 | err = gr_gk20a_fecs_get_reglist_img_size(g, &size); | ||
2191 | if (err && (pmu->pmu_state == PMU_STATE_ELPG_BOOTED)) { | ||
2192 | gk20a_err(dev_from_gk20a(g), | ||
2193 | "fail to query fecs pg buffer size"); | ||
2194 | return err; | ||
2195 | } | ||
2196 | |||
2197 | if (err) { | ||
2198 | gk20a_err(dev_from_gk20a(g), | ||
2199 | "fail to query fecs pg buffer size invalid boot state"); | ||
2200 | return err; | ||
2201 | } | ||
2202 | |||
2203 | if (!pmu->pg_buf.cpuva) { | ||
2204 | pmu->pg_buf.cpuva = dma_alloc_coherent(d, size, | ||
2205 | &iova, | ||
2206 | GFP_KERNEL); | ||
2207 | if (!pmu->pg_buf.cpuva) { | ||
2208 | gk20a_err(d, "failed to allocate memory\n"); | ||
2209 | return -ENOMEM; | ||
2210 | } | ||
2211 | |||
2212 | pmu->pg_buf.iova = iova; | ||
2213 | pmu->pg_buf.size = size; | ||
2214 | |||
2215 | err = gk20a_get_sgtable(d, &sgt_pg_buf, | ||
2216 | pmu->pg_buf.cpuva, | ||
2217 | pmu->pg_buf.iova, | ||
2218 | size); | ||
2219 | if (err) { | ||
2220 | gk20a_err(d, "failed to create sg table\n"); | ||
2221 | goto err_free_pg_buf; | ||
2222 | } | ||
2223 | |||
2224 | pmu->pg_buf.pmu_va = gk20a_gmmu_map(vm, | ||
2225 | &sgt_pg_buf, | ||
2226 | size, | ||
2227 | 0, /* flags */ | ||
2228 | gk20a_mem_flag_none); | ||
2229 | if (!pmu->pg_buf.pmu_va) { | ||
2230 | gk20a_err(d, "failed to map fecs pg buffer"); | ||
2231 | err = -ENOMEM; | ||
2232 | goto err_free_sgtable; | ||
2233 | } | ||
2234 | |||
2235 | gk20a_free_sgtable(&sgt_pg_buf); | ||
2236 | } | ||
2237 | |||
2238 | err = gr_gk20a_fecs_set_reglist_bind_inst(g, mm->pmu.inst_block.cpu_pa); | ||
2239 | if (err && (pmu->pmu_state == PMU_STATE_ELPG_BOOTED)) { | ||
2240 | gk20a_err(dev_from_gk20a(g), | ||
2241 | "fail to bind pmu inst to gr"); | ||
2242 | return err; | ||
2243 | } | ||
2244 | |||
2245 | if (err) { | ||
2246 | gk20a_err(dev_from_gk20a(g), | ||
2247 | "fail to bind pmu inst to gr invalid boot state"); | ||
2248 | return err; | ||
2249 | } | ||
2250 | |||
2251 | err = gr_gk20a_fecs_set_reglist_virtual_addr(g, pmu->pg_buf.pmu_va); | ||
2252 | if (err && (pmu->pmu_state == PMU_STATE_ELPG_BOOTED)) { | ||
2253 | gk20a_err(dev_from_gk20a(g), | ||
2254 | "fail to set pg buffer pmu va"); | ||
2255 | return err; | ||
2256 | } | ||
2257 | |||
2258 | if (err) { | ||
2259 | gk20a_err(dev_from_gk20a(g), | ||
2260 | "fail to set pg buffer pmu va invalid boot state"); | ||
2261 | return err; | ||
2262 | } | ||
2263 | |||
2264 | memset(&cmd, 0, sizeof(struct pmu_cmd)); | 2182 | memset(&cmd, 0, sizeof(struct pmu_cmd)); |
2265 | cmd.hdr.unit_id = PMU_UNIT_PG; | 2183 | cmd.hdr.unit_id = PMU_UNIT_PG; |
2266 | cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_eng_buf_load); | 2184 | cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_eng_buf_load); |
@@ -2278,15 +2196,6 @@ int gk20a_init_pmu_bind_fecs(struct gk20a *g) | |||
2278 | pmu_handle_pg_buf_config_msg, pmu, &desc, ~0); | 2196 | pmu_handle_pg_buf_config_msg, pmu, &desc, ~0); |
2279 | pmu->pmu_state = PMU_STATE_LOADING_PG_BUF; | 2197 | pmu->pmu_state = PMU_STATE_LOADING_PG_BUF; |
2280 | return err; | 2198 | return err; |
2281 | |||
2282 | err_free_sgtable: | ||
2283 | gk20a_free_sgtable(&sgt_pg_buf); | ||
2284 | err_free_pg_buf: | ||
2285 | dma_free_coherent(d, size, | ||
2286 | pmu->pg_buf.cpuva, pmu->pg_buf.iova); | ||
2287 | pmu->pg_buf.cpuva = NULL; | ||
2288 | pmu->pg_buf.iova = 0; | ||
2289 | return err; | ||
2290 | } | 2199 | } |
2291 | 2200 | ||
2292 | static void pmu_setup_hw_load_zbc(struct gk20a *g) | 2201 | static void pmu_setup_hw_load_zbc(struct gk20a *g) |