Eric Biederman | 66fe222 | 2003-07-04 15:14:04 +0000 | [diff] [blame] | 1 | |
| 2 | static void spd_enable_refresh(void) |
| 3 | { |
| 4 | /* |
| 5 | * Effects: Uses serial presence detect to set the |
| 6 | * refresh rate in the DRAMC register. |
| 7 | * see spd_set_dramc for the other values. |
| 8 | * FIXME: Check for illegal/unsupported ram configurations and abort |
| 9 | */ |
| 10 | static const unsigned char refresh_rates[] = { |
| 11 | 0x01, /* Normal 15.625 us -> 15.6 us */ |
| 12 | 0x05, /* Reduced(.25X) 3.9 us -> 7.8 us */ |
| 13 | 0x05, /* Reduced(.5X) 7.8 us -> 7.8 us */ |
| 14 | 0x02, /* Extended(2x) 31.3 us -> 31.2 us */ |
| 15 | 0x03, /* Extended(4x) 62.5 us -> 62.4 us */ |
| 16 | 0x04, /* Extended(8x) 125 us -> 124.8 us */ |
| 17 | }; |
| 18 | /* Find the first dimm and assume the rest are the same */ |
| 19 | int byte; |
| 20 | unsigned device; |
| 21 | unsigned refresh_rate; |
| 22 | byte = -1; |
| 23 | device = 0x50; |
| 24 | while ((byte < 0) && (device <= 0x57)) { |
| 25 | byte = __builtin_inl(device); |
| 26 | device += 1; |
| 27 | } |
| 28 | if (byte < 0) { |
| 29 | /* We couldn't find anything we must have no memory */ |
| 30 | while(1); |
| 31 | } |
| 32 | byte &= 0x7f; |
| 33 | /* Default refresh rate be conservative */ |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 34 | refresh_rate = 5; |
Eric Biederman | 66fe222 | 2003-07-04 15:14:04 +0000 | [diff] [blame] | 35 | /* see if the ram refresh is a supported one */ |
| 36 | if (byte < 6) { |
| 37 | refresh_rate = refresh_rates[byte]; |
| 38 | } |
| 39 | byte = __builtin_inb(0x57); |
| 40 | byte &= 0xf8; |
| 41 | byte |= refresh_rate; |
| 42 | __builtin_outb(byte, 0x57); |
| 43 | } |