Project

General

Profile

Submit #2648 ยป 0001-Avoiding-an-infinite-loop-during-P-state-adjustment-.patch

vadaszi, 02/22/2014 04:48 PM

View differences:

sys/platform/pc64/x86_64/cpufreq_machdep.c
int
amd0f_set_fidvid(const struct amd0f_fidvid *fv, const struct amd0f_xsit *xsit)
{
uint32_t val, cfid, cvid, tvid;
uint32_t val, cfid, cvid;
int rvo;
uint64_t status;
/*
......
return 0;
/*
* Phase 1: Raise core voltage to the TargetVID
* Phase 1: Raise core voltage to requested VID if frequency is
* going up.
*/
if ((fv->fid & ~0x1) > (cfid & ~0x1) || cvid > fv->vid) {
KKASSERT(fv->vid >= xsit->rvo);
tvid = fv->vid - xsit->rvo;
} else {
KKASSERT(cvid >= xsit->rvo);
tvid = cvid - xsit->rvo;
}
while (cvid > tvid) {
while (cvid > fv->vid) {
if (cvid > (1 << xsit->mvs))
val = cvid - (1 << xsit->mvs);
else
......
cvid = AMD0F_STA_CVID(status);
AMD0F_DELAY_VST(xsit->vst);
}
/* ... then raise to voltage + RVO (if required) */
for (rvo = xsit->rvo; rvo > 0 && cvid > 0; --rvo) {
/* XXX It's not clear from spec if we have to do that
* in 0.25 step or in MVS. Therefore do it as it's done
* under Linux */
AMD0F_WRITE_FIDVID(cfid, cvid - 1, 0ULL);
AMD0F_WAIT_FIDVID_CHG(status);
cvid = AMD0F_STA_CVID(status);
AMD0F_DELAY_VST(xsit->vst);
}
/*
* Phase 2: Change to requested core frequency
    (1-1/1)