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