From ebc8b262500a55d55acca627db9db0e11760375b Mon Sep 17 00:00:00 2001 From: Nitin Kumbhar Date: Wed, 30 May 2018 12:13:59 +0530 Subject: gpu: nvgpu: remove nvlink on driver removal Unregister nvlink and nvlink device when gpu is getting removed. Without this next modprobe of nvgpu results in nvlink registration failure. Bug 1987855 Change-Id: I785e707d1fa90f45a3ff0e9790f3f02fa15510d4 Signed-off-by: Nitin Kumbhar Reviewed-on: https://git-master.nvidia.com/r/1735986 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/pci.c | 2 ++ drivers/gpu/nvgpu/common/nvlink.c | 30 ++++++++++++++++++++++++++++++ drivers/gpu/nvgpu/include/nvgpu/nvlink.h | 1 + 3 files changed, 33 insertions(+) diff --git a/drivers/gpu/nvgpu/common/linux/pci.c b/drivers/gpu/nvgpu/common/linux/pci.c index 3d3c2a9f..871abef4 100644 --- a/drivers/gpu/nvgpu/common/linux/pci.c +++ b/drivers/gpu/nvgpu/common/linux/pci.c @@ -757,6 +757,8 @@ static void nvgpu_pci_remove(struct pci_dev *pdev) if (gk20a_gpu_is_virtual(dev)) return; + nvgpu_nvlink_remove(g); + gk20a_driver_start_unload(g); err = nvgpu_quiesce(g); /* TODO: handle failure to idle */ diff --git a/drivers/gpu/nvgpu/common/nvlink.c b/drivers/gpu/nvgpu/common/nvlink.c index 25c1b10b..1a6ee853 100644 --- a/drivers/gpu/nvgpu/common/nvlink.c +++ b/drivers/gpu/nvgpu/common/nvlink.c @@ -503,3 +503,33 @@ free_ndev: return -ENODEV; #endif } + +int nvgpu_nvlink_remove(struct gk20a *g) +{ +#ifdef CONFIG_TEGRA_NVLINK + struct nvlink_device *ndev; + int err; + + ndev = g->nvlink.priv; + + __nvgpu_set_enabled(g, NVGPU_SUPPORT_NVLINK, false); + + err = nvlink_unregister_link(&ndev->link); + if (err) { + nvgpu_err(g, "failed on nvlink link unregistration"); + return err; + } + + err = nvlink_unregister_device(ndev); + if (err) { + nvgpu_err(g, "failed on nvlink device unregistration"); + return err; + } + + nvgpu_kfree(g, ndev); + + return 0; +#else + return -ENODEV; +#endif +} diff --git a/drivers/gpu/nvgpu/include/nvgpu/nvlink.h b/drivers/gpu/nvgpu/include/nvgpu/nvlink.h index bb47537f..9824e62b 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/nvlink.h +++ b/drivers/gpu/nvgpu/include/nvgpu/nvlink.h @@ -236,6 +236,7 @@ int nvgpu_nvlink_train(struct gk20a *g, u32 link_id, bool from_off); int nvgpu_nvlink_read_dt_props(struct gk20a *g); int nvgpu_nvlink_probe(struct gk20a *g); +int nvgpu_nvlink_remove(struct gk20a *g); void nvgpu_mss_nvlink_init_credits(struct gk20a *g); -- cgit v1.2.2