gm20b.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. /*
  2. * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20. * DEALINGS IN THE SOFTWARE.
  21. */
  22. #include <subdev/clk.h>
  23. #include <subdev/volt.h>
  24. #include <subdev/timer.h>
  25. #include <core/device.h>
  26. #include <core/tegra.h>
  27. #include "priv.h"
  28. #include "gk20a.h"
  29. #define GPCPLL_CFG_SYNC_MODE BIT(2)
  30. #define BYPASSCTRL_SYS (SYS_GPCPLL_CFG_BASE + 0x340)
  31. #define BYPASSCTRL_SYS_GPCPLL_SHIFT 0
  32. #define BYPASSCTRL_SYS_GPCPLL_WIDTH 1
  33. #define GPCPLL_CFG2_SDM_DIN_SHIFT 0
  34. #define GPCPLL_CFG2_SDM_DIN_WIDTH 8
  35. #define GPCPLL_CFG2_SDM_DIN_MASK \
  36. (MASK(GPCPLL_CFG2_SDM_DIN_WIDTH) << GPCPLL_CFG2_SDM_DIN_SHIFT)
  37. #define GPCPLL_CFG2_SDM_DIN_NEW_SHIFT 8
  38. #define GPCPLL_CFG2_SDM_DIN_NEW_WIDTH 15
  39. #define GPCPLL_CFG2_SDM_DIN_NEW_MASK \
  40. (MASK(GPCPLL_CFG2_SDM_DIN_NEW_WIDTH) << GPCPLL_CFG2_SDM_DIN_NEW_SHIFT)
  41. #define GPCPLL_CFG2_SETUP2_SHIFT 16
  42. #define GPCPLL_CFG2_PLL_STEPA_SHIFT 24
  43. #define GPCPLL_DVFS0 (SYS_GPCPLL_CFG_BASE + 0x10)
  44. #define GPCPLL_DVFS0_DFS_COEFF_SHIFT 0
  45. #define GPCPLL_DVFS0_DFS_COEFF_WIDTH 7
  46. #define GPCPLL_DVFS0_DFS_COEFF_MASK \
  47. (MASK(GPCPLL_DVFS0_DFS_COEFF_WIDTH) << GPCPLL_DVFS0_DFS_COEFF_SHIFT)
  48. #define GPCPLL_DVFS0_DFS_DET_MAX_SHIFT 8
  49. #define GPCPLL_DVFS0_DFS_DET_MAX_WIDTH 7
  50. #define GPCPLL_DVFS0_DFS_DET_MAX_MASK \
  51. (MASK(GPCPLL_DVFS0_DFS_DET_MAX_WIDTH) << GPCPLL_DVFS0_DFS_DET_MAX_SHIFT)
  52. #define GPCPLL_DVFS1 (SYS_GPCPLL_CFG_BASE + 0x14)
  53. #define GPCPLL_DVFS1_DFS_EXT_DET_SHIFT 0
  54. #define GPCPLL_DVFS1_DFS_EXT_DET_WIDTH 7
  55. #define GPCPLL_DVFS1_DFS_EXT_STRB_SHIFT 7
  56. #define GPCPLL_DVFS1_DFS_EXT_STRB_WIDTH 1
  57. #define GPCPLL_DVFS1_DFS_EXT_CAL_SHIFT 8
  58. #define GPCPLL_DVFS1_DFS_EXT_CAL_WIDTH 7
  59. #define GPCPLL_DVFS1_DFS_EXT_SEL_SHIFT 15
  60. #define GPCPLL_DVFS1_DFS_EXT_SEL_WIDTH 1
  61. #define GPCPLL_DVFS1_DFS_CTRL_SHIFT 16
  62. #define GPCPLL_DVFS1_DFS_CTRL_WIDTH 12
  63. #define GPCPLL_DVFS1_EN_SDM_SHIFT 28
  64. #define GPCPLL_DVFS1_EN_SDM_WIDTH 1
  65. #define GPCPLL_DVFS1_EN_SDM_BIT BIT(28)
  66. #define GPCPLL_DVFS1_EN_DFS_SHIFT 29
  67. #define GPCPLL_DVFS1_EN_DFS_WIDTH 1
  68. #define GPCPLL_DVFS1_EN_DFS_BIT BIT(29)
  69. #define GPCPLL_DVFS1_EN_DFS_CAL_SHIFT 30
  70. #define GPCPLL_DVFS1_EN_DFS_CAL_WIDTH 1
  71. #define GPCPLL_DVFS1_EN_DFS_CAL_BIT BIT(30)
  72. #define GPCPLL_DVFS1_DFS_CAL_DONE_SHIFT 31
  73. #define GPCPLL_DVFS1_DFS_CAL_DONE_WIDTH 1
  74. #define GPCPLL_DVFS1_DFS_CAL_DONE_BIT BIT(31)
  75. #define GPC_BCAST_GPCPLL_DVFS2 (GPC_BCAST_GPCPLL_CFG_BASE + 0x20)
  76. #define GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT BIT(16)
  77. #define GPCPLL_CFG3_PLL_DFS_TESTOUT_SHIFT 24
  78. #define GPCPLL_CFG3_PLL_DFS_TESTOUT_WIDTH 7
  79. #define DFS_DET_RANGE 6 /* -2^6 ... 2^6-1 */
  80. #define SDM_DIN_RANGE 12 /* -2^12 ... 2^12-1 */
  81. struct gm20b_clk_dvfs_params {
  82. s32 coeff_slope;
  83. s32 coeff_offs;
  84. u32 vco_ctrl;
  85. };
  86. static const struct gm20b_clk_dvfs_params gm20b_dvfs_params = {
  87. .coeff_slope = -165230,
  88. .coeff_offs = 214007,
  89. .vco_ctrl = 0x7 << 3,
  90. };
  91. /*
  92. * base.n is now the *integer* part of the N factor.
  93. * sdm_din contains n's decimal part.
  94. */
  95. struct gm20b_pll {
  96. struct gk20a_pll base;
  97. u32 sdm_din;
  98. };
  99. struct gm20b_clk_dvfs {
  100. u32 dfs_coeff;
  101. s32 dfs_det_max;
  102. s32 dfs_ext_cal;
  103. };
  104. struct gm20b_clk {
  105. /* currently applied parameters */
  106. struct gk20a_clk base;
  107. struct gm20b_clk_dvfs dvfs;
  108. u32 uv;
  109. /* new parameters to apply */
  110. struct gk20a_pll new_pll;
  111. struct gm20b_clk_dvfs new_dvfs;
  112. u32 new_uv;
  113. const struct gm20b_clk_dvfs_params *dvfs_params;
  114. /* fused parameters */
  115. s32 uvdet_slope;
  116. s32 uvdet_offs;
  117. /* safe frequency we can use at minimum voltage */
  118. u32 safe_fmax_vmin;
  119. };
  120. #define gm20b_clk(p) container_of((gk20a_clk(p)), struct gm20b_clk, base)
  121. static u32 pl_to_div(u32 pl)
  122. {
  123. return pl;
  124. }
  125. static u32 div_to_pl(u32 div)
  126. {
  127. return div;
  128. }
  129. static const struct gk20a_clk_pllg_params gm20b_pllg_params = {
  130. .min_vco = 1300000, .max_vco = 2600000,
  131. .min_u = 12000, .max_u = 38400,
  132. .min_m = 1, .max_m = 255,
  133. .min_n = 8, .max_n = 255,
  134. .min_pl = 1, .max_pl = 31,
  135. };
  136. static void
  137. gm20b_pllg_read_mnp(struct gm20b_clk *clk, struct gm20b_pll *pll)
  138. {
  139. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  140. struct nvkm_device *device = subdev->device;
  141. u32 val;
  142. gk20a_pllg_read_mnp(&clk->base, &pll->base);
  143. val = nvkm_rd32(device, GPCPLL_CFG2);
  144. pll->sdm_din = (val >> GPCPLL_CFG2_SDM_DIN_SHIFT) &
  145. MASK(GPCPLL_CFG2_SDM_DIN_WIDTH);
  146. }
  147. static void
  148. gm20b_pllg_write_mnp(struct gm20b_clk *clk, const struct gm20b_pll *pll)
  149. {
  150. struct nvkm_device *device = clk->base.base.subdev.device;
  151. nvkm_mask(device, GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_MASK,
  152. pll->sdm_din << GPCPLL_CFG2_SDM_DIN_SHIFT);
  153. gk20a_pllg_write_mnp(&clk->base, &pll->base);
  154. }
  155. /*
  156. * Determine DFS_COEFF for the requested voltage. Always select external
  157. * calibration override equal to the voltage, and set maximum detection
  158. * limit "0" (to make sure that PLL output remains under F/V curve when
  159. * voltage increases).
  160. */
  161. static void
  162. gm20b_dvfs_calc_det_coeff(struct gm20b_clk *clk, s32 uv,
  163. struct gm20b_clk_dvfs *dvfs)
  164. {
  165. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  166. const struct gm20b_clk_dvfs_params *p = clk->dvfs_params;
  167. u32 coeff;
  168. /* Work with mv as uv would likely trigger an overflow */
  169. s32 mv = DIV_ROUND_CLOSEST(uv, 1000);
  170. /* coeff = slope * voltage + offset */
  171. coeff = DIV_ROUND_CLOSEST(mv * p->coeff_slope, 1000) + p->coeff_offs;
  172. coeff = DIV_ROUND_CLOSEST(coeff, 1000);
  173. dvfs->dfs_coeff = min_t(u32, coeff, MASK(GPCPLL_DVFS0_DFS_COEFF_WIDTH));
  174. dvfs->dfs_ext_cal = DIV_ROUND_CLOSEST(uv - clk->uvdet_offs,
  175. clk->uvdet_slope);
  176. /* should never happen */
  177. if (abs(dvfs->dfs_ext_cal) >= BIT(DFS_DET_RANGE))
  178. nvkm_error(subdev, "dfs_ext_cal overflow!\n");
  179. dvfs->dfs_det_max = 0;
  180. nvkm_debug(subdev, "%s uv: %d coeff: %x, ext_cal: %d, det_max: %d\n",
  181. __func__, uv, dvfs->dfs_coeff, dvfs->dfs_ext_cal,
  182. dvfs->dfs_det_max);
  183. }
  184. /*
  185. * Solve equation for integer and fractional part of the effective NDIV:
  186. *
  187. * n_eff = n_int + 1/2 + (SDM_DIN / 2^(SDM_DIN_RANGE + 1)) +
  188. * (DVFS_COEFF * DVFS_DET_DELTA) / 2^DFS_DET_RANGE
  189. *
  190. * The SDM_DIN LSB is finally shifted out, since it is not accessible by sw.
  191. */
  192. static void
  193. gm20b_dvfs_calc_ndiv(struct gm20b_clk *clk, u32 n_eff, u32 *n_int, u32 *sdm_din)
  194. {
  195. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  196. const struct gk20a_clk_pllg_params *p = clk->base.params;
  197. u32 n;
  198. s32 det_delta;
  199. u32 rem, rem_range;
  200. /* calculate current ext_cal and subtract previous one */
  201. det_delta = DIV_ROUND_CLOSEST(((s32)clk->uv) - clk->uvdet_offs,
  202. clk->uvdet_slope);
  203. det_delta -= clk->dvfs.dfs_ext_cal;
  204. det_delta = min(det_delta, clk->dvfs.dfs_det_max);
  205. det_delta *= clk->dvfs.dfs_coeff;
  206. /* integer part of n */
  207. n = (n_eff << DFS_DET_RANGE) - det_delta;
  208. /* should never happen! */
  209. if (n <= 0) {
  210. nvkm_error(subdev, "ndiv <= 0 - setting to 1...\n");
  211. n = 1 << DFS_DET_RANGE;
  212. }
  213. if (n >> DFS_DET_RANGE > p->max_n) {
  214. nvkm_error(subdev, "ndiv > max_n - setting to max_n...\n");
  215. n = p->max_n << DFS_DET_RANGE;
  216. }
  217. *n_int = n >> DFS_DET_RANGE;
  218. /* fractional part of n */
  219. rem = ((u32)n) & MASK(DFS_DET_RANGE);
  220. rem_range = SDM_DIN_RANGE + 1 - DFS_DET_RANGE;
  221. /* subtract 2^SDM_DIN_RANGE to account for the 1/2 of the equation */
  222. rem = (rem << rem_range) - BIT(SDM_DIN_RANGE);
  223. /* lose 8 LSB and clip - sdm_din only keeps the most significant byte */
  224. *sdm_din = (rem >> BITS_PER_BYTE) & MASK(GPCPLL_CFG2_SDM_DIN_WIDTH);
  225. nvkm_debug(subdev, "%s n_eff: %d, n_int: %d, sdm_din: %d\n", __func__,
  226. n_eff, *n_int, *sdm_din);
  227. }
  228. static int
  229. gm20b_pllg_slide(struct gm20b_clk *clk, u32 n)
  230. {
  231. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  232. struct nvkm_device *device = subdev->device;
  233. struct gm20b_pll pll;
  234. u32 n_int, sdm_din;
  235. int ret = 0;
  236. /* calculate the new n_int/sdm_din for this n/uv */
  237. gm20b_dvfs_calc_ndiv(clk, n, &n_int, &sdm_din);
  238. /* get old coefficients */
  239. gm20b_pllg_read_mnp(clk, &pll);
  240. /* do nothing if NDIV is the same */
  241. if (n_int == pll.base.n && sdm_din == pll.sdm_din)
  242. return 0;
  243. /* pll slowdown mode */
  244. nvkm_mask(device, GPCPLL_NDIV_SLOWDOWN,
  245. BIT(GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_SHIFT),
  246. BIT(GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_SHIFT));
  247. /* new ndiv ready for ramp */
  248. /* in DVFS mode SDM is updated via "new" field */
  249. nvkm_mask(device, GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_NEW_MASK,
  250. sdm_din << GPCPLL_CFG2_SDM_DIN_NEW_SHIFT);
  251. pll.base.n = n_int;
  252. udelay(1);
  253. gk20a_pllg_write_mnp(&clk->base, &pll.base);
  254. /* dynamic ramp to new ndiv */
  255. udelay(1);
  256. nvkm_mask(device, GPCPLL_NDIV_SLOWDOWN,
  257. BIT(GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_SHIFT),
  258. BIT(GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_SHIFT));
  259. /* wait for ramping to complete */
  260. if (nvkm_wait_usec(device, 500, GPC_BCAST_NDIV_SLOWDOWN_DEBUG,
  261. GPC_BCAST_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_MASK,
  262. GPC_BCAST_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_MASK) < 0)
  263. ret = -ETIMEDOUT;
  264. /* in DVFS mode complete SDM update */
  265. nvkm_mask(device, GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_MASK,
  266. sdm_din << GPCPLL_CFG2_SDM_DIN_SHIFT);
  267. /* exit slowdown mode */
  268. nvkm_mask(device, GPCPLL_NDIV_SLOWDOWN,
  269. BIT(GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_SHIFT) |
  270. BIT(GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_SHIFT), 0);
  271. nvkm_rd32(device, GPCPLL_NDIV_SLOWDOWN);
  272. return ret;
  273. }
  274. static int
  275. gm20b_pllg_enable(struct gm20b_clk *clk)
  276. {
  277. struct nvkm_device *device = clk->base.base.subdev.device;
  278. nvkm_mask(device, GPCPLL_CFG, GPCPLL_CFG_ENABLE, GPCPLL_CFG_ENABLE);
  279. nvkm_rd32(device, GPCPLL_CFG);
  280. /* In DVFS mode lock cannot be used - so just delay */
  281. udelay(40);
  282. /* set SYNC_MODE for glitchless switch out of bypass */
  283. nvkm_mask(device, GPCPLL_CFG, GPCPLL_CFG_SYNC_MODE,
  284. GPCPLL_CFG_SYNC_MODE);
  285. nvkm_rd32(device, GPCPLL_CFG);
  286. /* switch to VCO mode */
  287. nvkm_mask(device, SEL_VCO, BIT(SEL_VCO_GPC2CLK_OUT_SHIFT),
  288. BIT(SEL_VCO_GPC2CLK_OUT_SHIFT));
  289. return 0;
  290. }
  291. static void
  292. gm20b_pllg_disable(struct gm20b_clk *clk)
  293. {
  294. struct nvkm_device *device = clk->base.base.subdev.device;
  295. /* put PLL in bypass before disabling it */
  296. nvkm_mask(device, SEL_VCO, BIT(SEL_VCO_GPC2CLK_OUT_SHIFT), 0);
  297. /* clear SYNC_MODE before disabling PLL */
  298. nvkm_mask(device, GPCPLL_CFG, GPCPLL_CFG_SYNC_MODE, 0);
  299. nvkm_mask(device, GPCPLL_CFG, GPCPLL_CFG_ENABLE, 0);
  300. nvkm_rd32(device, GPCPLL_CFG);
  301. }
  302. static int
  303. gm20b_pllg_program_mnp(struct gm20b_clk *clk, const struct gk20a_pll *pll)
  304. {
  305. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  306. struct nvkm_device *device = subdev->device;
  307. struct gm20b_pll cur_pll;
  308. u32 n_int, sdm_din;
  309. /* if we only change pdiv, we can do a glitchless transition */
  310. bool pdiv_only;
  311. int ret;
  312. gm20b_dvfs_calc_ndiv(clk, pll->n, &n_int, &sdm_din);
  313. gm20b_pllg_read_mnp(clk, &cur_pll);
  314. pdiv_only = cur_pll.base.n == n_int && cur_pll.sdm_din == sdm_din &&
  315. cur_pll.base.m == pll->m;
  316. /* need full sequence if clock not enabled yet */
  317. if (!gk20a_pllg_is_enabled(&clk->base))
  318. pdiv_only = false;
  319. /* split VCO-to-bypass jump in half by setting out divider 1:2 */
  320. nvkm_mask(device, GPC2CLK_OUT, GPC2CLK_OUT_VCODIV_MASK,
  321. GPC2CLK_OUT_VCODIV2 << GPC2CLK_OUT_VCODIV_SHIFT);
  322. /* Intentional 2nd write to assure linear divider operation */
  323. nvkm_mask(device, GPC2CLK_OUT, GPC2CLK_OUT_VCODIV_MASK,
  324. GPC2CLK_OUT_VCODIV2 << GPC2CLK_OUT_VCODIV_SHIFT);
  325. nvkm_rd32(device, GPC2CLK_OUT);
  326. udelay(2);
  327. if (pdiv_only) {
  328. u32 old = cur_pll.base.pl;
  329. u32 new = pll->pl;
  330. /*
  331. * we can do a glitchless transition only if the old and new PL
  332. * parameters share at least one bit set to 1. If this is not
  333. * the case, calculate and program an interim PL that will allow
  334. * us to respect that rule.
  335. */
  336. if ((old & new) == 0) {
  337. cur_pll.base.pl = min(old | BIT(ffs(new) - 1),
  338. new | BIT(ffs(old) - 1));
  339. gk20a_pllg_write_mnp(&clk->base, &cur_pll.base);
  340. }
  341. cur_pll.base.pl = new;
  342. gk20a_pllg_write_mnp(&clk->base, &cur_pll.base);
  343. } else {
  344. /* disable before programming if more than pdiv changes */
  345. gm20b_pllg_disable(clk);
  346. cur_pll.base = *pll;
  347. cur_pll.base.n = n_int;
  348. cur_pll.sdm_din = sdm_din;
  349. gm20b_pllg_write_mnp(clk, &cur_pll);
  350. ret = gm20b_pllg_enable(clk);
  351. if (ret)
  352. return ret;
  353. }
  354. /* restore out divider 1:1 */
  355. udelay(2);
  356. nvkm_mask(device, GPC2CLK_OUT, GPC2CLK_OUT_VCODIV_MASK,
  357. GPC2CLK_OUT_VCODIV1 << GPC2CLK_OUT_VCODIV_SHIFT);
  358. /* Intentional 2nd write to assure linear divider operation */
  359. nvkm_mask(device, GPC2CLK_OUT, GPC2CLK_OUT_VCODIV_MASK,
  360. GPC2CLK_OUT_VCODIV1 << GPC2CLK_OUT_VCODIV_SHIFT);
  361. nvkm_rd32(device, GPC2CLK_OUT);
  362. return 0;
  363. }
  364. static int
  365. gm20b_pllg_program_mnp_slide(struct gm20b_clk *clk, const struct gk20a_pll *pll)
  366. {
  367. struct gk20a_pll cur_pll;
  368. int ret;
  369. if (gk20a_pllg_is_enabled(&clk->base)) {
  370. gk20a_pllg_read_mnp(&clk->base, &cur_pll);
  371. /* just do NDIV slide if there is no change to M and PL */
  372. if (pll->m == cur_pll.m && pll->pl == cur_pll.pl)
  373. return gm20b_pllg_slide(clk, pll->n);
  374. /* slide down to current NDIV_LO */
  375. cur_pll.n = gk20a_pllg_n_lo(&clk->base, &cur_pll);
  376. ret = gm20b_pllg_slide(clk, cur_pll.n);
  377. if (ret)
  378. return ret;
  379. }
  380. /* program MNP with the new clock parameters and new NDIV_LO */
  381. cur_pll = *pll;
  382. cur_pll.n = gk20a_pllg_n_lo(&clk->base, &cur_pll);
  383. ret = gm20b_pllg_program_mnp(clk, &cur_pll);
  384. if (ret)
  385. return ret;
  386. /* slide up to new NDIV */
  387. return gm20b_pllg_slide(clk, pll->n);
  388. }
  389. static int
  390. gm20b_clk_calc(struct nvkm_clk *base, struct nvkm_cstate *cstate)
  391. {
  392. struct gm20b_clk *clk = gm20b_clk(base);
  393. struct nvkm_subdev *subdev = &base->subdev;
  394. struct nvkm_volt *volt = base->subdev.device->volt;
  395. int ret;
  396. ret = gk20a_pllg_calc_mnp(&clk->base, cstate->domain[nv_clk_src_gpc] *
  397. GK20A_CLK_GPC_MDIV, &clk->new_pll);
  398. if (ret)
  399. return ret;
  400. clk->new_uv = volt->vid[cstate->voltage].uv;
  401. gm20b_dvfs_calc_det_coeff(clk, clk->new_uv, &clk->new_dvfs);
  402. nvkm_debug(subdev, "%s uv: %d uv\n", __func__, clk->new_uv);
  403. return 0;
  404. }
  405. /*
  406. * Compute PLL parameters that are always safe for the current voltage
  407. */
  408. static void
  409. gm20b_dvfs_calc_safe_pll(struct gm20b_clk *clk, struct gk20a_pll *pll)
  410. {
  411. u32 rate = gk20a_pllg_calc_rate(&clk->base, pll) / KHZ;
  412. u32 parent_rate = clk->base.parent_rate / KHZ;
  413. u32 nmin, nsafe;
  414. /* remove a safe margin of 10% */
  415. if (rate > clk->safe_fmax_vmin)
  416. rate = rate * (100 - 10) / 100;
  417. /* gpc2clk */
  418. rate *= 2;
  419. nmin = DIV_ROUND_UP(pll->m * clk->base.params->min_vco, parent_rate);
  420. nsafe = pll->m * rate / (clk->base.parent_rate);
  421. if (nsafe < nmin) {
  422. pll->pl = DIV_ROUND_UP(nmin * parent_rate, pll->m * rate);
  423. nsafe = nmin;
  424. }
  425. pll->n = nsafe;
  426. }
  427. static void
  428. gm20b_dvfs_program_coeff(struct gm20b_clk *clk, u32 coeff)
  429. {
  430. struct nvkm_device *device = clk->base.base.subdev.device;
  431. /* strobe to read external DFS coefficient */
  432. nvkm_mask(device, GPC_BCAST_GPCPLL_DVFS2,
  433. GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT,
  434. GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT);
  435. nvkm_mask(device, GPCPLL_DVFS0, GPCPLL_DVFS0_DFS_COEFF_MASK,
  436. coeff << GPCPLL_DVFS0_DFS_COEFF_SHIFT);
  437. udelay(1);
  438. nvkm_mask(device, GPC_BCAST_GPCPLL_DVFS2,
  439. GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT, 0);
  440. }
  441. static void
  442. gm20b_dvfs_program_ext_cal(struct gm20b_clk *clk, u32 dfs_det_cal)
  443. {
  444. struct nvkm_device *device = clk->base.base.subdev.device;
  445. u32 val;
  446. nvkm_mask(device, GPC_BCAST_GPCPLL_DVFS2, MASK(DFS_DET_RANGE + 1),
  447. dfs_det_cal);
  448. udelay(1);
  449. val = nvkm_rd32(device, GPCPLL_DVFS1);
  450. if (!(val & BIT(25))) {
  451. /* Use external value to overwrite calibration value */
  452. val |= BIT(25) | BIT(16);
  453. nvkm_wr32(device, GPCPLL_DVFS1, val);
  454. }
  455. }
  456. static void
  457. gm20b_dvfs_program_dfs_detection(struct gm20b_clk *clk,
  458. struct gm20b_clk_dvfs *dvfs)
  459. {
  460. struct nvkm_device *device = clk->base.base.subdev.device;
  461. /* strobe to read external DFS coefficient */
  462. nvkm_mask(device, GPC_BCAST_GPCPLL_DVFS2,
  463. GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT,
  464. GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT);
  465. nvkm_mask(device, GPCPLL_DVFS0,
  466. GPCPLL_DVFS0_DFS_COEFF_MASK | GPCPLL_DVFS0_DFS_DET_MAX_MASK,
  467. dvfs->dfs_coeff << GPCPLL_DVFS0_DFS_COEFF_SHIFT |
  468. dvfs->dfs_det_max << GPCPLL_DVFS0_DFS_DET_MAX_SHIFT);
  469. udelay(1);
  470. nvkm_mask(device, GPC_BCAST_GPCPLL_DVFS2,
  471. GPC_BCAST_GPCPLL_DVFS2_DFS_EXT_STROBE_BIT, 0);
  472. gm20b_dvfs_program_ext_cal(clk, dvfs->dfs_ext_cal);
  473. }
  474. static int
  475. gm20b_clk_prog(struct nvkm_clk *base)
  476. {
  477. struct gm20b_clk *clk = gm20b_clk(base);
  478. u32 cur_freq;
  479. int ret;
  480. /* No change in DVFS settings? */
  481. if (clk->uv == clk->new_uv)
  482. goto prog;
  483. /*
  484. * Interim step for changing DVFS detection settings: low enough
  485. * frequency to be safe at at DVFS coeff = 0.
  486. *
  487. * 1. If voltage is increasing:
  488. * - safe frequency target matches the lowest - old - frequency
  489. * - DVFS settings are still old
  490. * - Voltage already increased to new level by volt, but maximum
  491. * detection limit assures PLL output remains under F/V curve
  492. *
  493. * 2. If voltage is decreasing:
  494. * - safe frequency target matches the lowest - new - frequency
  495. * - DVFS settings are still old
  496. * - Voltage is also old, it will be lowered by volt afterwards
  497. *
  498. * Interim step can be skipped if old frequency is below safe minimum,
  499. * i.e., it is low enough to be safe at any voltage in operating range
  500. * with zero DVFS coefficient.
  501. */
  502. cur_freq = nvkm_clk_read(&clk->base.base, nv_clk_src_gpc);
  503. if (cur_freq > clk->safe_fmax_vmin) {
  504. struct gk20a_pll pll_safe;
  505. if (clk->uv < clk->new_uv)
  506. /* voltage will raise: safe frequency is current one */
  507. pll_safe = clk->base.pll;
  508. else
  509. /* voltage will drop: safe frequency is new one */
  510. pll_safe = clk->new_pll;
  511. gm20b_dvfs_calc_safe_pll(clk, &pll_safe);
  512. ret = gm20b_pllg_program_mnp_slide(clk, &pll_safe);
  513. if (ret)
  514. return ret;
  515. }
  516. /*
  517. * DVFS detection settings transition:
  518. * - Set DVFS coefficient zero
  519. * - Set calibration level to new voltage
  520. * - Set DVFS coefficient to match new voltage
  521. */
  522. gm20b_dvfs_program_coeff(clk, 0);
  523. gm20b_dvfs_program_ext_cal(clk, clk->new_dvfs.dfs_ext_cal);
  524. gm20b_dvfs_program_coeff(clk, clk->new_dvfs.dfs_coeff);
  525. gm20b_dvfs_program_dfs_detection(clk, &clk->new_dvfs);
  526. prog:
  527. clk->uv = clk->new_uv;
  528. clk->dvfs = clk->new_dvfs;
  529. clk->base.pll = clk->new_pll;
  530. return gm20b_pllg_program_mnp_slide(clk, &clk->base.pll);
  531. }
  532. static struct nvkm_pstate
  533. gm20b_pstates[] = {
  534. {
  535. .base = {
  536. .domain[nv_clk_src_gpc] = 76800,
  537. .voltage = 0,
  538. },
  539. },
  540. {
  541. .base = {
  542. .domain[nv_clk_src_gpc] = 153600,
  543. .voltage = 1,
  544. },
  545. },
  546. {
  547. .base = {
  548. .domain[nv_clk_src_gpc] = 230400,
  549. .voltage = 2,
  550. },
  551. },
  552. {
  553. .base = {
  554. .domain[nv_clk_src_gpc] = 307200,
  555. .voltage = 3,
  556. },
  557. },
  558. {
  559. .base = {
  560. .domain[nv_clk_src_gpc] = 384000,
  561. .voltage = 4,
  562. },
  563. },
  564. {
  565. .base = {
  566. .domain[nv_clk_src_gpc] = 460800,
  567. .voltage = 5,
  568. },
  569. },
  570. {
  571. .base = {
  572. .domain[nv_clk_src_gpc] = 537600,
  573. .voltage = 6,
  574. },
  575. },
  576. {
  577. .base = {
  578. .domain[nv_clk_src_gpc] = 614400,
  579. .voltage = 7,
  580. },
  581. },
  582. {
  583. .base = {
  584. .domain[nv_clk_src_gpc] = 691200,
  585. .voltage = 8,
  586. },
  587. },
  588. {
  589. .base = {
  590. .domain[nv_clk_src_gpc] = 768000,
  591. .voltage = 9,
  592. },
  593. },
  594. {
  595. .base = {
  596. .domain[nv_clk_src_gpc] = 844800,
  597. .voltage = 10,
  598. },
  599. },
  600. {
  601. .base = {
  602. .domain[nv_clk_src_gpc] = 921600,
  603. .voltage = 11,
  604. },
  605. },
  606. {
  607. .base = {
  608. .domain[nv_clk_src_gpc] = 998400,
  609. .voltage = 12,
  610. },
  611. },
  612. };
  613. static void
  614. gm20b_clk_fini(struct nvkm_clk *base)
  615. {
  616. struct nvkm_device *device = base->subdev.device;
  617. struct gm20b_clk *clk = gm20b_clk(base);
  618. /* slide to VCO min */
  619. if (gk20a_pllg_is_enabled(&clk->base)) {
  620. struct gk20a_pll pll;
  621. u32 n_lo;
  622. gk20a_pllg_read_mnp(&clk->base, &pll);
  623. n_lo = gk20a_pllg_n_lo(&clk->base, &pll);
  624. gm20b_pllg_slide(clk, n_lo);
  625. }
  626. gm20b_pllg_disable(clk);
  627. /* set IDDQ */
  628. nvkm_mask(device, GPCPLL_CFG, GPCPLL_CFG_IDDQ, 1);
  629. }
  630. static int
  631. gm20b_clk_init_dvfs(struct gm20b_clk *clk)
  632. {
  633. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  634. struct nvkm_device *device = subdev->device;
  635. bool fused = clk->uvdet_offs && clk->uvdet_slope;
  636. static const s32 ADC_SLOPE_UV = 10000; /* default ADC detection slope */
  637. u32 data;
  638. int ret;
  639. /* Enable NA DVFS */
  640. nvkm_mask(device, GPCPLL_DVFS1, GPCPLL_DVFS1_EN_DFS_BIT,
  641. GPCPLL_DVFS1_EN_DFS_BIT);
  642. /* Set VCO_CTRL */
  643. if (clk->dvfs_params->vco_ctrl)
  644. nvkm_mask(device, GPCPLL_CFG3, GPCPLL_CFG3_VCO_CTRL_MASK,
  645. clk->dvfs_params->vco_ctrl << GPCPLL_CFG3_VCO_CTRL_SHIFT);
  646. if (fused) {
  647. /* Start internal calibration, but ignore results */
  648. nvkm_mask(device, GPCPLL_DVFS1, GPCPLL_DVFS1_EN_DFS_CAL_BIT,
  649. GPCPLL_DVFS1_EN_DFS_CAL_BIT);
  650. /* got uvdev parameters from fuse, skip calibration */
  651. goto calibrated;
  652. }
  653. /*
  654. * If calibration parameters are not fused, start internal calibration,
  655. * wait for completion, and use results along with default slope to
  656. * calculate ADC offset during boot.
  657. */
  658. nvkm_mask(device, GPCPLL_DVFS1, GPCPLL_DVFS1_EN_DFS_CAL_BIT,
  659. GPCPLL_DVFS1_EN_DFS_CAL_BIT);
  660. /* Wait for internal calibration done (spec < 2us). */
  661. ret = nvkm_wait_usec(device, 10, GPCPLL_DVFS1,
  662. GPCPLL_DVFS1_DFS_CAL_DONE_BIT,
  663. GPCPLL_DVFS1_DFS_CAL_DONE_BIT);
  664. if (ret < 0) {
  665. nvkm_error(subdev, "GPCPLL calibration timeout\n");
  666. return -ETIMEDOUT;
  667. }
  668. data = nvkm_rd32(device, GPCPLL_CFG3) >>
  669. GPCPLL_CFG3_PLL_DFS_TESTOUT_SHIFT;
  670. data &= MASK(GPCPLL_CFG3_PLL_DFS_TESTOUT_WIDTH);
  671. clk->uvdet_slope = ADC_SLOPE_UV;
  672. clk->uvdet_offs = ((s32)clk->uv) - data * ADC_SLOPE_UV;
  673. nvkm_debug(subdev, "calibrated DVFS parameters: offs %d, slope %d\n",
  674. clk->uvdet_offs, clk->uvdet_slope);
  675. calibrated:
  676. /* Compute and apply initial DVFS parameters */
  677. gm20b_dvfs_calc_det_coeff(clk, clk->uv, &clk->dvfs);
  678. gm20b_dvfs_program_coeff(clk, 0);
  679. gm20b_dvfs_program_ext_cal(clk, clk->dvfs.dfs_ext_cal);
  680. gm20b_dvfs_program_coeff(clk, clk->dvfs.dfs_coeff);
  681. gm20b_dvfs_program_dfs_detection(clk, &clk->new_dvfs);
  682. return 0;
  683. }
  684. /* Forward declaration to detect speedo >=1 in gm20b_clk_init() */
  685. static const struct nvkm_clk_func gm20b_clk;
  686. static int
  687. gm20b_clk_init(struct nvkm_clk *base)
  688. {
  689. struct gk20a_clk *clk = gk20a_clk(base);
  690. struct nvkm_subdev *subdev = &clk->base.subdev;
  691. struct nvkm_device *device = subdev->device;
  692. int ret;
  693. u32 data;
  694. /* get out from IDDQ */
  695. nvkm_mask(device, GPCPLL_CFG, GPCPLL_CFG_IDDQ, 0);
  696. nvkm_rd32(device, GPCPLL_CFG);
  697. udelay(5);
  698. nvkm_mask(device, GPC2CLK_OUT, GPC2CLK_OUT_INIT_MASK,
  699. GPC2CLK_OUT_INIT_VAL);
  700. /* Set the global bypass control to VCO */
  701. nvkm_mask(device, BYPASSCTRL_SYS,
  702. MASK(BYPASSCTRL_SYS_GPCPLL_WIDTH) << BYPASSCTRL_SYS_GPCPLL_SHIFT,
  703. 0);
  704. ret = gk20a_clk_setup_slide(clk);
  705. if (ret)
  706. return ret;
  707. /* If not fused, set RAM SVOP PDP data 0x2, and enable fuse override */
  708. data = nvkm_rd32(device, 0x021944);
  709. if (!(data & 0x3)) {
  710. data |= 0x2;
  711. nvkm_wr32(device, 0x021944, data);
  712. data = nvkm_rd32(device, 0x021948);
  713. data |= 0x1;
  714. nvkm_wr32(device, 0x021948, data);
  715. }
  716. /* Disable idle slow down */
  717. nvkm_mask(device, 0x20160, 0x003f0000, 0x0);
  718. /* speedo >= 1? */
  719. if (clk->base.func == &gm20b_clk) {
  720. struct gm20b_clk *_clk = gm20b_clk(base);
  721. struct nvkm_volt *volt = device->volt;
  722. /* Get current voltage */
  723. _clk->uv = nvkm_volt_get(volt);
  724. /* Initialize DVFS */
  725. ret = gm20b_clk_init_dvfs(_clk);
  726. if (ret)
  727. return ret;
  728. }
  729. /* Start with lowest frequency */
  730. base->func->calc(base, &base->func->pstates[0].base);
  731. ret = base->func->prog(base);
  732. if (ret) {
  733. nvkm_error(subdev, "cannot initialize clock\n");
  734. return ret;
  735. }
  736. return 0;
  737. }
  738. static const struct nvkm_clk_func
  739. gm20b_clk_speedo0 = {
  740. .init = gm20b_clk_init,
  741. .fini = gk20a_clk_fini,
  742. .read = gk20a_clk_read,
  743. .calc = gk20a_clk_calc,
  744. .prog = gk20a_clk_prog,
  745. .tidy = gk20a_clk_tidy,
  746. .pstates = gm20b_pstates,
  747. /* Speedo 0 only supports 12 voltages */
  748. .nr_pstates = ARRAY_SIZE(gm20b_pstates) - 1,
  749. .domains = {
  750. { nv_clk_src_crystal, 0xff },
  751. { nv_clk_src_gpc, 0xff, 0, "core", GK20A_CLK_GPC_MDIV },
  752. { nv_clk_src_max },
  753. },
  754. };
  755. static const struct nvkm_clk_func
  756. gm20b_clk = {
  757. .init = gm20b_clk_init,
  758. .fini = gm20b_clk_fini,
  759. .read = gk20a_clk_read,
  760. .calc = gm20b_clk_calc,
  761. .prog = gm20b_clk_prog,
  762. .tidy = gk20a_clk_tidy,
  763. .pstates = gm20b_pstates,
  764. .nr_pstates = ARRAY_SIZE(gm20b_pstates),
  765. .domains = {
  766. { nv_clk_src_crystal, 0xff },
  767. { nv_clk_src_gpc, 0xff, 0, "core", GK20A_CLK_GPC_MDIV },
  768. { nv_clk_src_max },
  769. },
  770. };
  771. static int
  772. gm20b_clk_new_speedo0(struct nvkm_device *device, int index,
  773. struct nvkm_clk **pclk)
  774. {
  775. struct gk20a_clk *clk;
  776. int ret;
  777. clk = kzalloc(sizeof(*clk), GFP_KERNEL);
  778. if (!clk)
  779. return -ENOMEM;
  780. *pclk = &clk->base;
  781. ret = gk20a_clk_ctor(device, index, &gm20b_clk_speedo0,
  782. &gm20b_pllg_params, clk);
  783. clk->pl_to_div = pl_to_div;
  784. clk->div_to_pl = div_to_pl;
  785. return ret;
  786. }
  787. /* FUSE register */
  788. #define FUSE_RESERVED_CALIB0 0x204
  789. #define FUSE_RESERVED_CALIB0_INTERCEPT_FRAC_SHIFT 0
  790. #define FUSE_RESERVED_CALIB0_INTERCEPT_FRAC_WIDTH 4
  791. #define FUSE_RESERVED_CALIB0_INTERCEPT_INT_SHIFT 4
  792. #define FUSE_RESERVED_CALIB0_INTERCEPT_INT_WIDTH 10
  793. #define FUSE_RESERVED_CALIB0_SLOPE_FRAC_SHIFT 14
  794. #define FUSE_RESERVED_CALIB0_SLOPE_FRAC_WIDTH 10
  795. #define FUSE_RESERVED_CALIB0_SLOPE_INT_SHIFT 24
  796. #define FUSE_RESERVED_CALIB0_SLOPE_INT_WIDTH 6
  797. #define FUSE_RESERVED_CALIB0_FUSE_REV_SHIFT 30
  798. #define FUSE_RESERVED_CALIB0_FUSE_REV_WIDTH 2
  799. static int
  800. gm20b_clk_init_fused_params(struct gm20b_clk *clk)
  801. {
  802. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  803. u32 val = 0;
  804. u32 rev = 0;
  805. #if IS_ENABLED(CONFIG_ARCH_TEGRA)
  806. tegra_fuse_readl(FUSE_RESERVED_CALIB0, &val);
  807. rev = (val >> FUSE_RESERVED_CALIB0_FUSE_REV_SHIFT) &
  808. MASK(FUSE_RESERVED_CALIB0_FUSE_REV_WIDTH);
  809. #endif
  810. /* No fused parameters, we will calibrate later */
  811. if (rev == 0)
  812. return -EINVAL;
  813. /* Integer part in mV + fractional part in uV */
  814. clk->uvdet_slope = ((val >> FUSE_RESERVED_CALIB0_SLOPE_INT_SHIFT) &
  815. MASK(FUSE_RESERVED_CALIB0_SLOPE_INT_WIDTH)) * 1000 +
  816. ((val >> FUSE_RESERVED_CALIB0_SLOPE_FRAC_SHIFT) &
  817. MASK(FUSE_RESERVED_CALIB0_SLOPE_FRAC_WIDTH));
  818. /* Integer part in mV + fractional part in 100uV */
  819. clk->uvdet_offs = ((val >> FUSE_RESERVED_CALIB0_INTERCEPT_INT_SHIFT) &
  820. MASK(FUSE_RESERVED_CALIB0_INTERCEPT_INT_WIDTH)) * 1000 +
  821. ((val >> FUSE_RESERVED_CALIB0_INTERCEPT_FRAC_SHIFT) &
  822. MASK(FUSE_RESERVED_CALIB0_INTERCEPT_FRAC_WIDTH)) * 100;
  823. nvkm_debug(subdev, "fused calibration data: slope %d, offs %d\n",
  824. clk->uvdet_slope, clk->uvdet_offs);
  825. return 0;
  826. }
  827. static int
  828. gm20b_clk_init_safe_fmax(struct gm20b_clk *clk)
  829. {
  830. struct nvkm_subdev *subdev = &clk->base.base.subdev;
  831. struct nvkm_volt *volt = subdev->device->volt;
  832. struct nvkm_pstate *pstates = clk->base.base.func->pstates;
  833. int nr_pstates = clk->base.base.func->nr_pstates;
  834. int vmin, id = 0;
  835. u32 fmax = 0;
  836. int i;
  837. /* find lowest voltage we can use */
  838. vmin = volt->vid[0].uv;
  839. for (i = 1; i < volt->vid_nr; i++) {
  840. if (volt->vid[i].uv <= vmin) {
  841. vmin = volt->vid[i].uv;
  842. id = volt->vid[i].vid;
  843. }
  844. }
  845. /* find max frequency at this voltage */
  846. for (i = 0; i < nr_pstates; i++)
  847. if (pstates[i].base.voltage == id)
  848. fmax = max(fmax,
  849. pstates[i].base.domain[nv_clk_src_gpc]);
  850. if (!fmax) {
  851. nvkm_error(subdev, "failed to evaluate safe fmax\n");
  852. return -EINVAL;
  853. }
  854. /* we are safe at 90% of the max frequency */
  855. clk->safe_fmax_vmin = fmax * (100 - 10) / 100;
  856. nvkm_debug(subdev, "safe fmax @ vmin = %u Khz\n", clk->safe_fmax_vmin);
  857. return 0;
  858. }
  859. int
  860. gm20b_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
  861. {
  862. struct nvkm_device_tegra *tdev = device->func->tegra(device);
  863. struct gm20b_clk *clk;
  864. struct nvkm_subdev *subdev;
  865. struct gk20a_clk_pllg_params *clk_params;
  866. int ret;
  867. /* Speedo 0 GPUs cannot use noise-aware PLL */
  868. if (tdev->gpu_speedo_id == 0)
  869. return gm20b_clk_new_speedo0(device, index, pclk);
  870. /* Speedo >= 1, use NAPLL */
  871. clk = kzalloc(sizeof(*clk) + sizeof(*clk_params), GFP_KERNEL);
  872. if (!clk)
  873. return -ENOMEM;
  874. *pclk = &clk->base.base;
  875. subdev = &clk->base.base.subdev;
  876. /* duplicate the clock parameters since we will patch them below */
  877. clk_params = (void *) (clk + 1);
  878. *clk_params = gm20b_pllg_params;
  879. ret = gk20a_clk_ctor(device, index, &gm20b_clk, clk_params,
  880. &clk->base);
  881. if (ret)
  882. return ret;
  883. /*
  884. * NAPLL can only work with max_u, clamp the m range so
  885. * gk20a_pllg_calc_mnp always uses it
  886. */
  887. clk_params->max_m = clk_params->min_m = DIV_ROUND_UP(clk_params->max_u,
  888. (clk->base.parent_rate / KHZ));
  889. if (clk_params->max_m == 0) {
  890. nvkm_warn(subdev, "cannot use NAPLL, using legacy clock...\n");
  891. kfree(clk);
  892. return gm20b_clk_new_speedo0(device, index, pclk);
  893. }
  894. clk->base.pl_to_div = pl_to_div;
  895. clk->base.div_to_pl = div_to_pl;
  896. clk->dvfs_params = &gm20b_dvfs_params;
  897. ret = gm20b_clk_init_fused_params(clk);
  898. /*
  899. * we will calibrate during init - should never happen on
  900. * prod parts
  901. */
  902. if (ret)
  903. nvkm_warn(subdev, "no fused calibration parameters\n");
  904. ret = gm20b_clk_init_safe_fmax(clk);
  905. if (ret)
  906. return ret;
  907. return 0;
  908. }