To assure post of the previous writes through Tegra interconnect
added read fences in the following power gating code paths:
- Seconadry CPU boot ungating (path taken on Tegra11, Tegra14, Tegra12)
- GPU rail clamps gating/ungating (path taken on Tegra12, Tegra13)
- MC client ungating flush done (path taken on all platforms)
Bug
1484343
Change-Id: Ie09ef37135beae0ed0beb1cd4d7e96187ba9be26
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/385403
Reviewed-by: Prashant Gaikwad <pgaikwad@nvidia.com>
Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>
reg = PMC_TOGGLE_START | TEGRA_CPU_POWERGATE_ID(cpu);
pmc_writel(reg, PWRGATE_TOGGLE);
+ pmc_readl(PWRGATE_TOGGLE);
}
return 0;
/*
- * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
rst_ctrl = mc_read(MC_CLIENT_HOTRESET_CTRL);
rst_ctrl &= ~(1 << mcClientBit);
mc_write(rst_ctrl, MC_CLIENT_HOTRESET_CTRL);
+ mc_read(MC_CLIENT_HOTRESET_CTRL);
spin_unlock_irqrestore(&tegra11x_powergate_lock, flags);
}
rst_ctrl = mc_read(rst_ctrl_reg);
rst_ctrl &= ~(1 << mcClientBit);
mc_write(rst_ctrl, rst_ctrl_reg);
+ mc_read(rst_ctrl_reg);
spin_unlock_irqrestore(&tegra12x_powergate_lock, flags);
}
/* enable clamp */
pmc_write(0x1, PMC_GPU_RG_CNTRL_0);
+ pmc_read(PMC_GPU_RG_CNTRL_0);
udelay(10);
/* disable clamp */
pmc_write(0, PMC_GPU_RG_CNTRL_0);
+ pmc_read(PMC_GPU_RG_CNTRL_0);
udelay(10);
/*
- * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
rst_ctrl = mc_read(MC_CLIENT_HOTRESET_CTRL);
rst_ctrl &= ~(1 << mcClientBit);
mc_write(rst_ctrl, MC_CLIENT_HOTRESET_CTRL);
+ mc_read(MC_CLIENT_HOTRESET_CTRL);
spin_unlock_irqrestore(&tegra14x_powergate_lock, flags);
}
/*
- * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2012-214, NVIDIA CORPORATION. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
rst_ctrl = mc_read(MC_CLIENT_HOTRESET_CTRL);
rst_ctrl &= ~(1 << mcClientBit);
mc_write(rst_ctrl, MC_CLIENT_HOTRESET_CTRL);
-
+ mc_read(MC_CLIENT_HOTRESET_CTRL);
spin_unlock_irqrestore(&tegra3_powergate_lock, flags);
}
/* CPU ungated in s/w only during boot/resume with outer
waiting loop and no contention from other CPUs */
pmc_write(PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
+ pmc_read(PWRGATE_TOGGLE);
spin_unlock_irqrestore(lock, flags);
return 0;
}