patch-2.4.10 linux/arch/i386/kernel/setup.c
Next file: linux/arch/i386/kernel/signal.c
Previous file: linux/arch/i386/kernel/ptrace.c
Back to the patch index
Back to the overall index
- Lines: 259
- Date:
Mon Sep 17 23:03:09 2001
- Orig file:
v2.4.9/linux/arch/i386/kernel/setup.c
- Orig date:
Wed Jul 25 17:10:17 2001
diff -u --recursive --new-file v2.4.9/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c
@@ -64,6 +64,9 @@
*
* VIA C3 Support.
* Dave Jones <davej@suse.de>, March 2001
+ *
+ * AMD Athlon/Duron/Thunderbird bluesmoke support.
+ * Dave Jones <davej@suse.de>, April 2001.
*/
/*
@@ -93,6 +96,7 @@
#include <linux/bootmem.h>
#include <asm/processor.h>
#include <linux/console.h>
+#include <asm/mtrr.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
@@ -145,9 +149,9 @@
unsigned char aux_device_present;
+extern void mcheck_init(struct cpuinfo_x86 *c);
extern int root_mountflags;
extern char _text, _etext, _edata, _end;
-extern unsigned long cpu_khz;
static int disable_x86_serial_nr __initdata = 1;
static int disable_x86_fxsr __initdata = 0;
@@ -937,27 +941,14 @@
* trampoline before removing it. (see the GDT stuff)
*/
reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
- smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
#endif
-#ifdef CONFIG_X86_IO_APIC
+#ifdef CONFIG_X86_LOCAL_APIC
/*
* Find and reserve possible boot-time SMP configuration:
*/
find_smp_config();
#endif
- paging_init();
-#ifdef CONFIG_X86_IO_APIC
- /*
- * get boot-time SMP configuration:
- */
- if (smp_found_config)
- get_smp_config();
-#endif
-#ifdef CONFIG_X86_LOCAL_APIC
- init_apic_mappings();
-#endif
-
#ifdef CONFIG_BLK_DEV_INITRD
if (LOADER_TYPE && INITRD_START) {
if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
@@ -977,6 +968,25 @@
#endif
/*
+ * NOTE: before this point _nobody_ is allowed to allocate
+ * any memory using the bootmem allocator.
+ */
+
+#ifdef CONFIG_SMP
+ smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
+#endif
+ paging_init();
+#ifdef CONFIG_X86_LOCAL_APIC
+ /*
+ * get boot-time SMP configuration:
+ */
+ if (smp_found_config)
+ get_smp_config();
+ init_apic_mappings();
+#endif
+
+
+ /*
* Request address space for all standard RAM and ROM resources
* and also for regions reported as reserved by the e820.
*/
@@ -1088,11 +1098,18 @@
l2size = ecx >> 16;
/* AMD errata T13 (order #21922) */
- if (c->x86_vendor == X86_VENDOR_AMD &&
- c->x86 == 6 &&
- c->x86_model == 3 &&
- c->x86_mask == 0) {
- l2size = 64;
+ if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) {
+ if (c->x86_model == 3 && c->x86_mask == 0) /* Duron Rev A0 */
+ l2size = 64;
+ if (c->x86_model == 4 &&
+ (c->x86_mask==0 || c->x86_mask==1)) /* Tbird rev A1/A2 */
+ l2size = 256;
+ }
+
+ /* VIA C3 CPUs (670-68F) need further shifting. */
+ if (c->x86_vendor == X86_VENDOR_CENTAUR && (c->x86 == 6) &&
+ ((c->x86_model == 7) || (c->x86_model == 8))) {
+ l2size = l2size >> 8;
}
if ( l2size == 0 )
@@ -1109,7 +1126,7 @@
* misexecution of code under Linux. Owners of such processors should
* contact AMD for precise details and a CPU swap.
*
- * See http://www.mygale.com/~poulot/k6bug.html
+ * See http://www.multimania.com/poulot/k6bug.html
* http://www.amd.com/K6/k6docs/revgd.html
*
* The following test is erm.. interesting. AMD neglected to up
@@ -1126,6 +1143,12 @@
int mbytes = max_mapnr >> (20-PAGE_SHIFT);
int r;
+ /*
+ * FIXME: We should handle the K5 here. Set up the write
+ * range and also turn on MSR 83 bits 4 and 31 (write alloc,
+ * no bus pipeline)
+ */
+
/* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
clear_bit(0*32+31, &c->x86_capability);
@@ -1185,13 +1208,13 @@
if(mbytes>508)
mbytes=508;
- rdmsr(0xC0000082, l, h);
+ rdmsr(MSR_K6_WHCR, l, h);
if ((l&0x0000FFFF)==0) {
unsigned long flags;
l=(1<<0)|((mbytes/4)<<1);
local_irq_save(flags);
- __asm__ __volatile__ ("wbinvd": : :"memory");
- wrmsr(0xC0000082, l, h);
+ wbinvd();
+ wrmsr(MSR_K6_WHCR, l, h);
local_irq_restore(flags);
printk(KERN_INFO "Enabling old style K6 write allocation for %d Mb\n",
mbytes);
@@ -1206,13 +1229,13 @@
if(mbytes>4092)
mbytes=4092;
- rdmsr(0xC0000082, l, h);
+ rdmsr(MSR_K6_WHCR, l, h);
if ((l&0xFFFF0000)==0) {
unsigned long flags;
l=((mbytes>>2)<<22)|(1<<16);
local_irq_save(flags);
- __asm__ __volatile__ ("wbinvd": : :"memory");
- wrmsr(0xC0000082, l, h);
+ wbinvd();
+ wrmsr(MSR_K6_WHCR, l, h);
local_irq_restore(flags);
printk(KERN_INFO "Enabling new style K6 write allocation for %d Mb\n",
mbytes);
@@ -1226,10 +1249,10 @@
set_bit(X86_FEATURE_K6_MTRR, &c->x86_capability);
break;
}
-
break;
case 6: /* An Athlon/Duron. We can trust the BIOS probably */
+ mcheck_init(c);
break;
}
@@ -1312,9 +1335,10 @@
static void __init check_cx686_slop(struct cpuinfo_x86 *c)
{
+ unsigned long flags;
+
if (Cx86_dir0_msb == 3) {
unsigned char ccr3, ccr5;
- unsigned long flags;
local_irq_save(flags);
ccr3 = getCx86(CX86_CCR3);
@@ -1551,14 +1575,12 @@
name="??";
}
- /* get FCR */
- rdmsr(0x107, lo, hi);
-
+ rdmsr(MSR_IDT_FCR1, lo, hi);
newlo=(lo|fcr_set) & (~fcr_clr);
if (newlo!=lo) {
printk(KERN_INFO "Centaur FCR was 0x%X now 0x%X\n", lo, newlo );
- wrmsr(0x107, newlo, hi );
+ wrmsr(MSR_IDT_FCR1, newlo, hi );
} else {
printk(KERN_INFO "Centaur FCR is 0x%X\n",lo);
}
@@ -1577,14 +1599,15 @@
c->x86_cache_size = (cc>>24)+(dd>>24);
}
sprintf( c->x86_model_id, "WinChip %s", name );
+ mcheck_init(c);
break;
case 6:
switch (c->x86_model) {
case 6 ... 7: /* Cyrix III or C3 */
- rdmsr (0x1107, lo, hi);
+ rdmsr (MSR_VIA_FCR, lo, hi);
lo |= (1<<1 | 1<<7); /* Report CX8 & enable PGE */
- wrmsr (0x1107, lo, hi);
+ wrmsr (MSR_VIA_FCR, lo, hi);
set_bit(X86_FEATURE_CX8, &c->x86_capability);
set_bit(X86_FEATURE_3DNOW, &c->x86_capability);
@@ -1595,7 +1618,6 @@
}
break;
}
-
}
@@ -1668,7 +1690,6 @@
if (c->x86_model > 2)
printk(" II");
printk("\n");
- printk("If you have one of these please email davej@suse.de\n");
/* Unhide possibly hidden capability flags
The mp6 iDragon family don't have MSRs.
@@ -1694,7 +1715,6 @@
#ifndef CONFIG_M686
static int f00f_workaround_enabled = 0;
#endif
- extern void mcheck_init(struct cpuinfo_x86 *c);
char *p = NULL;
unsigned int l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
@@ -1989,9 +2009,9 @@
disable_x86_serial_nr ) {
/* Disable processor serial number */
unsigned long lo,hi;
- rdmsr(0x119,lo,hi);
+ rdmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
lo |= 0x200000;
- wrmsr(0x119,lo,hi);
+ wrmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
printk(KERN_NOTICE "CPU serial number disabled.\n");
clear_bit(X86_FEATURE_PN, &c->x86_capability);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)