[LinuxBIOS] [LinuxBIOSv2] WIP Support for RCA RM4100 - i82830 Complete

joe at smittys.pointclark.net joe at smittys.pointclark.net
Sat Sep 29 17:08:41 CEST 2007


Quoting Uwe Hermann <uwe at hermann-uwe.de>:

>> +		/* First check if a DIMM is actually present. */
>> +		if (spd_read_byte(device, 2) == 0x4) {
>> +			print_debug("Found DIMM in slot ");
>> +			print_debug_hex8(i);
>> +			print_debug(", setting DRA...\r\n");
>> +
>> +			dra = 0x00;
>> +
>> +			/* columns */
>> +			col = spd_read_byte(device, 4);
>> +
>> +			/* data width */
>> +			width = spd_read_byte(device, 6);
>> +
>> +			/* calculate page size in bits */
>> +			value = ((1 << col) * width);
>> +
>> +			/* convert to Kilobytes */
>> +			dra = ((value / 8) >> 10);
>> +
>> +			/* # of banks of DIMM (single or double sided) */
>> +			value = spd_read_byte(device, 5);
>> +
>> +			if (value == 1) {
>> +				/* 2KB */
>> +				if (dra == 0x2) {
>> +					dra = 0xF0;
>> +				/* 4KB */
>> +				} else if (dra == 0x4) {
>> +					dra = 0xF1;
>> +				/* 8KB */
>> +				} else if (dra == 0x8) {
>> +					dra = 0xF2;
>> +				/* 16KB */
>> +				} else if (dra == 0x10) {
>> +					dra = 0xF3;
>> +				} else {
>> +					print_err("Page size not supported\r\n");
>> +					die("HALT\r\n");
>> +				}
>> +			} else if (value == 2) {
>> +				/* 2KB */
>> +				if (dra == 0x2) {
>> +					dra = 0x00;
>> +				/* 4KB */
>> +				} else if (dra == 0x4) {
>> +					dra = 0x11;
>> +				/* 8KB */
>> +				} else if (dra == 0x8) {
>> +					dra = 0x22;
>> +				/* 16KB */
>> +				} else if (dra == 0x10) {
>> +					dra = 0x33;
>> +				} else {
>> +					print_err("Page size not supported\r\n");
>> +					die("HALT\r\n");
>> +				}
>
> This code can be made a lot shorter using a table and a loop, I think.
>
> Uwe.

Uwe, I not really sure how I could use a table and a loop for this but  
would a switch be ok?

/* # of banks of DIMM (single or double sided) */
value = spd_read_byte(device, 5);

if (value == 1) {
	switch(dra) {
		/* 2KB */
		case 2:
			dra = 0xF0;
			break;
		/* 4KB */
		case 4:
			dra = 0xF1;
			break;
		/* 8KB */
		case 8:
			dra = 0xF2;
			break;
		/* 16KB */
		case 10:
			dra = 0xF3;
			break;
		default:
			print_err("Page size not supported\r\n");
			die("HALT\r\n");
	}
} else if (value == 2) {
	switch(dra) {
		/* 2KB */
		case 2:
			dra = 0x00;
			break;
		/* 4KB */
		case 4:
			dra = 0x11;
			break;
		/* 8KB */
		case 8:
			dra = 0x22;
			break;
		/* 16KB */
		case 10:
			dra = 0x33;
			break;
		default:
			print_err("Page size not supported\r\n");
			die("HALT\r\n");
	}
}else {
	print_err("# of banks of DIMM not supported\r\n");
	die("HALT\r\n");
}

Thanks - Joe




More information about the coreboot mailing list