changes today.

Ronald G. Minnich rminnich at lanl.gov
Thu Sep 30 11:31:01 CEST 2004


A few changes that are important to some of you. 

First, I found a fun problem in the i82801dbm early smbus code. It starts 
an op, then waits for the 'active' bit to go to zero. The CPU is so fast 
that it polls before the bit goes to one, sees that it is zero, says 'the 
op is done', then gets an error because the right done bit is not set. The 
result on the digital Logic adl855pc was that it would not reliably read 
the smbus. 

So I've added, to this file: 
southbridge/intel/i82801dbm/i82801dbm_early_smbus.c

this function: 
> static int smbus_wait_until_active(void)
> {
>       unsigned long loops;
>       loops = SMBUS_TIMEOUT;
>       do {
>               unsigned char val;
>               smbus_delay();
>               val = inb(SMBUS_IO_BASE + SMBHSTSTAT);
>               if ((val & 1)) {
>                       break;
>               }
>       } while(--loops);
>       return loops?0:-4;
> }


which I hope is the right way to do this :-)

And in the smbus_read_byte, it now calls the function in this manner: 
>       /* poll for it to start */
>       if (smbus_wait_until_active() < 0) {
>               return -4;
>       }

in other words, wait until it is started BEFORE you see if it is done :-)

This affects all mobos using this part; let me know if it is trouble for 
you. It should not be.

Next, flash_and_burn now has an erase_block_jedec function, and I have 
added support for the SST firmware hub parts. Tested and working on the 1 
MBYTE SST part (49LF008A)

ron



More information about the coreboot mailing list