From 560e243f2d8b6cf3fafd8e79560cbf6dffe58e9e Mon Sep 17 00:00:00 2001 From: Antony Clince Alex Date: Mon, 30 Apr 2018 12:57:29 +0530 Subject: gpu: nvgpu: added nvgpu_sim_init_late Split sim initialization to two parts, first part gets invoked as part of probe and second part gets invoked in the finalize_poweron after the hal has been initialized. This is done because some of the sim init code uses mm api's which are assigned as part of hal init. replaced sim buffer allocation api's with nvgpu_dma_sys_alloc. Change-Id: Ib019fbb747bdf6dcc74e7deba732ab41f0869e96 Signed-off-by: Antony Clince Alex Reviewed-on: https://git-master.nvidia.com/r/1705424 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/module.c | 5 ++++ drivers/gpu/nvgpu/common/sim.c | 35 ++++++++++++++++--------- drivers/gpu/nvgpu/common/sim_pci.c | 30 ++++++++++++++------- drivers/gpu/nvgpu/include/nvgpu/linux/sim_pci.h | 2 +- drivers/gpu/nvgpu/include/nvgpu/sim.h | 1 + 5 files changed, 50 insertions(+), 23 deletions(-) (limited to 'drivers/gpu') diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index f00b3cce..86abd36b 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -249,6 +249,11 @@ int gk20a_pm_finalize_poweron(struct device *dev) if (err) return err; + if (g->sim) { + if (g->sim->sim_init_late) + g->sim->sim_init_late(g); + } + err = gk20a_finalize_poweron(g); if (err) goto done; diff --git a/drivers/gpu/nvgpu/common/sim.c b/drivers/gpu/nvgpu/common/sim.c index 6094d063..81146cd9 100644 --- a/drivers/gpu/nvgpu/common/sim.c +++ b/drivers/gpu/nvgpu/common/sim.c @@ -33,8 +33,7 @@ int nvgpu_alloc_sim_buffer(struct gk20a *g, struct nvgpu_mem *mem) { int err; - err = nvgpu_dma_alloc(g, PAGE_SIZE, mem); - + err = nvgpu_dma_alloc_sys(g, PAGE_SIZE, mem); if (err) return err; /* @@ -251,21 +250,14 @@ static int nvgpu_sim_esc_readl(struct gk20a *g, return err; } -int nvgpu_init_sim_support(struct gk20a *g) +static void nvgpu_sim_init_late(struct gk20a *g) { - int err = -ENOMEM; u64 phys; 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); + return; - if (err) - goto fail; + nvgpu_info(g, "sim init late"); /*mark send ring invalid*/ sim_writel(g->sim, sim_send_ring_r(), sim_send_ring_status_invalid_f()); @@ -300,6 +292,25 @@ int nvgpu_init_sim_support(struct gk20a *g) sim_recv_ring_size_4kb_f() | sim_recv_ring_addr_lo_f(phys >> PAGE_SHIFT)); + 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) + 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; diff --git a/drivers/gpu/nvgpu/common/sim_pci.c b/drivers/gpu/nvgpu/common/sim_pci.c index a72623e9..2f6f6765 100644 --- a/drivers/gpu/nvgpu/common/sim_pci.c +++ b/drivers/gpu/nvgpu/common/sim_pci.c @@ -201,21 +201,14 @@ static int nvgpu_sim_esc_readl(struct gk20a *g, return err; } -int nvgpu_init_sim_support_pci(struct gk20a *g) +static void nvgpu_sim_init_late(struct gk20a *g) { - int err = -ENOMEM; u64 phys; if (!g->sim) - return 0; + return; - /* 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) - goto fail; + nvgpu_info(g, "sim init late pci"); /* mark send ring invalid */ sim_writel(g->sim, sim_send_ring_r(), sim_send_ring_status_invalid_f()); @@ -249,7 +242,24 @@ int nvgpu_init_sim_support_pci(struct gk20a *g) sim_recv_ring_target_phys_pci_coherent_f() | sim_recv_ring_size_4kb_f() | sim_recv_ring_addr_lo_f(phys >> PAGE_SHIFT)); +} + +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) + 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; diff --git a/drivers/gpu/nvgpu/include/nvgpu/linux/sim_pci.h b/drivers/gpu/nvgpu/include/nvgpu/linux/sim_pci.h index 5784ecba..b248f07b 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/linux/sim_pci.h +++ b/drivers/gpu/nvgpu/include/nvgpu/linux/sim_pci.h @@ -1,6 +1,6 @@ /* * - * GK20A sim support + * nvgpu sim support pci * * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. * diff --git a/drivers/gpu/nvgpu/include/nvgpu/sim.h b/drivers/gpu/nvgpu/include/nvgpu/sim.h index 78b749dd..f3ba2fed 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/sim.h +++ b/drivers/gpu/nvgpu/include/nvgpu/sim.h @@ -34,6 +34,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 *); void (*remove_support)(struct gk20a *); int (*esc_readl)( struct gk20a *g, char *path, u32 index, u32 *data); -- cgit v1.2.2