Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Dec 2016 21:35:15 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r309443 - in stable: 10/sys/x86/cpufreq 11/sys/x86/cpufreq
Message-ID:  <201612022135.uB2LZFOF032192@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Dec  2 21:35:14 2016
New Revision: 309443
URL: https://svnweb.freebsd.org/changeset/base/309443

Log:
  MFC 308005: 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

Modified:
  stable/11/sys/x86/cpufreq/hwpstate.c
Directory Properties:
  stable/11/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/10/sys/x86/cpufreq/hwpstate.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/11/sys/x86/cpufreq/hwpstate.c
==============================================================================
--- stable/11/sys/x86/cpufreq/hwpstate.c	Fri Dec  2 21:29:52 2016	(r309442)
+++ stable/11/sys/x86/cpufreq/hwpstate.c	Fri Dec  2 21:35:14 2016	(r309443)
@@ -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. */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612022135.uB2LZFOF032192>