[LinuxBIOS] DIMM Page Size

Joseph Smith joe at smittys.pointclark.net
Fri Jul 13 07:44:52 CEST 2007


Ok, here is my DRA function for i82830 raminit.c. Feedback,  
suggestions welcome. If there is any easier way to write this please  
let me know. I am still a newbie at C, but learning quickly. If the  
format looks funky, blaime Horde IMAP.

Thanks - Joe

----------------------------------------------

static void set_dram_row_attributes(const struct mem_controller *ctrl)
{
	int i, dra, col, width, page_size;


	for (i = 0; i < DIMM_SOCKETS; i++) {
		/* First check if a DIMM is actually present. */
		if (smbus_read_byte(ctrl->channel0[i], 2) == 4) {
			print_debug("Found DIMM in slot ");
			print_debug_hex8(i);
			print_debug(", Setting DRA...\r\n");

			dra = 0x00;

			/* columns */
			col = smbus_read_byte(ctrl->channel0[i], 4);

			/* data width */
			width = smbus_read_byte(ctrl->channel0[i], 6);

			/* calculate page size in bits */
			page_size = ((1 << col) * width);

			/* convert to Kilobytes */
			dra = ((page_size / 8) >> 10);

			/* 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_debug("Page Size not supported\r\n");
				die("HALT!\r\n");
			}
		} else {
			print_debug("No DIMM found in slot ");
			print_debug_hex8(i);
			print_debug(", Setting DRA to 0xFF\r\n");

			/* If there's no DIMM in the slot, set dra value to 0xFF. */
			dra = 0xFF;
		}

		/* Set the value for DRAM Row Attribute Registers */
       	         pci_write_config8(ctrl->d0, DRA + i, dra);
		print_debug("DRA ");
		print_debug_hex8(DRA + i);
		print_debug(" has been set to ");
		print_debug_hex8(dra);
		print_debug("\r\n");
	}
}





More information about the coreboot mailing list