summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
diff options
context:
space:
mode:
authorDavid Nieto <dmartineznie@nvidia.com>2017-02-13 14:22:59 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-03-20 19:39:50 -0400
commit469308becaff326da02fcf791e803e812e1cf9f8 (patch)
tree2acc6d432a7a6023c3d6bb034df8ac0e9cb6bfbf /drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
parent50f371f891c889c782187036c31132fa94c573ac (diff)
gpu: nvgpu: fix arbiter teardown on PCI
The driver is not properly tearing down the arbiter on the PCI driver unload. This change makes sure that the workqueues are drained before tearing down the driver bug 200277762 JIRA: EVLR-1023 Change-Id: If98fd00e27949ba1569dd26e2af02b75897231a7 Signed-off-by: David Nieto <dmartineznie@nvidia.com> Reviewed-on: http://git-master/r/1320147 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c b/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
index 5a4a2251..753623fa 100644
--- a/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
@@ -39,6 +39,7 @@
39 39
40struct gk20a_ctrl_priv { 40struct gk20a_ctrl_priv {
41 struct device *dev; 41 struct device *dev;
42 struct gk20a *g;
42#ifdef CONFIG_ARCH_TEGRA_18x_SOC 43#ifdef CONFIG_ARCH_TEGRA_18x_SOC
43 struct nvgpu_clk_session *clk_session; 44 struct nvgpu_clk_session *clk_session;
44#endif 45#endif
@@ -58,35 +59,42 @@ int gk20a_ctrl_dev_open(struct inode *inode, struct file *filp)
58 priv = kzalloc(sizeof(struct gk20a_ctrl_priv), GFP_KERNEL); 59 priv = kzalloc(sizeof(struct gk20a_ctrl_priv), GFP_KERNEL);
59 if (!priv) 60 if (!priv)
60 return -ENOMEM; 61 return -ENOMEM;
61
62 filp->private_data = priv; 62 filp->private_data = priv;
63 priv->dev = g->dev; 63 priv->dev = g->dev;
64 /*
65 * We dont close the arbiter fd's after driver teardown to support
66 * GPU_LOST events, so we store g here, instead of dereferencing the
67 * dev structure on teardown
68 */
69 priv->g = g;
64 70
65 if (!g->gr.sw_ready) { 71 if (!g->gr.sw_ready) {
66 err = gk20a_busy(g->dev); 72 err = gk20a_busy(g->dev);
67 if (err) 73 if (err)
68 return err; 74 return err;
69
70 gk20a_idle(g->dev); 75 gk20a_idle(g->dev);
71 } 76 }
72 77
73#ifdef CONFIG_ARCH_TEGRA_18x_SOC 78#ifdef CONFIG_ARCH_TEGRA_18x_SOC
74 err = nvgpu_clk_arb_init_session(g, &priv->clk_session); 79 err = nvgpu_clk_arb_init_session(g, &priv->clk_session);
80 if (err)
81 return err;
75#endif 82#endif
83
76 return err; 84 return err;
77} 85}
78
79int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp) 86int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp)
80{ 87{
81 struct gk20a_ctrl_priv *priv = filp->private_data; 88 struct gk20a_ctrl_priv *priv = filp->private_data;
89 struct gk20a *g = priv->g;
82 90
83 gk20a_dbg_fn(""); 91 gk20a_dbg_fn("");
84 92
85#ifdef CONFIG_ARCH_TEGRA_18x_SOC 93#ifdef CONFIG_ARCH_TEGRA_18x_SOC
86 if (priv->clk_session) 94 if (priv->clk_session)
87 nvgpu_clk_arb_release_session(gk20a_from_dev(priv->dev), 95 nvgpu_clk_arb_release_session(g, priv->clk_session);
88 priv->clk_session);
89#endif 96#endif
97
90 kfree(priv); 98 kfree(priv);
91 99
92 return 0; 100 return 0;