]>
Commit | Line | Data |
---|---|---|
5e918a98 KP |
1 | /* |
2 | * Copyright (C) 2007 Freescale Semiconductor, Inc. | |
3 | * Kevin Lam <[email protected]> | |
4 | * Joe D'Abbraccio <joe.d'[email protected]> | |
5 | * | |
1a459660 | 6 | * SPDX-License-Identifier: GPL-2.0+ |
5e918a98 KP |
7 | */ |
8 | ||
9 | #include <common.h> | |
c9646ed7 | 10 | #include <hwconfig.h> |
5e918a98 | 11 | #include <i2c.h> |
5e918a98 | 12 | #include <asm/io.h> |
7e1afb62 | 13 | #include <asm/fsl_mpc83xx_serdes.h> |
1ac4f320 | 14 | #include <fdt_support.h> |
5e918a98 | 15 | #include <spd_sdram.h> |
89c7784e | 16 | #include <vsc7385.h> |
c9646ed7 | 17 | #include <fsl_esdhc.h> |
89c7784e | 18 | |
088454cd SG |
19 | DECLARE_GLOBAL_DATA_PTR; |
20 | ||
6d0f6bcf | 21 | #if defined(CONFIG_SYS_DRAM_TEST) |
5e918a98 KP |
22 | int |
23 | testdram(void) | |
24 | { | |
6d0f6bcf JCPV |
25 | uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START; |
26 | uint *pend = (uint *) CONFIG_SYS_MEMTEST_END; | |
5e918a98 KP |
27 | uint *p; |
28 | ||
29 | printf("Testing DRAM from 0x%08x to 0x%08x\n", | |
6d0f6bcf JCPV |
30 | CONFIG_SYS_MEMTEST_START, |
31 | CONFIG_SYS_MEMTEST_END); | |
5e918a98 KP |
32 | |
33 | printf("DRAM test phase 1:\n"); | |
34 | for (p = pstart; p < pend; p++) | |
35 | *p = 0xaaaaaaaa; | |
36 | ||
37 | for (p = pstart; p < pend; p++) { | |
38 | if (*p != 0xaaaaaaaa) { | |
39 | printf("DRAM test fails at: %08x\n", (uint) p); | |
40 | return 1; | |
41 | } | |
42 | } | |
43 | ||
44 | printf("DRAM test phase 2:\n"); | |
45 | for (p = pstart; p < pend; p++) | |
46 | *p = 0x55555555; | |
47 | ||
48 | for (p = pstart; p < pend; p++) { | |
49 | if (*p != 0x55555555) { | |
50 | printf("DRAM test fails at: %08x\n", (uint) p); | |
51 | return 1; | |
52 | } | |
53 | } | |
54 | ||
55 | printf("DRAM test passed.\n"); | |
56 | return 0; | |
57 | } | |
58 | #endif | |
59 | ||
9adda545 | 60 | #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) |
5e918a98 KP |
61 | void ddr_enable_ecc(unsigned int dram_size); |
62 | #endif | |
63 | int fixed_sdram(void); | |
64 | ||
088454cd | 65 | int initdram(void) |
5e918a98 | 66 | { |
6d0f6bcf | 67 | immap_t *im = (immap_t *) CONFIG_SYS_IMMR; |
5e918a98 KP |
68 | u32 msize = 0; |
69 | ||
70 | if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) | |
088454cd | 71 | return -ENXIO; |
5e918a98 KP |
72 | |
73 | #if defined(CONFIG_SPD_EEPROM) | |
74 | msize = spd_sdram(); | |
75 | #else | |
76 | msize = fixed_sdram(); | |
77 | #endif | |
78 | ||
9adda545 | 79 | #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) |
5e918a98 KP |
80 | /* Initialize DDR ECC byte */ |
81 | ddr_enable_ecc(msize * 1024 * 1024); | |
82 | #endif | |
83 | /* return total bus DDR size(bytes) */ | |
088454cd SG |
84 | gd->ram_size = msize * 1024 * 1024; |
85 | ||
86 | return 0; | |
5e918a98 KP |
87 | } |
88 | ||
89 | #if !defined(CONFIG_SPD_EEPROM) | |
90 | /************************************************************************* | |
91 | * fixed sdram init -- doesn't use serial presence detect. | |
92 | ************************************************************************/ | |
93 | int fixed_sdram(void) | |
94 | { | |
6d0f6bcf JCPV |
95 | immap_t *im = (immap_t *) CONFIG_SYS_IMMR; |
96 | u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024; | |
5e918a98 KP |
97 | u32 msize_log2 = __ilog2(msize); |
98 | ||
6d0f6bcf | 99 | im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000; |
5e918a98 KP |
100 | im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); |
101 | ||
6d0f6bcf | 102 | im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR_VALUE; |
5e918a98 KP |
103 | udelay(50000); |
104 | ||
6d0f6bcf | 105 | im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL; |
5e918a98 KP |
106 | udelay(1000); |
107 | ||
6d0f6bcf JCPV |
108 | im->ddr.csbnds[0].csbnds = CONFIG_SYS_DDR_CS0_BNDS; |
109 | im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG; | |
5e918a98 KP |
110 | udelay(1000); |
111 | ||
6d0f6bcf JCPV |
112 | im->ddr.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0; |
113 | im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1; | |
114 | im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2; | |
115 | im->ddr.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3; | |
116 | im->ddr.sdram_cfg = CONFIG_SYS_DDR_SDRAM_CFG; | |
117 | im->ddr.sdram_cfg2 = CONFIG_SYS_DDR_SDRAM_CFG2; | |
118 | im->ddr.sdram_mode = CONFIG_SYS_DDR_MODE; | |
119 | im->ddr.sdram_mode2 = CONFIG_SYS_DDR_MODE2; | |
120 | im->ddr.sdram_interval = CONFIG_SYS_DDR_INTERVAL; | |
5e918a98 KP |
121 | sync(); |
122 | udelay(1000); | |
123 | ||
124 | im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; | |
125 | udelay(2000); | |
6d0f6bcf | 126 | return CONFIG_SYS_DDR_SIZE; |
5e918a98 | 127 | } |
6d0f6bcf | 128 | #endif /*!CONFIG_SYS_SPD_EEPROM */ |
5e918a98 KP |
129 | |
130 | int checkboard(void) | |
131 | { | |
132 | puts("Board: Freescale MPC837xERDB\n"); | |
133 | return 0; | |
134 | } | |
135 | ||
2bd7460e AV |
136 | int board_early_init_f(void) |
137 | { | |
138 | #ifdef CONFIG_FSL_SERDES | |
6d0f6bcf | 139 | immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; |
2bd7460e AV |
140 | u32 spridr = in_be32(&immr->sysconf.spridr); |
141 | ||
142 | /* we check only part num, and don't look for CPU revisions */ | |
e5c4ade4 KP |
143 | switch (PARTID_NO_E(spridr)) { |
144 | case SPR_8377: | |
2bd7460e AV |
145 | fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, |
146 | FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); | |
e5c4ade4 | 147 | fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, |
2bd7460e AV |
148 | FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); |
149 | break; | |
e5c4ade4 | 150 | case SPR_8378: |
55c53198 | 151 | fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, |
2bd7460e AV |
152 | FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); |
153 | break; | |
e5c4ade4 | 154 | case SPR_8379: |
2bd7460e AV |
155 | fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, |
156 | FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); | |
e5c4ade4 | 157 | fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA, |
2bd7460e AV |
158 | FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); |
159 | break; | |
160 | default: | |
161 | printf("serdes not configured: unknown CPU part number: " | |
162 | "%04x\n", spridr >> 16); | |
163 | break; | |
164 | } | |
165 | #endif /* CONFIG_FSL_SERDES */ | |
166 | return 0; | |
167 | } | |
168 | ||
c9646ed7 AV |
169 | #ifdef CONFIG_FSL_ESDHC |
170 | int board_mmc_init(bd_t *bd) | |
171 | { | |
172 | struct immap __iomem *im = (struct immap __iomem *)CONFIG_SYS_IMMR; | |
19e5118d SA |
173 | char buffer[HWCONFIG_BUFFER_SIZE] = {0}; |
174 | int esdhc_hwconfig_enabled = 0; | |
c9646ed7 | 175 | |
19e5118d SA |
176 | if (getenv_f("hwconfig", buffer, sizeof(buffer)) > 0) |
177 | esdhc_hwconfig_enabled = hwconfig_f("esdhc", buffer); | |
178 | ||
179 | if (esdhc_hwconfig_enabled == 0) | |
c9646ed7 AV |
180 | return 0; |
181 | ||
182 | clrsetbits_be32(&im->sysconf.sicrl, SICRL_USB_B, SICRL_USB_B_SD); | |
183 | clrsetbits_be32(&im->sysconf.sicrh, SICRH_SPI, SICRH_SPI_SD); | |
184 | ||
185 | return fsl_esdhc_mmc_init(bd); | |
186 | } | |
187 | #endif | |
188 | ||
89c7784e TT |
189 | /* |
190 | * Miscellaneous late-boot configurations | |
191 | * | |
192 | * If a VSC7385 microcode image is present, then upload it. | |
193 | */ | |
194 | int misc_init_r(void) | |
195 | { | |
196 | int rc = 0; | |
197 | ||
198 | #ifdef CONFIG_VSC7385_IMAGE | |
199 | if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE, | |
200 | CONFIG_VSC7385_IMAGE_SIZE)) { | |
201 | puts("Failure uploading VSC7385 microcode.\n"); | |
202 | rc = 1; | |
203 | } | |
204 | #endif | |
205 | ||
206 | return rc; | |
207 | } | |
208 | ||
5e918a98 KP |
209 | #if defined(CONFIG_OF_BOARD_SETUP) |
210 | ||
e895a4b0 | 211 | int ft_board_setup(void *blob, bd_t *bd) |
5e918a98 KP |
212 | { |
213 | #ifdef CONFIG_PCI | |
214 | ft_pci_setup(blob, bd); | |
215 | #endif | |
216 | ft_cpu_setup(blob, bd); | |
a5c289b9 | 217 | fsl_fdt_fixup_dr_usb(blob, bd); |
c9646ed7 | 218 | fdt_fixup_esdhc(blob, bd); |
e895a4b0 SG |
219 | |
220 | return 0; | |
5e918a98 KP |
221 | } |
222 | #endif /* CONFIG_OF_BOARD_SETUP */ |