common: Drop linux/delay.h from common header
[oweals/u-boot.git] / arch / powerpc / cpu / mpc83xx / spd_sdram.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2006-2007 Freescale Semiconductor, Inc.
4  *
5  * (C) Copyright 2006
6  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7  *
8  * Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
9  * (C) Copyright 2003 Motorola Inc.
10  * Xianghua Xiao (X.Xiao@motorola.com)
11  */
12
13 #ifndef CONFIG_MPC83XX_SDRAM
14
15 #include <common.h>
16 #include <cpu_func.h>
17 #include <log.h>
18 #include <time.h>
19 #include <vsprintf.h>
20 #include <asm/processor.h>
21 #include <asm/io.h>
22 #include <i2c.h>
23 #include <spd.h>
24 #include <asm/mmu.h>
25 #include <spd_sdram.h>
26 #include <linux/delay.h>
27
28 DECLARE_GLOBAL_DATA_PTR;
29
30 void board_add_ram_info(int use_default)
31 {
32         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
33         volatile ddr83xx_t *ddr = &immap->ddr;
34         char buf[32];
35
36         printf(" (DDR%d", ((ddr->sdram_cfg & SDRAM_CFG_SDRAM_TYPE_MASK)
37                            >> SDRAM_CFG_SDRAM_TYPE_SHIFT) - 1);
38
39 #if defined(CONFIG_ARCH_MPC8308) || defined(CONFIG_ARCH_MPC831X)
40         if ((ddr->sdram_cfg & SDRAM_CFG_DBW_MASK) == SDRAM_CFG_DBW_16)
41                 puts(", 16-bit");
42         else if ((ddr->sdram_cfg & SDRAM_CFG_DBW_MASK) == SDRAM_CFG_DBW_32)
43                 puts(", 32-bit");
44         else
45                 puts(", unknown width");
46 #else
47         if (ddr->sdram_cfg & SDRAM_CFG_32_BE)
48                 puts(", 32-bit");
49         else
50                 puts(", 64-bit");
51 #endif
52
53         if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN)
54                 puts(", ECC on");
55         else
56                 puts(", ECC off");
57
58         printf(", %s MHz)", strmhz(buf, gd->mem_clk));
59
60 #if defined(CONFIG_SYS_LB_SDRAM) && defined(CONFIG_SYS_LBC_SDRAM_SIZE)
61         puts("\nSDRAM: ");
62         print_size (CONFIG_SYS_LBC_SDRAM_SIZE * 1024 * 1024, " (local bus)");
63 #endif
64 }
65
66 #ifdef CONFIG_SPD_EEPROM
67 #ifndef CONFIG_SYS_READ_SPD
68 #define CONFIG_SYS_READ_SPD     i2c_read
69 #endif
70 #ifndef SPD_EEPROM_OFFSET
71 #define SPD_EEPROM_OFFSET       0
72 #endif
73 #ifndef SPD_EEPROM_ADDR_LEN
74 #define SPD_EEPROM_ADDR_LEN     1
75 #endif
76
77 /*
78  * Convert picoseconds into clock cycles (rounding up if needed).
79  */
80 int
81 picos_to_clk(int picos)
82 {
83         unsigned int mem_bus_clk;
84         int clks;
85
86         mem_bus_clk = gd->mem_clk >> 1;
87         clks = picos / (1000000000 / (mem_bus_clk / 1000));
88         if (picos % (1000000000 / (mem_bus_clk / 1000)) != 0)
89                 clks++;
90
91         return clks;
92 }
93
94 unsigned int banksize(unsigned char row_dens)
95 {
96         return ((row_dens >> 2) | ((row_dens & 3) << 6)) << 24;
97 }
98
99 int read_spd(uint addr)
100 {
101         return ((int) addr);
102 }
103
104 #undef SPD_DEBUG
105 #ifdef SPD_DEBUG
106 static void spd_debug(spd_eeprom_t *spd)
107 {
108         printf ("\nDIMM type:       %-18.18s\n", spd->mpart);
109         printf ("SPD size:        %d\n", spd->info_size);
110         printf ("EEPROM size:     %d\n", 1 << spd->chip_size);
111         printf ("Memory type:     %d\n", spd->mem_type);
112         printf ("Row addr:        %d\n", spd->nrow_addr);
113         printf ("Column addr:     %d\n", spd->ncol_addr);
114         printf ("# of rows:       %d\n", spd->nrows);
115         printf ("Row density:     %d\n", spd->row_dens);
116         printf ("# of banks:      %d\n", spd->nbanks);
117         printf ("Data width:      %d\n",
118                         256 * spd->dataw_msb + spd->dataw_lsb);
119         printf ("Chip width:      %d\n", spd->primw);
120         printf ("Refresh rate:    %02X\n", spd->refresh);
121         printf ("CAS latencies:   %02X\n", spd->cas_lat);
122         printf ("Write latencies: %02X\n", spd->write_lat);
123         printf ("tRP:             %d\n", spd->trp);
124         printf ("tRCD:            %d\n", spd->trcd);
125         printf ("\n");
126 }
127 #endif /* SPD_DEBUG */
128
129 long int spd_sdram()
130 {
131         volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
132         volatile ddr83xx_t *ddr = &immap->ddr;
133         volatile law83xx_t *ecm = &immap->sysconf.ddrlaw[0];
134         spd_eeprom_t spd;
135         unsigned int n_ranks;
136         unsigned int odt_rd_cfg, odt_wr_cfg;
137         unsigned char twr_clk, twtr_clk;
138         unsigned int sdram_type;
139         unsigned int memsize;
140         unsigned int law_size;
141         unsigned char caslat, caslat_ctrl;
142         unsigned int trfc, trfc_clk, trfc_low;
143         unsigned int trcd_clk, trtp_clk;
144         unsigned char cke_min_clk;
145         unsigned char add_lat, wr_lat;
146         unsigned char wr_data_delay;
147         unsigned char four_act;
148         unsigned char cpo;
149         unsigned char burstlen;
150         unsigned char odt_cfg, mode_odt_enable;
151         unsigned int max_bus_clk;
152         unsigned int max_data_rate, effective_data_rate;
153         unsigned int ddrc_clk;
154         unsigned int refresh_clk;
155         unsigned int sdram_cfg;
156         unsigned int ddrc_ecc_enable;
157         unsigned int pvr = get_pvr();
158
159         /*
160          * First disable the memory controller (could be enabled
161          * by the debugger)
162          */
163         clrsetbits_be32(&ddr->sdram_cfg, SDRAM_CFG_MEM_EN, 0);
164         sync();
165         isync();
166
167         /* Read SPD parameters with I2C */
168         CONFIG_SYS_READ_SPD(SPD_EEPROM_ADDRESS, SPD_EEPROM_OFFSET,
169                 SPD_EEPROM_ADDR_LEN, (uchar *) &spd, sizeof(spd));
170 #ifdef SPD_DEBUG
171         spd_debug(&spd);
172 #endif
173         /* Check the memory type */
174         if (spd.mem_type != SPD_MEMTYPE_DDR && spd.mem_type != SPD_MEMTYPE_DDR2) {
175                 debug("DDR: Module mem type is %02X\n", spd.mem_type);
176                 return 0;
177         }
178
179         /* Check the number of physical bank */
180         if (spd.mem_type == SPD_MEMTYPE_DDR) {
181                 n_ranks = spd.nrows;
182         } else {
183                 n_ranks = (spd.nrows & 0x7) + 1;
184         }
185
186         if (n_ranks > 2) {
187                 printf("DDR: The number of physical bank is %02X\n", n_ranks);
188                 return 0;
189         }
190
191         /* Check if the number of row of the module is in the range of DDRC */
192         if (spd.nrow_addr < 12 || spd.nrow_addr > 15) {
193                 printf("DDR: Row number is out of range of DDRC, row=%02X\n",
194                                                          spd.nrow_addr);
195                 return 0;
196         }
197
198         /* Check if the number of col of the module is in the range of DDRC */
199         if (spd.ncol_addr < 8 || spd.ncol_addr > 11) {
200                 printf("DDR: Col number is out of range of DDRC, col=%02X\n",
201                                                          spd.ncol_addr);
202                 return 0;
203         }
204
205 #ifdef CONFIG_SYS_DDRCDR_VALUE
206         /*
207          * Adjust DDR II IO voltage biasing.  It just makes it work.
208          */
209         if(spd.mem_type == SPD_MEMTYPE_DDR2) {
210                 immap->sysconf.ddrcdr = CONFIG_SYS_DDRCDR_VALUE;
211         }
212         udelay(50000);
213 #endif
214
215         /*
216          * ODT configuration recommendation from DDR Controller Chapter.
217          */
218         odt_rd_cfg = 0;                 /* Never assert ODT */
219         odt_wr_cfg = 0;                 /* Never assert ODT */
220         if (spd.mem_type == SPD_MEMTYPE_DDR2) {
221                 odt_wr_cfg = 1;         /* Assert ODT on writes to CSn */
222         }
223
224         /* Setup DDR chip select register */
225 #ifdef CONFIG_SYS_83XX_DDR_USES_CS0
226         ddr->csbnds[0].csbnds = (banksize(spd.row_dens) >> 24) - 1;
227         ddr->cs_config[0] = ( 1 << 31
228                             | (odt_rd_cfg << 20)
229                             | (odt_wr_cfg << 16)
230                             | ((spd.nbanks == 8 ? 1 : 0) << 14)
231                             | ((spd.nrow_addr - 12) << 8)
232                             | (spd.ncol_addr - 8) );
233         debug("\n");
234         debug("cs0_bnds = 0x%08x\n",ddr->csbnds[0].csbnds);
235         debug("cs0_config = 0x%08x\n",ddr->cs_config[0]);
236
237         if (n_ranks == 2) {
238                 ddr->csbnds[1].csbnds = ( (banksize(spd.row_dens) >> 8)
239                                   | ((banksize(spd.row_dens) >> 23) - 1) );
240                 ddr->cs_config[1] = ( 1<<31
241                                     | (odt_rd_cfg << 20)
242                                     | (odt_wr_cfg << 16)
243                                     | ((spd.nbanks == 8 ? 1 : 0) << 14)
244                                     | ((spd.nrow_addr - 12) << 8)
245                                     | (spd.ncol_addr - 8) );
246                 debug("cs1_bnds = 0x%08x\n",ddr->csbnds[1].csbnds);
247                 debug("cs1_config = 0x%08x\n",ddr->cs_config[1]);
248         }
249
250 #else
251         ddr->csbnds[2].csbnds = (banksize(spd.row_dens) >> 24) - 1;
252         ddr->cs_config[2] = ( 1 << 31
253                             | (odt_rd_cfg << 20)
254                             | (odt_wr_cfg << 16)
255                             | ((spd.nbanks == 8 ? 1 : 0) << 14)
256                             | ((spd.nrow_addr - 12) << 8)
257                             | (spd.ncol_addr - 8) );
258         debug("\n");
259         debug("cs2_bnds = 0x%08x\n",ddr->csbnds[2].csbnds);
260         debug("cs2_config = 0x%08x\n",ddr->cs_config[2]);
261
262         if (n_ranks == 2) {
263                 ddr->csbnds[3].csbnds = ( (banksize(spd.row_dens) >> 8)
264                                   | ((banksize(spd.row_dens) >> 23) - 1) );
265                 ddr->cs_config[3] = ( 1<<31
266                                     | (odt_rd_cfg << 20)
267                                     | (odt_wr_cfg << 16)
268                                     | ((spd.nbanks == 8 ? 1 : 0) << 14)
269                                     | ((spd.nrow_addr - 12) << 8)
270                                     | (spd.ncol_addr - 8) );
271                 debug("cs3_bnds = 0x%08x\n",ddr->csbnds[3].csbnds);
272                 debug("cs3_config = 0x%08x\n",ddr->cs_config[3]);
273         }
274 #endif
275
276         /*
277          * Figure out memory size in Megabytes.
278          */
279         memsize = n_ranks * banksize(spd.row_dens) / 0x100000;
280
281         /*
282          * First supported LAW size is 16M, at LAWAR_SIZE_16M == 23.
283          */
284         law_size = 19 + __ilog2(memsize);
285
286         /*
287          * Set up LAWBAR for all of DDR.
288          */
289         ecm->bar = CONFIG_SYS_SDRAM_BASE & 0xfffff000;
290         ecm->ar  = (LAWAR_EN | LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & law_size));
291         debug("DDR:bar=0x%08x\n", ecm->bar);
292         debug("DDR:ar=0x%08x\n", ecm->ar);
293
294         /*
295          * Find the largest CAS by locating the highest 1 bit
296          * in the spd.cas_lat field.  Translate it to a DDR
297          * controller field value:
298          *
299          *      CAS Lat DDR I   DDR II  Ctrl
300          *      Clocks  SPD Bit SPD Bit Value
301          *      ------- ------- ------- -----
302          *      1.0     0               0001
303          *      1.5     1               0010
304          *      2.0     2       2       0011
305          *      2.5     3               0100
306          *      3.0     4       3       0101
307          *      3.5     5               0110
308          *      4.0     6       4       0111
309          *      4.5                     1000
310          *      5.0             5       1001
311          */
312         caslat = __ilog2(spd.cas_lat);
313         if ((spd.mem_type == SPD_MEMTYPE_DDR)
314             && (caslat > 6)) {
315                 printf("DDR I: Invalid SPD CAS Latency: 0x%x.\n", spd.cas_lat);
316                 return 0;
317         } else if (spd.mem_type == SPD_MEMTYPE_DDR2
318                    && (caslat < 2 || caslat > 5)) {
319                 printf("DDR II: Invalid SPD CAS Latency: 0x%x.\n",
320                        spd.cas_lat);
321                 return 0;
322         }
323         debug("DDR: caslat SPD bit is %d\n", caslat);
324
325         max_bus_clk = 1000 *10 / (((spd.clk_cycle & 0xF0) >> 4) * 10
326                         + (spd.clk_cycle & 0x0f));
327         max_data_rate = max_bus_clk * 2;
328
329         debug("DDR:Module maximum data rate is: %d MHz\n", max_data_rate);
330
331         ddrc_clk = gd->mem_clk / 1000000;
332         effective_data_rate = 0;
333
334         if (max_data_rate >= 460) { /* it is DDR2-800, 667, 533 */
335                 if (spd.cas_lat & 0x08)
336                         caslat = 3;
337                 else
338                         caslat = 4;
339                 if (ddrc_clk <= 460 && ddrc_clk > 350)
340                         effective_data_rate = 400;
341                 else if (ddrc_clk <=350 && ddrc_clk > 280)
342                         effective_data_rate = 333;
343                 else if (ddrc_clk <= 280 && ddrc_clk > 230)
344                         effective_data_rate = 266;
345                 else
346                         effective_data_rate = 200;
347         } else if (max_data_rate >= 390 && max_data_rate < 460) { /* it is DDR 400 */
348                 if (ddrc_clk <= 460 && ddrc_clk > 350) {
349                         /* DDR controller clk at 350~460 */
350                         effective_data_rate = 400; /* 5ns */
351                         caslat = caslat;
352                 } else if (ddrc_clk <= 350 && ddrc_clk > 280) {
353                         /* DDR controller clk at 280~350 */
354                         effective_data_rate = 333; /* 6ns */
355                         if (spd.clk_cycle2 == 0x60)
356                                 caslat = caslat - 1;
357                         else
358                                 caslat = caslat;
359                 } else if (ddrc_clk <= 280 && ddrc_clk > 230) {
360                         /* DDR controller clk at 230~280 */
361                         effective_data_rate = 266; /* 7.5ns */
362                         if (spd.clk_cycle3 == 0x75)
363                                 caslat = caslat - 2;
364                         else if (spd.clk_cycle2 == 0x75)
365                                 caslat = caslat - 1;
366                         else
367                                 caslat = caslat;
368                 } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
369                         /* DDR controller clk at 90~230 */
370                         effective_data_rate = 200; /* 10ns */
371                         if (spd.clk_cycle3 == 0xa0)
372                                 caslat = caslat - 2;
373                         else if (spd.clk_cycle2 == 0xa0)
374                                 caslat = caslat - 1;
375                         else
376                                 caslat = caslat;
377                 }
378         } else if (max_data_rate >= 323) { /* it is DDR 333 */
379                 if (ddrc_clk <= 350 && ddrc_clk > 280) {
380                         /* DDR controller clk at 280~350 */
381                         effective_data_rate = 333; /* 6ns */
382                         caslat = caslat;
383                 } else if (ddrc_clk <= 280 && ddrc_clk > 230) {
384                         /* DDR controller clk at 230~280 */
385                         effective_data_rate = 266; /* 7.5ns */
386                         if (spd.clk_cycle2 == 0x75)
387                                 caslat = caslat - 1;
388                         else
389                                 caslat = caslat;
390                 } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
391                         /* DDR controller clk at 90~230 */
392                         effective_data_rate = 200; /* 10ns */
393                         if (spd.clk_cycle3 == 0xa0)
394                                 caslat = caslat - 2;
395                         else if (spd.clk_cycle2 == 0xa0)
396                                 caslat = caslat - 1;
397                         else
398                                 caslat = caslat;
399                 }
400         } else if (max_data_rate >= 256) { /* it is DDR 266 */
401                 if (ddrc_clk <= 350 && ddrc_clk > 280) {
402                         /* DDR controller clk at 280~350 */
403                         printf("DDR: DDR controller freq is more than "
404                                 "max data rate of the module\n");
405                         return 0;
406                 } else if (ddrc_clk <= 280 && ddrc_clk > 230) {
407                         /* DDR controller clk at 230~280 */
408                         effective_data_rate = 266; /* 7.5ns */
409                         caslat = caslat;
410                 } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
411                         /* DDR controller clk at 90~230 */
412                         effective_data_rate = 200; /* 10ns */
413                         if (spd.clk_cycle2 == 0xa0)
414                                 caslat = caslat - 1;
415                 }
416         } else if (max_data_rate >= 190) { /* it is DDR 200 */
417                 if (ddrc_clk <= 350 && ddrc_clk > 230) {
418                         /* DDR controller clk at 230~350 */
419                         printf("DDR: DDR controller freq is more than "
420                                 "max data rate of the module\n");
421                         return 0;
422                 } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
423                         /* DDR controller clk at 90~230 */
424                         effective_data_rate = 200; /* 10ns */
425                         caslat = caslat;
426                 }
427         }
428
429         debug("DDR:Effective data rate is: %dMHz\n", effective_data_rate);
430         debug("DDR:The MSB 1 of CAS Latency is: %d\n", caslat);
431
432         /*
433          * Errata DDR6 work around: input enable 2 cycles earlier.
434          * including MPC834X Rev1.0/1.1 and MPC8360 Rev1.1/1.2.
435          */
436         if(PVR_MAJ(pvr) <= 1 && spd.mem_type == SPD_MEMTYPE_DDR){
437                 if (caslat == 2)
438                         ddr->debug_reg = 0x201c0000; /* CL=2 */
439                 else if (caslat == 3)
440                         ddr->debug_reg = 0x202c0000; /* CL=2.5 */
441                 else if (caslat == 4)
442                         ddr->debug_reg = 0x202c0000; /* CL=3.0 */
443
444                 sync();
445
446                 debug("Errata DDR6 (debug_reg=0x%08x)\n", ddr->debug_reg);
447         }
448
449         /*
450          * Convert caslat clocks to DDR controller value.
451          * Force caslat_ctrl to be DDR Controller field-sized.
452          */
453         if (spd.mem_type == SPD_MEMTYPE_DDR) {
454                 caslat_ctrl = (caslat + 1) & 0x07;
455         } else {
456                 caslat_ctrl =  (2 * caslat - 1) & 0x0f;
457         }
458
459         debug("DDR: effective data rate is %d MHz\n", effective_data_rate);
460         debug("DDR: caslat SPD bit is %d, controller field is 0x%x\n",
461               caslat, caslat_ctrl);
462
463         /*
464          * Timing Config 0.
465          * Avoid writing for DDR I.
466          */
467         if (spd.mem_type == SPD_MEMTYPE_DDR2) {
468                 unsigned char taxpd_clk = 8;            /* By the book. */
469                 unsigned char tmrd_clk = 2;             /* By the book. */
470                 unsigned char act_pd_exit = 2;          /* Empirical? */
471                 unsigned char pre_pd_exit = 6;          /* Empirical? */
472
473                 ddr->timing_cfg_0 = (0
474                         | ((act_pd_exit & 0x7) << 20)   /* ACT_PD_EXIT */
475                         | ((pre_pd_exit & 0x7) << 16)   /* PRE_PD_EXIT */
476                         | ((taxpd_clk & 0xf) << 8)      /* ODT_PD_EXIT */
477                         | ((tmrd_clk & 0xf) << 0)       /* MRS_CYC */
478                         );
479                 debug("DDR: timing_cfg_0 = 0x%08x\n", ddr->timing_cfg_0);
480         }
481
482         /*
483          * For DDR I, WRREC(Twr) and WRTORD(Twtr) are not in SPD,
484          * use conservative value.
485          * For DDR II, they are bytes 36 and 37, in quarter nanos.
486          */
487
488         if (spd.mem_type == SPD_MEMTYPE_DDR) {
489                 twr_clk = 3;    /* Clocks */
490                 twtr_clk = 1;   /* Clocks */
491         } else {
492                 twr_clk = picos_to_clk(spd.twr * 250);
493                 twtr_clk = picos_to_clk(spd.twtr * 250);
494                 if (twtr_clk < 2)
495                         twtr_clk = 2;
496         }
497
498         /*
499          * Calculate Trfc, in picos.
500          * DDR I:  Byte 42 straight up in ns.
501          * DDR II: Byte 40 and 42 swizzled some, in ns.
502          */
503         if (spd.mem_type == SPD_MEMTYPE_DDR) {
504                 trfc = spd.trfc * 1000;         /* up to ps */
505         } else {
506                 unsigned int byte40_table_ps[8] = {
507                         0,
508                         250,
509                         330,
510                         500,
511                         660,
512                         750,
513                         0,
514                         0
515                 };
516
517                 trfc = (((spd.trctrfc_ext & 0x1) * 256) + spd.trfc) * 1000
518                         + byte40_table_ps[(spd.trctrfc_ext >> 1) & 0x7];
519         }
520         trfc_clk = picos_to_clk(trfc);
521
522         /*
523          * Trcd, Byte 29, from quarter nanos to ps and clocks.
524          */
525         trcd_clk = picos_to_clk(spd.trcd * 250) & 0x7;
526
527         /*
528          * Convert trfc_clk to DDR controller fields.  DDR I should
529          * fit in the REFREC field (16-19) of TIMING_CFG_1, but the
530          * 83xx controller has an extended REFREC field of three bits.
531          * The controller automatically adds 8 clocks to this value,
532          * so preadjust it down 8 first before splitting it up.
533          */
534         trfc_low = (trfc_clk - 8) & 0xf;
535
536         ddr->timing_cfg_1 =
537             (((picos_to_clk(spd.trp * 250) & 0x07) << 28 ) |    /* PRETOACT */
538              ((picos_to_clk(spd.tras * 1000) & 0x0f ) << 24 ) | /* ACTTOPRE */
539              (trcd_clk << 20 ) |                                /* ACTTORW */
540              (caslat_ctrl << 16 ) |                             /* CASLAT */
541              (trfc_low << 12 ) |                                /* REFEC */
542              ((twr_clk & 0x07) << 8) |                          /* WRRREC */
543              ((picos_to_clk(spd.trrd * 250) & 0x07) << 4) |     /* ACTTOACT */
544              ((twtr_clk & 0x07) << 0)                           /* WRTORD */
545             );
546
547         /*
548          * Additive Latency
549          * For DDR I, 0.
550          * For DDR II, with ODT enabled, use "a value" less than ACTTORW,
551          * which comes from Trcd, and also note that:
552          *      add_lat + caslat must be >= 4
553          */
554         add_lat = 0;
555         if (spd.mem_type == SPD_MEMTYPE_DDR2
556             && (odt_wr_cfg || odt_rd_cfg)
557             && (caslat < 4)) {
558                 add_lat = 4 - caslat;
559                 if ((add_lat + caslat) < 4) {
560                         add_lat = 0;
561                 }
562         }
563
564         /*
565          * Write Data Delay
566          * Historically 0x2 == 4/8 clock delay.
567          * Empirically, 0x3 == 6/8 clock delay is suggested for DDR I 266.
568          */
569         wr_data_delay = 2;
570 #ifdef CONFIG_SYS_DDR_WRITE_DATA_DELAY
571         wr_data_delay = CONFIG_SYS_DDR_WRITE_DATA_DELAY;
572 #endif
573
574         /*
575          * Write Latency
576          * Read to Precharge
577          * Minimum CKE Pulse Width.
578          * Four Activate Window
579          */
580         if (spd.mem_type == SPD_MEMTYPE_DDR) {
581                 /*
582                  * This is a lie.  It should really be 1, but if it is
583                  * set to 1, bits overlap into the old controller's
584                  * otherwise unused ACSM field.  If we leave it 0, then
585                  * the HW will magically treat it as 1 for DDR 1.  Oh Yea.
586                  */
587                 wr_lat = 0;
588
589                 trtp_clk = 2;           /* By the book. */
590                 cke_min_clk = 1;        /* By the book. */
591                 four_act = 1;           /* By the book. */
592
593         } else {
594                 wr_lat = caslat - 1;
595
596                 /* Convert SPD value from quarter nanos to picos. */
597                 trtp_clk = picos_to_clk(spd.trtp * 250);
598                 if (trtp_clk < 2)
599                         trtp_clk = 2;
600                 trtp_clk += add_lat;
601
602                 cke_min_clk = 3;        /* By the book. */
603                 four_act = picos_to_clk(37500); /* By the book. 1k pages? */
604         }
605
606         /*
607          * Empirically set ~MCAS-to-preamble override for DDR 2.
608          * Your mileage will vary.
609          */
610         cpo = 0;
611         if (spd.mem_type == SPD_MEMTYPE_DDR2) {
612 #ifdef CONFIG_SYS_DDR_CPO
613                 cpo = CONFIG_SYS_DDR_CPO;
614 #else
615                 if (effective_data_rate == 266) {
616                         cpo = 0x4;              /* READ_LAT + 1/2 */
617                 } else if (effective_data_rate == 333) {
618                         cpo = 0x6;              /* READ_LAT + 1 */
619                 } else if (effective_data_rate == 400) {
620                         cpo = 0x7;              /* READ_LAT + 5/4 */
621                 } else {
622                         /* Automatic calibration */
623                         cpo = 0x1f;
624                 }
625 #endif
626         }
627
628         ddr->timing_cfg_2 = (0
629                 | ((add_lat & 0x7) << 28)               /* ADD_LAT */
630                 | ((cpo & 0x1f) << 23)                  /* CPO */
631                 | ((wr_lat & 0x7) << 19)                /* WR_LAT */
632                 | ((trtp_clk & 0x7) << 13)              /* RD_TO_PRE */
633                 | ((wr_data_delay & 0x7) << 10)         /* WR_DATA_DELAY */
634                 | ((cke_min_clk & 0x7) << 6)            /* CKE_PLS */
635                 | ((four_act & 0x1f) << 0)              /* FOUR_ACT */
636                 );
637
638         debug("DDR:timing_cfg_1=0x%08x\n", ddr->timing_cfg_1);
639         debug("DDR:timing_cfg_2=0x%08x\n", ddr->timing_cfg_2);
640
641         /* Check DIMM data bus width */
642         if (spd.dataw_lsb < 64) {
643                 if (spd.mem_type == SPD_MEMTYPE_DDR)
644                         burstlen = 0x03; /* 32 bit data bus, burst len is 8 */
645                 else
646                         burstlen = 0x02; /* 32 bit data bus, burst len is 4 */
647                 debug("\n   DDR DIMM: data bus width is 32 bit");
648         } else {
649                 burstlen = 0x02; /* Others act as 64 bit bus, burst len is 4 */
650                 debug("\n   DDR DIMM: data bus width is 64 bit");
651         }
652
653         /* Is this an ECC DDR chip? */
654         if (spd.config == 0x02)
655                 debug(" with ECC\n");
656         else
657                 debug(" without ECC\n");
658
659         /* Burst length is always 4 for 64 bit data bus, 8 for 32 bit data bus,
660            Burst type is sequential
661          */
662         if (spd.mem_type == SPD_MEMTYPE_DDR) {
663                 switch (caslat) {
664                 case 1:
665                         ddr->sdram_mode = 0x50 | burstlen; /* CL=1.5 */
666                         break;
667                 case 2:
668                         ddr->sdram_mode = 0x20 | burstlen; /* CL=2.0 */
669                         break;
670                 case 3:
671                         ddr->sdram_mode = 0x60 | burstlen; /* CL=2.5 */
672                         break;
673                 case 4:
674                         ddr->sdram_mode = 0x30 | burstlen; /* CL=3.0 */
675                         break;
676                 default:
677                         printf("DDR:only CL 1.5, 2.0, 2.5, 3.0 is supported\n");
678                         return 0;
679                 }
680         } else {
681                 mode_odt_enable = 0x0;                  /* Default disabled */
682                 if (odt_wr_cfg || odt_rd_cfg) {
683                         /*
684                          * Bits 6 and 2 in Extended MRS(1)
685                          * Bit 2 == 0x04 == 75 Ohm, with 2 DIMM modules.
686                          * Bit 6 == 0x40 == 150 Ohm, with 1 DIMM module.
687                          */
688                         mode_odt_enable = 0x40;         /* 150 Ohm */
689                 }
690
691                 ddr->sdram_mode =
692                         (0
693                          | (1 << (16 + 10))             /* DQS Differential disable */
694 #ifdef CONFIG_SYS_DDR_MODE_WEAK
695                          | (1 << (16 + 1))              /* weak driver (~60%) */
696 #endif
697                          | (add_lat << (16 + 3))        /* Additive Latency in EMRS1 */
698                          | (mode_odt_enable << 16)      /* ODT Enable in EMRS1 */
699                          | ((twr_clk - 1) << 9)         /* Write Recovery Autopre */
700                          | (caslat << 4)                /* caslat */
701                          | (burstlen << 0)              /* Burst length */
702                         );
703         }
704         debug("DDR:sdram_mode=0x%08x\n", ddr->sdram_mode);
705
706         /*
707          * Clear EMRS2 and EMRS3.
708          */
709         ddr->sdram_mode2 = 0;
710         debug("DDR: sdram_mode2 = 0x%08x\n", ddr->sdram_mode2);
711
712         switch (spd.refresh) {
713                 case 0x00:
714                 case 0x80:
715                         refresh_clk = picos_to_clk(15625000);
716                         break;
717                 case 0x01:
718                 case 0x81:
719                         refresh_clk = picos_to_clk(3900000);
720                         break;
721                 case 0x02:
722                 case 0x82:
723                         refresh_clk = picos_to_clk(7800000);
724                         break;
725                 case 0x03:
726                 case 0x83:
727                         refresh_clk = picos_to_clk(31300000);
728                         break;
729                 case 0x04:
730                 case 0x84:
731                         refresh_clk = picos_to_clk(62500000);
732                         break;
733                 case 0x05:
734                 case 0x85:
735                         refresh_clk = picos_to_clk(125000000);
736                         break;
737                 default:
738                         refresh_clk = 0x512;
739                         break;
740         }
741
742         /*
743          * Set BSTOPRE to 0x100 for page mode
744          * If auto-charge is used, set BSTOPRE = 0
745          */
746         ddr->sdram_interval = ((refresh_clk & 0x3fff) << 16) | 0x100;
747         debug("DDR:sdram_interval=0x%08x\n", ddr->sdram_interval);
748
749         /*
750          * SDRAM Cfg 2
751          */
752         odt_cfg = 0;
753 #ifndef CONFIG_NEVER_ASSERT_ODT_TO_CPU
754         if (odt_rd_cfg | odt_wr_cfg) {
755                 odt_cfg = 0x2;          /* ODT to IOs during reads */
756         }
757 #endif
758         if (spd.mem_type == SPD_MEMTYPE_DDR2) {
759                 ddr->sdram_cfg2 = (0
760                             | (0 << 26) /* True DQS */
761                             | (odt_cfg << 21)   /* ODT only read */
762                             | (1 << 12) /* 1 refresh at a time */
763                             );
764
765                 debug("DDR: sdram_cfg2  = 0x%08x\n", ddr->sdram_cfg2);
766         }
767
768 #ifdef CONFIG_SYS_DDR_SDRAM_CLK_CNTL    /* Optional platform specific value */
769         ddr->sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL;
770 #endif
771         debug("DDR:sdram_clk_cntl=0x%08x\n", ddr->sdram_clk_cntl);
772
773         sync();
774         isync();
775
776         udelay(600);
777
778         /*
779          * Figure out the settings for the sdram_cfg register. Build up
780          * the value in 'sdram_cfg' before writing since the write into
781          * the register will actually enable the memory controller, and all
782          * settings must be done before enabling.
783          *
784          * sdram_cfg[0]   = 1 (ddr sdram logic enable)
785          * sdram_cfg[1]   = 1 (self-refresh-enable)
786          * sdram_cfg[5:7] = (SDRAM type = DDR SDRAM)
787          *                      010 DDR 1 SDRAM
788          *                      011 DDR 2 SDRAM
789          * sdram_cfg[12] = 0 (32_BE =0 , 64 bit bus mode)
790          * sdram_cfg[13] = 0 (8_BE =0, 4-beat bursts)
791          */
792         if (spd.mem_type == SPD_MEMTYPE_DDR)
793                 sdram_type = SDRAM_CFG_SDRAM_TYPE_DDR1;
794         else
795                 sdram_type = SDRAM_CFG_SDRAM_TYPE_DDR2;
796
797         sdram_cfg = (0
798                      | SDRAM_CFG_MEM_EN         /* DDR enable */
799                      | SDRAM_CFG_SREN           /* Self refresh */
800                      | sdram_type               /* SDRAM type */
801                      );
802
803         /* sdram_cfg[3] = RD_EN - registered DIMM enable */
804         if (spd.mod_attr & 0x02)
805                 sdram_cfg |= SDRAM_CFG_RD_EN;
806
807         /* The DIMM is 32bit width */
808         if (spd.dataw_lsb < 64) {
809                 if (spd.mem_type == SPD_MEMTYPE_DDR)
810                         sdram_cfg |= SDRAM_CFG_32_BE | SDRAM_CFG_8_BE;
811                 if (spd.mem_type == SPD_MEMTYPE_DDR2)
812                         sdram_cfg |= SDRAM_CFG_32_BE;
813         }
814
815         ddrc_ecc_enable = 0;
816
817 #if defined(CONFIG_DDR_ECC)
818         /* Enable ECC with sdram_cfg[2] */
819         if (spd.config == 0x02) {
820                 sdram_cfg |= 0x20000000;
821                 ddrc_ecc_enable = 1;
822                 /* disable error detection */
823                 ddr->err_disable = ~ECC_ERROR_ENABLE;
824                 /* set single bit error threshold to maximum value,
825                  * reset counter to zero */
826                 ddr->err_sbe = (255 << ECC_ERROR_MAN_SBET_SHIFT) |
827                                 (0 << ECC_ERROR_MAN_SBEC_SHIFT);
828         }
829
830         debug("DDR:err_disable=0x%08x\n", ddr->err_disable);
831         debug("DDR:err_sbe=0x%08x\n", ddr->err_sbe);
832 #endif
833         debug("   DDRC ECC mode: %s\n", ddrc_ecc_enable ? "ON":"OFF");
834
835 #if defined(CONFIG_DDR_2T_TIMING)
836         /*
837          * Enable 2T timing by setting sdram_cfg[16].
838          */
839         sdram_cfg |= SDRAM_CFG_2T_EN;
840 #endif
841         /* Enable controller, and GO! */
842         ddr->sdram_cfg = sdram_cfg;
843         sync();
844         isync();
845         udelay(500);
846
847         debug("DDR:sdram_cfg=0x%08x\n", ddr->sdram_cfg);
848         return memsize; /*in MBytes*/
849 }
850 #endif /* CONFIG_SPD_EEPROM */
851
852 #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
853 static inline u32 mftbu(void)
854 {
855         u32 rval;
856
857         asm volatile("mftbu %0" : "=r" (rval));
858         return rval;
859 }
860
861 static inline u32 mftb(void)
862 {
863         u32 rval;
864
865         asm volatile("mftb %0" : "=r" (rval));
866         return rval;
867 }
868
869 /*
870  * Use timebase counter, get_timer() is not available
871  * at this point of initialization yet.
872  */
873 static __inline__ unsigned long get_tbms (void)
874 {
875         unsigned long tbl;
876         unsigned long tbu1, tbu2;
877         unsigned long ms;
878         unsigned long long tmp;
879
880         ulong tbclk = get_tbclk();
881
882         /* get the timebase ticks */
883         do {
884                 tbu1 = mftbu();
885                 tbl = mftb();
886                 tbu2 = mftbu();
887         } while (tbu1 != tbu2);
888
889         /* convert ticks to ms */
890         tmp = (unsigned long long)(tbu1);
891         tmp = (tmp << 32);
892         tmp += (unsigned long long)(tbl);
893         ms = tmp/(tbclk/1000);
894
895         return ms;
896 }
897
898 /*
899  * Initialize all of memory for ECC, then enable errors.
900  */
901 void ddr_enable_ecc(unsigned int dram_size)
902 {
903         volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
904         volatile ddr83xx_t *ddr= &immap->ddr;
905         unsigned long t_start, t_end;
906         register u64 *p;
907         register uint size;
908         unsigned int pattern[2];
909
910         icache_enable();
911         t_start = get_tbms();
912         pattern[0] = 0xdeadbeef;
913         pattern[1] = 0xdeadbeef;
914
915 #if defined(CONFIG_DDR_ECC_INIT_VIA_DMA)
916         dma_meminit(pattern[0], dram_size);
917 #else
918         debug("ddr init: CPU FP write method\n");
919         size = dram_size;
920         for (p = 0; p < (u64*)(size); p++) {
921                 ppcDWstore((u32*)p, pattern);
922         }
923         sync();
924 #endif
925
926         t_end = get_tbms();
927         icache_disable();
928
929         debug("\nREADY!!\n");
930         debug("ddr init duration: %ld ms\n", t_end - t_start);
931
932         /* Clear All ECC Errors */
933         if ((ddr->err_detect & ECC_ERROR_DETECT_MME) == ECC_ERROR_DETECT_MME)
934                 ddr->err_detect |= ECC_ERROR_DETECT_MME;
935         if ((ddr->err_detect & ECC_ERROR_DETECT_MBE) == ECC_ERROR_DETECT_MBE)
936                 ddr->err_detect |= ECC_ERROR_DETECT_MBE;
937         if ((ddr->err_detect & ECC_ERROR_DETECT_SBE) == ECC_ERROR_DETECT_SBE)
938                 ddr->err_detect |= ECC_ERROR_DETECT_SBE;
939         if ((ddr->err_detect & ECC_ERROR_DETECT_MSE) == ECC_ERROR_DETECT_MSE)
940                 ddr->err_detect |= ECC_ERROR_DETECT_MSE;
941
942         /* Disable ECC-Interrupts */
943         ddr->err_int_en &= ECC_ERR_INT_DISABLE;
944
945         /* Enable errors for ECC */
946         ddr->err_disable &= ECC_ERROR_ENABLE;
947
948         sync();
949         isync();
950 }
951 #endif  /* CONFIG_DDR_ECC */
952
953 #endif /* !CONFIG_MPC83XX_SDRAM */