Merge tag '2020-01-20-ti-2020.04' of https://gitlab.denx.de/u-boot/custodians/u-boot-ti
[platform/kernel/u-boot.git] / arch / powerpc / cpu / mpc85xx / cpu.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2004,2007-2011 Freescale Semiconductor, Inc.
4  * (C) Copyright 2002, 2003 Motorola Inc.
5  * Xianghua Xiao (X.Xiao@motorola.com)
6  *
7  * (C) Copyright 2000
8  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
9  */
10
11 #include <config.h>
12 #include <common.h>
13 #include <cpu_func.h>
14 #include <irq_func.h>
15 #include <time.h>
16 #include <vsprintf.h>
17 #include <watchdog.h>
18 #include <command.h>
19 #include <fsl_esdhc.h>
20 #include <asm/cache.h>
21 #include <asm/io.h>
22 #include <asm/mmu.h>
23 #include <fsl_ifc.h>
24 #include <asm/fsl_law.h>
25 #include <asm/fsl_lbc.h>
26 #include <post.h>
27 #include <asm/processor.h>
28 #include <fsl_ddr_sdram.h>
29 #include <asm/ppc.h>
30
31 DECLARE_GLOBAL_DATA_PTR;
32
33 /*
34  * Default board reset function
35  */
36 static void
37 __board_reset(void)
38 {
39         /* Do nothing */
40 }
41 void board_reset(void) __attribute__((weak, alias("__board_reset")));
42
43 int checkcpu (void)
44 {
45         sys_info_t sysinfo;
46         uint pvr, svr;
47         uint ver;
48         uint major, minor;
49         struct cpu_type *cpu;
50         char buf1[32], buf2[32];
51 #if defined(CONFIG_DDR_CLK_FREQ) || defined(CONFIG_FSL_CORENET)
52         ccsr_gur_t __iomem *gur =
53                 (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
54 #endif
55
56         /*
57          * Cornet platforms use ddr sync bit in RCW to indicate sync vs async
58          * mode. Previous platform use ddr ratio to do the same. This
59          * information is only for display here.
60          */
61 #ifdef CONFIG_FSL_CORENET
62 #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
63         u32 ddr_sync = 0;       /* only async mode is supported */
64 #else
65         u32 ddr_sync = ((gur->rcwsr[5]) & FSL_CORENET_RCWSR5_DDR_SYNC)
66                 >> FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT;
67 #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
68 #else   /* CONFIG_FSL_CORENET */
69 #ifdef CONFIG_DDR_CLK_FREQ
70         u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO)
71                 >> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
72 #else
73         u32 ddr_ratio = 0;
74 #endif /* CONFIG_DDR_CLK_FREQ */
75 #endif /* CONFIG_FSL_CORENET */
76
77         unsigned int i, core, nr_cores = cpu_numcores();
78         u32 mask = cpu_mask();
79
80 #ifdef CONFIG_HETROGENOUS_CLUSTERS
81         unsigned int j, dsp_core, dsp_numcores = cpu_num_dspcores();
82         u32 dsp_mask = cpu_dsp_mask();
83 #endif
84
85         svr = get_svr();
86         major = SVR_MAJ(svr);
87         minor = SVR_MIN(svr);
88
89 #if defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2) && defined(CONFIG_E6500)
90         if (SVR_SOC_VER(svr) == SVR_T4080) {
91                 ccsr_rcpm_t *rcpm =
92                         (void __iomem *)(CONFIG_SYS_FSL_CORENET_RCPM_ADDR);
93
94                 setbits_be32(&gur->devdisr2, FSL_CORENET_DEVDISR2_DTSEC1_6 ||
95                              FSL_CORENET_DEVDISR2_DTSEC1_9);
96                 setbits_be32(&gur->devdisr3, FSL_CORENET_DEVDISR3_PCIE3);
97                 setbits_be32(&gur->devdisr5, FSL_CORENET_DEVDISR5_DDR3);
98
99                 /* It needs SW to disable core4~7 as HW design sake on T4080 */
100                 for (i = 4; i < 8; i++)
101                         cpu_disable(i);
102
103                 /* request core4~7 into PH20 state, prior to entering PCL10
104                  * state, all cores in cluster should be placed in PH20 state.
105                  */
106                 setbits_be32(&rcpm->pcph20setr, 0xf0);
107
108                 /* put the 2nd cluster into PCL10 state */
109                 setbits_be32(&rcpm->clpcl10setr, 1 << 1);
110         }
111 #endif
112
113         if (cpu_numcores() > 1) {
114 #ifndef CONFIG_MP
115                 puts("Unicore software on multiprocessor system!!\n"
116                      "To enable mutlticore build define CONFIG_MP\n");
117 #endif
118                 volatile ccsr_pic_t *pic = (void *)(CONFIG_SYS_MPC8xxx_PIC_ADDR);
119                 printf("CPU%d:  ", pic->whoami);
120         } else {
121                 puts("CPU:   ");
122         }
123
124         cpu = gd->arch.cpu;
125
126         puts(cpu->name);
127         if (IS_E_PROCESSOR(svr))
128                 puts("E");
129
130         printf(", Version: %d.%d, (0x%08x)\n", major, minor, svr);
131
132         pvr = get_pvr();
133         ver = PVR_VER(pvr);
134         major = PVR_MAJ(pvr);
135         minor = PVR_MIN(pvr);
136
137         printf("Core:  ");
138         switch(ver) {
139         case PVR_VER_E500_V1:
140         case PVR_VER_E500_V2:
141                 puts("e500");
142                 break;
143         case PVR_VER_E500MC:
144                 puts("e500mc");
145                 break;
146         case PVR_VER_E5500:
147                 puts("e5500");
148                 break;
149         case PVR_VER_E6500:
150                 puts("e6500");
151                 break;
152         default:
153                 puts("Unknown");
154                 break;
155         }
156
157         printf(", Version: %d.%d, (0x%08x)\n", major, minor, pvr);
158
159         if (nr_cores > CONFIG_MAX_CPUS) {
160                 panic("\nUnexpected number of cores: %d, max is %d\n",
161                         nr_cores, CONFIG_MAX_CPUS);
162         }
163
164         get_sys_info(&sysinfo);
165
166 #ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
167         if (sysinfo.diff_sysclk == 1)
168                 puts("Single Source Clock Configuration\n");
169 #endif
170
171         puts("Clock Configuration:");
172         for_each_cpu(i, core, nr_cores, mask) {
173                 if (!(i & 3))
174                         printf ("\n       ");
175                 printf("CPU%d:%-4s MHz, ", core,
176                         strmhz(buf1, sysinfo.freq_processor[core]));
177         }
178
179 #ifdef CONFIG_HETROGENOUS_CLUSTERS
180         for_each_cpu(j, dsp_core, dsp_numcores, dsp_mask) {
181                 if (!(j & 3))
182                         printf("\n       ");
183                 printf("DSP CPU%d:%-4s MHz, ", j,
184                        strmhz(buf1, sysinfo.freq_processor_dsp[dsp_core]));
185         }
186 #endif
187
188         printf("\n       CCB:%-4s MHz,", strmhz(buf1, sysinfo.freq_systembus));
189         printf("\n");
190
191 #ifdef CONFIG_FSL_CORENET
192         if (ddr_sync == 1) {
193                 printf("       DDR:%-4s MHz (%s MT/s data rate) "
194                         "(Synchronous), ",
195                         strmhz(buf1, sysinfo.freq_ddrbus/2),
196                         strmhz(buf2, sysinfo.freq_ddrbus));
197         } else {
198                 printf("       DDR:%-4s MHz (%s MT/s data rate) "
199                         "(Asynchronous), ",
200                         strmhz(buf1, sysinfo.freq_ddrbus/2),
201                         strmhz(buf2, sysinfo.freq_ddrbus));
202         }
203 #else
204         switch (ddr_ratio) {
205         case 0x0:
206                 printf("       DDR:%-4s MHz (%s MT/s data rate), ",
207                         strmhz(buf1, sysinfo.freq_ddrbus/2),
208                         strmhz(buf2, sysinfo.freq_ddrbus));
209                 break;
210         case 0x7:
211                 printf("       DDR:%-4s MHz (%s MT/s data rate) "
212                         "(Synchronous), ",
213                         strmhz(buf1, sysinfo.freq_ddrbus/2),
214                         strmhz(buf2, sysinfo.freq_ddrbus));
215                 break;
216         default:
217                 printf("       DDR:%-4s MHz (%s MT/s data rate) "
218                         "(Asynchronous), ",
219                         strmhz(buf1, sysinfo.freq_ddrbus/2),
220                         strmhz(buf2, sysinfo.freq_ddrbus));
221                 break;
222         }
223 #endif
224
225 #if defined(CONFIG_FSL_LBC)
226         if (sysinfo.freq_localbus > LCRR_CLKDIV) {
227                 printf("LBC:%-4s MHz\n", strmhz(buf1, sysinfo.freq_localbus));
228         } else {
229                 printf("LBC: unknown (LCRR[CLKDIV] = 0x%02lx)\n",
230                        sysinfo.freq_localbus);
231         }
232 #endif
233
234 #if defined(CONFIG_FSL_IFC)
235         printf("IFC:%-4s MHz\n", strmhz(buf1, sysinfo.freq_localbus));
236 #endif
237
238 #ifdef CONFIG_CPM2
239         printf("CPM:   %s MHz\n", strmhz(buf1, sysinfo.freq_systembus));
240 #endif
241
242 #ifdef CONFIG_QE
243         printf("       QE:%-4s MHz\n", strmhz(buf1, sysinfo.freq_qe));
244 #endif
245
246 #if defined(CONFIG_SYS_CPRI)
247         printf("       ");
248         printf("CPRI:%-4s MHz", strmhz(buf1, sysinfo.freq_cpri));
249 #endif
250
251 #if defined(CONFIG_SYS_MAPLE)
252         printf("\n       ");
253         printf("MAPLE:%-4s MHz, ", strmhz(buf1, sysinfo.freq_maple));
254         printf("MAPLE-ULB:%-4s MHz, ", strmhz(buf1, sysinfo.freq_maple_ulb));
255         printf("MAPLE-eTVPE:%-4s MHz\n",
256                strmhz(buf1, sysinfo.freq_maple_etvpe));
257 #endif
258
259 #ifdef CONFIG_SYS_DPAA_FMAN
260         for (i = 0; i < CONFIG_SYS_NUM_FMAN; i++) {
261                 printf("       FMAN%d: %s MHz\n", i + 1,
262                         strmhz(buf1, sysinfo.freq_fman[i]));
263         }
264 #endif
265
266 #ifdef CONFIG_SYS_DPAA_QBMAN
267         printf("       QMAN:  %s MHz\n", strmhz(buf1, sysinfo.freq_qman));
268 #endif
269
270 #ifdef CONFIG_SYS_DPAA_PME
271         printf("       PME:   %s MHz\n", strmhz(buf1, sysinfo.freq_pme));
272 #endif
273
274         puts("L1:    D-cache 32 KiB enabled\n       I-cache 32 KiB enabled\n");
275
276 #ifdef CONFIG_FSL_CORENET
277         /* Display the RCW, so that no one gets confused as to what RCW
278          * we're actually using for this boot.
279          */
280         puts("Reset Configuration Word (RCW):");
281         for (i = 0; i < ARRAY_SIZE(gur->rcwsr); i++) {
282                 u32 rcw = in_be32(&gur->rcwsr[i]);
283
284                 if ((i % 4) == 0)
285                         printf("\n       %08x:", i * 4);
286                 printf(" %08x", rcw);
287         }
288         puts("\n");
289 #endif
290
291         return 0;
292 }
293
294
295 /* ------------------------------------------------------------------------- */
296
297 int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
298 {
299 /* Everything after the first generation of PQ3 parts has RSTCR */
300 #if defined(CONFIG_ARCH_MPC8540) || defined(CONFIG_ARCH_MPC8541) || \
301         defined(CONFIG_ARCH_MPC8555) || defined(CONFIG_ARCH_MPC8560)
302         unsigned long val, msr;
303
304         /*
305          * Initiate hard reset in debug control register DBCR0
306          * Make sure MSR[DE] = 1.  This only resets the core.
307          */
308         msr = mfmsr ();
309         msr |= MSR_DE;
310         mtmsr (msr);
311
312         val = mfspr(DBCR0);
313         val |= 0x70000000;
314         mtspr(DBCR0,val);
315 #else
316         volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
317
318         /* Attempt board-specific reset */
319         board_reset();
320
321         /* Next try asserting HRESET_REQ */
322         out_be32(&gur->rstcr, 0x2);
323         udelay(100);
324 #endif
325
326         return 1;
327 }
328
329
330 /*
331  * Get timebase clock frequency
332  */
333 #ifndef CONFIG_SYS_FSL_TBCLK_DIV
334 #define CONFIG_SYS_FSL_TBCLK_DIV 8
335 #endif
336 __weak unsigned long get_tbclk(void)
337 {
338         unsigned long tbclk_div = CONFIG_SYS_FSL_TBCLK_DIV;
339
340         return (gd->bus_clk + (tbclk_div >> 1)) / tbclk_div;
341 }
342
343
344 #if defined(CONFIG_WATCHDOG)
345 #define WATCHDOG_MASK (TCR_WP(63) | TCR_WRC(3) | TCR_WIE)
346 void
347 init_85xx_watchdog(void)
348 {
349         mtspr(SPRN_TCR, (mfspr(SPRN_TCR) & ~WATCHDOG_MASK) |
350               TCR_WP(CONFIG_WATCHDOG_PRESC) | TCR_WRC(CONFIG_WATCHDOG_RC));
351 }
352
353 void
354 reset_85xx_watchdog(void)
355 {
356         /*
357          * Clear TSR(WIS) bit by writing 1
358          */
359         mtspr(SPRN_TSR, TSR_WIS);
360 }
361
362 void
363 watchdog_reset(void)
364 {
365         int re_enable = disable_interrupts();
366
367         reset_85xx_watchdog();
368         if (re_enable)
369                 enable_interrupts();
370 }
371 #endif  /* CONFIG_WATCHDOG */
372
373 /*
374  * Initializes on-chip MMC controllers.
375  * to override, implement board_mmc_init()
376  */
377 int cpu_mmc_init(bd_t *bis)
378 {
379 #ifdef CONFIG_FSL_ESDHC
380         return fsl_esdhc_mmc_init(bis);
381 #else
382         return 0;
383 #endif
384 }
385
386 /*
387  * Print out the state of various machine registers.
388  * Currently prints out LAWs, BR0/OR0 for LBC, CSPR/CSOR/Timing
389  * parameters for IFC and TLBs
390  */
391 void print_reginfo(void)
392 {
393         print_tlbcam();
394         print_laws();
395 #if defined(CONFIG_FSL_LBC)
396         print_lbc_regs();
397 #endif
398 #ifdef CONFIG_FSL_IFC
399         print_ifc_regs();
400 #endif
401
402 }
403
404 /* Common ddr init for non-corenet fsl 85xx platforms */
405 #ifndef CONFIG_FSL_CORENET
406 #if (defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)) && \
407         !defined(CONFIG_SYS_INIT_L2_ADDR)
408 int dram_init(void)
409 {
410 #if defined(CONFIG_SPD_EEPROM) || defined(CONFIG_DDR_SPD) || \
411         defined(CONFIG_ARCH_QEMU_E500)
412         gd->ram_size = fsl_ddr_sdram_size();
413 #else
414         gd->ram_size = (phys_size_t)CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
415 #endif
416
417         return 0;
418 }
419 #else /* CONFIG_SYS_RAMBOOT */
420 int dram_init(void)
421 {
422         phys_size_t dram_size = 0;
423
424 #if defined(CONFIG_SYS_FSL_ERRATUM_DDR_MSYNC_IN)
425         {
426                 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
427                 unsigned int x = 10;
428                 unsigned int i;
429
430                 /*
431                  * Work around to stabilize DDR DLL
432                  */
433                 out_be32(&gur->ddrdllcr, 0x81000000);
434                 asm("sync;isync;msync");
435                 udelay(200);
436                 while (in_be32(&gur->ddrdllcr) != 0x81000100) {
437                         setbits_be32(&gur->devdisr, 0x00010000);
438                         for (i = 0; i < x; i++)
439                                 ;
440                         clrbits_be32(&gur->devdisr, 0x00010000);
441                         x++;
442                 }
443         }
444 #endif
445
446 #if     defined(CONFIG_SPD_EEPROM)      || \
447         defined(CONFIG_DDR_SPD)         || \
448         defined(CONFIG_SYS_DDR_RAW_TIMING)
449         dram_size = fsl_ddr_sdram();
450 #else
451         dram_size = fixed_sdram();
452 #endif
453         dram_size = setup_ddr_tlbs(dram_size / 0x100000);
454         dram_size *= 0x100000;
455
456 #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
457         /*
458          * Initialize and enable DDR ECC.
459          */
460         ddr_enable_ecc(dram_size);
461 #endif
462
463 #if defined(CONFIG_FSL_LBC)
464         /* Some boards also have sdram on the lbc */
465         lbc_sdram_init();
466 #endif
467
468         debug("DDR: ");
469         gd->ram_size = dram_size;
470
471         return 0;
472 }
473 #endif /* CONFIG_SYS_RAMBOOT */
474 #endif
475
476 #if CONFIG_POST & CONFIG_SYS_POST_MEMORY
477
478 /* Board-specific functions defined in each board's ddr.c */
479 void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
480         unsigned int ctrl_num, unsigned int dimm_slots_per_ctrl);
481 void read_tlbcam_entry(int idx, u32 *valid, u32 *tsize, unsigned long *epn,
482                        phys_addr_t *rpn);
483 unsigned int
484         setup_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg);
485
486 void clear_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg);
487
488 static void dump_spd_ddr_reg(void)
489 {
490         int i, j, k, m;
491         u8 *p_8;
492         u32 *p_32;
493         struct ccsr_ddr __iomem *ddr[CONFIG_SYS_NUM_DDR_CTLRS];
494         generic_spd_eeprom_t
495                 spd[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR];
496
497         for (i = 0; i < CONFIG_SYS_NUM_DDR_CTLRS; i++)
498                 fsl_ddr_get_spd(spd[i], i, CONFIG_DIMM_SLOTS_PER_CTLR);
499
500         puts("SPD data of all dimms (zero value is omitted)...\n");
501         puts("Byte (hex)  ");
502         k = 1;
503         for (i = 0; i < CONFIG_SYS_NUM_DDR_CTLRS; i++) {
504                 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++)
505                         printf("Dimm%d ", k++);
506         }
507         puts("\n");
508         for (k = 0; k < sizeof(generic_spd_eeprom_t); k++) {
509                 m = 0;
510                 printf("%3d (0x%02x)  ", k, k);
511                 for (i = 0; i < CONFIG_SYS_NUM_DDR_CTLRS; i++) {
512                         for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
513                                 p_8 = (u8 *) &spd[i][j];
514                                 if (p_8[k]) {
515                                         printf("0x%02x  ", p_8[k]);
516                                         m++;
517                                 } else
518                                         puts("      ");
519                         }
520                 }
521                 if (m)
522                         puts("\n");
523                 else
524                         puts("\r");
525         }
526
527         for (i = 0; i < CONFIG_SYS_NUM_DDR_CTLRS; i++) {
528                 switch (i) {
529                 case 0:
530                         ddr[i] = (void *)CONFIG_SYS_FSL_DDR_ADDR;
531                         break;
532 #if defined(CONFIG_SYS_FSL_DDR2_ADDR) && (CONFIG_SYS_NUM_DDR_CTLRS > 1)
533                 case 1:
534                         ddr[i] = (void *)CONFIG_SYS_FSL_DDR2_ADDR;
535                         break;
536 #endif
537 #if defined(CONFIG_SYS_FSL_DDR3_ADDR) && (CONFIG_SYS_NUM_DDR_CTLRS > 2)
538                 case 2:
539                         ddr[i] = (void *)CONFIG_SYS_FSL_DDR3_ADDR;
540                         break;
541 #endif
542 #if defined(CONFIG_SYS_FSL_DDR4_ADDR) && (CONFIG_SYS_NUM_DDR_CTLRS > 3)
543                 case 3:
544                         ddr[i] = (void *)CONFIG_SYS_FSL_DDR4_ADDR;
545                         break;
546 #endif
547                 default:
548                         printf("%s unexpected controller number = %u\n",
549                                 __func__, i);
550                         return;
551                 }
552         }
553         printf("DDR registers dump for all controllers "
554                 "(zero value is omitted)...\n");
555         puts("Offset (hex)   ");
556         for (i = 0; i < CONFIG_SYS_NUM_DDR_CTLRS; i++)
557                 printf("     Base + 0x%04x", (u32)ddr[i] & 0xFFFF);
558         puts("\n");
559         for (k = 0; k < sizeof(struct ccsr_ddr)/4; k++) {
560                 m = 0;
561                 printf("%6d (0x%04x)", k * 4, k * 4);
562                 for (i = 0; i < CONFIG_SYS_NUM_DDR_CTLRS; i++) {
563                         p_32 = (u32 *) ddr[i];
564                         if (p_32[k]) {
565                                 printf("        0x%08x", p_32[k]);
566                                 m++;
567                         } else
568                                 puts("                  ");
569                 }
570                 if (m)
571                         puts("\n");
572                 else
573                         puts("\r");
574         }
575         puts("\n");
576 }
577
578 /* invalid the TLBs for DDR and setup new ones to cover p_addr */
579 static int reset_tlb(phys_addr_t p_addr, u32 size, phys_addr_t *phys_offset)
580 {
581         u32 vstart = CONFIG_SYS_DDR_SDRAM_BASE;
582         unsigned long epn;
583         u32 tsize, valid, ptr;
584         int ddr_esel;
585
586         clear_ddr_tlbs_phys(p_addr, size>>20);
587
588         /* Setup new tlb to cover the physical address */
589         setup_ddr_tlbs_phys(p_addr, size>>20);
590
591         ptr = vstart;
592         ddr_esel = find_tlb_idx((void *)ptr, 1);
593         if (ddr_esel != -1) {
594                 read_tlbcam_entry(ddr_esel, &valid, &tsize, &epn, phys_offset);
595         } else {
596                 printf("TLB error in function %s\n", __func__);
597                 return -1;
598         }
599
600         return 0;
601 }
602
603 /*
604  * slide the testing window up to test another area
605  * for 32_bit system, the maximum testable memory is limited to
606  * CONFIG_MAX_MEM_MAPPED
607  */
608 int arch_memory_test_advance(u32 *vstart, u32 *size, phys_addr_t *phys_offset)
609 {
610         phys_addr_t test_cap, p_addr;
611         phys_size_t p_size = min(gd->ram_size, CONFIG_MAX_MEM_MAPPED);
612
613 #if !defined(CONFIG_PHYS_64BIT) || \
614     !defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS) || \
615         (CONFIG_SYS_INIT_RAM_ADDR_PHYS < 0x100000000ull)
616                 test_cap = p_size;
617 #else
618                 test_cap = gd->ram_size;
619 #endif
620         p_addr = (*vstart) + (*size) + (*phys_offset);
621         if (p_addr < test_cap - 1) {
622                 p_size = min(test_cap - p_addr, CONFIG_MAX_MEM_MAPPED);
623                 if (reset_tlb(p_addr, p_size, phys_offset) == -1)
624                         return -1;
625                 *vstart = CONFIG_SYS_DDR_SDRAM_BASE;
626                 *size = (u32) p_size;
627                 printf("Testing 0x%08llx - 0x%08llx\n",
628                         (u64)(*vstart) + (*phys_offset),
629                         (u64)(*vstart) + (*phys_offset) + (*size) - 1);
630         } else
631                 return 1;
632
633         return 0;
634 }
635
636 /* initialization for testing area */
637 int arch_memory_test_prepare(u32 *vstart, u32 *size, phys_addr_t *phys_offset)
638 {
639         phys_size_t p_size = min(gd->ram_size, CONFIG_MAX_MEM_MAPPED);
640
641         *vstart = CONFIG_SYS_DDR_SDRAM_BASE;
642         *size = (u32) p_size;   /* CONFIG_MAX_MEM_MAPPED < 4G */
643         *phys_offset = 0;
644
645 #if !defined(CONFIG_PHYS_64BIT) || \
646     !defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS) || \
647         (CONFIG_SYS_INIT_RAM_ADDR_PHYS < 0x100000000ull)
648                 if (gd->ram_size > CONFIG_MAX_MEM_MAPPED) {
649                         puts("Cannot test more than ");
650                         print_size(CONFIG_MAX_MEM_MAPPED,
651                                 " without proper 36BIT support.\n");
652                 }
653 #endif
654         printf("Testing 0x%08llx - 0x%08llx\n",
655                 (u64)(*vstart) + (*phys_offset),
656                 (u64)(*vstart) + (*phys_offset) + (*size) - 1);
657
658         return 0;
659 }
660
661 /* invalid TLBs for DDR and remap as normal after testing */
662 int arch_memory_test_cleanup(u32 *vstart, u32 *size, phys_addr_t *phys_offset)
663 {
664         unsigned long epn;
665         u32 tsize, valid, ptr;
666         phys_addr_t rpn = 0;
667         int ddr_esel;
668
669         /* disable the TLBs for this testing */
670         ptr = *vstart;
671
672         while (ptr < (*vstart) + (*size)) {
673                 ddr_esel = find_tlb_idx((void *)ptr, 1);
674                 if (ddr_esel != -1) {
675                         read_tlbcam_entry(ddr_esel, &valid, &tsize, &epn, &rpn);
676                         disable_tlb(ddr_esel);
677                 }
678                 ptr += TSIZE_TO_BYTES(tsize);
679         }
680
681         puts("Remap DDR ");
682         setup_ddr_tlbs(gd->ram_size>>20);
683         puts("\n");
684
685         return 0;
686 }
687
688 void arch_memory_failure_handle(void)
689 {
690         dump_spd_ddr_reg();
691 }
692 #endif