From 62c06723dd20331a0d90f2f8a3ea101a8e965187 Mon Sep 17 00:00:00 2001 From: Seshendra Gadagottu Date: Sun, 5 Apr 2020 08:32:37 -0700 Subject: [PATCH] gpu: nvgpu: sim: defer sim buffers allocation Allocate sim buffers only after chip specific memory properties are enabled. JIRA NVGPU-5281 Signed-off-by: Seshendra Gadagottu Change-Id: I7b64b3a51b8cd66dbefd22a09216b2caaeccacbf Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2324083 Reviewed-by: automaticguardword Reviewed-by: Alex Waterman Reviewed-by: Deepak Nibade Reviewed-by: mobile promotions Tested-by: mobile promotions GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/common/sim/sim.c | 55 ++++++++++++-------------- drivers/gpu/nvgpu/common/sim/sim_pci.c | 39 +++++++++--------- drivers/gpu/nvgpu/include/nvgpu/sim.h | 2 +- drivers/gpu/nvgpu/os/linux/module.c | 5 ++- 4 files changed, 51 insertions(+), 50 deletions(-) diff --git a/drivers/gpu/nvgpu/common/sim/sim.c b/drivers/gpu/nvgpu/common/sim/sim.c index ebf8ec8c1..f3ab18c08 100644 --- a/drivers/gpu/nvgpu/common/sim/sim.c +++ b/drivers/gpu/nvgpu/common/sim/sim.c @@ -213,15 +213,26 @@ static void nvgpu_sim_esc_readl(struct gk20a *g, } } -static void nvgpu_sim_init_late(struct gk20a *g) +static int nvgpu_sim_init_late(struct gk20a *g) { u64 phys; + int err = -ENOMEM; if (!g->sim) { - return; + return 0; } nvgpu_info(g, "sim init late"); + + /* allocate sim event/msg buffers */ + err = nvgpu_alloc_sim_buffer(g, &g->sim->send_bfr); + err = err || nvgpu_alloc_sim_buffer(g, &g->sim->recv_bfr); + err = err || nvgpu_alloc_sim_buffer(g, &g->sim->msg_bfr); + + if (err != 0) { + goto fail; + } + /*mark send ring invalid*/ sim_writel(g->sim, sim_send_ring_r(), sim_send_ring_status_invalid_f()); @@ -256,37 +267,21 @@ static void nvgpu_sim_init_late(struct gk20a *g) sim_recv_ring_size_4kb_f() | sim_recv_ring_addr_lo_f(phys >> sim_recv_ring_addr_lo_b())); - return; -} - -int nvgpu_init_sim_support(struct gk20a *g) -{ - int err = -ENOMEM; - - if (!g->sim) { - return 0; - } - - /* allocate sim event/msg buffers */ - err = nvgpu_alloc_sim_buffer(g, &g->sim->send_bfr); - err = err || nvgpu_alloc_sim_buffer(g, &g->sim->recv_bfr); - err = err || nvgpu_alloc_sim_buffer(g, &g->sim->msg_bfr); - - if (err != 0) { - goto fail; - } - - g->sim->sim_init_late = nvgpu_sim_init_late; - /* - * Found issues with removing sim support for igpu. - * Remove sim->remove_support until JIRA NVGPU-5281 is fixed. - * g->sim->remove_support = nvgpu_remove_sim_support; - */ - g->sim->remove_support = NULL; - g->sim->esc_readl = nvgpu_sim_esc_readl; return 0; fail: nvgpu_free_sim_support(g); return err; } + +int nvgpu_init_sim_support(struct gk20a *g) +{ + if (!g->sim) { + return 0; + } + + g->sim->sim_init_late = nvgpu_sim_init_late; + g->sim->remove_support = nvgpu_remove_sim_support; + g->sim->esc_readl = nvgpu_sim_esc_readl; + return 0; +} diff --git a/drivers/gpu/nvgpu/common/sim/sim_pci.c b/drivers/gpu/nvgpu/common/sim/sim_pci.c index 55d14ba29..ace9e8e69 100644 --- a/drivers/gpu/nvgpu/common/sim/sim_pci.c +++ b/drivers/gpu/nvgpu/common/sim/sim_pci.c @@ -194,15 +194,26 @@ static void nvgpu_sim_esc_readl(struct gk20a *g, } } -static void nvgpu_sim_init_late(struct gk20a *g) +static int nvgpu_sim_init_late(struct gk20a *g) { u64 phys; - - if (!g->sim) { - return; - } + int err = -ENOMEM; nvgpu_info(g, "sim init late pci"); + + if (!g->sim) { + return 0; + } + + /* allocate sim event/msg buffers */ + err = nvgpu_alloc_sim_buffer(g, &g->sim->send_bfr); + err = err || nvgpu_alloc_sim_buffer(g, &g->sim->recv_bfr); + err = err || nvgpu_alloc_sim_buffer(g, &g->sim->msg_bfr); + + if (err != 0) { + goto fail; + } + /* mark send ring invalid */ sim_writel(g->sim, sim_send_ring_r(), sim_send_ring_status_invalid_f()); @@ -236,31 +247,23 @@ static void nvgpu_sim_init_late(struct gk20a *g) sim_recv_ring_target_phys_pci_coherent_f() | sim_recv_ring_size_4kb_f() | sim_recv_ring_addr_lo_f(phys >> sim_recv_ring_addr_lo_b())); + + return 0; + fail: + nvgpu_free_sim_support(g); + return err; } int nvgpu_init_sim_support_pci(struct gk20a *g) { - int err = -ENOMEM; if(!g->sim) { return 0; } - /* allocate sim event/msg buffers */ - err = nvgpu_alloc_sim_buffer(g, &g->sim->send_bfr); - err = err || nvgpu_alloc_sim_buffer(g, &g->sim->recv_bfr); - err = err || nvgpu_alloc_sim_buffer(g, &g->sim->msg_bfr); - - if (err != 0) { - goto fail; - } - g->sim->sim_init_late = nvgpu_sim_init_late; g->sim->remove_support = nvgpu_remove_sim_support; g->sim->esc_readl = nvgpu_sim_esc_readl; return 0; - fail: - nvgpu_free_sim_support(g); - return err; } diff --git a/drivers/gpu/nvgpu/include/nvgpu/sim.h b/drivers/gpu/nvgpu/include/nvgpu/sim.h index 84e5b63b6..ed83a0838 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/sim.h +++ b/drivers/gpu/nvgpu/include/nvgpu/sim.h @@ -36,7 +36,7 @@ struct sim_nvgpu { struct nvgpu_mem send_bfr; struct nvgpu_mem recv_bfr; struct nvgpu_mem msg_bfr; - void (*sim_init_late)(struct gk20a *g); + int (*sim_init_late)(struct gk20a *g); void (*remove_support)(struct gk20a *g); void (*esc_readl)( struct gk20a *g, const char *path, u32 index, u32 *data); diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c index 363157be8..7e22e2878 100644 --- a/drivers/gpu/nvgpu/os/linux/module.c +++ b/drivers/gpu/nvgpu/os/linux/module.c @@ -443,7 +443,9 @@ int gk20a_pm_finalize_poweron(struct device *dev) if (g->sim) { if (g->sim->sim_init_late) - g->sim->sim_init_late(g); + err = g->sim->sim_init_late(g); + if (err) + goto done; } #ifdef CONFIG_NVGPU_DGPU @@ -530,6 +532,7 @@ int gk20a_pm_finalize_poweron(struct device *dev) done: if (err != 0) { nvgpu_disable_irqs(g); + nvgpu_remove_sim_support_linux(g); } nvgpu_mutex_release(&g->power_lock);