1e2211743Swdenk /* 23b74e7ecSWolfgang Denk * (C) Copyright 2000-2009 3e2211743Swdenk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4e2211743Swdenk * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6e2211743Swdenk */ 7e2211743Swdenk 8e2211743Swdenk #ifndef __COMMON_H_ 9d0b8feefSWolfgang Denk #define __COMMON_H_ 1 10e2211743Swdenk 11fcd3c87eSWolfgang Denk #ifndef __ASSEMBLY__ /* put C only stuff in this section */ 12fcd3c87eSWolfgang Denk 13e2211743Swdenk typedef unsigned char uchar; 14e2211743Swdenk typedef volatile unsigned long vu_long; 15e2211743Swdenk typedef volatile unsigned short vu_short; 16e2211743Swdenk typedef volatile unsigned char vu_char; 17e2211743Swdenk 182a6713b0SAndre Przywara /* Allow sharing constants with type modifiers between C and assembly. */ 192a6713b0SAndre Przywara #define _AC(X, Y) (X##Y) 202a6713b0SAndre Przywara 21e2211743Swdenk #include <config.h> 222307ea40SJoe Hershberger #include <errno.h> 23a7b81769SMasahiro Yamada #include <time.h> 2425ddd1fbSWolfgang Denk #include <asm-offsets.h> 25e2211743Swdenk #include <linux/bitops.h> 265bc516edSMasahiro Yamada #include <linux/delay.h> 27e2211743Swdenk #include <linux/types.h> 28e2211743Swdenk #include <linux/string.h> 299aed5080SMarek Vasut #include <linux/stringify.h> 30e2211743Swdenk #include <asm/ptrace.h> 31e2211743Swdenk #include <stdarg.h> 32cba1da49SMasahiro Yamada #include <linux/kernel.h> 33*85043159SSimon Glass 342819e136SSekhar Nori #ifdef CONFIG_SOC_DA8XX 352819e136SSekhar Nori #include <asm/arch/hardware.h> 362819e136SSekhar Nori #endif 379f3183d2SMingkai Hu #ifdef CONFIG_FSL_LSCH3 389f3183d2SMingkai Hu #include <asm/arch/immap_lsch3.h> 399f3183d2SMingkai Hu #endif 408281c58fSMingkai Hu #ifdef CONFIG_FSL_LSCH2 418281c58fSMingkai Hu #include <asm/arch/immap_lsch2.h> 428281c58fSMingkai Hu #endif 43e2211743Swdenk 44e2211743Swdenk #include <part.h> 45e2211743Swdenk #include <flash.h> 46e2211743Swdenk #include <image.h> 47e2211743Swdenk 484166ecb2SGabe Black /* Bring in printf format macros if inttypes.h is included */ 494166ecb2SGabe Black #define __STDC_FORMAT_MACROS 504166ecb2SGabe Black 514d1fd7f1SYork Sun #ifdef __LP64__ 524d1fd7f1SYork Sun #define CONFIG_SYS_SUPPORT_64BIT_DATA 534d1fd7f1SYork Sun #endif 544d1fd7f1SYork Sun 55e2211743Swdenk #ifdef DEBUG 5621726a7aSSimon Glass #define _DEBUG 1 5721726a7aSSimon Glass #else 5821726a7aSSimon Glass #define _DEBUG 0 5921726a7aSSimon Glass #endif 6021726a7aSSimon Glass 6198286826SSimon Glass #ifdef CONFIG_SPL_BUILD 6298286826SSimon Glass #define _SPL_BUILD 1 6398286826SSimon Glass #else 6498286826SSimon Glass #define _SPL_BUILD 0 6598286826SSimon Glass #endif 6698286826SSimon Glass 675e7f7433SSimon Glass /* Define this at the top of a file to add a prefix to debug messages */ 68be25d875SThierry Reding #ifndef pr_fmt 69be25d875SThierry Reding #define pr_fmt(fmt) fmt 70be25d875SThierry Reding #endif 71be25d875SThierry Reding 7221726a7aSSimon Glass /* 7388a85fb9SMarek Vasut * Output a debug text when condition "cond" is met. The "cond" should be 7488a85fb9SMarek Vasut * computed by a preprocessor in the best case, allowing for the best 7588a85fb9SMarek Vasut * optimization. 7688a85fb9SMarek Vasut */ 7788a85fb9SMarek Vasut #define debug_cond(cond, fmt, args...) \ 7888a85fb9SMarek Vasut do { \ 7988a85fb9SMarek Vasut if (cond) \ 80be25d875SThierry Reding printf(pr_fmt(fmt), ##args); \ 8188a85fb9SMarek Vasut } while (0) 8288a85fb9SMarek Vasut 835e7f7433SSimon Glass /* Show a message if DEBUG is defined in a file */ 8488a85fb9SMarek Vasut #define debug(fmt, args...) \ 8588a85fb9SMarek Vasut debug_cond(_DEBUG, fmt, ##args) 8688a85fb9SMarek Vasut 8798286826SSimon Glass /* Show a message if not in SPL */ 8898286826SSimon Glass #define warn_non_spl(fmt, args...) \ 8998286826SSimon Glass debug_cond(!_SPL_BUILD, fmt, ##args) 9098286826SSimon Glass 9188a85fb9SMarek Vasut /* 9221726a7aSSimon Glass * An assertion is run-time check done in debug mode only. If DEBUG is not 9321726a7aSSimon Glass * defined then it is skipped. If DEBUG is defined and the assertion fails, 9421726a7aSSimon Glass * then it calls panic*( which may or may not reset/halt U-Boot (see 9521726a7aSSimon Glass * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found 9621726a7aSSimon Glass * before release, and after release it is hoped that they don't matter. But 9721726a7aSSimon Glass * in any case these failing assertions cannot be fixed with a reset (which 9821726a7aSSimon Glass * may just do the same assertion again). 9921726a7aSSimon Glass */ 10021726a7aSSimon Glass void __assert_fail(const char *assertion, const char *file, unsigned line, 10121726a7aSSimon Glass const char *function); 10221726a7aSSimon Glass #define assert(x) \ 10321726a7aSSimon Glass ({ if (!(x) && _DEBUG) \ 10421726a7aSSimon Glass __assert_fail(#x, __FILE__, __LINE__, __func__); }) 10521726a7aSSimon Glass 106594d57d0SMatthias Kaehlcke #define error(fmt, args...) do { \ 107be25d875SThierry Reding printf("ERROR: " pr_fmt(fmt) "\nat %s:%d/%s()\n", \ 108594d57d0SMatthias Kaehlcke ##args, __FILE__, __LINE__, __func__); \ 109594d57d0SMatthias Kaehlcke } while (0) 110594d57d0SMatthias Kaehlcke 111cfa460adSWilliam Juul #ifndef BUG 11243835aacSDetlev Zundel #define BUG() do { \ 11343835aacSDetlev Zundel printf("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__); \ 11443835aacSDetlev Zundel panic("BUG!"); \ 11543835aacSDetlev Zundel } while (0) 11643835aacSDetlev Zundel #define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0) 117cfa460adSWilliam Juul #endif /* BUG */ 11843835aacSDetlev Zundel 119e2211743Swdenk typedef void (interrupt_handler_t)(void *); 120e2211743Swdenk 121e2211743Swdenk #include <asm/u-boot.h> /* boot information for Linux kernel */ 122e2211743Swdenk #include <asm/global_data.h> /* global data used for startup functions */ 123e2211743Swdenk 12471f95118Swdenk /* 12571f95118Swdenk * enable common handling for all TQM8xxL/M boards: 12611d9eec4SMartin Krause * - CONFIG_TQM8xxM will be defined for all TQM8xxM boards 12771f95118Swdenk * - CONFIG_TQM8xxL will be defined for all TQM8xxL _and_ TQM8xxM boards 12811d9eec4SMartin Krause * and for the TQM885D board 12971f95118Swdenk */ 13071f95118Swdenk #if defined(CONFIG_TQM823M) || defined(CONFIG_TQM850M) || \ 13171f95118Swdenk defined(CONFIG_TQM855M) || defined(CONFIG_TQM860M) || \ 13211d9eec4SMartin Krause defined(CONFIG_TQM862M) || defined(CONFIG_TQM866M) 13371f95118Swdenk # ifndef CONFIG_TQM8xxM 13471f95118Swdenk # define CONFIG_TQM8xxM 13571f95118Swdenk # endif 13671f95118Swdenk #endif 137e2211743Swdenk #if defined(CONFIG_TQM823L) || defined(CONFIG_TQM850L) || \ 138d126bfbdSwdenk defined(CONFIG_TQM855L) || defined(CONFIG_TQM860L) || \ 13911d9eec4SMartin Krause defined(CONFIG_TQM862L) || defined(CONFIG_TQM8xxM) || \ 14011d9eec4SMartin Krause defined(CONFIG_TQM885D) 141e2211743Swdenk # ifndef CONFIG_TQM8xxL 142e2211743Swdenk # define CONFIG_TQM8xxL 143e2211743Swdenk # endif 144e2211743Swdenk #endif 145e2211743Swdenk 1463fbeeea6SHeiko Schocher #if defined(CONFIG_ENV_IS_EMBEDDED) 1473fbeeea6SHeiko Schocher #define TOTAL_MALLOC_LEN CONFIG_SYS_MALLOC_LEN 1483fbeeea6SHeiko Schocher #elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \ 1493fbeeea6SHeiko Schocher (CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \ 1503fbeeea6SHeiko Schocher defined(CONFIG_ENV_IS_IN_NVRAM) 1513fbeeea6SHeiko Schocher #define TOTAL_MALLOC_LEN (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE) 1523fbeeea6SHeiko Schocher #else 1533fbeeea6SHeiko Schocher #define TOTAL_MALLOC_LEN CONFIG_SYS_MALLOC_LEN 1543fbeeea6SHeiko Schocher #endif 155c7de829cSwdenk 156c7de829cSwdenk /* 157e2211743Swdenk * Function Prototypes 158e2211743Swdenk */ 1590267ba5dSMichal Simek int dram_init(void); 160e2211743Swdenk 1615e924a13SSimon Glass /** 1625e924a13SSimon Glass * dram_init_banksize() - Set up DRAM bank sizes 1635e924a13SSimon Glass * 1645e924a13SSimon Glass * This can be implemented by boards to set up the DRAM bank information in 1655e924a13SSimon Glass * gd->bd->bi_dram(). It is called just before relocation, after dram_init() 1665e924a13SSimon Glass * is called. 1675e924a13SSimon Glass * 1685e924a13SSimon Glass * If this is not provided, a default implementation will try to set up a 1695e924a13SSimon Glass * single bank. It will do this if CONFIG_NR_DRAM_BANKS and 1705e924a13SSimon Glass * CONFIG_SYS_SDRAM_BASE are set. The bank will have a start address of 1715e924a13SSimon Glass * CONFIG_SYS_SDRAM_BASE and the size will be determined by a call to 1725e924a13SSimon Glass * get_effective_memsize(). 1735e924a13SSimon Glass * 1745e924a13SSimon Glass * @return 0 if OK, -ve on error 1755e924a13SSimon Glass */ 1765e924a13SSimon Glass int dram_init_banksize(void); 1775e924a13SSimon Glass 178e2211743Swdenk void hang (void) __attribute__ ((noreturn)); 179e2211743Swdenk 180f6c019c4SWolfgang Denk int timer_init(void); 181f6c019c4SWolfgang Denk int cpu_init(void); 182f6c019c4SWolfgang Denk 1832ea09c83SSimon Glass #include <display_options.h> 184e2211743Swdenk 185e2211743Swdenk /* common/main.c */ 186e2211743Swdenk void main_loop (void); 187009dde19SSimon Glass int run_command(const char *cmd, int flag); 1881d43bfd2SThomas Betker int run_command_repeatable(const char *cmd, int flag); 189d51004a8SSimon Glass 190d51004a8SSimon Glass /** 191d51004a8SSimon Glass * Run a list of commands separated by ; or even \0 192d51004a8SSimon Glass * 193d51004a8SSimon Glass * Note that if 'len' is not -1, then the command does not need to be nul 194d51004a8SSimon Glass * terminated, Memory will be allocated for the command in that case. 195d51004a8SSimon Glass * 196d51004a8SSimon Glass * @param cmd List of commands to run, each separated bu semicolon 197d51004a8SSimon Glass * @param len Length of commands excluding terminator if known (-1 if not) 198d51004a8SSimon Glass * @param flag Execution flags (CMD_FLAG_...) 199d51004a8SSimon Glass * @return 0 on success, or != 0 on error. 200d51004a8SSimon Glass */ 201d51004a8SSimon Glass int run_command_list(const char *cmd, int len, int flag); 202e2211743Swdenk 203ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/board.c */ 204e05e5de7SAlbert ARIBAUD void board_init_f(ulong); 2056d1b6f9fSMike Frysinger void board_init_r(gd_t *, ulong) __attribute__ ((noreturn)); 2061fed87dbSSimon Glass 2071fed87dbSSimon Glass /** 208ecc30663SAlbert ARIBAUD * ulong board_init_f_alloc_reserve - allocate reserved area 2091fed87dbSSimon Glass * 2101fed87dbSSimon Glass * This function is called by each architecture very early in the start-up 211ecc30663SAlbert ARIBAUD * code to allow the C runtime to reserve space on the stack for writable 212ecc30663SAlbert ARIBAUD * 'globals' such as GD and the malloc arena. 2131fed87dbSSimon Glass * 214ecc30663SAlbert ARIBAUD * @top: top of the reserve area, growing down. 215ecc30663SAlbert ARIBAUD * @return: bottom of reserved area 2161fed87dbSSimon Glass */ 217ecc30663SAlbert ARIBAUD ulong board_init_f_alloc_reserve(ulong top); 218ecc30663SAlbert ARIBAUD 219ecc30663SAlbert ARIBAUD /** 220ecc30663SAlbert ARIBAUD * board_init_f_init_reserve - initialize the reserved area(s) 221ecc30663SAlbert ARIBAUD * 222ecc30663SAlbert ARIBAUD * This function is called once the C runtime has allocated the reserved 223ecc30663SAlbert ARIBAUD * area on the stack. It must initialize the GD at the base of that area. 224ecc30663SAlbert ARIBAUD * 225ecc30663SAlbert ARIBAUD * @base: top from which reservation was done 226ecc30663SAlbert ARIBAUD */ 227ecc30663SAlbert ARIBAUD void board_init_f_init_reserve(ulong base); 2281fed87dbSSimon Glass 2291fed87dbSSimon Glass /** 2301fed87dbSSimon Glass * arch_setup_gd() - Set up the global_data pointer 2311fed87dbSSimon Glass * 2321fed87dbSSimon Glass * This pointer is special in some architectures and cannot easily be assigned 2331fed87dbSSimon Glass * to. For example on x86 it is implemented by adding a specific record to its 2341fed87dbSSimon Glass * Global Descriptor Table! So we we provide a function to carry out this task. 2351fed87dbSSimon Glass * For most architectures this can simply be: 2361fed87dbSSimon Glass * 2371fed87dbSSimon Glass * gd = gd_ptr; 2381fed87dbSSimon Glass * 2391fed87dbSSimon Glass * @gd_ptr: Pointer to global data 2401fed87dbSSimon Glass */ 2411fed87dbSSimon Glass void arch_setup_gd(gd_t *gd_ptr); 2421fed87dbSSimon Glass 243e2211743Swdenk int checkboard(void); 2440365ffccSMasahiro Yamada int show_board_info(void); 245e2211743Swdenk int checkflash(void); 246e2211743Swdenk int checkdram(void); 247e2211743Swdenk int last_stage_init(void); 2483b57fe0aSwdenk extern ulong monitor_flash_len; 249bea3f28dSHaiying Wang int mac_read_from_eeprom(void); 2506ab6b2afSMasahiro Yamada extern u8 __dtb_dt_begin[]; /* embedded device tree blob */ 2518f5d4687SHadli, Manjunath int set_cpu_clk_info(void); 2529272a9b4SSimon Glass int mdm_init(void); 2531938f4a5SSimon Glass int print_cpuinfo(void); 254c2240d4dSSimon Glass int update_flash_size(int flash_size); 2552c072c95SSimon Glass int arch_early_init_r(void); 256e2211743Swdenk 257e5fb573fSSimon Glass /* 258e5fb573fSSimon Glass * setup_board_extra() - Fill in extra details in the bd_t structure 259e5fb573fSSimon Glass * 260e5fb573fSSimon Glass * @return 0 if OK, -ve on error 261e5fb573fSSimon Glass */ 262e5fb573fSSimon Glass int setup_board_extra(void); 263e5fb573fSSimon Glass 26415a33e49SSimon Glass /** 265671549e5SSimon Glass * arch_fsp_init() - perform firmware support package init 266671549e5SSimon Glass * 267671549e5SSimon Glass * Where U-Boot relies on binary blobs to handle part of the system init, this 268671549e5SSimon Glass * function can be used to set up the blobs. This is used on some Intel 269671549e5SSimon Glass * platforms. 270671549e5SSimon Glass */ 271671549e5SSimon Glass int arch_fsp_init(void); 272671549e5SSimon Glass 273671549e5SSimon Glass /** 274d4c671ccSSimon Glass * arch_cpu_init_dm() - init CPU after driver model is available 275d4c671ccSSimon Glass * 276d4c671ccSSimon Glass * This is called immediately after driver model is available before 277d4c671ccSSimon Glass * relocation. This is similar to arch_cpu_init() but is able to reference 278d4c671ccSSimon Glass * devices 279d4c671ccSSimon Glass * 280d4c671ccSSimon Glass * @return 0 if OK, -ve on error 281d4c671ccSSimon Glass */ 282d4c671ccSSimon Glass int arch_cpu_init_dm(void); 283d4c671ccSSimon Glass 284d4c671ccSSimon Glass /** 28568145d4cSAndreas Bießmann * Reserve all necessary stacks 28668145d4cSAndreas Bießmann * 28768145d4cSAndreas Bießmann * This is used in generic board init sequence in common/board_f.c. Each 28868145d4cSAndreas Bießmann * architecture could provide this function to tailor the required stacks. 28968145d4cSAndreas Bießmann * 29068145d4cSAndreas Bießmann * On entry gd->start_addr_sp is pointing to the suggested top of the stack. 29168145d4cSAndreas Bießmann * The callee ensures gd->start_add_sp is 16-byte aligned, so architectures 29268145d4cSAndreas Bießmann * require only this can leave it untouched. 29368145d4cSAndreas Bießmann * 29468145d4cSAndreas Bießmann * On exit gd->start_addr_sp and gd->irq_sp should be set to the respective 29568145d4cSAndreas Bießmann * positions of the stack. The stack pointer(s) will be set to this later. 29668145d4cSAndreas Bießmann * gd->irq_sp is only required, if the architecture needs it. 29768145d4cSAndreas Bießmann * 29868145d4cSAndreas Bießmann * @return 0 if no error 29968145d4cSAndreas Bießmann */ 30068145d4cSAndreas Bießmann __weak int arch_reserve_stacks(void); 30168145d4cSAndreas Bießmann 30268145d4cSAndreas Bießmann /** 30315a33e49SSimon Glass * Show the DRAM size in a board-specific way 30415a33e49SSimon Glass * 30515a33e49SSimon Glass * This is used by boards to display DRAM information in their own way. 30615a33e49SSimon Glass * 30715a33e49SSimon Glass * @param size Size of DRAM (which should be displayed along with other info) 30815a33e49SSimon Glass */ 309ea11b401SAndrew Bradford void board_show_dram(phys_size_t size); 31015a33e49SSimon Glass 31113d06981SSimon Glass /** 312e29607edSMa Haijun * arch_fixup_fdt() - Write arch-specific information to fdt 31313d06981SSimon Glass * 314e29607edSMa Haijun * Defined in arch/$(ARCH)/lib/bootm-fdt.c 31513d06981SSimon Glass * 31613d06981SSimon Glass * @blob: FDT blob to write to 31713d06981SSimon Glass * @return 0 if ok, or -ve FDT_ERR_... on failure 31813d06981SSimon Glass */ 319e29607edSMa Haijun int arch_fixup_fdt(void *blob); 32013d06981SSimon Glass 321e2211743Swdenk /* common/flash.c */ 322e2211743Swdenk void flash_perror (int); 323e2211743Swdenk 32474de7aefSWolfgang Denk /* common/cmd_source.c */ 32574de7aefSWolfgang Denk int source (ulong addr, const char *fit_uname); 326e2211743Swdenk 327e2211743Swdenk extern ulong load_addr; /* Default Load Address */ 3281aec244aSSimon Glass extern ulong save_addr; /* Default Save Address */ 3291aec244aSSimon Glass extern ulong save_size; /* Default Save Size */ 330e2211743Swdenk 33106283a64SJason Hobbs /* common/cmd_net.c */ 33206283a64SJason Hobbs int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); 33306283a64SJason Hobbs 334669df7e4SRob Herring /* common/cmd_fat.c */ 335669df7e4SRob Herring int do_fat_fsload(cmd_tbl_t *, int, int, char * const []); 336669df7e4SRob Herring 337669df7e4SRob Herring /* common/cmd_ext2.c */ 338669df7e4SRob Herring int do_ext2load(cmd_tbl_t *, int, int, char * const []); 339669df7e4SRob Herring 340e2211743Swdenk /* common/cmd_nvedit.c */ 341e2211743Swdenk int env_init (void); 342e2211743Swdenk void env_relocate (void); 34326a41790SRafal Jaworowski int envmatch (uchar *, int); 34420f86a0aSSimon Glass 34520f86a0aSSimon Glass /* Avoid unfortunate conflict with libc's getenv() */ 34620f86a0aSSimon Glass #ifdef CONFIG_SANDBOX 34720f86a0aSSimon Glass #define getenv uboot_getenv 34820f86a0aSSimon Glass #endif 34984b5e802SWolfgang Denk char *getenv (const char *); 35084b5e802SWolfgang Denk int getenv_f (const char *name, char *buf, unsigned len); 3514a9b4131SSimon Glass ulong getenv_ulong(const char *name, int base, ulong default_val); 35276b8f79cSSimon Glass 35376b8f79cSSimon Glass /** 35476b8f79cSSimon Glass * getenv_hex() - Return an environment variable as a hex value 35576b8f79cSSimon Glass * 35676b8f79cSSimon Glass * Decode an environment as a hex number (it may or may not have a 0x 35776b8f79cSSimon Glass * prefix). If the environment variable cannot be found, or does not start 35876b8f79cSSimon Glass * with hex digits, the default value is returned. 35976b8f79cSSimon Glass * 36076b8f79cSSimon Glass * @varname: Variable to decode 36176b8f79cSSimon Glass * @default_val: Value to return on error 36276b8f79cSSimon Glass */ 36376b8f79cSSimon Glass ulong getenv_hex(const char *varname, ulong default_val); 36476b8f79cSSimon Glass 365ec8a252cSJoe Hershberger /* 366ec8a252cSJoe Hershberger * Read an environment variable as a boolean 367ec8a252cSJoe Hershberger * Return -1 if variable does not exist (default to true) 368ec8a252cSJoe Hershberger */ 369ec8a252cSJoe Hershberger int getenv_yesno(const char *var); 370e2211743Swdenk int saveenv (void); 37184b5e802SWolfgang Denk int setenv (const char *, const char *); 372d67f10ceSSimon Glass int setenv_ulong(const char *varname, ulong value); 373bfc59966SSimon Glass int setenv_hex(const char *varname, ulong value); 374bfc59966SSimon Glass /** 375bfc59966SSimon Glass * setenv_addr - Set an environment variable to an address in hex 376bfc59966SSimon Glass * 3771bce2aebSRobert P. J. Day * @varname: Environment variable to set 378bfc59966SSimon Glass * @addr: Value to set it to 379bfc59966SSimon Glass * @return 0 if ok, 1 on error 380bfc59966SSimon Glass */ 381bfc59966SSimon Glass static inline int setenv_addr(const char *varname, const void *addr) 382bfc59966SSimon Glass { 383bfc59966SSimon Glass return setenv_hex(varname, (ulong)addr); 384bfc59966SSimon Glass } 385bfc59966SSimon Glass 38604a85b3bSwdenk #ifdef CONFIG_AUTO_COMPLETE 38704a85b3bSwdenk int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf); 38804a85b3bSwdenk #endif 3892f70c49eSHeiko Schocher int get_env_id (void); 39004a85b3bSwdenk 391e2211743Swdenk void pci_init (void); 392ad10dd9aSstroese void pci_init_board(void); 393e2211743Swdenk 394e2211743Swdenk int misc_init_f (void); 395e2211743Swdenk int misc_init_r (void); 396e2211743Swdenk 39727b207fdSwdenk /* common/exports.c */ 39827b207fdSwdenk void jumptable_init(void); 39927b207fdSwdenk 400ecb1dc89SMike Frysinger /* common/kallsysm.c */ 401ecb1dc89SMike Frysinger const char *symbol_lookup(unsigned long addr, unsigned long *caddr); 402ecb1dc89SMike Frysinger 403c83bf6a2Swdenk /* common/memsize.c */ 404a55d23ccSAlbert ARIBAUD long get_ram_size (long *, long); 405e3866163SYork Sun phys_size_t get_effective_memsize(void); 406c83bf6a2Swdenk 407e2211743Swdenk /* $(BOARD)/$(BOARD).c */ 408e2211743Swdenk void reset_phy (void); 4097f6c2cbcSwdenk void fdc_hw_init (void); 410e2211743Swdenk 411e2211743Swdenk /* $(BOARD)/eeprom.c */ 412eb5ba3aeSSimon Glass #ifdef CONFIG_CMD_EEPROM 413354e3ed7SMarek Vasut void eeprom_init (int bus); 414e2211743Swdenk int eeprom_read (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt); 415e2211743Swdenk int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt); 416eb5ba3aeSSimon Glass #else 417eb5ba3aeSSimon Glass /* 418eb5ba3aeSSimon Glass * Some EEPROM code is depecated because it used the legacy I2C interface. Add 419eb5ba3aeSSimon Glass * some macros here so we don't have to touch every one of those uses 420eb5ba3aeSSimon Glass */ 421eb5ba3aeSSimon Glass #define eeprom_init(bus) 422eb5ba3aeSSimon Glass #define eeprom_read(dev_addr, offset, buffer, cnt) ((void)-ENOSYS) 423eb5ba3aeSSimon Glass #define eeprom_write(dev_addr, offset, buffer, cnt) ((void)-ENOSYS) 424eb5ba3aeSSimon Glass #endif 425e2211743Swdenk 426e2211743Swdenk /* 427e2211743Swdenk * Set this up regardless of board 428e2211743Swdenk * type, to prevent errors. 429e2211743Swdenk */ 4306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SPI) || !defined(CONFIG_SYS_I2C_EEPROM_ADDR) 4316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # define CONFIG_SYS_DEF_EEPROM_ADDR 0 432e2211743Swdenk #else 433548738b4SHeiko Schocher #if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C) 4346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR 435548738b4SHeiko Schocher #endif 4366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SPI || !defined(CONFIG_SYS_I2C_EEPROM_ADDR) */ 437e2211743Swdenk 438bdccc4feSwdenk #if defined(CONFIG_SPI) 439e2211743Swdenk extern void spi_init_f (void); 440e2211743Swdenk extern void spi_init_r (void); 441e2211743Swdenk extern ssize_t spi_read (uchar *, int, uchar *, int); 442e2211743Swdenk extern ssize_t spi_write (uchar *, int, uchar *, int); 443e2211743Swdenk #endif 444e2211743Swdenk 445e2211743Swdenk /* $(BOARD)/$(BOARD).c */ 446c837dcb1Swdenk int board_early_init_f (void); 4472a792753Smario.six@gdsys.cc int board_fix_fdt (void *rw_fdt_blob); /* manipulate the U-Boot fdt before its relocation */ 448c837dcb1Swdenk int board_late_init (void); 449e2211743Swdenk int board_postclk_init (void); /* after clocks/timebase, before env/serial */ 450c837dcb1Swdenk int board_early_init_r (void); 451e2211743Swdenk void board_poweroff (void); 452e2211743Swdenk 4536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_DRAM_TEST) 454e2211743Swdenk int testdram(void); 4556d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SYS_DRAM_TEST */ 456e2211743Swdenk 457e2211743Swdenk /* $(CPU)/start.S */ 4580db5bca8Swdenk #if defined(CONFIG_5xx) || \ 4590db5bca8Swdenk defined(CONFIG_8xx) 460e2211743Swdenk uint get_immr (uint); 461e2211743Swdenk #endif 46236c72877Swdenk #if defined(CONFIG_MPC5xxx) 46336c72877Swdenk uint get_svr (void); 46436c72877Swdenk #endif 465e2211743Swdenk uint get_pvr (void); 466547b4cb2Swdenk uint get_svr (void); 467e2211743Swdenk uint rd_ic_cst (void); 468e2211743Swdenk void wr_ic_cst (uint); 469e2211743Swdenk void wr_ic_adr (uint); 470e2211743Swdenk uint rd_dc_cst (void); 471e2211743Swdenk void wr_dc_cst (uint); 472e2211743Swdenk void wr_dc_adr (uint); 473e2211743Swdenk int icache_status (void); 474e2211743Swdenk void icache_enable (void); 475e2211743Swdenk void icache_disable(void); 476e2211743Swdenk int dcache_status (void); 477e2211743Swdenk void dcache_enable (void); 478e2211743Swdenk void dcache_disable(void); 4792c451f78SAneesh V void mmu_disable(void); 4805c6db120SBenoît Thébaudeau #if defined(CONFIG_ARM) 4815c6db120SBenoît Thébaudeau void relocate_code(ulong); 4825c6db120SBenoît Thébaudeau #else 4835c6db120SBenoît Thébaudeau void relocate_code(ulong, gd_t *, ulong) __attribute__ ((noreturn)); 484959eaa74SBenoît Thébaudeau #endif 485e2211743Swdenk ulong get_endaddr (void); 486e2211743Swdenk void trap_init (ulong); 487e2211743Swdenk #if defined (CONFIG_4xx) || \ 488eeb1b77bSwdenk defined (CONFIG_MPC5xxx) || \ 489cd94ba39SMarian Balakowicz defined (CONFIG_MPC85xx) || \ 490debb7354SJon Loeliger defined (CONFIG_MPC86xx) || \ 4910f898604SPeter Tyser defined (CONFIG_MPC83xx) 492e2211743Swdenk unsigned char in8(unsigned int); 493e2211743Swdenk void out8(unsigned int, unsigned char); 494e2211743Swdenk unsigned short in16(unsigned int); 495e2211743Swdenk unsigned short in16r(unsigned int); 496e2211743Swdenk void out16(unsigned int, unsigned short value); 497e2211743Swdenk void out16r(unsigned int, unsigned short value); 498e2211743Swdenk unsigned long in32(unsigned int); 499e2211743Swdenk unsigned long in32r(unsigned int); 500e2211743Swdenk void out32(unsigned int, unsigned long value); 501e2211743Swdenk void out32r(unsigned int, unsigned long value); 502e2211743Swdenk void ppcDcbf(unsigned long value); 503e2211743Swdenk void ppcDcbi(unsigned long value); 504e2211743Swdenk void ppcSync(void); 5050ac6f8b7Swdenk void ppcDcbz(unsigned long value); 506e2211743Swdenk #endif 5070643631aSMichal Simek #if defined (CONFIG_MICROBLAZE) 5080643631aSMichal Simek unsigned short in16(unsigned int); 5090643631aSMichal Simek void out16(unsigned int, unsigned short value); 5100643631aSMichal Simek #endif 511e2211743Swdenk 5120f898604SPeter Tyser #if defined (CONFIG_MPC83xx) 51390f30a71SDave Liu void ppcDWload(unsigned int *addr, unsigned int *ret); 51490f30a71SDave Liu void ppcDWstore(unsigned int *addr, unsigned int *value); 5157c6db910SHeiko Schocher void disable_addr_trans(void); 5167c6db910SHeiko Schocher void enable_addr_trans(void); 5177c6db910SHeiko Schocher #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 5187c6db910SHeiko Schocher void ddr_enable_ecc(unsigned int dram_size); 5197c6db910SHeiko Schocher #endif 52090f30a71SDave Liu #endif 52190f30a71SDave Liu 522e2211743Swdenk /* $(CPU)/cpu.c */ 523fbb9ecf7STimur Tabi static inline int cpumask_next(int cpu, unsigned int mask) 524fbb9ecf7STimur Tabi { 525fbb9ecf7STimur Tabi for (cpu++; !((1 << cpu) & mask); cpu++) 526fbb9ecf7STimur Tabi ; 527fbb9ecf7STimur Tabi 528fbb9ecf7STimur Tabi return cpu; 529fbb9ecf7STimur Tabi } 530fbb9ecf7STimur Tabi 531fbb9ecf7STimur Tabi #define for_each_cpu(iter, cpu, num_cpus, mask) \ 532fbb9ecf7STimur Tabi for (iter = 0, cpu = cpumask_next(-1, mask); \ 533fbb9ecf7STimur Tabi iter < num_cpus; \ 534fbb9ecf7STimur Tabi iter++, cpu = cpumask_next(cpu, mask)) \ 535fbb9ecf7STimur Tabi 5360e870980SPoonam Aggrwal int cpu_numcores (void); 537b8bf0adcSShaveta Leekha int cpu_num_dspcores(void); 538fbb9ecf7STimur Tabi u32 cpu_mask (void); 539b8bf0adcSShaveta Leekha u32 cpu_dsp_mask(void); 540fbb9ecf7STimur Tabi int is_core_valid (unsigned int); 541cbcbf71bSSimon Glass 542cbcbf71bSSimon Glass /** 543cbcbf71bSSimon Glass * arch_cpu_init() - basic cpu-dependent setup for an architecture 544cbcbf71bSSimon Glass * 545cbcbf71bSSimon Glass * This is called after early malloc is available. It should handle any 546cbcbf71bSSimon Glass * CPU- or SoC- specific init needed to continue the init sequence. See 547cbcbf71bSSimon Glass * board_f.c for where it is called. If this is not provided, a default 548cbcbf71bSSimon Glass * version (which does nothing) will be used. 549cbcbf71bSSimon Glass */ 550cbcbf71bSSimon Glass int arch_cpu_init(void); 551cbcbf71bSSimon Glass 552e2211743Swdenk int checkcpu (void); 553e2211743Swdenk int checkicache (void); 554e2211743Swdenk int checkdcache (void); 555e2211743Swdenk void upmconfig (unsigned int, unsigned int *, unsigned int); 556e2211743Swdenk ulong get_tbclk (void); 5571fb4dab2SPrzemyslaw Marczak void reset_misc (void); 5583ec924a3Swdenk void reset_cpu (ulong addr); 5596a16e0dfSKim Phillips void ft_cpu_setup(void *blob, bd_t *bd); 5606a16e0dfSKim Phillips void ft_pci_setup(void *blob, bd_t *bd); 5616a16e0dfSKim Phillips 562ba6a1698SAndre Przywara void smp_set_core_boot_addr(unsigned long addr, int corenr); 563ba6a1698SAndre Przywara void smp_kick_all_cpus(void); 564e2211743Swdenk 565e2211743Swdenk /* $(CPU)/serial.c */ 566e2211743Swdenk int serial_init (void); 567e2211743Swdenk void serial_setbrg (void); 568e2211743Swdenk void serial_putc (const char); 569756f586aSwdenk void serial_putc_raw(const char); 570e2211743Swdenk void serial_puts (const char *); 571e2211743Swdenk int serial_getc (void); 572e2211743Swdenk int serial_tstc (void); 573e2211743Swdenk 574709ea543SSimon Glass /* These versions take a stdio_dev pointer */ 575709ea543SSimon Glass struct stdio_dev; 576709ea543SSimon Glass int serial_stub_getc(struct stdio_dev *sdev); 577709ea543SSimon Glass int serial_stub_tstc(struct stdio_dev *sdev); 578709ea543SSimon Glass 579e2211743Swdenk /* $(CPU)/speed.c */ 580e2211743Swdenk int get_clocks (void); 5818749fa6aSSimon Glass #if defined(CONFIG_MPC5xxx) 582945af8d7Swdenk int prt_mpc5xxx_clks (void); 583945af8d7Swdenk #endif 5847a7530afSSimon Glass #if defined(CONFIG_LH7A40X) || \ 585fcfb632bSMatthias Kaehlcke defined(CONFIG_EP93XX) 586e2211743Swdenk ulong get_FCLK (void); 587e2211743Swdenk ulong get_HCLK (void); 588e2211743Swdenk ulong get_PCLK (void); 589e2211743Swdenk ulong get_UCLK (void); 590e2211743Swdenk #endif 591f39748aeSwdenk #if defined(CONFIG_LH7A40X) 592f39748aeSwdenk ulong get_PLLCLK (void); 593f39748aeSwdenk #endif 594281e00a3Swdenk #if defined(CONFIG_IMX) 595281e00a3Swdenk ulong get_systemPLLCLK(void); 596281e00a3Swdenk ulong get_FCLK(void); 597281e00a3Swdenk ulong get_HCLK(void); 598281e00a3Swdenk ulong get_BCLK(void); 599281e00a3Swdenk ulong get_PERCLK1(void); 600281e00a3Swdenk ulong get_PERCLK2(void); 601281e00a3Swdenk ulong get_PERCLK3(void); 602281e00a3Swdenk #endif 603e2211743Swdenk ulong get_bus_freq (ulong); 604550650ddSStefan Roese int get_serial_clock(void); 605e2211743Swdenk 60642d1f039Swdenk #if defined(CONFIG_MPC85xx) 60742d1f039Swdenk typedef MPC85xx_SYS_INFO sys_info_t; 60842d1f039Swdenk void get_sys_info ( sys_info_t * ); 609871a57bbSMiao Yan void ft_fixup_cpu(void *, u64); 610871a57bbSMiao Yan void ft_fixup_num_cores(void *); 611871a57bbSMiao Yan #endif 612debb7354SJon Loeliger #if defined(CONFIG_MPC86xx) 613debb7354SJon Loeliger typedef MPC86xx_SYS_INFO sys_info_t; 614debb7354SJon Loeliger void get_sys_info ( sys_info_t * ); 6155df4b0adSKumar Gala static inline ulong get_ddr_freq(ulong dummy) 6165df4b0adSKumar Gala { 6175df4b0adSKumar Gala return get_bus_freq(dummy); 6185df4b0adSKumar Gala } 6192f78eae5SYork Sun #else 6202f78eae5SYork Sun ulong get_ddr_freq(ulong); 621debb7354SJon Loeliger #endif 62242d1f039Swdenk 623e2211743Swdenk int cpu_init_r (void); 624e2211743Swdenk 625e2211743Swdenk /* $(CPU)/interrupts.c */ 626e2211743Swdenk int interrupt_init (void); 627e2211743Swdenk void timer_interrupt (struct pt_regs *); 628e2211743Swdenk void external_interrupt (struct pt_regs *); 629e2211743Swdenk void irq_install_handler(int, interrupt_handler_t *, void *); 630e2211743Swdenk void irq_free_handler (int); 631e2211743Swdenk void reset_timer (void); 632b2e16a85SSimon Glass 633b2e16a85SSimon Glass /* Return value of monotonic microsecond timer */ 634b2e16a85SSimon Glass unsigned long timer_get_us(void); 635b2e16a85SSimon Glass 636e2211743Swdenk void enable_interrupts (void); 637e2211743Swdenk int disable_interrupts (void); 638e2211743Swdenk 639e2211743Swdenk /* $(CPU)/.../commproc.c */ 640e2211743Swdenk int dpram_init (void); 641e2211743Swdenk uint dpram_base(void); 642e2211743Swdenk uint dpram_base_align(uint align); 643e2211743Swdenk uint dpram_alloc(uint size); 644e2211743Swdenk uint dpram_alloc_align(uint size,uint align); 645bdccc4feSwdenk void bootcount_store (ulong); 646bdccc4feSwdenk ulong bootcount_load (void); 647bdccc4feSwdenk #define BOOTCOUNT_MAGIC 0xB001C041 648e2211743Swdenk 649e2211743Swdenk /* $(CPU)/.../<eth> */ 650c5bded3cSWolfgang Denk void mii_init (void); 651e2211743Swdenk 652e2211743Swdenk /* $(CPU)/.../lcd.c */ 653e2211743Swdenk ulong lcd_setmem (ulong); 654e2211743Swdenk 655e2211743Swdenk /* $(CPU)/.../video.c */ 656e2211743Swdenk ulong video_setmem (ulong); 657e2211743Swdenk 658ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/cache.c */ 659cba4b180SAneesh V void enable_caches(void); 660e2211743Swdenk void flush_cache (unsigned long, unsigned long); 6612c451f78SAneesh V void flush_dcache_all(void); 66203d3bfb0SStefan Roese void flush_dcache_range(unsigned long start, unsigned long stop); 66303d3bfb0SStefan Roese void invalidate_dcache_range(unsigned long start, unsigned long stop); 6642c451f78SAneesh V void invalidate_dcache_all(void); 6652c451f78SAneesh V void invalidate_icache_all(void); 6660db5bca8Swdenk 6674d24a11eSSimon Glass enum { 6684d24a11eSSimon Glass /* Disable caches (else flush caches but leave them active) */ 6694d24a11eSSimon Glass CBL_DISABLE_CACHES = 1 << 0, 6704d24a11eSSimon Glass CBL_SHOW_BOOTSTAGE_REPORT = 1 << 1, 6714d24a11eSSimon Glass 6724d24a11eSSimon Glass CBL_ALL = 3, 6734d24a11eSSimon Glass }; 6744d24a11eSSimon Glass 6754d24a11eSSimon Glass /** 6764d24a11eSSimon Glass * Clean up ready for linux 6774d24a11eSSimon Glass * 6784d24a11eSSimon Glass * @param flags Flags to control what is done 6794d24a11eSSimon Glass */ 6804d24a11eSSimon Glass int cleanup_before_linux_select(int flags); 6814d24a11eSSimon Glass 682ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/ticks.S */ 68319ea4678SSimon Glass uint64_t get_ticks(void); 684e2211743Swdenk void wait_ticks (unsigned long); 685e2211743Swdenk 686ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/time.c */ 687e2211743Swdenk ulong usec2ticks (unsigned long usec); 688e2211743Swdenk ulong ticks2usec (unsigned long ticks); 689e2211743Swdenk 69078acc472SPeter Tyser /* lib/gunzip.c */ 69187d93a1bSWolfgang Wegner int gunzip(void *, int, unsigned char *, unsigned long *); 69287d93a1bSWolfgang Wegner int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp, 69387d93a1bSWolfgang Wegner int stoponerr, int offset); 69487d93a1bSWolfgang Wegner 695918e9ebbSEric Nelson /** 696918e9ebbSEric Nelson * gzwrite progress indicators: defined weak to allow board-specific 697918e9ebbSEric Nelson * overrides: 698918e9ebbSEric Nelson * 699918e9ebbSEric Nelson * gzwrite_progress_init called on startup 700918e9ebbSEric Nelson * gzwrite_progress called during decompress/write loop 701918e9ebbSEric Nelson * gzwrite_progress_finish called at end of loop to 702918e9ebbSEric Nelson * indicate success (retcode=0) or failure 703918e9ebbSEric Nelson */ 704918e9ebbSEric Nelson void gzwrite_progress_init(u64 expected_size); 705918e9ebbSEric Nelson 706918e9ebbSEric Nelson void gzwrite_progress(int iteration, 707918e9ebbSEric Nelson u64 bytes_written, 708918e9ebbSEric Nelson u64 total_bytes); 709918e9ebbSEric Nelson 710918e9ebbSEric Nelson void gzwrite_progress_finish(int retcode, 711918e9ebbSEric Nelson u64 totalwritten, 712918e9ebbSEric Nelson u64 totalsize, 713918e9ebbSEric Nelson u32 expected_crc, 714918e9ebbSEric Nelson u32 calculated_crc); 715918e9ebbSEric Nelson 716918e9ebbSEric Nelson /** 717918e9ebbSEric Nelson * decompress and write gzipped image from memory to block device 718918e9ebbSEric Nelson * 719918e9ebbSEric Nelson * @param src compressed image address 720918e9ebbSEric Nelson * @param len compressed image length in bytes 721918e9ebbSEric Nelson * @param dev block device descriptor 722918e9ebbSEric Nelson * @param szwritebuf bytes per write (pad to erase size) 723918e9ebbSEric Nelson * @param startoffs offset in bytes of first write 724918e9ebbSEric Nelson * @param szexpected expected uncompressed length 725918e9ebbSEric Nelson * may be zero to use gzip trailer 726918e9ebbSEric Nelson * for files under 4GiB 727918e9ebbSEric Nelson */ 728918e9ebbSEric Nelson int gzwrite(unsigned char *src, int len, 7294101f687SSimon Glass struct blk_desc *dev, 730918e9ebbSEric Nelson unsigned long szwritebuf, 731918e9ebbSEric Nelson u64 startoffs, 732918e9ebbSEric Nelson u64 szexpected); 733918e9ebbSEric Nelson 734027b728dSJulius Werner /* lib/lz4_wrapper.c */ 735027b728dSJulius Werner int ulz4fn(const void *src, size_t srcn, void *dst, size_t *dstn); 736027b728dSJulius Werner 73754c6977eSWolfgang Denk /* lib/qsort.c */ 73854c6977eSWolfgang Denk void qsort(void *base, size_t nmemb, size_t size, 73954c6977eSWolfgang Denk int(*compar)(const void *, const void *)); 740560d424bSMike Frysinger int strcmp_compar(const void *, const void *); 74154c6977eSWolfgang Denk 742e11938eaSJason Hobbs /* lib/uuid.c */ 743d718ded0SPrzemyslaw Marczak #include <uuid.h> 744e11938eaSJason Hobbs 74578acc472SPeter Tyser /* lib/vsprintf.c */ 7469785c905SSimon Glass #include <vsprintf.h> 747e2211743Swdenk 74878acc472SPeter Tyser /* lib/strmhz.c */ 74955f7934dSEd Swarthout char * strmhz(char *buf, unsigned long hz); 7500768b7a8SHaavard Skinnemoen 75178acc472SPeter Tyser /* lib/crc32.c */ 752449609f5SPrafulla Wadaskar #include <u-boot/crc.h> 753e2211743Swdenk 7549acf1ca5SMichael Walle /* lib/rand.c */ 7559acf1ca5SMichael Walle #define RAND_MAX -1U 7569acf1ca5SMichael Walle void srand(unsigned int seed); 7579acf1ca5SMichael Walle unsigned int rand(void); 7589acf1ca5SMichael Walle unsigned int rand_r(unsigned int *seedp); 7599acf1ca5SMichael Walle 760e2211743Swdenk /* 761e2211743Swdenk * STDIO based functions (can always be used) 762e2211743Swdenk */ 763e2211743Swdenk /* serial stuff */ 764d9c27253SWolfgang Denk int serial_printf (const char *fmt, ...) 765dc4b0b38SAndrew Klossner __attribute__ ((format (__printf__, 1, 2))); 766e2211743Swdenk /* stdin */ 767e2211743Swdenk int getc(void); 768e2211743Swdenk int tstc(void); 769e2211743Swdenk 770e2211743Swdenk /* stdout */ 77176f1f388SSimon Glass #if !defined(CONFIG_SPL_BUILD) || \ 77276f1f388SSimon Glass (defined(CONFIG_TPL_BUILD) && defined(CONFIG_TPL_SERIAL_SUPPORT)) || \ 77376f1f388SSimon Glass (defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) && \ 77476f1f388SSimon Glass defined(CONFIG_SPL_SERIAL_SUPPORT)) 775e2211743Swdenk void putc(const char c); 776e2211743Swdenk void puts(const char *s); 777d9c27253SWolfgang Denk int printf(const char *fmt, ...) 778dc4b0b38SAndrew Klossner __attribute__ ((format (__printf__, 1, 2))); 779d9c27253SWolfgang Denk int vprintf(const char *fmt, va_list args); 78076f1f388SSimon Glass #else 78176f1f388SSimon Glass #define putc(...) do { } while (0) 78276f1f388SSimon Glass #define puts(...) do { } while (0) 78376f1f388SSimon Glass #define printf(...) do { } while (0) 78476f1f388SSimon Glass #define vprintf(...) do { } while (0) 78580402f34SHeiko Schocher #endif 786e2211743Swdenk 787e2211743Swdenk /* stderr */ 788e2211743Swdenk #define eputc(c) fputc(stderr, c) 789e2211743Swdenk #define eputs(s) fputs(stderr, s) 790e2211743Swdenk #define eprintf(fmt,args...) fprintf(stderr,fmt ,##args) 791e2211743Swdenk 792e2211743Swdenk /* 793e2211743Swdenk * FILE based functions (can only be used AFTER relocation!) 794e2211743Swdenk */ 795e2211743Swdenk #define stdin 0 796e2211743Swdenk #define stdout 1 797e2211743Swdenk #define stderr 2 798e2211743Swdenk #define MAX_FILES 3 799e2211743Swdenk 800d9c27253SWolfgang Denk int fprintf(int file, const char *fmt, ...) 801dc4b0b38SAndrew Klossner __attribute__ ((format (__printf__, 2, 3))); 802e2211743Swdenk void fputs(int file, const char *s); 803e2211743Swdenk void fputc(int file, const char c); 804e2211743Swdenk int ftstc(int file); 805e2211743Swdenk int fgetc(int file); 806e2211743Swdenk 80788d52c6aSLei Wen /* lib/gzip.c */ 80888d52c6aSLei Wen int gzip(void *dst, unsigned long *lenp, 80988d52c6aSLei Wen unsigned char *src, unsigned long srclen); 81088d52c6aSLei Wen int zzip(void *dst, unsigned long *lenp, unsigned char *src, 81188d52c6aSLei Wen unsigned long srclen, int stoponerr, 81288d52c6aSLei Wen int (*func)(unsigned long, unsigned long)); 81388d52c6aSLei Wen 8144ef8d53cSJoe Hershberger /* lib/net_utils.c */ 8154ef8d53cSJoe Hershberger #include <net.h> 816049a95a7SJoe Hershberger static inline struct in_addr getenv_ip(char *var) 8174ef8d53cSJoe Hershberger { 8184ef8d53cSJoe Hershberger return string_to_ip(getenv(var)); 8194ef8d53cSJoe Hershberger } 8204ef8d53cSJoe Hershberger 821e2211743Swdenk int pcmcia_init (void); 822e2211743Swdenk 8232d8d190cSUri Mashiach #ifdef CONFIG_LED_STATUS 824fb364becSWolfgang Denk # include <status_led.h> 825fb364becSWolfgang Denk #endif 826097e1783SSimon Glass 827097e1783SSimon Glass #include <bootstage.h> 828e2211743Swdenk 82948522bb5SJoe Hershberger #ifdef CONFIG_SHOW_ACTIVITY 83048522bb5SJoe Hershberger void show_activity(int arg); 83148522bb5SJoe Hershberger #endif 83248522bb5SJoe Hershberger 833fcd3c87eSWolfgang Denk /* Multicore arch functions */ 834fcd3c87eSWolfgang Denk #ifdef CONFIG_MP 835fcd3c87eSWolfgang Denk int cpu_status(int nr); 836fcd3c87eSWolfgang Denk int cpu_reset(int nr); 8374194b366SKumar Gala int cpu_disable(int nr); 83854841ab5SWolfgang Denk int cpu_release(int nr, int argc, char * const argv[]); 839fcd3c87eSWolfgang Denk #endif 840fcd3c87eSWolfgang Denk 8412a6713b0SAndre Przywara #else /* __ASSEMBLY__ */ 8422a6713b0SAndre Przywara 8432a6713b0SAndre Przywara /* Drop a C type modifier (like in 3UL) for constants used in assembly. */ 8442a6713b0SAndre Przywara #define _AC(X, Y) X 8452a6713b0SAndre Przywara 846fcd3c87eSWolfgang Denk #endif /* __ASSEMBLY__ */ 847fcd3c87eSWolfgang Denk 84813e95e42SStefan Roese #ifdef CONFIG_PPC 84913e95e42SStefan Roese /* 85013e95e42SStefan Roese * Has to be included outside of the #ifndef __ASSEMBLY__ section. 85113e95e42SStefan Roese * Otherwise might lead to compilation errors in assembler files. 85213e95e42SStefan Roese */ 85313e95e42SStefan Roese #include <asm/cache.h> 85413e95e42SStefan Roese #endif 85513e95e42SStefan Roese 856fcd3c87eSWolfgang Denk /* Put only stuff here that the assembler can digest */ 857fcd3c87eSWolfgang Denk 8582a6713b0SAndre Przywara /* Declare an unsigned long constant digestable both by C and an assembler. */ 8592a6713b0SAndre Przywara #define UL(x) _AC(x, UL) 8602a6713b0SAndre Przywara 861fcd3c87eSWolfgang Denk #ifdef CONFIG_POST 862fcd3c87eSWolfgang Denk #define CONFIG_HAS_POST 863800eb096SMichael Zaidman #ifndef CONFIG_POST_ALT_LIST 864800eb096SMichael Zaidman #define CONFIG_POST_STD_LIST 865800eb096SMichael Zaidman #endif 866fcd3c87eSWolfgang Denk #endif 867fcd3c87eSWolfgang Denk 8688aa1a2d1Swdenk #ifdef CONFIG_INIT_CRITICAL 8692f6fa46dSWolfgang Denk #error CONFIG_INIT_CRITICAL is deprecated! 8708aa1a2d1Swdenk #error Read section CONFIG_SKIP_LOWLEVEL_INIT in README. 8718aa1a2d1Swdenk #endif 8728aa1a2d1Swdenk 873155cfb5eSAnton Staaf #define ROUND(a,b) (((a) + (b) - 1) & ~((b) - 1)) 8744b03ac8bSAndy Fleming 8751e41f5adSAnton Staaf /* 876c9689ca3SSimon Glass * check_member() - Check the offset of a structure member 877c9689ca3SSimon Glass * 878c9689ca3SSimon Glass * @structure: Name of structure (e.g. global_data) 879c9689ca3SSimon Glass * @member: Name of member (e.g. baudrate) 880c9689ca3SSimon Glass * @offset: Expected offset in bytes 881c9689ca3SSimon Glass */ 882c9689ca3SSimon Glass #define check_member(structure, member, offset) _Static_assert( \ 883c9689ca3SSimon Glass offsetof(struct structure, member) == offset, \ 884c9689ca3SSimon Glass "`struct " #structure "` offset for `" #member "` is not " #offset) 885c9689ca3SSimon Glass 886476476e7SSimon Glass /* Avoid using CONFIG_EFI_STUB directly as we may boot from other loaders */ 887476476e7SSimon Glass #ifdef CONFIG_EFI_STUB 888476476e7SSimon Glass #define ll_boot_init() false 889476476e7SSimon Glass #else 890476476e7SSimon Glass #define ll_boot_init() true 891476476e7SSimon Glass #endif 892476476e7SSimon Glass 893c3eb3fe4SMike Frysinger /* Pull in stuff for the build system */ 894c3eb3fe4SMike Frysinger #ifdef DO_DEPS_ONLY 895c3eb3fe4SMike Frysinger # include <environment.h> 896c3eb3fe4SMike Frysinger #endif 897c3eb3fe4SMike Frysinger 898e2211743Swdenk #endif /* __COMMON_H_ */ 899