diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 40 |
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 | ||
342 | int channel_gk20a_alloc_inst(struct gk20a *g, struct channel_gk20a *ch) | 342 | int 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 | |||
376 | clean_up: | ||
377 | gk20a_err(d, "fail"); | ||
378 | g->ops.fifo.free_inst(g, ch); | ||
379 | return err; | ||
380 | } | 357 | } |
381 | 358 | ||
382 | void channel_gk20a_free_inst(struct gk20a *g, struct channel_gk20a *ch) | 359 | void 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 | ||
394 | static int channel_gk20a_update_runlist(struct channel_gk20a *c, bool add) | 364 | static int channel_gk20a_update_runlist(struct channel_gk20a *c, bool add) |