more fix for vsm, not working yet


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2237 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/src/cpu/amd/model_gx2/cpubug.c b/src/cpu/amd/model_gx2/cpubug.c
index 34ebdc9..8623f22 100644
--- a/src/cpu/amd/model_gx2/cpubug.c
+++ b/src/cpu/amd/model_gx2/cpubug.c
@@ -32,7 +32,8 @@
 #endif
 
 static void
-pcideadlock(void){
+pcideadlock(void)
+{
 	msr_t msr;
 
 	msr = rdmsr(CPU_DM_CONFIG0);
@@ -41,13 +42,11 @@
 	msr.lo |= DM_CONFIG0_LOWER_MISSER_SET;
 	wrmsr(CPU_DM_CONFIG0, msr);
 
-
-
 	msr = rdmsr(CPU_IM_CONFIG);
 	msr.lo |= IM_CONFIG_LOWER_QWT_SET;	/* interlock instruction fetches to WS regions with data accesses.
-									  * This prevents in instruction fetch from going out to PCI if the 
-									  * data side is about to make a request.
-									  */
+						 * This prevents in instruction fetch from going out to PCI if the 
+						 * data side is about to make a request.
+						 */
 	wrmsr(CPU_IM_CONFIG, msr);
 	/* write serialize memory hole to PCI. Need to to unWS when something is shadowed regardless of cachablility.*/
 
@@ -72,13 +71,14 @@
 /***/
 /****************************************************************************/
 
-void bug784(void){
+void bug784(void)
+{
 	msr_t msr;
-//	static char *name = "Geode by NSC";
+	//static char *name = "Geode by NSC";
 
 	/* we'll do this the stupid way, for now, but that's the string they want. NO ONE KNOWS why you
-	  * would do this -- the OS can figure this type of stuff out!
-	  */
+	 * would do this -- the OS can figure this type of stuff out!
+	 */
 	msr = rdmsr(0x3006);
 	msr.hi = 0x646f6547;
 	wrmsr(0x3006, msr);
@@ -91,7 +91,7 @@
 	msr = rdmsr(0x3002);
 	wrmsr(0x3008, msr);
 
-/* More CPUID to match AMD better. #792*/
+	/* More CPUID to match AMD better. #792*/
 	msr = rdmsr(0x3009);
 	msr.hi = 0x0C0C0A13D;
 	msr.lo = 0x00000000;
@@ -99,8 +99,8 @@
 }
 
 /* cpubug 1398: enable MC if we KNOW we have DDR*/
-void
-eng1398(void){
+void eng1398(void)
+{
 	msr_t msr;
 
 	msr = rdmsr(MSR_GLCP+0x17);
diff --git a/src/cpu/amd/model_gx2/vsmsetup.c b/src/cpu/amd/model_gx2/vsmsetup.c
index 69470d5..593c7f7 100644
--- a/src/cpu/amd/model_gx2/vsmsetup.c
+++ b/src/cpu/amd/model_gx2/vsmsetup.c
@@ -199,7 +199,9 @@
 		//"	mov	%ax, %gs       	\n"
 		"	mov	$0x40, %ax	\n"
 		"	mov	%ax, %ds	\n"
-		"	mov	%cx, %ax	\n"
+		//"	mov	%cx, %ax	\n"
+		"	movl    $0x10000026, %ecx	\n"
+		"	movl    $0x10000028, %edx	\n"
 
 		/* run VGA BIOS at 0x6000:0020 */
 		"	lcall	$0x6000, $0x0020\n"
@@ -275,6 +277,9 @@
 
 	memcpy((void *) 0x60000, buf, size);
 
+	for (i = 0; i < 0x800000; i++)
+		outb(0xaa, 0x80);
+
 	/* ecx gets smm, edx gets sysm */
 	printk_err("Call real_mode_switch_call_vsm\n");
 	real_mode_switch_call_vsm(0x10000026, 0x10000028);
diff --git a/src/mainboard/amd/rumba/auto.c b/src/mainboard/amd/rumba/auto.c
index 84c837b..3ac8fd2 100644
--- a/src/mainboard/amd/rumba/auto.c
+++ b/src/mainboard/amd/rumba/auto.c
@@ -124,6 +124,16 @@
 
         __builtin_wrmsr(0x50002001, 0x27, 0x0);
         __builtin_wrmsr(0x4c002001, 0x1, 0x0);
+#if 1
+        __builtin_wrmsr(0x4c00000c, 0x0, 0x08);
+	__builtin_wrmsr(0x4c000016, 0x0, 0x0);
+	__builtin_wrmsr(0x4c00000c, 0x1, 0x0);
+	__builtin_wrmsr(0x4c00005e, 0x03880000, 0x00);
+	__builtin_wrmsr(0x4c00006f, 0x0000f000, 0x00);
+	__builtin_wrmsr(0x4c00005f, 0x08000000, 0x00);
+	__builtin_wrmsr(0x4c00000d, 0x82b5ad68, 0x80ad6b57);
+	__builtin_wrmsr(0x4c00000c, 0x0, 0x0);
+#endif
 }
 
 
diff --git a/src/northbridge/amd/gx2/northbridge.c b/src/northbridge/amd/gx2/northbridge.c
index fb3cb1c..85c3822 100644
--- a/src/northbridge/amd/gx2/northbridge.c
+++ b/src/northbridge/amd/gx2/northbridge.c
@@ -171,7 +171,7 @@
 	sizem = setup_gx2_cache();
 
 	membytes = sizem * 1048576;
-
+#if 0
 	/* we need to set 0x10000028 and 0x40000029 */
 	printk_debug("sizem 0x%x, membytes 0x%x\n", sizem, membytes);
 	msr.hi = 0x20000000 | membytes>>24;
@@ -201,7 +201,28 @@
 	msr.hi = tmp;
 	msr.lo = tmp2;
 	wrmsr(0x10000026, msr);
+#else
+	msr.hi = 0x2000000f;
+	msr.lo = 0xfbf00100;
+	wrmsr(0x10000028, msr);
+	msr = rdmsr(0x10000028);
+	printk_debug("MSR 0x%x is now 0x%x:0x%x\n", 0x10000028, msr.hi, msr.lo);
+	wrmsr(0x40000029, msr);
+	msr = rdmsr(0x40000029);
+	printk_debug("MSR 0x%x is now 0x%x:0x%x\n", 0x40000029, msr.hi, msr.lo);
 
+	msr.hi = 0x2cfbc040;
+	msr.lo = 0x400fffc0;
+	wrmsr(0x10000026, msr);
+	msr = rdmsr(0x10000026);
+	printk_debug("MSR 0x%x is now 0x%x:0x%x\n", 0x10000026, msr.hi, msr.lo);
+
+	msr.hi = 0x22fffc02;
+	msr.lo = 0x10ffbf00;
+	wrmsr(0x1808, msr);
+	msr = rdmsr(0x1808);
+	printk_debug("MSR 0x%x is now 0x%x:0x%x\n", 0x1808, msr.hi, msr.lo);
+#endif
 	/* now do the default MSR values */
 	for(i = 0; msr_defaults[i].msr_no; i++) {
 		msr_t msr;