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:
parent
9a796d1ffb
commit
69c79d232e
@ -54,7 +54,7 @@
|
|||||||
#define drcmctl (( volatile unsigned char *)0xfffef012)
|
#define drcmctl (( volatile unsigned char *)0xfffef012)
|
||||||
#define drccfg (( volatile unsigned char *)0xfffef014)
|
#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 eccctl (( volatile unsigned char *)0xfffef020)
|
||||||
#define dbctl (( volatile unsigned char *)0xfffef040)
|
#define dbctl (( volatile unsigned char *)0xfffef040)
|
||||||
void
|
void
|
||||||
@ -70,12 +70,21 @@ setupsc520(void){
|
|||||||
*/
|
*/
|
||||||
/* no, that did not help. I wonder what will?
|
/* no, that did not help. I wonder what will?
|
||||||
* outl(0x800df0cb, 0xfffc);
|
* 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*/
|
/* turn off the write buffer*/
|
||||||
cp = (unsigned char *)0xfffef040;
|
/* per the note above, make this a short? Let's try it.
|
||||||
*cp = 0;
|
*/
|
||||||
|
sp = (unsigned short *)0xfffef040;
|
||||||
|
*sp = 0;
|
||||||
|
|
||||||
/* byte writes in AMD assembly */
|
/* byte writes in AMD assembly */
|
||||||
/* we do short anyway, since u-boot does ... */
|
/* 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("bendadr2 "); print_err_hex8(*drcbendadr); print_err("\r\n");
|
||||||
print_err("bendadr3"); 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 */
|
/* cache is assumed to be disabled */
|
||||||
int sizemem(void)
|
int sizemem(void)
|
||||||
@ -251,25 +271,87 @@ int sizemem(void)
|
|||||||
|
|
||||||
int rows,banks, cols, i, bank;
|
int rows,banks, cols, i, bank;
|
||||||
unsigned char al;
|
unsigned char al;
|
||||||
|
volatile unsigned long *lp = (volatile unsigned long *) CACHELINESZ;
|
||||||
|
unsigned long l;
|
||||||
/* initialize dram controller registers */
|
/* initialize dram controller registers */
|
||||||
|
|
||||||
*dbctl = 0; /* disable write buffer/read-ahead buffer */
|
*dbctl = 0; /* disable write buffer/read-ahead buffer */
|
||||||
*eccctl = 0;
|
*eccctl = 0;
|
||||||
*drcmctl = 0x1e; /* Set SDRAM timing for slowest speed. */
|
*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 */
|
/* 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
|
/* enable last bank and setup ending address
|
||||||
* register for max ram in last bank
|
* register for max ram in last bank
|
||||||
*/
|
*/
|
||||||
*drcbendadr=0x0ff000000;
|
*drcbendadr=0x0ff000000;
|
||||||
|
|
||||||
/* setup dram register for all banks
|
|
||||||
* with max cols and max banks
|
|
||||||
*/
|
|
||||||
*drccfg=0xbbbb;
|
|
||||||
|
|
||||||
// dumpram();
|
// dumpram();
|
||||||
|
|
||||||
@ -499,10 +581,11 @@ bad_ram:
|
|||||||
goto bad_reinit;
|
goto bad_reinit;
|
||||||
while(1)
|
while(1)
|
||||||
print_err("DONE NEXTBANK\r\n");
|
print_err("DONE NEXTBANK\r\n");
|
||||||
}
|
|
||||||
#endif
|
#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
|
int
|
||||||
staticmem(void){
|
staticmem(void){
|
||||||
volatile unsigned char *zero = (unsigned char *) 0;
|
volatile unsigned char *zero = (unsigned char *) 0;
|
||||||
|
@ -53,8 +53,10 @@ static void main(unsigned long bist)
|
|||||||
console_init();
|
console_init();
|
||||||
// while(1)
|
// while(1)
|
||||||
print_err("HI THERE!\r\n");
|
print_err("HI THERE!\r\n");
|
||||||
// sizemem();
|
sizemem();
|
||||||
// staticmem();
|
// staticmem();
|
||||||
|
|
||||||
|
while(1)
|
||||||
print_err("STATIC MEM DONE\r\n");
|
print_err("STATIC MEM DONE\r\n");
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user