diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 58108d97e..ef0f6a8c5 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -1659,7 +1659,7 @@ int __gk20a_do_idle(struct platform_device *pdev) */ pm_runtime_put_sync(&pdev->dev); - if (platform->can_railgate) { + if (platform->can_railgate && !platform->force_reset_in_do_idle) { /* add sufficient delay to allow GPU to rail gate */ msleep(platform->railgate_delay); diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h index 5f7285bfa..7638cf159 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h @@ -76,6 +76,12 @@ struct gk20a_platform { /* Adaptative ELPG: true = enable flase = disable */ bool enable_aelpg; + /* + * gk20a_do_idle() API can take GPU either into rail gate or CAR reset + * This flag can be used to force CAR reset case instead of rail gate + */ + bool force_reset_in_do_idle; + /* Default big page size 64K or 128K */ u32 default_big_page_size; diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c b/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c index b75420e60..30f7e79a3 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c @@ -485,6 +485,8 @@ static struct gk20a_platform t132_gk20a_tegra_platform = { .enable_elpg = true, .enable_aelpg = true, + .force_reset_in_do_idle = false, + .default_big_page_size = SZ_128K, .probe = gk20a_tegra_probe, @@ -526,6 +528,8 @@ struct gk20a_platform gk20a_tegra_platform = { .enable_elpg = true, .enable_aelpg = true, + .force_reset_in_do_idle = false, + .default_big_page_size = SZ_128K, .probe = gk20a_tegra_probe, @@ -568,6 +572,8 @@ struct gk20a_platform gm20b_tegra_platform = { .enable_elpg = true, .enable_aelpg = true, + .force_reset_in_do_idle = true, + .default_big_page_size = SZ_128K, .probe = gk20a_tegra_probe,