Add powerd(8) support for several families of AMD CPUs.
Use the same logic to calculate the nominal CPU frequency from the P-state MSRs on family 0x12, 0x15, and 0x16 CPUs as is used for family 0x10. Family 0x14 was included in the original patch in the PR but I left that out as the BIOS writer's guide for family 0x14 CPUs show a different layout for the relevant MSR and include a different formulate for calculating the frequency. While here, simplify a few expressions and print out the family of unsupported CPUs in hex rather than decimal. PR: 212020 Submitted by: Anthony Jenkins <Scoobi_doo@yahoo.com> MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D7587
This commit is contained in:
parent
95a3814f21
commit
46d7e8f428
@ -408,25 +408,27 @@ hwpstate_get_info_from_msr(device_t dev)
|
||||
hwpstate_set = sc->hwpstate_settings;
|
||||
for (i = 0; i < sc->cfnum; i++) {
|
||||
msr = rdmsr(MSR_AMD_10H_11H_CONFIG + i);
|
||||
if ((msr & ((uint64_t)1 << 63)) != ((uint64_t)1 << 63)) {
|
||||
if ((msr & ((uint64_t)1 << 63)) == 0) {
|
||||
HWPSTATE_DEBUG(dev, "msr is not valid.\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
did = AMD_10H_11H_CUR_DID(msr);
|
||||
fid = AMD_10H_11H_CUR_FID(msr);
|
||||
|
||||
/* Convert fid/did to frequency. */
|
||||
switch(family) {
|
||||
case 0x11:
|
||||
/* fid/did to frequency */
|
||||
hwpstate_set[i].freq = 100 * (fid + 0x08) / (1 << did);
|
||||
hwpstate_set[i].freq = (100 * (fid + 0x08)) >> did;
|
||||
break;
|
||||
case 0x10:
|
||||
/* fid/did to frequency */
|
||||
hwpstate_set[i].freq = 100 * (fid + 0x10) / (1 << did);
|
||||
case 0x12:
|
||||
case 0x15:
|
||||
case 0x16:
|
||||
hwpstate_set[i].freq = (100 * (fid + 0x10)) >> did;
|
||||
break;
|
||||
default:
|
||||
HWPSTATE_DEBUG(dev, "get_info_from_msr: AMD family %d CPU's are not implemented yet. sorry.\n", family);
|
||||
HWPSTATE_DEBUG(dev, "get_info_from_msr: AMD family 0x%02x CPU's are not implemented yet. sorry.\n", family);
|
||||
return (ENXIO);
|
||||
break;
|
||||
}
|
||||
hwpstate_set[i].pstate_id = i;
|
||||
/* There was volts calculation, but deleted it. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user