static void spd_enable_refresh(void) { /* * Effects: Uses serial presence detect to set the * refresh rate in the DRAMC register. * see spd_set_dramc for the other values. * FIXME: Check for illegal/unsupported ram configurations and abort */ static const unsigned char refresh_rates[] = { 0x01, /* Normal 15.625 us -> 15.6 us */ 0x05, /* Reduced(.25X) 3.9 us -> 7.8 us */ 0x05, /* Reduced(.5X) 7.8 us -> 7.8 us */ 0x02, /* Extended(2x) 31.3 us -> 31.2 us */ 0x03, /* Extended(4x) 62.5 us -> 62.4 us */ 0x04, /* Extended(8x) 125 us -> 124.8 us */ }; /* Find the first dimm and assume the rest are the same */ int byte; unsigned device; unsigned refresh_rate; byte = -1; device = 0x50; while ((byte < 0) && (device <= 0x57)) { byte = __builtin_inl(device); device += 1; } if (byte < 0) { /* We couldn't find anything we must have no memory */ while(1); } byte &= 0x7f; /* Default refresh rate be conservative */ refresh_rate = 5; /* see if the ram refresh is a supported one */ if (byte < 6) { refresh_rate = refresh_rates[byte]; } byte = __builtin_inb(0x57); byte &= 0xf8; byte |= refresh_rate; __builtin_outb(byte, 0x57); }