summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.c40
1 files changed, 5 insertions, 35 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
index a54e3a6c..648450ae 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
@@ -341,54 +341,24 @@ void channel_gk20a_unbind(struct channel_gk20a *ch_gk20a)
341 341
342int channel_gk20a_alloc_inst(struct gk20a *g, struct channel_gk20a *ch) 342int channel_gk20a_alloc_inst(struct gk20a *g, struct channel_gk20a *ch)
343{ 343{
344 struct device *d = dev_from_gk20a(g); 344 int err;
345 int err = 0;
346 dma_addr_t iova;
347 345
348 gk20a_dbg_fn(""); 346 gk20a_dbg_fn("");
349 347
350 ch->inst_block.size = ram_in_alloc_size_v(); 348 err = gk20a_alloc_inst_block(g, &ch->inst_block);
351 ch->inst_block.cpuva = dma_alloc_coherent(d, 349 if (err)
352 ch->inst_block.size, 350 return err;
353 &iova,
354 GFP_KERNEL);
355 if (!ch->inst_block.cpuva) {
356 gk20a_err(d, "%s: memory allocation failed\n", __func__);
357 err = -ENOMEM;
358 goto clean_up;
359 }
360
361 ch->inst_block.iova = iova;
362 ch->inst_block.cpu_pa = gk20a_get_phys_from_iova(d,
363 ch->inst_block.iova);
364 if (!ch->inst_block.cpu_pa) {
365 gk20a_err(d, "%s: failed to get physical address\n", __func__);
366 err = -ENOMEM;
367 goto clean_up;
368 }
369 351
370 gk20a_dbg_info("channel %d inst block physical addr: 0x%16llx", 352 gk20a_dbg_info("channel %d inst block physical addr: 0x%16llx",
371 ch->hw_chid, (u64)ch->inst_block.cpu_pa); 353 ch->hw_chid, (u64)ch->inst_block.cpu_pa);
372 354
373 gk20a_dbg_fn("done"); 355 gk20a_dbg_fn("done");
374 return 0; 356 return 0;
375
376clean_up:
377 gk20a_err(d, "fail");
378 g->ops.fifo.free_inst(g, ch);
379 return err;
380} 357}
381 358
382void channel_gk20a_free_inst(struct gk20a *g, struct channel_gk20a *ch) 359void channel_gk20a_free_inst(struct gk20a *g, struct channel_gk20a *ch)
383{ 360{
384 struct device *d = dev_from_gk20a(g); 361 gk20a_free_inst_block(g, &ch->inst_block);
385
386 if (ch->inst_block.cpuva)
387 dma_free_coherent(d, ch->inst_block.size,
388 ch->inst_block.cpuva, ch->inst_block.iova);
389 ch->inst_block.cpuva = NULL;
390 ch->inst_block.iova = 0;
391 memset(&ch->inst_block, 0, sizeof(struct inst_desc));
392} 362}
393 363
394static int channel_gk20a_update_runlist(struct channel_gk20a *c, bool add) 364static int channel_gk20a_update_runlist(struct channel_gk20a *c, bool add)