mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 02:22:34 +03:00
gpu: nvgpu: Add support for XPU rail split
Check if CPU/GPU rails are joint, disable railgating if they are.
Add the DT support for T194 and T186 platforms.
Disable railgate_enable sysfs node update in the above condition.
Bug 200546450
Bug 200545711
Change-Id: I002488f6418805569b0ef0fc3032b58297adeafb
Signed-off-by: Debarshi Dutta <ddutta@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/2185221
(cherry picked from commit 1d532589b0
in rel-32)
Reviewed-on: https://git-master.nvidia.com/r/2190402
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Thomas Fleury <tfleury@nvidia.com>
Reviewed-by: Alex Waterman <alexw@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
Alex Waterman
parent
b8465d479d
commit
06949c508f
@@ -797,6 +797,7 @@ static int gk20a_tegra_probe(struct device *dev)
|
||||
if (joint_xpu_rail) {
|
||||
nvgpu_log_info(g, "XPU rails are joint\n");
|
||||
nvgpu_set_enabled(g, NVGPU_CAN_RAILGATE, false);
|
||||
platform->can_railgate_init = false;
|
||||
}
|
||||
|
||||
platform->g->clk.gpc_pll.id = GK20A_GPC_PLL;
|
||||
|
||||
@@ -141,6 +141,8 @@ static void gp10b_tegra_scale_exit(struct device *dev)
|
||||
static int gp10b_tegra_probe(struct device *dev)
|
||||
{
|
||||
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
||||
bool joint_xpu_rail = false;
|
||||
struct gk20a *g = platform->g;
|
||||
#ifdef CONFIG_TEGRA_GK20A_NVHOST
|
||||
int ret;
|
||||
|
||||
@@ -155,6 +157,17 @@ static int gp10b_tegra_probe(struct device *dev)
|
||||
|
||||
platform->disable_bigpage = !dev->archdata.iommu;
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
joint_xpu_rail = of_property_read_bool(of_chosen,
|
||||
"nvidia,tegra-joint_xpu_rail");
|
||||
#endif
|
||||
|
||||
if (joint_xpu_rail) {
|
||||
nvgpu_log_info(g, "XPU rails are joint\n");
|
||||
platform->can_railgate_init = false;
|
||||
nvgpu_set_enabled(g, NVGPU_CAN_RAILGATE, false);
|
||||
}
|
||||
|
||||
gp10b_tegra_get_clocks(dev);
|
||||
nvgpu_linux_init_clk_support(platform->g);
|
||||
|
||||
|
||||
@@ -71,6 +71,8 @@ static int gv11b_tegra_probe(struct device *dev)
|
||||
{
|
||||
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
||||
int err;
|
||||
bool joint_xpu_rail = false;
|
||||
struct gk20a *g = platform->g;
|
||||
|
||||
err = nvgpu_nvhost_syncpt_init(platform->g);
|
||||
if (err) {
|
||||
@@ -84,6 +86,17 @@ static int gv11b_tegra_probe(struct device *dev)
|
||||
|
||||
platform->disable_bigpage = !dev->archdata.iommu;
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
joint_xpu_rail = of_property_read_bool(of_chosen,
|
||||
"nvidia,tegra-joint_xpu_rail");
|
||||
#endif
|
||||
|
||||
if (joint_xpu_rail) {
|
||||
nvgpu_log_info(g, "XPU rails are joint\n");
|
||||
platform->can_railgate_init = false;
|
||||
nvgpu_set_enabled(g, NVGPU_CAN_RAILGATE, false);
|
||||
}
|
||||
|
||||
gp10b_tegra_get_clocks(dev);
|
||||
nvgpu_linux_init_clk_support(platform->g);
|
||||
|
||||
|
||||
@@ -271,13 +271,19 @@ static ssize_t railgate_enable_store(struct device *dev,
|
||||
unsigned long railgate_enable = 0;
|
||||
/* dev is guaranteed to be valid here. Ok to de-reference */
|
||||
struct gk20a *g = get_gk20a(dev);
|
||||
struct gk20a_platform *platform = dev_get_drvdata(dev);
|
||||
bool enabled = nvgpu_is_enabled(g, NVGPU_CAN_RAILGATE);
|
||||
int err;
|
||||
|
||||
if (kstrtoul(buf, 10, &railgate_enable) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (railgate_enable && !enabled) {
|
||||
if (!platform->can_railgate_init) {
|
||||
nvgpu_err(g, "Railgating is not supported");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (railgate_enable) {
|
||||
nvgpu_set_enabled(g, NVGPU_CAN_RAILGATE, true);
|
||||
pm_runtime_set_autosuspend_delay(dev, g->railgate_delay);
|
||||
} else if (railgate_enable == 0 && enabled) {
|
||||
|
||||
Reference in New Issue
Block a user