[LinuxBIOS] i82830 raminit.c
Joseph Smith
joe at smittys.pointclark.net
Mon Jul 16 11:58:58 CEST 2007
>
> int i, spd_byte_31, spd_byte_5;
> spd_byte_31 = smbus_read_byte(device, 31); //please rename device to dimm
> spd_byte_5 = smbus_read_byte(device, 5);
>
> for (i = 8; i >= 0; i--) {
> /* Find the larger value. The larger side is always side1 */
> if (spd_byte_31 & (1 << i) == (1 << i)) {
> sz.side1 = i;
> break;
> }
> }
>
> /* Set to 0 in case it's single sided */
> sz.side2 = 0;
>
> /* Test if it's a dual-sided dimm */
> if (spd_byte_5 > 1) {
> /* Test to see if there's a second value, if so it's asymmetrical */
> if (spd_byte_31 != (1 << i)) {
> /* Find the second value, picking up where we left off */
> /* i-- done initially to make sure we don't get the same value
> again */
> for (i--; i >= 0; i--) {
> if (spd_byte_31 == (1 << i) {
> sz.side2 = i;
> break;
> }
> }
> }
> /* If not, it's symmetrical */
> else {
> sz.side2 = sz.side1;
> }
> return sz; //sizes are now in units of 4mb, so 1 = 4mb, 2 = 8mb, etc.
> }
>
>
> -Corey
>
>
Corey,
I have been playing around with this a bit. I really like it! The only
thing I do not understand is how you get ticks of 4mb out of it. Say
we have a single sided 128mb dimm. i is going to end up being 7
correct? 4 * 7 is not 128, I'm confused.....
Couldn't you just make the end result something like sz.side1 = (1 <<
i) after it breaks out of the for loop? This would give you the total
without messing around with ticks of 4mb right?
Thanks - Joe
More information about the coreboot
mailing list