diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index b7444a9e3..0dd0d62cf 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.c @@ -274,3 +274,15 @@ void nvgpu_wait_for_deferred_interrupts(struct gk20a *g) atomic_read(&l->sw_irq_nonstall_last_handled)) <= 0, 0); } + +static void nvgpu_free_gk20a(struct gk20a *g) +{ + struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); + + kfree(l); +} + +void nvgpu_init_gk20a(struct gk20a *g) +{ + g->free = nvgpu_free_gk20a; +} diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.h b/drivers/gpu/nvgpu/common/linux/driver_common.h new file mode 100644 index 000000000..6f42f7751 --- /dev/null +++ b/drivers/gpu/nvgpu/common/linux/driver_common.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef NVGPU_LINUX_DRIVER_COMMON +#define NVGPU_LINUX_DRIVER_COMMON + +void nvgpu_init_gk20a(struct gk20a *g); + +#endif diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index 4aff6a2dc..4841b032e 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -53,6 +53,7 @@ #include "cde_gm20b.h" #include "cde_gp10b.h" #include "ctxsw_trace.h" +#include "driver_common.h" #define CLASS_NAME "nvidia-gpu" /* TODO: Change to e.g. "nvidia-gpu%s" once we have symlinks in place. */ @@ -1027,6 +1028,7 @@ static int gk20a_probe(struct platform_device *dev) } gk20a = &l->g; + nvgpu_init_gk20a(gk20a); set_gk20a(dev, gk20a); l->dev = &dev->dev; gk20a->log_mask = NVGPU_DEFAULT_DBG_MASK; diff --git a/drivers/gpu/nvgpu/common/linux/pci.c b/drivers/gpu/nvgpu/common/linux/pci.c index 118567e59..296d0a7c7 100644 --- a/drivers/gpu/nvgpu/common/linux/pci.c +++ b/drivers/gpu/nvgpu/common/linux/pci.c @@ -37,6 +37,7 @@ #endif #include "os_linux.h" +#include "driver_common.h" #define PCI_INTERFACE_NAME "card-%s%%s" @@ -457,6 +458,7 @@ static int nvgpu_pci_probe(struct pci_dev *pdev, } g = &l->g; + nvgpu_init_gk20a(g); nvgpu_kmem_init(g); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index f71a51fde..e8db9d2ca 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -518,7 +518,8 @@ static void gk20a_free_cb(struct nvgpu_ref *refcount) if (g->remove_support) g->remove_support(g); - kfree(g); + if (g->free) + g->free(g); } /** diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 7e7d96887..5b22d1a4f 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1070,6 +1070,7 @@ struct nvgpu_gpu_params { }; struct gk20a { + void (*free)(struct gk20a *g); struct nvgpu_nvhost_dev *nvhost_dev; /* diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index 93f9eaf4b..2cd99e8c7 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c @@ -47,6 +47,7 @@ #include "common/linux/os_linux.h" #include "common/linux/ioctl.h" #include "common/linux/scale.h" +#include "common/linux/driver_common.h" #ifdef CONFIG_TEGRA_19x_GPU #include @@ -657,6 +658,7 @@ int vgpu_probe(struct platform_device *pdev) return -ENOMEM; } gk20a = &l->g; + nvgpu_init_gk20a(gk20a); nvgpu_kmem_init(gk20a);