mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andi Kleen <ak@suse.de>
To: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Cc: Andi Kleen <ak@suse.de>,
	akpm@osdl.org, discuss@x86-64.org, davej@redhat.com,
	linux-kernel@vger.kernel.org
Subject: Re: [discuss] [21/31] x86_64: Always use CPUID 80000008 to figure out MTRR address space size
Date: Mon, 11 Apr 2005 20:00:01 +0200	[thread overview]
Message-ID: <20050411180001.GA27367@wotan.suse.de> (raw)
In-Reply-To: <20050410232523.B24470@unix-os.sc.intel.com>

On Sun, Apr 10, 2005 at 11:25:23PM -0700, Siddha, Suresh B wrote:
> We need to use the size_and_mask in set_mtrr_var_ranges(which is called 
> while programming MTRR's for AP's

Patch is ok for me. But how did you find this out? Did you force
a mapping high in the address space?

-Andi
> 
> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
> 
> --- linux/arch/i386/kernel/cpu/mtrr/generic.c~	2005-04-10 14:07:11.821466664 -0700
> +++ linux/arch/i386/kernel/cpu/mtrr/generic.c	2005-04-10 14:12:21.913325536 -0700
> @@ -192,7 +192,8 @@ static int set_mtrr_var_ranges(unsigned 
>  
>  	rdmsr(MTRRphysBase_MSR(index), lo, hi);
>  	if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL)
> -	    || (vr->base_hi & 0xfUL) != (hi & 0xfUL)) {
> +	    || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) != 
> +		(hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
>  		mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi);
>  		changed = TRUE;
>  	}
> @@ -200,7 +201,8 @@ static int set_mtrr_var_ranges(unsigned 
>  	rdmsr(MTRRphysMask_MSR(index), lo, hi);
>  
>  	if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL)
> -	    || (vr->mask_hi & 0xfUL) != (hi & 0xfUL)) {
> +	    || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) != 
> +		(hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
>  		mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
>  		changed = TRUE;
>  	}
> 
> On Thu, Apr 07, 2005 at 05:42:36PM +0200, Andi Kleen wrote:
> > Always use CPUID 80000008 to figure out MTRR address space size
> > 
> > It doesn't make sense to only do this only for AMD K8.
> > 
> > This would support future CPUs with extended address spaces properly.
> > 
> > For i386 and x86-64
> > 
> > Cc: davej@redhat.com
> > 
> > 
> > Index: linux/arch/i386/kernel/cpu/mtrr/main.c
> > ===================================================================
> > --- linux.orig/arch/i386/kernel/cpu/mtrr/main.c
> > +++ linux/arch/i386/kernel/cpu/mtrr/main.c
> > @@ -614,40 +614,21 @@ static int __init mtrr_init(void)
> >  		mtrr_if = &generic_mtrr_ops;
> >  		size_or_mask = 0xff000000;	/* 36 bits */
> >  		size_and_mask = 0x00f00000;
> > -			
> > -		switch (boot_cpu_data.x86_vendor) {
> > -		case X86_VENDOR_AMD:
> > -			/* The original Athlon docs said that
> > -			   total addressable memory is 44 bits wide.
> > -			   It was not really clear whether its MTRRs
> > -			   follow this or not. (Read: 44 or 36 bits).
> > -			   However, "x86-64_overview.pdf" explicitly
> > -			   states that "previous implementations support
> > -			   36 bit MTRRs" and also provides a way to
> > -			   query the width (in bits) of the physical
> > -			   addressable memory on the Hammer family.
> > -			 */
> > -			if (boot_cpu_data.x86 == 15
> > -			    && (cpuid_eax(0x80000000) >= 0x80000008)) {
> > -				u32 phys_addr;
> > -				phys_addr = cpuid_eax(0x80000008) & 0xff;
> > -				size_or_mask =
> > -				    ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
> > -				size_and_mask = ~size_or_mask & 0xfff00000;
> > -			}
> > -			/* Athlon MTRRs use an Intel-compatible interface for 
> > -			 * getting and setting */
> > -			break;
> > -		case X86_VENDOR_CENTAUR:
> > -			if (boot_cpu_data.x86 == 6) {
> > -				/* VIA Cyrix family have Intel style MTRRs, but don't support PAE */
> > -				size_or_mask = 0xfff00000;	/* 32 bits */
> > -				size_and_mask = 0;
> > -			}
> > -			break;
> > -		
> > -		default:
> > -			break;
> > +	
> > +		/* This is an AMD specific MSR, but we assume(hope?) that
> > +		   Intel will implement it to when they extend the address
> > +		   bus of the Xeon. */		
> > +		if (cpuid_eax(0x80000000) >= 0x80000008) {
> > +			u32 phys_addr;
> > +			phys_addr = cpuid_eax(0x80000008) & 0xff;
> > +			size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
> > +			size_and_mask = ~size_or_mask & 0xfff00000;
> > +		} else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
> > +			   boot_cpu_data.x86 == 6) {
> > +			/* VIA C* family have Intel style MTRRs, but
> > +			   don't support PAE */
> > +			size_or_mask = 0xfff00000;	/* 32 bits */
> > +			size_and_mask = 0;
> >  		}
> >  	} else {
> >  		switch (boot_cpu_data.x86_vendor) {

  reply	other threads:[~2005-04-11 18:00 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <425554EC.mailMV61WIBOM@suse.de>
2005-04-11  6:25 ` Siddha, Suresh B
2005-04-11 18:00   ` Andi Kleen [this message]
2005-04-12  0:00     ` Siddha, Suresh B

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050411180001.GA27367@wotan.suse.de \
    --to=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=davej@redhat.com \
    --cc=discuss@x86-64.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=suresh.b.siddha@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®