|
@@ -599,52 +599,47 @@ void cpu_detect(struct cpuinfo_x86 *c)
|
|
|
|
|
|
void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
{
|
|
{
|
|
- u32 tfms, xlvl;
|
|
|
|
- u32 ebx;
|
|
|
|
|
|
+ u32 eax, ebx, ecx, edx;
|
|
|
|
|
|
/* Intel-defined flags: level 0x00000001 */
|
|
/* Intel-defined flags: level 0x00000001 */
|
|
if (c->cpuid_level >= 0x00000001) {
|
|
if (c->cpuid_level >= 0x00000001) {
|
|
- u32 capability, excap;
|
|
|
|
|
|
+ cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
|
|
|
|
|
|
- cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
|
|
|
|
- c->x86_capability[0] = capability;
|
|
|
|
- c->x86_capability[4] = excap;
|
|
|
|
|
|
+ c->x86_capability[CPUID_1_ECX] = ecx;
|
|
|
|
+ c->x86_capability[CPUID_1_EDX] = edx;
|
|
}
|
|
}
|
|
|
|
|
|
/* Additional Intel-defined flags: level 0x00000007 */
|
|
/* Additional Intel-defined flags: level 0x00000007 */
|
|
if (c->cpuid_level >= 0x00000007) {
|
|
if (c->cpuid_level >= 0x00000007) {
|
|
- u32 eax, ebx, ecx, edx;
|
|
|
|
-
|
|
|
|
cpuid_count(0x00000007, 0, &eax, &ebx, &ecx, &edx);
|
|
cpuid_count(0x00000007, 0, &eax, &ebx, &ecx, &edx);
|
|
|
|
|
|
- c->x86_capability[9] = ebx;
|
|
|
|
|
|
+ c->x86_capability[CPUID_7_0_EBX] = ebx;
|
|
|
|
|
|
- c->x86_capability[14] = cpuid_eax(0x00000006);
|
|
|
|
|
|
+ c->x86_capability[CPUID_6_EAX] = cpuid_eax(0x00000006);
|
|
}
|
|
}
|
|
|
|
|
|
/* Extended state features: level 0x0000000d */
|
|
/* Extended state features: level 0x0000000d */
|
|
if (c->cpuid_level >= 0x0000000d) {
|
|
if (c->cpuid_level >= 0x0000000d) {
|
|
- u32 eax, ebx, ecx, edx;
|
|
|
|
-
|
|
|
|
cpuid_count(0x0000000d, 1, &eax, &ebx, &ecx, &edx);
|
|
cpuid_count(0x0000000d, 1, &eax, &ebx, &ecx, &edx);
|
|
|
|
|
|
- c->x86_capability[10] = eax;
|
|
|
|
|
|
+ c->x86_capability[CPUID_D_1_EAX] = eax;
|
|
}
|
|
}
|
|
|
|
|
|
/* Additional Intel-defined flags: level 0x0000000F */
|
|
/* Additional Intel-defined flags: level 0x0000000F */
|
|
if (c->cpuid_level >= 0x0000000F) {
|
|
if (c->cpuid_level >= 0x0000000F) {
|
|
- u32 eax, ebx, ecx, edx;
|
|
|
|
|
|
|
|
/* QoS sub-leaf, EAX=0Fh, ECX=0 */
|
|
/* QoS sub-leaf, EAX=0Fh, ECX=0 */
|
|
cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx);
|
|
cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx);
|
|
- c->x86_capability[11] = edx;
|
|
|
|
|
|
+ c->x86_capability[CPUID_F_0_EDX] = edx;
|
|
|
|
+
|
|
if (cpu_has(c, X86_FEATURE_CQM_LLC)) {
|
|
if (cpu_has(c, X86_FEATURE_CQM_LLC)) {
|
|
/* will be overridden if occupancy monitoring exists */
|
|
/* will be overridden if occupancy monitoring exists */
|
|
c->x86_cache_max_rmid = ebx;
|
|
c->x86_cache_max_rmid = ebx;
|
|
|
|
|
|
/* QoS sub-leaf, EAX=0Fh, ECX=1 */
|
|
/* QoS sub-leaf, EAX=0Fh, ECX=1 */
|
|
cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx);
|
|
cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx);
|
|
- c->x86_capability[12] = edx;
|
|
|
|
|
|
+ c->x86_capability[CPUID_F_1_EDX] = edx;
|
|
|
|
+
|
|
if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) {
|
|
if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) {
|
|
c->x86_cache_max_rmid = ecx;
|
|
c->x86_cache_max_rmid = ecx;
|
|
c->x86_cache_occ_scale = ebx;
|
|
c->x86_cache_occ_scale = ebx;
|
|
@@ -656,22 +651,24 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
}
|
|
}
|
|
|
|
|
|
/* AMD-defined flags: level 0x80000001 */
|
|
/* AMD-defined flags: level 0x80000001 */
|
|
- xlvl = cpuid_eax(0x80000000);
|
|
|
|
- c->extended_cpuid_level = xlvl;
|
|
|
|
|
|
+ eax = cpuid_eax(0x80000000);
|
|
|
|
+ c->extended_cpuid_level = eax;
|
|
|
|
+
|
|
|
|
+ if ((eax & 0xffff0000) == 0x80000000) {
|
|
|
|
+ if (eax >= 0x80000001) {
|
|
|
|
+ cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
|
|
|
|
|
- if ((xlvl & 0xffff0000) == 0x80000000) {
|
|
|
|
- if (xlvl >= 0x80000001) {
|
|
|
|
- c->x86_capability[1] = cpuid_edx(0x80000001);
|
|
|
|
- c->x86_capability[6] = cpuid_ecx(0x80000001);
|
|
|
|
|
|
+ c->x86_capability[CPUID_8000_0001_ECX] = ecx;
|
|
|
|
+ c->x86_capability[CPUID_8000_0001_EDX] = edx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (c->extended_cpuid_level >= 0x80000008) {
|
|
if (c->extended_cpuid_level >= 0x80000008) {
|
|
- u32 eax = cpuid_eax(0x80000008);
|
|
|
|
|
|
+ cpuid(0x80000008, &eax, &ebx, &ecx, &edx);
|
|
|
|
|
|
c->x86_virt_bits = (eax >> 8) & 0xff;
|
|
c->x86_virt_bits = (eax >> 8) & 0xff;
|
|
c->x86_phys_bits = eax & 0xff;
|
|
c->x86_phys_bits = eax & 0xff;
|
|
- c->x86_capability[13] = cpuid_ebx(0x80000008);
|
|
|
|
|
|
+ c->x86_capability[CPUID_8000_0008_EBX] = ebx;
|
|
}
|
|
}
|
|
#ifdef CONFIG_X86_32
|
|
#ifdef CONFIG_X86_32
|
|
else if (cpu_has(c, X86_FEATURE_PAE) || cpu_has(c, X86_FEATURE_PSE36))
|
|
else if (cpu_has(c, X86_FEATURE_PAE) || cpu_has(c, X86_FEATURE_PSE36))
|
|
@@ -682,7 +679,7 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
c->x86_power = cpuid_edx(0x80000007);
|
|
c->x86_power = cpuid_edx(0x80000007);
|
|
|
|
|
|
if (c->extended_cpuid_level >= 0x8000000a)
|
|
if (c->extended_cpuid_level >= 0x8000000a)
|
|
- c->x86_capability[15] = cpuid_edx(0x8000000a);
|
|
|
|
|
|
+ c->x86_capability[CPUID_8000_000A_EDX] = cpuid_edx(0x8000000a);
|
|
|
|
|
|
init_scattered_cpuid_features(c);
|
|
init_scattered_cpuid_features(c);
|
|
}
|
|
}
|