xref: /rk3399_rockchip-uboot/board/sbc8641d/sbc8641d.c (revision 0e00a84cdedf7a1949486746225b35984b351eca)
18ac27327SJoe Hamman /*
28ac27327SJoe Hamman  * Copyright 2007 Wind River Systemes, Inc. <www.windriver.com>
38ac27327SJoe Hamman  * Copyright 2007 Embedded Specialties, Inc.
48ac27327SJoe Hamman  * Joe Hamman joe.hamman@embeddedspecialties.com
58ac27327SJoe Hamman  *
68ac27327SJoe Hamman  * Copyright 2004 Freescale Semiconductor.
78ac27327SJoe Hamman  * Jeff Brown
88ac27327SJoe Hamman  * Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
98ac27327SJoe Hamman  *
108ac27327SJoe Hamman  * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
118ac27327SJoe Hamman  *
121a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
138ac27327SJoe Hamman  */
148ac27327SJoe Hamman 
158ac27327SJoe Hamman #include <common.h>
168ac27327SJoe Hamman #include <command.h>
178ac27327SJoe Hamman #include <pci.h>
188ac27327SJoe Hamman #include <asm/processor.h>
198ac27327SJoe Hamman #include <asm/immap_86xx.h>
20c8514622SKumar Gala #include <asm/fsl_pci.h>
215614e71bSYork Sun #include <fsl_ddr_sdram.h>
225d27e02cSKumar Gala #include <asm/fsl_serdes.h>
23*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
2413f5433fSJon Loeliger #include <fdt_support.h>
258ac27327SJoe Hamman 
26088454cdSSimon Glass DECLARE_GLOBAL_DATA_PTR;
27088454cdSSimon Glass 
288ac27327SJoe Hamman long int fixed_sdram (void);
298ac27327SJoe Hamman 
board_early_init_f(void)308ac27327SJoe Hamman int board_early_init_f (void)
318ac27327SJoe Hamman {
328ac27327SJoe Hamman 	return 0;
338ac27327SJoe Hamman }
348ac27327SJoe Hamman 
checkboard(void)358ac27327SJoe Hamman int checkboard (void)
368ac27327SJoe Hamman {
378ac27327SJoe Hamman 	puts ("Board: Wind River SBC8641D\n");
388ac27327SJoe Hamman 
398ac27327SJoe Hamman 	return 0;
408ac27327SJoe Hamman }
418ac27327SJoe Hamman 
dram_init(void)42f1683aa7SSimon Glass int dram_init(void)
438ac27327SJoe Hamman {
448ac27327SJoe Hamman 	long dram_size = 0;
458ac27327SJoe Hamman 
468ac27327SJoe Hamman #if defined(CONFIG_SPD_EEPROM)
479bd4e591SKumar Gala 	dram_size = fsl_ddr_sdram();
488ac27327SJoe Hamman #else
498ac27327SJoe Hamman 	dram_size = fixed_sdram ();
508ac27327SJoe Hamman #endif
518ac27327SJoe Hamman 
5221cd5815SWolfgang Denk 	debug ("    DDR: ");
53088454cdSSimon Glass 	gd->ram_size = dram_size;
54088454cdSSimon Glass 
55088454cdSSimon Glass 	return 0;
568ac27327SJoe Hamman }
578ac27327SJoe Hamman 
586d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_DRAM_TEST)
testdram(void)598ac27327SJoe Hamman int testdram (void)
608ac27327SJoe Hamman {
616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
638ac27327SJoe Hamman 	uint *p;
648ac27327SJoe Hamman 
658ac27327SJoe Hamman 	puts ("SDRAM test phase 1:\n");
668ac27327SJoe Hamman 	for (p = pstart; p < pend; p++)
678ac27327SJoe Hamman 		*p = 0xaaaaaaaa;
688ac27327SJoe Hamman 
698ac27327SJoe Hamman 	for (p = pstart; p < pend; p++) {
708ac27327SJoe Hamman 		if (*p != 0xaaaaaaaa) {
718ac27327SJoe Hamman 			printf ("SDRAM test fails at: %08x\n", (uint) p);
728ac27327SJoe Hamman 			return 1;
738ac27327SJoe Hamman 		}
748ac27327SJoe Hamman 	}
758ac27327SJoe Hamman 
768ac27327SJoe Hamman 	puts ("SDRAM test phase 2:\n");
778ac27327SJoe Hamman 	for (p = pstart; p < pend; p++)
788ac27327SJoe Hamman 		*p = 0x55555555;
798ac27327SJoe Hamman 
808ac27327SJoe Hamman 	for (p = pstart; p < pend; p++) {
818ac27327SJoe Hamman 		if (*p != 0x55555555) {
828ac27327SJoe Hamman 			printf ("SDRAM test fails at: %08x\n", (uint) p);
838ac27327SJoe Hamman 			return 1;
848ac27327SJoe Hamman 		}
858ac27327SJoe Hamman 	}
868ac27327SJoe Hamman 
878ac27327SJoe Hamman 	puts ("SDRAM test passed.\n");
888ac27327SJoe Hamman 	return 0;
898ac27327SJoe Hamman }
908ac27327SJoe Hamman #endif
918ac27327SJoe Hamman 
928ac27327SJoe Hamman #if !defined(CONFIG_SPD_EEPROM)
938ac27327SJoe Hamman /*
948ac27327SJoe Hamman  * Fixed sdram init -- doesn't use serial presence detect.
958ac27327SJoe Hamman  */
fixed_sdram(void)968ac27327SJoe Hamman long int fixed_sdram (void)
978ac27327SJoe Hamman {
986d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_SYS_RAMBOOT)
996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
1009a17eb5bSYork Sun 	volatile struct ccsr_ddr *ddr = &immap->im_ddr1;
1018ac27327SJoe Hamman 
1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs0_bnds = CONFIG_SYS_DDR_CS0_BNDS;
1036d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs1_bnds = CONFIG_SYS_DDR_CS1_BNDS;
1046d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs2_bnds = CONFIG_SYS_DDR_CS2_BNDS;
1056d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs3_bnds = CONFIG_SYS_DDR_CS3_BNDS;
1066d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs0_config = CONFIG_SYS_DDR_CS0_CONFIG;
1076d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs1_config = CONFIG_SYS_DDR_CS1_CONFIG;
1086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs2_config = CONFIG_SYS_DDR_CS2_CONFIG;
1096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs3_config = CONFIG_SYS_DDR_CS3_CONFIG;
1106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3;
1116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0;
1126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;
114e7ee23ecSPeter Tyser 	ddr->sdram_cfg = CONFIG_SYS_DDR_CFG_1A;
1156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_cfg_2 = CONFIG_SYS_DDR_CFG_2;
116e7ee23ecSPeter Tyser 	ddr->sdram_mode = CONFIG_SYS_DDR_MODE_1;
1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_mode_2 = CONFIG_SYS_DDR_MODE_2;
1189a17eb5bSYork Sun 	ddr->sdram_md_cntl = CONFIG_SYS_DDR_MODE_CTL;
1196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_interval = CONFIG_SYS_DDR_INTERVAL;
1206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_data_init = CONFIG_SYS_DDR_DATA_INIT;
1216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL;
1228ac27327SJoe Hamman 
1238ac27327SJoe Hamman 	asm ("sync;isync");
1248ac27327SJoe Hamman 
1258ac27327SJoe Hamman 	udelay (500);
1268ac27327SJoe Hamman 
127e7ee23ecSPeter Tyser 	ddr->sdram_cfg = CONFIG_SYS_DDR_CFG_1B;
1288ac27327SJoe Hamman 	asm ("sync; isync");
1298ac27327SJoe Hamman 
1308ac27327SJoe Hamman 	udelay (500);
1318ac27327SJoe Hamman 	ddr = &immap->im_ddr2;
1328ac27327SJoe Hamman 
1336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs0_bnds = CONFIG_SYS_DDR2_CS0_BNDS;
1346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs1_bnds = CONFIG_SYS_DDR2_CS1_BNDS;
1356d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs2_bnds = CONFIG_SYS_DDR2_CS2_BNDS;
1366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs3_bnds = CONFIG_SYS_DDR2_CS3_BNDS;
1376d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs0_config = CONFIG_SYS_DDR2_CS0_CONFIG;
1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs1_config = CONFIG_SYS_DDR2_CS1_CONFIG;
1396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs2_config = CONFIG_SYS_DDR2_CS2_CONFIG;
1406d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->cs3_config = CONFIG_SYS_DDR2_CS3_CONFIG;
1416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_3 = CONFIG_SYS_DDR2_EXT_REFRESH;
1426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_0 = CONFIG_SYS_DDR2_TIMING_0;
1436d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_1 = CONFIG_SYS_DDR2_TIMING_1;
1446d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->timing_cfg_2 = CONFIG_SYS_DDR2_TIMING_2;
145e7ee23ecSPeter Tyser 	ddr->sdram_cfg = CONFIG_SYS_DDR2_CFG_1A;
1466d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_cfg_2 = CONFIG_SYS_DDR2_CFG_2;
147e7ee23ecSPeter Tyser 	ddr->sdram_mode = CONFIG_SYS_DDR2_MODE_1;
1486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_mode_2 = CONFIG_SYS_DDR2_MODE_2;
1499a17eb5bSYork Sun 	ddr->sdram_md_cntl = CONFIG_SYS_DDR2_MODE_CTL;
1506d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_interval = CONFIG_SYS_DDR2_INTERVAL;
1516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_data_init = CONFIG_SYS_DDR2_DATA_INIT;
1526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	ddr->sdram_clk_cntl = CONFIG_SYS_DDR2_CLK_CTRL;
1538ac27327SJoe Hamman 
1548ac27327SJoe Hamman 	asm ("sync;isync");
1558ac27327SJoe Hamman 
1568ac27327SJoe Hamman 	udelay (500);
1578ac27327SJoe Hamman 
158e7ee23ecSPeter Tyser 	ddr->sdram_cfg = CONFIG_SYS_DDR2_CFG_1B;
1598ac27327SJoe Hamman 	asm ("sync; isync");
1608ac27327SJoe Hamman 
1618ac27327SJoe Hamman 	udelay (500);
1628ac27327SJoe Hamman #endif
1636d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
1648ac27327SJoe Hamman }
1658ac27327SJoe Hamman #endif				/* !defined(CONFIG_SPD_EEPROM) */
1668ac27327SJoe Hamman 
1678ac27327SJoe Hamman #if defined(CONFIG_PCI)
1688ac27327SJoe Hamman /*
1698ac27327SJoe Hamman  * Initialize PCI Devices, report devices found.
1708ac27327SJoe Hamman  */
1718ac27327SJoe Hamman 
pci_init_board(void)1728ac27327SJoe Hamman void pci_init_board(void)
1738ac27327SJoe Hamman {
174c51136ecSKumar Gala 	fsl_pcie_init_board(0);
175cca34967SJoe Hamman }
176c51136ecSKumar Gala #endif /* CONFIG_PCI */
1778ac27327SJoe Hamman 
17813f5433fSJon Loeliger 
17913f5433fSJon Loeliger #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)180e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
1818ac27327SJoe Hamman {
1828ac27327SJoe Hamman 	ft_cpu_setup(blob, bd);
1838ac27327SJoe Hamman 
1846525d51fSKumar Gala 	FT_FSL_PCI_SETUP;
185e895a4b0SSimon Glass 
186e895a4b0SSimon Glass 	return 0;
1878ac27327SJoe Hamman }
1888ac27327SJoe Hamman #endif
1898ac27327SJoe Hamman 
sbc8641d_reset_board(void)1908ac27327SJoe Hamman void sbc8641d_reset_board (void)
1918ac27327SJoe Hamman {
1928ac27327SJoe Hamman 	puts ("Resetting board....\n");
1938ac27327SJoe Hamman }
1948ac27327SJoe Hamman 
1958ac27327SJoe Hamman /*
1968ac27327SJoe Hamman  * get_board_sys_clk
1978ac27327SJoe Hamman  *      Clock is fixed at 1GHz on this board. Used for CONFIG_SYS_CLK_FREQ
1988ac27327SJoe Hamman  */
1998ac27327SJoe Hamman 
get_board_sys_clk(ulong dummy)2008ac27327SJoe Hamman unsigned long get_board_sys_clk (ulong dummy)
2018ac27327SJoe Hamman {
2028ac27327SJoe Hamman 	int i;
2038ac27327SJoe Hamman 	ulong val = 0;
2048ac27327SJoe Hamman 
2058ac27327SJoe Hamman 	i = 5;
2068ac27327SJoe Hamman 	i &= 0x07;
2078ac27327SJoe Hamman 
2088ac27327SJoe Hamman 	switch (i) {
2098ac27327SJoe Hamman 	case 0:
2108ac27327SJoe Hamman 		val = 33000000;
2118ac27327SJoe Hamman 		break;
2128ac27327SJoe Hamman 	case 1:
2138ac27327SJoe Hamman 		val = 40000000;
2148ac27327SJoe Hamman 		break;
2158ac27327SJoe Hamman 	case 2:
2168ac27327SJoe Hamman 		val = 50000000;
2178ac27327SJoe Hamman 		break;
2188ac27327SJoe Hamman 	case 3:
2198ac27327SJoe Hamman 		val = 66000000;
2208ac27327SJoe Hamman 		break;
2218ac27327SJoe Hamman 	case 4:
2228ac27327SJoe Hamman 		val = 83000000;
2238ac27327SJoe Hamman 		break;
2248ac27327SJoe Hamman 	case 5:
2258ac27327SJoe Hamman 		val = 100000000;
2268ac27327SJoe Hamman 		break;
2278ac27327SJoe Hamman 	case 6:
2288ac27327SJoe Hamman 		val = 134000000;
2298ac27327SJoe Hamman 		break;
2308ac27327SJoe Hamman 	case 7:
2318ac27327SJoe Hamman 		val = 166000000;
2328ac27327SJoe Hamman 		break;
2338ac27327SJoe Hamman 	}
2348ac27327SJoe Hamman 
2358ac27327SJoe Hamman 	return val;
2368ac27327SJoe Hamman }
2374ef630dfSPeter Tyser 
board_reset(void)2384ef630dfSPeter Tyser void board_reset(void)
2394ef630dfSPeter Tyser {
2404ef630dfSPeter Tyser #ifdef CONFIG_SYS_RESET_ADDRESS
2414ef630dfSPeter Tyser 	ulong addr = CONFIG_SYS_RESET_ADDRESS;
2424ef630dfSPeter Tyser 
2434ef630dfSPeter Tyser 	/* flush and disable I/D cache */
2444ef630dfSPeter Tyser 	__asm__ __volatile__ ("mfspr	3, 1008"	::: "r3");
2454ef630dfSPeter Tyser 	__asm__ __volatile__ ("ori	5, 5, 0xcc00"	::: "r5");
2464ef630dfSPeter Tyser 	__asm__ __volatile__ ("ori	4, 3, 0xc00"	::: "r4");
2474ef630dfSPeter Tyser 	__asm__ __volatile__ ("andc	5, 3, 5"	::: "r5");
2484ef630dfSPeter Tyser 	__asm__ __volatile__ ("sync");
2494ef630dfSPeter Tyser 	__asm__ __volatile__ ("mtspr	1008, 4");
2504ef630dfSPeter Tyser 	__asm__ __volatile__ ("isync");
2514ef630dfSPeter Tyser 	__asm__ __volatile__ ("sync");
2524ef630dfSPeter Tyser 	__asm__ __volatile__ ("mtspr	1008, 5");
2534ef630dfSPeter Tyser 	__asm__ __volatile__ ("isync");
2544ef630dfSPeter Tyser 	__asm__ __volatile__ ("sync");
2554ef630dfSPeter Tyser 
2564ef630dfSPeter Tyser 	/*
2574ef630dfSPeter Tyser 	 * SRR0 has system reset vector, SRR1 has default MSR value
2584ef630dfSPeter Tyser 	 * rfi restores MSR from SRR1 and sets the PC to the SRR0 value
2594ef630dfSPeter Tyser 	 */
2604ef630dfSPeter Tyser 	__asm__ __volatile__ ("mtspr	26, %0"		:: "r" (addr));
2614ef630dfSPeter Tyser 	__asm__ __volatile__ ("li	4, (1 << 6)"	::: "r4");
2624ef630dfSPeter Tyser 	__asm__ __volatile__ ("mtspr	27, 4");
2634ef630dfSPeter Tyser 	__asm__ __volatile__ ("rfi");
2644ef630dfSPeter Tyser #endif
2654ef630dfSPeter Tyser }
266