Myles Watson wrote:
I've yanked all of the sdram initialization from my s2895 so that I can use my HT device as RAM. I've set up the BARs in the device and in the Opteron so that I should have access to 0-2GB. It hangs here:
testx = 5a5a5a5a Copying data from cache to RAM -- switching to use RAM as stack...
Somehow the memory accesses aren't reaching my device. I added some debugging, and this line before the debugging:
set_var_mtrr(0, 0x08000000, 0x10000000, MTRR_TYPE_WRBACK);
I think you need to have setup correctly the resource routing registers. Also maybe it is more like a PCI space? If so then you need to setup the MTRR and ask to send the accesses to PCI space and not to ram.
Rudolf
Here's the output:
xd1000_ram_init: ram_dev=4000000 id=554e1172 xd1000_BARs xd1000_ram_init: testing "RAM" val = ffffffff After loop p=10180020 *p=ffffffff val(@0x08180020)=8189920 *p(08180020) = 8189920 *p(08980020) = ffffffff *p(09180020) = ffffffff *p(09980020) = ffffffff *p(0a180020) = ffffffff *p(0a980020) = ffffffff *p(0b180020) = ffffffff *p(0b980020) = ffffffff *p(0c180020) = ffffffff *p(0c980020) = ffffffff *p(0d180020) = ffffffff *p(0d980020) = ffffffff *p(0e180020) = ffffffff *p(0e980020) = ffffffff *p(0f180020) = ffffffff *p(0f980020) = ffffffff v_esp=000cffe8
It looks like one value sticks but not the rest. Here's the debugging code:
printk_debug("%s: testing \"RAM\"", __func__);
// Try to force the values out of the cache. *((volatile u32 *)0x08180000) = 0x5a5a5a50; *((volatile u32 *)0x08180008) = 0x5a5a5a51; *((volatile u32 *)0x08180010) = 0x5a5a5a52; *((volatile u32 *)0x08180018) = 0x5a5a5a53; *((volatile u32 *)0x08180020) = 0x5a5a5a54; *((volatile u32 *)0x08180028) = 0x5a5a5a55; *((volatile u32 *)0x08180030) = 0x5a5a5a56; *((volatile u32 *)0x08180038) = 0x5a5a5a57; *((volatile u32 *)0x08180040) = 0x5a5a5a58; *((volatile u32 *)0x09180020) = 0x5a5a5a59; *((volatile u32 *)0x0A180020) = 0x5a5a5a5a; *((volatile u32 *)0x0B180020) = 0x5a5a5a5b; *((volatile u32 *)0x0C180020) = 0x5a5a5a5c; *((volatile u32 *)0x0D180020) = 0x5a5a5a5d; *((volatile u32 *)0x0E180020) = 0x5a5a5a5e; *((volatile u32 *)0x0F180020) = 0x5a5a5a5f; // Check value.
val = *((volatile u32 *) 0x08180020); printk_debug(" val = %x\n", val);
// Write to various locations. for (p = (volatile u32 *) 0x08180020; p < ((volatile u32 *) 0x10000000); p+=0x200000) *p = (u32) p + 0x00009900; val = *((volatile u32 *) 0x08180020); printk_debug("After loop p=%p *p=%x val(@0x08180020)=%x\n", p, *p, val);
//Read them back for (p = (volatile u32 *) 0x08180020; p < ((volatile u32 *) 0x10000000); p+=0x200000) { val = *p; printk_debug(" *p(%p) = %lx\n", p, val); }
So I'm going through all the code I disabled trying to figure out what else the Opteron needs to send memory references onto the bus.
Any suggestions?
Thanks, Myles