Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 cpu updates from Ingo Molnar: "The main changes in this cycle were: - Add support for the "Dhyana" x86 CPUs by Hygon: these are licensed based on the AMD Zen architecture, and are built and sold in China, for domestic datacenter use. The code is pretty close to AMD support, mostly with a few quirks and enumeration differences. (Pu Wen) - Enable CPUID support on Cyrix 6x86/6x86L processors" * 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: tools/cpupower: Add Hygon Dhyana support cpufreq: Add Hygon Dhyana support ACPI: Add Hygon Dhyana support x86/xen: Add Hygon Dhyana support to Xen x86/kvm: Add Hygon Dhyana support to KVM x86/mce: Add Hygon Dhyana support to the MCA infrastructure x86/bugs: Add Hygon Dhyana to the respective mitigation machinery x86/apic: Add Hygon Dhyana support x86/pci, x86/amd_nb: Add Hygon Dhyana support to PCI and northbridge x86/amd_nb: Check vendor in AMD-only functions x86/alternative: Init ideal_nops for Hygon Dhyana x86/events: Add Hygon Dhyana support to PMU infrastructure x86/smpboot: Do not use BSP INIT delay and MWAIT to idle on Dhyana x86/cpu/mtrr: Support TOP_MEM2 and get MTRR number x86/cpu: Get cache info and setup cache cpumap for Hygon Dhyana x86/cpu: Create Hygon Dhyana architecture support file x86/CPU: Change query logic so CPUID is enabled before testing x86/CPU: Use correct macros for Cyrix calls
此提交包含在:
@@ -170,6 +170,7 @@ static int get_boost_mode(unsigned int cpu)
|
||||
unsigned long pstates[MAX_HW_PSTATES] = {0,};
|
||||
|
||||
if (cpupower_cpu_info.vendor != X86_VENDOR_AMD &&
|
||||
cpupower_cpu_info.vendor != X86_VENDOR_HYGON &&
|
||||
cpupower_cpu_info.vendor != X86_VENDOR_INTEL)
|
||||
return 0;
|
||||
|
||||
@@ -190,8 +191,9 @@ static int get_boost_mode(unsigned int cpu)
|
||||
printf(_(" Supported: %s\n"), support ? _("yes") : _("no"));
|
||||
printf(_(" Active: %s\n"), active ? _("yes") : _("no"));
|
||||
|
||||
if (cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
|
||||
cpupower_cpu_info.family >= 0x10) {
|
||||
if ((cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
|
||||
cpupower_cpu_info.family >= 0x10) ||
|
||||
cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
|
||||
ret = decode_pstates(cpu, cpupower_cpu_info.family, b_states,
|
||||
pstates, &pstate_no);
|
||||
if (ret)
|
||||
|
@@ -45,7 +45,7 @@ static int get_did(int family, union msr_pstate pstate)
|
||||
|
||||
if (family == 0x12)
|
||||
t = pstate.val & 0xf;
|
||||
else if (family == 0x17)
|
||||
else if (family == 0x17 || family == 0x18)
|
||||
t = pstate.fam17h_bits.did;
|
||||
else
|
||||
t = pstate.bits.did;
|
||||
@@ -59,7 +59,7 @@ static int get_cof(int family, union msr_pstate pstate)
|
||||
int fid, did, cof;
|
||||
|
||||
did = get_did(family, pstate);
|
||||
if (family == 0x17) {
|
||||
if (family == 0x17 || family == 0x18) {
|
||||
fid = pstate.fam17h_bits.fid;
|
||||
cof = 200 * fid / did;
|
||||
} else {
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#include "helpers/helpers.h"
|
||||
|
||||
static const char *cpu_vendor_table[X86_VENDOR_MAX] = {
|
||||
"Unknown", "GenuineIntel", "AuthenticAMD",
|
||||
"Unknown", "GenuineIntel", "AuthenticAMD", "HygonGenuine",
|
||||
};
|
||||
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
@@ -109,6 +109,7 @@ out:
|
||||
fclose(fp);
|
||||
/* Get some useful CPU capabilities from cpuid */
|
||||
if (cpu_info->vendor != X86_VENDOR_AMD &&
|
||||
cpu_info->vendor != X86_VENDOR_HYGON &&
|
||||
cpu_info->vendor != X86_VENDOR_INTEL)
|
||||
return ret;
|
||||
|
||||
@@ -124,8 +125,9 @@ out:
|
||||
if (cpuid_level >= 6 && (cpuid_ecx(6) & 0x1))
|
||||
cpu_info->caps |= CPUPOWER_CAP_APERF;
|
||||
|
||||
/* AMD Boost state enable/disable register */
|
||||
if (cpu_info->vendor == X86_VENDOR_AMD) {
|
||||
/* AMD or Hygon Boost state enable/disable register */
|
||||
if (cpu_info->vendor == X86_VENDOR_AMD ||
|
||||
cpu_info->vendor == X86_VENDOR_HYGON) {
|
||||
if (ext_cpuid_level >= 0x80000007 &&
|
||||
(cpuid_edx(0x80000007) & (1 << 9)))
|
||||
cpu_info->caps |= CPUPOWER_CAP_AMD_CBP;
|
||||
|
@@ -61,7 +61,7 @@ extern int be_verbose;
|
||||
|
||||
/* cpuid and cpuinfo helpers **************************/
|
||||
enum cpupower_cpu_vendor {X86_VENDOR_UNKNOWN = 0, X86_VENDOR_INTEL,
|
||||
X86_VENDOR_AMD, X86_VENDOR_MAX};
|
||||
X86_VENDOR_AMD, X86_VENDOR_HYGON, X86_VENDOR_MAX};
|
||||
|
||||
#define CPUPOWER_CAP_INV_TSC 0x00000001
|
||||
#define CPUPOWER_CAP_APERF 0x00000002
|
||||
|
@@ -26,7 +26,7 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
|
||||
* has Hardware determined variable increments instead.
|
||||
*/
|
||||
|
||||
if (cpu_info.family == 0x17) {
|
||||
if (cpu_info.family == 0x17 || cpu_info.family == 0x18) {
|
||||
if (!read_msr(cpu, MSR_AMD_HWCR, &val)) {
|
||||
if (!(val & CPUPOWER_AMD_CPBDIS))
|
||||
*active = 1;
|
||||
|
@@ -241,7 +241,8 @@ static int init_maxfreq_mode(void)
|
||||
if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_INV_TSC))
|
||||
goto use_sysfs;
|
||||
|
||||
if (cpupower_cpu_info.vendor == X86_VENDOR_AMD) {
|
||||
if (cpupower_cpu_info.vendor == X86_VENDOR_AMD ||
|
||||
cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
|
||||
/* MSR_AMD_HWCR tells us whether TSC runs at P0/mperf
|
||||
* freq.
|
||||
* A test whether hwcr is accessable/available would be:
|
||||
|
新增問題並參考
封鎖使用者