From f6c921ec97323c1eab7d3b8a0cda73abf041a00f Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Mon, 5 Jun 2017 16:22:30 +0300 Subject: gpu: nvgpu: bring back tegra idle registration To make do_idle work when nvgpu is built as a module, reverse the order of call dependencies for do_idle. Don't provide visible gk20a_do_{idle,unidle}() functions for the kernel but instead call the kernel for registering and unregistering pointers to them when the driver loads and unloads. Refactor the internal __gk20a_do_{idle,unidle} functions to take a struct gk20a * instead of struct device *, and use the callback api for providing that g instead of retrieving the plat device from device tree. Bug 200290850 Change-Id: Ibef8b069302e547b298069cbb97734f461a10cc3 Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/1493774 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/module.c | 36 +++++++++++----------------- drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | 2 -- drivers/gpu/nvgpu/gk20a/fence_gk20a.c | 1 - drivers/gpu/nvgpu/gk20a/gk20a.h | 6 ++--- drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c | 5 ++-- drivers/gpu/nvgpu/vgpu/sysfs_vgpu.c | 1 - 6 files changed, 18 insertions(+), 33 deletions(-) (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index cbad3993..80c516a6 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -288,9 +288,9 @@ static struct of_device_id tegra_gk20a_of_match[] = { * In success, we hold these locks and return * In failure, we release these locks and return */ -int __gk20a_do_idle(struct device *dev, bool force_reset) +int __gk20a_do_idle(struct gk20a *g, bool force_reset) { - struct gk20a *g = get_gk20a(dev); + struct device *dev = g->dev; struct gk20a_platform *platform = dev_get_drvdata(dev); struct nvgpu_timeout timeout; int ref_cnt; @@ -419,25 +419,19 @@ fail_timeout: * * In success, this call MUST be balanced by caller with gk20a_do_unidle() */ -int gk20a_do_idle(void) +static int gk20a_do_idle(void *_g) { - struct device_node *node = - of_find_matching_node(NULL, tegra_gk20a_of_match); - struct platform_device *pdev = of_find_device_by_node(node); - - int ret = __gk20a_do_idle(&pdev->dev, true); - - of_node_put(node); + struct gk20a *g = (struct gk20a *)_g; - return ret; + return __gk20a_do_idle(g, true); } /** * __gk20a_do_unidle() - unblock all the tasks blocked by __gk20a_do_idle() */ -int __gk20a_do_unidle(struct device *dev) +int __gk20a_do_unidle(struct gk20a *g) { - struct gk20a *g = get_gk20a(dev); + struct device *dev = g->dev; struct gk20a_platform *platform = dev_get_drvdata(dev); int err; @@ -471,17 +465,11 @@ int __gk20a_do_unidle(struct device *dev) /** * gk20a_do_unidle() - wrap up for __gk20a_do_unidle() */ -int gk20a_do_unidle(void) +static int gk20a_do_unidle(void *_g) { - struct device_node *node = - of_find_matching_node(NULL, tegra_gk20a_of_match); - struct platform_device *pdev = of_find_device_by_node(node); + struct gk20a *g = (struct gk20a *)_g; - int ret = __gk20a_do_unidle(&pdev->dev); - - of_node_put(node); - - return ret; + return __gk20a_do_unidle(g); } #endif @@ -520,6 +508,8 @@ static irqreturn_t gk20a_intr_thread_stall(int irq, void *dev_id) void gk20a_remove_support(struct gk20a *g) { + tegra_unregister_idle_unidle(gk20a_do_idle); + nvgpu_kfree(g, g->dbg_regops_tmp_buf); if (g->pmu.remove_support) @@ -557,6 +547,8 @@ static int gk20a_init_support(struct platform_device *dev) int err = 0; struct gk20a *g = get_gk20a(&dev->dev); + tegra_register_idle_unidle(gk20a_do_idle, gk20a_do_unidle, g); + g->regs = gk20a_ioremap_resource(dev, GK20A_BAR0_IORESOURCE_MEM, &g->reg_mem); if (IS_ERR(g->regs)) { diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c index 3d313ce8..1b650cdd 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c @@ -13,8 +13,6 @@ * more details. */ -#include - #include #include diff --git a/drivers/gpu/nvgpu/gk20a/fence_gk20a.c b/drivers/gpu/nvgpu/gk20a/fence_gk20a.c index 5392e77c..51363059 100644 --- a/drivers/gpu/nvgpu/gk20a/fence_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fence_gk20a.c @@ -13,7 +13,6 @@ #include "fence_gk20a.h" -#include #include #include #include diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 79118fca..34f89fc8 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1485,10 +1485,8 @@ void gk20a_busy_noresume(struct device *dev); void gk20a_idle_nosuspend(struct device *dev); int __must_check gk20a_busy(struct gk20a *g); void gk20a_idle(struct gk20a *g); -int gk20a_do_idle(void); -int gk20a_do_unidle(void); -int __gk20a_do_idle(struct device *dev, bool force_reset); -int __gk20a_do_unidle(struct device *dev); +int __gk20a_do_idle(struct gk20a *g, bool force_reset); +int __gk20a_do_unidle(struct gk20a *g); int gk20a_can_busy(struct gk20a *g); void gk20a_driver_start_unload(struct gk20a *g); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c index 275b663f..8c1dbd37 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c @@ -22,7 +22,6 @@ #include #include #include -#include #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) #include #endif @@ -742,7 +741,7 @@ static ssize_t force_idle_store(struct device *dev, if (g->forced_idle) return count; /* do nothing */ else { - err = __gk20a_do_idle(dev, false); + err = __gk20a_do_idle(g, false); if (!err) { g->forced_idle = 1; dev_info(dev, "gpu is idle : %d\n", @@ -753,7 +752,7 @@ static ssize_t force_idle_store(struct device *dev, if (!g->forced_idle) return count; /* do nothing */ else { - err = __gk20a_do_unidle(dev); + err = __gk20a_do_unidle(g); if (!err) { g->forced_idle = 0; dev_info(dev, "gpu is idle : %d\n", diff --git a/drivers/gpu/nvgpu/vgpu/sysfs_vgpu.c b/drivers/gpu/nvgpu/vgpu/sysfs_vgpu.c index 5a9f1fee..82fa7aac 100644 --- a/drivers/gpu/nvgpu/vgpu/sysfs_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/sysfs_vgpu.c @@ -12,7 +12,6 @@ */ #include -#include #include "vgpu/vgpu.h" -- cgit v1.2.2