mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
gpu: nvgpu: enable/disable tegra fuse clock
GPU hardware block needs tegra fuse clock to mirror gpu fuses from tegra fuses to gpu domain. Tegra fuse driver provided following APIs to enable/disable tegra fuse clock: int tegra_fuse_clock_enable(void); int tegra_fuse_clock_disable(void); To ensure that tegra fuse clock is disabled by nvgpu driver when gpu hardware block is not in use by: Calling tegra_fuse_clock_enable() while doing gk20a_pm_unrailgate() and calling tegra_fuse_clock_disable() while doing gk20a_pm_railgate(). Bug 2019897 Change-Id: I61688829fd9a8b0c1ffa9d34db6393550f333866 Signed-off-by: seshendra Gadagottu <sgadagottu@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1595297 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
83bdf33b56
commit
6911b4d48c
@@ -28,6 +28,8 @@
|
|||||||
#include <dt-bindings/soc/gm20b-fuse.h>
|
#include <dt-bindings/soc/gm20b-fuse.h>
|
||||||
#include <dt-bindings/soc/gp10b-fuse.h>
|
#include <dt-bindings/soc/gp10b-fuse.h>
|
||||||
|
|
||||||
|
#include <soc/tegra/fuse.h>
|
||||||
|
|
||||||
#include <nvgpu/dma.h>
|
#include <nvgpu/dma.h>
|
||||||
#include <nvgpu/kmem.h>
|
#include <nvgpu/kmem.h>
|
||||||
#include <nvgpu/nvgpu_common.h>
|
#include <nvgpu/nvgpu_common.h>
|
||||||
@@ -684,9 +686,8 @@ static int gk20a_pm_railgate(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
struct gk20a *g = get_gk20a(dev);
|
struct gk20a *g = get_gk20a(dev);
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
g->pstats.last_rail_gate_start = jiffies;
|
g->pstats.last_rail_gate_start = jiffies;
|
||||||
|
|
||||||
if (g->pstats.railgating_cycle_count >= 1)
|
if (g->pstats.railgating_cycle_count >= 1)
|
||||||
@@ -698,10 +699,17 @@ static int gk20a_pm_railgate(struct device *dev)
|
|||||||
|
|
||||||
if (platform->railgate)
|
if (platform->railgate)
|
||||||
ret = platform->railgate(dev);
|
ret = platform->railgate(dev);
|
||||||
|
if (ret) {
|
||||||
|
nvgpu_err(g, "failed to railgate platform, err=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
g->pstats.last_rail_gate_complete = jiffies;
|
g->pstats.last_rail_gate_complete = jiffies;
|
||||||
#endif
|
#endif
|
||||||
|
ret = tegra_fuse_clock_disable();
|
||||||
|
if (ret)
|
||||||
|
nvgpu_err(g, "failed to disable tegra fuse clock, err=%d", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -710,9 +718,14 @@ static int gk20a_pm_unrailgate(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
struct gk20a *g = get_gk20a(dev);
|
struct gk20a *g = get_gk20a(dev);
|
||||||
|
|
||||||
|
ret = tegra_fuse_clock_enable();
|
||||||
|
if (ret) {
|
||||||
|
nvgpu_err(g, "failed to enable tegra fuse clock, err=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
g->pstats.last_rail_ungate_start = jiffies;
|
g->pstats.last_rail_ungate_start = jiffies;
|
||||||
if (g->pstats.railgating_cycle_count >= 1)
|
if (g->pstats.railgating_cycle_count >= 1)
|
||||||
g->pstats.total_rail_gate_time_ms =
|
g->pstats.total_rail_gate_time_ms =
|
||||||
|
|||||||
Reference in New Issue
Block a user