]> Git Repo - J-u-boot.git/blob - arch/arm/cpu/armv8/fsl-layerscape/soc.c
c53131f74af27bd0b6757a92aa6128d4abfade35
[J-u-boot.git] / arch / arm / cpu / armv8 / fsl-layerscape / soc.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2014-2015 Freescale Semiconductor
4  */
5
6 #include <common.h>
7 #include <fsl_immap.h>
8 #include <fsl_ifc.h>
9 #include <asm/arch/fsl_serdes.h>
10 #include <asm/arch/soc.h>
11 #include <asm/io.h>
12 #include <asm/global_data.h>
13 #include <asm/arch-fsl-layerscape/config.h>
14 #include <asm/arch-fsl-layerscape/ns_access.h>
15 #include <asm/arch-fsl-layerscape/fsl_icid.h>
16 #ifdef CONFIG_LAYERSCAPE_NS_ACCESS
17 #include <fsl_csu.h>
18 #endif
19 #ifdef CONFIG_SYS_FSL_DDR
20 #include <fsl_ddr_sdram.h>
21 #include <fsl_ddr.h>
22 #endif
23 #ifdef CONFIG_CHAIN_OF_TRUST
24 #include <fsl_validate.h>
25 #endif
26 #include <fsl_immap.h>
27 #ifdef CONFIG_TFABOOT
28 #include <environment.h>
29 DECLARE_GLOBAL_DATA_PTR;
30 #endif
31
32 bool soc_has_dp_ddr(void)
33 {
34         struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
35         u32 svr = gur_in32(&gur->svr);
36
37         /* LS2085A, LS2088A, LS2048A has DP_DDR */
38         if ((SVR_SOC_VER(svr) == SVR_LS2085A) ||
39             (SVR_SOC_VER(svr) == SVR_LS2088A) ||
40             (SVR_SOC_VER(svr) == SVR_LS2048A))
41                 return true;
42
43         return false;
44 }
45
46 bool soc_has_aiop(void)
47 {
48         struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
49         u32 svr = gur_in32(&gur->svr);
50
51         /* LS2085A has AIOP */
52         if (SVR_SOC_VER(svr) == SVR_LS2085A)
53                 return true;
54
55         return false;
56 }
57
58 static inline void set_usb_txvreftune(u32 __iomem *scfg, u32 offset)
59 {
60         scfg_clrsetbits32(scfg + offset / 4,
61                         0xF << 6,
62                         SCFG_USB_TXVREFTUNE << 6);
63 }
64
65 static void erratum_a009008(void)
66 {
67 #ifdef CONFIG_SYS_FSL_ERRATUM_A009008
68         u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
69
70 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
71         defined(CONFIG_ARCH_LS1012A)
72         set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB1);
73 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
74         set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB2);
75         set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB3);
76 #endif
77 #elif defined(CONFIG_ARCH_LS2080A)
78         set_usb_txvreftune(scfg, SCFG_USB3PRM1CR);
79 #endif
80 #endif /* CONFIG_SYS_FSL_ERRATUM_A009008 */
81 }
82
83 static inline void set_usb_sqrxtune(u32 __iomem *scfg, u32 offset)
84 {
85         scfg_clrbits32(scfg + offset / 4,
86                         SCFG_USB_SQRXTUNE_MASK << 23);
87 }
88
89 static void erratum_a009798(void)
90 {
91 #ifdef CONFIG_SYS_FSL_ERRATUM_A009798
92         u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
93
94 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
95         defined(CONFIG_ARCH_LS1012A)
96         set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB1);
97 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
98         set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB2);
99         set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB3);
100 #endif
101 #elif defined(CONFIG_ARCH_LS2080A)
102         set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR);
103 #endif
104 #endif /* CONFIG_SYS_FSL_ERRATUM_A009798 */
105 }
106
107 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
108         defined(CONFIG_ARCH_LS1012A)
109 static inline void set_usb_pcstxswingfull(u32 __iomem *scfg, u32 offset)
110 {
111         scfg_clrsetbits32(scfg + offset / 4,
112                         0x7F << 9,
113                         SCFG_USB_PCSTXSWINGFULL << 9);
114 }
115 #endif
116
117 static void erratum_a008997(void)
118 {
119 #ifdef CONFIG_SYS_FSL_ERRATUM_A008997
120 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
121         defined(CONFIG_ARCH_LS1012A)
122         u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
123
124         set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB1);
125 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
126         set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB2);
127         set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB3);
128 #endif
129 #elif defined(CONFIG_ARCH_LS1028A)
130         clrsetbits_le32(DCSR_BASE +  DCSR_USB_IOCR1,
131                         0x7F << 11,
132                         DCSR_USB_PCSTXSWINGFULL << 11);
133 #endif
134 #endif /* CONFIG_SYS_FSL_ERRATUM_A008997 */
135 }
136
137 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
138         defined(CONFIG_ARCH_LS1012A)
139
140 #define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy)      \
141         out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1);      \
142         out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_2);      \
143         out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3);      \
144         out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4)
145
146 #elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A) || \
147         defined(CONFIG_ARCH_LS1028A)
148
149 #define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy)      \
150         out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1); \
151         out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_2); \
152         out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3); \
153         out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4)
154
155 #endif
156
157 static void erratum_a009007(void)
158 {
159 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
160         defined(CONFIG_ARCH_LS1012A)
161         void __iomem *usb_phy = (void __iomem *)SCFG_USB_PHY1;
162
163         PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
164 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
165         usb_phy = (void __iomem *)SCFG_USB_PHY2;
166         PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
167
168         usb_phy = (void __iomem *)SCFG_USB_PHY3;
169         PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
170 #endif
171 #elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A) || \
172         defined(CONFIG_ARCH_LS1028A)
173         void __iomem *dcsr = (void __iomem *)DCSR_BASE;
174
175         PROGRAM_USB_PHY_RX_OVRD_IN_HI(dcsr + DCSR_USB_PHY1);
176         PROGRAM_USB_PHY_RX_OVRD_IN_HI(dcsr + DCSR_USB_PHY2);
177 #endif /* CONFIG_SYS_FSL_ERRATUM_A009007 */
178 }
179
180 #if defined(CONFIG_FSL_LSCH3)
181 /*
182  * This erratum requires setting a value to eddrtqcr1 to
183  * optimal the DDR performance.
184  */
185 static void erratum_a008336(void)
186 {
187 #ifdef CONFIG_SYS_FSL_ERRATUM_A008336
188         u32 *eddrtqcr1;
189
190 #ifdef CONFIG_SYS_FSL_DCSR_DDR_ADDR
191         eddrtqcr1 = (void *)CONFIG_SYS_FSL_DCSR_DDR_ADDR + 0x800;
192         if (fsl_ddr_get_version(0) == 0x50200)
193                 out_le32(eddrtqcr1, 0x63b30002);
194 #endif
195 #ifdef CONFIG_SYS_FSL_DCSR_DDR2_ADDR
196         eddrtqcr1 = (void *)CONFIG_SYS_FSL_DCSR_DDR2_ADDR + 0x800;
197         if (fsl_ddr_get_version(0) == 0x50200)
198                 out_le32(eddrtqcr1, 0x63b30002);
199 #endif
200 #endif
201 }
202
203 /*
204  * This erratum requires a register write before being Memory
205  * controller 3 being enabled.
206  */
207 static void erratum_a008514(void)
208 {
209 #ifdef CONFIG_SYS_FSL_ERRATUM_A008514
210         u32 *eddrtqcr1;
211
212 #ifdef CONFIG_SYS_FSL_DCSR_DDR3_ADDR
213         eddrtqcr1 = (void *)CONFIG_SYS_FSL_DCSR_DDR3_ADDR + 0x800;
214         out_le32(eddrtqcr1, 0x63b20002);
215 #endif
216 #endif
217 }
218 #ifdef CONFIG_SYS_FSL_ERRATUM_A009635
219 #define PLATFORM_CYCLE_ENV_VAR  "a009635_interval_val"
220
221 static unsigned long get_internval_val_mhz(void)
222 {
223         char *interval = env_get(PLATFORM_CYCLE_ENV_VAR);
224         /*
225          *  interval is the number of platform cycles(MHz) between
226          *  wake up events generated by EPU.
227          */
228         ulong interval_mhz = get_bus_freq(0) / (1000 * 1000);
229
230         if (interval)
231                 interval_mhz = simple_strtoul(interval, NULL, 10);
232
233         return interval_mhz;
234 }
235
236 void erratum_a009635(void)
237 {
238         u32 val;
239         unsigned long interval_mhz = get_internval_val_mhz();
240
241         if (!interval_mhz)
242                 return;
243
244         val = in_le32(DCSR_CGACRE5);
245         writel(val | 0x00000200, DCSR_CGACRE5);
246
247         val = in_le32(EPU_EPCMPR5);
248         writel(interval_mhz, EPU_EPCMPR5);
249         val = in_le32(EPU_EPCCR5);
250         writel(val | 0x82820000, EPU_EPCCR5);
251         val = in_le32(EPU_EPSMCR5);
252         writel(val | 0x002f0000, EPU_EPSMCR5);
253         val = in_le32(EPU_EPECR5);
254         writel(val | 0x20000000, EPU_EPECR5);
255         val = in_le32(EPU_EPGCR);
256         writel(val | 0x80000000, EPU_EPGCR);
257 }
258 #endif  /* CONFIG_SYS_FSL_ERRATUM_A009635 */
259
260 static void erratum_rcw_src(void)
261 {
262 #if defined(CONFIG_SPL) && defined(CONFIG_NAND_BOOT)
263         u32 __iomem *dcfg_ccsr = (u32 __iomem *)DCFG_BASE;
264         u32 __iomem *dcfg_dcsr = (u32 __iomem *)DCFG_DCSR_BASE;
265         u32 val;
266
267         val = in_le32(dcfg_ccsr + DCFG_PORSR1 / 4);
268         val &= ~DCFG_PORSR1_RCW_SRC;
269         val |= DCFG_PORSR1_RCW_SRC_NOR;
270         out_le32(dcfg_dcsr + DCFG_DCSR_PORCR1 / 4, val);
271 #endif
272 }
273
274 #define I2C_DEBUG_REG 0x6
275 #define I2C_GLITCH_EN 0x8
276 /*
277  * This erratum requires setting glitch_en bit to enable
278  * digital glitch filter to improve clock stability.
279  */
280 #ifdef CONFIG_SYS_FSL_ERRATUM_A009203
281 static void erratum_a009203(void)
282 {
283 #ifdef CONFIG_SYS_I2C
284         u8 __iomem *ptr;
285 #ifdef I2C1_BASE_ADDR
286         ptr = (u8 __iomem *)(I2C1_BASE_ADDR + I2C_DEBUG_REG);
287
288         writeb(I2C_GLITCH_EN, ptr);
289 #endif
290 #ifdef I2C2_BASE_ADDR
291         ptr = (u8 __iomem *)(I2C2_BASE_ADDR + I2C_DEBUG_REG);
292
293         writeb(I2C_GLITCH_EN, ptr);
294 #endif
295 #ifdef I2C3_BASE_ADDR
296         ptr = (u8 __iomem *)(I2C3_BASE_ADDR + I2C_DEBUG_REG);
297
298         writeb(I2C_GLITCH_EN, ptr);
299 #endif
300 #ifdef I2C4_BASE_ADDR
301         ptr = (u8 __iomem *)(I2C4_BASE_ADDR + I2C_DEBUG_REG);
302
303         writeb(I2C_GLITCH_EN, ptr);
304 #endif
305 #endif
306 }
307 #endif
308
309 void bypass_smmu(void)
310 {
311         u32 val;
312         val = (in_le32(SMMU_SCR0) | SCR0_CLIENTPD_MASK) & ~(SCR0_USFCFG_MASK);
313         out_le32(SMMU_SCR0, val);
314         val = (in_le32(SMMU_NSCR0) | SCR0_CLIENTPD_MASK) & ~(SCR0_USFCFG_MASK);
315         out_le32(SMMU_NSCR0, val);
316 }
317 void fsl_lsch3_early_init_f(void)
318 {
319         erratum_rcw_src();
320 #ifdef CONFIG_FSL_IFC
321         init_early_memctl_regs();       /* tighten IFC timing */
322 #endif
323 #ifdef CONFIG_SYS_FSL_ERRATUM_A009203
324         erratum_a009203();
325 #endif
326         erratum_a008514();
327         erratum_a008336();
328         erratum_a009008();
329         erratum_a009798();
330         erratum_a008997();
331         erratum_a009007();
332 #ifdef CONFIG_CHAIN_OF_TRUST
333         /* In case of Secure Boot, the IBR configures the SMMU
334         * to allow only Secure transactions.
335         * SMMU must be reset in bypass mode.
336         * Set the ClientPD bit and Clear the USFCFG Bit
337         */
338         if (fsl_check_boot_mode_secure() == 1)
339                 bypass_smmu();
340 #endif
341 }
342
343 /* Get VDD in the unit mV from voltage ID */
344 int get_core_volt_from_fuse(void)
345 {
346         struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
347         int vdd;
348         u32 fusesr;
349         u8 vid;
350
351         /* get the voltage ID from fuse status register */
352         fusesr = in_le32(&gur->dcfg_fusesr);
353         debug("%s: fusesr = 0x%x\n", __func__, fusesr);
354         vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT) &
355                 FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK;
356         if ((vid == 0) || (vid == FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK)) {
357                 vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT) &
358                         FSL_CHASSIS3_DCFG_FUSESR_VID_MASK;
359         }
360         debug("%s: VID = 0x%x\n", __func__, vid);
361         switch (vid) {
362         case 0x00: /* VID isn't supported */
363                 vdd = -EINVAL;
364                 debug("%s: The VID feature is not supported\n", __func__);
365                 break;
366         case 0x08: /* 0.9V silicon */
367                 vdd = 900;
368                 break;
369         case 0x10: /* 1.0V silicon */
370                 vdd = 1000;
371                 break;
372         default:  /* Other core voltage */
373                 vdd = -EINVAL;
374                 debug("%s: The VID(%x) isn't supported\n", __func__, vid);
375                 break;
376         }
377         debug("%s: The required minimum volt of CORE is %dmV\n", __func__, vdd);
378
379         return vdd;
380 }
381
382 #elif defined(CONFIG_FSL_LSCH2)
383
384 static void erratum_a009929(void)
385 {
386 #ifdef CONFIG_SYS_FSL_ERRATUM_A009929
387         struct ccsr_gur *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
388         u32 __iomem *dcsr_cop_ccp = (void *)CONFIG_SYS_DCSR_COP_CCP_ADDR;
389         u32 rstrqmr1 = gur_in32(&gur->rstrqmr1);
390
391         rstrqmr1 |= 0x00000400;
392         gur_out32(&gur->rstrqmr1, rstrqmr1);
393         writel(0x01000000, dcsr_cop_ccp);
394 #endif
395 }
396
397 /*
398  * This erratum requires setting a value to eddrtqcr1 to optimal
399  * the DDR performance. The eddrtqcr1 register is in SCFG space
400  * of LS1043A and the offset is 0x157_020c.
401  */
402 #if defined(CONFIG_SYS_FSL_ERRATUM_A009660) \
403         && defined(CONFIG_SYS_FSL_ERRATUM_A008514)
404 #error A009660 and A008514 can not be both enabled.
405 #endif
406
407 static void erratum_a009660(void)
408 {
409 #ifdef CONFIG_SYS_FSL_ERRATUM_A009660
410         u32 *eddrtqcr1 = (void *)CONFIG_SYS_FSL_SCFG_ADDR + 0x20c;
411         out_be32(eddrtqcr1, 0x63b20042);
412 #endif
413 }
414
415 static void erratum_a008850_early(void)
416 {
417 #ifdef CONFIG_SYS_FSL_ERRATUM_A008850
418         /* part 1 of 2 */
419         struct ccsr_cci400 __iomem *cci = (void *)(CONFIG_SYS_IMMR +
420                                                 CONFIG_SYS_CCI400_OFFSET);
421         struct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;
422
423         /* Skip if running at lower exception level */
424         if (current_el() < 3)
425                 return;
426
427         /* disables propagation of barrier transactions to DDRC from CCI400 */
428         out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
429
430         /* disable the re-ordering in DDRC */
431         ddr_out32(&ddr->eor, DDR_EOR_RD_REOD_DIS | DDR_EOR_WD_REOD_DIS);
432 #endif
433 }
434
435 void erratum_a008850_post(void)
436 {
437 #ifdef CONFIG_SYS_FSL_ERRATUM_A008850
438         /* part 2 of 2 */
439         struct ccsr_cci400 __iomem *cci = (void *)(CONFIG_SYS_IMMR +
440                                                 CONFIG_SYS_CCI400_OFFSET);
441         struct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;
442         u32 tmp;
443
444         /* Skip if running at lower exception level */
445         if (current_el() < 3)
446                 return;
447
448         /* enable propagation of barrier transactions to DDRC from CCI400 */
449         out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
450
451         /* enable the re-ordering in DDRC */
452         tmp = ddr_in32(&ddr->eor);
453         tmp &= ~(DDR_EOR_RD_REOD_DIS | DDR_EOR_WD_REOD_DIS);
454         ddr_out32(&ddr->eor, tmp);
455 #endif
456 }
457
458 #ifdef CONFIG_SYS_FSL_ERRATUM_A010315
459 void erratum_a010315(void)
460 {
461         int i;
462
463         for (i = PCIE1; i <= PCIE4; i++)
464                 if (!is_serdes_configured(i)) {
465                         debug("PCIe%d: disabled all R/W permission!\n", i);
466                         set_pcie_ns_access(i, 0);
467                 }
468 }
469 #endif
470
471 static void erratum_a010539(void)
472 {
473 #if defined(CONFIG_SYS_FSL_ERRATUM_A010539) && defined(CONFIG_QSPI_BOOT)
474         struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
475         u32 porsr1;
476
477         porsr1 = in_be32(&gur->porsr1);
478         porsr1 &= ~FSL_CHASSIS2_CCSR_PORSR1_RCW_MASK;
479         out_be32((void *)(CONFIG_SYS_DCSR_DCFG_ADDR + DCFG_DCSR_PORCR1),
480                  porsr1);
481         out_be32((void *)(CONFIG_SYS_FSL_SCFG_ADDR + 0x1a8), 0xffffffff);
482 #endif
483 }
484
485 /* Get VDD in the unit mV from voltage ID */
486 int get_core_volt_from_fuse(void)
487 {
488         struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
489         int vdd;
490         u32 fusesr;
491         u8 vid;
492
493         fusesr = in_be32(&gur->dcfg_fusesr);
494         debug("%s: fusesr = 0x%x\n", __func__, fusesr);
495         vid = (fusesr >> FSL_CHASSIS2_DCFG_FUSESR_ALTVID_SHIFT) &
496                 FSL_CHASSIS2_DCFG_FUSESR_ALTVID_MASK;
497         if ((vid == 0) || (vid == FSL_CHASSIS2_DCFG_FUSESR_ALTVID_MASK)) {
498                 vid = (fusesr >> FSL_CHASSIS2_DCFG_FUSESR_VID_SHIFT) &
499                         FSL_CHASSIS2_DCFG_FUSESR_VID_MASK;
500         }
501         debug("%s: VID = 0x%x\n", __func__, vid);
502         switch (vid) {
503         case 0x00: /* VID isn't supported */
504                 vdd = -EINVAL;
505                 debug("%s: The VID feature is not supported\n", __func__);
506                 break;
507         case 0x08: /* 0.9V silicon */
508                 vdd = 900;
509                 break;
510         case 0x10: /* 1.0V silicon */
511                 vdd = 1000;
512                 break;
513         default:  /* Other core voltage */
514                 vdd = -EINVAL;
515                 printf("%s: The VID(%x) isn't supported\n", __func__, vid);
516                 break;
517         }
518         debug("%s: The required minimum volt of CORE is %dmV\n", __func__, vdd);
519
520         return vdd;
521 }
522
523 __weak int board_switch_core_volt(u32 vdd)
524 {
525         return 0;
526 }
527
528 static int setup_core_volt(u32 vdd)
529 {
530         return board_setup_core_volt(vdd);
531 }
532
533 #ifdef CONFIG_SYS_FSL_DDR
534 static void ddr_enable_0v9_volt(bool en)
535 {
536         struct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;
537         u32 tmp;
538
539         tmp = ddr_in32(&ddr->ddr_cdr1);
540
541         if (en)
542                 tmp |= DDR_CDR1_V0PT9_EN;
543         else
544                 tmp &= ~DDR_CDR1_V0PT9_EN;
545
546         ddr_out32(&ddr->ddr_cdr1, tmp);
547 }
548 #endif
549
550 int setup_chip_volt(void)
551 {
552         int vdd;
553
554         vdd = get_core_volt_from_fuse();
555         /* Nothing to do for silicons doesn't support VID */
556         if (vdd < 0)
557                 return vdd;
558
559         if (setup_core_volt(vdd))
560                 printf("%s: Switch core VDD to %dmV failed\n", __func__, vdd);
561 #ifdef CONFIG_SYS_HAS_SERDES
562         if (setup_serdes_volt(vdd))
563                 printf("%s: Switch SVDD to %dmV failed\n", __func__, vdd);
564 #endif
565
566 #ifdef CONFIG_SYS_FSL_DDR
567         if (vdd == 900)
568                 ddr_enable_0v9_volt(true);
569 #endif
570
571         return 0;
572 }
573
574 #ifdef CONFIG_FSL_PFE
575 void init_pfe_scfg_dcfg_regs(void)
576 {
577         struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
578         u32 ecccr2;
579
580         out_be32(&scfg->pfeasbcr,
581                  in_be32(&scfg->pfeasbcr) | SCFG_PFEASBCR_AWCACHE0);
582         out_be32(&scfg->pfebsbcr,
583                  in_be32(&scfg->pfebsbcr) | SCFG_PFEASBCR_AWCACHE0);
584
585         /* CCI-400 QoS settings for PFE */
586         out_be32(&scfg->wr_qos1, (unsigned int)(SCFG_WR_QOS1_PFE1_QOS
587                  | SCFG_WR_QOS1_PFE2_QOS));
588         out_be32(&scfg->rd_qos1, (unsigned int)(SCFG_RD_QOS1_PFE1_QOS
589                  | SCFG_RD_QOS1_PFE2_QOS));
590
591         ecccr2 = in_be32(CONFIG_SYS_DCSR_DCFG_ADDR + DCFG_DCSR_ECCCR2);
592         out_be32((void *)CONFIG_SYS_DCSR_DCFG_ADDR + DCFG_DCSR_ECCCR2,
593                  ecccr2 | (unsigned int)DISABLE_PFE_ECC);
594 }
595 #endif
596
597 void fsl_lsch2_early_init_f(void)
598 {
599         struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
600                                         CONFIG_SYS_CCI400_OFFSET);
601         struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
602 #if defined(CONFIG_FSL_QSPI) && defined(CONFIG_TFABOOT)
603         enum boot_src src;
604 #endif
605
606 #ifdef CONFIG_LAYERSCAPE_NS_ACCESS
607         enable_layerscape_ns_access();
608 #endif
609
610 #ifdef CONFIG_FSL_IFC
611         init_early_memctl_regs();       /* tighten IFC timing */
612 #endif
613
614 #if defined(CONFIG_FSL_QSPI) && defined(CONFIG_TFABOOT)
615         src = get_boot_src();
616         if (src != BOOT_SOURCE_QSPI_NOR)
617                 out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL);
618 #else
619 #if defined(CONFIG_FSL_QSPI) && !defined(CONFIG_QSPI_BOOT)
620         out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL);
621 #endif
622 #endif
623         /* Make SEC reads and writes snoopable */
624         setbits_be32(&scfg->snpcnfgcr, SCFG_SNPCNFGCR_SECRDSNP |
625                      SCFG_SNPCNFGCR_SECWRSNP |
626                      SCFG_SNPCNFGCR_SATARDSNP |
627                      SCFG_SNPCNFGCR_SATAWRSNP);
628
629         /*
630          * Enable snoop requests and DVM message requests for
631          * Slave insterface S4 (A53 core cluster)
632          */
633         if (current_el() == 3) {
634                 out_le32(&cci->slave[4].snoop_ctrl,
635                          CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
636         }
637
638         /*
639          * Program Central Security Unit (CSU) to grant access
640          * permission for USB 2.0 controller
641          */
642 #if defined(CONFIG_ARCH_LS1012A) && defined(CONFIG_USB_EHCI_FSL)
643         if (current_el() == 3)
644                 set_devices_ns_access(CSU_CSLX_USB_2, CSU_ALL_RW);
645 #endif
646         /* Erratum */
647         erratum_a008850_early(); /* part 1 of 2 */
648         erratum_a009929();
649         erratum_a009660();
650         erratum_a010539();
651         erratum_a009008();
652         erratum_a009798();
653         erratum_a008997();
654         erratum_a009007();
655
656 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
657         set_icids();
658 #endif
659 }
660 #endif
661
662 #ifdef CONFIG_QSPI_AHB_INIT
663 /* Enable 4bytes address support and fast read */
664 int qspi_ahb_init(void)
665 {
666         u32 *qspi_lut, lut_key, *qspi_key;
667
668         qspi_key = (void *)SYS_FSL_QSPI_ADDR + 0x300;
669         qspi_lut = (void *)SYS_FSL_QSPI_ADDR + 0x310;
670
671         lut_key = in_be32(qspi_key);
672
673         if (lut_key == 0x5af05af0) {
674                 /* That means the register is BE */
675                 out_be32(qspi_key, 0x5af05af0);
676                 /* Unlock the lut table */
677                 out_be32(qspi_key + 1, 0x00000002);
678                 out_be32(qspi_lut, 0x0820040c);
679                 out_be32(qspi_lut + 1, 0x1c080c08);
680                 out_be32(qspi_lut + 2, 0x00002400);
681                 /* Lock the lut table */
682                 out_be32(qspi_key, 0x5af05af0);
683                 out_be32(qspi_key + 1, 0x00000001);
684         } else {
685                 /* That means the register is LE */
686                 out_le32(qspi_key, 0x5af05af0);
687                 /* Unlock the lut table */
688                 out_le32(qspi_key + 1, 0x00000002);
689                 out_le32(qspi_lut, 0x0820040c);
690                 out_le32(qspi_lut + 1, 0x1c080c08);
691                 out_le32(qspi_lut + 2, 0x00002400);
692                 /* Lock the lut table */
693                 out_le32(qspi_key, 0x5af05af0);
694                 out_le32(qspi_key + 1, 0x00000001);
695         }
696
697         return 0;
698 }
699 #endif
700
701 #ifdef CONFIG_TFABOOT
702 #define MAX_BOOTCMD_SIZE        512
703
704 int fsl_setenv_bootcmd(void)
705 {
706         int ret;
707         enum boot_src src = get_boot_src();
708         char bootcmd_str[MAX_BOOTCMD_SIZE];
709
710         switch (src) {
711 #ifdef IFC_NOR_BOOTCOMMAND
712         case BOOT_SOURCE_IFC_NOR:
713                 sprintf(bootcmd_str, IFC_NOR_BOOTCOMMAND);
714                 break;
715 #endif
716 #ifdef QSPI_NOR_BOOTCOMMAND
717         case BOOT_SOURCE_QSPI_NOR:
718                 sprintf(bootcmd_str, QSPI_NOR_BOOTCOMMAND);
719                 break;
720 #endif
721 #ifdef XSPI_NOR_BOOTCOMMAND
722         case BOOT_SOURCE_XSPI_NOR:
723                 sprintf(bootcmd_str, XSPI_NOR_BOOTCOMMAND);
724                 break;
725 #endif
726 #ifdef IFC_NAND_BOOTCOMMAND
727         case BOOT_SOURCE_IFC_NAND:
728                 sprintf(bootcmd_str, IFC_NAND_BOOTCOMMAND);
729                 break;
730 #endif
731 #ifdef QSPI_NAND_BOOTCOMMAND
732         case BOOT_SOURCE_QSPI_NAND:
733                 sprintf(bootcmd_str, QSPI_NAND_BOOTCOMMAND);
734                 break;
735 #endif
736 #ifdef XSPI_NAND_BOOTCOMMAND
737         case BOOT_SOURCE_XSPI_NAND:
738                 sprintf(bootcmd_str, XSPI_NAND_BOOTCOMMAND);
739                 break;
740 #endif
741 #ifdef SD_BOOTCOMMAND
742         case BOOT_SOURCE_SD_MMC:
743                 sprintf(bootcmd_str, SD_BOOTCOMMAND);
744                 break;
745 #endif
746 #ifdef SD2_BOOTCOMMAND
747         case BOOT_SOURCE_SD_MMC2:
748                 sprintf(bootcmd_str, SD2_BOOTCOMMAND);
749                 break;
750 #endif
751         default:
752 #ifdef QSPI_NOR_BOOTCOMMAND
753                 sprintf(bootcmd_str, QSPI_NOR_BOOTCOMMAND);
754 #endif
755                 break;
756         }
757
758         ret = env_set("bootcmd", bootcmd_str);
759         if (ret) {
760                 printf("Failed to set bootcmd: ret = %d\n", ret);
761                 return ret;
762         }
763         return 0;
764 }
765
766 int fsl_setenv_mcinitcmd(void)
767 {
768         int ret = 0;
769         enum boot_src src = get_boot_src();
770
771         switch (src) {
772 #ifdef IFC_MC_INIT_CMD
773         case BOOT_SOURCE_IFC_NAND:
774         case BOOT_SOURCE_IFC_NOR:
775         ret = env_set("mcinitcmd", IFC_MC_INIT_CMD);
776                 break;
777 #endif
778 #ifdef QSPI_MC_INIT_CMD
779         case BOOT_SOURCE_QSPI_NAND:
780         case BOOT_SOURCE_QSPI_NOR:
781         ret = env_set("mcinitcmd", QSPI_MC_INIT_CMD);
782                 break;
783 #endif
784 #ifdef XSPI_MC_INIT_CMD
785         case BOOT_SOURCE_XSPI_NAND:
786         case BOOT_SOURCE_XSPI_NOR:
787         ret = env_set("mcinitcmd", XSPI_MC_INIT_CMD);
788                 break;
789 #endif
790 #ifdef SD_MC_INIT_CMD
791         case BOOT_SOURCE_SD_MMC:
792         ret = env_set("mcinitcmd", SD_MC_INIT_CMD);
793                 break;
794 #endif
795 #ifdef SD2_MC_INIT_CMD
796         case BOOT_SOURCE_SD_MMC2:
797         ret = env_set("mcinitcmd", SD2_MC_INIT_CMD);
798                 break;
799 #endif
800         default:
801 #ifdef QSPI_MC_INIT_CMD
802         ret = env_set("mcinitcmd", QSPI_MC_INIT_CMD);
803 #endif
804                 break;
805         }
806
807         if (ret) {
808                 printf("Failed to set mcinitcmd: ret = %d\n", ret);
809                 return ret;
810         }
811         return 0;
812 }
813 #endif
814
815 #ifdef CONFIG_BOARD_LATE_INIT
816 int board_late_init(void)
817 {
818 #ifdef CONFIG_CHAIN_OF_TRUST
819         fsl_setenv_chain_of_trust();
820 #endif
821 #ifdef CONFIG_TFABOOT
822         /*
823          * check if gd->env_addr is default_environment; then setenv bootcmd
824          * and mcinitcmd.
825          */
826         if (gd->env_addr + gd->reloc_off == (ulong)&default_environment[0]) {
827                 fsl_setenv_bootcmd();
828                 fsl_setenv_mcinitcmd();
829         }
830
831         /*
832          * If the boot mode is secure, default environment is not present then
833          * setenv command needs to be run by default
834          */
835 #ifdef CONFIG_CHAIN_OF_TRUST
836         if ((fsl_check_boot_mode_secure() == 1)) {
837                 fsl_setenv_bootcmd();
838                 fsl_setenv_mcinitcmd();
839         }
840 #endif
841 #endif
842 #ifdef CONFIG_QSPI_AHB_INIT
843         qspi_ahb_init();
844 #endif
845
846         return 0;
847 }
848 #endif
This page took 0.064943 seconds and 2 git commands to generate.