O.k. I've figured out what was wrong with DMA.
I made a typo and instead of initializing both CPU buses I initialized
the first CPUs bus twice. And so a DMA transaction would lock up the
northbridge when trying to probe the CPU to see if they needed to
flush any data back to ram.
I now have it booting into linux quite reliably, and am trying to
figure out why I can't get the second CPU to come up.
If I can't figure out pretty quick I'll take a break and start
committing my code anyway.
The other known bug is that I am not properly initializing the Real
Time Clock. I don't know what it is wrong but hwclock hates it. I
thought I was reading bogus numbers in the cmos but it appears hwclock
just messed up the CMOS data when it got confused. So I probably just
need to initialize the RTC interrupt/timer. O.k. that is a much
simpler problem.
Eric