1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2007 Wind River Systemes, Inc. <www.windriver.com>
3*4882a593Smuzhiyun * Copyright 2007 Embedded Specialties, Inc.
4*4882a593Smuzhiyun * Joe Hamman joe.hamman@embeddedspecialties.com
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright 2004 Freescale Semiconductor.
7*4882a593Smuzhiyun * Jeff Brown
8*4882a593Smuzhiyun * Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include <common.h>
16*4882a593Smuzhiyun #include <command.h>
17*4882a593Smuzhiyun #include <pci.h>
18*4882a593Smuzhiyun #include <asm/processor.h>
19*4882a593Smuzhiyun #include <asm/immap_86xx.h>
20*4882a593Smuzhiyun #include <asm/fsl_pci.h>
21*4882a593Smuzhiyun #include <fsl_ddr_sdram.h>
22*4882a593Smuzhiyun #include <asm/fsl_serdes.h>
23*4882a593Smuzhiyun #include <linux/libfdt.h>
24*4882a593Smuzhiyun #include <fdt_support.h>
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun long int fixed_sdram (void);
29*4882a593Smuzhiyun
board_early_init_f(void)30*4882a593Smuzhiyun int board_early_init_f (void)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun return 0;
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun
checkboard(void)35*4882a593Smuzhiyun int checkboard (void)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun puts ("Board: Wind River SBC8641D\n");
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun return 0;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun
dram_init(void)42*4882a593Smuzhiyun int dram_init(void)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun long dram_size = 0;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun #if defined(CONFIG_SPD_EEPROM)
47*4882a593Smuzhiyun dram_size = fsl_ddr_sdram();
48*4882a593Smuzhiyun #else
49*4882a593Smuzhiyun dram_size = fixed_sdram ();
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun debug (" DDR: ");
53*4882a593Smuzhiyun gd->ram_size = dram_size;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun return 0;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun #if defined(CONFIG_SYS_DRAM_TEST)
testdram(void)59*4882a593Smuzhiyun int testdram (void)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
62*4882a593Smuzhiyun uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
63*4882a593Smuzhiyun uint *p;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun puts ("SDRAM test phase 1:\n");
66*4882a593Smuzhiyun for (p = pstart; p < pend; p++)
67*4882a593Smuzhiyun *p = 0xaaaaaaaa;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun for (p = pstart; p < pend; p++) {
70*4882a593Smuzhiyun if (*p != 0xaaaaaaaa) {
71*4882a593Smuzhiyun printf ("SDRAM test fails at: %08x\n", (uint) p);
72*4882a593Smuzhiyun return 1;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun puts ("SDRAM test phase 2:\n");
77*4882a593Smuzhiyun for (p = pstart; p < pend; p++)
78*4882a593Smuzhiyun *p = 0x55555555;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun for (p = pstart; p < pend; p++) {
81*4882a593Smuzhiyun if (*p != 0x55555555) {
82*4882a593Smuzhiyun printf ("SDRAM test fails at: %08x\n", (uint) p);
83*4882a593Smuzhiyun return 1;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun puts ("SDRAM test passed.\n");
88*4882a593Smuzhiyun return 0;
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun #if !defined(CONFIG_SPD_EEPROM)
93*4882a593Smuzhiyun /*
94*4882a593Smuzhiyun * Fixed sdram init -- doesn't use serial presence detect.
95*4882a593Smuzhiyun */
fixed_sdram(void)96*4882a593Smuzhiyun long int fixed_sdram (void)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun #if !defined(CONFIG_SYS_RAMBOOT)
99*4882a593Smuzhiyun volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
100*4882a593Smuzhiyun volatile struct ccsr_ddr *ddr = &immap->im_ddr1;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun ddr->cs0_bnds = CONFIG_SYS_DDR_CS0_BNDS;
103*4882a593Smuzhiyun ddr->cs1_bnds = CONFIG_SYS_DDR_CS1_BNDS;
104*4882a593Smuzhiyun ddr->cs2_bnds = CONFIG_SYS_DDR_CS2_BNDS;
105*4882a593Smuzhiyun ddr->cs3_bnds = CONFIG_SYS_DDR_CS3_BNDS;
106*4882a593Smuzhiyun ddr->cs0_config = CONFIG_SYS_DDR_CS0_CONFIG;
107*4882a593Smuzhiyun ddr->cs1_config = CONFIG_SYS_DDR_CS1_CONFIG;
108*4882a593Smuzhiyun ddr->cs2_config = CONFIG_SYS_DDR_CS2_CONFIG;
109*4882a593Smuzhiyun ddr->cs3_config = CONFIG_SYS_DDR_CS3_CONFIG;
110*4882a593Smuzhiyun ddr->timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3;
111*4882a593Smuzhiyun ddr->timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0;
112*4882a593Smuzhiyun ddr->timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
113*4882a593Smuzhiyun ddr->timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;
114*4882a593Smuzhiyun ddr->sdram_cfg = CONFIG_SYS_DDR_CFG_1A;
115*4882a593Smuzhiyun ddr->sdram_cfg_2 = CONFIG_SYS_DDR_CFG_2;
116*4882a593Smuzhiyun ddr->sdram_mode = CONFIG_SYS_DDR_MODE_1;
117*4882a593Smuzhiyun ddr->sdram_mode_2 = CONFIG_SYS_DDR_MODE_2;
118*4882a593Smuzhiyun ddr->sdram_md_cntl = CONFIG_SYS_DDR_MODE_CTL;
119*4882a593Smuzhiyun ddr->sdram_interval = CONFIG_SYS_DDR_INTERVAL;
120*4882a593Smuzhiyun ddr->sdram_data_init = CONFIG_SYS_DDR_DATA_INIT;
121*4882a593Smuzhiyun ddr->sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun asm ("sync;isync");
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun udelay (500);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun ddr->sdram_cfg = CONFIG_SYS_DDR_CFG_1B;
128*4882a593Smuzhiyun asm ("sync; isync");
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun udelay (500);
131*4882a593Smuzhiyun ddr = &immap->im_ddr2;
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun ddr->cs0_bnds = CONFIG_SYS_DDR2_CS0_BNDS;
134*4882a593Smuzhiyun ddr->cs1_bnds = CONFIG_SYS_DDR2_CS1_BNDS;
135*4882a593Smuzhiyun ddr->cs2_bnds = CONFIG_SYS_DDR2_CS2_BNDS;
136*4882a593Smuzhiyun ddr->cs3_bnds = CONFIG_SYS_DDR2_CS3_BNDS;
137*4882a593Smuzhiyun ddr->cs0_config = CONFIG_SYS_DDR2_CS0_CONFIG;
138*4882a593Smuzhiyun ddr->cs1_config = CONFIG_SYS_DDR2_CS1_CONFIG;
139*4882a593Smuzhiyun ddr->cs2_config = CONFIG_SYS_DDR2_CS2_CONFIG;
140*4882a593Smuzhiyun ddr->cs3_config = CONFIG_SYS_DDR2_CS3_CONFIG;
141*4882a593Smuzhiyun ddr->timing_cfg_3 = CONFIG_SYS_DDR2_EXT_REFRESH;
142*4882a593Smuzhiyun ddr->timing_cfg_0 = CONFIG_SYS_DDR2_TIMING_0;
143*4882a593Smuzhiyun ddr->timing_cfg_1 = CONFIG_SYS_DDR2_TIMING_1;
144*4882a593Smuzhiyun ddr->timing_cfg_2 = CONFIG_SYS_DDR2_TIMING_2;
145*4882a593Smuzhiyun ddr->sdram_cfg = CONFIG_SYS_DDR2_CFG_1A;
146*4882a593Smuzhiyun ddr->sdram_cfg_2 = CONFIG_SYS_DDR2_CFG_2;
147*4882a593Smuzhiyun ddr->sdram_mode = CONFIG_SYS_DDR2_MODE_1;
148*4882a593Smuzhiyun ddr->sdram_mode_2 = CONFIG_SYS_DDR2_MODE_2;
149*4882a593Smuzhiyun ddr->sdram_md_cntl = CONFIG_SYS_DDR2_MODE_CTL;
150*4882a593Smuzhiyun ddr->sdram_interval = CONFIG_SYS_DDR2_INTERVAL;
151*4882a593Smuzhiyun ddr->sdram_data_init = CONFIG_SYS_DDR2_DATA_INIT;
152*4882a593Smuzhiyun ddr->sdram_clk_cntl = CONFIG_SYS_DDR2_CLK_CTRL;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun asm ("sync;isync");
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun udelay (500);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun ddr->sdram_cfg = CONFIG_SYS_DDR2_CFG_1B;
159*4882a593Smuzhiyun asm ("sync; isync");
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun udelay (500);
162*4882a593Smuzhiyun #endif
163*4882a593Smuzhiyun return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun #endif /* !defined(CONFIG_SPD_EEPROM) */
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun #if defined(CONFIG_PCI)
168*4882a593Smuzhiyun /*
169*4882a593Smuzhiyun * Initialize PCI Devices, report devices found.
170*4882a593Smuzhiyun */
171*4882a593Smuzhiyun
pci_init_board(void)172*4882a593Smuzhiyun void pci_init_board(void)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun fsl_pcie_init_board(0);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun #endif /* CONFIG_PCI */
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)180*4882a593Smuzhiyun int ft_board_setup(void *blob, bd_t *bd)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun ft_cpu_setup(blob, bd);
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun FT_FSL_PCI_SETUP;
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun return 0;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun #endif
189*4882a593Smuzhiyun
sbc8641d_reset_board(void)190*4882a593Smuzhiyun void sbc8641d_reset_board (void)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun puts ("Resetting board....\n");
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun /*
196*4882a593Smuzhiyun * get_board_sys_clk
197*4882a593Smuzhiyun * Clock is fixed at 1GHz on this board. Used for CONFIG_SYS_CLK_FREQ
198*4882a593Smuzhiyun */
199*4882a593Smuzhiyun
get_board_sys_clk(ulong dummy)200*4882a593Smuzhiyun unsigned long get_board_sys_clk (ulong dummy)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun int i;
203*4882a593Smuzhiyun ulong val = 0;
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun i = 5;
206*4882a593Smuzhiyun i &= 0x07;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun switch (i) {
209*4882a593Smuzhiyun case 0:
210*4882a593Smuzhiyun val = 33000000;
211*4882a593Smuzhiyun break;
212*4882a593Smuzhiyun case 1:
213*4882a593Smuzhiyun val = 40000000;
214*4882a593Smuzhiyun break;
215*4882a593Smuzhiyun case 2:
216*4882a593Smuzhiyun val = 50000000;
217*4882a593Smuzhiyun break;
218*4882a593Smuzhiyun case 3:
219*4882a593Smuzhiyun val = 66000000;
220*4882a593Smuzhiyun break;
221*4882a593Smuzhiyun case 4:
222*4882a593Smuzhiyun val = 83000000;
223*4882a593Smuzhiyun break;
224*4882a593Smuzhiyun case 5:
225*4882a593Smuzhiyun val = 100000000;
226*4882a593Smuzhiyun break;
227*4882a593Smuzhiyun case 6:
228*4882a593Smuzhiyun val = 134000000;
229*4882a593Smuzhiyun break;
230*4882a593Smuzhiyun case 7:
231*4882a593Smuzhiyun val = 166000000;
232*4882a593Smuzhiyun break;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun return val;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
board_reset(void)238*4882a593Smuzhiyun void board_reset(void)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun #ifdef CONFIG_SYS_RESET_ADDRESS
241*4882a593Smuzhiyun ulong addr = CONFIG_SYS_RESET_ADDRESS;
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /* flush and disable I/D cache */
244*4882a593Smuzhiyun __asm__ __volatile__ ("mfspr 3, 1008" ::: "r3");
245*4882a593Smuzhiyun __asm__ __volatile__ ("ori 5, 5, 0xcc00" ::: "r5");
246*4882a593Smuzhiyun __asm__ __volatile__ ("ori 4, 3, 0xc00" ::: "r4");
247*4882a593Smuzhiyun __asm__ __volatile__ ("andc 5, 3, 5" ::: "r5");
248*4882a593Smuzhiyun __asm__ __volatile__ ("sync");
249*4882a593Smuzhiyun __asm__ __volatile__ ("mtspr 1008, 4");
250*4882a593Smuzhiyun __asm__ __volatile__ ("isync");
251*4882a593Smuzhiyun __asm__ __volatile__ ("sync");
252*4882a593Smuzhiyun __asm__ __volatile__ ("mtspr 1008, 5");
253*4882a593Smuzhiyun __asm__ __volatile__ ("isync");
254*4882a593Smuzhiyun __asm__ __volatile__ ("sync");
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun /*
257*4882a593Smuzhiyun * SRR0 has system reset vector, SRR1 has default MSR value
258*4882a593Smuzhiyun * rfi restores MSR from SRR1 and sets the PC to the SRR0 value
259*4882a593Smuzhiyun */
260*4882a593Smuzhiyun __asm__ __volatile__ ("mtspr 26, %0" :: "r" (addr));
261*4882a593Smuzhiyun __asm__ __volatile__ ("li 4, (1 << 6)" ::: "r4");
262*4882a593Smuzhiyun __asm__ __volatile__ ("mtspr 27, 4");
263*4882a593Smuzhiyun __asm__ __volatile__ ("rfi");
264*4882a593Smuzhiyun #endif
265*4882a593Smuzhiyun }
266