Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da746d4e authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nva3/clk: minor improvements to fractional N calculation



Helps us to get identical numbers to the binary driver for (at least)
Kepler memory PLLs, and fixes a rounding error.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent dceef5d8
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -50,8 +50,15 @@ nva3_pll_calc(struct nouveau_subdev *subdev, struct nvbios_pll *info,
		u32 tmp = freq * *P * M;
		N  = tmp / info->refclk;
		fN = tmp % info->refclk;
		if (!pfN && fN >= info->refclk / 2)

		if (!pfN) {
			if (fN >= info->refclk / 2)
				N++;
		} else {
			if (fN <  info->refclk / 2)
				N--;
			fN = tmp - (N * info->refclk);
		}

		if (N < info->vco1.min_n)
			continue;
@@ -66,7 +73,8 @@ nva3_pll_calc(struct nouveau_subdev *subdev, struct nvbios_pll *info,
		}

		if (pfN) {
			*pfN = (((fN << 13) / info->refclk) - 4096) & 0xffff;
			*pfN = ((fN << 13) + info->refclk / 2) / info->refclk;
			*pfN = (*pfN - 4096) & 0xffff;
			return freq;
		}
	}