Author: rminnich
Date: 2007-11-27 19:17:59 +0100 (Tue, 27 Nov 2007)
New Revision: 528

Modified:
   LinuxBIOSv3/northbridge/amd/geodelx/raminit.c
Log:
move smbus_read to spd_read_byte. Add debug prints. These debug prints
and hcf may move to a common library later. 

Signed-off-by: Ronald G. Minnich <[EMAIL PROTECTED]>

Acked-by: Marc Jones <[EMAIL PROTECTED]>


Modified: LinuxBIOSv3/northbridge/amd/geodelx/raminit.c
===================================================================
--- LinuxBIOSv3/northbridge/amd/geodelx/raminit.c       2007-11-27 16:47:34 UTC 
(rev 527)
+++ LinuxBIOSv3/northbridge/amd/geodelx/raminit.c       2007-11-27 18:17:59 UTC 
(rev 528)
@@ -33,7 +33,40 @@
        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
 };
 
+u8 spd_read_byte(u16 device, u8 address);
+
 /**
+ * Print a nice banner so we know what step we died on. 
+ *
+ * @param s String to put in the middle of the banner
+ */
+
+void banner(char *s)
+{
+       printk(BIOS_DEBUG, "===========================");
+       printk(BIOS_DEBUG, s);
+       printk(BIOS_DEBUG, "======================================\n");
+}
+
+/**
+ * Halt and Catch Fire. Print an error, then loop, sending NULLs on serial 
port, 
+ * to ensure the message is visible. 
+ *
+ */
+
+void hcf(void)
+{
+       printk(BIOS_EMERG, "DIE\r\n");
+       /* this guarantees we flush the UART fifos (if any) and also 
+        * ensures that things, in general, keep going so no debug output 
+        * is lost
+        */
+       while (1)
+               printk(BIOS_EMERG, "\r");
+}
+
+
+/**
  * Auto-detect, using SPD, the DIMM size. It's the usual magic, with
  * all the usual failure points that can happen.
  *
@@ -50,11 +83,15 @@
 
        dimm_setting = 0;
 
+       banner("Check present");
        /* Check that we have a DIMM. */
-       if (smbus_read_byte(dimm, SPD_MEMORY_TYPE) == 0xFF)
+       if (spd_read_byte(dimm, SPD_MEMORY_TYPE) == 0xFF)
                return;
 
-       spd_byte = smbus_read_byte(dimm, SPD_NUM_DIMM_BANKS);
+       /* Field: Module Banks per DIMM */
+       /* EEPROM byte usage: (5) Number of DIMM Banks */
+       banner("MODBANKS");
+       spd_byte = spd_read_byte(dimm, SPD_NUM_DIMM_BANKS);
        if ((MIN_MOD_BANKS > spd_byte) && (spd_byte > MAX_MOD_BANKS)) {
                printk(BIOS_EMERG, "Number of module banks not compatible\n");
                post_code(ERROR_BANK_SET);
@@ -62,7 +99,10 @@
        }
        dimm_setting |= (spd_byte >> 1) << CF07_UPPER_D0_MB_SHIFT;
 
-       spd_byte = smbus_read_byte(dimm, SPD_NUM_BANKS_PER_SDRAM);
+       /* Field: Banks per SDRAM device */
+       /* EEPROM byte usage: (17) Number of Banks on SDRAM Device */
+       banner("FIELDBANKS");
+       spd_byte = spd_read_byte(dimm, SPD_NUM_BANKS_PER_SDRAM);
        if ((MIN_DEV_BANKS > spd_byte) && (spd_byte > MAX_DEV_BANKS)) {
                printk(BIOS_EMERG, "Number of device banks not compatible\n");
                post_code(ERROR_BANK_SET);
@@ -70,15 +110,25 @@
        }
        dimm_setting |= (spd_byte >> 2) << CF07_UPPER_D0_CB_SHIFT;
 
-       if ((smbus_read_byte(dimm, SPD_NUM_ROWS) & 0xF0)
-           || (smbus_read_byte(dimm, SPD_NUM_COLUMNS) & 0xF0)) {
+       /*; Field: DIMM size
+        *; EEPROM byte usage: (3)  Number of Row Addresses
+        *;                                       (4)  Number of Column 
Addresses
+        *;                                       (5)  Number of DIMM Banks
+        *;                                       (31) Module Bank Density
+        *; Size = Module Density * Module Banks
+        */
+       banner("SPDNUMROWS");
+
+       if ((spd_read_byte(dimm, SPD_NUM_ROWS) & 0xF0)
+           || (spd_read_byte(dimm, SPD_NUM_COLUMNS) & 0xF0)) {
                printk(BIOS_EMERG, "Asymmetric DIMM not compatible\n");
                post_code(ERROR_UNSUPPORTED_DIMM);
                hlt();
        }
 
        /* Size = Module Density * Module Banks */
-       dimm_size = smbus_read_byte(dimm, SPD_BANK_DENSITY);
+       banner("SPDBANKDENSITY");
+       dimm_size = spd_read_byte(dimm, SPD_BANK_DENSITY);
 
        /* Align so 1 GB (bit 0) is bit 8. This is a little weird to get gcc
         * to not optimize this out.
@@ -93,7 +143,9 @@
        /* Module Density * Module Banks */
        /* Shift to multiply by the number of DIMM banks. */
        dimm_size <<= (dimm_setting >> CF07_UPPER_D0_MB_SHIFT) & 1;
+       banner("BEFORT CTZ");
        dimm_size = __builtin_ctz(dimm_size);
+       banner("TEST DIMM SIZE>8");
        if (dimm_size > 8) {    /* 8 is 1 GB only support 1 GB per DIMM */
                printk(BIOS_EMERG, "Only support up to 1 GB per DIMM\n");
                post_code(ERROR_DENSITY_DIMM);
@@ -125,8 +177,9 @@
         * example, #col_addr_bits = 7 (06h), it adds 3 to get 10, then does
         * 2^10=1K. Get it?
         */
-
-       spd_byte = num_col_addr[smbus_read_byte(dimm, SPD_NUM_COLUMNS) & 0xF];
+       banner("PAGESIZE");
+       spd_byte = num_col_addr[spd_read_byte(dimm, SPD_NUM_COLUMNS) & 0xF];
+       banner("MAXCOLADDR");
        if (spd_byte > MAX_COL_ADDR) {
                printk(BIOS_EMERG, "DIMM page size not compatible\n");
                post_code(ERROR_SET_PAGE);
@@ -140,7 +193,9 @@
        /* 0 = 1k, 1 = 2k, 2 = 4k, etc. */
        dimm_setting |= spd_byte << CF07_UPPER_D0_PSZ_SHIFT;
 
+       banner("RDMSR CF07");
        msr = rdmsr(MC_CF07_DATA);
+       banner("WRMSR CF07");
        if (dimm == dimm0) {
                msr.hi &= 0xFFFF0000;
                msr.hi |= dimm_setting;
@@ -148,6 +203,7 @@
                msr.hi &= 0x0000FFFF;
                msr.hi |= dimm_setting << 16;
        }
+       banner("ALL DONE");
        wrmsr(MC_CF07_DATA, msr);
 }
 
@@ -166,10 +222,10 @@
        u16 speed;
 
        /* PC133 identifier */
-       spd_byte0 = smbus_read_byte(dimm0, SPD_MIN_CYCLE_TIME_AT_CAS_MAX);
+       spd_byte0 = spd_read_byte(dimm0, SPD_MIN_CYCLE_TIME_AT_CAS_MAX);
        if (spd_byte0 == 0xFF)
                spd_byte0 = 0;
-       spd_byte1 = smbus_read_byte(dimm1, SPD_MIN_CYCLE_TIME_AT_CAS_MAX);
+       spd_byte1 = spd_read_byte(dimm1, SPD_MIN_CYCLE_TIME_AT_CAS_MAX);
        if (spd_byte1 == 0xFF)
                spd_byte1 = 0;
 
@@ -213,13 +269,13 @@
        u16 rate0, rate1;
        struct msr msr;
 
-       spd_byte0 = smbus_read_byte(dimm0, SPD_REFRESH);
+       spd_byte0 = spd_read_byte(dimm0, SPD_REFRESH);
        spd_byte0 &= 0xF;
        if (spd_byte0 > 5)
                spd_byte0 = 5;
        rate0 = REFRESH_RATE[spd_byte0];
 
-       spd_byte1 = smbus_read_byte(dimm1, SPD_REFRESH);
+       spd_byte1 = spd_read_byte(dimm1, SPD_REFRESH);
        spd_byte1 &= 0xF;
        if (spd_byte1 > 5)
                spd_byte1 = 5;
@@ -268,11 +324,11 @@
        glspeed = geode_link_speed();
 
        /* DIMM 0 */
-       casmap0 = smbus_read_byte(dimm0, SPD_ACCEPTABLE_CAS_LATENCIES);
+       casmap0 = spd_read_byte(dimm0, SPD_ACCEPTABLE_CAS_LATENCIES);
        if (casmap0 != 0xFF) {
                /* If -.5 timing is supported, check -.5 timing > GeodeLink. */
                /* EEPROM byte usage: (23) SDRAM Minimum Clock Cycle Time @ CLX 
-.5 */
-               spd_byte = smbus_read_byte(dimm0, SPD_SDRAM_CYCLE_TIME_2ND);
+               spd_byte = spd_read_byte(dimm0, SPD_SDRAM_CYCLE_TIME_2ND);
                if (spd_byte != 0) {
                        /* Turn SPD ns time into MHz. Check what the asm does
                         * to this math.
@@ -282,7 +338,7 @@
                        if (dimm_speed >= glspeed) {
                                /* If -1 timing is supported, check -1 timing > 
GeodeLink. */
                                /* EEPROM byte usage: (25) SDRAM Minimum Clock 
Cycle Time @ CLX -1 */
-                               spd_byte = smbus_read_byte(dimm0, 
SPD_SDRAM_CYCLE_TIME_3RD);
+                               spd_byte = spd_read_byte(dimm0, 
SPD_SDRAM_CYCLE_TIME_3RD);
                                if (spd_byte != 0) {
                                        /* Turn SPD ns time into MHz. Check 
what the asm does to this math. */
                                        dimm_speed = 2 * (10000 / (((spd_byte 
>> 4) * 10) + (spd_byte & 0x0F)));
@@ -305,18 +361,18 @@
        }
 
        /* DIMM 1 */
-       casmap1 = smbus_read_byte(dimm1, SPD_ACCEPTABLE_CAS_LATENCIES);
+       casmap1 = spd_read_byte(dimm1, SPD_ACCEPTABLE_CAS_LATENCIES);
        if (casmap1 != 0xFF) {
                /* If -.5 timing is supported, check -.5 timing > GeodeLink. */
                /* EEPROM byte usage: (23) SDRAM Minimum Clock Cycle Time @ CLX 
-.5 */
-               spd_byte = smbus_read_byte(dimm1, SPD_SDRAM_CYCLE_TIME_2ND);
+               spd_byte = spd_read_byte(dimm1, SPD_SDRAM_CYCLE_TIME_2ND);
                if (spd_byte != 0) {
                        /* Turn SPD ns time into MHz. Check what the asm does 
to this math. */
                        dimm_speed = 2 * (10000 / (((spd_byte >> 4) * 10) + 
(spd_byte & 0x0F)));
                        if (dimm_speed >= glspeed) {
                                /* If -1 timing is supported, check -1 timing > 
GeodeLink. */
                                /* EEPROM byte usage: (25) SDRAM Minimum Clock 
Cycle Time @ CLX -1 */
-                               spd_byte = smbus_read_byte(dimm1, 
SPD_SDRAM_CYCLE_TIME_3RD);
+                               spd_byte = spd_read_byte(dimm1, 
SPD_SDRAM_CYCLE_TIME_3RD);
                                if (spd_byte != 0) {
                                        /* Turn SPD ns time into MHz. Check 
what the asm does to this math. */
                                        dimm_speed = 2 * (10000 / (((spd_byte 
>> 4) * 10) + (spd_byte & 0x0F)));
@@ -359,10 +415,10 @@
 
 static inline void helper_spd(u8 dimm0, u8 dimm1, u8 addr, u8 *spd0, u8 *spd1)
 {
-       *spd0 = smbus_read_byte(dimm0, addr);
+       *spd0 = spd_read_byte(dimm0, addr);
        if (*spd0 == 0xFF)
                *spd0 = 0;
-       *spd1 = smbus_read_byte(dimm1, addr);
+       *spd1 = spd_read_byte(dimm1, addr);
        if (*spd1 == 0xFF)
                *spd1 = 0;
        if (*spd0 < *spd1)
@@ -477,10 +533,10 @@
        u8 spd_byte0, spd_byte1;
        struct msr msr;
 
-       spd_byte0 = smbus_read_byte(dimm0, SPD_DEVICE_ATTRIBUTES_GENERAL);
+       spd_byte0 = spd_read_byte(dimm0, SPD_DEVICE_ATTRIBUTES_GENERAL);
        if (spd_byte0 == 0xFF)
                spd_byte0 = 0;
-       spd_byte1 = smbus_read_byte(dimm1, SPD_DEVICE_ATTRIBUTES_GENERAL);
+       spd_byte1 = spd_read_byte(dimm1, SPD_DEVICE_ATTRIBUTES_GENERAL);
        if (spd_byte1 == 0xFF)
                spd_byte1 = 0;
        spd_byte1 &= spd_byte0;
@@ -558,7 +614,7 @@
 
        post_code(POST_MEM_SETUP);
 
-       spd_byte = smbus_read_byte(dimm0, SPD_MODULE_ATTRIBUTES);
+       spd_byte = spd_read_byte(dimm0, SPD_MODULE_ATTRIBUTES);
 
        /* Check DIMM is not Registered and not Buffered DIMMs. */
        if ((spd_byte != 0xFF) && (spd_byte & 3)) {
@@ -566,7 +622,7 @@
                post_code(ERROR_UNSUPPORTED_DIMM);
                hlt();
        }
-       spd_byte = smbus_read_byte(dimm1, SPD_MODULE_ATTRIBUTES);
+       spd_byte = spd_read_byte(dimm1, SPD_MODULE_ATTRIBUTES);
        if ((spd_byte != 0xFF) && (spd_byte & 3)) {
                printk(BIOS_EMERG, "DIMM 1 NOT COMPATIBLE!\n");
                post_code(ERROR_UNSUPPORTED_DIMM);


-- 
linuxbios mailing list
linuxbios@linuxbios.org
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to