Hello again,
I have been experimenting with an algorithm to detect and register with the northbridge i440bx the correct amount of sdram present. A C-coded version is appended to this message. Feel free to comment on the method.
In the actually working code, I had to split the algorithm into a lower and an upper part, in order not to run out of internal registers under romcc, but the idea remains the same.
Since there are also some later stages where I have not understood how the previous author hard coded a single 64MB bank, I presently achieve a running system only when I dynamically detect a distribution identical to what was earlier hard coded.
My detection works with any combination of 0MB and 64MB in two rows for DIMM0 and DIMM1.
Question: In case an sdram device has rows of mixed sizes, can one depend on the larger density being in row zero, and the smaller content in row one?
The input value to my function sdram_find_rowsize, is typically the byte captured using
spd_read_byte(ctrl->channel0[0],31)
and similar calls. The output has the largest density in the least significant byte, and the smaller density (or a copy for non-mixed devices) in the most significant byte.
Best regards,
Mats E Andersson
---
static uint16_t sdram_find_rowsize(unsigned char d) { char mask = 1;
/* Bail out for empty socket and obviously invalid data. */ if ( d == 0x00 || d == 0xff ) return 0;
while (1) { if ( d & mask ) { if ( d & ~mask ) /* Largest chunk in zero'th row, smallest chunk in first row. */ return ((d & mask) << 8) | (d & ~mask);
/* Make a duplicate copy in high and low part. */ return (d << 8) | d; } mask <<= 1; } }