1939911a6STom Rini /* 2939911a6STom Rini * (C) Copyright 2014 3939911a6STom Rini * Texas Instruments, <www.ti.com> 4939911a6STom Rini * 5939911a6STom Rini * SPDX-License-Identifier: GPL-2.0+ 6939911a6STom Rini */ 7939911a6STom Rini #ifndef _TI_COMMON_SYS_PROTO_H_ 8939911a6STom Rini #define _TI_COMMON_SYS_PROTO_H_ 9939911a6STom Rini 10939911a6STom Rini DECLARE_GLOBAL_DATA_PTR; 11939911a6STom Rini 12*a93fbf4aSMasahiro Yamada #ifdef CONFIG_ARCH_OMAP2PLUS 13939911a6STom Rini #define TI_ARMV7_DRAM_ADDR_SPACE_START 0x80000000 14939911a6STom Rini #define TI_ARMV7_DRAM_ADDR_SPACE_END 0xFFFFFFFF 15939911a6STom Rini 16939911a6STom Rini #define OMAP_INIT_CONTEXT_SPL 0 17939911a6STom Rini #define OMAP_INIT_CONTEXT_UBOOT_FROM_NOR 1 18939911a6STom Rini #define OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL 2 19939911a6STom Rini #define OMAP_INIT_CONTEXT_UBOOT_AFTER_CH 3 20939911a6STom Rini running_from_sdram(void)21939911a6STom Rinistatic inline u32 running_from_sdram(void) 22939911a6STom Rini { 23939911a6STom Rini u32 pc; 24939911a6STom Rini asm volatile ("mov %0, pc" : "=r" (pc)); 25939911a6STom Rini return ((pc >= TI_ARMV7_DRAM_ADDR_SPACE_START) && 26939911a6STom Rini (pc < TI_ARMV7_DRAM_ADDR_SPACE_END)); 27939911a6STom Rini } 28939911a6STom Rini uboot_loaded_by_spl(void)29939911a6STom Rinistatic inline u8 uboot_loaded_by_spl(void) 30939911a6STom Rini { 31939911a6STom Rini /* 32939911a6STom Rini * u-boot can be running from sdram either because of configuration 33939911a6STom Rini * Header or by SPL. If because of CH, then the romcode sets the 34939911a6STom Rini * CHSETTINGS executed bit to true in the boot parameter structure that 35939911a6STom Rini * it passes to the bootloader.This parameter is stored in the ch_flags 36939911a6STom Rini * variable by both SPL and u-boot.Check out for CHSETTINGS, which is a 37939911a6STom Rini * mandatory section if CH is present. 38939911a6STom Rini */ 3960c7c30aSPaul Kocialkowski if (gd->arch.omap_ch_flags & CH_FLAGS_CHSETTINGS) 40939911a6STom Rini return 0; 41939911a6STom Rini else 42939911a6STom Rini return running_from_sdram(); 43939911a6STom Rini } 44939911a6STom Rini 45939911a6STom Rini /* 46939911a6STom Rini * The basic hardware init of OMAP(s_init()) can happen in 4 47939911a6STom Rini * different contexts: 48939911a6STom Rini * 1. SPL running from SRAM 49939911a6STom Rini * 2. U-Boot running from FLASH 50939911a6STom Rini * 3. Non-XIP U-Boot loaded to SDRAM by SPL 51939911a6STom Rini * 4. Non-XIP U-Boot loaded to SDRAM by ROM code using the 52939911a6STom Rini * Configuration Header feature 53939911a6STom Rini * 54939911a6STom Rini * This function finds this context. 55939911a6STom Rini * Defining as inline may help in compiling out unused functions in SPL 56939911a6STom Rini */ omap_hw_init_context(void)57939911a6STom Rinistatic inline u32 omap_hw_init_context(void) 58939911a6STom Rini { 59939911a6STom Rini #ifdef CONFIG_SPL_BUILD 60939911a6STom Rini return OMAP_INIT_CONTEXT_SPL; 61939911a6STom Rini #else 62939911a6STom Rini if (uboot_loaded_by_spl()) 63939911a6STom Rini return OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL; 64939911a6STom Rini else if (running_from_sdram()) 65939911a6STom Rini return OMAP_INIT_CONTEXT_UBOOT_AFTER_CH; 66939911a6STom Rini else 67939911a6STom Rini return OMAP_INIT_CONTEXT_UBOOT_FROM_NOR; 68939911a6STom Rini #endif 69939911a6STom Rini } 70939911a6STom Rini #endif 71939911a6STom Rini 72939911a6STom Rini #endif 73