1 /* 2 * 3 * Common functions for OMAP4/5 based boards 4 * 5 * (C) Copyright 2010 6 * Texas Instruments, <www.ti.com> 7 * 8 * Author : 9 * Aneesh V <aneesh@ti.com> 10 * Steve Sakoman <steve@sakoman.com> 11 * 12 * SPDX-License-Identifier: GPL-2.0+ 13 */ 14 #include <common.h> 15 #include <debug_uart.h> 16 #include <spl.h> 17 #include <asm/arch/sys_proto.h> 18 #include <linux/sizes.h> 19 #include <asm/emif.h> 20 #include <asm/omap_common.h> 21 #include <linux/compiler.h> 22 #include <asm/system.h> 23 24 DECLARE_GLOBAL_DATA_PTR; 25 26 void do_set_mux(u32 base, struct pad_conf_entry const *array, int size) 27 { 28 int i; 29 struct pad_conf_entry *pad = (struct pad_conf_entry *) array; 30 31 for (i = 0; i < size; i++, pad++) 32 writew(pad->val, base + pad->offset); 33 } 34 35 static void set_mux_conf_regs(void) 36 { 37 switch (omap_hw_init_context()) { 38 case OMAP_INIT_CONTEXT_SPL: 39 set_muxconf_regs(); 40 break; 41 case OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL: 42 break; 43 case OMAP_INIT_CONTEXT_UBOOT_FROM_NOR: 44 case OMAP_INIT_CONTEXT_UBOOT_AFTER_CH: 45 set_muxconf_regs(); 46 break; 47 } 48 } 49 50 u32 cortex_rev(void) 51 { 52 53 unsigned int rev; 54 55 /* Read Main ID Register (MIDR) */ 56 asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (rev)); 57 58 return rev; 59 } 60 61 static void omap_rev_string(void) 62 { 63 u32 omap_rev = omap_revision(); 64 u32 soc_variant = (omap_rev & 0xF0000000) >> 28; 65 u32 omap_variant = (omap_rev & 0xFFFF0000) >> 16; 66 u32 major_rev = (omap_rev & 0x00000F00) >> 8; 67 u32 minor_rev = (omap_rev & 0x000000F0) >> 4; 68 69 const char *sec_s, *package = NULL; 70 71 switch (get_device_type()) { 72 case TST_DEVICE: 73 sec_s = "TST"; 74 break; 75 case EMU_DEVICE: 76 sec_s = "EMU"; 77 break; 78 case HS_DEVICE: 79 sec_s = "HS"; 80 break; 81 case GP_DEVICE: 82 sec_s = "GP"; 83 break; 84 default: 85 sec_s = "?"; 86 } 87 88 #if defined(CONFIG_DRA7XX) 89 if (is_dra76x()) { 90 switch (omap_rev & 0xF) { 91 case DRA762_ABZ_PACKAGE: 92 package = "ABZ"; 93 break; 94 case DRA762_ACD_PACKAGE: 95 default: 96 package = "ACD"; 97 break; 98 } 99 } 100 #endif 101 102 if (soc_variant) 103 printf("OMAP"); 104 else 105 printf("DRA"); 106 printf("%x-%s ES%x.%x", omap_variant, sec_s, major_rev, minor_rev); 107 if (package) 108 printf(" %s package\n", package); 109 else 110 puts("\n"); 111 } 112 113 #ifdef CONFIG_SPL_BUILD 114 void spl_display_print(void) 115 { 116 omap_rev_string(); 117 } 118 #endif 119 120 void __weak srcomp_enable(void) 121 { 122 } 123 124 /** 125 * do_board_detect() - Detect board description 126 * 127 * Function to detect board description. This is expected to be 128 * overridden in the SoC family board file where desired. 129 */ 130 void __weak do_board_detect(void) 131 { 132 } 133 134 /** 135 * vcores_init() - Assign omap_vcores based on board 136 * 137 * Function to pick the vcores based on board. This is expected to be 138 * overridden in the SoC family board file where desired. 139 */ 140 void __weak vcores_init(void) 141 { 142 } 143 144 void s_init(void) 145 { 146 } 147 148 /** 149 * init_package_revision() - Initialize package revision 150 * 151 * Function to get the pacakage information. This is expected to be 152 * overridden in the SoC family file where desired. 153 */ 154 void __weak init_package_revision(void) 155 { 156 } 157 158 /** 159 * early_system_init - Does Early system initialization. 160 * 161 * Does early system init of watchdog, muxing, andclocks 162 * Watchdog disable is done always. For the rest what gets done 163 * depends on the boot mode in which this function is executed when 164 * 1. SPL running from SRAM 165 * 2. U-Boot running from FLASH 166 * 3. U-Boot loaded to SDRAM by SPL 167 * 4. U-Boot loaded to SDRAM by ROM code using the 168 * Configuration Header feature 169 * Please have a look at the respective functions to see what gets 170 * done in each of these cases 171 * This function is called with SRAM stack. 172 */ 173 void early_system_init(void) 174 { 175 init_omap_revision(); 176 hw_data_init(); 177 init_package_revision(); 178 179 #ifdef CONFIG_SPL_BUILD 180 if (warm_reset()) 181 force_emif_self_refresh(); 182 #endif 183 watchdog_init(); 184 set_mux_conf_regs(); 185 #ifdef CONFIG_SPL_BUILD 186 srcomp_enable(); 187 do_io_settings(); 188 #endif 189 setup_early_clocks(); 190 #ifdef CONFIG_SPL_BUILD 191 /* 192 * Save the boot parameters passed from romcode. 193 * We cannot delay the saving further than this, 194 * to prevent overwrites. 195 */ 196 save_omap_boot_params(); 197 #endif 198 do_board_detect(); 199 #ifdef CONFIG_SPL_BUILD 200 spl_early_init(); 201 #endif 202 vcores_init(); 203 #ifdef CONFIG_DEBUG_UART_OMAP 204 debug_uart_init(); 205 #endif 206 prcm_init(); 207 } 208 209 #ifdef CONFIG_SPL_BUILD 210 void board_init_f(ulong dummy) 211 { 212 early_system_init(); 213 #ifdef CONFIG_BOARD_EARLY_INIT_F 214 board_early_init_f(); 215 #endif 216 /* For regular u-boot sdram_init() is called from dram_init() */ 217 sdram_init(); 218 gd->ram_size = omap_sdram_size(); 219 } 220 #endif 221 222 int arch_cpu_init_dm(void) 223 { 224 early_system_init(); 225 return 0; 226 } 227 228 /* 229 * Routine: wait_for_command_complete 230 * Description: Wait for posting to finish on watchdog 231 */ 232 void wait_for_command_complete(struct watchdog *wd_base) 233 { 234 int pending = 1; 235 do { 236 pending = readl(&wd_base->wwps); 237 } while (pending); 238 } 239 240 /* 241 * Routine: watchdog_init 242 * Description: Shut down watch dogs 243 */ 244 void watchdog_init(void) 245 { 246 struct watchdog *wd2_base = (struct watchdog *)WDT2_BASE; 247 248 writel(WD_UNLOCK1, &wd2_base->wspr); 249 wait_for_command_complete(wd2_base); 250 writel(WD_UNLOCK2, &wd2_base->wspr); 251 } 252 253 254 /* 255 * This function finds the SDRAM size available in the system 256 * based on DMM section configurations 257 * This is needed because the size of memory installed may be 258 * different on different versions of the board 259 */ 260 u32 omap_sdram_size(void) 261 { 262 u32 section, i, valid; 263 u64 sdram_start = 0, sdram_end = 0, addr, 264 size, total_size = 0, trap_size = 0, trap_start = 0; 265 266 for (i = 0; i < 4; i++) { 267 section = __raw_readl(DMM_BASE + i*4); 268 valid = (section & EMIF_SDRC_ADDRSPC_MASK) >> 269 (EMIF_SDRC_ADDRSPC_SHIFT); 270 addr = section & EMIF_SYS_ADDR_MASK; 271 272 /* See if the address is valid */ 273 if ((addr >= TI_ARMV7_DRAM_ADDR_SPACE_START) && 274 (addr < TI_ARMV7_DRAM_ADDR_SPACE_END)) { 275 size = ((section & EMIF_SYS_SIZE_MASK) >> 276 EMIF_SYS_SIZE_SHIFT); 277 size = 1 << size; 278 size *= SZ_16M; 279 280 if (valid != DMM_SDRC_ADDR_SPC_INVALID) { 281 if (!sdram_start || (addr < sdram_start)) 282 sdram_start = addr; 283 if (!sdram_end || ((addr + size) > sdram_end)) 284 sdram_end = addr + size; 285 } else { 286 trap_size = size; 287 trap_start = addr; 288 } 289 } 290 } 291 292 if ((trap_start >= sdram_start) && (trap_start < sdram_end)) 293 total_size = (sdram_end - sdram_start) - (trap_size); 294 else 295 total_size = sdram_end - sdram_start; 296 297 return total_size; 298 } 299 300 301 /* 302 * Routine: dram_init 303 * Description: sets uboots idea of sdram size 304 */ 305 int dram_init(void) 306 { 307 sdram_init(); 308 gd->ram_size = omap_sdram_size(); 309 return 0; 310 } 311 312 /* 313 * Print board information 314 */ 315 int checkboard(void) 316 { 317 puts(sysinfo.board_string); 318 return 0; 319 } 320 321 #if defined(CONFIG_DISPLAY_CPUINFO) 322 /* 323 * Print CPU information 324 */ 325 int print_cpuinfo(void) 326 { 327 puts("CPU : "); 328 omap_rev_string(); 329 330 return 0; 331 } 332 #endif 333