Revision: linuxbios@linuxbios.org--devel/freebios--devel--2.0--patch-49

Creator:  Ronald G. Minnich <rminnich@lanl.gov>

this is a version that  does not fail, but memory is still not up


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1965 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
arch import user (historical) 2005-07-06 17:16:21 +00:00
parent 9a796d1ffb
commit 69c79d232e
2 changed files with 98 additions and 13 deletions

View File

@ -54,7 +54,7 @@
#define drcmctl (( volatile unsigned char *)0xfffef012)
#define drccfg (( volatile unsigned char *)0xfffef014)
#define drcbendadr (( volatile unsigned char *)0xfffef018)
#define drcbendadr (( volatile unsigned long *)0xfffef018)
#define eccctl (( volatile unsigned char *)0xfffef020)
#define dbctl (( volatile unsigned char *)0xfffef040)
void
@ -70,12 +70,21 @@ setupsc520(void){
*/
/* no, that did not help. I wonder what will?
* outl(0x800df0cb, 0xfffc);
*/
/* well, this is special! You have to do SHORT writes to the locations,
* even though they are CHAR in size and CHAR aligned and technically, a
* SHORT write will result in -- yoo ha! -- over writing the next location!
* Thanks to the u-boot guys for a reference code I can use.
* with these short pointers, it now reliably comes up after power cycle
* with printk. Ah yi yi.
*/
/* turn off the write buffer*/
cp = (unsigned char *)0xfffef040;
*cp = 0;
/* per the note above, make this a short? Let's try it.
*/
sp = (unsigned short *)0xfffef040;
*sp = 0;
/* byte writes in AMD assembly */
/* we do short anyway, since u-boot does ... */
@ -243,7 +252,18 @@ static void dumpram(void){
print_err("bendadr2 "); print_err_hex8(*drcbendadr); print_err("\r\n");
print_err("bendadr3"); print_err_hex8(*drcbendadr); print_err("\r\n");
}
#ifdef FUCK
/* there is a lot of silliness in the amd code, and it is
* causing romcc real headaches, so we're going to be be a little
* less silly.
* so, the order of ops is:
* for in 3 to 0
* see if bank is there.
* if we can write a word, and read it back, to hell with paranoia
* the bank is there. So write the magic byte, read it back, and
* use that to get size, etc. Try to keep things very simple,
* so people can actually follow the damned code.
*/
/* cache is assumed to be disabled */
int sizemem(void)
@ -251,25 +271,87 @@ int sizemem(void)
int rows,banks, cols, i, bank;
unsigned char al;
volatile unsigned long *lp = (volatile unsigned long *) CACHELINESZ;
unsigned long l;
/* initialize dram controller registers */
*dbctl = 0; /* disable write buffer/read-ahead buffer */
*eccctl = 0;
*drcmctl = 0x1e; /* Set SDRAM timing for slowest speed. */
/* setup dram register for all banks
* with max cols and max banks
*/
*drccfg=0xbbbb;
/* setup loop to do 4 external banks starting with bank 3 */
print_err("sizemem\n");
*drcbendadr=0x0ff000000;
/* issue a NOP to all DRAMs */
/* Setup DRAM control register with Disable refresh,
* disable write buffer Test Mode and NOP command select
*/
*drcctl=0x01;
/* dummy write for NOP to take effect */
dummy_write();
print_err("NOP\n");
/* 100? 200? */
//sc520_udelay(100);
print_err("after sc520_udelay\r\n");
/* issue all banks precharge */
*drcctl=0x02;
print_err("set *drcctl to 2 \r\n");
dummy_write();
print_err("PRE\n");
/* issue 2 auto refreshes to all banks */
*drcctl=0x04;
dummy_write();
print_err("AUTO1\n");
dummy_write();
print_err("AUTO2\n");
/* issue LOAD MODE REGISTER command */
*drcctl=0x03;
dummy_write();
print_err("LOAD MODE REG\n");
*drcctl=0x04;
for (i=0; i<8; i++) /* refresh 8 times */{
dummy_write();
print_err("dummy write\r\n");
}
print_err("8 dummy writes\n");
/* set control register to NORMAL mode */
*drcctl=0x00;
print_err("normal\n");
print_err("HI done normal\r\n");
print_err("sizemem\n");
for(bank = 3; bank >= 0; bank--) {
print_err("Try to assign to l\r\n");
*lp = 0xdeadbeef;
print_err("assigned l ... \r\n");
if (*lp != 0xdeadbeef) {
print_err(" no memory at bank ");
// print_err_hex8(bank);
// print_err(" value "); print_err_hex32(*lp);
print_err("\r\n");
// continue;
}
l = *drcbendadr;
l >>= 8;
*drcbendadr = l;
print_err("loop around\r\n");
}
#if 0
/* enable last bank and setup ending address
* register for max ram in last bank
*/
*drcbendadr=0x0ff000000;
/* setup dram register for all banks
* with max cols and max banks
*/
*drccfg=0xbbbb;
// dumpram();
@ -499,10 +581,11 @@ bad_ram:
goto bad_reinit;
while(1)
print_err("DONE NEXTBANK\r\n");
}
#endif
/* note: based on AMD code, but AMD code is BROKEN AFAIK */
}
/* note: based on AMD code, but AMD code is BROKEN AFAIK */
/* this does now work worth shit. */
int
staticmem(void){
volatile unsigned char *zero = (unsigned char *) 0;

View File

@ -53,8 +53,10 @@ static void main(unsigned long bist)
console_init();
// while(1)
print_err("HI THERE!\r\n");
// sizemem();
sizemem();
// staticmem();
while(1)
print_err("STATIC MEM DONE\r\n");
#if 0