summaryrefslogtreecommitdiff
path: root/src/cpu/amd
diff options
context:
space:
mode:
authorRonald G. Minnich <rminnich@gmail.com>2006-06-20 03:53:54 +0000
committerRonald G. Minnich <rminnich@gmail.com>2006-06-20 03:53:54 +0000
commit9d0b30dd2b33d04859986be85b125c3005b2a277 (patch)
tree801daa6b7068ad1df9a0a69af4857cc23bb82bd5 /src/cpu/amd
parent1f96360315b874f615739352d5b51a4a79d0f765 (diff)
Fixes from AMD. Tested to build on rumba and olpc, and builds.
Tested to booting linux on olpc, and boots. git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2327 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/cpu/amd')
-rw-r--r--src/cpu/amd/model_gx2/cpubug.c205
1 files changed, 95 insertions, 110 deletions
diff --git a/src/cpu/amd/model_gx2/cpubug.c b/src/cpu/amd/model_gx2/cpubug.c
index e38bbfbaa3..ccc9dbec16 100644
--- a/src/cpu/amd/model_gx2/cpubug.c
+++ b/src/cpu/amd/model_gx2/cpubug.c
@@ -90,7 +90,7 @@ pcideadlock(void)
* Exit:
* Modified:
*
-/****************************************************************************/
+ ****************************************************************************/
void bug784(void)
{
@@ -150,117 +150,102 @@ void eng1398(void)
wrmsr(MC_GLD_MSR_PM, msr);
}
+/***************************************************************************
+ *
+ * CPUbugIAENG2900
+ *
+ * Clear Quest IAENG00002900, VSS 118.150
+ *
+ * BTB issue causes blue screen in windows, but the fix is required
+ * for all operating systems.
+ *
+ * Entry:
+ * Exit:
+ * Modified:
+ *
+ **************************************************************************/
void
-eng2900(void){
- printk_err(" NOT DOING eng2900: only shown to be a windows problem\n");
-#if 0
+eng2900(void)
+{
+ msr_t msr;
-;**************************************************************************
-;*
-;* CPUbugIAENG2900
-;*
-;* Clear Quest IAENG00002900, VSS 118.150
-;*
-;* BTB issue causes blue screen in windows.
-;*
-;* Entry:
-;* Exit:
-;* Modified:
-;*
-;**************************************************************************
-CPUbugIAENG2900 PROC NEAR PUBLIC
- pushad
-
-; Clear bit 43, disables the sysenter/sysexit in CPUID3
- mov ecx, 3003h
- RDMSR
- and edx, 0FFFFF7FFh
- WRMSR
-
- mov cx, TOKEN_BTB_2900_SWAPSIF_ENABLE
- NOSTACK bx, GetNVRAMValueBX
- cmp ax, TVALUE_ENABLE
- jne bug2900exit
-
-
-;Disable enable_actions in DIAGCTL while setting up GLCP
- mov ecx, MSR_GLCP + 005fh
- xor edx, edx
- xor eax, eax
- WRMSR
-
-;Changing DBGCLKCTL register to GeodeLink
- mov ecx, MSR_GLCP + 0016h
- xor edx, edx
- xor eax, eax
- WRMSR
-
- mov ecx, MSR_GLCP + 0016h
- xor edx, edx
- mov eax, 02h
- WRMSR
-
-;The code below sets up the RedCloud to stall for 4 GeodeLink clocks when CPU is snooped.
-;Because setting XSTATE to 0 overrides any other XSTATE action, the code will always
-;stall for 4 GeodeLink clocks after a snoop request goes away even if it occured a clock or two
-;later than a different snoop; the stall signal will never 'glitch high' for
-;only one or two CPU clocks with this code.
-
-;Send mb0 port 3 requests to upper GeodeLink diag bits [63:32]
- mov ecx, MSR_GLIU0 + 2005h
- xor edx, edx
- mov eax, 80338041h
- WRMSR
-
-;set5m watches request ready from mb0 to CPU (snoop)
- mov ecx, MSR_GLCP + 0045h
- mov edx, 5ad68000h
- xor eax, eax
- WRMSR
-
-;SET4M will be high when state is idle (XSTATE=11)
- mov ecx, MSR_GLCP + 0044h
- xor edx, edx
- mov eax, 0140h
- WRMSR
-
-;SET5n to watch for processor stalled state
- mov ecx, MSR_GLCP + 004Dh
- mov edx, 2000h
- xor eax, eax
- WRMSR
-
-;Writing action number 13: XSTATE=0 to occur when CPU is snooped unless we're stalled
- mov ecx, MSR_GLCP + 0075h
- xor edx, edx
- mov eax, 00400000h
- WRMSR
-
-;Writing action number 11: inc XSTATE every GeodeLink clock unless we're idle
- mov ecx, MSR_GLCP + 0073h
- xor edx, edx
- mov eax, 30000h
- WRMSR
-
-
-;Writing action number 5: STALL_CPU_PIPE when exitting idle state or not in idle state
- mov ecx, MSR_GLCP + 006Dh
- xor edx, edx
- mov eax, 00430000h
- WRMSR
-
-;Writing DIAGCTL Register to enable the stall action and to let set5m watch the upper GeodeLink diag bits.
- mov ecx, MSR_GLCP + 005fh
- xor edx, edx
- mov eax, 80004000h
- WRMSR
-
-
-bug2900exit:
- popad
- ret
-CPUbugIAENG2900 ENDP
-#endif
+ printk_debug("CPU_BUG:%s\n", __FUNCTION__);
+ /* Clear bit 43, disables the sysenter/sysexit in CPUID3 */
+ msr = rdmsr(0x3003);
+ msr.hi &= 0xFFFFF7FF;
+ wrmsr(0x3003, msr);
+
+ /* change this value to zero if you need to disable this BTB SWAPSiF. */
+ if (1) {
+
+ /* Disable enable_actions in DIAGCTL while setting up GLCP */
+ msr.hi = 0;
+ msr.lo = 0;
+ wrmsr(MSR_GLCP + 0x005f, msr);
+
+ /* Changing DBGCLKCTL register to GeodeLink */
+ msr.hi = 0;
+ msr.lo = 0;
+ wrmsr(MSR_GLCP + 0x0016, msr);
+
+ msr.hi = 0;
+ msr.lo = 2;
+ wrmsr(MSR_GLCP + 0x0016, msr);
+
+ /* The code below sets up the CPU to stall for 4 GeodeLink
+ * clocks when CPU is snooped. Because setting XSTATE to 0
+ * overrides any other XSTATE action, the code will always
+ * stall for 4 GeodeLink clocks after a snoop request goes
+ * away even if it occured a clock or two later than a
+ * different snoop; the stall signal will never 'glitch high'
+ * for only one or two CPU clocks with this code.
+ */
+
+ /* Send mb0 port 3 requests to upper GeodeLink diag bits
+ [63:32] */
+ msr.hi = 0;
+ msr.lo = 0x80338041;
+ wrmsr(MSR_GLIU0 + 0x2005, msr);
+
+ /* set5m watches request ready from mb0 to CPU (snoop) */
+ msr.hi = 0x5ad68000;
+ msr.lo = 0;
+ wrmsr(MSR_GLCP + 0x0045, msr);
+
+ /* SET4M will be high when state is idle (XSTATE=11) */
+ msr.hi = 0;
+ msr.lo = 0x0140;
+ wrmsr(MSR_GLCP + 0x0044, msr);
+
+ /* SET5n to watch for processor stalled state */
+ msr.hi = 0x2000;
+ msr.lo = 0;
+ wrmsr(MSR_GLCP + 0x004D, msr);
+
+ /* Writing action number 13: XSTATE=0 to occur when CPU is
+ snooped unless we're stalled */
+ msr.hi = 0;
+ msr.lo = 0x00400000;
+ wrmsr(MSR_GLCP + 0x0075, msr);
+
+ /* Writing action number 11: inc XSTATE every GeodeLink clock
+ unless we're idle */
+ msr.hi = 0;
+ msr.lo = 0x30000;
+ wrmsr(MSR_GLCP + 0x0073, msr);
+
+ /* Writing action number 5: STALL_CPU_PIPE when exitting idle
+ state or not in idle state */
+ msr.hi = 0;
+ msr.lo = 0x00430000;
+ wrmsr(MSR_GLCP + 0x006D, msr);
+
+ /* Writing DIAGCTL Register to enable the stall action and to
+ let set5m watch the upper GeodeLink diag bits. */
+ msr.hi = 0;
+ msr.lo = 0x80004000;
+ wrmsr(MSR_GLCP + 0x005f, msr);
+ }
}
void bug118253(void)