Put a 1 msec watchdog on the mcp55's codec status-wait
loops.
This 'fixes' a coreboot lockup I saw on my SuperMicro
H8DME-2 with AMD 2222 Processors installed.
For some reason the codec is being found but the
subsequent initialization sequence is not able to
initialize the device.
Hopefully a 1 msec watchdog is long enough for a found
codec. If not it can be made longer but hopefully it
can be kept much shorter than 1 second as excessively
long timeouts make it difficult to use coreboot as a
'quick boot' mechanism.
Index: trunk/src/southbridge/nvidia/mcp55/mcp55_aza.c
===================================================================
--- trunk.orig/src/southbridge/nvidia/mcp55/mcp55_aza.c 2010-05-12 06:33:16.000000000 -0400
+++ trunk/src/southbridge/nvidia/mcp55/mcp55_aza.c 2010-05-12 07:05:51.000000000 -0400
@@ -173,16 +173,28 @@
int i;
/* 1 */
+ i = 100; /* 1 msec watchdog */
do {
+ udelay(10);
dword = read32(base + 0x68);
- } while (dword & 1);
+ } while ((dword & 1) && --i);
+ if (!i) {
+ printk(BIOS_WARNING, "1: codec(%08x,%d) timed out. Not set up.\n", base, addr);
+ return;
+ }
dword = (addr<<28) | 0x000f0000;
write32(base + 0x60, dword);
+ i = 100; /* 1 msec watchdog */
do {
+ udelay(10);
dword = read32(base + 0x68);
- } while ((dword & 3)!=2);
+ } while (((dword & 3) != 2) && --i);
+ if (!i) {
+ printk(BIOS_WARNING, "2: codec(%08x,%d) timed out. Not set up.\n", base, addr);
+ return;
+ }
dword = read32(base + 0x64);