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>
*
* 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);
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);
*/
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);
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);
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 *
*
* 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,
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",
*
* 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,
.enable_elpg = true,
.enable_aelpg = true,
- .force_reset_in_do_idle = true,
+ .force_reset_in_do_idle = false,
.default_big_page_size = SZ_128K,