5cdf7905a90dc956c0ec73610063a87c7bf1322f
[platform/kernel/u-boot.git] / board / armltd / integrator / integrator.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2002
4  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
5  * Marius Groeger <mgroeger@sysgo.de>
6  *
7  * (C) Copyright 2002
8  * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
9  *
10  * (C) Copyright 2003
11  * Texas Instruments, <www.ti.com>
12  * Kshitij Gupta <Kshitij@ti.com>
13  *
14  * (C) Copyright 2004
15  * ARM Ltd.
16  * Philippe Robin, <philippe.robin@arm.com>
17  */
18
19 #include <common.h>
20 #include <cpu_func.h>
21 #include <dm.h>
22 #include <env.h>
23 #include <netdev.h>
24 #include <asm/io.h>
25 #include <dm/platform_data/serial_pl01x.h>
26 #include "arm-ebi.h"
27 #include "integrator-sc.h"
28 #include <asm/mach-types.h>
29
30 DECLARE_GLOBAL_DATA_PTR;
31
32 static const struct pl01x_serial_platdata serial_platdata = {
33         .base = 0x16000000,
34 #ifdef CONFIG_ARCH_CINTEGRATOR
35         .type = TYPE_PL011,
36         .clock = 14745600,
37 #else
38         .type = TYPE_PL010,
39         .clock = 0, /* Not used for PL010 */
40 #endif
41 };
42
43 U_BOOT_DEVICE(integrator_serials) = {
44         .name = "serial_pl01x",
45         .platdata = &serial_platdata,
46 };
47
48 void peripheral_power_enable (void);
49
50 #if defined(CONFIG_SHOW_BOOT_PROGRESS)
51 void show_boot_progress(int progress)
52 {
53         printf("Boot reached stage %d\n", progress);
54 }
55 #endif
56
57 #define COMP_MODE_ENABLE ((unsigned int)0x0000EAEF)
58
59 /*
60  * Miscellaneous platform dependent initialisations
61  */
62
63 int board_init (void)
64 {
65         u32 val;
66
67         /* arch number of Integrator Board */
68 #ifdef CONFIG_ARCH_CINTEGRATOR
69         gd->bd->bi_arch_number = MACH_TYPE_CINTEGRATOR;
70 #else
71         gd->bd->bi_arch_number = MACH_TYPE_INTEGRATOR;
72 #endif
73
74         /* adress of boot parameters */
75         gd->bd->bi_boot_params = 0x00000100;
76
77 #ifdef CONFIG_CM_REMAP
78 extern void cm_remap(void);
79         cm_remap();     /* remaps writeable memory to 0x00000000 */
80 #endif
81
82 #ifdef CONFIG_ARCH_CINTEGRATOR
83         /*
84          * Flash protection on the Integrator/CP is in a simple register
85          */
86         val = readl(CP_FLASHPROG);
87         val |= (CP_FLASHPROG_FLVPPEN | CP_FLASHPROG_FLWREN);
88         writel(val, CP_FLASHPROG);
89 #else
90         /*
91          * The Integrator/AP has some special protection mechanisms
92          * for the external memories, first the External Bus Interface (EBI)
93          * then the system controller (SC).
94          *
95          * The system comes up with the flash memory non-writable and
96          * configuration locked. If we want U-Boot to be used for flash
97          * access we cannot have the flash memory locked.
98          */
99         writel(EBI_UNLOCK_MAGIC, EBI_BASE + EBI_LOCK_REG);
100         val = readl(EBI_BASE + EBI_CSR1_REG);
101         val &= EBI_CSR_WREN_MASK;
102         val |= EBI_CSR_WREN_ENABLE;
103         writel(val, EBI_BASE + EBI_CSR1_REG);
104         writel(0, EBI_BASE + EBI_LOCK_REG);
105
106         /*
107          * Set up the system controller to remove write protection from
108          * the flash memory and enable Vpp
109          */
110         writel(SC_CTRL_FLASHVPP | SC_CTRL_FLASHWP, SC_CTRLS);
111 #endif
112
113         icache_enable();
114
115         return 0;
116 }
117
118 int misc_init_r (void)
119 {
120         env_set("verify", "n");
121         return (0);
122 }
123
124 /*
125  * The Integrator remaps the Flash memory to 0x00000000 and executes U-Boot
126  * from there, which means we cannot test the RAM underneath the ROM at this
127  * point. It will be unmapped later on, when we are executing from the
128  * relocated in RAM U-Boot. We simply assume that this RAM is usable if the
129  * RAM on higher addresses works fine.
130  */
131 #define REMAPPED_FLASH_SZ 0x40000
132
133 int dram_init (void)
134 {
135         gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
136 #ifdef CONFIG_CM_SPD_DETECT
137         {
138 extern void dram_query(void);
139         u32 cm_reg_sdram;
140         u32 sdram_shift;
141
142         dram_query();   /* Assembler accesses to CM registers */
143                         /* Queries the SPD values             */
144
145         /* Obtain the SDRAM size from the CM SDRAM register */
146
147         cm_reg_sdram = readl(CM_BASE + OS_SDRAM);
148         /*   Register         SDRAM size
149          *
150          *   0xXXXXXXbbb000bb    16 MB
151          *   0xXXXXXXbbb001bb    32 MB
152          *   0xXXXXXXbbb010bb    64 MB
153          *   0xXXXXXXbbb011bb   128 MB
154          *   0xXXXXXXbbb100bb   256 MB
155          *
156          */
157         sdram_shift = ((cm_reg_sdram & 0x0000001C)/4)%4;
158         gd->ram_size = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE +
159                                     REMAPPED_FLASH_SZ,
160                                     0x01000000 << sdram_shift);
161         }
162 #else
163         gd->ram_size = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE +
164                                     REMAPPED_FLASH_SZ,
165                                     PHYS_SDRAM_1_SIZE);
166 #endif /* CM_SPD_DETECT */
167         /* We only have one bank of RAM, set it to whatever was detected */
168         gd->bd->bi_dram[0].size  = gd->ram_size;
169
170         return 0;
171 }
172
173 #ifdef CONFIG_CMD_NET
174 int board_eth_init(bd_t *bis)
175 {
176         int rc = 0;
177 #ifdef CONFIG_SMC91111
178         rc = smc91111_initialize(0, CONFIG_SMC91111_BASE);
179 #endif
180         rc += pci_eth_init(bis);
181         return rc;
182 }
183 #endif