blob: 6473ee05728487f462451694c14f945f783b6de6 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +05302/*
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +05303 * Copyright 2017-2018 NXP
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +05304 */
5
6#include <common.h>
Simon Glass3bbe70c2019-12-28 10:44:54 -07007#include <fdt_support.h>
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +05308#include <i2c.h>
Simon Glass274e0b02020-05-10 11:39:56 -06009#include <asm/cache.h>
Simon Glass97589732020-05-10 11:40:02 -060010#include <init.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060011#include <asm/global_data.h>
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053012#include <asm/io.h>
13#include <asm/arch/clock.h>
14#include <asm/arch/fsl_serdes.h>
Prabhakar Kushwaha74d129b2017-01-30 17:05:35 +053015#ifdef CONFIG_FSL_LS_PPA
16#include <asm/arch/ppa.h>
17#endif
York Sun729f2d12017-03-06 09:02:34 -080018#include <asm/arch/mmu.h>
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053019#include <asm/arch/soc.h>
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053020#include <fsl_esdhc.h>
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053021#include <hwconfig.h>
Simon Glass9d1f6192019-08-02 09:44:25 -060022#include <env_internal.h>
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053023#include <fsl_mmdc.h>
24#include <netdev.h>
Vinitha V Pillaiad698c32018-05-23 11:03:31 +053025#include <fsl_sec.h>
Mian Yousaf Kaukab2529deae2021-04-14 12:33:58 +020026#include <net/pfe_eth/pfe/pfe_hw.h>
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053027
28DECLARE_GLOBAL_DATA_PTR;
29
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053030static inline int get_board_version(void)
31{
Pramod Kumar46d752a2018-08-14 09:49:55 +053032 uint32_t val;
33#ifdef CONFIG_TARGET_LS1012AFRDM
34 val = 0;
35#else
36 struct ccsr_gpio *pgpio = (void *)(GPIO2_BASE_ADDR);
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053037
Pramod Kumar46d752a2018-08-14 09:49:55 +053038 val = in_be32(&pgpio->gpdat) & BOARD_REV_MASK;/*Get GPIO2 11,12,14*/
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053039
Pramod Kumar46d752a2018-08-14 09:49:55 +053040#endif
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053041 return val;
42}
43
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053044int checkboard(void)
45{
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053046#ifdef CONFIG_TARGET_LS1012AFRDM
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053047 puts("Board: LS1012AFRDM ");
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053048#else
49 int rev;
50
51 rev = get_board_version();
52
53 puts("Board: FRWY-LS1012A ");
54
55 puts("Version");
56
57 switch (rev) {
Pramod Kumar46d752a2018-08-14 09:49:55 +053058 case BOARD_REV_A_B:
59 puts(": RevA/B ");
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053060 break;
Pramod Kumar46d752a2018-08-14 09:49:55 +053061 case BOARD_REV_C:
62 puts(": RevC ");
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053063 break;
64 default:
65 puts(": unknown");
66 break;
67 }
68#endif
69
70 return 0;
71}
72
73#ifdef CONFIG_TARGET_LS1012AFRWY
74int esdhc_status_fixup(void *blob, const char *compat)
75{
76 char esdhc0_path[] = "/soc/esdhc@1560000";
77 char esdhc1_path[] = "/soc/esdhc@1580000";
78
79 do_fixup_by_path(blob, esdhc0_path, "status", "okay",
80 sizeof("okay"), 1);
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053081
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053082 do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
83 sizeof("disabled"), 1);
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053084 return 0;
85}
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053086#endif
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053087
Rajesh Bhagat487084e2018-11-05 18:03:08 +000088#ifdef CONFIG_TFABOOT
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +053089int dram_init(void)
90{
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +053091#ifdef CONFIG_TARGET_LS1012AFRWY
92 int board_rev;
93#endif
Rajesh Bhagat487084e2018-11-05 18:03:08 +000094
95 gd->ram_size = tfa_get_dram_size();
96
97 if (!gd->ram_size) {
98#ifdef CONFIG_TARGET_LS1012AFRWY
99 board_rev = get_board_version();
100
101 if (board_rev & BOARD_REV_C)
102 gd->ram_size = SYS_SDRAM_SIZE_1024;
103 else
104 gd->ram_size = SYS_SDRAM_SIZE_512;
105#else
106 gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
107#endif
108 }
109 return 0;
110}
111#else
112int dram_init(void)
113{
114#ifdef CONFIG_TARGET_LS1012AFRWY
115 int board_rev;
116#endif
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +0530117 struct fsl_mmdc_info mparam = {
York Sunc1e979b2016-09-26 08:09:25 -0700118 0x04180000, /* mdctl */
119 0x00030035, /* mdpdc */
120 0x12554000, /* mdotc */
121 0xbabf7954, /* mdcfg0 */
122 0xdb328f64, /* mdcfg1 */
123 0x01ff00db, /* mdcfg2 */
124 0x00001680, /* mdmisc */
125 0x0f3c8000, /* mdref */
126 0x00002000, /* mdrwd */
127 0x00bf1023, /* mdor */
128 0x0000003f, /* mdasp */
129 0x0000022a, /* mpodtctrl */
130 0xa1390003, /* mpzqhwctrl */
131 };
132
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +0530133#ifdef CONFIG_TARGET_LS1012AFRWY
134 board_rev = get_board_version();
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530135
Pramod Kumar46d752a2018-08-14 09:49:55 +0530136 if (board_rev == BOARD_REV_C) {
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +0530137 mparam.mdctl = 0x05180000;
138 gd->ram_size = SYS_SDRAM_SIZE_1024;
139 } else {
140 gd->ram_size = SYS_SDRAM_SIZE_512;
141 }
142#else
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530143 gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
Bhaskar Upadhaya5e6f5982018-05-23 11:03:30 +0530144#endif
145 mmdc_init(&mparam);
146
York Sun729f2d12017-03-06 09:02:34 -0800147#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
148 /* This will break-before-make MMU for DDR */
149 update_early_mmu_table();
150#endif
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530151
152 return 0;
153}
Rajesh Bhagat487084e2018-11-05 18:03:08 +0000154#endif
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530155
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530156int board_early_init_f(void)
157{
158 fsl_lsch2_early_init_f();
159
160 return 0;
161}
162
163int board_init(void)
164{
Ashish Kumar11234062017-08-11 11:09:14 +0530165 struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
166 CONFIG_SYS_CCI400_OFFSET);
167
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530168 /*
169 * Set CCI-400 control override register to enable barrier
170 * transaction
171 */
Rajesh Bhagat487084e2018-11-05 18:03:08 +0000172 if (current_el() == 3)
173 out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530174
175#ifdef CONFIG_ENV_IS_NOWHERE
176 gd->env_addr = (ulong)&default_environment[0];
177#endif
178
Vinitha V Pillaiad698c32018-05-23 11:03:31 +0530179#ifdef CONFIG_FSL_CAAM
180 sec_init();
181#endif
182
Prabhakar Kushwaha74d129b2017-01-30 17:05:35 +0530183#ifdef CONFIG_FSL_LS_PPA
184 ppa_init();
185#endif
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530186 return 0;
187}
188
Mian Yousaf Kaukab2529deae2021-04-14 12:33:58 +0200189#ifdef CONFIG_FSL_PFE
190void board_quiesce_devices(void)
191{
192 pfe_command_stop(0, NULL);
193}
194#endif
195
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900196int ft_board_setup(void *blob, struct bd_info *bd)
Prabhakar Kushwaha9e7ee7b2016-06-03 18:41:36 +0530197{
198 arch_fixup_fdt(blob);
199
200 ft_cpu_setup(blob, bd);
201
202 return 0;
203}