1 #include <cpu/x86/mtrr.h>
5 This software and ancillary information (herein called SOFTWARE )
6 called LinuxBIOS is made available under the terms described
7 here. The SOFTWARE has been approved for release with associated
8 LA-CC Number 00-34 . Unless otherwise indicated, this SOFTWARE has
9 been authored by an employee or employees of the University of
10 California, operator of the Los Alamos National Laboratory under
11 Contract No. W-7405-ENG-36 with the U.S. Department of Energy. The
12 U.S. Government has rights to use, reproduce, and distribute this
13 SOFTWARE. The public may copy, distribute, prepare derivative works
14 and publicly display this SOFTWARE without charge, provided that this
15 Notice and any statement of authorship are reproduced on all copies.
16 Neither the Government nor the University makes any warranty, express
17 or implied, or assumes any liability or responsibility for the use of
18 this SOFTWARE. If SOFTWARE is modified to produce derivative works,
19 such modified SOFTWARE should be clearly marked, so as not to confuse
20 it with the version available from LANL.
22 /* Copyright 2000, Ron Minnich, Advanced Computing Lab, LANL
26 * 11/26/02 - kevinh@ispiri.com - The existing comments implied that
27 * this didn't work yet. Therefore, I've updated it so that it works
28 * correctly - at least on my VIA epia motherboard. 64MB DIMM in slot 0.
31 /* Added automatic detection of first equipped bank and its MA mapping type.
32 * (Rest of configuration is done in C)
33 * 5/19/03 by SONE Takeshi <ts1@tsn.or.jp>
35 /* converted to C 9/2003 Ron Minnich */
37 /* Set to 1 if your DIMMs are PC133 Note that I'm assuming CPU's FSB
38 * frequency is 133MHz. If your CPU runs at another bus speed, you
39 * might need to change some of register values.
45 // Set to 1 if your DIMMs are CL=2
50 static void dimms_read(unsigned long x)
54 volatile unsigned long y;
56 for (c = 0; c < 6; c++) {
57 y = *(volatile unsigned long *) eax;
62 static void dimms_write(int x)
65 unsigned long eax = x;
66 for (c = 0; c < 6; c++) {
67 *(volatile unsigned long *) eax = 0;
72 #ifdef CONFIG_DEBUG_RAM_SETUP
73 static void dumpnorth(device_t north)
76 for (r = 0;; r += 16) {
79 for (c = 0; c < 16; c++) {
80 print_debug_hex8(pci_read_config8(north, r + c));
90 static void sdram_set_registers(const struct mem_controller *ctrl)
92 device_t north = (device_t) PCI_DEV(0, 0, 0);
94 print_err("vt8601 init starting\n");
95 print_debug_hex32(north);
96 print_debug(" is the north\n");
97 print_debug_hex16(pci_read_config16(north, 0));
99 print_debug_hex16(pci_read_config16(north, 2));
102 /* All we are doing now is setting initial known-good values that will
103 * be revised later as we read SPD
106 // memory clk enable. We are not using ECC
107 pci_write_config8(north, 0x78, 0x01);
108 print_debug_hex8(pci_read_config8(north, 0x78));
110 // dram control, see the book.
112 pci_write_config8(north, 0x68, 0x52);
114 pci_write_config8(north, 0x68, 0x42);
117 // dram control, see the book.
118 pci_write_config8(north, 0x6B, 0x0c);
120 // Initial setting, 256MB in each bank, will be rewritten later.
121 pci_write_config8(north, 0x5A, 0x20);
122 print_debug_hex8(pci_read_config8(north, 0x5a));
123 pci_write_config8(north, 0x5B, 0x40);
124 pci_write_config8(north, 0x5C, 0x60);
125 pci_write_config8(north, 0x5D, 0x80);
126 pci_write_config8(north, 0x5E, 0xA0);
127 pci_write_config8(north, 0x5F, 0xC0);
128 // It seems we have to take care of these 2 registers as if
129 // they are bank 6 and 7.
130 pci_write_config8(north, 0x56, 0xC0);
131 pci_write_config8(north, 0x57, 0xC0);
133 // SDRAM in all banks
134 pci_write_config8(north, 0x60, 0x3F);
136 // DRAM timing. I'm suspicious of this
137 // This is for all banks, 64 is 0,1. 65 is 2,3. 66 is 4,5.
138 // ras precharge 4T, RAS pulse 5T
139 // cas2 is 0xd6, cas3 is 0xe6
140 // we're also backing off write pulse width to 2T, so result is 0xee
142 pci_write_config8(north, 0x64, 0xd4);
143 pci_write_config8(north, 0x65, 0xd4);
144 pci_write_config8(north, 0x66, 0xd4);
146 pci_write_config8(north, 0x64, 0xe4);
147 pci_write_config8(north, 0x65, 0xe4);
148 pci_write_config8(north, 0x66, 0xe4);
151 // dram frequency select.
152 // enable 4K pages for 64M dram.
154 pci_write_config8(north, 0x69, 0x3c);
156 pci_write_config8(north, 0x69, 0xac);
159 /* IMPORTANT -- disable refresh counter */
160 // refresh counter, disabled.
161 pci_write_config8(north, 0x6A, 0x00);
163 // clkenable configuration. kevinh FIXME - add precharge
164 pci_write_config8(north, 0x6C, 0x00);
165 // dram read latch delay of 1 ns, MD drive 8 mA,
166 // high drive strength on MA[2: 13], we#, cas#, ras#
167 // As per Cindy Lee, set to 0x37, not 0x57
168 pci_write_config8(north, 0x6D, 0x7f);
171 /* slot is the dram slot. Return size of side0 in lower 16-bit,
172 * side1 in upper 16-bit, in units of 8MB */
173 static unsigned long spd_module_size(unsigned char slot)
175 /* for all the DRAMS, see if they are there and get the size of each
176 * module. This is just a very early first cut at sizing.
178 /* we may run out of registers ... */
179 unsigned int banks, rows, cols;
180 unsigned int value = 0;
181 /* unsigned int module = ((0x50 + slot) << 1) + 1; */
182 unsigned int module = 0x50 + slot;
184 /* is the module there? if byte 2 is not 4, then we'll assume it
188 print_info_hex8(slot);
189 if (smbus_read_byte(module, 2) != 4) {
190 print_info(" is empty\n");
193 print_info(" is SDRAM ");
195 banks = smbus_read_byte(module, 17);
197 /* we're going to assume symmetric banks. Sorry. */
198 cols = smbus_read_byte(module, 4) & 0xf;
199 rows = smbus_read_byte(module, 3) & 0xf;
201 /* grand total. You have rows+cols addressing, * times of banks, times
202 * width of data in bytes */
203 /* Width is assumed to be 64 bits == 8 bytes */
204 value = (1 << (cols + rows));
206 print_info_hex32(value);
207 print_info(" bytes ");
208 /* Return in 8MB units */
211 /* We should have single or double side */
212 if (smbus_read_byte(module, 5) == 2) {
214 value = (value << 16) | value;
221 static int spd_num_chips(unsigned char slot)
223 unsigned int module = 0x50 + slot;
226 width = smbus_read_byte(module, 13);
233 static void sdram_set_spd_registers(const struct mem_controller *ctrl)
236 unsigned char Trp = 1, Tras = 1, casl = 2, val;
237 unsigned char timing = 0xe4;
239 val = smbus_read_byte(0x50, 27);
242 val = smbus_read_byte(0x50, 30);
245 val = smbus_read_byte(0x50, 18);
251 val = (Trp << 7) | (Tras << 6) | (casl << 4) | 4;
253 print_debug_hex8(val);
254 print_debug(" is the computed timing\n");
255 /* don't set it. Experience shows that this screwy chipset should just
256 * be run with the most conservative timing.
257 * pci_write_config8(0, 0x64, val);
261 static void set_ma_mapping(device_t north, int slot, int type)
263 unsigned char reg, val;
266 reg = 0x58 + slot / 2;
272 val = pci_read_config8(north, reg);
273 val &= ~(0xf << shift);
274 val |= type << shift;
275 pci_write_config8(north, reg, val);
279 static void sdram_enable(int controllers, const struct mem_controller *ctrl)
281 static const uint8_t ramregs[] = {
282 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x56, 0x57
285 uint32_t size, base, slot, ma;
286 /* begin to initialize */
288 // I forget why we need this, but we do
289 dimms_write(0xa55a5aa5);
292 pci_write_config8(north, 0x6C, 0x01);
293 print_debug("NOP\n");
295 // You need to do the memory reference. That causes the nop cycle.
298 print_debug("PRECHARGE\n");
300 pci_write_config8(north, 0x6C, 0x02);
301 print_debug("DUMMY READS\n");
305 print_debug("CBR\n");
307 pci_write_config8(north, 0x6C, 0x04);
309 /* do 8 reads and wait >100us between each - from via */
326 print_debug("MRS\n");
328 pci_write_config8(north, 0x6c, 0x03);
335 print_debug("NORMAL\n");
336 /* set to normal mode */
337 pci_write_config8(north, 0x6C, 0x08);
339 dimms_write(0x55aa55aa);
342 print_debug("set ref. rate\n");
343 // Set the refresh rate.
345 pci_write_config8(north, 0x6A, 0x86);
347 pci_write_config8(north, 0x6A, 0x65);
349 print_debug("enable multi-page open\n");
350 // enable multi-page open
351 pci_write_config8(north, 0x6B, 0x0d);
354 for (slot = 0; slot < 4; slot++) {
355 size = spd_module_size(slot);
357 base += size & 0xffff;
358 pci_write_config8(north, ramregs[2 * slot], base);
363 pci_write_config8(north, ramregs[2 * slot + 1], base);
368 /* Read the row densities */
369 size = smbus_read_byte(0x50+slot, 0x1f);
371 /* Set the MA map type.
373 * 0xa should be another option, but when
374 * it would be used is unknown.
377 if (size < 16 ) /* less than 64 MB per side */
379 else if (size < 32) /* less than 128MB per side */
381 else if ( size < 64) /* less than 256MB per side */
383 else /* 256MB or more per side */
385 print_debug_hex16(ma);
386 print_debug(" is the MA type\n");
387 set_ma_mapping(north, slot, ma);
389 print_err("vt8601 done\n");