public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: enable PAT for amd k8 and fam10h
@ 2008-03-24 23:02 Yinghai Lu
  2008-03-25  1:29 ` H. Peter Anvin
  0 siblings, 1 reply; 4+ messages in thread
From: Yinghai Lu @ 2008-03-24 23:02 UTC (permalink / raw)
  To: Ingo Molnar, H. Peter Anvin, Thomas Gleixner, Andrew Morton; +Cc: kernel list

[PATCH] x86: enable PAT for amd k8 and fam10h

make known_pat_cpu to think amd k8 and fam10h is ok too.

also make tom2 below to be WRBACK

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>

diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
index 011e07e..74ec2ea 100644
--- a/arch/x86/kernel/cpu/mtrr/generic.c
+++ b/arch/x86/kernel/cpu/mtrr/generic.c
@@ -37,6 +37,7 @@ static struct fixed_range_block fixed_range_blocks[] = {
 static unsigned long smp_changes_mask;
 static struct mtrr_state mtrr_state = {};
 static int mtrr_state_set;
+static u64 tom2;
 
 #undef MODULE_PARAM_PREFIX
 #define MODULE_PARAM_PREFIX "mtrr."
@@ -138,6 +139,11 @@ u8 mtrr_type_lookup(u64 start, u64 end)
 		}
 	}
 
+	if (tom2) {
+		if (start >= (1ULL<<32) && (end < tom2))
+			return MTRR_TYPE_WRBACK;
+	}
+
 	if (prev_match != 0xFF)
 		return prev_match;
 
@@ -206,6 +212,15 @@ void __init get_mtrr_state(void)
 	mtrr_state.def_type = (lo & 0xff);
 	mtrr_state.enabled = (lo & 0xc00) >> 10;
 
+	if (amd_special_default_mtrr()) {
+		unsigned lo, hi;
+		/* TOP_MEM2 */
+		rdmsr(MSR_K8_TOP_MEM2, lo, hi);
+		tom2 = hi;
+		tom2 <<= 32;
+		tom2 |= lo;
+		tom2 &= 0xffffff8000000ULL;
+	}
 	if (mtrr_show) {
 		int high_width;
 
@@ -236,6 +251,8 @@ void __init get_mtrr_state(void)
 			else
 				printk(KERN_INFO "MTRR %u disabled\n", i);
 		}
+		if (tom2)
+			printk(KERN_INFO "TOM2: %016lx aka %ldM\n", tom2, tom2>>20);
 	}
 	mtrr_state_set = 1;
 
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c
index a6450b3..6a1e278 100644
--- a/arch/x86/kernel/cpu/mtrr/main.c
+++ b/arch/x86/kernel/cpu/mtrr/main.c
@@ -627,7 +627,7 @@ early_param("disable_mtrr_trim", disable_mtrr_trim_setup);
 #define Tom2Enabled (1U << 21)
 #define Tom2ForceMemTypeWB (1U << 22)
 
-static __init int amd_special_default_mtrr(void)
+int __init amd_special_default_mtrr(void)
 {
 	u32 l, h;
 
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
index f74505f..a9e1a27 100644
--- a/arch/x86/mm/pat.c
+++ b/arch/x86/mm/pat.c
@@ -49,6 +49,12 @@ static int pat_known_cpu(void)
 			return 1;
 		}
 	}
+	if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
+	     boot_cpu_data.x86 >= 0xf && boot_cpu_data.x86 <= 0x11) {
+		if (cpu_has_pat) {
+			return 1;
+		}
+	}
 
 	pat_wc_enabled = 0;
 	printk(KERN_INFO "CPU and/or kernel does not support PAT.\n");
diff --git a/include/asm-x86/mtrr.h b/include/asm-x86/mtrr.h
index ee17229..d3d2662 100644
--- a/include/asm-x86/mtrr.h
+++ b/include/asm-x86/mtrr.h
@@ -99,6 +99,7 @@ extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
 extern void mtrr_ap_init(void);
 extern void mtrr_bp_init(void);
 extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
+extern int amd_special_default_mtrr(void);
 #  else
 static inline u8 mtrr_type_lookup(u64 addr, u64 end)
 {

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] x86: enable PAT for amd k8 and fam10h
  2008-03-24 23:02 [PATCH] x86: enable PAT for amd k8 and fam10h Yinghai Lu
@ 2008-03-25  1:29 ` H. Peter Anvin
  2008-03-25  2:22   ` Yinghai Lu
  0 siblings, 1 reply; 4+ messages in thread
From: H. Peter Anvin @ 2008-03-25  1:29 UTC (permalink / raw)
  To: yhlu.kernel; +Cc: Ingo Molnar, Thomas Gleixner, Andrew Morton, kernel list

Yinghai Lu wrote:
> [PATCH] x86: enable PAT for amd k8 and fam10h
> 
> make known_pat_cpu to think amd k8 and fam10h is ok too.
> 
> also make tom2 below to be WRBACK
> 
> diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
> index f74505f..a9e1a27 100644
> --- a/arch/x86/mm/pat.c
> +++ b/arch/x86/mm/pat.c
> @@ -49,6 +49,12 @@ static int pat_known_cpu(void)
>  			return 1;
>  		}
>  	}
> +	if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
> +	     boot_cpu_data.x86 >= 0xf && boot_cpu_data.x86 <= 0x11) {
> +		if (cpu_has_pat) {
> +			return 1;
> +		}
> +	}
>  
>  	pat_wc_enabled = 0;
>  	printk(KERN_INFO "CPU and/or kernel does not support PAT.\n");

This really should be handled through a CPU flag.  Specifically, it 
should be handled by disabling the PAT flag if PAT is unusable or 
suspect of being unusable; it should *NOT* be stashed away in a 
completely separate piece of code.

	-hpa

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] x86: enable PAT for amd k8 and fam10h
  2008-03-25  1:29 ` H. Peter Anvin
@ 2008-03-25  2:22   ` Yinghai Lu
  2008-03-25  4:45     ` H. Peter Anvin
  0 siblings, 1 reply; 4+ messages in thread
From: Yinghai Lu @ 2008-03-25  2:22 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: Ingo Molnar, Thomas Gleixner, Andrew Morton, kernel list

On Mon, Mar 24, 2008 at 6:29 PM, H. Peter Anvin <hpa@zytor.com> wrote:
> Yinghai Lu wrote:
>  > [PATCH] x86: enable PAT for amd k8 and fam10h
>  >
>  > make known_pat_cpu to think amd k8 and fam10h is ok too.
>  >
>  > also make tom2 below to be WRBACK
>  >
>
> > diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
>  > index f74505f..a9e1a27 100644
>  > --- a/arch/x86/mm/pat.c
>  > +++ b/arch/x86/mm/pat.c
>  > @@ -49,6 +49,12 @@ static int pat_known_cpu(void)
>  >                       return 1;
>  >               }
>  >       }
>  > +     if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
>  > +          boot_cpu_data.x86 >= 0xf && boot_cpu_data.x86 <= 0x11) {
>  > +             if (cpu_has_pat) {
>  > +                     return 1;
>  > +             }
>  > +     }
>  >
>  >       pat_wc_enabled = 0;
>  >       printk(KERN_INFO "CPU and/or kernel does not support PAT.\n");
>
>  This really should be handled through a CPU flag.  Specifically, it
>  should be handled by disabling the PAT flag if PAT is unusable or
>  suspect of being unusable; it should *NOT* be stashed away in a
>  completely separate piece of code.

PAT patches in x86.git latest, only support some intel CPUs.

        if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
            (boot_cpu_data.x86 == 0xF ||
             (boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model >= 15))) {
                if (cpu_has_pat) {
                        return 1;
                }
        }

should be moved to setup_64.c?

YH

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] x86: enable PAT for amd k8 and fam10h
  2008-03-25  2:22   ` Yinghai Lu
@ 2008-03-25  4:45     ` H. Peter Anvin
  0 siblings, 0 replies; 4+ messages in thread
From: H. Peter Anvin @ 2008-03-25  4:45 UTC (permalink / raw)
  To: Yinghai Lu; +Cc: Ingo Molnar, Thomas Gleixner, Andrew Morton, kernel list

Yinghai Lu wrote:
>>
>>  This really should be handled through a CPU flag.  Specifically, it
>>  should be handled by disabling the PAT flag if PAT is unusable or
>>  suspect of being unusable; it should *NOT* be stashed away in a
>>  completely separate piece of code.
> 
> PAT patches in x86.git latest, only support some intel CPUs.
> 
>         if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
>             (boot_cpu_data.x86 == 0xF ||
>              (boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model >= 15))) {
>                 if (cpu_has_pat) {
>                         return 1;
>                 }
>         }
> 
> should be moved to setup_64.c?
> 

Yes, which in turn should be merged with the 32-bit code in cpu/*.c.

Personally I would prefer a blacklist rather than a whitelist, but 
that's nitpicking.

	-=hpa

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-03-25  4:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-24 23:02 [PATCH] x86: enable PAT for amd k8 and fam10h Yinghai Lu
2008-03-25  1:29 ` H. Peter Anvin
2008-03-25  2:22   ` Yinghai Lu
2008-03-25  4:45     ` H. Peter Anvin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox