diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 40 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 19 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 94 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 3 |
4 files changed, 54 insertions, 102 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) |
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index 4b48b838..4f6c885c 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |||
@@ -1687,22 +1687,11 @@ static int gr_gk20a_init_ctxsw_ucode_vaspace(struct gk20a *g) | |||
1687 | u32 pde_addr_lo; | 1687 | u32 pde_addr_lo; |
1688 | u32 pde_addr_hi; | 1688 | u32 pde_addr_hi; |
1689 | u64 pde_addr; | 1689 | u64 pde_addr; |
1690 | dma_addr_t iova; | 1690 | int err; |
1691 | |||
1692 | /* Alloc mem of inst block */ | ||
1693 | ucode_info->inst_blk_desc.size = ram_in_alloc_size_v(); | ||
1694 | ucode_info->inst_blk_desc.cpuva = dma_alloc_coherent(d, | ||
1695 | ucode_info->inst_blk_desc.size, | ||
1696 | &iova, | ||
1697 | GFP_KERNEL); | ||
1698 | if (!ucode_info->inst_blk_desc.cpuva) { | ||
1699 | gk20a_err(d, "failed to allocate memory\n"); | ||
1700 | return -ENOMEM; | ||
1701 | } | ||
1702 | 1691 | ||
1703 | ucode_info->inst_blk_desc.iova = iova; | 1692 | err = gk20a_alloc_inst_block(g, &ucode_info->inst_blk_desc); |
1704 | ucode_info->inst_blk_desc.cpu_pa = gk20a_get_phys_from_iova(d, | 1693 | if (err) |
1705 | ucode_info->inst_blk_desc.iova); | 1694 | return err; |
1706 | 1695 | ||
1707 | inst_ptr = ucode_info->inst_blk_desc.cpuva; | 1696 | inst_ptr = ucode_info->inst_blk_desc.cpuva; |
1708 | 1697 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 7695f147..949237b1 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c | |||
@@ -2656,6 +2656,44 @@ static void gk20a_deinit_vm(struct vm_gk20a *vm) | |||
2656 | kfree(vm->pdes.ptes[gmmu_page_size_big]); | 2656 | kfree(vm->pdes.ptes[gmmu_page_size_big]); |
2657 | } | 2657 | } |
2658 | 2658 | ||
2659 | int gk20a_alloc_inst_block(struct gk20a *g, struct inst_desc *inst_block) | ||
2660 | { | ||
2661 | struct device *dev = dev_from_gk20a(g); | ||
2662 | dma_addr_t iova; | ||
2663 | |||
2664 | inst_block->size = ram_in_alloc_size_v(); | ||
2665 | inst_block->cpuva = dma_alloc_coherent(dev, inst_block->size, | ||
2666 | &iova, GFP_KERNEL); | ||
2667 | if (!inst_block->cpuva) { | ||
2668 | gk20a_err(dev, "%s: memory allocation failed\n", __func__); | ||
2669 | return -ENOMEM; | ||
2670 | } | ||
2671 | |||
2672 | inst_block->iova = iova; | ||
2673 | inst_block->cpu_pa = gk20a_get_phys_from_iova(dev, inst_block->iova); | ||
2674 | if (!inst_block->cpu_pa) { | ||
2675 | gk20a_err(dev, "%s: failed to get phys address\n", __func__); | ||
2676 | gk20a_free_inst_block(g, inst_block); | ||
2677 | return -ENOMEM; | ||
2678 | } | ||
2679 | |||
2680 | memset(inst_block->cpuva, 0, inst_block->size); | ||
2681 | |||
2682 | return 0; | ||
2683 | } | ||
2684 | |||
2685 | void gk20a_free_inst_block(struct gk20a *g, struct inst_desc *inst_block) | ||
2686 | { | ||
2687 | struct device *dev = dev_from_gk20a(g); | ||
2688 | |||
2689 | if (inst_block->cpuva) { | ||
2690 | dma_free_coherent(dev, inst_block->size, | ||
2691 | inst_block->cpuva, inst_block->iova); | ||
2692 | } | ||
2693 | |||
2694 | memset(inst_block, 0, sizeof(*inst_block)); | ||
2695 | } | ||
2696 | |||
2659 | static int gk20a_init_bar1_vm(struct mm_gk20a *mm) | 2697 | static int gk20a_init_bar1_vm(struct mm_gk20a *mm) |
2660 | { | 2698 | { |
2661 | int err; | 2699 | int err; |
@@ -2666,9 +2704,7 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) | |||
2666 | u64 pde_addr; | 2704 | u64 pde_addr; |
2667 | u32 pde_addr_lo; | 2705 | u32 pde_addr_lo; |
2668 | u32 pde_addr_hi; | 2706 | u32 pde_addr_hi; |
2669 | struct device *d = dev_from_gk20a(g); | ||
2670 | struct inst_desc *inst_block = &mm->bar1.inst_block; | 2707 | struct inst_desc *inst_block = &mm->bar1.inst_block; |
2671 | dma_addr_t iova; | ||
2672 | u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; | 2708 | u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; |
2673 | 2709 | ||
2674 | mm->bar1.aperture_size = bar1_aperture_size_mb_gk20a() << 20; | 2710 | mm->bar1.aperture_size = bar1_aperture_size_mb_gk20a() << 20; |
@@ -2683,23 +2719,9 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) | |||
2683 | pde_addr_lo = u64_lo32(pde_addr >> ram_in_base_shift_v()); | 2719 | pde_addr_lo = u64_lo32(pde_addr >> ram_in_base_shift_v()); |
2684 | pde_addr_hi = u64_hi32(pde_addr); | 2720 | pde_addr_hi = u64_hi32(pde_addr); |
2685 | 2721 | ||
2686 | /* allocate instance mem for bar1 */ | 2722 | err = gk20a_alloc_inst_block(g, inst_block); |
2687 | inst_block->size = ram_in_alloc_size_v(); | 2723 | if (err) |
2688 | inst_block->cpuva = dma_alloc_coherent(d, inst_block->size, | ||
2689 | &iova, GFP_KERNEL); | ||
2690 | if (!inst_block->cpuva) { | ||
2691 | gk20a_err(d, "%s: memory allocation failed\n", __func__); | ||
2692 | err = -ENOMEM; | ||
2693 | goto clean_up_va; | 2724 | goto clean_up_va; |
2694 | } | ||
2695 | |||
2696 | inst_block->iova = iova; | ||
2697 | inst_block->cpu_pa = gk20a_get_phys_from_iova(d, inst_block->iova); | ||
2698 | if (!inst_block->cpu_pa) { | ||
2699 | gk20a_err(d, "%s: failed to get phys address\n", __func__); | ||
2700 | err = -ENOMEM; | ||
2701 | goto clean_up_inst_block; | ||
2702 | } | ||
2703 | 2725 | ||
2704 | inst_pa = inst_block->cpu_pa; | 2726 | inst_pa = inst_block->cpu_pa; |
2705 | inst_ptr = inst_block->cpuva; | 2727 | inst_ptr = inst_block->cpuva; |
@@ -2707,8 +2729,6 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) | |||
2707 | gk20a_dbg_info("bar1 inst block physical phys = 0x%llx, kv = 0x%p", | 2729 | gk20a_dbg_info("bar1 inst block physical phys = 0x%llx, kv = 0x%p", |
2708 | (u64)inst_pa, inst_ptr); | 2730 | (u64)inst_pa, inst_ptr); |
2709 | 2731 | ||
2710 | memset(inst_ptr, 0, inst_block->size); | ||
2711 | |||
2712 | gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), | 2732 | gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), |
2713 | ram_in_page_dir_base_target_vid_mem_f() | | 2733 | ram_in_page_dir_base_target_vid_mem_f() | |
2714 | ram_in_page_dir_base_vol_true_f() | | 2734 | ram_in_page_dir_base_vol_true_f() | |
@@ -2729,12 +2749,6 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) | |||
2729 | gk20a_dbg_info("bar1 inst block ptr: %08llx", (u64)inst_pa); | 2749 | gk20a_dbg_info("bar1 inst block ptr: %08llx", (u64)inst_pa); |
2730 | return 0; | 2750 | return 0; |
2731 | 2751 | ||
2732 | clean_up_inst_block: | ||
2733 | if (inst_block->cpuva) | ||
2734 | dma_free_coherent(d, inst_block->size, | ||
2735 | inst_block->cpuva, inst_block->iova); | ||
2736 | inst_block->cpuva = NULL; | ||
2737 | inst_block->iova = 0; | ||
2738 | clean_up_va: | 2752 | clean_up_va: |
2739 | gk20a_deinit_vm(vm); | 2753 | gk20a_deinit_vm(vm); |
2740 | return err; | 2754 | return err; |
@@ -2751,9 +2765,7 @@ static int gk20a_init_system_vm(struct mm_gk20a *mm) | |||
2751 | u64 pde_addr; | 2765 | u64 pde_addr; |
2752 | u32 pde_addr_lo; | 2766 | u32 pde_addr_lo; |
2753 | u32 pde_addr_hi; | 2767 | u32 pde_addr_hi; |
2754 | struct device *d = dev_from_gk20a(g); | ||
2755 | struct inst_desc *inst_block = &mm->pmu.inst_block; | 2768 | struct inst_desc *inst_block = &mm->pmu.inst_block; |
2756 | dma_addr_t iova; | ||
2757 | u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; | 2769 | u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; |
2758 | 2770 | ||
2759 | mm->pmu.aperture_size = GK20A_PMU_VA_SIZE; | 2771 | mm->pmu.aperture_size = GK20A_PMU_VA_SIZE; |
@@ -2769,31 +2781,15 @@ static int gk20a_init_system_vm(struct mm_gk20a *mm) | |||
2769 | pde_addr_lo = u64_lo32(pde_addr >> ram_in_base_shift_v()); | 2781 | pde_addr_lo = u64_lo32(pde_addr >> ram_in_base_shift_v()); |
2770 | pde_addr_hi = u64_hi32(pde_addr); | 2782 | pde_addr_hi = u64_hi32(pde_addr); |
2771 | 2783 | ||
2772 | /* allocate instance mem for pmu */ | 2784 | err = gk20a_alloc_inst_block(g, inst_block); |
2773 | inst_block->size = ram_in_alloc_size_v(); | 2785 | if (err) |
2774 | inst_block->cpuva = dma_alloc_coherent(d, inst_block->size, | ||
2775 | &iova, GFP_KERNEL); | ||
2776 | if (!inst_block->cpuva) { | ||
2777 | gk20a_err(d, "%s: memory allocation failed\n", __func__); | ||
2778 | err = -ENOMEM; | ||
2779 | goto clean_up_va; | 2786 | goto clean_up_va; |
2780 | } | ||
2781 | |||
2782 | inst_block->iova = iova; | ||
2783 | inst_block->cpu_pa = gk20a_get_phys_from_iova(d, inst_block->iova); | ||
2784 | if (!inst_block->cpu_pa) { | ||
2785 | gk20a_err(d, "%s: failed to get phys address\n", __func__); | ||
2786 | err = -ENOMEM; | ||
2787 | goto clean_up_inst_block; | ||
2788 | } | ||
2789 | 2787 | ||
2790 | inst_pa = inst_block->cpu_pa; | 2788 | inst_pa = inst_block->cpu_pa; |
2791 | inst_ptr = inst_block->cpuva; | 2789 | inst_ptr = inst_block->cpuva; |
2792 | 2790 | ||
2793 | gk20a_dbg_info("pmu inst block physical addr: 0x%llx", (u64)inst_pa); | 2791 | gk20a_dbg_info("pmu inst block physical addr: 0x%llx", (u64)inst_pa); |
2794 | 2792 | ||
2795 | memset(inst_ptr, 0, inst_block->size); | ||
2796 | |||
2797 | gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), | 2793 | gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), |
2798 | ram_in_page_dir_base_target_vid_mem_f() | | 2794 | ram_in_page_dir_base_target_vid_mem_f() | |
2799 | ram_in_page_dir_base_vol_true_f() | | 2795 | ram_in_page_dir_base_vol_true_f() | |
@@ -2813,12 +2809,6 @@ static int gk20a_init_system_vm(struct mm_gk20a *mm) | |||
2813 | 2809 | ||
2814 | return 0; | 2810 | return 0; |
2815 | 2811 | ||
2816 | clean_up_inst_block: | ||
2817 | if (inst_block->cpuva) | ||
2818 | dma_free_coherent(d, inst_block->size, | ||
2819 | inst_block->cpuva, inst_block->iova); | ||
2820 | inst_block->cpuva = NULL; | ||
2821 | inst_block->iova = 0; | ||
2822 | clean_up_va: | 2812 | clean_up_va: |
2823 | gk20a_deinit_vm(vm); | 2813 | gk20a_deinit_vm(vm); |
2824 | return err; | 2814 | return err; |
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 6ccb6ab1..d3ee8670 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h | |||
@@ -389,6 +389,9 @@ static inline int max_vaddr_bits_gk20a(void) | |||
389 | #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v() | 389 | #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v() |
390 | #endif | 390 | #endif |
391 | 391 | ||
392 | int gk20a_alloc_inst_block(struct gk20a *g, struct inst_desc *inst_block); | ||
393 | void gk20a_free_inst_block(struct gk20a *g, struct inst_desc *inst_block); | ||
394 | |||
392 | void gk20a_mm_dump_vm(struct vm_gk20a *vm, | 395 | void gk20a_mm_dump_vm(struct vm_gk20a *vm, |
393 | u64 va_begin, u64 va_end, char *label); | 396 | u64 va_begin, u64 va_end, char *label); |
394 | 397 | ||