]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
gpu: nvgpu: add flag for CAR reset in do_idle()
authorDeepak Nibade <dnibade@nvidia.com>
Thu, 26 Feb 2015 11:17:06 +0000 (16:47 +0530)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Tue, 3 Mar 2015 16:20:00 +0000 (08:20 -0800)
Add "force_reset" flag to __gk20a_do_idle()

For real world use cases like VPR resizing, we cannot wait
for railgate_delay (which is 500 mS). Hence use CAR reset
for this use case. (this is done via gk20a_do_idle() API
with force_reset = true)

Some of the test cases make use of sysfs "force_idle" and
they expect GPU to be into really railgated state and
not in CAR reset.
Hence when called from sysfs, set force_reset = false.

When global flag "force_reset_in_do_idle" is set, it will
override local flags and force CAR reset case.
This is desired in cases where railgating is not enabled

Also, set force_reset_in_do_idle = false for GM20B since
railgating has been enabled for GM20B

Bug 1592997

Change-Id: I6c5af2977c7211ef82551a86a7c1eb51b8ccee60
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/711615
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
drivers/gpu/nvgpu/gk20a/gk20a.c
drivers/gpu/nvgpu/gk20a/gk20a.h
drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c

index 8ff74a4d9cfd0071aa8af5043105331634fc8391..017083988bebfca87e056ed9aaa051fde1aba1df 100644 (file)
@@ -1624,7 +1624,7 @@ void gk20a_reset(struct gk20a *g, u32 units)
  *
  * In success, this call MUST be balanced by caller with __gk20a_do_unidle()
  */
-int __gk20a_do_idle(struct platform_device *pdev)
+int __gk20a_do_idle(struct platform_device *pdev, bool force_reset)
 {
        struct gk20a *g = get_gk20a(pdev);
        struct gk20a_platform *platform = dev_get_drvdata(&pdev->dev);
@@ -1643,6 +1643,9 @@ int __gk20a_do_idle(struct platform_device *pdev)
        if (platform->is_railgated(pdev))
                return 0;
 
+       /* check if global force_reset flag is set */
+       force_reset |= platform->force_reset_in_do_idle;
+
        /* prevent suspend by incrementing usage counter */
        pm_runtime_get_noresume(&pdev->dev);
 
@@ -1669,7 +1672,7 @@ int __gk20a_do_idle(struct platform_device *pdev)
         */
        pm_runtime_put_sync(&pdev->dev);
 
-       if (platform->can_railgate && !platform->force_reset_in_do_idle) {
+       if (platform->can_railgate && !force_reset) {
                /* add sufficient delay to allow GPU to rail gate */
                msleep(platform->railgate_delay);
 
@@ -1722,7 +1725,7 @@ int gk20a_do_idle(void)
                        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);
+       int ret =  __gk20a_do_idle(pdev, true);
 
        of_node_put(node);
 
index ba7c7e9754973dba5677f5c4694d25fba99d58e3..acee2e485b51e68acee149cd344707911d05267a 100644 (file)
@@ -776,7 +776,7 @@ void gk20a_idle(struct platform_device *pdev);
 void gk20a_disable(struct gk20a *g, u32 units);
 void gk20a_enable(struct gk20a *g, u32 units);
 void gk20a_reset(struct gk20a *g, u32 units);
-int __gk20a_do_idle(struct platform_device *pdev);
+int __gk20a_do_idle(struct platform_device *pdev, bool force_reset);
 int __gk20a_do_unidle(struct platform_device *pdev);
 
 const struct firmware *
index 42720307f4b14edfc1a3a74f125bd6423dc7567a..773345a1ebf6f90b405128747ba4f8c86980492c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * GK20A Graphics
  *
- * Copyright (c) 2011-2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2011-2015, 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,
@@ -562,7 +562,7 @@ static ssize_t force_idle_store(struct device *device,
                if (g->forced_idle)
                        return count; /* do nothing */
                else {
-                       err = __gk20a_do_idle(ndev);
+                       err = __gk20a_do_idle(ndev, false);
                        if (!err) {
                                g->forced_idle = 1;
                                dev_info(device, "gpu is idle : %d\n",
index 28b7ff7b2f202367e88917da9e372c844369ba0b..0d5f32dd217719cf82f3a483a070fc12e80c75f5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * GK20A Tegra Platform Interface
  *
- * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2014-2015, 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,
@@ -597,7 +597,7 @@ struct gk20a_platform gm20b_tegra_platform = {
        .enable_elpg            = true,
        .enable_aelpg           = true,
 
-       .force_reset_in_do_idle = true,
+       .force_reset_in_do_idle = false,
 
        .default_big_page_size  = SZ_128K,