cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gm20b.c (29928B)


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