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: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Ben Skeggs
2013-01-24 12:15:45 +10:00
parent dceef5d87c
commit da746d4ec9

View File

@@ -50,8 +50,15 @@ nva3_pll_calc(struct nouveau_subdev *subdev, struct nvbios_pll *info,
u32 tmp = freq * *P * M; u32 tmp = freq * *P * M;
N = tmp / info->refclk; N = tmp / info->refclk;
fN = tmp % info->refclk; fN = tmp % info->refclk;
if (!pfN && fN >= info->refclk / 2)
N++; 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) if (N < info->vco1.min_n)
continue; continue;
@@ -66,7 +73,8 @@ nva3_pll_calc(struct nouveau_subdev *subdev, struct nvbios_pll *info,
} }
if (pfN) { if (pfN) {
*pfN = (((fN << 13) / info->refclk) - 4096) & 0xffff; *pfN = ((fN << 13) + info->refclk / 2) / info->refclk;
*pfN = (*pfN - 4096) & 0xffff;
return freq; return freq;
} }
} }