xref: /rk3399_rockchip-uboot/board/freescale/t104xrdb/t104xrdb.c (revision 723806cc5bea9f8b37323dfd7568603f99af6a06)
1062ef1a6SPriyanka Jain /*
2062ef1a6SPriyanka Jain  * Copyright 2013 Freescale Semiconductor, Inc.
3062ef1a6SPriyanka Jain  *
4062ef1a6SPriyanka Jain  * SPDX-License-Identifier:	GPL-2.0+
5062ef1a6SPriyanka Jain  */
6062ef1a6SPriyanka Jain 
7062ef1a6SPriyanka Jain #include <common.h>
8062ef1a6SPriyanka Jain #include <command.h>
9d4683776SZhao Qiang #include <hwconfig.h>
10062ef1a6SPriyanka Jain #include <netdev.h>
11062ef1a6SPriyanka Jain #include <linux/compiler.h>
12062ef1a6SPriyanka Jain #include <asm/mmu.h>
13062ef1a6SPriyanka Jain #include <asm/processor.h>
14062ef1a6SPriyanka Jain #include <asm/cache.h>
15062ef1a6SPriyanka Jain #include <asm/immap_85xx.h>
16d4683776SZhao Qiang #include <asm/fsl_fdt.h>
17062ef1a6SPriyanka Jain #include <asm/fsl_law.h>
18062ef1a6SPriyanka Jain #include <asm/fsl_serdes.h>
19062ef1a6SPriyanka Jain #include <asm/fsl_liodn.h>
20062ef1a6SPriyanka Jain #include <fm_eth.h>
2100233528STang Yuantian #include "../common/sleep.h"
22062ef1a6SPriyanka Jain #include "t104xrdb.h"
2355153d6cSPrabhakar Kushwaha #include "cpld.h"
24062ef1a6SPriyanka Jain 
25062ef1a6SPriyanka Jain DECLARE_GLOBAL_DATA_PTR;
26062ef1a6SPriyanka Jain 
checkboard(void)27062ef1a6SPriyanka Jain int checkboard(void)
28062ef1a6SPriyanka Jain {
29062ef1a6SPriyanka Jain 	struct cpu_type *cpu = gd->arch.cpu;
3055153d6cSPrabhakar Kushwaha 	u8 sw;
31062ef1a6SPriyanka Jain 
3278e56995SYork Sun #if defined(CONFIG_TARGET_T1040D4RDB) || defined(CONFIG_TARGET_T1042D4RDB)
334b6067aeSPriyanka Jain 	printf("Board: %sD4RDB\n", cpu->name);
344b6067aeSPriyanka Jain #else
35062ef1a6SPriyanka Jain 	printf("Board: %sRDB\n", cpu->name);
364b6067aeSPriyanka Jain #endif
3755153d6cSPrabhakar Kushwaha 	printf("Board rev: 0x%02x CPLD ver: 0x%02x, ",
3855153d6cSPrabhakar Kushwaha 	       CPLD_READ(hw_ver), CPLD_READ(sw_ver));
3955153d6cSPrabhakar Kushwaha 
4055153d6cSPrabhakar Kushwaha 	sw = CPLD_READ(flash_ctl_status);
4155153d6cSPrabhakar Kushwaha 	sw = ((sw & CPLD_LBMAP_MASK) >> CPLD_LBMAP_SHIFT);
4255153d6cSPrabhakar Kushwaha 
4355153d6cSPrabhakar Kushwaha 	printf("vBank: %d\n", sw);
4455153d6cSPrabhakar Kushwaha 
45062ef1a6SPriyanka Jain 	return 0;
46062ef1a6SPriyanka Jain }
47062ef1a6SPriyanka Jain 
board_early_init_f(void)4800233528STang Yuantian int board_early_init_f(void)
4900233528STang Yuantian {
5000233528STang Yuantian #if defined(CONFIG_DEEP_SLEEP)
5100233528STang Yuantian 	if (is_warm_boot())
5200233528STang Yuantian 		fsl_dp_disable_console();
5300233528STang Yuantian #endif
5400233528STang Yuantian 
5500233528STang Yuantian 	return 0;
5600233528STang Yuantian }
5700233528STang Yuantian 
board_early_init_r(void)58062ef1a6SPriyanka Jain int board_early_init_r(void)
59062ef1a6SPriyanka Jain {
60062ef1a6SPriyanka Jain #ifdef CONFIG_SYS_FLASH_BASE
61062ef1a6SPriyanka Jain 	const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
629d045682SYork Sun 	int flash_esel = find_tlb_idx((void *)flashbase, 1);
63062ef1a6SPriyanka Jain 
64062ef1a6SPriyanka Jain 	/*
65062ef1a6SPriyanka Jain 	 * Remap Boot flash region to caching-inhibited
66062ef1a6SPriyanka Jain 	 * so that flash can be erased properly.
67062ef1a6SPriyanka Jain 	 */
68062ef1a6SPriyanka Jain 
69062ef1a6SPriyanka Jain 	/* Flush d-cache and invalidate i-cache of any FLASH data */
70062ef1a6SPriyanka Jain 	flush_dcache();
71062ef1a6SPriyanka Jain 	invalidate_icache();
72062ef1a6SPriyanka Jain 
739d045682SYork Sun 	if (flash_esel == -1) {
749d045682SYork Sun 		/* very unlikely unless something is messed up */
759d045682SYork Sun 		puts("Error: Could not find TLB for FLASH BASE\n");
769d045682SYork Sun 		flash_esel = 2;	/* give our best effort to continue */
779d045682SYork Sun 	} else {
78062ef1a6SPriyanka Jain 		/* invalidate existing TLB entry for flash */
79062ef1a6SPriyanka Jain 		disable_tlb(flash_esel);
809d045682SYork Sun 	}
81062ef1a6SPriyanka Jain 
82062ef1a6SPriyanka Jain 	set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
83062ef1a6SPriyanka Jain 		MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
84062ef1a6SPriyanka Jain 		0, flash_esel, BOOKE_PAGESZ_256M, 1);
85062ef1a6SPriyanka Jain #endif
86062ef1a6SPriyanka Jain 	return 0;
87062ef1a6SPriyanka Jain }
88062ef1a6SPriyanka Jain 
misc_init_r(void)89062ef1a6SPriyanka Jain int misc_init_r(void)
90062ef1a6SPriyanka Jain {
914b6067aeSPriyanka Jain 	ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
924b6067aeSPriyanka Jain 	u32 srds_s1;
934b6067aeSPriyanka Jain 
944b6067aeSPriyanka Jain 	srds_s1 = in_be32(&gur->rcwsr[4]) >> 24;
954b6067aeSPriyanka Jain 
964b6067aeSPriyanka Jain 	printf("SERDES Reference : 0x%X\n", srds_s1);
974b6067aeSPriyanka Jain 
984b6067aeSPriyanka Jain 	/* select SGMII*/
994b6067aeSPriyanka Jain 	if (srds_s1 == 0x86)
1004b6067aeSPriyanka Jain 		CPLD_WRITE(misc_ctl_status, CPLD_READ(misc_ctl_status) |
1014b6067aeSPriyanka Jain 					 MISC_CTL_SG_SEL);
1024b6067aeSPriyanka Jain 
1034b6067aeSPriyanka Jain 	/* select SGMII and Aurora*/
1044b6067aeSPriyanka Jain 	if (srds_s1 == 0x8E)
1054b6067aeSPriyanka Jain 		CPLD_WRITE(misc_ctl_status, CPLD_READ(misc_ctl_status) |
1064b6067aeSPriyanka Jain 					 MISC_CTL_SG_SEL | MISC_CTL_AURORA_SEL);
1074b6067aeSPriyanka Jain 
108a016735cSYork Sun #if defined(CONFIG_TARGET_T1040D4RDB)
109d4683776SZhao Qiang 	if (hwconfig("qe-tdm")) {
110d4683776SZhao Qiang 		CPLD_WRITE(sfp_ctl_status, CPLD_READ(sfp_ctl_status) |
111d4683776SZhao Qiang 			   MISC_MUX_QE_TDM);
112d4683776SZhao Qiang 		printf("QECSR : 0x%02x, mux to qe-tdm\n",
113d4683776SZhao Qiang 		       CPLD_READ(sfp_ctl_status));
114d4683776SZhao Qiang 	}
1154b6067aeSPriyanka Jain 	/* Mask all CPLD interrupt sources, except QSGMII interrupts */
1164b6067aeSPriyanka Jain 	if (CPLD_READ(sw_ver) < 0x03) {
1174b6067aeSPriyanka Jain 		debug("CPLD SW version 0x%02x doesn't support int_mask\n",
1184b6067aeSPriyanka Jain 		      CPLD_READ(sw_ver));
1194b6067aeSPriyanka Jain 	} else {
1204b6067aeSPriyanka Jain 		CPLD_WRITE(int_mask, CPLD_INT_MASK_ALL &
1214b6067aeSPriyanka Jain 			   ~(CPLD_INT_MASK_QSGMII1 | CPLD_INT_MASK_QSGMII2));
1224b6067aeSPriyanka Jain 	}
1234b6067aeSPriyanka Jain #endif
1244b6067aeSPriyanka Jain 
125062ef1a6SPriyanka Jain 	return 0;
126062ef1a6SPriyanka Jain }
127062ef1a6SPriyanka Jain 
ft_board_setup(void * blob,bd_t * bd)128e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
129062ef1a6SPriyanka Jain {
130062ef1a6SPriyanka Jain 	phys_addr_t base;
131062ef1a6SPriyanka Jain 	phys_size_t size;
132062ef1a6SPriyanka Jain 
133062ef1a6SPriyanka Jain 	ft_cpu_setup(blob, bd);
134062ef1a6SPriyanka Jain 
135*723806ccSSimon Glass 	base = env_get_bootm_low();
136*723806ccSSimon Glass 	size = env_get_bootm_size();
137062ef1a6SPriyanka Jain 
138062ef1a6SPriyanka Jain 	fdt_fixup_memory(blob, (u64)base, (u64)size);
139062ef1a6SPriyanka Jain 
140062ef1a6SPriyanka Jain #ifdef CONFIG_PCI
141062ef1a6SPriyanka Jain 	pci_of_setup(blob, bd);
142062ef1a6SPriyanka Jain #endif
143062ef1a6SPriyanka Jain 
144062ef1a6SPriyanka Jain 	fdt_fixup_liodn(blob);
145062ef1a6SPriyanka Jain 
146062ef1a6SPriyanka Jain #ifdef CONFIG_HAS_FSL_DR_USB
147a5c289b9SSriram Dash 	fsl_fdt_fixup_dr_usb(blob, bd);
148062ef1a6SPriyanka Jain #endif
149062ef1a6SPriyanka Jain 
150062ef1a6SPriyanka Jain #ifdef CONFIG_SYS_DPAA_FMAN
151062ef1a6SPriyanka Jain 	fdt_fixup_fman_ethernet(blob);
152062ef1a6SPriyanka Jain #endif
153e895a4b0SSimon Glass 
154d4683776SZhao Qiang 	if (hwconfig("qe-tdm"))
155d4683776SZhao Qiang 		fdt_del_diu(blob);
156e895a4b0SSimon Glass 	return 0;
157062ef1a6SPriyanka Jain }
158