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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user