From c71e7643482ce76bbc194686db812219e65358cc Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Fri, 26 Apr 2019 13:21:16 -0700 Subject: [PATCH] gpu: nvgpu: Remove alloc_inst_block from mm HAL The alloc_insty_block() function in the MM HAL is not a HAL. It does not abstract any HW accesses; instead it just wraps a dma allocation. As such remove it from the HAL and move the single gk20a implementation to common/mm/mm.c as nvgpu_alloc_inst_block(). JIRA NVGPU-2042 Change-Id: I0a586800a11cd230ca43b85f94a35de107f5d1e1 Signed-off-by: Alex Waterman Reviewed-on: https://git-master.nvidia.com/r/2109049 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/fifo/channel.c | 3 ++- drivers/gpu/nvgpu/common/gr/gr_falcon.c | 2 +- drivers/gpu/nvgpu/common/mm/mm.c | 24 +++++++++++++++---- drivers/gpu/nvgpu/common/perf/perfbuf.c | 3 ++- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 16 ------------- drivers/gpu/nvgpu/gp10b/mm_gp10b.c | 2 +- drivers/gpu/nvgpu/hal/init/hal_gm20b.c | 1 - drivers/gpu/nvgpu/hal/init/hal_gp10b.c | 1 - drivers/gpu/nvgpu/hal/init/hal_gv100.c | 1 - drivers/gpu/nvgpu/hal/init/hal_gv11b.c | 1 - drivers/gpu/nvgpu/hal/init/hal_tu104.c | 1 - drivers/gpu/nvgpu/include/nvgpu/gk20a.h | 2 -- drivers/gpu/nvgpu/include/nvgpu/mm.h | 1 + drivers/gpu/nvgpu/libnvgpu-drv.export | 2 +- .../units/mm/gmmu/page_table/page_table.c | 1 - .../mm/page_table_faults/page_table_faults.c | 13 +++++----- 16 files changed, 34 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/nvgpu/common/fifo/channel.c b/drivers/gpu/nvgpu/common/fifo/channel.c index 71c5383c1..0d2d842f1 100644 --- a/drivers/gpu/nvgpu/common/fifo/channel.c +++ b/drivers/gpu/nvgpu/common/fifo/channel.c @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -2503,7 +2504,7 @@ int nvgpu_channel_alloc_inst(struct gk20a *g, struct channel_gk20a *ch) nvgpu_log_fn(g, " "); - err = g->ops.mm.alloc_inst_block(g, &ch->inst_block); + err = nvgpu_alloc_inst_block(g, &ch->inst_block); if (err != 0) { return err; } diff --git a/drivers/gpu/nvgpu/common/gr/gr_falcon.c b/drivers/gpu/nvgpu/common/gr/gr_falcon.c index 49a96bdb1..4522d22b7 100644 --- a/drivers/gpu/nvgpu/common/gr/gr_falcon.c +++ b/drivers/gpu/nvgpu/common/gr/gr_falcon.c @@ -202,7 +202,7 @@ static int nvgpu_gr_falcon_init_ctxsw_ucode_vaspace(struct gk20a *g, struct nvgpu_ctxsw_ucode_info *ucode_info = &falcon->ctxsw_ucode_info; int err; - err = g->ops.mm.alloc_inst_block(g, &ucode_info->inst_blk_desc); + err = nvgpu_alloc_inst_block(g, &ucode_info->inst_blk_desc); if (err != 0) { return err; } diff --git a/drivers/gpu/nvgpu/common/mm/mm.c b/drivers/gpu/nvgpu/common/mm/mm.c index 4231067e8..6004455fa 100644 --- a/drivers/gpu/nvgpu/common/mm/mm.c +++ b/drivers/gpu/nvgpu/common/mm/mm.c @@ -168,6 +168,22 @@ void nvgpu_free_inst_block(struct gk20a *g, struct nvgpu_mem *inst_block) } } +int nvgpu_alloc_inst_block(struct gk20a *g, struct nvgpu_mem *inst_block) +{ + int err; + + nvgpu_log_fn(g, " "); + + err = nvgpu_dma_alloc(g, g->ops.ramin.alloc_size(), inst_block); + if (err != 0) { + nvgpu_err(g, "%s: memory allocation failed", __func__); + return err; + } + + nvgpu_log_fn(g, "done"); + return 0; +} + static int nvgpu_alloc_sysmem_flush(struct gk20a *g) { return nvgpu_dma_alloc_sys(g, SZ_4K, &g->mm.sysmem_flush); @@ -269,7 +285,7 @@ static int nvgpu_init_system_vm(struct mm_gk20a *mm) return -ENOMEM; } - err = g->ops.mm.alloc_inst_block(g, inst_block); + err = nvgpu_alloc_inst_block(g, inst_block); if (err != 0) { goto clean_up_vm; } @@ -288,7 +304,7 @@ static int nvgpu_init_hwpm(struct mm_gk20a *mm) struct gk20a *g = gk20a_from_mm(mm); struct nvgpu_mem *inst_block = &mm->hwpm.inst_block; - err = g->ops.mm.alloc_inst_block(g, inst_block); + err = nvgpu_alloc_inst_block(g, inst_block); if (err != 0) { return err; } @@ -411,7 +427,7 @@ static int nvgpu_init_bar1_vm(struct mm_gk20a *mm) return -ENOMEM; } - err = g->ops.mm.alloc_inst_block(g, inst_block); + err = nvgpu_alloc_inst_block(g, inst_block); if (err != 0) { goto clean_up_vm; } @@ -444,7 +460,7 @@ static int nvgpu_init_engine_ucode_vm(struct gk20a *g, } /* allocate instance mem for engine ucode */ - err = g->ops.mm.alloc_inst_block(g, inst_block); + err = nvgpu_alloc_inst_block(g, inst_block); if (err != 0) { goto clean_up_va; } diff --git a/drivers/gpu/nvgpu/common/perf/perfbuf.c b/drivers/gpu/nvgpu/common/perf/perfbuf.c index 92dd60c40..8c2e0b2f3 100644 --- a/drivers/gpu/nvgpu/common/perf/perfbuf.c +++ b/drivers/gpu/nvgpu/common/perf/perfbuf.c @@ -20,6 +20,7 @@ * DEALINGS IN THE SOFTWARE. */ +#include #include #include #include @@ -35,7 +36,7 @@ int nvgpu_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size) return err; } - err = g->ops.mm.alloc_inst_block(g, &mm->perfbuf.inst_block); + err = nvgpu_alloc_inst_block(g, &mm->perfbuf.inst_block); if (err != 0) { return err; } diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index cc6fc8d79..f09b4dbbb 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -100,22 +100,6 @@ void gk20a_init_inst_block(struct nvgpu_mem *inst_block, struct vm_gk20a *vm, } } -int gk20a_alloc_inst_block(struct gk20a *g, struct nvgpu_mem *inst_block) -{ - int err; - - nvgpu_log_fn(g, " "); - - err = nvgpu_dma_alloc(g, g->ops.ramin.alloc_size(), inst_block); - if (err != 0) { - nvgpu_err(g, "%s: memory allocation failed", __func__); - return err; - } - - nvgpu_log_fn(g, "done"); - return 0; -} - u32 gk20a_mm_get_iommu_bit(struct gk20a *g) { return 34; diff --git a/drivers/gpu/nvgpu/gp10b/mm_gp10b.c b/drivers/gpu/nvgpu/gp10b/mm_gp10b.c index 4089115b4..c8bf00a3a 100644 --- a/drivers/gpu/nvgpu/gp10b/mm_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/mm_gp10b.c @@ -53,7 +53,7 @@ int gp10b_init_bar2_vm(struct gk20a *g) } /* allocate instance mem for bar2 */ - err = g->ops.mm.alloc_inst_block(g, inst_block); + err = nvgpu_alloc_inst_block(g, inst_block); if (err != 0) { goto clean_up_va; } diff --git a/drivers/gpu/nvgpu/hal/init/hal_gm20b.c b/drivers/gpu/nvgpu/hal/init/hal_gm20b.c index b4418ed8c..61ba1f55b 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_gm20b.c +++ b/drivers/gpu/nvgpu/hal/init/hal_gm20b.c @@ -852,7 +852,6 @@ static const struct gpu_ops gm20b_ops = { .vm_bind_channel = nvgpu_vm_bind_channel, .setup_hw = nvgpu_mm_setup_hw, .is_bar1_supported = gm20b_mm_is_bar1_supported, - .alloc_inst_block = gk20a_alloc_inst_block, .init_inst_block = gk20a_init_inst_block, .bar1_map_userd = gk20a_mm_bar1_map_userd, .cache = { diff --git a/drivers/gpu/nvgpu/hal/init/hal_gp10b.c b/drivers/gpu/nvgpu/hal/init/hal_gp10b.c index d2f751843..1f8131e33 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_gp10b.c +++ b/drivers/gpu/nvgpu/hal/init/hal_gp10b.c @@ -929,7 +929,6 @@ static const struct gpu_ops gp10b_ops = { .vm_bind_channel = nvgpu_vm_bind_channel, .setup_hw = nvgpu_mm_setup_hw, .is_bar1_supported = gm20b_mm_is_bar1_supported, - .alloc_inst_block = gk20a_alloc_inst_block, .init_inst_block = gk20a_init_inst_block, .init_bar2_vm = gp10b_init_bar2_vm, .remove_bar2_vm = gp10b_remove_bar2_vm, diff --git a/drivers/gpu/nvgpu/hal/init/hal_gv100.c b/drivers/gpu/nvgpu/hal/init/hal_gv100.c index 1d8c6bff8..7b934cf2e 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_gv100.c +++ b/drivers/gpu/nvgpu/hal/init/hal_gv100.c @@ -1125,7 +1125,6 @@ static const struct gpu_ops gv100_ops = { .vm_bind_channel = nvgpu_vm_bind_channel, .setup_hw = nvgpu_mm_setup_hw, .is_bar1_supported = gv11b_mm_is_bar1_supported, - .alloc_inst_block = gk20a_alloc_inst_block, .init_inst_block = gv11b_init_inst_block, .init_bar2_vm = gp10b_init_bar2_vm, .remove_bar2_vm = gp10b_remove_bar2_vm, diff --git a/drivers/gpu/nvgpu/hal/init/hal_gv11b.c b/drivers/gpu/nvgpu/hal/init/hal_gv11b.c index 1f738bf63..45eb43508 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_gv11b.c +++ b/drivers/gpu/nvgpu/hal/init/hal_gv11b.c @@ -1095,7 +1095,6 @@ static const struct gpu_ops gv11b_ops = { .vm_bind_channel = nvgpu_vm_bind_channel, .setup_hw = nvgpu_mm_setup_hw, .is_bar1_supported = gv11b_mm_is_bar1_supported, - .alloc_inst_block = gk20a_alloc_inst_block, .init_inst_block = gv11b_init_inst_block, .init_bar2_vm = gp10b_init_bar2_vm, .remove_bar2_vm = gp10b_remove_bar2_vm, diff --git a/drivers/gpu/nvgpu/hal/init/hal_tu104.c b/drivers/gpu/nvgpu/hal/init/hal_tu104.c index c71b6be6d..bc591905a 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_tu104.c +++ b/drivers/gpu/nvgpu/hal/init/hal_tu104.c @@ -1162,7 +1162,6 @@ static const struct gpu_ops tu104_ops = { .vm_bind_channel = nvgpu_vm_bind_channel, .setup_hw = nvgpu_mm_setup_hw, .is_bar1_supported = gv11b_mm_is_bar1_supported, - .alloc_inst_block = gk20a_alloc_inst_block, .init_inst_block = gv11b_init_inst_block, .init_bar2_vm = gp10b_init_bar2_vm, .remove_bar2_vm = gp10b_remove_bar2_vm, diff --git a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h index bc6c5028f..989d4f912 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h @@ -1263,8 +1263,6 @@ struct gpu_ops { bool (*is_bar1_supported)(struct gk20a *g); int (*init_bar2_vm)(struct gk20a *g); void (*remove_bar2_vm)(struct gk20a *g); - int (*alloc_inst_block)(struct gk20a *g, - struct nvgpu_mem *inst_block); void (*init_inst_block)(struct nvgpu_mem *inst_block, struct vm_gk20a *vm, u32 big_page_size); void (*fault_info_mem_destroy)(struct gk20a *g); diff --git a/drivers/gpu/nvgpu/include/nvgpu/mm.h b/drivers/gpu/nvgpu/include/nvgpu/mm.h index 5a21ed821..ee89cbb96 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/mm.h +++ b/drivers/gpu/nvgpu/include/nvgpu/mm.h @@ -182,6 +182,7 @@ void nvgpu_init_mm_ce_context(struct gk20a *g); int nvgpu_init_mm_support(struct gk20a *g); int nvgpu_init_mm_setup_hw(struct gk20a *g); +int nvgpu_alloc_inst_block(struct gk20a *g, struct nvgpu_mem *inst_block); u64 nvgpu_inst_block_addr(struct gk20a *g, struct nvgpu_mem *inst_block); u32 nvgpu_inst_block_ptr(struct gk20a *g, struct nvgpu_mem *inst_block); void nvgpu_free_inst_block(struct gk20a *g, struct nvgpu_mem *inst_block); diff --git a/drivers/gpu/nvgpu/libnvgpu-drv.export b/drivers/gpu/nvgpu/libnvgpu-drv.export index 9e1a43697..2f12ac244 100644 --- a/drivers/gpu/nvgpu/libnvgpu-drv.export +++ b/drivers/gpu/nvgpu/libnvgpu-drv.export @@ -24,7 +24,6 @@ gv11b_fb_write_mmu_fault_buffer_size find_first_bit find_first_zero_bit find_next_bit -gk20a_alloc_inst_block gk20a_bus_set_bar0_window gk20a_runlist_get_ch_entry gk20a_runlist_get_tsg_entry @@ -64,6 +63,7 @@ nvgpu_alloc_destroy nvgpu_alloc_end nvgpu_alloc_fixed nvgpu_alloc_initialized +nvgpu_alloc_inst_block nvgpu_alloc_length nvgpu_alloc_pte nvgpu_alloc_release_carveout diff --git a/userspace/units/mm/gmmu/page_table/page_table.c b/userspace/units/mm/gmmu/page_table/page_table.c index fc990eb55..90794e8b0 100644 --- a/userspace/units/mm/gmmu/page_table/page_table.c +++ b/userspace/units/mm/gmmu/page_table/page_table.c @@ -299,7 +299,6 @@ static int init_mm(struct unit_module *m, struct gk20a *g) g->ops.mm.gmmu.get_default_big_page_size = gp10b_mm_get_default_big_page_size; g->ops.mm.gmmu.get_mmu_levels = gp10b_mm_get_mmu_levels; - g->ops.mm.alloc_inst_block = gk20a_alloc_inst_block; g->ops.mm.init_inst_block = gv11b_init_inst_block; g->ops.mm.gmmu.map = nvgpu_gmmu_map_locked; g->ops.mm.gmmu.unmap = nvgpu_gmmu_unmap_locked; diff --git a/userspace/units/mm/page_table_faults/page_table_faults.c b/userspace/units/mm/page_table_faults/page_table_faults.c index 2c4dc33a1..5c04ff82d 100644 --- a/userspace/units/mm/page_table_faults/page_table_faults.c +++ b/userspace/units/mm/page_table_faults/page_table_faults.c @@ -121,7 +121,6 @@ static int init_mm(struct unit_module *m, struct gk20a *g) g->ops.mm.gmmu.get_default_big_page_size = gp10b_mm_get_default_big_page_size; g->ops.mm.gmmu.get_mmu_levels = gp10b_mm_get_mmu_levels; - g->ops.mm.alloc_inst_block = gk20a_alloc_inst_block; g->ops.mm.init_inst_block = gv11b_init_inst_block; g->ops.mm.gmmu.map = nvgpu_gmmu_map_locked; g->ops.mm.gmmu.unmap = nvgpu_gmmu_unmap_locked; @@ -312,10 +311,10 @@ static int test_page_faults_disable_hw(struct unit_module *m, struct gk20a *g, /* * Test: test_page_faults_inst_block. * This test supports 3 types of scenario to cover corner cases: - * 0 (default): regular alloc_inst_block with default values - * 1: alloc_inst_block with large page size - * 2: alloc_inst_block with large page size and set_big_page_size set to NULL to - * test a corner case in gv11b_init_inst_block (branch coverage) + * 0 (default): regular nvgpu_alloc_inst_block with default values + * 1: nvgpu_alloc_inst_block with large page size + * 2: nvgpu_alloc_inst_block with large page size and set_big_page_size set to + * NULL to test a corner case in gv11b_init_inst_block (branch coverage) */ static int test_page_faults_inst_block(struct unit_module *m, struct gk20a *g, void *args) @@ -334,8 +333,8 @@ static int test_page_faults_inst_block(struct unit_module *m, struct gk20a *g, g->ops.ramin.set_big_page_size = NULL; } - if (g->ops.mm.alloc_inst_block(g, &inst_blk_desc) != 0) { - unit_return_fail(m, "alloc_inst_block failed\n"); + if (nvgpu_alloc_inst_block(g, &inst_blk_desc) != 0) { + unit_return_fail(m, "nvgpu_alloc_inst_block failed\n"); } g->ops.mm.init_inst_block(&inst_blk_desc, g->mm.bar2.vm, big_page_size);