xref: /rk3399_rockchip-uboot/board/armltd/integrator/integrator.c (revision 382bee57f19b4454e2015bc19a010bc2d0ab9337)
1576afd4fSJean-Christophe PLAGNIOL-VILLARD /*
2576afd4fSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2002
3576afd4fSJean-Christophe PLAGNIOL-VILLARD  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
4576afd4fSJean-Christophe PLAGNIOL-VILLARD  * Marius Groeger <mgroeger@sysgo.de>
5576afd4fSJean-Christophe PLAGNIOL-VILLARD  *
6576afd4fSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2002
7576afd4fSJean-Christophe PLAGNIOL-VILLARD  * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
8576afd4fSJean-Christophe PLAGNIOL-VILLARD  *
9576afd4fSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2003
10576afd4fSJean-Christophe PLAGNIOL-VILLARD  * Texas Instruments, <www.ti.com>
11576afd4fSJean-Christophe PLAGNIOL-VILLARD  * Kshitij Gupta <Kshitij@ti.com>
12576afd4fSJean-Christophe PLAGNIOL-VILLARD  *
13576afd4fSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2004
14576afd4fSJean-Christophe PLAGNIOL-VILLARD  * ARM Ltd.
15576afd4fSJean-Christophe PLAGNIOL-VILLARD  * Philippe Robin, <philippe.robin@arm.com>
16576afd4fSJean-Christophe PLAGNIOL-VILLARD  *
171a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
18576afd4fSJean-Christophe PLAGNIOL-VILLARD  */
19576afd4fSJean-Christophe PLAGNIOL-VILLARD 
20576afd4fSJean-Christophe PLAGNIOL-VILLARD #include <common.h>
219d922450SSimon Glass #include <dm.h>
22576afd4fSJean-Christophe PLAGNIOL-VILLARD #include <netdev.h>
237c045d0bSLinus Walleij #include <asm/io.h>
243f394e70SLinus Walleij #include <dm/platform_data/serial_pl01x.h>
25701ed16eSLinus Walleij #include "arm-ebi.h"
261dc26801SLinus Walleij #include "integrator-sc.h"
27c62db35dSSimon Glass #include <asm/mach-types.h>
28576afd4fSJean-Christophe PLAGNIOL-VILLARD 
29576afd4fSJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR;
30576afd4fSJean-Christophe PLAGNIOL-VILLARD 
313f394e70SLinus Walleij static const struct pl01x_serial_platdata serial_platdata = {
323f394e70SLinus Walleij 	.base = 0x16000000,
333f394e70SLinus Walleij #ifdef CONFIG_ARCH_CINTEGRATOR
343f394e70SLinus Walleij 	.type = TYPE_PL011,
353f394e70SLinus Walleij 	.clock = 14745600,
363f394e70SLinus Walleij #else
373f394e70SLinus Walleij 	.type = TYPE_PL010,
383f394e70SLinus Walleij 	.clock = 0, /* Not used for PL010 */
393f394e70SLinus Walleij #endif
403f394e70SLinus Walleij };
413f394e70SLinus Walleij 
423f394e70SLinus Walleij U_BOOT_DEVICE(integrator_serials) = {
433f394e70SLinus Walleij 	.name = "serial_pl01x",
443f394e70SLinus Walleij 	.platdata = &serial_platdata,
453f394e70SLinus Walleij };
463f394e70SLinus Walleij 
47576afd4fSJean-Christophe PLAGNIOL-VILLARD void peripheral_power_enable (void);
48576afd4fSJean-Christophe PLAGNIOL-VILLARD 
49576afd4fSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SHOW_BOOT_PROGRESS)
show_boot_progress(int progress)50576afd4fSJean-Christophe PLAGNIOL-VILLARD void show_boot_progress(int progress)
51576afd4fSJean-Christophe PLAGNIOL-VILLARD {
52576afd4fSJean-Christophe PLAGNIOL-VILLARD 	printf("Boot reached stage %d\n", progress);
53576afd4fSJean-Christophe PLAGNIOL-VILLARD }
54576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif
55576afd4fSJean-Christophe PLAGNIOL-VILLARD 
56576afd4fSJean-Christophe PLAGNIOL-VILLARD #define COMP_MODE_ENABLE ((unsigned int)0x0000EAEF)
57576afd4fSJean-Christophe PLAGNIOL-VILLARD 
58576afd4fSJean-Christophe PLAGNIOL-VILLARD /*
59576afd4fSJean-Christophe PLAGNIOL-VILLARD  * Miscellaneous platform dependent initialisations
60576afd4fSJean-Christophe PLAGNIOL-VILLARD  */
61576afd4fSJean-Christophe PLAGNIOL-VILLARD 
board_init(void)62576afd4fSJean-Christophe PLAGNIOL-VILLARD int board_init (void)
63576afd4fSJean-Christophe PLAGNIOL-VILLARD {
64701ed16eSLinus Walleij 	u32 val;
65701ed16eSLinus Walleij 
66576afd4fSJean-Christophe PLAGNIOL-VILLARD 	/* arch number of Integrator Board */
67576afd4fSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_ARCH_CINTEGRATOR
68576afd4fSJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_arch_number = MACH_TYPE_CINTEGRATOR;
69576afd4fSJean-Christophe PLAGNIOL-VILLARD #else
70576afd4fSJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_arch_number = MACH_TYPE_INTEGRATOR;
71576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif
72576afd4fSJean-Christophe PLAGNIOL-VILLARD 
73576afd4fSJean-Christophe PLAGNIOL-VILLARD 	/* adress of boot parameters */
74576afd4fSJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_boot_params = 0x00000100;
75576afd4fSJean-Christophe PLAGNIOL-VILLARD 
76576afd4fSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CM_REMAP
77576afd4fSJean-Christophe PLAGNIOL-VILLARD extern void cm_remap(void);
78576afd4fSJean-Christophe PLAGNIOL-VILLARD 	cm_remap();	/* remaps writeable memory to 0x00000000 */
79576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif
80576afd4fSJean-Christophe PLAGNIOL-VILLARD 
811dc26801SLinus Walleij #ifdef CONFIG_ARCH_CINTEGRATOR
82701ed16eSLinus Walleij 	/*
831dc26801SLinus Walleij 	 * Flash protection on the Integrator/CP is in a simple register
841dc26801SLinus Walleij 	 */
851dc26801SLinus Walleij 	val = readl(CP_FLASHPROG);
861dc26801SLinus Walleij 	val |= (CP_FLASHPROG_FLVPPEN | CP_FLASHPROG_FLWREN);
871dc26801SLinus Walleij 	writel(val, CP_FLASHPROG);
881dc26801SLinus Walleij #else
891dc26801SLinus Walleij 	/*
901dc26801SLinus Walleij 	 * The Integrator/AP has some special protection mechanisms
911dc26801SLinus Walleij 	 * for the external memories, first the External Bus Interface (EBI)
921dc26801SLinus Walleij 	 * then the system controller (SC).
931dc26801SLinus Walleij 	 *
94701ed16eSLinus Walleij 	 * The system comes up with the flash memory non-writable and
95701ed16eSLinus Walleij 	 * configuration locked. If we want U-Boot to be used for flash
96701ed16eSLinus Walleij 	 * access we cannot have the flash memory locked.
97701ed16eSLinus Walleij 	 */
98701ed16eSLinus Walleij 	writel(EBI_UNLOCK_MAGIC, EBI_BASE + EBI_LOCK_REG);
99701ed16eSLinus Walleij 	val = readl(EBI_BASE + EBI_CSR1_REG);
100701ed16eSLinus Walleij 	val &= EBI_CSR_WREN_MASK;
101701ed16eSLinus Walleij 	val |= EBI_CSR_WREN_ENABLE;
102701ed16eSLinus Walleij 	writel(val, EBI_BASE + EBI_CSR1_REG);
103701ed16eSLinus Walleij 	writel(0, EBI_BASE + EBI_LOCK_REG);
104701ed16eSLinus Walleij 
1051dc26801SLinus Walleij 	/*
1061dc26801SLinus Walleij 	 * Set up the system controller to remove write protection from
1071dc26801SLinus Walleij 	 * the flash memory and enable Vpp
1081dc26801SLinus Walleij 	 */
1091dc26801SLinus Walleij 	writel(SC_CTRL_FLASHVPP | SC_CTRL_FLASHWP, SC_CTRLS);
1101dc26801SLinus Walleij #endif
1111dc26801SLinus Walleij 
112576afd4fSJean-Christophe PLAGNIOL-VILLARD 	icache_enable ();
113576afd4fSJean-Christophe PLAGNIOL-VILLARD 
114576afd4fSJean-Christophe PLAGNIOL-VILLARD 	return 0;
115576afd4fSJean-Christophe PLAGNIOL-VILLARD }
116576afd4fSJean-Christophe PLAGNIOL-VILLARD 
misc_init_r(void)117576afd4fSJean-Christophe PLAGNIOL-VILLARD int misc_init_r (void)
118576afd4fSJean-Christophe PLAGNIOL-VILLARD {
119*382bee57SSimon Glass 	env_set("verify", "n");
120576afd4fSJean-Christophe PLAGNIOL-VILLARD 	return (0);
121576afd4fSJean-Christophe PLAGNIOL-VILLARD }
122576afd4fSJean-Christophe PLAGNIOL-VILLARD 
12346b5ccbfSLinus Walleij /*
12446b5ccbfSLinus Walleij  * The Integrator remaps the Flash memory to 0x00000000 and executes U-Boot
12546b5ccbfSLinus Walleij  * from there, which means we cannot test the RAM underneath the ROM at this
12646b5ccbfSLinus Walleij  * point. It will be unmapped later on, when we are executing from the
12746b5ccbfSLinus Walleij  * relocated in RAM U-Boot. We simply assume that this RAM is usable if the
12846b5ccbfSLinus Walleij  * RAM on higher addresses works fine.
12946b5ccbfSLinus Walleij  */
13046b5ccbfSLinus Walleij #define REMAPPED_FLASH_SZ 0x40000
13146b5ccbfSLinus Walleij 
dram_init(void)132576afd4fSJean-Christophe PLAGNIOL-VILLARD int dram_init (void)
133576afd4fSJean-Christophe PLAGNIOL-VILLARD {
13426c82638SLinus Walleij 	gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
135576afd4fSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CM_SPD_DETECT
136576afd4fSJean-Christophe PLAGNIOL-VILLARD 	{
137576afd4fSJean-Christophe PLAGNIOL-VILLARD extern void dram_query(void);
1387c045d0bSLinus Walleij 	u32 cm_reg_sdram;
1397c045d0bSLinus Walleij 	u32 sdram_shift;
140576afd4fSJean-Christophe PLAGNIOL-VILLARD 
141576afd4fSJean-Christophe PLAGNIOL-VILLARD 	dram_query();	/* Assembler accesses to CM registers */
142576afd4fSJean-Christophe PLAGNIOL-VILLARD 			/* Queries the SPD values	      */
143576afd4fSJean-Christophe PLAGNIOL-VILLARD 
144576afd4fSJean-Christophe PLAGNIOL-VILLARD 	/* Obtain the SDRAM size from the CM SDRAM register */
145576afd4fSJean-Christophe PLAGNIOL-VILLARD 
1467c045d0bSLinus Walleij 	cm_reg_sdram = readl(CM_BASE + OS_SDRAM);
147576afd4fSJean-Christophe PLAGNIOL-VILLARD 	/*   Register	      SDRAM size
148576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *
149576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *   0xXXXXXXbbb000bb	 16 MB
150576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *   0xXXXXXXbbb001bb	 32 MB
151576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *   0xXXXXXXbbb010bb	 64 MB
152576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *   0xXXXXXXbbb011bb	128 MB
153576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *   0xXXXXXXbbb100bb	256 MB
154576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 *
155576afd4fSJean-Christophe PLAGNIOL-VILLARD 	 */
156576afd4fSJean-Christophe PLAGNIOL-VILLARD 	sdram_shift = ((cm_reg_sdram & 0x0000001C)/4)%4;
15746b5ccbfSLinus Walleij 	gd->ram_size = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE +
15846b5ccbfSLinus Walleij 				    REMAPPED_FLASH_SZ,
15926c82638SLinus Walleij 				    0x01000000 << sdram_shift);
160576afd4fSJean-Christophe PLAGNIOL-VILLARD 	}
16126c82638SLinus Walleij #else
16246b5ccbfSLinus Walleij 	gd->ram_size = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE +
16346b5ccbfSLinus Walleij 				    REMAPPED_FLASH_SZ,
16426c82638SLinus Walleij 				    PHYS_SDRAM_1_SIZE);
165576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif /* CM_SPD_DETECT */
16646b5ccbfSLinus Walleij 	/* We only have one bank of RAM, set it to whatever was detected */
16746b5ccbfSLinus Walleij 	gd->bd->bi_dram[0].size	 = gd->ram_size;
168576afd4fSJean-Christophe PLAGNIOL-VILLARD 
169576afd4fSJean-Christophe PLAGNIOL-VILLARD 	return 0;
170576afd4fSJean-Christophe PLAGNIOL-VILLARD }
171576afd4fSJean-Christophe PLAGNIOL-VILLARD 
1727194ab80SBen Warren #ifdef CONFIG_CMD_NET
board_eth_init(bd_t * bis)173576afd4fSJean-Christophe PLAGNIOL-VILLARD int board_eth_init(bd_t *bis)
174576afd4fSJean-Christophe PLAGNIOL-VILLARD {
1757194ab80SBen Warren 	int rc = 0;
1767194ab80SBen Warren #ifdef CONFIG_SMC91111
1777194ab80SBen Warren 	rc = smc91111_initialize(0, CONFIG_SMC91111_BASE);
1787194ab80SBen Warren #endif
1797194ab80SBen Warren 	rc += pci_eth_init(bis);
1807194ab80SBen Warren 	return rc;
181576afd4fSJean-Christophe PLAGNIOL-VILLARD }
182576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif
183