Author: uwe Date: 2008-11-21 00:18:10 +0100 (Fri, 21 Nov 2008) New Revision: 3764
Modified: trunk/coreboot-v2/src/mainboard/asus/mew-am/auto.c trunk/coreboot-v2/src/mainboard/asus/mew-vm/auto.c trunk/coreboot-v2/src/mainboard/msi/ms6178/auto.c trunk/coreboot-v2/src/northbridge/intel/i82810/debug.c trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.c trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.h Log: Get rid of the unnecessary indirection by 'struct mem_controller' for the Intel 810 chipset (and all boards using it). This isn't required for this chipset as there's only one memory controller.
This also helps a lot with romcc register usage, you should see the dreaded "too few registers" less often.
Build-tested with all three boards using the Intel 810 chipset.
Signed-off-by: Uwe Hermann uwe@hermann-uwe.de Acked-by: Corey Osgood corey.osgood@gmail.com
Modified: trunk/coreboot-v2/src/mainboard/asus/mew-am/auto.c =================================================================== --- trunk/coreboot-v2/src/mainboard/asus/mew-am/auto.c 2008-11-20 20:07:38 UTC (rev 3763) +++ trunk/coreboot-v2/src/mainboard/asus/mew-am/auto.c 2008-11-20 23:18:10 UTC (rev 3764) @@ -48,17 +48,9 @@
#include "northbridge/intel/i82810/raminit.c" /* #include "northbridge/intel/i82810/debug.c" */ -#include "sdram/generic_sdram.c"
static void main(unsigned long bist) { - static const struct mem_controller memctrl[] = { - { - .d0 = PCI_DEV(0, 0, 0), - .channel0 = {0x50, 0x51}, - } - }; - if (bist == 0) early_mtrr_init();
@@ -67,7 +59,9 @@ console_init(); report_bist_failure(bist); enable_smbus(); - /* dump_spd_registers(&memctrl[0]); */ - sdram_initialize(ARRAY_SIZE(memctrl), memctrl); + /* dump_spd_registers(); */ + sdram_set_registers(); + sdram_set_spd_registers(); + sdram_enable(); /* ram_check(0, 640 * 1024); */ }
Modified: trunk/coreboot-v2/src/mainboard/asus/mew-vm/auto.c =================================================================== --- trunk/coreboot-v2/src/mainboard/asus/mew-vm/auto.c 2008-11-20 20:07:38 UTC (rev 3763) +++ trunk/coreboot-v2/src/mainboard/asus/mew-vm/auto.c 2008-11-20 23:18:10 UTC (rev 3764) @@ -52,17 +52,9 @@
#include "northbridge/intel/i82810/raminit.c" #include "northbridge/intel/i82810/debug.c" -#include "sdram/generic_sdram.c"
static void main(unsigned long bist) { - static const struct mem_controller memctrl[] = { - { - .d0 = PCI_DEV(0, 0, 0), - .channel0 = {0x50, 0x51}, - } - }; - if (bist == 0) early_mtrr_init();
@@ -75,15 +67,12 @@ /* Halt if there was a built in self test failure. */ report_bist_failure(bist);
- /* dump_spd_registers(&memctrl[0]); */ + /* dump_spd_registers(); */
- /* sdram_initialize() runs out of registers. */ - /* sdram_initialize(ARRAY_SIZE(memctrl), memctrl); */ + sdram_set_registers(); + sdram_set_spd_registers(); + sdram_enable();
- sdram_set_registers(memctrl); - sdram_set_spd_registers(memctrl); - sdram_enable(0, memctrl); - /* Check RAM. */ /* ram_check(0, 640 * 1024); */ }
Modified: trunk/coreboot-v2/src/mainboard/msi/ms6178/auto.c =================================================================== --- trunk/coreboot-v2/src/mainboard/msi/ms6178/auto.c 2008-11-20 20:07:38 UTC (rev 3763) +++ trunk/coreboot-v2/src/mainboard/msi/ms6178/auto.c 2008-11-20 23:18:10 UTC (rev 3764) @@ -37,19 +37,11 @@ #include "southbridge/intel/i82801xx/i82801xx_early_smbus.c" #include "pc80/udelay_io.c" #include "northbridge/intel/i82810/raminit.c" -#include "sdram/generic_sdram.c"
#define SERIAL_DEV PNP_DEV(0x2e, W83627HF_SP1)
static void main(unsigned long bist) { - static const struct mem_controller memctrl[] = { - { - .d0 = PCI_DEV(0, 0, 0), - .channel0 = {0x50, 0x51}, - } - }; - if (bist == 0) early_mtrr_init();
@@ -66,7 +58,10 @@ enable_smbus();
report_bist_failure(bist); - /* dump_spd_registers(&memctrl[0]); */ - sdram_initialize(ARRAY_SIZE(memctrl), memctrl); + + /* dump_spd_registers(); */ + sdram_set_registers(); + sdram_set_spd_registers(); + sdram_enable(); /* ram_check(0, 640 * 1024); */ }
Modified: trunk/coreboot-v2/src/northbridge/intel/i82810/debug.c =================================================================== --- trunk/coreboot-v2/src/northbridge/intel/i82810/debug.c 2008-11-20 20:07:38 UTC (rev 3763) +++ trunk/coreboot-v2/src/northbridge/intel/i82810/debug.c 2008-11-20 23:18:10 UTC (rev 3764) @@ -1,11 +1,11 @@
-static void dump_spd_registers(const struct mem_controller *ctrl) +static void dump_spd_registers(void) { int i; print_debug("\r\n"); - for(i = 0; i < 4; i++) { + for(i = 0; i < DIMM_SOCKETS; i++) { unsigned device; - device = ctrl->channel0[i]; + device = DIMM_SPD_BASE + i; if (device) { int j; print_debug("dimm: ");
Modified: trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.c =================================================================== --- trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.c 2008-11-20 20:07:38 UTC (rev 3763) +++ trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.c 2008-11-20 23:18:10 UTC (rev 3764) @@ -62,22 +62,21 @@ /** * Send the specified RAM command to all DIMMs. * - * @param Memory controller * @param TODO * @param TODO */ -static void do_ram_command(const struct mem_controller *ctrl, uint32_t command, - uint32_t addr_offset, uint32_t row_offset) +static void do_ram_command(uint32_t command, uint32_t addr_offset, + uint32_t row_offset) { uint8_t reg;
/* TODO: Support for multiple DIMMs. */
/* Configure the RAM command. */ - reg = pci_read_config8(ctrl->d0, DRAMT); + reg = pci_read_config8(PCI_DEV(0, 0, 0), DRAMT); reg &= 0x1f; /* Clear bits 7-5. */ reg |= command << 5; - pci_write_config8(ctrl->d0, DRAMT, reg); + pci_write_config8(PCI_DEV(0, 0, 0), DRAMT, reg);
/* RAM_COMMAND_NORMAL affects only the memory controller and doesn't need to be "sent" to the DIMMs. */ @@ -101,8 +100,7 @@ /* * Set DRP - DRAM Row Population Register (Device 0). */ -static void spd_set_dram_size(const struct mem_controller *ctrl, - uint32_t row_offset) +static void spd_set_dram_size(uint32_t row_offset) { /* The variables drp and dimm_size have to be ints since all the * SMBus-related functions return ints, and its just easier this way. @@ -113,12 +111,12 @@
for (i = 0; i < DIMM_SOCKETS; i++) { /* First check if a DIMM is actually present. */ - if (smbus_read_byte(ctrl->channel0[i], 2) == 4) { + if (smbus_read_byte(DIMM_SPD_BASE + i, 2) == 4) { print_debug("Found DIMM in slot "); print_debug_hex8(i); print_debug("\r\n");
- dimm_size = smbus_read_byte(ctrl->channel0[i], 31); + dimm_size = smbus_read_byte(DIMM_SPD_BASE + i, 31);
/* WISHLIST: would be nice to display it as decimal? */ print_debug("DIMM is 0x"); @@ -181,7 +179,7 @@
/* If the DIMM is dual-sided, the DRP value is +2 */ /* TODO: Figure out asymetrical configurations. */ - if ((smbus_read_byte(ctrl->channel0[i], 127) | 0xf) == + if ((smbus_read_byte(DIMM_SPD_BASE + i, 127) | 0xf) == 0xff) { print_debug("DIMM is dual-sided\r\n"); dimm_size += 2; @@ -203,13 +201,13 @@ print_debug_hex8(drp); print_debug("\r\n");
- pci_write_config8(ctrl->d0, DRP, drp); + pci_write_config8(PCI_DEV(0, 0, 0), DRP, drp); }
-static void set_dram_timing(const struct mem_controller *ctrl) +static void set_dram_timing(void) { /* TODO, for now using default, hopefully safe values. */ - // pci_write_config8(ctrl->d0, DRAMT, 0x00); + // pci_write_config8(PCI_DEV(0, 0, 0), DRAMT, 0x00); }
/* @@ -239,9 +237,9 @@ * 0x4445 384MB 0xfd 128MB single-sided 256MB dual-sided * 0x0001 512MB 0xff 256MB dual-sided 256MB dual-sided */ -static void set_dram_buffer_strength(const struct mem_controller *ctrl) +static void set_dram_buffer_strength(void) { - pci_write_config16(ctrl->d0, BUFF_SC, 0x77da); + pci_write_config16(PCI_DEV(0, 0, 0), BUFF_SC, 0x77da); }
/*----------------------------------------------------------------------------- @@ -250,15 +248,13 @@
/** * TODO. - * - * @param Memory controller */ -static void sdram_set_registers(const struct mem_controller *ctrl) +static void sdram_set_registers(void) { unsigned long val;
/* TODO */ - pci_write_config8(ctrl->d0, GMCHCFG, 0x60); + pci_write_config8(PCI_DEV(0, 0, 0), GMCHCFG, 0x60);
/* PAMR: Programmable Attributes Register * Every pair of bits controls an address range: @@ -275,49 +271,44 @@ */
/* Ideally, this should be R/W for as many ranges as possible. */ - pci_write_config8(ctrl->d0, PAM, 0xff); + pci_write_config8(PCI_DEV(0, 0, 0), PAM, 0xff);
/* Enabling the VGA Framebuffer currently screws up the rest of the boot. * Disable for now */ /* Enable 1MB framebuffer. */ - //pci_write_config8(ctrl->d0, SMRAM, 0xC0); + //pci_write_config8(PCI_DEV(0, 0, 0), SMRAM, 0xC0);
- //val = pci_read_config16(ctrl->d0, MISSC); + //val = pci_read_config16(PCI_DEV(0, 0, 0), MISSC); /* Preserve reserved bits. */ //val &= 0xff06; /* Set graphics cache window to 32MB, no power throttling. */ //val |= 0x0001; - //pci_write_config16(ctrl->d0, MISSC, val); + //pci_write_config16(PCI_DEV(0, 0, 0), MISSC, val);
- //val = pci_read_config8(ctrl->d0, MISSC2); + //val = pci_read_config8(PCI_DEV(0, 0, 0), MISSC2); /* Enable graphics palettes and clock gating (not optional!) */ //val |= 0x06; - //pci_write_config8(ctrl->d0, MISSC2, val); + //pci_write_config8(PCI_DEV(0, 0, 0), MISSC2, val); }
/** * TODO. - * - * @param Memory controller */ -static void sdram_set_spd_registers(const struct mem_controller *ctrl) +static void sdram_set_spd_registers(void) { /* spd_set_dram_size() moved into sdram_enable() to prevent having * to pass a variable between here and there. */ - set_dram_buffer_strength(ctrl); + set_dram_buffer_strength();
- set_dram_timing(ctrl); + set_dram_timing(); }
/** * Enable SDRAM. - * - * @param Number of controllers - * @param Memory controller */ -static void sdram_enable(int controllers, const struct mem_controller *ctrl) +static void sdram_enable(void) { int i;
@@ -327,21 +318,21 @@ */ uint32_t row_offset;
- spd_set_dram_size(ctrl, row_offset); + spd_set_dram_size(row_offset);
/* 1. Apply NOP. */ PRINT_DEBUG("RAM Enable 1: Apply NOP\r\n"); - do_ram_command(ctrl, RAM_COMMAND_NOP, 0, row_offset); + do_ram_command(RAM_COMMAND_NOP, 0, row_offset); udelay(200);
/* 2. Precharge all. Wait tRP. */ PRINT_DEBUG("RAM Enable 2: Precharge all\r\n"); - do_ram_command(ctrl, RAM_COMMAND_PRECHARGE, 0, row_offset); + do_ram_command(RAM_COMMAND_PRECHARGE, 0, row_offset); udelay(1);
/* 3. Perform 8 refresh cycles. Wait tRC each time. */ PRINT_DEBUG("RAM Enable 3: CBR\r\n"); - do_ram_command(ctrl, RAM_COMMAND_CBR, 0, row_offset); + do_ram_command(RAM_COMMAND_CBR, 0, row_offset); for (i = 0; i < 8; i++) { read32(0); read32(row_offset); @@ -350,12 +341,12 @@
/* 4. Mode register set. Wait two memory cycles. */ PRINT_DEBUG("RAM Enable 4: Mode register set\r\n"); - do_ram_command(ctrl, RAM_COMMAND_MRS, 0x1d0, row_offset); + do_ram_command(RAM_COMMAND_MRS, 0x1d0, row_offset); udelay(2);
/* 5. Normal operation (enables refresh) */ PRINT_DEBUG("RAM Enable 5: Normal operation\r\n"); - do_ram_command(ctrl, RAM_COMMAND_NORMAL, 0, row_offset); + do_ram_command(RAM_COMMAND_NORMAL, 0, row_offset); udelay(1);
PRINT_DEBUG("Northbridge following SDRAM init:\r\n");
Modified: trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.h =================================================================== --- trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.h 2008-11-20 20:07:38 UTC (rev 3763) +++ trunk/coreboot-v2/src/northbridge/intel/i82810/raminit.h 2008-11-20 23:18:10 UTC (rev 3764) @@ -24,10 +24,8 @@ /* The 82810 supports max. 2 dual-sided DIMMs. */ #define DIMM_SOCKETS 2
-struct mem_controller { - device_t d0; - uint16_t channel0[DIMM_SOCKETS]; -}; +/* DIMM0 is at 0x50, DIMM1 is at 0x51. */ +#define DIMM_SPD_BASE 0x50
/* The following table has been bumped over to this header to avoid clutter in * raminit.c. It's used to translate the value read from SPD Byte 31 to a value