forked from Minki/linux
intel_pstate: Correct BYT VID values.
Using a VID value that is not high enough for the requested P state can cause machine checks. Add a ceiling function to ensure calulated VIDs with fractional values are set to the next highest integer VID value. The algorythm for calculating the non-trubo VID from the BIOS writers guide is: vid_ratio = (vid_max - vid_min) / (max_pstate - min_pstate) vid = ceiling(vid_min + (req_pstate - min_pstate) * vid_ratio) Cc: All applicable <stable@vger.kernel.org> Signed-off-by: Dirk Brandewie <dirk.j.brandewie@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
b27580b05e
commit
d022a65ed2
@ -52,6 +52,17 @@ static inline int32_t div_fp(int32_t x, int32_t y)
|
||||
return div_s64((int64_t)x << FRAC_BITS, y);
|
||||
}
|
||||
|
||||
static inline int ceiling_fp(int32_t x)
|
||||
{
|
||||
int mask, ret;
|
||||
|
||||
ret = fp_toint(x);
|
||||
mask = (1 << FRAC_BITS) - 1;
|
||||
if (x & mask)
|
||||
ret += 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct sample {
|
||||
int32_t core_pct_busy;
|
||||
u64 aperf;
|
||||
@ -425,7 +436,7 @@ static void byt_set_pstate(struct cpudata *cpudata, int pstate)
|
||||
cpudata->vid.ratio);
|
||||
|
||||
vid_fp = clamp_t(int32_t, vid_fp, cpudata->vid.min, cpudata->vid.max);
|
||||
vid = fp_toint(vid_fp);
|
||||
vid = ceiling_fp(vid_fp);
|
||||
|
||||
if (pstate > cpudata->pstate.max_pstate)
|
||||
vid = cpudata->vid.turbo;
|
||||
|
Loading…
Reference in New Issue
Block a user