summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h7
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c8
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h1
-rw-r--r--drivers/gpu/nvgpu/pci.c20
4 files changed, 34 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h
index 063a5457..451b207b 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h
@@ -103,6 +103,13 @@ struct gk20a_channel_sync {
103void gk20a_channel_sync_destroy(struct gk20a_channel_sync *sync); 103void gk20a_channel_sync_destroy(struct gk20a_channel_sync *sync);
104struct gk20a_channel_sync *gk20a_channel_sync_create(struct channel_gk20a *c); 104struct gk20a_channel_sync *gk20a_channel_sync_create(struct channel_gk20a *c);
105bool gk20a_channel_sync_needs_sync_framework(struct channel_gk20a *c); 105bool gk20a_channel_sync_needs_sync_framework(struct channel_gk20a *c);
106
107#ifdef CONFIG_SYNC
106void gk20a_channel_cancel_pending_sema_waits(struct gk20a *g); 108void gk20a_channel_cancel_pending_sema_waits(struct gk20a *g);
109#else
110static inline void gk20a_channel_cancel_pending_sema_waits(struct gk20a *g)
111{
112}
113#endif
107 114
108#endif 115#endif
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index a65ca6c2..bed728cf 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -47,6 +47,8 @@
47#include "nvgpu_common.h" 47#include "nvgpu_common.h"
48#include "debug_gk20a.h" 48#include "debug_gk20a.h"
49#include "ctrl_gk20a.h" 49#include "ctrl_gk20a.h"
50#include "channel_sync_gk20a.h"
51
50#include "hw_mc_gk20a.h" 52#include "hw_mc_gk20a.h"
51#include "hw_timer_gk20a.h" 53#include "hw_timer_gk20a.h"
52#include "hw_bus_gk20a.h" 54#include "hw_bus_gk20a.h"
@@ -66,6 +68,7 @@
66#include "pstate/pstate.h" 68#include "pstate/pstate.h"
67#endif 69#endif
68 70
71
69#define CREATE_TRACE_POINTS 72#define CREATE_TRACE_POINTS
70#include <trace/events/gk20a.h> 73#include <trace/events/gk20a.h>
71 74
@@ -708,6 +711,10 @@ void gk20a_remove_support(struct device *dev)
708 if (g->dbg_regops_tmp_buf) 711 if (g->dbg_regops_tmp_buf)
709 kfree(g->dbg_regops_tmp_buf); 712 kfree(g->dbg_regops_tmp_buf);
710 713
714 nvgpu_wait_for_deferred_interrupts(g);
715
716 gk20a_channel_cancel_pending_sema_waits(g);
717
711 if (g->pmu.remove_support) 718 if (g->pmu.remove_support)
712 g->pmu.remove_support(&g->pmu); 719 g->pmu.remove_support(&g->pmu);
713 720
@@ -1740,6 +1747,7 @@ void gk20a_busy_noresume(struct device *dev)
1740 */ 1747 */
1741void gk20a_driver_start_unload(struct gk20a *g) 1748void gk20a_driver_start_unload(struct gk20a *g)
1742{ 1749{
1750 gk20a_dbg(gpu_dbg_shutdown, "Driver is now going down!\n");
1743 g->driver_is_dying = 1; 1751 g->driver_is_dying = 1;
1744} 1752}
1745 1753
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index e8c1b30f..dc130e33 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -1081,6 +1081,7 @@ enum gk20a_dbg_categories {
1081 gpu_dbg_sema_v = BIT(16), /* verbose semaphore debugging */ 1081 gpu_dbg_sema_v = BIT(16), /* verbose semaphore debugging */
1082 gpu_dbg_pmu_pstate = BIT(17), /* p state controlled by pmu */ 1082 gpu_dbg_pmu_pstate = BIT(17), /* p state controlled by pmu */
1083 gpu_dbg_xv = BIT(18), /* XVE debugging */ 1083 gpu_dbg_xv = BIT(18), /* XVE debugging */
1084 gpu_dbg_shutdown = BIT(19), /* GPU shutdown tracing */
1084 gpu_dbg_mem = BIT(31), /* memory accesses, very verbose */ 1085 gpu_dbg_mem = BIT(31), /* memory accesses, very verbose */
1085}; 1086};
1086 1087
diff --git a/drivers/gpu/nvgpu/pci.c b/drivers/gpu/nvgpu/pci.c
index 0ba36a30..7cc058e4 100644
--- a/drivers/gpu/nvgpu/pci.c
+++ b/drivers/gpu/nvgpu/pci.c
@@ -356,10 +356,25 @@ static void nvgpu_pci_remove(struct pci_dev *pdev)
356 struct gk20a_platform *platform = gk20a_get_platform(&pdev->dev); 356 struct gk20a_platform *platform = gk20a_get_platform(&pdev->dev);
357 struct gk20a *g = get_gk20a(&pdev->dev); 357 struct gk20a *g = get_gk20a(&pdev->dev);
358 358
359 if (g->remove_support) 359 gk20a_dbg(gpu_dbg_shutdown, "Removing nvgpu driver!\n");
360 g->remove_support(g->dev); 360 gk20a_driver_start_unload(g);
361
362 disable_irq(g->irq_stall);
363 devm_free_irq(&pdev->dev, g->irq_stall, g);
364 gk20a_dbg(gpu_dbg_shutdown, "IRQs disabled.\n");
365
366 /*
367 * Wait for the driver to finish up all the IOCTLs it's working on
368 * before cleaning up the driver's data structures.
369 */
370 gk20a_wait_for_idle(&pdev->dev);
371 gk20a_dbg(gpu_dbg_shutdown, "Driver idle.\n");
361 372
362 gk20a_user_deinit(g->dev, &nvgpu_pci_class); 373 gk20a_user_deinit(g->dev, &nvgpu_pci_class);
374 gk20a_dbg(gpu_dbg_shutdown, "User de-init done.\b");
375
376 if (g->remove_support)
377 g->remove_support(g->dev);
363 378
364 debugfs_remove_recursive(platform->debugfs); 379 debugfs_remove_recursive(platform->debugfs);
365 debugfs_remove_recursive(platform->debugfs_alias); 380 debugfs_remove_recursive(platform->debugfs_alias);
@@ -368,6 +383,7 @@ static void nvgpu_pci_remove(struct pci_dev *pdev)
368 383
369 if (platform->remove) 384 if (platform->remove)
370 platform->remove(g->dev); 385 platform->remove(g->dev);
386 gk20a_dbg(gpu_dbg_shutdown, "Platform remove done.\b");
371 387
372 kfree(g); 388 kfree(g);
373} 389}