WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] x86: AMD Fam10/11 adjustments

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] x86: AMD Fam10/11 adjustments
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Thu, 11 Oct 2007 09:48:56 +0100
Delivery-date: Thu, 11 Oct 2007 01:48:18 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: 2007-10-10/xen/arch/x86/apic.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/apic.c 2007-08-06 15:08:40.000000000 +0200
+++ 2007-10-10/xen/arch/x86/apic.c      2007-10-10 17:12:29.000000000 +0200
@@ -737,7 +737,7 @@ static int __init detect_init_APIC (void
     switch (boot_cpu_data.x86_vendor) {
     case X86_VENDOR_AMD:
         if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
-            (boot_cpu_data.x86 == 15))        
+            (boot_cpu_data.x86 >= 15 && boot_cpu_data.x86 <= 17))
             break;
         goto no_apic;
     case X86_VENDOR_INTEL:
Index: 2007-10-10/xen/arch/x86/cpu/amd.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/cpu/amd.c      2007-06-04 08:35:35.000000000 
+0200
+++ 2007-10-10/xen/arch/x86/cpu/amd.c   2007-10-10 17:12:29.000000000 +0200
@@ -278,7 +278,7 @@ static void __init init_amd(struct cpuin
        }
 
        switch (c->x86) {
-       case 15:
+       case 15 ... 17:
                set_bit(X86_FEATURE_K8, c->x86_capability);
                break;
        case 6:
@@ -303,11 +303,8 @@ static void __init init_amd(struct cpuin
 
        display_cacheinfo(c);
 
-       if (cpuid_eax(0x80000000) >= 0x80000008) {
+       if (cpuid_eax(0x80000000) >= 0x80000008)
                c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
-               if (c->x86_max_cores & (c->x86_max_cores - 1))
-                       c->x86_max_cores = 1;
-       }
 
        if (cpuid_eax(0x80000000) >= 0x80000007) {
                c->x86_power = cpuid_edx(0x80000007);
@@ -317,15 +314,18 @@ static void __init init_amd(struct cpuin
 
 #ifdef CONFIG_X86_HT
        /*
-        * On a AMD dual core setup the lower bits of the APIC id
+        * On a AMD multi core setup the lower bits of the APIC id
         * distingush the cores.  Assumes number of cores is a power
         * of two.
         */
        if (c->x86_max_cores > 1) {
                int cpu = smp_processor_id();
-               unsigned bits = 0;
-               while ((1 << bits) < c->x86_max_cores)
-                       bits++;
+               unsigned bits = (cpuid_ecx(0x80000008) >> 12) & 0xf;
+
+               if (bits == 0) {
+                       while ((1 << bits) < c->x86_max_cores)
+                               bits++;
+               }
                cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1);
                phys_proc_id[cpu] >>= bits;
                printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
Index: 2007-10-10/xen/arch/x86/cpu/mcheck/mce.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/cpu/mcheck/mce.c       2006-11-14 
13:51:10.000000000 +0100
+++ 2007-10-10/xen/arch/x86/cpu/mcheck/mce.c    2007-10-10 17:12:29.000000000 
+0200
@@ -34,7 +34,7 @@ void mcheck_init(struct cpuinfo_x86 *c)
 
        switch (c->x86_vendor) {
                case X86_VENDOR_AMD:
-                       if (c->x86==6 || c->x86==15)
+                       if (c->x86 >= 6)
                                amd_mcheck_init(c);
                        break;
 
Index: 2007-10-10/xen/arch/x86/cpu/mtrr/main.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/cpu/mtrr/main.c        2007-09-10 
09:59:36.000000000 +0200
+++ 2007-10-10/xen/arch/x86/cpu/mtrr/main.c     2007-10-10 17:12:29.000000000 
+0200
@@ -55,7 +55,7 @@ u32 num_var_ranges = 0;
 unsigned int *usage_table;
 static DECLARE_MUTEX(mtrr_sem);
 
-u32 size_or_mask, size_and_mask;
+u64 size_or_mask, size_and_mask;
 
 static struct mtrr_ops * mtrr_ops[X86_VENDOR_NUM] = {};
 
@@ -587,8 +587,8 @@ void __init mtrr_bp_init(void)
                             boot_cpu_data.x86_mask == 0x4))
                                phys_addr = 36;
 
-                       size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
-                       size_and_mask = ~size_or_mask & 0xfff00000;
+                       size_or_mask = ~((1ULL << (phys_addr - PAGE_SHIFT)) - 
1);
+                       size_and_mask = ~size_or_mask & 0xfffff00000ULL;
                } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
                           boot_cpu_data.x86 == 6) {
                        /* VIA C* family have Intel style MTRRs, but
Index: 2007-10-10/xen/arch/x86/cpu/mtrr/mtrr.h
===================================================================
--- 2007-10-10.orig/xen/arch/x86/cpu/mtrr/mtrr.h        2006-02-15 
15:07:25.000000000 +0100
+++ 2007-10-10/xen/arch/x86/cpu/mtrr/mtrr.h     2007-10-10 17:12:29.000000000 
+0200
@@ -83,7 +83,7 @@ void get_mtrr_state(void);
 
 extern void set_mtrr_ops(struct mtrr_ops * ops);
 
-extern u32 size_or_mask, size_and_mask;
+extern u64 size_or_mask, size_and_mask;
 extern struct mtrr_ops * mtrr_if;
 
 #define is_cpu(vnd)    (mtrr_if && mtrr_if->vendor == X86_VENDOR_##vnd)
Index: 2007-10-10/xen/arch/x86/nmi.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/nmi.c  2007-08-06 15:08:41.000000000 +0200
+++ 2007-10-10/xen/arch/x86/nmi.c       2007-10-10 17:12:29.000000000 +0200
@@ -314,9 +314,14 @@ void __pminit setup_apic_nmi_watchdog(vo
 
     switch (boot_cpu_data.x86_vendor) {
     case X86_VENDOR_AMD:
-        if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15)
+        switch (boot_cpu_data.x86) {
+       case 6:
+       case 15 ... 17:
+               setup_k7_watchdog();
+               break;
+       default:
             return;
-        setup_k7_watchdog();
+       }
         break;
     case X86_VENDOR_INTEL:
         switch (boot_cpu_data.x86) {
Index: 2007-10-10/xen/arch/x86/oprofile/nmi_int.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/oprofile/nmi_int.c     2007-08-06 
15:08:41.000000000 +0200
+++ 2007-10-10/xen/arch/x86/oprofile/nmi_int.c  2007-10-10 17:12:29.000000000 
+0200
@@ -348,6 +348,14 @@ static int __init nmi_init(void)
                                   give user space an consistent name. */
                                cpu_type = "x86-64/hammer";
                                break;
+                       case 0x10:
+                               model = &op_athlon_spec;
+                               cpu_type = "x86-64/family10";
+                               break;
+                       case 0x11:
+                               model = &op_athlon_spec;
+                               cpu_type = "x86-64/family11";
+                               break;
                        }
                        break;
  
Index: 2007-10-10/xen/arch/x86/oprofile/op_model_athlon.c
===================================================================
--- 2007-10-10.orig/xen/arch/x86/oprofile/op_model_athlon.c     2007-09-27 
10:42:44.000000000 +0200
+++ 2007-10-10/xen/arch/x86/oprofile/op_model_athlon.c  2007-10-10 
17:12:29.000000000 +0200
@@ -34,12 +34,15 @@
 #define CTRL_WRITE(l,h,msrs,c) do {wrmsr(msrs->controls[(c)].addr, (l), (h));} 
while (0)
 #define CTRL_SET_ACTIVE(n) (n |= (1<<22))
 #define CTRL_SET_INACTIVE(n) (n &= ~(1<<22))
-#define CTRL_CLEAR(x) (x &= (1<<21))
+#define CTRL_CLEAR(lo, hi) (lo &= (1<<21), hi = 0)
 #define CTRL_SET_ENABLE(val) (val |= 1<<20)
 #define CTRL_SET_USR(val,u) (val |= ((u & 1) << 16))
 #define CTRL_SET_KERN(val,k) (val |= ((k & 1) << 17))
-#define CTRL_SET_UM(val, m) (val |= (m << 8))
-#define CTRL_SET_EVENT(val, e) (val |= e)
+#define CTRL_SET_UM(val, m) (val |= ((m & 0xff) << 8))
+#define CTRL_SET_EVENT_LOW(val, e) (val |= (e & 0xff))
+#define CTRL_SET_EVENT_HIGH(val, e) (val |= ((e >> 8) & 0xf))
+#define CTRL_SET_HOST_ONLY(val, h) (val |= ((h & 1) << 9))
+#define CTRL_SET_GUEST_ONLY(val, h) (val |= ((h & 1) << 8))
 
 static unsigned long reset_value[NUM_COUNTERS];
 
@@ -72,7 +75,7 @@ static void athlon_setup_ctrs(struct op_
        /* clear all counters */
        for (i = 0 ; i < NUM_CONTROLS; ++i) {
                CTRL_READ(low, high, msrs, i);
-               CTRL_CLEAR(low);
+               CTRL_CLEAR(low, high);
                CTRL_WRITE(low, high, msrs, i);
        }
        
@@ -89,12 +92,15 @@ static void athlon_setup_ctrs(struct op_
                        CTR_WRITE(counter_config[i].count, msrs, i);
 
                        CTRL_READ(low, high, msrs, i);
-                       CTRL_CLEAR(low);
+                       CTRL_CLEAR(low, high);
                        CTRL_SET_ENABLE(low);
                        CTRL_SET_USR(low, counter_config[i].user);
                        CTRL_SET_KERN(low, counter_config[i].kernel);
                        CTRL_SET_UM(low, counter_config[i].unit_mask);
-                       CTRL_SET_EVENT(low, counter_config[i].event);
+                       CTRL_SET_EVENT_LOW(low, counter_config[i].event);
+                       CTRL_SET_EVENT_HIGH(high, counter_config[i].event);
+                       CTRL_SET_HOST_ONLY(high, 0);
+                       CTRL_SET_GUEST_ONLY(high, 0);
                        CTRL_WRITE(low, high, msrs, i);
                } else {
                        reset_value[i] = 0;



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] x86: AMD Fam10/11 adjustments, Jan Beulich <=